@memberjunction/ng-core-entity-forms 5.29.0 → 5.30.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 (77) hide show
  1. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +4 -0
  2. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  3. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +567 -566
  4. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  5. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +3 -0
  6. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
  7. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +243 -244
  8. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  9. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +3 -0
  10. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
  11. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +417 -416
  12. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  13. package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts +51 -16
  14. package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts.map +1 -1
  15. package/dist/lib/custom/Actions/action-execution-log-form.component.js +422 -139
  16. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  17. package/dist/lib/custom/Actions/action-form.component.d.ts +68 -1
  18. package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
  19. package/dist/lib/custom/Actions/action-form.component.js +882 -422
  20. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  21. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts +3 -0
  22. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts.map +1 -1
  23. package/dist/lib/custom/EntityActions/entityaction.form.component.js +23 -22
  24. package/dist/lib/custom/EntityActions/entityaction.form.component.js.map +1 -1
  25. package/dist/lib/custom/Queries/query-form.component.d.ts +2 -0
  26. package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
  27. package/dist/lib/custom/Queries/query-form.component.js +617 -627
  28. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  29. package/dist/lib/custom/Templates/templates-form.component.d.ts +3 -0
  30. package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
  31. package/dist/lib/custom/Templates/templates-form.component.js +157 -158
  32. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  33. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
  34. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +176 -152
  35. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  36. package/dist/lib/generated/Entities/MJAIAgentNote/mjaiagentnote.form.component.d.ts.map +1 -1
  37. package/dist/lib/generated/Entities/MJAIAgentNote/mjaiagentnote.form.component.js +42 -6
  38. package/dist/lib/generated/Entities/MJAIAgentNote/mjaiagentnote.form.component.js.map +1 -1
  39. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
  40. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +57 -49
  41. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
  42. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js +83 -77
  43. package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js.map +1 -1
  44. package/dist/lib/generated/Entities/MJArchiveRunDetail/mjarchiverundetail.form.component.js +2 -2
  45. package/dist/lib/generated/Entities/MJArchiveRunDetail/mjarchiverundetail.form.component.js.map +1 -1
  46. package/dist/lib/generated/Entities/MJCompanyIntegrationEntityMap/mjcompanyintegrationentitymap.form.component.js +10 -10
  47. package/dist/lib/generated/Entities/MJCompanyIntegrationEntityMap/mjcompanyintegrationentitymap.form.component.js.map +1 -1
  48. package/dist/lib/generated/Entities/MJEntityPermission/mjentitypermission.form.component.js +11 -9
  49. package/dist/lib/generated/Entities/MJEntityPermission/mjentitypermission.form.component.js.map +1 -1
  50. package/dist/lib/generated/Entities/MJFileStorageAccount/mjfilestorageaccount.form.component.js +9 -9
  51. package/dist/lib/generated/Entities/MJFileStorageAccount/mjfilestorageaccount.form.component.js.map +1 -1
  52. package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js +23 -21
  53. package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js.map +1 -1
  54. package/dist/lib/generated/Entities/MJIntegrationObjectField/mjintegrationobjectfield.form.component.js +9 -7
  55. package/dist/lib/generated/Entities/MJIntegrationObjectField/mjintegrationobjectfield.form.component.js.map +1 -1
  56. package/dist/lib/generated/Entities/MJPermissionDomain/mjpermissiondomain.form.component.d.ts +10 -0
  57. package/dist/lib/generated/Entities/MJPermissionDomain/mjpermissiondomain.form.component.d.ts.map +1 -0
  58. package/dist/lib/generated/Entities/MJPermissionDomain/mjpermissiondomain.form.component.js +85 -0
  59. package/dist/lib/generated/Entities/MJPermissionDomain/mjpermissiondomain.form.component.js.map +1 -0
  60. package/dist/lib/generated/Entities/MJResourcePermission/mjresourcepermission.form.component.d.ts.map +1 -1
  61. package/dist/lib/generated/Entities/MJResourcePermission/mjresourcepermission.form.component.js +21 -12
  62. package/dist/lib/generated/Entities/MJResourcePermission/mjresourcepermission.form.component.js.map +1 -1
  63. package/dist/lib/generated/Entities/MJRowLevelSecurityFilter/mjrowlevelsecurityfilter.form.component.js +5 -5
  64. package/dist/lib/generated/Entities/MJRowLevelSecurityFilter/mjrowlevelsecurityfilter.form.component.js.map +1 -1
  65. package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js +21 -21
  66. package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js.map +1 -1
  67. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  68. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +201 -183
  69. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  70. package/dist/lib/generated/generated-forms.module.d.ts +97 -96
  71. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  72. package/dist/lib/generated/generated-forms.module.js +36 -33
  73. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  74. package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
  75. package/dist/lib/shared/components/template-editor.component.js +14 -8
  76. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  77. package/package.json +34 -34
@@ -1 +1 @@
1
- {"version":3,"file":"action-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Actions/action-form.component.ts","../../../../src/lib/custom/Actions/action-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, inject, ViewContainerRef } from '@angular/core';\nimport { MJActionEntity, MJActionParamEntity, MJActionResultCodeEntity, MJActionCategoryEntity, MJActionExecutionLogEntity, MJActionLibraryEntity, MJLibraryEntity } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { Metadata, RunView, CompositeKey } from '@memberjunction/core';\nimport { MJActionFormComponent } from '../../generated/Entities/MJAction/mjaction.form.component';\nimport { MJDialogService, MJDialogRef } from '@memberjunction/ng-ui-components';\nimport { ActionParamDialogComponent, ActionResultCodeDialogComponent } from '@memberjunction/ng-actions';\n\n@RegisterClass(BaseFormComponent, 'MJ: Actions')\n@Component({\n standalone: false,\n selector: 'mj-action-form',\n templateUrl: './action-form.component.html',\n styleUrls: ['./action-form.component.css']\n})\nexport class MJActionFormComponentExtended extends MJActionFormComponent implements OnInit {\n public record!: MJActionEntity;\n \n // Related entities\n public category: MJActionCategoryEntity | null = null;\n public actionParams: MJActionParamEntity[] = [];\n public resultCodes: MJActionResultCodeEntity[] = [];\n public recentExecutions: MJActionExecutionLogEntity[] = [];\n public actionLibraries: MJActionLibraryEntity[] = [];\n public libraries: MJLibraryEntity[] = [];\n \n // Cached filtered params\n private _inputParams: MJActionParamEntity[] = [];\n private _outputParams: MJActionParamEntity[] = [];\n \n // Track params to delete\n private paramsToDelete: MJActionParamEntity[] = [];\n \n // Track result codes to delete\n private resultCodesToDelete: MJActionResultCodeEntity[] = [];\n \n // Loading states\n public isLoadingParams = false;\n public isLoadingResultCodes = false;\n public isLoadingExecutions = false;\n public isLoadingLibraries = false;\n \n // UI state\n public expandedSections = {\n overview: true,\n code: true,\n params: true,\n resultCodes: true,\n execution: false,\n configuration: false\n };\n \n // Test harness state\n public showTestHarness = false;\n \n // Execution stats\n public executionStats = {\n totalRuns: 0,\n successRate: 0,\n avgDuration: 0,\n lastRun: null as Date | null\n };\n \n // Code editor config\n public codeLanguage = 'typescript';\n public showCodeComments = false;\n \n private dialogService = inject(MJDialogService);\n private viewContainerRef = inject(ViewContainerRef);\n private sharedService = inject(SharedService);\n\n async ngOnInit() {\n await super.ngOnInit();\n \n if (this.record?.IsSaved) {\n // Load all related data in parallel\n await Promise.all([\n this.loadCategory(),\n this.loadActionParams(),\n this.loadResultCodes(),\n this.loadRecentExecutions(),\n this.loadActionLibraries(),\n this.loadExecutionStats()\n ]);\n this.cdr.detectChanges();\n }\n }\n \n /**\n * Override InternalSaveRecord to handle Action and related ActionParams in a transaction\n * This follows the same pattern as MJAIAgentFormComponent\n */\n protected async InternalSaveRecord(): Promise<boolean> {\n if (!this.record) {\n return false;\n }\n \n try {\n const md = new Metadata();\n const transactionGroup = await md.CreateTransactionGroup();\n \n // Set transaction group on the Action record\n this.record.TransactionGroup = transactionGroup;\n \n // Save the Action record first\n const actionSaved = await this.record.Save();\n \n if (!actionSaved) {\n console.error('Failed to save Action record');\n this.sharedService.CreateSimpleNotification('Failed to save Action record', 'error', 5000);\n return false;\n }\n \n // Process all pending records (params and result codes to save or delete)\n for (const pendingRecord of this.PendingRecords) {\n if (pendingRecord.entityObject.EntityInfo.Name === 'MJ: Action Params') {\n const param = pendingRecord.entityObject as MJActionParamEntity;\n \n // Ensure ActionID is set for new params\n if (!param.ActionID) {\n param.ActionID = this.record.ID;\n }\n \n param.TransactionGroup = transactionGroup;\n \n if (pendingRecord.action === 'save') {\n const saved = await param.Save();\n if (!saved) {\n console.error('Failed to save parameter:', param.Name);\n return false;\n }\n } else if (pendingRecord.action === 'delete') {\n const deleted = await param.Delete();\n if (!deleted) {\n console.error('Failed to delete parameter:', param.Name);\n return false;\n }\n }\n } else if (pendingRecord.entityObject.EntityInfo.Name === 'MJ: Action Result Codes') {\n const resultCode = pendingRecord.entityObject as MJActionResultCodeEntity;\n \n // Ensure ActionID is set for new result codes\n if (!resultCode.ActionID) {\n resultCode.ActionID = this.record.ID;\n }\n \n resultCode.TransactionGroup = transactionGroup;\n \n if (pendingRecord.action === 'save') {\n const saved = await resultCode.Save();\n if (!saved) {\n console.error('Failed to save result code:', resultCode.ResultCode);\n return false;\n }\n } else if (pendingRecord.action === 'delete') {\n const deleted = await resultCode.Delete();\n if (!deleted) {\n console.error('Failed to delete result code:', resultCode.ResultCode);\n return false;\n }\n }\n }\n }\n \n // Submit the transaction\n const success = await transactionGroup.Submit();\n \n if (success) {\n // Clear pending records after successful save\n this.PendingRecords.length = 0;\n this.paramsToDelete = [];\n this.resultCodesToDelete = [];\n \n // Reload params and result codes to get updated data\n await Promise.all([\n this.loadActionParams(),\n this.loadResultCodes()\n ]);\n \n // Show success message\n this.sharedService.CreateSimpleNotification('Action and related records saved successfully', 'success', 3000);\n }\n \n return success;\n \n } catch (error) {\n console.error('Error saving Action and parameters:', error);\n this.sharedService.CreateSimpleNotification('Error saving Action: ' + error, 'error', 5000);\n return false;\n }\n }\n\n private async loadCategory() {\n if (!this.record.CategoryID) return;\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJActionCategoryEntity>('MJ: Action Categories');\n const loaded = await entity.Load(this.record.CategoryID);\n if (loaded) {\n this.category = entity;\n }\n } catch (error) {\n // Error loading category\n }\n }\n\n private async loadActionParams() {\n this.isLoadingParams = true;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJActionParamEntity>({\n EntityName: 'MJ: Action Params',\n ExtraFilter: `ActionID='${this.record.ID}'`,\n OrderBy: 'Name',\n ResultType: 'entity_object' // This ensures we get proper entity instances\n });\n \n if (result.Success) {\n this.actionParams = result.Results || [];\n // Update cached filtered params - trim and lowercase Type values to handle any whitespace and case\n this._inputParams = this.actionParams.filter(p => {\n const type = p.Type?.trim().toLowerCase();\n return type === 'input' || type === 'both';\n });\n this._outputParams = this.actionParams.filter(p => {\n const type = p.Type?.trim().toLowerCase();\n return type === 'output' || type === 'both';\n });\n } else {\n // Failed to load action params\n this.actionParams = [];\n this._inputParams = [];\n this._outputParams = [];\n }\n } catch (error) {\n // Error loading action params\n this.actionParams = [];\n this._inputParams = [];\n this._outputParams = [];\n } finally {\n this.isLoadingParams = false;\n }\n }\n\n private async loadResultCodes() {\n this.isLoadingResultCodes = true;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJActionResultCodeEntity>({\n EntityName: 'MJ: Action Result Codes',\n ExtraFilter: `ActionID='${this.record.ID}'`,\n OrderBy: 'IsSuccess DESC, ResultCode',\n ResultType: 'entity_object' // This ensures we get proper entity instances\n });\n \n if (result.Success) {\n this.resultCodes = result.Results || [];\n } else {\n // Failed to load result codes\n this.resultCodes = [];\n }\n } catch (error) {\n // Error loading result codes\n this.resultCodes = [];\n } finally {\n this.isLoadingResultCodes = false;\n }\n }\n\n private async loadRecentExecutions() {\n this.isLoadingExecutions = true;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJActionExecutionLogEntity>({\n EntityName: 'MJ: Action Execution Logs',\n ExtraFilter: `ActionID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 10 \n });\n \n if (result.Success) {\n this.recentExecutions = result.Results || [];\n } else {\n // Failed to load executions\n this.recentExecutions = [];\n }\n } catch (error) {\n // Error loading executions\n this.recentExecutions = [];\n } finally {\n this.isLoadingExecutions = false;\n }\n }\n\n private async loadActionLibraries() {\n this.isLoadingLibraries = true;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJActionLibraryEntity>({\n EntityName: 'MJ: Action Libraries',\n ExtraFilter: `ActionID='${this.record.ID}'`,\n OrderBy: 'Library' \n });\n \n if (result.Success) {\n this.actionLibraries = result.Results || [];\n \n // Load library details\n if (this.actionLibraries.length > 0) {\n const libraryIds = this.actionLibraries.map(al => al.LibraryID).filter(id => id);\n const md = new Metadata();\n this.libraries = [];\n \n for (const libId of libraryIds) {\n const lib = await md.GetEntityObject<MJLibraryEntity>('MJ: Libraries');\n if (lib && libId) {\n await lib.Load(libId);\n this.libraries.push(lib);\n }\n }\n }\n }\n } catch (error) {\n // Error loading libraries\n } finally {\n this.isLoadingLibraries = false;\n }\n }\n\n private async loadExecutionStats() {\n try {\n const rv = new RunView();\n // Load ALL executions for accurate statistics\n const result = await rv.RunView<MJActionExecutionLogEntity>({\n EntityName: 'MJ: Action Execution Logs',\n ExtraFilter: `ActionID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC' \n });\n \n if (result.Success && result.Results && result.Results.length > 0) {\n const allExecutions = result.Results;\n this.executionStats.totalRuns = allExecutions.length;\n \n // Calculate success rate based on result codes\n const successfulRuns = allExecutions.filter(e => {\n const resultCode = this.resultCodes.find(rc => rc.ResultCode === e.ResultCode);\n return resultCode?.IsSuccess || false;\n });\n \n this.executionStats.successRate = this.executionStats.totalRuns > 0 \n ? (successfulRuns.length / this.executionStats.totalRuns) * 100 \n : 0;\n \n // Calculate average duration from ALL completed executions\n const completedExecutions = allExecutions.filter(e => e.StartedAt && e.EndedAt);\n if (completedExecutions.length > 0) {\n const totalDuration = completedExecutions.reduce((sum, e) => {\n const duration = new Date(e.EndedAt!).getTime() - new Date(e.StartedAt).getTime();\n // Use absolute value to handle any swapped dates\n return sum + Math.abs(duration);\n }, 0);\n this.executionStats.avgDuration = totalDuration / completedExecutions.length;\n }\n \n // Get last run date from most recent execution\n this.executionStats.lastRun = new Date(allExecutions[0].StartedAt);\n }\n } catch (error) {\n // Error loading execution stats\n }\n }\n\n // UI Helper Methods\n getStatusColor(): string {\n switch (this.record.Status) {\n case 'Active': return 'var(--mj-status-success)';\n case 'Pending': return 'var(--mj-status-warning)';\n case 'Disabled': return 'var(--mj-status-error)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n getStatusIcon(): string {\n switch (this.record.Status) {\n case 'Active': return 'fa-check-circle';\n case 'Pending': return 'fa-clock';\n case 'Disabled': return 'fa-ban';\n default: return 'fa-question-circle';\n }\n }\n\n getTypeColor(): string {\n return this.record.Type === 'Generated' ? 'var(--mj-brand-primary)' : 'var(--mj-brand-primary)';\n }\n\n getTypeIcon(): string {\n return this.record.Type === 'Generated' ? 'fa-robot' : 'fa-code';\n }\n\n getApprovalStatusColor(): string {\n switch (this.record.CodeApprovalStatus) {\n case 'Approved': return 'var(--mj-status-success)';\n case 'Pending': return 'var(--mj-status-warning)';\n case 'Rejected': return 'var(--mj-status-error)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n getApprovalStatusIcon(): string {\n switch (this.record.CodeApprovalStatus) {\n case 'Approved': return 'fa-check-circle';\n case 'Pending': return 'fa-clock';\n case 'Rejected': return 'fa-times-circle';\n default: return 'fa-question-circle';\n }\n }\n\n getParamTypeIcon(type: string): string {\n switch (type) {\n case 'Input': return 'fa-sign-in-alt';\n case 'Output': return 'fa-sign-out-alt';\n case 'Both': return 'fa-exchange-alt';\n default: return 'fa-question';\n }\n }\n\n getParamTypeColor(type: string): string {\n switch (type) {\n case 'Input': return 'var(--mj-brand-primary)';\n case 'Output': return 'var(--mj-status-success)';\n case 'Both': return 'var(--mj-brand-primary)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60000).toFixed(1)}m`;\n }\n\n formatDate(date: Date | string | null): string {\n if (!date) return 'Never';\n const d = typeof date === 'string' ? new Date(date) : date;\n const now = new Date();\n const diff = now.getTime() - d.getTime();\n \n if (diff < 60000) return 'Just now';\n if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`;\n if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`;\n if (diff < 604800000) return `${Math.floor(diff / 86400000)}d ago`;\n \n return d.toLocaleDateString();\n }\n\n // Navigation\n navigateToEntity(entityName: string, recordId: string | null) {\n if (!recordId) return;\n SharedService.Instance.OpenEntityRecord(entityName, CompositeKey.FromID(recordId));\n }\n\n navigateToCategory() {\n if (this.record.CategoryID) {\n this.navigateToEntity('MJ: Action Categories', this.record.CategoryID);\n }\n }\n\n navigateToExecution(executionId: string) {\n this.navigateToEntity('MJ: Action Execution Logs', executionId);\n }\n\n navigateToLibrary(libraryId: string) {\n this.navigateToEntity('MJ: Libraries', libraryId);\n }\n\n // Actions\n openTestHarness() {\n if (!this.record || !this.record.ID || !this.record.IsSaved || this.record.Status !== 'Active') {\n // Cannot open test harness: Action must be saved and active\n return;\n }\n \n this.showTestHarness = true;\n }\n \n /**\n * Event handler for test harness visibility changes\n */\n public onTestHarnessVisibilityChanged(isVisible: boolean) {\n this.showTestHarness = isVisible;\n }\n\n async regenerateCode() {\n if (!this.EditMode) return;\n \n this.record.ForceCodeGeneration = true;\n await this.record.Save();\n // Reload related data after save\n await this.loadResultCodes();\n }\n\n toggleCodeComments() {\n this.showCodeComments = !this.showCodeComments;\n }\n\n async approveCode() {\n if (!this.EditMode) return;\n \n this.record.CodeApprovalStatus = 'Approved';\n this.record.CodeApprovedAt = new Date();\n // Note: CodeApprovedByUserID would be set server-side\n await this.record.Save();\n }\n\n async rejectCode() {\n if (!this.EditMode) return;\n\n this.record.CodeApprovalStatus = 'Rejected';\n await this.record.Save();\n }\n\n async copyToClipboard(text: string) {\n try {\n await navigator.clipboard.writeText(text);\n // Could add a notification here\n } catch (err) {\n // Failed to copy\n }\n }\n\n // Helper methods for template filtering\n getInputParams(): MJActionParamEntity[] {\n // Sort by IsRequired (required first) then by Name\n return this._inputParams.sort((a, b) => {\n if (a.IsRequired === b.IsRequired) {\n return (a.Name || '').localeCompare(b.Name || '');\n }\n return a.IsRequired ? -1 : 1;\n });\n }\n\n getOutputParams(): MJActionParamEntity[] {\n // Sort by Name\n return this._outputParams.sort((a, b) => (a.Name || '').localeCompare(b.Name || ''));\n }\n\n isExecutionSuccess(execution: MJActionExecutionLogEntity): boolean {\n const code = execution.ResultCode?.toLowerCase();\n // First check if we have a result code definition\n const resultCode = this.resultCodes.find(rc => rc.ResultCode === execution.ResultCode);\n if (resultCode) {\n return resultCode.IsSuccess;\n }\n // Fallback to common success patterns if no result code defined\n return code === 'success' || code === 'ok' || code === 'completed' || code === '200';\n }\n\n getExecutionDuration(execution: MJActionExecutionLogEntity): number {\n if (!execution.EndedAt) return 0;\n \n const startTime = new Date(execution.StartedAt).getTime();\n const endTime = new Date(execution.EndedAt).getTime();\n const duration = endTime - startTime;\n \n // Return absolute value to handle timezone mismatches\n return Math.abs(duration);\n }\n\n getSuccessRateColor(): string {\n const rate = this.executionStats.successRate;\n if (rate >= 80) return 'var(--mj-status-success)';\n if (rate >= 60) return 'var(--mj-status-warning)';\n return 'var(--mj-status-error)';\n }\n\n // Parameter management methods\n async addParameter(type: 'Input' | 'Output' | 'Both') {\n if (!this.EditMode || !this.record.IsSaved) return;\n \n const md = new Metadata();\n const newParam = await md.GetEntityObject<MJActionParamEntity>('MJ: Action Params');\n \n // Set default values\n newParam.ActionID = this.record.ID;\n newParam.Name = '';\n newParam.Type = type;\n newParam.ValueType = 'Scalar';\n newParam.IsRequired = false;\n newParam.IsArray = false;\n \n const dialogRef = this.dialogService.open({\n content: ActionParamDialogComponent,\n width: 500,\n appendTo: this.viewContainerRef\n });\n\n const dialog = dialogRef.Content!.instance;\n dialog['param'] = newParam;\n dialog['isNew'] = true;\n dialog['editMode'] = true;\n\n dialogRef.Result.subscribe(result => {\n if (result && typeof result === 'object' && 'save' in result) {\n // The dialog has already modified the newParam entity directly\n // New entities are automatically dirty (IsSaved = false)\n\n // Add to local array\n this.actionParams.push(newParam);\n\n // Add to pending records for saving\n this.PendingRecords.push({\n entityObject: newParam,\n action: 'save'\n });\n\n // Update the filtered arrays\n this.updateParamArrays();\n this.cdr.detectChanges();\n }\n });\n }\n\n async editParameter(param: MJActionParamEntity) {\n const dialogRef = this.dialogService.open({\n content: ActionParamDialogComponent,\n width: 500,\n appendTo: this.viewContainerRef\n });\n\n const dialog = dialogRef.Content!.instance;\n dialog['param'] = param;\n dialog['isNew'] = false;\n dialog['editMode'] = this.EditMode;\n\n dialogRef.Result.subscribe(result => {\n if (result && typeof result === 'object' && 'save' in result && this.EditMode) {\n // Param will be dirty from property changes in dialog\n // Ensure it's in pending records if modified\n if (param.Dirty) {\n const exists = this.PendingRecords.some(pr =>\n pr.entityObject === param && pr.action === 'save'\n );\n if (!exists) {\n this.PendingRecords.push({\n entityObject: param,\n action: 'save'\n });\n }\n }\n\n // Update the local arrays\n this.updateParamArrays();\n this.cdr.detectChanges();\n }\n });\n }\n \n onParamClick(param: MJActionParamEntity, event: Event) {\n // Prevent event bubbling if clicking on edit/delete buttons\n const target = event.target as HTMLElement;\n if (target.closest('.param-edit-btn') || target.closest('.param-delete-btn')) {\n return;\n }\n \n // Show the parameter dialog\n this.editParameter(param);\n }\n\n \n private async updateParamArrays() {\n // Update cached filtered params - exclude deleted items\n const activeParams = this.actionParams.filter(p => !this.paramsToDelete || !this.paramsToDelete.includes(p));\n \n this._inputParams = activeParams.filter(p => {\n const type = p.Type?.trim().toLowerCase();\n return type === 'input' || type === 'both';\n });\n \n this._outputParams = activeParams.filter(p => {\n const type = p.Type?.trim().toLowerCase();\n return type === 'output' || type === 'both';\n });\n }\n \n // Override to populate pending records with our action params and result codes\n protected PopulatePendingRecords() {\n // Preserve existing pending records before base class clears them\n const currentPendingRecords = [...this.PendingRecords];\n \n // Call parent to handle child components\n super.PopulatePendingRecords();\n \n // Re-add our preserved records\n for (const record of currentPendingRecords) {\n // Only re-add if it's an Action Param or Result Code (avoid duplicates)\n if (record.entityObject.EntityInfo.Name === 'MJ: Action Params' || \n record.entityObject.EntityInfo.Name === 'MJ: Action Result Codes') {\n const exists = this.PendingRecords.some(pr => \n pr.entityObject === record.entityObject\n );\n if (!exists) {\n this.PendingRecords.push(record);\n }\n }\n }\n \n // Add action params that need saving\n for (const param of this.actionParams) {\n if (!param.IsSaved || param.Dirty) {\n // Check if not already in pending records\n const exists = this.PendingRecords.some(pr => \n pr.entityObject === param\n );\n if (!exists) {\n this.PendingRecords.push({\n entityObject: param,\n action: 'save'\n });\n }\n }\n }\n \n // Add params marked for deletion\n for (const param of this.paramsToDelete) {\n if (param.IsSaved) {\n // Check if not already in pending records\n const exists = this.PendingRecords.some(pr => \n pr.entityObject === param\n );\n if (!exists) {\n this.PendingRecords.push({\n entityObject: param,\n action: 'delete'\n });\n }\n }\n }\n \n // Add result codes that need saving\n for (const resultCode of this.resultCodes) {\n if (!resultCode.IsSaved || resultCode.Dirty) {\n // Check if not already in pending records\n const exists = this.PendingRecords.some(pr => \n pr.entityObject === resultCode\n );\n if (!exists) {\n this.PendingRecords.push({\n entityObject: resultCode,\n action: 'save'\n });\n }\n }\n }\n \n // Add result codes marked for deletion\n for (const resultCode of this.resultCodesToDelete) {\n if (resultCode.IsSaved) {\n // Check if not already in pending records\n const exists = this.PendingRecords.some(pr => \n pr.entityObject === resultCode\n );\n if (!exists) {\n this.PendingRecords.push({\n entityObject: resultCode,\n action: 'delete'\n });\n }\n }\n }\n }\n \n /**\n * Gets the action's display icon\n * Falls back to default cog icon if no IconClass is set\n */\n public getActionIcon(): string {\n return this.record?.IconClass || 'fa-solid fa-cog';\n }\n \n // Result Code management methods\n async addResultCode() {\n if (!this.EditMode || !this.record.IsSaved) return;\n \n const md = new Metadata();\n const newResultCode = await md.GetEntityObject<MJActionResultCodeEntity>('MJ: Action Result Codes');\n \n // Set default values\n newResultCode.ActionID = this.record.ID;\n newResultCode.ResultCode = '';\n newResultCode.Description = '';\n newResultCode.IsSuccess = false;\n \n const dialogRef = this.dialogService.open({\n content: ActionResultCodeDialogComponent,\n width: 500,\n appendTo: this.viewContainerRef\n });\n\n const dialog = dialogRef.Content!.instance;\n dialog['resultCode'] = newResultCode;\n dialog['isNew'] = true;\n dialog['editMode'] = true;\n\n dialogRef.Result.subscribe(result => {\n if (result && typeof result === 'object' && 'save' in result) {\n // Add to local array\n this.resultCodes.push(newResultCode);\n\n // Add to pending records for saving\n this.PendingRecords.push({\n entityObject: newResultCode,\n action: 'save'\n });\n\n this.cdr.detectChanges();\n }\n });\n }\n \n async editResultCode(resultCode: MJActionResultCodeEntity) {\n const dialogRef = this.dialogService.open({\n content: ActionResultCodeDialogComponent,\n width: 500,\n appendTo: this.viewContainerRef\n });\n\n const dialog = dialogRef.Content!.instance;\n dialog['resultCode'] = resultCode;\n dialog['isNew'] = false;\n dialog['editMode'] = this.EditMode;\n\n dialogRef.Result.subscribe(result => {\n if (result && typeof result === 'object' && 'save' in result && this.EditMode) {\n // Ensure it's in pending records if modified\n if (resultCode.Dirty) {\n const exists = this.PendingRecords.some(pr =>\n pr.entityObject === resultCode && pr.action === 'save'\n );\n if (!exists) {\n this.PendingRecords.push({\n entityObject: resultCode,\n action: 'save'\n });\n }\n }\n\n this.cdr.detectChanges();\n }\n });\n }\n \n onResultCodeClick(resultCode: MJActionResultCodeEntity, event: Event) {\n // Prevent event bubbling if clicking on edit/delete buttons\n const target = event.target as HTMLElement;\n if (target.closest('.result-edit-btn') || target.closest('.result-delete-btn')) {\n return;\n }\n \n // Show the result code dialog\n this.editResultCode(resultCode);\n }\n \n /**\n * Delete a result code (marks for deletion on save)\n */\n deleteResultCode(resultCode: MJActionResultCodeEntity) {\n if (!this.EditMode) return;\n \n // Remove from main array\n const index = this.resultCodes.indexOf(resultCode);\n if (index > -1) {\n this.resultCodes.splice(index, 1);\n }\n \n // Handle pending records\n if (resultCode.IsSaved) {\n // Add to deletion list for saved result codes\n this.resultCodesToDelete.push(resultCode);\n \n // Add to pending records for deletion\n this.PendingRecords.push({\n entityObject: resultCode,\n action: 'delete'\n });\n } else {\n // For unsaved result codes, just remove from pending records\n const pendingIndex = this.PendingRecords.findIndex(pr => \n pr.entityObject === resultCode && pr.action === 'save'\n );\n if (pendingIndex >= 0) {\n this.PendingRecords.splice(pendingIndex, 1);\n }\n }\n \n this.cdr.detectChanges();\n }\n \n /**\n * Delete a parameter (marks for deletion on save)\n */\n deleteParameter(param: MJActionParamEntity) {\n if (!this.EditMode) return;\n \n // Remove from main array\n const index = this.actionParams.indexOf(param);\n if (index > -1) {\n this.actionParams.splice(index, 1);\n }\n \n // Handle pending records\n if (param.IsSaved) {\n // Add to deletion list for saved params\n this.paramsToDelete.push(param);\n \n // Add to pending records for deletion\n this.PendingRecords.push({\n entityObject: param,\n action: 'delete'\n });\n } else {\n // For unsaved params, just remove from pending records\n const pendingIndex = this.PendingRecords.findIndex(pr => \n pr.entityObject === param && pr.action === 'save'\n );\n if (pendingIndex >= 0) {\n this.PendingRecords.splice(pendingIndex, 1);\n }\n }\n \n // Update filtered arrays\n this.updateParamArrays();\n this.cdr.detectChanges();\n }\n}\n","<div class=\"record-form-container\" style=\"height: 100%; display: flex; flex-direction: column;\">\n @if (record) {\n <form class=\"record-form\" #form=\"ngForm\" style=\"display: flex; flex-direction: column; height: 100%; overflow: hidden;\">\n <mj-form-toolbar [Form]=\"this\"></mj-form-toolbar>\n\n <!-- Main Content Area -->\n <div class=\"action-main-area\" style=\"display: flex; flex-direction: column; flex: 1; min-height: 0; overflow-y: auto;\">\n \n <!-- Header Section -->\n <div class=\"action-header\" style=\"flex-shrink: 0; padding: 20px; background: var(--mj-bg-surface-card); border-bottom: 2px solid var(--mj-border-default);\">\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; gap: 20px;\">\n \n <!-- Left: Action Info -->\n <div style=\"flex: 1; min-width: 0;\">\n <div style=\"display: flex; align-items: center; gap: 12px; margin-bottom: 8px;\">\n <i [class]=\"getActionIcon()\" [style.color]=\"getTypeColor()\" style=\"font-size: 1.4em;\"></i>\n @if (EditMode) {\n <input type=\"text\" class=\"mj-input\"\n [(ngModel)]=\"record.Name\"\n name=\"actionName\"\n placeholder=\"Enter action name...\"\n style=\"font-size: 1.2em; font-weight: 600; min-width: 300px; flex: 1;\" />\n } @else {\n <h4 style=\"margin: 0; color: var(--mj-text-secondary); font-weight: 600; flex: 1;\">{{ record.Name || 'Untitled Action' }}</h4>\n <span class=\"status-chip\"\n [attr.data-color]=\"record.Status === 'Active' ? 'success' : record.Status === 'Pending' ? 'warning' : 'error'\">\n {{ record.Status }}\n </span>\n }\n </div>\n \n <!-- Status and Type Editors when in edit mode -->\n @if (EditMode) {\n <div style=\"display: flex; gap: 16px; margin-bottom: 12px; flex-wrap: wrap;\">\n <div>\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">Status</label>\n <mj-dropdown [(ngModel)]=\"record.Status\"\n name=\"actionStatus\"\n [Data]=\"[{text: 'Active', value: 'Active'}, {text: 'Pending', value: 'Pending'}, {text: 'Disabled', value: 'Disabled'}]\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n style=\"width: 150px;\">\n </mj-dropdown>\n </div>\n <div>\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">\n Type <span style=\"color: var(--mj-status-error);\">*</span>\n </label>\n <mj-dropdown [(ngModel)]=\"record.Type\"\n name=\"actionType\"\n [Data]=\"[{text: 'Generated', value: 'Generated'}, {text: 'Custom', value: 'Custom'}]\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n style=\"width: 150px;\">\n </mj-dropdown>\n </div>\n <div>\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">\n Category <span style=\"color: var(--mj-status-error);\">*</span>\n </label>\n <mj-dropdown [(ngModel)]=\"record.CategoryID\"\n name=\"categoryID\"\n [Data]=\"[]\"\n Placeholder=\"Select category...\"\n style=\"width: 200px;\">\n </mj-dropdown>\n </div>\n </div>\n }\n \n @if (EditMode) {\n <textarea class=\"mj-textarea\" [(ngModel)]=\"record.Description\" \n name=\"actionDescription\"\n [rows]=\"2\"\n placeholder=\"Enter action description...\"\n style=\"width: 100%; max-width: 600px; margin-bottom: 12px;\">\n </textarea>\n } @else if (record.Description) {\n <p style=\"margin: 0 0 12px 0; color: var(--mj-text-muted); font-size: 0.9em; line-height: 1.4;\">{{ record.Description }}</p>\n }\n \n <!-- Quick Config Row -->\n <div class=\"quick-config\" style=\"display: flex; align-items: center; gap: 16px; flex-wrap: wrap;\">\n @if (category) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-folder\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Category:</span>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500; cursor: pointer;\" (click)=\"navigateToCategory()\">\n {{ category.Name }}\n <i class=\"fa-solid fa-external-link\" style=\"font-size: 0.75em; margin-left: 4px;\"></i>\n </span>\n </div>\n }\n \n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-cube\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Type:</span>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500;\">{{ record.Type }}</span>\n </div>\n \n @if (record.Type === 'Generated' && record.CodeApprovalStatus) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i [class]=\"'fa-solid ' + getApprovalStatusIcon()\" [style.color]=\"getApprovalStatusColor()\"></i>\n <span style=\"color: var(--mj-text-muted);\">Code:</span>\n <span [style.color]=\"getApprovalStatusColor()\" style=\"font-weight: 500;\">{{ record.CodeApprovalStatus }}</span>\n </div>\n }\n \n @if (actionParams.length > 0) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-sliders\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500;\">{{ actionParams.length }} Parameters</span>\n </div>\n }\n </div>\n </div>\n \n <!-- Right: Action Buttons -->\n <div class=\"action-buttons\" style=\"display: flex; flex-direction: column; gap: 8px; align-items: flex-end;\">\n <div style=\"display: flex; gap: 8px;\">\n @if (record.ID) {\n <button mjButton variant=\"primary\" size=\"lg\"\n (click)=\"openTestHarness()\"\n title=\"Open Run Harness\"\n [disabled]=\"record.Status !== 'Active'\">\n <i class=\"fa-solid fa-play\"></i> Run\n </button>\n }\n @if (EditMode && record.Type === 'Generated') {\n <button mjButton variant=\"outline\" size=\"md\"\n (click)=\"regenerateCode()\"\n title=\"Regenerate Code\">\n <i class=\"fa-solid fa-robot\"></i> Regenerate\n </button>\n }\n </div>\n \n @if (EditMode && record.CodeApprovalStatus === 'Pending' && record.Type === 'Generated') {\n <div style=\"display: flex; gap: 8px;\">\n <button mjButton variant=\"success\" size=\"sm\"\n (click)=\"approveCode()\">\n <i class=\"fa-solid fa-check\"></i> Approve\n </button>\n <button mjButton variant=\"danger\" size=\"sm\"\n (click)=\"rejectCode()\">\n <i class=\"fa-solid fa-times\"></i> Reject\n </button>\n </div>\n }\n \n @if (!EditMode && record.Status !== 'Active' && record.ID) {\n <div style=\"font-size: 0.75em; color: var(--mj-status-error); text-align: right;\">\n Action must be Active to execute\n </div>\n }\n </div>\n </div>\n </div>\n\n <!-- Configuration Sections with Expansion Panels -->\n <div class=\"configuration-sections\" style=\"flex: 1; background: var(--mj-bg-surface-card); border-top: 2px solid var(--mj-border-default); padding: 16px; min-height: 0;\">\n \n <!-- Parameters Section (FIRST) -->\n <mj-accordion-panel\n [Expanded]=\"true\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-sliders\" style=\"color: var(--mj-text-muted);\"></i>\n Parameters\n @if (actionParams.length > 0) {\n <span style=\"background: var(--mj-status-info); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ actionParams.length }}\n </span>\n }\n </span>\n </ng-template>\n \n <div style=\"padding: 16px;\">\n @if (isLoadingParams) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading parameters...\n </div>\n } @else if (actionParams.length === 0) {\n <div class=\"empty-state\" style=\"padding: 30px; text-align: center;\">\n <i class=\"fa-solid fa-sliders\" style=\"font-size: 2em; color: var(--mj-text-muted); opacity: 0.3;\"></i>\n <p style=\"margin: 12px 0 0 0; color: var(--mj-text-muted);\">No parameters defined</p>\n @if (EditMode && record.IsSaved) {\n <p style=\"margin: 8px 0 0 0; font-size: 0.85em; color: var(--mj-text-muted);\">Add parameters to define inputs and outputs for this action</p>\n }\n </div>\n } @else {\n <!-- Input Parameters Grid -->\n <div class=\"params-section\">\n <div class=\"params-header\">\n <h3><i class=\"fa-solid fa-sign-in-alt\"></i> Input Parameters</h3>\n @if (EditMode && record.IsSaved) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"addParameter('Input')\">\n <i class=\"fa-solid fa-plus\"></i> Add Input\n </button>\n }\n </div>\n \n @if (getInputParams().length === 0) {\n <div class=\"empty-state\" style=\"padding: 30px; text-align: center;\">\n <i class=\"fa-solid fa-inbox\" style=\"font-size: 2em; color: var(--mj-text-muted); opacity: 0.3;\"></i>\n <p style=\"margin: 12px 0 0 0; color: var(--mj-text-muted);\">No input parameters defined</p>\n </div>\n } @else {\n <div class=\"params-grid\">\n @for (param of getInputParams(); track param.ID) {\n <div class=\"param-card\" [class.required]=\"param.IsRequired\" \n [class.clickable]=\"true\"\n (click)=\"onParamClick(param, $event)\">\n <div class=\"param-header\">\n <span class=\"param-name\">{{ param.Name }}</span>\n <div class=\"param-badges\">\n @if (param.IsRequired) {\n <span class=\"required-badge\">Required</span>\n }\n @if (param.IsArray) {\n <span class=\"array-badge\">Array</span>\n }\n @if (EditMode) {\n <button class=\"param-edit-btn\" (click)=\"editParameter(param)\" title=\"Edit parameter\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n <button class=\"param-delete-btn\" (click)=\"deleteParameter(param)\" title=\"Delete parameter\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n </div>\n <div class=\"param-details\">\n <div class=\"param-type\">{{ param.ValueType }}</div>\n @if (param.Description) {\n <div class=\"param-description\">{{ param.Description }}</div>\n }\n @if (param.DefaultValue) {\n <div class=\"param-default\">\n <span class=\"default-label\">Default:</span>\n <code>{{ param.DefaultValue }}</code>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Output Parameters Grid -->\n <div class=\"params-section\" style=\"margin-top: 24px;\" \n [class.params-section-compact]=\"getOutputParams().length === 0\">\n <div class=\"params-header\">\n <h3><i class=\"fa-solid fa-sign-out-alt\"></i> Output Parameters</h3>\n @if (EditMode && record.IsSaved) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"addParameter('Output')\">\n <i class=\"fa-solid fa-plus\"></i> Add Output\n </button>\n }\n </div>\n \n @if (getOutputParams().length === 0) {\n <div class=\"empty-state\" style=\"padding: 20px; text-align: center;\">\n <i class=\"fa-solid fa-inbox\" style=\"font-size: 2em; color: var(--mj-text-muted); opacity: 0.3;\"></i>\n <p style=\"margin: 12px 0 0 0; color: var(--mj-text-muted);\">No output parameters defined</p>\n </div>\n } @else {\n <div class=\"params-grid\">\n @for (param of getOutputParams(); track param.ID) {\n <div class=\"param-card\"\n [class.clickable]=\"true\"\n (click)=\"onParamClick(param, $event)\">\n <div class=\"param-header\">\n <span class=\"param-name\">{{ param.Name }}</span>\n <div class=\"param-badges\">\n @if (param.IsArray) {\n <span class=\"array-badge\">Array</span>\n }\n @if (EditMode) {\n <button class=\"param-edit-btn\" (click)=\"editParameter(param)\" title=\"Edit parameter\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n <button class=\"param-delete-btn\" (click)=\"deleteParameter(param)\" title=\"Delete parameter\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n </div>\n <div class=\"param-details\">\n <div class=\"param-type\">{{ param.ValueType }}</div>\n @if (param.Description) {\n <div class=\"param-description\">{{ param.Description }}</div>\n }\n @if (param.DefaultValue) {\n <div class=\"param-default\">\n <span class=\"default-label\">Default:</span>\n <code>{{ param.DefaultValue }}</code>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </mj-accordion-panel>\n\n <!-- Code & Generation Section (Only for Generated type) -->\n @if (record.Type === 'Generated') {\n <mj-accordion-panel\n [Expanded]=\"expandedSections.code\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-code\" style=\"color: var(--mj-text-muted);\"></i>\n Code &amp; Generation\n @if (record.CodeLocked) {\n <span style=\"background: var(--mj-status-warning); color: var(--mj-color-warning-800); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n <i class=\"fa-solid fa-lock\"></i> Locked\n </span>\n }\n </span>\n </ng-template>\n \n <div style=\"padding: 16px;\">\n @if (EditMode) {\n <div class=\"generation-panel\">\n <h3><i class=\"fa-solid fa-robot\"></i> AI Generation</h3>\n <div class=\"prompt-section\">\n <label>User Prompt</label>\n <textarea class=\"mj-textarea\" [(ngModel)]=\"record.UserPrompt\"\n name=\"userPrompt\"\n [rows]=\"8\"\n placeholder=\"Describe what this action should do...\"\n style=\"width: 100%; min-height: 120px;\">\n </textarea>\n </div>\n <div class=\"comments-section\">\n <label>Internal Comments (not sent to AI)</label>\n <textarea class=\"mj-textarea\" [(ngModel)]=\"record.UserComments\"\n name=\"userComments\"\n [rows]=\"2\"\n placeholder=\"Internal notes...\"\n style=\"width: 100%;\">\n </textarea>\n </div>\n <div class=\"generation-controls\">\n <mj-switch [(ngModel)]=\"record.CodeLocked\"\n name=\"codeLocked\">\n </mj-switch>\n <label style=\"margin-left: 8px;\">Lock Code (prevent regeneration)</label>\n </div>\n </div>\n }\n \n <div class=\"code-editor-section\">\n <div class=\"code-toolbar\">\n <h3><i class=\"fa-solid fa-file-code\"></i> Action Code</h3>\n <div class=\"code-actions\">\n @if (record.CodeComments) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"toggleCodeComments()\">\n <i class=\"fa-solid fa-comment\"></i> \n {{ showCodeComments ? 'Hide' : 'Show' }} AI Comments\n </button>\n }\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"copyToClipboard(record.Code || '')\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n </div>\n <mj-code-editor \n [(ngModel)]=\"record.Code\"\n name=\"actionCode\"\n [readonly]=\"!EditMode || record.CodeLocked\"\n [language]=\"codeLanguage\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n \n @if (showCodeComments && record.CodeComments) {\n <div class=\"code-comments\">\n <h4><i class=\"fa-solid fa-robot\"></i> AI Explanation</h4>\n <p>{{ record.CodeComments }}</p>\n </div>\n }\n \n @if (EditMode && record.CodeApprovalStatus === 'Rejected') {\n <div class=\"approval-comments\">\n <label>Rejection Comments</label>\n <textarea class=\"mj-textarea\" [(ngModel)]=\"record.CodeApprovalComments\"\n name=\"codeApprovalComments\"\n [rows]=\"2\"\n placeholder=\"Explain why the code was rejected...\"\n style=\"width: 100%;\">\n </textarea>\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Result Codes Section -->\n <mj-accordion-panel\n [Expanded]=\"expandedSections.resultCodes\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-flag-checkered\" style=\"color: var(--mj-text-muted);\"></i>\n Result Codes\n @if (resultCodes.length > 0) {\n <span style=\"background: var(--mj-status-success); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ resultCodes.length }}\n </span>\n }\n </span>\n </ng-template>\n \n <div style=\"padding: 16px;\">\n <!-- Add Result Code Button -->\n @if (EditMode && record.IsSaved) {\n <div style=\"display: flex; justify-content: flex-end; margin-bottom: 12px;\">\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"addResultCode()\">\n <i class=\"fa-solid fa-plus\"></i> Add Result Code\n </button>\n </div>\n }\n \n @if (isLoadingResultCodes) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading result codes...\n </div>\n } @else if (resultCodes.length === 0) {\n <div class=\"empty-state\" style=\"padding: 30px; text-align: center;\">\n <i class=\"fa-solid fa-flag-checkered\" style=\"font-size: 2em; color: var(--mj-text-muted); opacity: 0.3;\"></i>\n <p style=\"margin: 12px 0 0 0; color: var(--mj-text-muted);\">No result codes defined</p>\n @if (EditMode && record.IsSaved) {\n <p style=\"margin: 8px 0 0 0; font-size: 0.85em; color: var(--mj-text-muted);\">Add result codes to define possible outcomes</p>\n }\n </div>\n } @else {\n <div class=\"result-codes-grid\">\n @for (code of resultCodes; track code.ID) {\n <div class=\"result-code-card\" \n [class.success]=\"code.IsSuccess\" \n [class.failure]=\"!code.IsSuccess\"\n [class.clickable]=\"true\"\n (click)=\"onResultCodeClick(code, $event)\">\n <div class=\"result-icon\">\n <i [class]=\"code.IsSuccess ? 'fa-solid fa-check-circle' : 'fa-solid fa-times-circle'\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-code\">{{ code.ResultCode }}</div>\n @if (code.Description) {\n <div class=\"result-description\">{{ code.Description }}</div>\n }\n </div>\n @if (EditMode) {\n <div class=\"result-actions\">\n <button class=\"result-edit-btn\" (click)=\"editResultCode(code); $event.stopPropagation()\" title=\"Edit result code\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n <button class=\"result-delete-btn\" (click)=\"deleteResultCode(code); $event.stopPropagation()\" title=\"Delete result code\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </mj-accordion-panel>\n\n <!-- Execution & Monitoring Section -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"expandedSections.execution\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-chart-line\" style=\"color: var(--mj-text-muted);\"></i>\n Execution &amp; Monitoring\n </span>\n </ng-template>\n \n <div style=\"padding: 16px;\">\n @if (isLoadingExecutions) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading executions...\n </div>\n } @else if (recentExecutions.length === 0) {\n <div class=\"empty-state\" style=\"padding: 30px; text-align: center;\">\n <i class=\"fa-solid fa-chart-line\" style=\"font-size: 2em; color: var(--mj-text-muted); opacity: 0.3;\"></i>\n <p style=\"margin: 12px 0 0 0; color: var(--mj-text-muted);\">No executions yet</p>\n </div>\n } @else {\n <div class=\"execution-stats-row\">\n <div class=\"stat-box\">\n <i class=\"fa-solid fa-tachometer-alt\"></i>\n <div class=\"stat-info\">\n <div class=\"stat-label\" style=\"color: var(--mj-text-primary);\">Avg Duration</div>\n <div class=\"stat-value\" style=\"color: var(--mj-text-primary);\">{{ formatDuration(executionStats.avgDuration) }}</div>\n </div>\n </div>\n <div class=\"stat-box\">\n <i class=\"fa-solid fa-check-circle\" [style.color]=\"getSuccessRateColor()\"></i>\n <div class=\"stat-info\">\n <div class=\"stat-label\" style=\"color: var(--mj-text-primary);\">Success Rate</div>\n <div class=\"stat-value\" [style.color]=\"getSuccessRateColor()\" style=\"font-weight: 600;\">{{ executionStats.successRate.toFixed(0) }}%</div>\n </div>\n </div>\n <div class=\"stat-box\">\n <i class=\"fa-solid fa-play-circle\"></i>\n <div class=\"stat-info\">\n <div class=\"stat-label\" style=\"color: var(--mj-text-primary);\">Total Runs</div>\n <div class=\"stat-value\" style=\"color: var(--mj-text-primary);\">{{ executionStats.totalRuns }}</div>\n </div>\n </div>\n </div>\n\n <h3 style=\"margin-top: 24px;\"><i class=\"fa-solid fa-history\"></i> Recent Executions</h3>\n <div class=\"executions-table\">\n <table>\n <thead>\n <tr>\n <th>Started</th>\n <th>Duration</th>\n <th>User</th>\n <th>Result</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (execution of recentExecutions; track execution.ID) {\n <tr class=\"execution-row\" [class.success]=\"isExecutionSuccess(execution)\">\n <td>{{ execution.StartedAt | date:'short' }}</td>\n <td>\n @if (execution.EndedAt) {\n {{ formatDuration(getExecutionDuration(execution)) }}\n } @else {\n <span class=\"running\">Running...</span>\n }\n </td>\n <td>{{ execution.User }}</td>\n <td>\n <span class=\"result-code\" \n [class.success]=\"isExecutionSuccess(execution)\"\n [class.failure]=\"!isExecutionSuccess(execution)\">\n {{ execution.ResultCode }}\n </span>\n </td>\n <td>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"navigateToExecution(execution.ID)\">\n <i class=\"fa-solid fa-external-link\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Related Configuration Section -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"expandedSections.configuration\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-cogs\" style=\"color: var(--mj-text-muted);\"></i>\n Related Configuration\n </span>\n </ng-template>\n \n <div style=\"padding: 16px;\">\n <!-- Libraries -->\n <div class=\"config-subsection\">\n <h3><i class=\"fa-solid fa-book\"></i> Libraries</h3>\n @if (isLoadingLibraries) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading libraries...\n </div>\n } @else if (actionLibraries.length === 0) {\n <div class=\"empty-state mini\">\n <p>No libraries configured</p>\n </div>\n } @else {\n <div class=\"library-cards\">\n @for (lib of libraries; track lib.ID; let i = $index) {\n <div class=\"library-card\" (click)=\"navigateToLibrary(lib.ID)\">\n <i class=\"fa-solid fa-book\"></i>\n <div class=\"library-info\">\n <div class=\"library-name\">{{ lib.Name }}</div>\n @if (actionLibraries[i].ItemsUsed) {\n <div class=\"library-items\">{{ actionLibraries[i].ItemsUsed }}</div>\n }\n </div>\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Other Related Entities -->\n <div class=\"related-entities-grid\">\n <div class=\"related-entity-link\">\n <i class=\"fa-solid fa-shield-alt\"></i>\n <span>Authorizations</span>\n <span class=\"entity-count\">View</span>\n </div>\n <div class=\"related-entity-link\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <span>Contexts</span>\n <span class=\"entity-count\">View</span>\n </div>\n <div class=\"related-entity-link\">\n <i class=\"fa-solid fa-calendar\"></i>\n <span>Scheduled Actions</span>\n <span class=\"entity-count\">View</span>\n </div>\n <div class=\"related-entity-link\">\n <i class=\"fa-solid fa-cube\"></i>\n <span>Entity Actions</span>\n <span class=\"entity-count\">View</span>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n }\n </div>\n </div>\n </form>\n }\n</div>\n\n<!-- Action Test Harness Dialog -->\n<mj-action-test-harness-dialog\n [Action]=\"record\"\n [ActionParams]=\"actionParams\"\n [IsOpen]=\"showTestHarness\"\n (Close)=\"onTestHarnessVisibilityChanged(false)\">\n</mj-action-test-harness-dialog>"]}
1
+ {"version":3,"file":"action-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Actions/action-form.component.ts","../../../../src/lib/custom/Actions/action-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, inject, ViewContainerRef } from '@angular/core';\nimport { MJActionEntity, MJActionEntity_IRuntimeActionConfiguration, MJActionParamEntity, MJActionResultCodeEntity, MJActionCategoryEntity, MJActionExecutionLogEntity, MJActionLibraryEntity, MJLibraryEntity } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseFormComponent, CUSTOM_LAYOUT_TOOLBAR_CONFIG } from '@memberjunction/ng-base-forms';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { Metadata, RunView, CompositeKey } from '@memberjunction/core';\nimport { MJActionFormComponent } from '../../generated/Entities/MJAction/mjaction.form.component';\nimport { MJDialogService, MJDialogRef } from '@memberjunction/ng-ui-components';\nimport { ActionParamDialogComponent, ActionResultCodeDialogComponent } from '@memberjunction/ng-actions';\n\n@RegisterClass(BaseFormComponent, 'MJ: Actions')\n@Component({\n standalone: false,\n selector: 'mj-action-form',\n templateUrl: './action-form.component.html',\n styleUrls: ['./action-form.component.css']\n})\nexport class MJActionFormComponentExtended extends MJActionFormComponent implements OnInit {\n public record!: MJActionEntity;\n\n // This form has a fully custom layout (header panel + accordion\n // sections we manage ourselves), so the toolbar's section-search,\n // expand/collapse, manage-sections, and width-toggle widgets don't\n // apply. `CUSTOM_LAYOUT_TOOLBAR_CONFIG` hides the entire right-hand\n // group while keeping favorite / history / tags / list buttons intact.\n public readonly toolbarConfig = CUSTOM_LAYOUT_TOOLBAR_CONFIG;\n\n /** Custom-layout Action form looks best full-width on first open. */\n public override getDefaultFormWidthMode(): 'centered' | 'full-width' { return 'full-width'; }\n\n // Related entities\n public category: MJActionCategoryEntity | null = null;\n public actionParams: MJActionParamEntity[] = [];\n public resultCodes: MJActionResultCodeEntity[] = [];\n public recentExecutions: MJActionExecutionLogEntity[] = [];\n public actionLibraries: MJActionLibraryEntity[] = [];\n public libraries: MJLibraryEntity[] = [];\n \n // Cached filtered params\n private _inputParams: MJActionParamEntity[] = [];\n private _outputParams: MJActionParamEntity[] = [];\n \n // Track params to delete\n private paramsToDelete: MJActionParamEntity[] = [];\n \n // Track result codes to delete\n private resultCodesToDelete: MJActionResultCodeEntity[] = [];\n \n // Loading states\n public isLoadingParams = false;\n public isLoadingResultCodes = false;\n public isLoadingExecutions = false;\n public isLoadingLibraries = false;\n \n // UI state\n public expandedSections = {\n overview: true,\n code: true,\n params: true,\n resultCodes: true,\n execution: false,\n configuration: false\n };\n \n // Test harness state\n public showTestHarness = false;\n \n // Execution stats\n public executionStats = {\n totalRuns: 0,\n successRate: 0,\n avgDuration: 0,\n lastRun: null as Date | null\n };\n \n // Code editor config\n public codeLanguage = 'typescript';\n public showCodeComments = false;\n \n private dialogService = inject(MJDialogService);\n private viewContainerRef = inject(ViewContainerRef);\n private sharedService = inject(SharedService);\n\n async ngOnInit() {\n await super.ngOnInit();\n \n if (this.record?.IsSaved) {\n // Load all related data in parallel\n await Promise.all([\n this.loadCategory(),\n this.loadActionParams(),\n this.loadResultCodes(),\n this.loadRecentExecutions(),\n this.loadActionLibraries(),\n this.loadExecutionStats()\n ]);\n this.cdr.detectChanges();\n }\n }\n \n /**\n * Override InternalSaveRecord to handle Action and related ActionParams in a transaction\n * This follows the same pattern as MJAIAgentFormComponent\n */\n protected async InternalSaveRecord(): Promise<boolean> {\n if (!this.record) {\n return false;\n }\n \n try {\n const md = new Metadata();\n const transactionGroup = await md.CreateTransactionGroup();\n \n // Set transaction group on the Action record\n this.record.TransactionGroup = transactionGroup;\n \n // Save the Action record first\n const actionSaved = await this.record.Save();\n \n if (!actionSaved) {\n console.error('Failed to save Action record');\n this.sharedService.CreateSimpleNotification('Failed to save Action record', 'error', 5000);\n return false;\n }\n \n // Process all pending records (params and result codes to save or delete)\n for (const pendingRecord of this.PendingRecords) {\n if (pendingRecord.entityObject.EntityInfo.Name === 'MJ: Action Params') {\n const param = pendingRecord.entityObject as MJActionParamEntity;\n \n // Ensure ActionID is set for new params\n if (!param.ActionID) {\n param.ActionID = this.record.ID;\n }\n \n param.TransactionGroup = transactionGroup;\n \n if (pendingRecord.action === 'save') {\n const saved = await param.Save();\n if (!saved) {\n console.error('Failed to save parameter:', param.Name);\n return false;\n }\n } else if (pendingRecord.action === 'delete') {\n const deleted = await param.Delete();\n if (!deleted) {\n console.error('Failed to delete parameter:', param.Name);\n return false;\n }\n }\n } else if (pendingRecord.entityObject.EntityInfo.Name === 'MJ: Action Result Codes') {\n const resultCode = pendingRecord.entityObject as MJActionResultCodeEntity;\n \n // Ensure ActionID is set for new result codes\n if (!resultCode.ActionID) {\n resultCode.ActionID = this.record.ID;\n }\n \n resultCode.TransactionGroup = transactionGroup;\n \n if (pendingRecord.action === 'save') {\n const saved = await resultCode.Save();\n if (!saved) {\n console.error('Failed to save result code:', resultCode.ResultCode);\n return false;\n }\n } else if (pendingRecord.action === 'delete') {\n const deleted = await resultCode.Delete();\n if (!deleted) {\n console.error('Failed to delete result code:', resultCode.ResultCode);\n return false;\n }\n }\n }\n }\n \n // Submit the transaction\n const success = await transactionGroup.Submit();\n \n if (success) {\n // Clear pending records after successful save\n this.PendingRecords.length = 0;\n this.paramsToDelete = [];\n this.resultCodesToDelete = [];\n\n // Note: the base SaveRecord() already emits a \"Record saved\n // successfully\" toast on success — don't emit another one\n // from here or users get two toasts for one save.\n\n // Defer the post-save reload so the template's post-save CD\n // pass completes before `actionParams` / `resultCodes` mutate.\n // We also run the reload *silently* (no isLoadingParams flash)\n // and batch the final state into a single `detectChanges()`\n // to avoid NG0100: previously the spinner toggle + array\n // replacement generated multiple interleaved CD passes that\n // saw `actionParams.length` change between check/verify.\n queueMicrotask(() => {\n void this.reloadAfterSaveSilent();\n });\n }\n\n return success;\n \n } catch (error) {\n console.error('Error saving Action and parameters:', error);\n this.sharedService.CreateSimpleNotification('Error saving Action: ' + error, 'error', 5000);\n return false;\n }\n }\n\n private async loadCategory() {\n if (!this.record.CategoryID) return;\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJActionCategoryEntity>('MJ: Action Categories');\n const loaded = await entity.Load(this.record.CategoryID);\n if (loaded) {\n this.category = entity;\n }\n } catch (error) {\n // Error loading category\n }\n }\n\n private async loadActionParams() {\n this.isLoadingParams = true;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJActionParamEntity>({\n EntityName: 'MJ: Action Params',\n ExtraFilter: `ActionID='${this.record.ID}'`,\n OrderBy: 'Name',\n ResultType: 'entity_object' // This ensures we get proper entity instances\n });\n \n if (result.Success) {\n this.actionParams = result.Results || [];\n // Update cached filtered params - trim and lowercase Type values to handle any whitespace and case\n this._inputParams = this.actionParams.filter(p => {\n const type = p.Type?.trim().toLowerCase();\n return type === 'input' || type === 'both';\n });\n this._outputParams = this.actionParams.filter(p => {\n const type = p.Type?.trim().toLowerCase();\n return type === 'output' || type === 'both';\n });\n } else {\n // Failed to load action params\n this.actionParams = [];\n this._inputParams = [];\n this._outputParams = [];\n }\n } catch (error) {\n // Error loading action params\n this.actionParams = [];\n this._inputParams = [];\n this._outputParams = [];\n } finally {\n this.isLoadingParams = false;\n }\n }\n\n private async loadResultCodes() {\n this.isLoadingResultCodes = true;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJActionResultCodeEntity>({\n EntityName: 'MJ: Action Result Codes',\n ExtraFilter: `ActionID='${this.record.ID}'`,\n OrderBy: 'IsSuccess DESC, ResultCode',\n ResultType: 'entity_object' // This ensures we get proper entity instances\n });\n \n if (result.Success) {\n this.resultCodes = result.Results || [];\n } else {\n // Failed to load result codes\n this.resultCodes = [];\n }\n } catch (error) {\n // Error loading result codes\n this.resultCodes = [];\n } finally {\n this.isLoadingResultCodes = false;\n }\n }\n\n /**\n * Silent post-save reload. Unlike `loadActionParams` / `loadResultCodes`,\n * this version:\n * - Does NOT toggle `isLoadingParams` / `isLoadingResultCodes`. No\n * spinner is needed; the form is already back in read mode.\n * - Runs both RunViews in parallel off a single network round-trip.\n * - Commits the results in one synchronous block, then calls\n * `detectChanges()` once so Angular sees a single CD pass rather\n * than the three-or-four passes the original flow produced.\n *\n * This is what eliminates the NG0100 \"`actionParams.length` changed\n * from 33 to 35\" error we were seeing after save: previously the\n * length flipped between the check and verify phases of a CD pass\n * triggered by the spinner-flag updates.\n */\n private async reloadAfterSaveSilent(): Promise<void> {\n try {\n const rv = new RunView();\n const [paramResult, codeResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Action Params',\n ExtraFilter: `ActionID='${this.record.ID}'`,\n OrderBy: 'Name',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: Action Result Codes',\n ExtraFilter: `ActionID='${this.record.ID}'`,\n OrderBy: 'IsSuccess DESC, ResultCode',\n ResultType: 'entity_object'\n }\n ]);\n\n const params = (paramResult.Success ? paramResult.Results : []) as MJActionParamEntity[];\n const codes = (codeResult.Success ? codeResult.Results : []) as MJActionResultCodeEntity[];\n\n // Single synchronous commit — all template-observable arrays\n // swap at once, avoiding interleaved CD passes.\n this.actionParams = params;\n this._inputParams = params.filter((p) => {\n const type = p.Type?.trim().toLowerCase();\n return type === 'input' || type === 'both';\n });\n this._outputParams = params.filter((p) => {\n const type = p.Type?.trim().toLowerCase();\n return type === 'output' || type === 'both';\n });\n this.resultCodes = codes;\n\n this.cdr.detectChanges();\n } catch (e) {\n console.error('Post-save reload failed:', e);\n }\n }\n\n private async loadRecentExecutions() {\n this.isLoadingExecutions = true;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJActionExecutionLogEntity>({\n EntityName: 'MJ: Action Execution Logs',\n ExtraFilter: `ActionID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC',\n MaxRows: 10 \n });\n \n if (result.Success) {\n this.recentExecutions = result.Results || [];\n } else {\n // Failed to load executions\n this.recentExecutions = [];\n }\n } catch (error) {\n // Error loading executions\n this.recentExecutions = [];\n } finally {\n this.isLoadingExecutions = false;\n }\n }\n\n private async loadActionLibraries() {\n this.isLoadingLibraries = true;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJActionLibraryEntity>({\n EntityName: 'MJ: Action Libraries',\n ExtraFilter: `ActionID='${this.record.ID}'`,\n OrderBy: 'Library' \n });\n \n if (result.Success) {\n this.actionLibraries = result.Results || [];\n \n // Load library details\n if (this.actionLibraries.length > 0) {\n const libraryIds = this.actionLibraries.map(al => al.LibraryID).filter(id => id);\n const md = new Metadata();\n this.libraries = [];\n \n for (const libId of libraryIds) {\n const lib = await md.GetEntityObject<MJLibraryEntity>('MJ: Libraries');\n if (lib && libId) {\n await lib.Load(libId);\n this.libraries.push(lib);\n }\n }\n }\n }\n } catch (error) {\n // Error loading libraries\n } finally {\n this.isLoadingLibraries = false;\n }\n }\n\n private async loadExecutionStats() {\n try {\n const rv = new RunView();\n // Load ALL executions for accurate statistics\n const result = await rv.RunView<MJActionExecutionLogEntity>({\n EntityName: 'MJ: Action Execution Logs',\n ExtraFilter: `ActionID='${this.record.ID}'`,\n OrderBy: 'StartedAt DESC' \n });\n \n if (result.Success && result.Results && result.Results.length > 0) {\n const allExecutions = result.Results;\n this.executionStats.totalRuns = allExecutions.length;\n \n // Calculate success rate based on result codes\n const successfulRuns = allExecutions.filter(e => {\n const resultCode = this.resultCodes.find(rc => rc.ResultCode === e.ResultCode);\n return resultCode?.IsSuccess || false;\n });\n \n this.executionStats.successRate = this.executionStats.totalRuns > 0 \n ? (successfulRuns.length / this.executionStats.totalRuns) * 100 \n : 0;\n \n // Calculate average duration from ALL completed executions\n const completedExecutions = allExecutions.filter(e => e.StartedAt && e.EndedAt);\n if (completedExecutions.length > 0) {\n const totalDuration = completedExecutions.reduce((sum, e) => {\n const duration = new Date(e.EndedAt!).getTime() - new Date(e.StartedAt).getTime();\n // Use absolute value to handle any swapped dates\n return sum + Math.abs(duration);\n }, 0);\n this.executionStats.avgDuration = totalDuration / completedExecutions.length;\n }\n \n // Get last run date from most recent execution\n this.executionStats.lastRun = new Date(allExecutions[0].StartedAt);\n }\n } catch (error) {\n // Error loading execution stats\n }\n }\n\n // UI Helper Methods\n getStatusColor(): string {\n switch (this.record.Status) {\n case 'Active': return 'var(--mj-status-success)';\n case 'Pending': return 'var(--mj-status-warning)';\n case 'Disabled': return 'var(--mj-status-error)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n getStatusIcon(): string {\n switch (this.record.Status) {\n case 'Active': return 'fa-check-circle';\n case 'Pending': return 'fa-clock';\n case 'Disabled': return 'fa-ban';\n default: return 'fa-question-circle';\n }\n }\n\n getTypeColor(): string {\n switch (this.record.Type) {\n case 'Runtime':\n return 'var(--mj-status-warning)';\n case 'Generated':\n case 'Custom':\n default:\n return 'var(--mj-brand-primary)';\n }\n }\n\n getTypeIcon(): string {\n switch (this.record.Type) {\n case 'Runtime': return 'fa-wand-magic-sparkles';\n case 'Generated': return 'fa-robot';\n case 'Custom':\n default: return 'fa-code';\n }\n }\n\n // =====================================================================\n // Runtime Actions — approval-UI helpers (Phase 1i)\n //\n // Only relevant when `record.Type === 'Runtime'`. Each method reads the\n // typed `RuntimeActionConfigurationObject` accessor emitted by CodeGen\n // (via the JSONType metadata system) so consumers never hand-parse the\n // raw JSON string. The approval panel uses these to surface the\n // permission set an approver is implicitly blessing.\n // =====================================================================\n\n public get isRuntimeAction(): boolean {\n return this.record?.Type === 'Runtime';\n }\n\n public get runtimeConfig(): MJActionEntity_IRuntimeActionConfiguration | null {\n if (!this.isRuntimeAction) return null;\n const accessor = (this.record as unknown as {\n RuntimeActionConfigurationObject?: MJActionEntity_IRuntimeActionConfiguration | null;\n });\n return accessor.RuntimeActionConfigurationObject ?? null;\n }\n\n public getAllowedEntities(): Array<{ id: string; name: string }> {\n return this.runtimeConfig?.permissions?.allowedEntities ?? [];\n }\n\n public getAllowedActions(): Array<{ id: string; name: string }> {\n return this.runtimeConfig?.permissions?.allowedActions ?? [];\n }\n\n public getAllowedAgents(): Array<{ id: string; name: string }> {\n return this.runtimeConfig?.permissions?.allowedAgents ?? [];\n }\n\n public getRequestedLibraries(): Array<{ name: string; version?: string }> {\n return this.runtimeConfig?.sandbox?.additionalLibraries ?? [];\n }\n\n public getRuntimeLimits(): { maxMemoryMB: number; maxBridgeCalls: number } {\n const limits = this.runtimeConfig?.limits ?? {};\n return {\n maxMemoryMB: limits.maxMemoryMB ?? 128,\n maxBridgeCalls: limits.maxBridgeCalls ?? 100\n };\n }\n\n public getRuntimeConfigSummary(): string {\n const perms = this.runtimeConfig?.permissions;\n if (!perms) return 'No permissions declared';\n const e = perms.allowedEntities?.length ?? 0;\n const a = perms.allowedActions?.length ?? 0;\n const ag = perms.allowedAgents?.length ?? 0;\n const wildcards = this.getWildcardFlags();\n const parts: string[] = [];\n parts.push(wildcards.entity ? 'ANY entity' : `${e} entit${e === 1 ? 'y' : 'ies'}`);\n parts.push(wildcards.action ? 'ANY action' : `${a} action${a === 1 ? '' : 's'}`);\n parts.push(wildcards.agent ? 'ANY agent' : `${ag} agent${ag === 1 ? '' : 's'}`);\n return parts.join(', ');\n }\n\n /**\n * Returns which wildcard permission flags are set on the runtime\n * configuration. Any `true` flag is a prominent security-relevant\n * concession to the action — the approval UI renders a warning banner\n * when any of these are on so the approver sees the blast radius.\n */\n public getWildcardFlags(): { entity: boolean; action: boolean; agent: boolean; any: boolean } {\n const perms = this.runtimeConfig?.permissions as\n | { allowAnyEntity?: boolean; allowAnyAction?: boolean; allowAnyAgent?: boolean }\n | undefined;\n const entity = perms?.allowAnyEntity === true;\n const action = perms?.allowAnyAction === true;\n const agent = perms?.allowAnyAgent === true;\n return { entity, action, agent, any: entity || action || agent };\n }\n\n /**\n * Both Generated and Runtime actions carry executable code gated by\n * `CodeApprovalStatus` — the RuntimeActionExecutor refuses to run\n * anything that isn't `Approved`, and CodeGen blocks unapproved\n * Generated code from being emitted. Custom actions run registered\n * TypeScript classes and don't have this gate.\n *\n * Getter rather than method so Angular's change detector can't\n * observe inconsistent results across check/verify passes — this\n * is the standard fix for NG0100 when a conditional's expression\n * depends on a method call.\n */\n get hasCodeApproval(): boolean {\n return this.record?.Type === 'Generated' || this.record?.Type === 'Runtime';\n }\n\n getApprovalStatusColor(): string {\n switch (this.record.CodeApprovalStatus) {\n case 'Approved': return 'var(--mj-status-success)';\n case 'Pending': return 'var(--mj-status-warning)';\n case 'Rejected': return 'var(--mj-status-error)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n getApprovalStatusIcon(): string {\n switch (this.record.CodeApprovalStatus) {\n case 'Approved': return 'fa-check-circle';\n case 'Pending': return 'fa-clock';\n case 'Rejected': return 'fa-times-circle';\n default: return 'fa-question-circle';\n }\n }\n\n getParamTypeIcon(type: string): string {\n switch (type) {\n case 'Input': return 'fa-sign-in-alt';\n case 'Output': return 'fa-sign-out-alt';\n case 'Both': return 'fa-exchange-alt';\n default: return 'fa-question';\n }\n }\n\n getParamTypeColor(type: string): string {\n switch (type) {\n case 'Input': return 'var(--mj-brand-primary)';\n case 'Output': return 'var(--mj-status-success)';\n case 'Both': return 'var(--mj-brand-primary)';\n default: return 'var(--mj-text-muted)';\n }\n }\n\n formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60000).toFixed(1)}m`;\n }\n\n formatDate(date: Date | string | null): string {\n if (!date) return 'Never';\n const d = typeof date === 'string' ? new Date(date) : date;\n const now = new Date();\n const diff = now.getTime() - d.getTime();\n \n if (diff < 60000) return 'Just now';\n if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`;\n if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`;\n if (diff < 604800000) return `${Math.floor(diff / 86400000)}d ago`;\n \n return d.toLocaleDateString();\n }\n\n // Navigation\n navigateToEntity(entityName: string, recordId: string | null) {\n if (!recordId) return;\n SharedService.Instance.OpenEntityRecord(entityName, CompositeKey.FromID(recordId));\n }\n\n navigateToCategory() {\n if (this.record.CategoryID) {\n this.navigateToEntity('MJ: Action Categories', this.record.CategoryID);\n }\n }\n\n navigateToExecution(executionId: string) {\n this.navigateToEntity('MJ: Action Execution Logs', executionId);\n }\n\n navigateToLibrary(libraryId: string) {\n this.navigateToEntity('MJ: Libraries', libraryId);\n }\n\n // Actions\n openTestHarness() {\n if (!this.record || !this.record.ID || !this.record.IsSaved || this.record.Status !== 'Active') {\n // Cannot open test harness: Action must be saved and active\n return;\n }\n \n this.showTestHarness = true;\n }\n \n /**\n * Event handler for test harness visibility changes\n */\n public onTestHarnessVisibilityChanged(isVisible: boolean) {\n this.showTestHarness = isVisible;\n }\n\n async regenerateCode() {\n if (!this.EditMode) return;\n \n this.record.ForceCodeGeneration = true;\n await this.record.Save();\n // Reload related data after save\n await this.loadResultCodes();\n }\n\n toggleCodeComments() {\n this.showCodeComments = !this.showCodeComments;\n }\n\n async approveCode() {\n if (!this.EditMode) return;\n \n this.record.CodeApprovalStatus = 'Approved';\n this.record.CodeApprovedAt = new Date();\n // Note: CodeApprovedByUserID would be set server-side\n await this.record.Save();\n }\n\n async rejectCode() {\n if (!this.EditMode) return;\n\n this.record.CodeApprovalStatus = 'Rejected';\n await this.record.Save();\n }\n\n async copyToClipboard(text: string) {\n try {\n await navigator.clipboard.writeText(text);\n // Could add a notification here\n } catch (err) {\n // Failed to copy\n }\n }\n\n // Helper methods for template filtering\n getInputParams(): MJActionParamEntity[] {\n // Sort by IsRequired (required first) then by Name\n return this._inputParams.sort((a, b) => {\n if (a.IsRequired === b.IsRequired) {\n return (a.Name || '').localeCompare(b.Name || '');\n }\n return a.IsRequired ? -1 : 1;\n });\n }\n\n getOutputParams(): MJActionParamEntity[] {\n // Sort by Name\n return this._outputParams.sort((a, b) => (a.Name || '').localeCompare(b.Name || ''));\n }\n\n isExecutionSuccess(execution: MJActionExecutionLogEntity): boolean {\n const code = execution.ResultCode?.toLowerCase();\n // First check if we have a result code definition\n const resultCode = this.resultCodes.find(rc => rc.ResultCode === execution.ResultCode);\n if (resultCode) {\n return resultCode.IsSuccess;\n }\n // Fallback to common success patterns if no result code defined\n return code === 'success' || code === 'ok' || code === 'completed' || code === '200';\n }\n\n getExecutionDuration(execution: MJActionExecutionLogEntity): number {\n if (!execution.EndedAt) return 0;\n \n const startTime = new Date(execution.StartedAt).getTime();\n const endTime = new Date(execution.EndedAt).getTime();\n const duration = endTime - startTime;\n \n // Return absolute value to handle timezone mismatches\n return Math.abs(duration);\n }\n\n getSuccessRateColor(): string {\n const rate = this.executionStats.successRate;\n if (rate >= 80) return 'var(--mj-status-success)';\n if (rate >= 60) return 'var(--mj-status-warning)';\n return 'var(--mj-status-error)';\n }\n\n // Parameter management methods\n async addParameter(type: 'Input' | 'Output' | 'Both') {\n if (!this.EditMode || !this.record.IsSaved) return;\n \n const md = new Metadata();\n const newParam = await md.GetEntityObject<MJActionParamEntity>('MJ: Action Params');\n \n // Set default values\n newParam.ActionID = this.record.ID;\n newParam.Name = '';\n newParam.Type = type;\n newParam.ValueType = 'Scalar';\n newParam.IsRequired = false;\n newParam.IsArray = false;\n \n const dialogRef = this.dialogService.open({\n content: ActionParamDialogComponent,\n width: 500,\n appendTo: this.viewContainerRef\n });\n\n const dialog = dialogRef.Content!.instance;\n dialog['param'] = newParam;\n dialog['isNew'] = true;\n dialog['editMode'] = true;\n\n dialogRef.Result.subscribe(result => {\n if (result && typeof result === 'object' && 'save' in result) {\n // The dialog has already modified the newParam entity directly\n // New entities are automatically dirty (IsSaved = false)\n\n // Add to local array\n this.actionParams.push(newParam);\n\n // Add to pending records for saving\n this.PendingRecords.push({\n entityObject: newParam,\n action: 'save'\n });\n\n // Update the filtered arrays\n this.updateParamArrays();\n this.cdr.detectChanges();\n }\n });\n }\n\n async editParameter(param: MJActionParamEntity) {\n const dialogRef = this.dialogService.open({\n content: ActionParamDialogComponent,\n width: 500,\n appendTo: this.viewContainerRef\n });\n\n const dialog = dialogRef.Content!.instance;\n dialog['param'] = param;\n dialog['isNew'] = false;\n dialog['editMode'] = this.EditMode;\n\n dialogRef.Result.subscribe(result => {\n if (result && typeof result === 'object' && 'save' in result && this.EditMode) {\n // Param will be dirty from property changes in dialog\n // Ensure it's in pending records if modified\n if (param.Dirty) {\n const exists = this.PendingRecords.some(pr =>\n pr.entityObject === param && pr.action === 'save'\n );\n if (!exists) {\n this.PendingRecords.push({\n entityObject: param,\n action: 'save'\n });\n }\n }\n\n // Update the local arrays\n this.updateParamArrays();\n this.cdr.detectChanges();\n }\n });\n }\n \n onParamClick(param: MJActionParamEntity, event: Event) {\n // Prevent event bubbling if clicking on edit/delete buttons\n const target = event.target as HTMLElement;\n if (target.closest('.param-edit-btn') || target.closest('.param-delete-btn')) {\n return;\n }\n \n // Show the parameter dialog\n this.editParameter(param);\n }\n\n \n private async updateParamArrays() {\n // Update cached filtered params - exclude deleted items\n const activeParams = this.actionParams.filter(p => !this.paramsToDelete || !this.paramsToDelete.includes(p));\n \n this._inputParams = activeParams.filter(p => {\n const type = p.Type?.trim().toLowerCase();\n return type === 'input' || type === 'both';\n });\n \n this._outputParams = activeParams.filter(p => {\n const type = p.Type?.trim().toLowerCase();\n return type === 'output' || type === 'both';\n });\n }\n \n // Override to populate pending records with our action params and result codes\n protected PopulatePendingRecords() {\n // Preserve existing pending records before base class clears them\n const currentPendingRecords = [...this.PendingRecords];\n \n // Call parent to handle child components\n super.PopulatePendingRecords();\n \n // Re-add our preserved records\n for (const record of currentPendingRecords) {\n // Only re-add if it's an Action Param or Result Code (avoid duplicates)\n if (record.entityObject.EntityInfo.Name === 'MJ: Action Params' || \n record.entityObject.EntityInfo.Name === 'MJ: Action Result Codes') {\n const exists = this.PendingRecords.some(pr => \n pr.entityObject === record.entityObject\n );\n if (!exists) {\n this.PendingRecords.push(record);\n }\n }\n }\n \n // Add action params that need saving\n for (const param of this.actionParams) {\n if (!param.IsSaved || param.Dirty) {\n // Check if not already in pending records\n const exists = this.PendingRecords.some(pr => \n pr.entityObject === param\n );\n if (!exists) {\n this.PendingRecords.push({\n entityObject: param,\n action: 'save'\n });\n }\n }\n }\n \n // Add params marked for deletion\n for (const param of this.paramsToDelete) {\n if (param.IsSaved) {\n // Check if not already in pending records\n const exists = this.PendingRecords.some(pr => \n pr.entityObject === param\n );\n if (!exists) {\n this.PendingRecords.push({\n entityObject: param,\n action: 'delete'\n });\n }\n }\n }\n \n // Add result codes that need saving\n for (const resultCode of this.resultCodes) {\n if (!resultCode.IsSaved || resultCode.Dirty) {\n // Check if not already in pending records\n const exists = this.PendingRecords.some(pr => \n pr.entityObject === resultCode\n );\n if (!exists) {\n this.PendingRecords.push({\n entityObject: resultCode,\n action: 'save'\n });\n }\n }\n }\n \n // Add result codes marked for deletion\n for (const resultCode of this.resultCodesToDelete) {\n if (resultCode.IsSaved) {\n // Check if not already in pending records\n const exists = this.PendingRecords.some(pr => \n pr.entityObject === resultCode\n );\n if (!exists) {\n this.PendingRecords.push({\n entityObject: resultCode,\n action: 'delete'\n });\n }\n }\n }\n }\n \n /**\n * Gets the action's display icon\n * Falls back to default cog icon if no IconClass is set\n */\n public getActionIcon(): string {\n return this.record?.IconClass || 'fa-solid fa-cog';\n }\n \n // Result Code management methods\n async addResultCode() {\n if (!this.EditMode || !this.record.IsSaved) return;\n \n const md = new Metadata();\n const newResultCode = await md.GetEntityObject<MJActionResultCodeEntity>('MJ: Action Result Codes');\n \n // Set default values\n newResultCode.ActionID = this.record.ID;\n newResultCode.ResultCode = '';\n newResultCode.Description = '';\n newResultCode.IsSuccess = false;\n \n const dialogRef = this.dialogService.open({\n content: ActionResultCodeDialogComponent,\n width: 500,\n appendTo: this.viewContainerRef\n });\n\n const dialog = dialogRef.Content!.instance;\n dialog['resultCode'] = newResultCode;\n dialog['isNew'] = true;\n dialog['editMode'] = true;\n\n dialogRef.Result.subscribe(result => {\n if (result && typeof result === 'object' && 'save' in result) {\n // Add to local array\n this.resultCodes.push(newResultCode);\n\n // Add to pending records for saving\n this.PendingRecords.push({\n entityObject: newResultCode,\n action: 'save'\n });\n\n this.cdr.detectChanges();\n }\n });\n }\n \n async editResultCode(resultCode: MJActionResultCodeEntity) {\n const dialogRef = this.dialogService.open({\n content: ActionResultCodeDialogComponent,\n width: 500,\n appendTo: this.viewContainerRef\n });\n\n const dialog = dialogRef.Content!.instance;\n dialog['resultCode'] = resultCode;\n dialog['isNew'] = false;\n dialog['editMode'] = this.EditMode;\n\n dialogRef.Result.subscribe(result => {\n if (result && typeof result === 'object' && 'save' in result && this.EditMode) {\n // Ensure it's in pending records if modified\n if (resultCode.Dirty) {\n const exists = this.PendingRecords.some(pr =>\n pr.entityObject === resultCode && pr.action === 'save'\n );\n if (!exists) {\n this.PendingRecords.push({\n entityObject: resultCode,\n action: 'save'\n });\n }\n }\n\n this.cdr.detectChanges();\n }\n });\n }\n \n onResultCodeClick(resultCode: MJActionResultCodeEntity, event: Event) {\n // Prevent event bubbling if clicking on edit/delete buttons\n const target = event.target as HTMLElement;\n if (target.closest('.result-edit-btn') || target.closest('.result-delete-btn')) {\n return;\n }\n \n // Show the result code dialog\n this.editResultCode(resultCode);\n }\n \n /**\n * Delete a result code (marks for deletion on save)\n */\n deleteResultCode(resultCode: MJActionResultCodeEntity) {\n if (!this.EditMode) return;\n \n // Remove from main array\n const index = this.resultCodes.indexOf(resultCode);\n if (index > -1) {\n this.resultCodes.splice(index, 1);\n }\n \n // Handle pending records\n if (resultCode.IsSaved) {\n // Add to deletion list for saved result codes\n this.resultCodesToDelete.push(resultCode);\n \n // Add to pending records for deletion\n this.PendingRecords.push({\n entityObject: resultCode,\n action: 'delete'\n });\n } else {\n // For unsaved result codes, just remove from pending records\n const pendingIndex = this.PendingRecords.findIndex(pr => \n pr.entityObject === resultCode && pr.action === 'save'\n );\n if (pendingIndex >= 0) {\n this.PendingRecords.splice(pendingIndex, 1);\n }\n }\n \n this.cdr.detectChanges();\n }\n \n /**\n * Delete a parameter (marks for deletion on save)\n */\n deleteParameter(param: MJActionParamEntity) {\n if (!this.EditMode) return;\n \n // Remove from main array\n const index = this.actionParams.indexOf(param);\n if (index > -1) {\n this.actionParams.splice(index, 1);\n }\n \n // Handle pending records\n if (param.IsSaved) {\n // Add to deletion list for saved params\n this.paramsToDelete.push(param);\n \n // Add to pending records for deletion\n this.PendingRecords.push({\n entityObject: param,\n action: 'delete'\n });\n } else {\n // For unsaved params, just remove from pending records\n const pendingIndex = this.PendingRecords.findIndex(pr => \n pr.entityObject === param && pr.action === 'save'\n );\n if (pendingIndex >= 0) {\n this.PendingRecords.splice(pendingIndex, 1);\n }\n }\n \n // Update filtered arrays\n this.updateParamArrays();\n this.cdr.detectChanges();\n }\n}\n","<!--\n NOTE: We wrap the form content in <mj-record-form-container> rather than\n using <mj-form-toolbar> directly. The container owns the toolbar AND the\n panels behind History/Tags/List buttons — without it those buttons emit\n events that nothing listens to and the features silently break. Follow\n this pattern for every custom entity form — see packages/Angular/CLAUDE.md.\n-->\n@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n [ToolbarConfig]=\"toolbarConfig\"\n [WidthMode]=\"'full-width'\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n <form class=\"record-form\" #form=\"ngForm\" style=\"display: flex; flex-direction: column; height: 100%; overflow: hidden;\">\n\n <!-- Main Content Area -->\n <div class=\"action-main-area\" style=\"display: flex; flex-direction: column; flex: 1; min-height: 0; overflow-y: auto;\">\n \n <!-- Header Section -->\n <div class=\"action-header\" style=\"flex-shrink: 0; padding: 20px; background: var(--mj-bg-surface-card); border-bottom: 2px solid var(--mj-border-default);\">\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; gap: 20px;\">\n \n <!-- Left: Action Info -->\n <div style=\"flex: 1; min-width: 0;\">\n <div style=\"display: flex; align-items: center; gap: 12px; margin-bottom: 8px;\">\n <i [class]=\"getActionIcon()\" [style.color]=\"getTypeColor()\" style=\"font-size: 1.4em;\"></i>\n @if (EditMode) {\n <input type=\"text\" class=\"mj-input\"\n [(ngModel)]=\"record.Name\"\n name=\"actionName\"\n placeholder=\"Enter action name...\"\n style=\"font-size: 1.2em; font-weight: 600; min-width: 300px; flex: 1;\" />\n } @else {\n <h4 style=\"margin: 0; color: var(--mj-text-secondary); font-weight: 600; flex: 1;\">{{ record.Name || 'Untitled Action' }}</h4>\n <span class=\"status-chip\"\n [attr.data-color]=\"record.Status === 'Active' ? 'success' : record.Status === 'Pending' ? 'warning' : 'error'\">\n {{ record.Status }}\n </span>\n @if (hasCodeApproval && record.CodeApprovalStatus) {\n <span class=\"status-chip\"\n [attr.data-color]=\"record.CodeApprovalStatus === 'Approved' ? 'success' : record.CodeApprovalStatus === 'Pending' ? 'warning' : 'error'\"\n [title]=\"'Code ' + record.CodeApprovalStatus\">\n <i [class]=\"'fa-solid ' + getApprovalStatusIcon()\" style=\"margin-right: 4px;\"></i>\n {{ record.CodeApprovalStatus }}\n </span>\n }\n }\n </div>\n \n <!-- Status and Type Editors when in edit mode -->\n @if (EditMode) {\n <div style=\"display: flex; gap: 16px; margin-bottom: 12px; flex-wrap: wrap;\">\n <div>\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">Status</label>\n <mj-dropdown [(ngModel)]=\"record.Status\"\n name=\"actionStatus\"\n [Data]=\"[{text: 'Active', value: 'Active'}, {text: 'Pending', value: 'Pending'}, {text: 'Disabled', value: 'Disabled'}]\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n style=\"width: 150px;\">\n </mj-dropdown>\n </div>\n <div>\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">\n Type <span style=\"color: var(--mj-status-error);\">*</span>\n </label>\n <mj-dropdown [(ngModel)]=\"record.Type\"\n name=\"actionType\"\n [Data]=\"[{text: 'Generated', value: 'Generated'}, {text: 'Custom', value: 'Custom'}]\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n style=\"width: 150px;\">\n </mj-dropdown>\n </div>\n <div>\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">\n Category <span style=\"color: var(--mj-status-error);\">*</span>\n </label>\n <mj-dropdown [(ngModel)]=\"record.CategoryID\"\n name=\"categoryID\"\n [Data]=\"[]\"\n Placeholder=\"Select category...\"\n style=\"width: 200px;\">\n </mj-dropdown>\n </div>\n @if (hasCodeApproval) {\n <div>\n <label style=\"display: block; margin-bottom: 4px; font-weight: 600; color: var(--mj-text-secondary); font-size: 0.9em;\">\n <i [class]=\"'fa-solid ' + getApprovalStatusIcon()\" [style.color]=\"getApprovalStatusColor()\" style=\"margin-right: 4px;\"></i>\n Code Approval\n </label>\n <mj-dropdown [(ngModel)]=\"record.CodeApprovalStatus\"\n name=\"codeApprovalStatus\"\n [Data]=\"[{text: 'Approved', value: 'Approved'}, {text: 'Pending', value: 'Pending'}, {text: 'Rejected', value: 'Rejected'}]\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n style=\"width: 160px;\">\n </mj-dropdown>\n </div>\n }\n </div>\n }\n \n @if (EditMode) {\n <textarea class=\"mj-textarea\" [(ngModel)]=\"record.Description\" \n name=\"actionDescription\"\n [rows]=\"2\"\n placeholder=\"Enter action description...\"\n style=\"width: 100%; max-width: 600px; margin-bottom: 12px;\">\n </textarea>\n } @else if (record.Description) {\n <p style=\"margin: 0 0 12px 0; color: var(--mj-text-muted); font-size: 0.9em; line-height: 1.4;\">{{ record.Description }}</p>\n }\n \n <!-- Quick Config Row -->\n <div class=\"quick-config\" style=\"display: flex; align-items: center; gap: 16px; flex-wrap: wrap;\">\n @if (category) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-folder\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Category:</span>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500; cursor: pointer;\" (click)=\"navigateToCategory()\">\n {{ category.Name }}\n <i class=\"fa-solid fa-external-link\" style=\"font-size: 0.75em; margin-left: 4px;\"></i>\n </span>\n </div>\n }\n \n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-cube\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-muted);\">Type:</span>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500;\">{{ record.Type }}</span>\n </div>\n \n @if (hasCodeApproval && record.CodeApprovalStatus) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i [class]=\"'fa-solid ' + getApprovalStatusIcon()\" [style.color]=\"getApprovalStatusColor()\"></i>\n <span style=\"color: var(--mj-text-muted);\">Code:</span>\n <span [style.color]=\"getApprovalStatusColor()\" style=\"font-weight: 500;\">{{ record.CodeApprovalStatus }}</span>\n </div>\n }\n \n @if (actionParams.length > 0) {\n <div class=\"config-item\" style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-sliders\" style=\"color: var(--mj-text-muted);\"></i>\n <span style=\"color: var(--mj-text-secondary); font-weight: 500;\">{{ actionParams.length }} Parameters</span>\n </div>\n }\n </div>\n </div>\n \n <!-- Right: Action Buttons -->\n <div class=\"action-buttons\" style=\"display: flex; flex-direction: column; gap: 8px; align-items: flex-end;\">\n <div style=\"display: flex; gap: 8px;\">\n @if (record.ID && !EditMode) {\n <button mjButton variant=\"primary\" size=\"lg\"\n (click)=\"openTestHarness()\"\n title=\"Open Run Harness\"\n [disabled]=\"record.Status !== 'Active'\">\n <i class=\"fa-solid fa-play\"></i> Run\n </button>\n }\n @if (EditMode && record.Type === 'Generated') {\n <button mjButton variant=\"outline\" size=\"md\"\n (click)=\"regenerateCode()\"\n title=\"Regenerate Code\">\n <i class=\"fa-solid fa-robot\"></i> Regenerate\n </button>\n }\n </div>\n \n @if (!EditMode && record.Status !== 'Active' && record.ID) {\n <div style=\"font-size: 0.75em; color: var(--mj-status-error); text-align: right;\">\n Action must be Active to execute\n </div>\n }\n </div>\n </div>\n </div>\n\n <!-- Configuration Sections with Expansion Panels -->\n <div class=\"configuration-sections\" style=\"flex: 1; background: var(--mj-bg-surface-card); border-top: 2px solid var(--mj-border-default); padding: 16px; min-height: 0;\">\n \n <!-- Parameters Section (FIRST) -->\n <mj-accordion-panel\n [Expanded]=\"true\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-sliders\" style=\"color: var(--mj-text-muted);\"></i>\n Parameters\n @if (actionParams.length > 0) {\n <span style=\"background: var(--mj-status-info); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ actionParams.length }}\n </span>\n }\n </span>\n </ng-template>\n \n <div style=\"padding: 16px;\">\n @if (isLoadingParams) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading parameters...\n </div>\n } @else if (actionParams.length === 0) {\n <div class=\"empty-state\" style=\"padding: 30px; text-align: center;\">\n <i class=\"fa-solid fa-sliders\" style=\"font-size: 2em; color: var(--mj-text-muted); opacity: 0.3;\"></i>\n <p style=\"margin: 12px 0 0 0; color: var(--mj-text-muted);\">No parameters defined</p>\n @if (EditMode && record.IsSaved) {\n <p style=\"margin: 8px 0 0 0; font-size: 0.85em; color: var(--mj-text-muted);\">Add parameters to define inputs and outputs for this action</p>\n }\n </div>\n } @else {\n <!-- Input Parameters Grid -->\n <div class=\"params-section\">\n <div class=\"params-header\">\n <h3><i class=\"fa-solid fa-sign-in-alt\"></i> Input Parameters</h3>\n @if (EditMode && record.IsSaved) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"addParameter('Input')\">\n <i class=\"fa-solid fa-plus\"></i> Add Input\n </button>\n }\n </div>\n \n @if (getInputParams().length === 0) {\n <div class=\"empty-state\" style=\"padding: 30px; text-align: center;\">\n <i class=\"fa-solid fa-inbox\" style=\"font-size: 2em; color: var(--mj-text-muted); opacity: 0.3;\"></i>\n <p style=\"margin: 12px 0 0 0; color: var(--mj-text-muted);\">No input parameters defined</p>\n </div>\n } @else {\n <div class=\"params-grid\">\n @for (param of getInputParams(); track param.ID) {\n <div class=\"param-card\" [class.required]=\"param.IsRequired\" \n [class.clickable]=\"true\"\n (click)=\"onParamClick(param, $event)\">\n <div class=\"param-header\">\n <span class=\"param-name\">{{ param.Name }}</span>\n <div class=\"param-badges\">\n @if (param.IsRequired) {\n <span class=\"required-badge\">Required</span>\n }\n @if (param.IsArray) {\n <span class=\"array-badge\">Array</span>\n }\n @if (EditMode) {\n <button class=\"param-edit-btn\" (click)=\"editParameter(param)\" title=\"Edit parameter\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n <button class=\"param-delete-btn\" (click)=\"deleteParameter(param)\" title=\"Delete parameter\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n </div>\n <div class=\"param-details\">\n <div class=\"param-type\">{{ param.ValueType }}</div>\n @if (param.Description) {\n <div class=\"param-description\">{{ param.Description }}</div>\n }\n @if (param.DefaultValue) {\n <div class=\"param-default\">\n <span class=\"default-label\">Default:</span>\n <code>{{ param.DefaultValue }}</code>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Output Parameters Grid -->\n <div class=\"params-section\" style=\"margin-top: 24px;\" \n [class.params-section-compact]=\"getOutputParams().length === 0\">\n <div class=\"params-header\">\n <h3><i class=\"fa-solid fa-sign-out-alt\"></i> Output Parameters</h3>\n @if (EditMode && record.IsSaved) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"addParameter('Output')\">\n <i class=\"fa-solid fa-plus\"></i> Add Output\n </button>\n }\n </div>\n \n @if (getOutputParams().length === 0) {\n <div class=\"empty-state\" style=\"padding: 20px; text-align: center;\">\n <i class=\"fa-solid fa-inbox\" style=\"font-size: 2em; color: var(--mj-text-muted); opacity: 0.3;\"></i>\n <p style=\"margin: 12px 0 0 0; color: var(--mj-text-muted);\">No output parameters defined</p>\n </div>\n } @else {\n <div class=\"params-grid\">\n @for (param of getOutputParams(); track param.ID) {\n <div class=\"param-card\"\n [class.clickable]=\"true\"\n (click)=\"onParamClick(param, $event)\">\n <div class=\"param-header\">\n <span class=\"param-name\">{{ param.Name }}</span>\n <div class=\"param-badges\">\n @if (param.IsArray) {\n <span class=\"array-badge\">Array</span>\n }\n @if (EditMode) {\n <button class=\"param-edit-btn\" (click)=\"editParameter(param)\" title=\"Edit parameter\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n <button class=\"param-delete-btn\" (click)=\"deleteParameter(param)\" title=\"Delete parameter\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n </div>\n <div class=\"param-details\">\n <div class=\"param-type\">{{ param.ValueType }}</div>\n @if (param.Description) {\n <div class=\"param-description\">{{ param.Description }}</div>\n }\n @if (param.DefaultValue) {\n <div class=\"param-default\">\n <span class=\"default-label\">Default:</span>\n <code>{{ param.DefaultValue }}</code>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </mj-accordion-panel>\n\n <!-- Code & Generation Section (Only for Generated type) -->\n @if (record.Type === 'Generated') {\n <mj-accordion-panel\n [Expanded]=\"expandedSections.code\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-code\" style=\"color: var(--mj-text-muted);\"></i>\n Code &amp; Generation\n @if (record.CodeLocked) {\n <span style=\"background: var(--mj-status-warning); color: var(--mj-color-warning-800); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n <i class=\"fa-solid fa-lock\"></i> Locked\n </span>\n }\n </span>\n </ng-template>\n \n <div style=\"padding: 16px;\">\n @if (EditMode) {\n <div class=\"generation-panel\">\n <h3><i class=\"fa-solid fa-robot\"></i> AI Generation</h3>\n <div class=\"prompt-section\">\n <label>User Prompt</label>\n <textarea class=\"mj-textarea\" [(ngModel)]=\"record.UserPrompt\"\n name=\"userPrompt\"\n [rows]=\"8\"\n placeholder=\"Describe what this action should do...\"\n style=\"width: 100%; min-height: 120px;\">\n </textarea>\n </div>\n <div class=\"comments-section\">\n <label>Internal Comments (not sent to AI)</label>\n <textarea class=\"mj-textarea\" [(ngModel)]=\"record.UserComments\"\n name=\"userComments\"\n [rows]=\"2\"\n placeholder=\"Internal notes...\"\n style=\"width: 100%;\">\n </textarea>\n </div>\n <div class=\"generation-controls\">\n <mj-switch [(ngModel)]=\"record.CodeLocked\"\n name=\"codeLocked\">\n </mj-switch>\n <label style=\"margin-left: 8px;\">Lock Code (prevent regeneration)</label>\n </div>\n </div>\n }\n \n <div class=\"code-editor-section\">\n <div class=\"code-toolbar\">\n <h3><i class=\"fa-solid fa-file-code\"></i> Action Code</h3>\n <div class=\"code-actions\">\n @if (record.CodeComments) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"toggleCodeComments()\">\n <i class=\"fa-solid fa-comment\"></i> \n {{ showCodeComments ? 'Hide' : 'Show' }} AI Comments\n </button>\n }\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"copyToClipboard(record.Code || '')\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n </div>\n </div>\n <mj-code-editor \n [(ngModel)]=\"record.Code\"\n name=\"actionCode\"\n [readonly]=\"!EditMode || record.CodeLocked\"\n [language]=\"codeLanguage\"\n [lineWrapping]=\"true\"\n style=\"height: 400px; width: 100%;\">\n </mj-code-editor>\n \n @if (showCodeComments && record.CodeComments) {\n <div class=\"code-comments\">\n <h4><i class=\"fa-solid fa-robot\"></i> AI Explanation</h4>\n <p>{{ record.CodeComments }}</p>\n </div>\n }\n \n @if (EditMode && record.CodeApprovalStatus === 'Rejected') {\n <div class=\"approval-comments\">\n <label>Rejection Comments</label>\n <textarea class=\"mj-textarea\" [(ngModel)]=\"record.CodeApprovalComments\"\n name=\"codeApprovalComments\"\n [rows]=\"2\"\n placeholder=\"Explain why the code was rejected...\"\n style=\"width: 100%;\">\n </textarea>\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Runtime Action Configuration Section (only for Type='Runtime') -->\n @if (isRuntimeAction) {\n <mj-accordion-panel\n [Expanded]=\"true\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-wand-magic-sparkles\" style=\"color: var(--mj-status-warning);\"></i>\n Runtime Configuration &amp; Permissions\n <span style=\"color: var(--mj-text-muted); font-weight: 400; font-size: 0.85em;\">\n ({{ getRuntimeConfigSummary() }})\n </span>\n </span>\n </ng-template>\n\n <div style=\"padding: 16px;\">\n @if (!runtimeConfig) {\n <div style=\"padding: 12px; background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface)); border-left: 3px solid var(--mj-status-error); border-radius: 4px;\">\n <i class=\"fa-solid fa-triangle-exclamation\" style=\"color: var(--mj-status-error); margin-right: 8px;\"></i>\n <strong>Missing or malformed RuntimeActionConfiguration.</strong>\n This Runtime action cannot run until a valid configuration is supplied. Approval should not be granted in this state.\n </div>\n } @else {\n @if (getWildcardFlags().any) {\n <div style=\"padding: 12px; background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface)); border-left: 3px solid var(--mj-status-warning); border-radius: 4px; margin-bottom: 16px;\">\n <div style=\"font-weight: 600; margin-bottom: 4px; color: var(--mj-text-primary);\">\n <i class=\"fa-solid fa-triangle-exclamation\" style=\"color: var(--mj-status-warning); margin-right: 6px;\"></i>\n Wildcard permissions enabled\n </div>\n <div style=\"color: var(--mj-text-secondary); font-size: 0.9em;\">\n This runtime action has one or more wildcard flags set that bypass the specific allowlists below:\n @if (getWildcardFlags().entity) { <strong>allowAnyEntity</strong> }\n @if (getWildcardFlags().action) { <strong>allowAnyAction</strong> }\n @if (getWildcardFlags().agent) { <strong>allowAnyAgent</strong> }\n . Approving grants this action unrestricted access to that namespace on behalf of any user who invokes it. Only approve if the action is framework-authored or you have personally reviewed every place it touches those resources.\n </div>\n </div>\n }\n <!-- Declared permissions — the security contract an approver is blessing -->\n <div style=\"display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 16px; margin-bottom: 20px;\">\n <!-- Entities -->\n <div style=\"border: 1px solid var(--mj-border-default); border-radius: 6px; padding: 12px; background: var(--mj-bg-surface-card);\">\n <div style=\"font-weight: 600; margin-bottom: 8px; color: var(--mj-text-primary);\">\n <i class=\"fa-solid fa-database\" style=\"margin-right: 6px; color: var(--mj-brand-primary);\"></i>\n Allowed Entities ({{ getAllowedEntities().length }})\n </div>\n @if (getAllowedEntities().length === 0) {\n <div style=\"color: var(--mj-text-muted); font-style: italic;\">None requested</div>\n } @else {\n <div style=\"display: flex; flex-direction: column; gap: 4px;\">\n @for (e of getAllowedEntities(); track e.id) {\n <span style=\"background: var(--mj-bg-surface-sunken); padding: 4px 8px; border-radius: 4px; font-size: 0.9em; color: var(--mj-text-primary);\">\n {{ e.name }}\n </span>\n }\n </div>\n }\n </div>\n\n <!-- Actions -->\n <div style=\"border: 1px solid var(--mj-border-default); border-radius: 6px; padding: 12px; background: var(--mj-bg-surface-card);\">\n <div style=\"font-weight: 600; margin-bottom: 8px; color: var(--mj-text-primary);\">\n <i class=\"fa-solid fa-bolt\" style=\"margin-right: 6px; color: var(--mj-brand-primary);\"></i>\n Allowed Actions ({{ getAllowedActions().length }})\n </div>\n @if (getAllowedActions().length === 0) {\n <div style=\"color: var(--mj-text-muted); font-style: italic;\">None requested</div>\n } @else {\n <div style=\"display: flex; flex-direction: column; gap: 4px;\">\n @for (a of getAllowedActions(); track a.id) {\n <span style=\"background: var(--mj-bg-surface-sunken); padding: 4px 8px; border-radius: 4px; font-size: 0.9em; color: var(--mj-text-primary);\">\n {{ a.name }}\n </span>\n }\n </div>\n }\n </div>\n\n <!-- Agents -->\n <div style=\"border: 1px solid var(--mj-border-default); border-radius: 6px; padding: 12px; background: var(--mj-bg-surface-card);\">\n <div style=\"font-weight: 600; margin-bottom: 8px; color: var(--mj-text-primary);\">\n <i class=\"fa-solid fa-robot\" style=\"margin-right: 6px; color: var(--mj-brand-primary);\"></i>\n Allowed Agents ({{ getAllowedAgents().length }})\n </div>\n @if (getAllowedAgents().length === 0) {\n <div style=\"color: var(--mj-text-muted); font-style: italic;\">None requested</div>\n } @else {\n <div style=\"display: flex; flex-direction: column; gap: 4px;\">\n @for (g of getAllowedAgents(); track g.id) {\n <span style=\"background: var(--mj-bg-surface-sunken); padding: 4px 8px; border-radius: 4px; font-size: 0.9em; color: var(--mj-text-primary);\">\n {{ g.name }}\n </span>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Limits + libraries -->\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 16px;\">\n <div>\n <div style=\"font-weight: 600; margin-bottom: 6px; color: var(--mj-text-primary);\">\n <i class=\"fa-solid fa-gauge-high\" style=\"margin-right: 6px; color: var(--mj-text-muted);\"></i>\n Resource Limits\n </div>\n <div style=\"color: var(--mj-text-secondary); font-size: 0.9em;\">\n <div>Max memory: {{ getRuntimeLimits().maxMemoryMB }} MB</div>\n <div>Max bridge calls: {{ getRuntimeLimits().maxBridgeCalls }}</div>\n @if (record.MaxExecutionTimeMS) {\n <div>Max execution time: {{ record.MaxExecutionTimeMS }} ms</div>\n }\n </div>\n </div>\n <div>\n <div style=\"font-weight: 600; margin-bottom: 6px; color: var(--mj-text-primary);\">\n <i class=\"fa-solid fa-book\" style=\"margin-right: 6px; color: var(--mj-text-muted);\"></i>\n Additional Libraries\n </div>\n @if (getRequestedLibraries().length === 0) {\n <div style=\"color: var(--mj-text-muted); font-style: italic;\">None (only default set: lodash, date-fns, uuid, validator)</div>\n } @else {\n <div style=\"display: flex; flex-wrap: wrap; gap: 4px;\">\n @for (lib of getRequestedLibraries(); track lib.name) {\n <span style=\"background: var(--mj-bg-surface-sunken); padding: 2px 8px; border-radius: 10px; font-size: 0.85em;\">\n {{ lib.name }}@if (lib.version) {<span style=\"color: var(--mj-text-muted);\"> @{{ lib.version }}</span>}\n </span>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Code payload -->\n <div>\n <div style=\"font-weight: 600; margin-bottom: 6px; color: var(--mj-text-primary);\">\n <i class=\"fa-solid fa-code\" style=\"margin-right: 6px; color: var(--mj-text-muted);\"></i>\n JavaScript Payload\n </div>\n <pre style=\"background: var(--mj-bg-surface-sunken); color: var(--mj-text-primary); padding: 12px; border-radius: 4px; overflow-x: auto; max-height: 400px; font-family: 'SF Mono', Monaco, Consolas, monospace; font-size: 0.85em; margin: 0;\"><code>{{ record.Code }}</code></pre>\n </div>\n\n <!-- Approval actions (Runtime-specific labels) -->\n @if (EditMode && record.CodeApprovalStatus === 'Pending') {\n <div style=\"margin-top: 16px; padding: 12px; background: color-mix(in srgb, var(--mj-status-warning) 8%, var(--mj-bg-surface)); border-radius: 6px;\">\n <div style=\"font-weight: 600; margin-bottom: 8px;\">\n <i class=\"fa-solid fa-circle-exclamation\" style=\"color: var(--mj-status-warning); margin-right: 6px;\"></i>\n Approval required before this Runtime action can execute.\n </div>\n <div style=\"color: var(--mj-text-secondary); font-size: 0.9em; margin-bottom: 12px;\">\n Approving grants this action the permissions listed above on behalf of any user who invokes it. Review the code and permissions carefully before approving.\n </div>\n <div style=\"display: flex; gap: 8px;\">\n <button class=\"mj-button mj-button-primary\" (click)=\"approveCode()\">\n <i class=\"fa-solid fa-check\"></i> Approve\n </button>\n <button class=\"mj-button\" (click)=\"rejectCode()\">\n <i class=\"fa-solid fa-ban\"></i> Reject\n </button>\n </div>\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Result Codes Section -->\n <mj-accordion-panel\n [Expanded]=\"expandedSections.resultCodes\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-flag-checkered\" style=\"color: var(--mj-text-muted);\"></i>\n Result Codes\n @if (resultCodes.length > 0) {\n <span style=\"background: var(--mj-status-success); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ resultCodes.length }}\n </span>\n }\n </span>\n </ng-template>\n \n <div style=\"padding: 16px;\">\n <!-- Add Result Code Button -->\n @if (EditMode && record.IsSaved) {\n <div style=\"display: flex; justify-content: flex-end; margin-bottom: 12px;\">\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"addResultCode()\">\n <i class=\"fa-solid fa-plus\"></i> Add Result Code\n </button>\n </div>\n }\n \n @if (isLoadingResultCodes) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading result codes...\n </div>\n } @else if (resultCodes.length === 0) {\n <div class=\"empty-state\" style=\"padding: 30px; text-align: center;\">\n <i class=\"fa-solid fa-flag-checkered\" style=\"font-size: 2em; color: var(--mj-text-muted); opacity: 0.3;\"></i>\n <p style=\"margin: 12px 0 0 0; color: var(--mj-text-muted);\">No result codes defined</p>\n @if (EditMode && record.IsSaved) {\n <p style=\"margin: 8px 0 0 0; font-size: 0.85em; color: var(--mj-text-muted);\">Add result codes to define possible outcomes</p>\n }\n </div>\n } @else {\n <div class=\"result-codes-grid\">\n @for (code of resultCodes; track code.ID) {\n <div class=\"result-code-card\" \n [class.success]=\"code.IsSuccess\" \n [class.failure]=\"!code.IsSuccess\"\n [class.clickable]=\"true\"\n (click)=\"onResultCodeClick(code, $event)\">\n <div class=\"result-icon\">\n <i [class]=\"code.IsSuccess ? 'fa-solid fa-check-circle' : 'fa-solid fa-times-circle'\"></i>\n </div>\n <div class=\"result-content\">\n <div class=\"result-code\">{{ code.ResultCode }}</div>\n @if (code.Description) {\n <div class=\"result-description\">{{ code.Description }}</div>\n }\n </div>\n @if (EditMode) {\n <div class=\"result-actions\">\n <button class=\"result-edit-btn\" (click)=\"editResultCode(code); $event.stopPropagation()\" title=\"Edit result code\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n <button class=\"result-delete-btn\" (click)=\"deleteResultCode(code); $event.stopPropagation()\" title=\"Delete result code\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </mj-accordion-panel>\n\n <!-- Execution & Monitoring Section -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"expandedSections.execution\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-chart-line\" style=\"color: var(--mj-text-muted);\"></i>\n Execution &amp; Monitoring\n </span>\n </ng-template>\n \n <div style=\"padding: 16px;\">\n @if (isLoadingExecutions) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading executions...\n </div>\n } @else if (recentExecutions.length === 0) {\n <div class=\"empty-state\" style=\"padding: 30px; text-align: center;\">\n <i class=\"fa-solid fa-chart-line\" style=\"font-size: 2em; color: var(--mj-text-muted); opacity: 0.3;\"></i>\n <p style=\"margin: 12px 0 0 0; color: var(--mj-text-muted);\">No executions yet</p>\n </div>\n } @else {\n <div class=\"execution-stats-row\">\n <div class=\"stat-box\">\n <i class=\"fa-solid fa-tachometer-alt\"></i>\n <div class=\"stat-info\">\n <div class=\"stat-label\" style=\"color: var(--mj-text-primary);\">Avg Duration</div>\n <div class=\"stat-value\" style=\"color: var(--mj-text-primary);\">{{ formatDuration(executionStats.avgDuration) }}</div>\n </div>\n </div>\n <div class=\"stat-box\">\n <i class=\"fa-solid fa-check-circle\" [style.color]=\"getSuccessRateColor()\"></i>\n <div class=\"stat-info\">\n <div class=\"stat-label\" style=\"color: var(--mj-text-primary);\">Success Rate</div>\n <div class=\"stat-value\" [style.color]=\"getSuccessRateColor()\" style=\"font-weight: 600;\">{{ executionStats.successRate.toFixed(0) }}%</div>\n </div>\n </div>\n <div class=\"stat-box\">\n <i class=\"fa-solid fa-play-circle\"></i>\n <div class=\"stat-info\">\n <div class=\"stat-label\" style=\"color: var(--mj-text-primary);\">Total Runs</div>\n <div class=\"stat-value\" style=\"color: var(--mj-text-primary);\">{{ executionStats.totalRuns }}</div>\n </div>\n </div>\n </div>\n\n <h3 style=\"margin-top: 24px;\"><i class=\"fa-solid fa-history\"></i> Recent Executions</h3>\n <div class=\"executions-table\">\n <table>\n <thead>\n <tr>\n <th>Started</th>\n <th>Duration</th>\n <th>User</th>\n <th>Result</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (execution of recentExecutions; track execution.ID) {\n <tr class=\"execution-row\" [class.success]=\"isExecutionSuccess(execution)\">\n <td>{{ execution.StartedAt | date:'short' }}</td>\n <td>\n @if (execution.EndedAt) {\n {{ formatDuration(getExecutionDuration(execution)) }}\n } @else {\n <span class=\"running\">Running...</span>\n }\n </td>\n <td>{{ execution.User }}</td>\n <td>\n <span class=\"result-code\" \n [class.success]=\"isExecutionSuccess(execution)\"\n [class.failure]=\"!isExecutionSuccess(execution)\">\n {{ execution.ResultCode }}\n </span>\n </td>\n <td>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"navigateToExecution(execution.ID)\">\n <i class=\"fa-solid fa-external-link\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Related Configuration Section -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"expandedSections.configuration\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-cogs\" style=\"color: var(--mj-text-muted);\"></i>\n Related Configuration\n </span>\n </ng-template>\n \n <div style=\"padding: 16px;\">\n <!-- Libraries -->\n <div class=\"config-subsection\">\n <h3><i class=\"fa-solid fa-book\"></i> Libraries</h3>\n @if (isLoadingLibraries) {\n <div class=\"loading-state\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading libraries...\n </div>\n } @else if (actionLibraries.length === 0) {\n <div class=\"empty-state mini\">\n <p>No libraries configured</p>\n </div>\n } @else {\n <div class=\"library-cards\">\n @for (lib of libraries; track lib.ID; let i = $index) {\n <div class=\"library-card\" (click)=\"navigateToLibrary(lib.ID)\">\n <i class=\"fa-solid fa-book\"></i>\n <div class=\"library-info\">\n <div class=\"library-name\">{{ lib.Name }}</div>\n @if (actionLibraries[i].ItemsUsed) {\n <div class=\"library-items\">{{ actionLibraries[i].ItemsUsed }}</div>\n }\n </div>\n <i class=\"fa-solid fa-external-link\"></i>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Other Related Entities -->\n <div class=\"related-entities-grid\">\n <div class=\"related-entity-link\">\n <i class=\"fa-solid fa-shield-alt\"></i>\n <span>Authorizations</span>\n <span class=\"entity-count\">View</span>\n </div>\n <div class=\"related-entity-link\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <span>Contexts</span>\n <span class=\"entity-count\">View</span>\n </div>\n <div class=\"related-entity-link\">\n <i class=\"fa-solid fa-calendar\"></i>\n <span>Scheduled Actions</span>\n <span class=\"entity-count\">View</span>\n </div>\n <div class=\"related-entity-link\">\n <i class=\"fa-solid fa-cube\"></i>\n <span>Entity Actions</span>\n <span class=\"entity-count\">View</span>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n }\n </div>\n </div>\n </form>\n</mj-record-form-container>\n}\n\n<!-- Action Test Harness Dialog -->\n<mj-action-test-harness-dialog\n [Action]=\"record\"\n [ActionParams]=\"actionParams\"\n [IsOpen]=\"showTestHarness\"\n (Close)=\"onTestHarnessVisibilityChanged(false)\">\n</mj-action-test-harness-dialog>"]}