@memberjunction/ng-core-entity-forms 5.30.0 → 5.31.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 (163) hide show
  1. package/dist/lib/__tests__/content-source-form.test.d.ts +2 -0
  2. package/dist/lib/__tests__/content-source-form.test.d.ts.map +1 -0
  3. package/dist/lib/__tests__/content-source-form.test.js +183 -0
  4. package/dist/lib/__tests__/content-source-form.test.js.map +1 -0
  5. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts +2 -1
  6. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
  7. package/dist/lib/custom/AIAgents/add-action-dialog.component.js +6 -4
  8. package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
  9. package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js +2 -2
  10. package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js.map +1 -1
  11. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +2 -1
  12. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -1
  13. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +6 -4
  14. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -1
  15. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +15 -15
  16. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  17. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +2 -1
  18. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
  19. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +9 -7
  20. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -1
  21. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +2 -1
  22. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
  23. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +11 -9
  24. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
  25. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts +2 -1
  26. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
  27. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +6 -5
  28. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
  29. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +2 -1
  30. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
  31. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +6 -4
  32. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
  33. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +2 -1
  34. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
  35. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +6 -4
  36. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -1
  37. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +2 -1
  38. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
  39. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +6 -4
  40. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
  41. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +3 -3
  42. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  43. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +1 -1
  44. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
  45. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +6 -6
  46. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  47. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +2 -1
  48. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -1
  49. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +7 -5
  50. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -1
  51. package/dist/lib/custom/Actions/action-execution-log-form.component.js +3 -3
  52. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  53. package/dist/lib/custom/Actions/action-form.component.js +12 -12
  54. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  55. package/dist/lib/custom/ContentSources/content-source-form.component.d.ts +59 -5
  56. package/dist/lib/custom/ContentSources/content-source-form.component.d.ts.map +1 -1
  57. package/dist/lib/custom/ContentSources/content-source-form.component.js +379 -34
  58. package/dist/lib/custom/ContentSources/content-source-form.component.js.map +1 -1
  59. package/dist/lib/custom/Entities/entity-form.component.d.ts +1 -1
  60. package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
  61. package/dist/lib/custom/Entities/entity-form.component.js +5 -5
  62. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  63. package/dist/lib/custom/Lists/list-form.component.d.ts +1 -1
  64. package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
  65. package/dist/lib/custom/Lists/list-form.component.js +10 -10
  66. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  67. package/dist/lib/custom/Queries/query-category-dialog.component.d.ts +2 -1
  68. package/dist/lib/custom/Queries/query-category-dialog.component.d.ts.map +1 -1
  69. package/dist/lib/custom/Queries/query-category-dialog.component.js +9 -7
  70. package/dist/lib/custom/Queries/query-category-dialog.component.js.map +1 -1
  71. package/dist/lib/custom/Queries/query-form.component.js +17 -17
  72. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  73. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts +2 -1
  74. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts.map +1 -1
  75. package/dist/lib/custom/Queries/query-run-dialog.component.js +7 -6
  76. package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
  77. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts +2 -1
  78. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts.map +1 -1
  79. package/dist/lib/custom/Templates/template-param-dialog.component.js +10 -8
  80. package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
  81. package/dist/lib/custom/Templates/template-params-grid.component.d.ts +2 -1
  82. package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
  83. package/dist/lib/custom/Templates/template-params-grid.component.js +9 -7
  84. package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
  85. package/dist/lib/custom/Templates/templates-form.component.js +8 -8
  86. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  87. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts +3 -2
  88. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
  89. package/dist/lib/custom/Tests/entity-link-pill.component.js +8 -6
  90. package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
  91. package/dist/lib/custom/Tests/test-form.component.d.ts +1 -1
  92. package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
  93. package/dist/lib/custom/Tests/test-form.component.js +7 -7
  94. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  95. package/dist/lib/custom/Tests/test-run-form.component.js +5 -5
  96. package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
  97. package/dist/lib/custom/Tests/test-suite-form.component.d.ts +1 -1
  98. package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
  99. package/dist/lib/custom/Tests/test-suite-form.component.js +8 -8
  100. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  101. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts +1 -1
  102. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
  103. package/dist/lib/custom/Tests/test-suite-run-form.component.js +6 -6
  104. package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
  105. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +2 -1
  106. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
  107. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +8 -6
  108. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  109. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +9 -0
  110. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
  111. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +15 -3
  112. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
  113. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +3 -2
  114. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  115. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +10 -5
  116. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  117. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +2 -2
  118. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  119. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +2 -1
  120. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
  121. package/dist/lib/custom/shared/entity-selector-dialog.component.js +6 -4
  122. package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
  123. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.d.ts.map +1 -1
  124. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js +46 -28
  125. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
  126. package/dist/lib/generated/Entities/MJCompanyIntegrationEntityMap/mjcompanyintegrationentitymap.form.component.js +10 -10
  127. package/dist/lib/generated/Entities/MJCompanyIntegrationEntityMap/mjcompanyintegrationentitymap.form.component.js.map +1 -1
  128. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.d.ts.map +1 -1
  129. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js +25 -7
  130. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js.map +1 -1
  131. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.d.ts.map +1 -1
  132. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js +25 -7
  133. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js.map +1 -1
  134. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  135. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +106 -88
  136. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  137. package/dist/lib/generated/Entities/MJTag/mjtag.form.component.d.ts.map +1 -1
  138. package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js +181 -61
  139. package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js.map +1 -1
  140. package/dist/lib/generated/Entities/MJTagScope/mjtagscope.form.component.d.ts +10 -0
  141. package/dist/lib/generated/Entities/MJTagScope/mjtagscope.form.component.d.ts.map +1 -0
  142. package/dist/lib/generated/Entities/MJTagScope/mjtagscope.form.component.js +63 -0
  143. package/dist/lib/generated/Entities/MJTagScope/mjtagscope.form.component.js.map +1 -0
  144. package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.d.ts +10 -0
  145. package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.d.ts.map +1 -0
  146. package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.js +95 -0
  147. package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.js.map +1 -0
  148. package/dist/lib/generated/Entities/MJTagSynonym/mjtagsynonym.form.component.d.ts +10 -0
  149. package/dist/lib/generated/Entities/MJTagSynonym/mjtagsynonym.form.component.d.ts.map +1 -0
  150. package/dist/lib/generated/Entities/MJTagSynonym/mjtagsynonym.form.component.js +63 -0
  151. package/dist/lib/generated/Entities/MJTagSynonym/mjtagsynonym.form.component.js.map +1 -0
  152. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  153. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +199 -181
  154. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  155. package/dist/lib/generated/generated-forms.module.d.ts +51 -48
  156. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  157. package/dist/lib/generated/generated-forms.module.js +27 -18
  158. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  159. package/dist/lib/shared/components/template-editor.component.d.ts +3 -2
  160. package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
  161. package/dist/lib/shared/components/template-editor.component.js +8 -6
  162. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  163. package/package.json +37 -35
@@ -1 +1 @@
1
- {"version":3,"file":"template-param-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Templates/template-param-dialog.component.ts","../../../../src/lib/custom/Templates/template-param-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { MJTemplateEntity, MJTemplateParamEntity } from '@memberjunction/core-entities';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\nexport interface ParameterPair {\n key: string;\n value: string;\n isFromTemplate: boolean;\n description?: string;\n isRequired?: boolean;\n type?: string;\n}\n\nexport interface TemplateRunResult {\n success: boolean;\n output?: string;\n error?: string;\n executionTimeMs?: number;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-template-param-dialog',\n templateUrl: './template-param-dialog.component.html',\n styleUrls: ['./template-param-dialog.component.css']\n})\nexport class TemplateParamDialogComponent implements OnInit {\n @Input() template: MJTemplateEntity | null = null;\n \n public _isVisible: boolean = false;\n @Input() \n get isVisible(): boolean {\n return this._isVisible;\n }\n set isVisible(value: boolean) {\n const wasVisible = this._isVisible;\n this._isVisible = value;\n \n // Reset dialog state when opening\n if (value && !wasVisible) {\n this.resetDialogState();\n }\n }\n \n @Output() isVisibleChange = new EventEmitter<boolean>();\n @Output() onClose = new EventEmitter<void>();\n\n public parameters: ParameterPair[] = [];\n public isLoading = false;\n public isRunning = false;\n public testResult: TemplateRunResult | null = null;\n public hasUnsavedParameters = false;\n public parametersExpanded = true;\n public jsonPreviewExpanded = false;\n public resultsExpanded = true;\n\n private originalTemplateParams: MJTemplateParamEntity[] = [];\n\n ngOnInit() {\n if (this.template) {\n this.loadTemplateParams();\n }\n }\n\n async loadTemplateParams() {\n if (!this.template?.ID) return;\n\n this.isLoading = true;\n try {\n const rv = new RunView();\n const results = await rv.RunView<MJTemplateParamEntity>({\n EntityName: 'MJ: Template Params',\n ExtraFilter: `TemplateID='${this.template.ID}'`,\n OrderBy: 'Name ASC' \n });\n\n this.originalTemplateParams = results.Results;\n \n // Convert template params to parameter pairs\n this.parameters = this.originalTemplateParams.map(param => ({\n key: param.Name,\n value: param.DefaultValue || '',\n isFromTemplate: true,\n description: param.Description || undefined,\n isRequired: param.IsRequired,\n type: param.Type\n }));\n\n // If no template params, add one empty pair to start\n if (this.parameters.length === 0) {\n this.addParameter();\n }\n\n } catch (error) {\n console.error('Error loading template params:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error loading template parameters',\n 'error'\n );\n } finally {\n this.isLoading = false;\n }\n }\n\n addParameter() {\n this.parameters.push({\n key: '',\n value: '',\n isFromTemplate: false\n });\n }\n\n removeParameter(index: number) {\n if (this.parameters.length > 1) {\n this.parameters.splice(index, 1);\n }\n }\n\n onParameterChange() {\n // Check if we have new parameters not in template\n this.hasUnsavedParameters = this.parameters.some(param => \n param.key && \n !param.isFromTemplate && \n !this.originalTemplateParams.find(tp => tp.Name === param.key)\n );\n }\n\n async runTemplate() {\n if (!this.template?.ID) return;\n\n // Validate parameter names - check for empty parameter names\n const emptyNameParams = this.parameters.filter(p => p.value && !p.key);\n if (emptyNameParams.length > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'All parameters must have a name. Please enter parameter names or remove empty parameters.',\n 'warning'\n );\n return;\n }\n\n // Validate required parameters\n const invalidParams = this.parameters.filter(p => p.key && !p.value && p.isRequired);\n if (invalidParams.length > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Required parameters missing: ${invalidParams.map(p => p.key).join(', ')}`,\n 'warning'\n );\n return;\n }\n\n this.isRunning = true;\n this.testResult = null;\n\n try {\n // Build context data object from parameters\n const contextData: any = {};\n this.parameters.forEach(param => {\n if (param.key && param.value) {\n try {\n // Try to parse as JSON first, fallback to string\n contextData[param.key] = JSON.parse(param.value);\n } catch {\n contextData[param.key] = param.value;\n }\n }\n });\n\n // Get GraphQL data provider\n const dataProvider = Metadata.Provider as GraphQLDataProvider;\n \n // Execute the RunTemplate GraphQL mutation\n const query = `\n mutation RunTemplate($templateId: String!, $contextData: String) {\n RunTemplate(templateId: $templateId, contextData: $contextData) {\n success\n output\n error\n executionTimeMs\n }\n }\n `;\n\n const variables = {\n templateId: this.template.ID,\n contextData: JSON.stringify(contextData)\n };\n\n const result = await dataProvider.ExecuteGQL(query, variables);\n \n if (result?.RunTemplate) {\n this.testResult = result.RunTemplate;\n \n // Collapse parameters and expand results after execution\n this.parametersExpanded = false;\n this.resultsExpanded = true;\n \n if (this.testResult?.success) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Template executed successfully in ${this.testResult.executionTimeMs || 0}ms`,\n 'success',\n 4000\n );\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Template execution failed: ${this.testResult?.error || 'Unknown error'}`,\n 'error',\n 5000\n );\n }\n } else {\n throw new Error(result.errors?.[0]?.message || 'Unknown GraphQL error');\n }\n\n } catch (error) {\n console.error('Template test error:', error);\n this.testResult = {\n success: false,\n error: (error as Error).message || 'Unknown error occurred'\n };\n \n // Still collapse parameters and expand results on error\n this.parametersExpanded = false;\n this.resultsExpanded = true;\n \n MJNotificationService.Instance.CreateSimpleNotification(\n `Template test failed: ${this.testResult?.error || 'Unknown error'}`,\n 'error',\n 5000\n );\n } finally {\n this.isRunning = false;\n }\n }\n\n async updateTemplateParams() {\n if (!this.template?.ID || !this.hasUnsavedParameters) return;\n\n const newParams = this.parameters.filter(param => \n param.key && \n !param.isFromTemplate && \n !this.originalTemplateParams.find(tp => tp.Name === param.key)\n );\n\n if (newParams.length === 0) return;\n\n try {\n const md = new Metadata();\n \n for (const param of newParams) {\n const templateParam = await md.GetEntityObject<MJTemplateParamEntity>('MJ: Template Params');\n templateParam.TemplateID = this.template.ID;\n templateParam.Name = param.key;\n templateParam.Description = param.description || null;\n templateParam.Type = 'Scalar'; // Default type\n templateParam.DefaultValue = param.value || null;\n templateParam.IsRequired = param.isRequired || false;\n \n const saved = await templateParam.Save();\n if (!saved) {\n throw new Error(`Failed to save parameter: ${param.key}`);\n }\n }\n\n MJNotificationService.Instance.CreateSimpleNotification(\n `Added ${newParams.length} new parameter(s) to template`,\n 'success'\n );\n\n this.hasUnsavedParameters = false;\n \n // Reload template params to sync\n await this.loadTemplateParams();\n\n } catch (error) {\n console.error('Error updating template params:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error saving template parameters',\n 'error'\n );\n }\n }\n\n close() {\n this._isVisible = false;\n this.isVisibleChange.emit(false);\n this.onClose.emit();\n }\n\n private resetDialogState() {\n // Reset expansion states for a clean testing experience\n this.parametersExpanded = true; // Show params by default\n this.jsonPreviewExpanded = false; // Hide JSON (developer-focused)\n this.resultsExpanded = true; // Show results when they exist\n \n // Clear previous test results\n this.testResult = null;\n this.isRunning = false;\n \n // Reset unsaved parameters flag\n this.hasUnsavedParameters = false;\n }\n\n saveResults() {\n if (!this.testResult) return;\n\n const content = this.testResult.success \n ? this.testResult.output || 'No output'\n : this.testResult.error || 'No error details';\n \n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, -5);\n const templateName = this.template?.Name?.replace(/[^a-zA-Z0-9]/g, '_') || 'template';\n const status = this.testResult.success ? 'success' : 'error';\n const filename = `${templateName}_${status}_${timestamp}.txt`;\n\n // Create blob and download\n const blob = new Blob([content], { type: 'text/plain' });\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n\n MJNotificationService.Instance.CreateSimpleNotification(\n `Results saved as ${filename}`,\n 'success'\n );\n }\n\n get parametersAsJson(): string {\n const contextData: any = {};\n this.parameters.forEach(param => {\n if (param.key && param.value) {\n try {\n contextData[param.key] = JSON.parse(param.value);\n } catch {\n contextData[param.key] = param.value;\n }\n }\n });\n return JSON.stringify(contextData, null, 2);\n }\n}","@if (_isVisible) {\n <mj-dialog\n [Visible]=\"true\"\n [Width]=\"800\"\n (Close)=\"close()\">\n <mj-dialog-titlebar>Test Template: {{ template?.Name || 'Unknown' }}</mj-dialog-titlebar>\n <div class=\"dialog-content\" style=\"display: flex; flex-direction: column; height: 100%; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\">\n <!-- Header Section -->\n <div class=\"dlg-header\">\n <div class=\"dlg-header-row\">\n <i class=\"fa-solid fa-sliders\"></i>\n <h5>Template Testing</h5>\n </div>\n <p>\n Configure parameter values for testing. Parameters with <span class=\"required-marker\">*</span> are required.\n </p>\n </div>\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"dlg-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading template parameters...</span>\n </div>\n } @else {\n <!-- Template Parameters Section -->\n <mj-accordion-panel\n [(Expanded)]=\"parametersExpanded\"\n style=\"margin-bottom: 16px; flex-shrink: 0;\">\n <ng-template mjAccordionTitle>\n <span class=\"dlg-panel-title\">\n <i class=\"fa-solid fa-sliders\"></i>\n Template Parameters\n @if (parameters.length > 0) {\n <span class=\"count-badge\">{{ parameters.length }}</span>\n }\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div class=\"dlg-info-text\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Configure parameter values for template testing. Values can be JSON objects, strings, or numbers.\n </div>\n <!-- Parameters Table -->\n @if (parameters.length > 0) {\n <div class=\"params-table\">\n <!-- Header -->\n <div class=\"params-table-header\">\n <div>Parameter Name</div>\n <div>Value</div>\n <div>Actions</div>\n </div>\n <!-- Parameter Rows -->\n @for (param of parameters; track $index; let i = $index) {\n <div class=\"params-table-row\">\n <!-- Parameter Name -->\n <div class=\"param-name\" style=\"display: flex; flex-direction: column;\">\n <div style=\"display: flex; align-items: center; gap: 4px; margin-bottom: 4px;\">\n @if (param.isFromTemplate) {\n <i class=\"fa-solid fa-database param-source-icon-template\" title=\"From template definition\"></i>\n } @else {\n <i class=\"fa-solid fa-edit param-source-icon-custom\" title=\"Custom parameter\"></i>\n }\n @if (param.isRequired) {\n <span class=\"param-required-marker\">*</span>\n }\n </div>\n @if (param.isFromTemplate) {\n <div class=\"param-key-text\">\n {{ param.key }}\n </div>\n @if (param.description) {\n <div class=\"param-description-text\">\n {{ param.description }}\n </div>\n }\n @if (param.type && param.type !== 'Scalar') {\n <div class=\"param-type-text\">\n Type: {{ param.type }}\n </div>\n }\n } @else {\n <input type=\"text\" class=\"mj-input\"\n [(ngModel)]=\"param.key\"\n (ngModelChange)=\"onParameterChange()\"\n placeholder=\"Parameter name...\"\n [disabled]=\"isRunning\"\n style=\"font-family: 'Courier New', monospace; width: 100%;\" />\n }\n </div>\n <!-- Parameter Value -->\n <div class=\"param-value\">\n <textarea class=\"mj-textarea\"\n [(ngModel)]=\"param.value\"\n (ngModelChange)=\"onParameterChange()\"\n [rows]=\"2\"\n placeholder=\"Enter value (JSON strings, numbers, objects)...\"\n [disabled]=\"isRunning\"\n style=\"font-family: 'Courier New', monospace; font-size: 0.9em; width: 100%;\"></textarea>\n </div>\n <!-- Actions -->\n <div class=\"param-actions\">\n @if (!param.isFromTemplate && parameters.length > 1) {\n <button mjButton variant=\"danger\" size=\"sm\"\n (click)=\"removeParameter(i)\"\n [disabled]=\"isRunning\"\n title=\"Remove parameter\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n }\n <!-- Add Parameter Row -->\n <div class=\"add-param-row\">\n <button mjButton variant=\"success\" size=\"sm\"\n (click)=\"addParameter()\"\n [disabled]=\"isRunning\">\n <i class=\"fa-solid fa-plus\"></i> Add Parameter\n </button>\n </div>\n </div>\n } @else {\n <div class=\"no-params-state\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <p>No parameters defined yet</p>\n <button mjButton variant=\"primary\" size=\"sm\"\n (click)=\"addParameter()\"\n [disabled]=\"isRunning\">\n <i class=\"fa-solid fa-plus\"></i> Add First Parameter\n </button>\n </div>\n }\n </div>\n </mj-accordion-panel>\n <!-- JSON Preview Section -->\n <mj-accordion-panel\n [(Expanded)]=\"jsonPreviewExpanded\"\n style=\"margin-bottom: 16px; flex-shrink: 0;\">\n <ng-template mjAccordionTitle>\n <span class=\"dlg-panel-title\">\n <i class=\"fa-solid fa-code\"></i>\n Context Data (JSON)\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div class=\"json-preview-box\">\n <pre>{{ parametersAsJson }}</pre>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Test Results Section -->\n <mj-accordion-panel\n [(Expanded)]=\"resultsExpanded\"\n style=\"margin-bottom: 16px; flex: 1; display: flex; flex-direction: column;\">\n <ng-template mjAccordionTitle>\n <span class=\"dlg-panel-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n Test Results\n @if (testResult) {\n @if (testResult.success) {\n <span class=\"result-badge success\"><i class=\"fa-solid fa-check\"></i> Success</span>\n } @else {\n <span class=\"result-badge error\"><i class=\"fa-solid fa-times\"></i> Failed</span>\n }\n }\n </span>\n </ng-template>\n <div style=\"padding: 12px 0; flex: 1; display: flex; flex-direction: column;\">\n @if (isRunning) {\n <div class=\"dlg-loading\" style=\"flex: 1;\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Running template...</span>\n </div>\n } @else if (testResult) {\n <div style=\"flex: 1; display: flex; flex-direction: column;\">\n <!-- Result Header with Stats -->\n <div class=\"result-stats\" [class.success]=\"testResult.success\" [class.error]=\"!testResult.success\">\n <div class=\"result-stat\">\n <div class=\"result-stat-label\">STATUS</div>\n <div class=\"result-stat-value\">\n {{ testResult.success ? 'Success' : 'Failed' }}\n </div>\n </div>\n @if (testResult.executionTimeMs) {\n <div class=\"result-stat\">\n <div class=\"result-stat-label\">EXECUTION TIME</div>\n <div class=\"result-stat-value\">{{ testResult.executionTimeMs }}ms</div>\n </div>\n }\n <div class=\"result-stat\">\n <div class=\"result-stat-label\">ACTIONS</div>\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"saveResults()\"\n title=\"Save results to file\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n </div>\n </div>\n <!-- Result Content -->\n <div style=\"flex: 1; display: flex; flex-direction: column;\">\n @if (testResult.success && testResult.output) {\n <div style=\"margin-bottom: 12px; flex: 1; display: flex; flex-direction: column;\">\n <h6 class=\"output-header\">\n <i class=\"fa-solid fa-check-circle success-icon\"></i>\n Template Output\n </h6>\n <div class=\"output-box\">\n {{ testResult.output }}\n </div>\n </div>\n } @else if (!testResult.success && testResult.error) {\n <div style=\"margin-bottom: 12px; flex: 1; display: flex; flex-direction: column;\">\n <h6 class=\"output-header\">\n <i class=\"fa-solid fa-exclamation-triangle error-icon\"></i>\n Error Details\n </h6>\n <div class=\"error-output-box\">{{ testResult.error }}</div>\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"no-results-state\">\n <div style=\"text-align: center;\">\n <i class=\"fa-solid fa-play-circle\"></i>\n <p>No test results yet. Run the template to see results here.</p>\n </div>\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n </div>\n <!-- Dialog Actions -->\n <mj-dialog-actions>\n <div style=\"display: flex; justify-content: space-between; align-items: center; width: 100%;\">\n <div>\n @if (hasUnsavedParameters) {\n <button mjButton variant=\"outline\"\n (click)=\"updateTemplateParams()\"\n [disabled]=\"isRunning\">\n <i class=\"fa-solid fa-save\"></i> Update Template Params\n </button>\n }\n </div>\n <div style=\"display: flex; gap: 8px;\">\n <button mjButton variant=\"outline\" (click)=\"close()\">\n Close\n </button>\n @if (testResult) {\n <button mjButton variant=\"outline\" (click)=\"saveResults()\">\n <i class=\"fa-solid fa-download\"></i> Save Results\n </button>\n }\n <button mjButton variant=\"primary\"\n [disabled]=\"isRunning || isLoading\"\n (click)=\"runTemplate()\">\n @if (isRunning) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i> Run Template\n }\n </button>\n </div>\n </div>\n </mj-dialog-actions>\n </mj-dialog>\n}\n"]}
1
+ {"version":3,"file":"template-param-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Templates/template-param-dialog.component.ts","../../../../src/lib/custom/Templates/template-param-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { MJTemplateEntity, MJTemplateParamEntity } from '@memberjunction/core-entities';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nexport interface ParameterPair {\n key: string;\n value: string;\n isFromTemplate: boolean;\n description?: string;\n isRequired?: boolean;\n type?: string;\n}\n\nexport interface TemplateRunResult {\n success: boolean;\n output?: string;\n error?: string;\n executionTimeMs?: number;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-template-param-dialog',\n templateUrl: './template-param-dialog.component.html',\n styleUrls: ['./template-param-dialog.component.css']\n})\nexport class TemplateParamDialogComponent extends BaseAngularComponent implements OnInit {\n @Input() template: MJTemplateEntity | null = null;\n \n public _isVisible: boolean = false;\n @Input() \n get isVisible(): boolean {\n return this._isVisible;\n }\n set isVisible(value: boolean) {\n const wasVisible = this._isVisible;\n this._isVisible = value;\n \n // Reset dialog state when opening\n if (value && !wasVisible) {\n this.resetDialogState();\n }\n }\n \n @Output() isVisibleChange = new EventEmitter<boolean>();\n @Output() onClose = new EventEmitter<void>();\n\n public parameters: ParameterPair[] = [];\n public isLoading = false;\n public isRunning = false;\n public testResult: TemplateRunResult | null = null;\n public hasUnsavedParameters = false;\n public parametersExpanded = true;\n public jsonPreviewExpanded = false;\n public resultsExpanded = true;\n\n private originalTemplateParams: MJTemplateParamEntity[] = [];\n\n ngOnInit() {\n if (this.template) {\n this.loadTemplateParams();\n }\n }\n\n async loadTemplateParams() {\n if (!this.template?.ID) return;\n\n this.isLoading = true;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const results = await rv.RunView<MJTemplateParamEntity>({\n EntityName: 'MJ: Template Params',\n ExtraFilter: `TemplateID='${this.template.ID}'`,\n OrderBy: 'Name ASC' \n });\n\n this.originalTemplateParams = results.Results;\n \n // Convert template params to parameter pairs\n this.parameters = this.originalTemplateParams.map(param => ({\n key: param.Name,\n value: param.DefaultValue || '',\n isFromTemplate: true,\n description: param.Description || undefined,\n isRequired: param.IsRequired,\n type: param.Type\n }));\n\n // If no template params, add one empty pair to start\n if (this.parameters.length === 0) {\n this.addParameter();\n }\n\n } catch (error) {\n console.error('Error loading template params:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error loading template parameters',\n 'error'\n );\n } finally {\n this.isLoading = false;\n }\n }\n\n addParameter() {\n this.parameters.push({\n key: '',\n value: '',\n isFromTemplate: false\n });\n }\n\n removeParameter(index: number) {\n if (this.parameters.length > 1) {\n this.parameters.splice(index, 1);\n }\n }\n\n onParameterChange() {\n // Check if we have new parameters not in template\n this.hasUnsavedParameters = this.parameters.some(param => \n param.key && \n !param.isFromTemplate && \n !this.originalTemplateParams.find(tp => tp.Name === param.key)\n );\n }\n\n async runTemplate() {\n if (!this.template?.ID) return;\n\n // Validate parameter names - check for empty parameter names\n const emptyNameParams = this.parameters.filter(p => p.value && !p.key);\n if (emptyNameParams.length > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'All parameters must have a name. Please enter parameter names or remove empty parameters.',\n 'warning'\n );\n return;\n }\n\n // Validate required parameters\n const invalidParams = this.parameters.filter(p => p.key && !p.value && p.isRequired);\n if (invalidParams.length > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Required parameters missing: ${invalidParams.map(p => p.key).join(', ')}`,\n 'warning'\n );\n return;\n }\n\n this.isRunning = true;\n this.testResult = null;\n\n try {\n // Build context data object from parameters\n const contextData: any = {};\n this.parameters.forEach(param => {\n if (param.key && param.value) {\n try {\n // Try to parse as JSON first, fallback to string\n contextData[param.key] = JSON.parse(param.value);\n } catch {\n contextData[param.key] = param.value;\n }\n }\n });\n\n // Get GraphQL data provider\n const dataProvider = this.ProviderToUse as GraphQLDataProvider;\n \n // Execute the RunTemplate GraphQL mutation\n const query = `\n mutation RunTemplate($templateId: String!, $contextData: String) {\n RunTemplate(templateId: $templateId, contextData: $contextData) {\n success\n output\n error\n executionTimeMs\n }\n }\n `;\n\n const variables = {\n templateId: this.template.ID,\n contextData: JSON.stringify(contextData)\n };\n\n const result = await dataProvider.ExecuteGQL(query, variables);\n \n if (result?.RunTemplate) {\n this.testResult = result.RunTemplate;\n \n // Collapse parameters and expand results after execution\n this.parametersExpanded = false;\n this.resultsExpanded = true;\n \n if (this.testResult?.success) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Template executed successfully in ${this.testResult.executionTimeMs || 0}ms`,\n 'success',\n 4000\n );\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Template execution failed: ${this.testResult?.error || 'Unknown error'}`,\n 'error',\n 5000\n );\n }\n } else {\n throw new Error(result.errors?.[0]?.message || 'Unknown GraphQL error');\n }\n\n } catch (error) {\n console.error('Template test error:', error);\n this.testResult = {\n success: false,\n error: (error as Error).message || 'Unknown error occurred'\n };\n \n // Still collapse parameters and expand results on error\n this.parametersExpanded = false;\n this.resultsExpanded = true;\n \n MJNotificationService.Instance.CreateSimpleNotification(\n `Template test failed: ${this.testResult?.error || 'Unknown error'}`,\n 'error',\n 5000\n );\n } finally {\n this.isRunning = false;\n }\n }\n\n async updateTemplateParams() {\n if (!this.template?.ID || !this.hasUnsavedParameters) return;\n\n const newParams = this.parameters.filter(param => \n param.key && \n !param.isFromTemplate && \n !this.originalTemplateParams.find(tp => tp.Name === param.key)\n );\n\n if (newParams.length === 0) return;\n\n try {\n const md = this.ProviderToUse;\n \n for (const param of newParams) {\n const templateParam = await md.GetEntityObject<MJTemplateParamEntity>('MJ: Template Params');\n templateParam.TemplateID = this.template.ID;\n templateParam.Name = param.key;\n templateParam.Description = param.description || null;\n templateParam.Type = 'Scalar'; // Default type\n templateParam.DefaultValue = param.value || null;\n templateParam.IsRequired = param.isRequired || false;\n \n const saved = await templateParam.Save();\n if (!saved) {\n throw new Error(`Failed to save parameter: ${param.key}`);\n }\n }\n\n MJNotificationService.Instance.CreateSimpleNotification(\n `Added ${newParams.length} new parameter(s) to template`,\n 'success'\n );\n\n this.hasUnsavedParameters = false;\n \n // Reload template params to sync\n await this.loadTemplateParams();\n\n } catch (error) {\n console.error('Error updating template params:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error saving template parameters',\n 'error'\n );\n }\n }\n\n close() {\n this._isVisible = false;\n this.isVisibleChange.emit(false);\n this.onClose.emit();\n }\n\n private resetDialogState() {\n // Reset expansion states for a clean testing experience\n this.parametersExpanded = true; // Show params by default\n this.jsonPreviewExpanded = false; // Hide JSON (developer-focused)\n this.resultsExpanded = true; // Show results when they exist\n \n // Clear previous test results\n this.testResult = null;\n this.isRunning = false;\n \n // Reset unsaved parameters flag\n this.hasUnsavedParameters = false;\n }\n\n saveResults() {\n if (!this.testResult) return;\n\n const content = this.testResult.success \n ? this.testResult.output || 'No output'\n : this.testResult.error || 'No error details';\n \n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, -5);\n const templateName = this.template?.Name?.replace(/[^a-zA-Z0-9]/g, '_') || 'template';\n const status = this.testResult.success ? 'success' : 'error';\n const filename = `${templateName}_${status}_${timestamp}.txt`;\n\n // Create blob and download\n const blob = new Blob([content], { type: 'text/plain' });\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n\n MJNotificationService.Instance.CreateSimpleNotification(\n `Results saved as ${filename}`,\n 'success'\n );\n }\n\n get parametersAsJson(): string {\n const contextData: any = {};\n this.parameters.forEach(param => {\n if (param.key && param.value) {\n try {\n contextData[param.key] = JSON.parse(param.value);\n } catch {\n contextData[param.key] = param.value;\n }\n }\n });\n return JSON.stringify(contextData, null, 2);\n }\n}","@if (_isVisible) {\n <mj-dialog\n [Visible]=\"true\"\n [Width]=\"800\"\n (Close)=\"close()\">\n <mj-dialog-titlebar>Test Template: {{ template?.Name || 'Unknown' }}</mj-dialog-titlebar>\n <div class=\"dialog-content\" style=\"display: flex; flex-direction: column; height: 100%; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\">\n <!-- Header Section -->\n <div class=\"dlg-header\">\n <div class=\"dlg-header-row\">\n <i class=\"fa-solid fa-sliders\"></i>\n <h5>Template Testing</h5>\n </div>\n <p>\n Configure parameter values for testing. Parameters with <span class=\"required-marker\">*</span> are required.\n </p>\n </div>\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"dlg-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading template parameters...</span>\n </div>\n } @else {\n <!-- Template Parameters Section -->\n <mj-accordion-panel\n [(Expanded)]=\"parametersExpanded\"\n style=\"margin-bottom: 16px; flex-shrink: 0;\">\n <ng-template mjAccordionTitle>\n <span class=\"dlg-panel-title\">\n <i class=\"fa-solid fa-sliders\"></i>\n Template Parameters\n @if (parameters.length > 0) {\n <span class=\"count-badge\">{{ parameters.length }}</span>\n }\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div class=\"dlg-info-text\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Configure parameter values for template testing. Values can be JSON objects, strings, or numbers.\n </div>\n <!-- Parameters Table -->\n @if (parameters.length > 0) {\n <div class=\"params-table\">\n <!-- Header -->\n <div class=\"params-table-header\">\n <div>Parameter Name</div>\n <div>Value</div>\n <div>Actions</div>\n </div>\n <!-- Parameter Rows -->\n @for (param of parameters; track $index; let i = $index) {\n <div class=\"params-table-row\">\n <!-- Parameter Name -->\n <div class=\"param-name\" style=\"display: flex; flex-direction: column;\">\n <div style=\"display: flex; align-items: center; gap: 4px; margin-bottom: 4px;\">\n @if (param.isFromTemplate) {\n <i class=\"fa-solid fa-database param-source-icon-template\" title=\"From template definition\"></i>\n } @else {\n <i class=\"fa-solid fa-edit param-source-icon-custom\" title=\"Custom parameter\"></i>\n }\n @if (param.isRequired) {\n <span class=\"param-required-marker\">*</span>\n }\n </div>\n @if (param.isFromTemplate) {\n <div class=\"param-key-text\">\n {{ param.key }}\n </div>\n @if (param.description) {\n <div class=\"param-description-text\">\n {{ param.description }}\n </div>\n }\n @if (param.type && param.type !== 'Scalar') {\n <div class=\"param-type-text\">\n Type: {{ param.type }}\n </div>\n }\n } @else {\n <input type=\"text\" class=\"mj-input\"\n [(ngModel)]=\"param.key\"\n (ngModelChange)=\"onParameterChange()\"\n placeholder=\"Parameter name...\"\n [disabled]=\"isRunning\"\n style=\"font-family: 'Courier New', monospace; width: 100%;\" />\n }\n </div>\n <!-- Parameter Value -->\n <div class=\"param-value\">\n <textarea class=\"mj-textarea\"\n [(ngModel)]=\"param.value\"\n (ngModelChange)=\"onParameterChange()\"\n [rows]=\"2\"\n placeholder=\"Enter value (JSON strings, numbers, objects)...\"\n [disabled]=\"isRunning\"\n style=\"font-family: 'Courier New', monospace; font-size: 0.9em; width: 100%;\"></textarea>\n </div>\n <!-- Actions -->\n <div class=\"param-actions\">\n @if (!param.isFromTemplate && parameters.length > 1) {\n <button mjButton variant=\"danger\" size=\"sm\"\n (click)=\"removeParameter(i)\"\n [disabled]=\"isRunning\"\n title=\"Remove parameter\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n </div>\n }\n <!-- Add Parameter Row -->\n <div class=\"add-param-row\">\n <button mjButton variant=\"success\" size=\"sm\"\n (click)=\"addParameter()\"\n [disabled]=\"isRunning\">\n <i class=\"fa-solid fa-plus\"></i> Add Parameter\n </button>\n </div>\n </div>\n } @else {\n <div class=\"no-params-state\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <p>No parameters defined yet</p>\n <button mjButton variant=\"primary\" size=\"sm\"\n (click)=\"addParameter()\"\n [disabled]=\"isRunning\">\n <i class=\"fa-solid fa-plus\"></i> Add First Parameter\n </button>\n </div>\n }\n </div>\n </mj-accordion-panel>\n <!-- JSON Preview Section -->\n <mj-accordion-panel\n [(Expanded)]=\"jsonPreviewExpanded\"\n style=\"margin-bottom: 16px; flex-shrink: 0;\">\n <ng-template mjAccordionTitle>\n <span class=\"dlg-panel-title\">\n <i class=\"fa-solid fa-code\"></i>\n Context Data (JSON)\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div class=\"json-preview-box\">\n <pre>{{ parametersAsJson }}</pre>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Test Results Section -->\n <mj-accordion-panel\n [(Expanded)]=\"resultsExpanded\"\n style=\"margin-bottom: 16px; flex: 1; display: flex; flex-direction: column;\">\n <ng-template mjAccordionTitle>\n <span class=\"dlg-panel-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n Test Results\n @if (testResult) {\n @if (testResult.success) {\n <span class=\"result-badge success\"><i class=\"fa-solid fa-check\"></i> Success</span>\n } @else {\n <span class=\"result-badge error\"><i class=\"fa-solid fa-times\"></i> Failed</span>\n }\n }\n </span>\n </ng-template>\n <div style=\"padding: 12px 0; flex: 1; display: flex; flex-direction: column;\">\n @if (isRunning) {\n <div class=\"dlg-loading\" style=\"flex: 1;\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Running template...</span>\n </div>\n } @else if (testResult) {\n <div style=\"flex: 1; display: flex; flex-direction: column;\">\n <!-- Result Header with Stats -->\n <div class=\"result-stats\" [class.success]=\"testResult.success\" [class.error]=\"!testResult.success\">\n <div class=\"result-stat\">\n <div class=\"result-stat-label\">STATUS</div>\n <div class=\"result-stat-value\">\n {{ testResult.success ? 'Success' : 'Failed' }}\n </div>\n </div>\n @if (testResult.executionTimeMs) {\n <div class=\"result-stat\">\n <div class=\"result-stat-label\">EXECUTION TIME</div>\n <div class=\"result-stat-value\">{{ testResult.executionTimeMs }}ms</div>\n </div>\n }\n <div class=\"result-stat\">\n <div class=\"result-stat-label\">ACTIONS</div>\n <button mjButton variant=\"flat\" size=\"sm\"\n (click)=\"saveResults()\"\n title=\"Save results to file\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n </div>\n </div>\n <!-- Result Content -->\n <div style=\"flex: 1; display: flex; flex-direction: column;\">\n @if (testResult.success && testResult.output) {\n <div style=\"margin-bottom: 12px; flex: 1; display: flex; flex-direction: column;\">\n <h6 class=\"output-header\">\n <i class=\"fa-solid fa-check-circle success-icon\"></i>\n Template Output\n </h6>\n <div class=\"output-box\">\n {{ testResult.output }}\n </div>\n </div>\n } @else if (!testResult.success && testResult.error) {\n <div style=\"margin-bottom: 12px; flex: 1; display: flex; flex-direction: column;\">\n <h6 class=\"output-header\">\n <i class=\"fa-solid fa-exclamation-triangle error-icon\"></i>\n Error Details\n </h6>\n <div class=\"error-output-box\">{{ testResult.error }}</div>\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"no-results-state\">\n <div style=\"text-align: center;\">\n <i class=\"fa-solid fa-play-circle\"></i>\n <p>No test results yet. Run the template to see results here.</p>\n </div>\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n </div>\n <!-- Dialog Actions -->\n <mj-dialog-actions>\n <div style=\"display: flex; justify-content: space-between; align-items: center; width: 100%;\">\n <div>\n @if (hasUnsavedParameters) {\n <button mjButton variant=\"outline\"\n (click)=\"updateTemplateParams()\"\n [disabled]=\"isRunning\">\n <i class=\"fa-solid fa-save\"></i> Update Template Params\n </button>\n }\n </div>\n <div style=\"display: flex; gap: 8px;\">\n <button mjButton variant=\"outline\" (click)=\"close()\">\n Close\n </button>\n @if (testResult) {\n <button mjButton variant=\"outline\" (click)=\"saveResults()\">\n <i class=\"fa-solid fa-download\"></i> Save Results\n </button>\n }\n <button mjButton variant=\"primary\"\n [disabled]=\"isRunning || isLoading\"\n (click)=\"runTemplate()\">\n @if (isRunning) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i> Run Template\n }\n </button>\n </div>\n </div>\n </mj-dialog-actions>\n </mj-dialog>\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import { OnInit, OnChanges, SimpleChanges } from '@angular/core';
2
2
  import { MJTemplateEntity, MJTemplateParamEntity } from '@memberjunction/core-entities';
3
3
  import { ColDef, GridReadyEvent, GetRowIdParams, RowEditingStoppedEvent, ICellRendererParams, type Theme } from 'ag-grid-community';
4
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
4
5
  import * as i0 from "@angular/core";
5
6
  /** Valid parameter type values, matching the entity's union type */
6
7
  type ParamType = 'Array' | 'Entity' | 'Object' | 'Record' | 'Scalar';
@@ -20,7 +21,7 @@ interface ParamRowData {
20
21
  /** Tracks whether this row is brand-new (not yet persisted) */
21
22
  IsNew: boolean;
22
23
  }
23
- export declare class TemplateParamsGridComponent implements OnInit, OnChanges {
24
+ export declare class TemplateParamsGridComponent extends BaseAngularComponent implements OnInit, OnChanges {
24
25
  template: MJTemplateEntity | null;
25
26
  editMode: boolean;
26
27
  templateParams: ParamRowData[];
@@ -1 +1 @@
1
- {"version":3,"file":"template-params-grid.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/Templates/template-params-grid.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAGxF,OAAO,EACH,MAAM,EACN,cAAc,EAEd,cAAc,EAGd,sBAAsB,EACtB,mBAAmB,EAGnB,KAAK,KAAK,EACb,MAAM,mBAAmB,CAAC;;AAK3B,oEAAoE;AACpE,KAAK,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAErE,0EAA0E;AAC1E,UAAU,YAAY;IAClB,kDAAkD;IAClD,MAAM,EAAE,qBAAqB,CAAC;IAC9B,wDAAwD;IACxD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,+DAA+D;IAC/D,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,qBAMa,2BAA4B,YAAW,MAAM,EAAE,SAAS;IACxD,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IACzC,QAAQ,EAAE,OAAO,CAAS;IAE5B,cAAc,EAAE,YAAY,EAAE,CAAM;IACpC,SAAS,UAAS;IAGlB,WAAW,WAAqD;IAGhE,UAAU,EAAE,MAAM,EAAE,CAAM;IAC1B,aAAa,EAAE,MAAM,CAK1B;IACK,SAAS,EAAE,KAAK,CAA6C;IACpE,OAAO,CAAC,OAAO,CAAwB;IAEvC,qDAAqD;IACrD,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,YAAY,CAAuB;IAEpC,cAAc,SAKnB;IAEK,QAAQ,GAAI,QAAQ,cAAc,CAAC,YAAY,CAAC,KAAG,MAAM,CAG9D;IAEF,QAAQ;IAOR,WAAW,CAAC,OAAO,EAAE,aAAa;IAS3B,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAIzC,kBAAkB;IAoCX,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BlC,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAkB/C,aAAa,IAAI,IAAI;IAIrB,WAAW,IAAI,IAAI;IAOb,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BjE,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwC3D,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAWxC,OAAO,CAAC,eAAe;YAeT,YAAY;YA+CZ,oBAAoB;IAiBlC,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,eAAe;yCAvVd,2BAA2B;2CAA3B,2BAA2B;CA6avC"}
1
+ {"version":3,"file":"template-params-grid.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/Templates/template-params-grid.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAGxF,OAAO,EACH,MAAM,EACN,cAAc,EAEd,cAAc,EAGd,sBAAsB,EACtB,mBAAmB,EAGnB,KAAK,KAAK,EACb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAIrE,oEAAoE;AACpE,KAAK,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAErE,0EAA0E;AAC1E,UAAU,YAAY;IAClB,kDAAkD;IAClD,MAAM,EAAE,qBAAqB,CAAC;IAC9B,wDAAwD;IACxD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,+DAA+D;IAC/D,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,qBAMa,2BAA4B,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IACrF,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IACzC,QAAQ,EAAE,OAAO,CAAS;IAE5B,cAAc,EAAE,YAAY,EAAE,CAAM;IACpC,SAAS,UAAS;IAGlB,WAAW,WAAqD;IAGhE,UAAU,EAAE,MAAM,EAAE,CAAM;IAC1B,aAAa,EAAE,MAAM,CAK1B;IACK,SAAS,EAAE,KAAK,CAA6C;IACpE,OAAO,CAAC,OAAO,CAAwB;IAEvC,qDAAqD;IACrD,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,YAAY,CAAuB;IAEpC,cAAc,SAKnB;IAEK,QAAQ,GAAI,QAAQ,cAAc,CAAC,YAAY,CAAC,KAAG,MAAM,CAG9D;IAEF,QAAQ;IAOR,WAAW,CAAC,OAAO,EAAE,aAAa;IAS3B,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAIzC,kBAAkB;IAoCX,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BlC,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAkB/C,aAAa,IAAI,IAAI;IAIrB,WAAW,IAAI,IAAI;IAOb,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BjE,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwC3D,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAWxC,OAAO,CAAC,eAAe;YAeT,YAAY;YA+CZ,oBAAoB;IAiBlC,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,eAAe;yCAvVd,2BAA2B;2CAA3B,2BAA2B;CA6avC"}
@@ -1,7 +1,8 @@
1
1
  import { Component, Input } from '@angular/core';
2
- import { Metadata, RunView } from '@memberjunction/core';
2
+ import { RunView } from '@memberjunction/core';
3
3
  import { MJNotificationService } from '@memberjunction/ng-notifications';
4
4
  import { ModuleRegistry, AllCommunityModule, themeAlpine, colorSchemeVariable } from 'ag-grid-community';
5
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "ag-grid-angular";
7
8
  import * as i2 from "@memberjunction/ng-ui-components";
@@ -55,8 +56,9 @@ function TemplateParamsGridComponent_Conditional_9_Template(rf, ctx) { if (rf &
55
56
  } }
56
57
  // Register AG Grid modules
57
58
  ModuleRegistry.registerModules([AllCommunityModule]);
58
- export class TemplateParamsGridComponent {
59
+ export class TemplateParamsGridComponent extends BaseAngularComponent {
59
60
  constructor() {
61
+ super(...arguments);
60
62
  this.template = null;
61
63
  this.editMode = false;
62
64
  this.templateParams = [];
@@ -109,7 +111,7 @@ export class TemplateParamsGridComponent {
109
111
  return;
110
112
  this.isLoading = true;
111
113
  try {
112
- const rv = new RunView();
114
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
113
115
  const results = await rv.RunView({
114
116
  EntityName: 'MJ: Template Params',
115
117
  ExtraFilter: `TemplateID='${this.template.ID}'`,
@@ -307,7 +309,7 @@ export class TemplateParamsGridComponent {
307
309
  if (!this.template?.ID)
308
310
  return null;
309
311
  try {
310
- const md = new Metadata();
312
+ const md = this.ProviderToUse;
311
313
  const newParam = await md.GetEntityObject('MJ: Template Params');
312
314
  newParam.TemplateID = this.template.ID;
313
315
  newParam.Type = 'Scalar';
@@ -433,8 +435,8 @@ export class TemplateParamsGridComponent {
433
435
  }
434
436
  this.ColumnDefs = cols;
435
437
  }
436
- static { this.ɵfac = function TemplateParamsGridComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TemplateParamsGridComponent)(); }; }
437
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TemplateParamsGridComponent, selectors: [["mj-template-params-grid"]], inputs: { template: "template", editMode: "editMode" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 10, vars: 10, consts: [[1, "template-params-grid"], [1, "params-header"], [1, "fa-solid", "fa-sliders"], [1, "params-description"], [1, "params-toolbar"], [1, "params-ag-grid", 2, "width", "100%", "height", "400px", 3, "gridReady", "rowEditingStopped", "theme", "rowData", "columnDefs", "defaultColDef", "editType", "getRowId", "suppressClickEdit", "overlayNoRowsTemplate"], [1, "params-help"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "fa-solid", "fa-question-circle"], [1, "help-note"], [1, "fa-solid", "fa-lightbulb"]], template: function TemplateParamsGridComponent_Template(rf, ctx) { if (rf & 1) {
438
+ static { this.ɵfac = /*@__PURE__*/ (() => { let ɵTemplateParamsGridComponent_BaseFactory; return function TemplateParamsGridComponent_Factory(__ngFactoryType__) { return (ɵTemplateParamsGridComponent_BaseFactory || (ɵTemplateParamsGridComponent_BaseFactory = i0.ɵɵgetInheritedFactory(TemplateParamsGridComponent)))(__ngFactoryType__ || TemplateParamsGridComponent); }; })(); }
439
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TemplateParamsGridComponent, selectors: [["mj-template-params-grid"]], inputs: { template: "template", editMode: "editMode" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 10, vars: 10, consts: [[1, "template-params-grid"], [1, "params-header"], [1, "fa-solid", "fa-sliders"], [1, "params-description"], [1, "params-toolbar"], [1, "params-ag-grid", 2, "width", "100%", "height", "400px", 3, "gridReady", "rowEditingStopped", "theme", "rowData", "columnDefs", "defaultColDef", "editType", "getRowId", "suppressClickEdit", "overlayNoRowsTemplate"], [1, "params-help"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "fa-solid", "fa-question-circle"], [1, "help-note"], [1, "fa-solid", "fa-lightbulb"]], template: function TemplateParamsGridComponent_Template(rf, ctx) { if (rf & 1) {
438
440
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "h3");
439
441
  i0.ɵɵelement(3, "i", 2);
440
442
  i0.ɵɵtext(4, " Template Parameters");
@@ -465,7 +467,7 @@ export class TemplateParamsGridComponent {
465
467
  }], editMode: [{
466
468
  type: Input
467
469
  }] }); })();
468
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TemplateParamsGridComponent, { className: "TemplateParamsGridComponent", filePath: "src/lib/custom/Templates/template-params-grid.component.ts", lineNumber: 48 }); })();
470
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TemplateParamsGridComponent, { className: "TemplateParamsGridComponent", filePath: "src/lib/custom/Templates/template-params-grid.component.ts", lineNumber: 49 }); })();
469
471
  /**
470
472
  * Inline cell renderer for edit/delete/save/cancel action buttons.
471
473
  * This is a plain-JS AG Grid cell renderer (not an Angular component)
@@ -1 +1 @@
1
- {"version":3,"file":"template-params-grid.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Templates/template-params-grid.component.ts","../../../../src/lib/custom/Templates/template-params-grid.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit, OnChanges, SimpleChanges } from '@angular/core';\nimport { MJTemplateEntity, MJTemplateParamEntity } from '@memberjunction/core-entities';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport {\n ColDef,\n GridReadyEvent,\n GridApi,\n GetRowIdParams,\n ModuleRegistry,\n AllCommunityModule,\n RowEditingStoppedEvent,\n ICellRendererParams,\n themeAlpine,\n colorSchemeVariable,\n type Theme\n} from 'ag-grid-community';\n\n// Register AG Grid modules\nModuleRegistry.registerModules([AllCommunityModule]);\n\n/** Valid parameter type values, matching the entity's union type */\ntype ParamType = 'Array' | 'Entity' | 'Object' | 'Record' | 'Scalar';\n\n/** Row data shape for the grid (flattened from the entity for editing) */\ninterface ParamRowData {\n /** Entity reference for save/delete operations */\n Entity: MJTemplateParamEntity;\n /** Used as row ID; empty string for unsaved new rows */\n ID: string;\n Name: string;\n Type: ParamType;\n IsRequired: boolean;\n Description: string;\n DefaultValue: string;\n LinkedParameterName: string;\n LinkedParameterField: string;\n /** Tracks whether this row is brand-new (not yet persisted) */\n IsNew: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-template-params-grid',\n templateUrl: './template-params-grid.component.html',\n styleUrls: ['./template-params-grid.component.css']\n})\nexport class TemplateParamsGridComponent implements OnInit, OnChanges {\n @Input() template: MJTemplateEntity | null = null;\n @Input() editMode: boolean = false;\n\n public templateParams: ParamRowData[] = [];\n public isLoading = false;\n\n // Type options for dropdown\n public typeOptions = ['Scalar', 'Array', 'Object', 'Record', 'Entity'];\n\n // AG Grid configuration\n public ColumnDefs: ColDef[] = [];\n public DefaultColDef: ColDef = {\n sortable: true,\n resizable: true,\n filter: false,\n flex: 1\n };\n public GridTheme: Theme = themeAlpine.withPart(colorSchemeVariable);\n private gridApi: GridApi | null = null;\n\n /** Row currently being edited (for cancel/revert) */\n private editingRowBackup: ParamRowData | null = null;\n private editingRowId: string | null = null;\n\n public noRowsTemplate = `\n <div style=\"text-align: center; padding: 40px 20px; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-info-circle\" style=\"font-size: 2em; margin-bottom: 10px;\"></i>\n <p>No parameters defined for this template.</p>\n </div>\n `;\n\n public getRowId = (params: GetRowIdParams<ParamRowData>): string => {\n // Use entity ID if saved, otherwise use a temporary key\n return params.data.ID || `new_${params.data.Name}_${Date.now()}`;\n };\n\n ngOnInit() {\n this.buildColumnDefs();\n if (this.template?.ID) {\n this.loadTemplateParams();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['template'] && this.template?.ID) {\n this.loadTemplateParams();\n }\n if (changes['editMode']) {\n this.buildColumnDefs();\n }\n }\n\n public onGridReady(event: GridReadyEvent): void {\n this.gridApi = event.api;\n }\n\n async loadTemplateParams() {\n if (!this.template?.ID) return;\n\n this.isLoading = true;\n try {\n const rv = new RunView();\n const results = await rv.RunView<MJTemplateParamEntity>({\n EntityName: 'MJ: Template Params',\n ExtraFilter: `TemplateID='${this.template.ID}'`,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object'\n });\n\n if (results.Success) {\n const entities = results.Results || [];\n this.templateParams = entities.map(e => this.entityToRowData(e));\n } else {\n console.error('Failed to load template params:', results.ErrorMessage);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to load template parameters',\n 'error'\n );\n }\n } catch (error) {\n console.error('Error loading template params:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error loading template parameters',\n 'error'\n );\n } finally {\n this.isLoading = false;\n }\n }\n\n // -- Grid editing lifecycle --\n\n public async addNewParam(): Promise<void> {\n if (!this.editMode || !this.template?.ID) return;\n\n // Cancel any in-progress edit first\n this.cancelCurrentEdit();\n\n const newEntity = await this.createNewParamEntity();\n if (!newEntity) return;\n\n const newRow = this.entityToRowData(newEntity);\n newRow.IsNew = true;\n // Prepend the new row\n this.templateParams = [newRow, ...this.templateParams];\n\n // Wait for grid to process the new row, then start editing it\n setTimeout(() => {\n if (!this.gridApi) return;\n const rowNode = this.gridApi.getDisplayedRowAtIndex(0);\n if (rowNode) {\n this.editingRowId = rowNode.id ?? null;\n this.editingRowBackup = { ...newRow };\n this.gridApi.startEditingCell({\n rowIndex: 0,\n colKey: 'Name'\n });\n this.gridApi.refreshCells({ columns: ['actions'], force: true });\n }\n });\n }\n\n public startEditRow(params: ICellRendererParams): void {\n if (!this.gridApi || !this.editMode) return;\n\n // Cancel any in-progress edit first\n this.cancelCurrentEdit();\n\n const rowIndex = params.node.rowIndex;\n if (rowIndex == null) return;\n\n this.editingRowId = params.node.id ?? null;\n this.editingRowBackup = { ...params.data };\n this.gridApi.startEditingCell({\n rowIndex,\n colKey: 'Name'\n });\n this.gridApi.refreshCells({ columns: ['actions'], force: true });\n }\n\n public cancelEditRow(): void {\n this.cancelCurrentEdit();\n }\n\n public saveEditRow(): void {\n if (!this.gridApi) return;\n // stopEditing triggers onRowEditingStopped, which handles the save\n this.gridApi.stopEditing(false);\n this.gridApi.refreshCells({ columns: ['actions'], force: true });\n }\n\n public async onRowEditingStopped(event: RowEditingStoppedEvent): Promise<void> {\n const rowData = event.data as ParamRowData;\n if (!rowData) return;\n\n // If the user cancelled (via Escape or cancel button backup restore), skip save\n if (this.editingRowBackup === null) return;\n\n // Validate: Name is required\n if (!rowData.Name || rowData.Name.trim().length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Parameter name is required',\n 'error'\n );\n // If it was a new unsaved row, remove it\n if (rowData.IsNew) {\n this.templateParams = this.templateParams.filter(p => p !== rowData);\n } else if (this.editingRowBackup) {\n // Revert to backup\n this.revertRow(event.node, this.editingRowBackup);\n }\n this.clearEditState();\n return;\n }\n\n await this.saveParamRow(rowData);\n this.clearEditState();\n }\n\n public async deleteRow(params: ICellRendererParams): Promise<void> {\n if (!this.editMode) return;\n\n const rowData = params.data as ParamRowData;\n const entity = rowData.Entity;\n\n if (!confirm(`Are you sure you want to delete the parameter \"${rowData.Name}\"?`)) {\n return;\n }\n\n try {\n if (entity.ID) {\n const deleted = await entity.Delete();\n if (deleted) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Parameter \"${rowData.Name}\" deleted successfully`,\n 'success'\n );\n this.templateParams = this.templateParams.filter(p => p !== rowData);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to delete parameter: ${entity.LatestResult?.Message || 'Unknown error'}`,\n 'error'\n );\n }\n } else {\n // Not yet saved -- just remove from the array\n this.templateParams = this.templateParams.filter(p => p !== rowData);\n }\n } catch (error) {\n console.error('Error deleting parameter:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error deleting parameter',\n 'error'\n );\n }\n }\n\n // -- Helpers --\n\n public getTypeIcon(type: string): string {\n switch (type) {\n case 'Scalar': return 'fa-font';\n case 'Array': return 'fa-list';\n case 'Object': return 'fa-cube';\n case 'Record': return 'fa-file';\n case 'Entity': return 'fa-table';\n default: return 'fa-question';\n }\n }\n\n private entityToRowData(entity: MJTemplateParamEntity): ParamRowData {\n return {\n Entity: entity,\n ID: entity.ID || '',\n Name: entity.Name || '',\n Type: entity.Type || 'Scalar',\n IsRequired: entity.IsRequired || false,\n Description: entity.Description || '',\n DefaultValue: entity.DefaultValue || '',\n LinkedParameterName: entity.LinkedParameterName || '',\n LinkedParameterField: entity.LinkedParameterField || '',\n IsNew: false\n };\n }\n\n private async saveParamRow(rowData: ParamRowData): Promise<void> {\n const entity = rowData.Entity;\n\n entity.Name = rowData.Name;\n entity.Type = rowData.Type;\n entity.IsRequired = rowData.IsRequired;\n entity.Description = rowData.Description;\n entity.DefaultValue = rowData.DefaultValue;\n\n // Handle linked parameter fields for Entity type\n if (rowData.Type === 'Entity') {\n entity.LinkedParameterName = rowData.LinkedParameterName;\n entity.LinkedParameterField = rowData.LinkedParameterField;\n } else {\n entity.LinkedParameterName = null;\n entity.LinkedParameterField = null;\n }\n\n try {\n const saved = await entity.Save();\n if (saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Parameter \"${entity.Name}\" saved successfully`,\n 'success'\n );\n // Update the row data with the saved entity ID\n rowData.ID = entity.ID;\n rowData.IsNew = false;\n // Refresh the grid to pick up the new ID\n this.templateParams = [...this.templateParams];\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to save parameter: ${entity.LatestResult?.Message || 'Unknown error'}`,\n 'error'\n );\n await this.loadTemplateParams();\n }\n } catch (error) {\n console.error('Error saving parameter:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error saving parameter',\n 'error'\n );\n await this.loadTemplateParams();\n }\n }\n\n private async createNewParamEntity(): Promise<MJTemplateParamEntity | null> {\n if (!this.template?.ID) return null;\n\n try {\n const md = new Metadata();\n const newParam = await md.GetEntityObject<MJTemplateParamEntity>('MJ: Template Params');\n newParam.TemplateID = this.template.ID;\n newParam.Type = 'Scalar';\n newParam.IsRequired = false;\n\n return newParam;\n } catch (error) {\n console.error('Error creating new parameter:', error);\n return null;\n }\n }\n\n private cancelCurrentEdit(): void {\n if (!this.gridApi) return;\n\n if (this.editingRowBackup && this.editingRowId) {\n const rowNode = this.gridApi.getRowNode(this.editingRowId);\n if (rowNode) {\n // If the row was new and unsaved, remove it\n if (this.editingRowBackup.IsNew) {\n const backup = this.editingRowBackup;\n this.clearEditState();\n this.gridApi.stopEditing(true);\n this.templateParams = this.templateParams.filter(p => p.Entity !== backup.Entity);\n return;\n }\n // Revert to backup\n this.revertRow(rowNode, this.editingRowBackup);\n }\n }\n\n this.clearEditState();\n this.gridApi.stopEditing(true);\n this.gridApi.refreshCells({ columns: ['actions'], force: true });\n }\n\n private revertRow(rowNode: { setData: (data: ParamRowData) => void }, backup: ParamRowData): void {\n rowNode.setData(backup);\n }\n\n private clearEditState(): void {\n this.editingRowBackup = null;\n this.editingRowId = null;\n }\n\n private buildColumnDefs(): void {\n const self = this;\n\n const cols: ColDef[] = [\n {\n field: 'Name',\n headerName: 'Parameter Name',\n width: 200,\n editable: this.editMode,\n cellRenderer: (params: ICellRendererParams) => {\n if (!params.value) return '';\n const row = params.data as ParamRowData;\n let html = `<strong>${params.value}</strong>`;\n if (row.IsRequired) {\n html += ` <span style=\"display: inline-flex; align-items: center; gap: 4px; background-color: var(--mj-status-error); color: var(--mj-text-inverse); padding: 2px 8px; border-radius: 12px; font-size: 0.75em; font-weight: 500;\"><i class=\"fa-solid fa-asterisk\" style=\"font-size: 0.6em;\"></i> Required</span>`;\n }\n return html;\n }\n },\n {\n field: 'Type',\n headerName: 'Type',\n width: 140,\n editable: this.editMode,\n cellEditor: 'agSelectCellEditor',\n cellEditorParams: {\n values: this.typeOptions\n },\n cellRenderer: (params: ICellRendererParams) => {\n if (!params.value) return '';\n const icon = self.getTypeIcon(params.value);\n return `<span style=\"display: flex; align-items: center; gap: 6px; color: var(--mj-text-secondary);\"><i class=\"fa-solid ${icon}\" style=\"color: var(--mj-text-muted);\"></i> ${params.value}</span>`;\n }\n },\n {\n field: 'IsRequired',\n headerName: 'Required',\n width: 100,\n editable: this.editMode,\n cellDataType: 'boolean',\n cellRenderer: (params: ICellRendererParams) => {\n if (params.value) {\n return `<div style=\"text-align: center;\"><i class=\"fa-solid fa-check\" style=\"color: var(--mj-status-success);\"></i></div>`;\n }\n return `<div style=\"text-align: center;\"><i class=\"fa-solid fa-times\" style=\"color: var(--mj-text-muted);\"></i></div>`;\n }\n },\n {\n field: 'Description',\n headerName: 'Description',\n width: 300,\n editable: this.editMode,\n cellRenderer: (params: ICellRendererParams) => {\n return params.value || '<span style=\"color: var(--mj-text-muted); font-style: italic; font-size: 0.9em;\">(No description)</span>';\n }\n },\n {\n field: 'DefaultValue',\n headerName: 'Default Value',\n width: 200,\n editable: this.editMode,\n cellRenderer: (params: ICellRendererParams) => {\n if (params.value) {\n return `<code style=\"background-color: var(--mj-bg-surface-card); padding: 2px 6px; border-radius: 3px; font-size: 0.85em; color: var(--mj-text-secondary);\">${params.value}</code>`;\n }\n return '<span style=\"color: var(--mj-text-muted); font-style: italic; font-size: 0.9em;\">(No default)</span>';\n }\n }\n ];\n\n if (this.editMode) {\n cols.push({\n headerName: 'Actions',\n width: 120,\n sortable: false,\n resizable: false,\n editable: false,\n cellRenderer: ActionsCellRenderer,\n cellRendererParams: {\n componentRef: self\n }\n });\n }\n\n this.ColumnDefs = cols;\n }\n}\n\n/**\n * Inline cell renderer for edit/delete/save/cancel action buttons.\n * This is a plain-JS AG Grid cell renderer (not an Angular component)\n * because the grid doesn't support Angular component renderers without\n * the AG Grid Enterprise \"Framework Components\" feature.\n */\nfunction ActionsCellRenderer(params: ICellRendererParams & { componentRef: TemplateParamsGridComponent }): HTMLElement {\n const container = document.createElement('div');\n container.style.display = 'flex';\n container.style.gap = '4px';\n container.style.alignItems = 'center';\n\n const comp = params.componentRef;\n const isEditing = params.node.rowIndex != null && params.api.getEditingCells().some(\n cell => cell.rowIndex === params.node.rowIndex\n );\n\n if (isEditing) {\n // Save button\n const saveBtn = createActionButton('fa-check', 'Save changes', 'var(--mj-brand-primary)');\n saveBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n comp.saveEditRow();\n });\n container.appendChild(saveBtn);\n\n // Cancel button\n const cancelBtn = createActionButton('fa-times', 'Cancel changes', 'var(--mj-text-secondary)');\n cancelBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n comp.cancelEditRow();\n });\n container.appendChild(cancelBtn);\n } else {\n // Edit button\n const editBtn = createActionButton('fa-edit', 'Edit parameter', 'var(--mj-text-secondary)');\n editBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n comp.startEditRow(params);\n });\n container.appendChild(editBtn);\n\n // Delete button\n const deleteBtn = createActionButton('fa-trash', 'Delete parameter', 'var(--mj-status-error)');\n deleteBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n comp.deleteRow(params);\n });\n container.appendChild(deleteBtn);\n }\n\n return container;\n}\n\nfunction createActionButton(iconClass: string, title: string, color: string): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.title = title;\n btn.style.cssText = `\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: ${color};\n border-radius: 4px;\n padding: 4px 8px;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n `;\n const icon = document.createElement('i');\n icon.className = `fa-solid ${iconClass}`;\n btn.appendChild(icon);\n return btn;\n}\n","<div class=\"template-params-grid\">\n <div class=\"params-header\">\n <h3><i class=\"fa-solid fa-sliders\"></i> Template Parameters</h3>\n <p class=\"params-description\">\n Define the parameters that can be used within this template. Parameters allow dynamic content injection at runtime.\n </p>\n </div>\n\n @if (editMode) {\n <div class=\"params-toolbar\">\n <button mjButton variant=\"primary\" (click)=\"addNewParam()\">\n <i class=\"fa-solid fa-plus\"></i> Add Parameter\n </button>\n </div>\n }\n\n <ag-grid-angular\n class=\"params-ag-grid\"\n [theme]=\"GridTheme\"\n [rowData]=\"templateParams\"\n [columnDefs]=\"ColumnDefs\"\n [defaultColDef]=\"DefaultColDef\"\n [editType]=\"'fullRow'\"\n [getRowId]=\"getRowId\"\n [suppressClickEdit]=\"true\"\n [overlayNoRowsTemplate]=\"noRowsTemplate\"\n (gridReady)=\"onGridReady($event)\"\n (rowEditingStopped)=\"onRowEditingStopped($event)\"\n style=\"width: 100%; height: 400px;\">\n </ag-grid-angular>\n\n <!-- Help Section -->\n @if (editMode) {\n <div class=\"params-help\">\n <h4><i class=\"fa-solid fa-question-circle\"></i> Parameter Types</h4>\n <ul>\n <li><strong>Scalar:</strong> Single value like text, number, or boolean</li>\n <li><strong>Array:</strong> List of values</li>\n <li><strong>Object:</strong> JSON object with multiple properties</li>\n <li><strong>Record:</strong> Single record from a MemberJunction entity</li>\n <li><strong>Entity:</strong> Multiple records from a MemberJunction entity (can be filtered)</li>\n </ul>\n <p class=\"help-note\">\n <i class=\"fa-solid fa-lightbulb\"></i>\n Use parameters in your template with the syntax: <code>{{ '{{' }} parameterName {{ '}}' }}</code>\n </p>\n </div>\n }\n</div>\n"]}
1
+ {"version":3,"file":"template-params-grid.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Templates/template-params-grid.component.ts","../../../../src/lib/custom/Templates/template-params-grid.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnInit, OnChanges, SimpleChanges } from '@angular/core';\nimport { MJTemplateEntity, MJTemplateParamEntity } from '@memberjunction/core-entities';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport {\n ColDef,\n GridReadyEvent,\n GridApi,\n GetRowIdParams,\n ModuleRegistry,\n AllCommunityModule,\n RowEditingStoppedEvent,\n ICellRendererParams,\n themeAlpine,\n colorSchemeVariable,\n type Theme\n} from 'ag-grid-community';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n// Register AG Grid modules\nModuleRegistry.registerModules([AllCommunityModule]);\n\n/** Valid parameter type values, matching the entity's union type */\ntype ParamType = 'Array' | 'Entity' | 'Object' | 'Record' | 'Scalar';\n\n/** Row data shape for the grid (flattened from the entity for editing) */\ninterface ParamRowData {\n /** Entity reference for save/delete operations */\n Entity: MJTemplateParamEntity;\n /** Used as row ID; empty string for unsaved new rows */\n ID: string;\n Name: string;\n Type: ParamType;\n IsRequired: boolean;\n Description: string;\n DefaultValue: string;\n LinkedParameterName: string;\n LinkedParameterField: string;\n /** Tracks whether this row is brand-new (not yet persisted) */\n IsNew: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-template-params-grid',\n templateUrl: './template-params-grid.component.html',\n styleUrls: ['./template-params-grid.component.css']\n})\nexport class TemplateParamsGridComponent extends BaseAngularComponent implements OnInit, OnChanges {\n @Input() template: MJTemplateEntity | null = null;\n @Input() editMode: boolean = false;\n\n public templateParams: ParamRowData[] = [];\n public isLoading = false;\n\n // Type options for dropdown\n public typeOptions = ['Scalar', 'Array', 'Object', 'Record', 'Entity'];\n\n // AG Grid configuration\n public ColumnDefs: ColDef[] = [];\n public DefaultColDef: ColDef = {\n sortable: true,\n resizable: true,\n filter: false,\n flex: 1\n };\n public GridTheme: Theme = themeAlpine.withPart(colorSchemeVariable);\n private gridApi: GridApi | null = null;\n\n /** Row currently being edited (for cancel/revert) */\n private editingRowBackup: ParamRowData | null = null;\n private editingRowId: string | null = null;\n\n public noRowsTemplate = `\n <div style=\"text-align: center; padding: 40px 20px; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-info-circle\" style=\"font-size: 2em; margin-bottom: 10px;\"></i>\n <p>No parameters defined for this template.</p>\n </div>\n `;\n\n public getRowId = (params: GetRowIdParams<ParamRowData>): string => {\n // Use entity ID if saved, otherwise use a temporary key\n return params.data.ID || `new_${params.data.Name}_${Date.now()}`;\n };\n\n ngOnInit() {\n this.buildColumnDefs();\n if (this.template?.ID) {\n this.loadTemplateParams();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['template'] && this.template?.ID) {\n this.loadTemplateParams();\n }\n if (changes['editMode']) {\n this.buildColumnDefs();\n }\n }\n\n public onGridReady(event: GridReadyEvent): void {\n this.gridApi = event.api;\n }\n\n async loadTemplateParams() {\n if (!this.template?.ID) return;\n\n this.isLoading = true;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const results = await rv.RunView<MJTemplateParamEntity>({\n EntityName: 'MJ: Template Params',\n ExtraFilter: `TemplateID='${this.template.ID}'`,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object'\n });\n\n if (results.Success) {\n const entities = results.Results || [];\n this.templateParams = entities.map(e => this.entityToRowData(e));\n } else {\n console.error('Failed to load template params:', results.ErrorMessage);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to load template parameters',\n 'error'\n );\n }\n } catch (error) {\n console.error('Error loading template params:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error loading template parameters',\n 'error'\n );\n } finally {\n this.isLoading = false;\n }\n }\n\n // -- Grid editing lifecycle --\n\n public async addNewParam(): Promise<void> {\n if (!this.editMode || !this.template?.ID) return;\n\n // Cancel any in-progress edit first\n this.cancelCurrentEdit();\n\n const newEntity = await this.createNewParamEntity();\n if (!newEntity) return;\n\n const newRow = this.entityToRowData(newEntity);\n newRow.IsNew = true;\n // Prepend the new row\n this.templateParams = [newRow, ...this.templateParams];\n\n // Wait for grid to process the new row, then start editing it\n setTimeout(() => {\n if (!this.gridApi) return;\n const rowNode = this.gridApi.getDisplayedRowAtIndex(0);\n if (rowNode) {\n this.editingRowId = rowNode.id ?? null;\n this.editingRowBackup = { ...newRow };\n this.gridApi.startEditingCell({\n rowIndex: 0,\n colKey: 'Name'\n });\n this.gridApi.refreshCells({ columns: ['actions'], force: true });\n }\n });\n }\n\n public startEditRow(params: ICellRendererParams): void {\n if (!this.gridApi || !this.editMode) return;\n\n // Cancel any in-progress edit first\n this.cancelCurrentEdit();\n\n const rowIndex = params.node.rowIndex;\n if (rowIndex == null) return;\n\n this.editingRowId = params.node.id ?? null;\n this.editingRowBackup = { ...params.data };\n this.gridApi.startEditingCell({\n rowIndex,\n colKey: 'Name'\n });\n this.gridApi.refreshCells({ columns: ['actions'], force: true });\n }\n\n public cancelEditRow(): void {\n this.cancelCurrentEdit();\n }\n\n public saveEditRow(): void {\n if (!this.gridApi) return;\n // stopEditing triggers onRowEditingStopped, which handles the save\n this.gridApi.stopEditing(false);\n this.gridApi.refreshCells({ columns: ['actions'], force: true });\n }\n\n public async onRowEditingStopped(event: RowEditingStoppedEvent): Promise<void> {\n const rowData = event.data as ParamRowData;\n if (!rowData) return;\n\n // If the user cancelled (via Escape or cancel button backup restore), skip save\n if (this.editingRowBackup === null) return;\n\n // Validate: Name is required\n if (!rowData.Name || rowData.Name.trim().length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Parameter name is required',\n 'error'\n );\n // If it was a new unsaved row, remove it\n if (rowData.IsNew) {\n this.templateParams = this.templateParams.filter(p => p !== rowData);\n } else if (this.editingRowBackup) {\n // Revert to backup\n this.revertRow(event.node, this.editingRowBackup);\n }\n this.clearEditState();\n return;\n }\n\n await this.saveParamRow(rowData);\n this.clearEditState();\n }\n\n public async deleteRow(params: ICellRendererParams): Promise<void> {\n if (!this.editMode) return;\n\n const rowData = params.data as ParamRowData;\n const entity = rowData.Entity;\n\n if (!confirm(`Are you sure you want to delete the parameter \"${rowData.Name}\"?`)) {\n return;\n }\n\n try {\n if (entity.ID) {\n const deleted = await entity.Delete();\n if (deleted) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Parameter \"${rowData.Name}\" deleted successfully`,\n 'success'\n );\n this.templateParams = this.templateParams.filter(p => p !== rowData);\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to delete parameter: ${entity.LatestResult?.Message || 'Unknown error'}`,\n 'error'\n );\n }\n } else {\n // Not yet saved -- just remove from the array\n this.templateParams = this.templateParams.filter(p => p !== rowData);\n }\n } catch (error) {\n console.error('Error deleting parameter:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error deleting parameter',\n 'error'\n );\n }\n }\n\n // -- Helpers --\n\n public getTypeIcon(type: string): string {\n switch (type) {\n case 'Scalar': return 'fa-font';\n case 'Array': return 'fa-list';\n case 'Object': return 'fa-cube';\n case 'Record': return 'fa-file';\n case 'Entity': return 'fa-table';\n default: return 'fa-question';\n }\n }\n\n private entityToRowData(entity: MJTemplateParamEntity): ParamRowData {\n return {\n Entity: entity,\n ID: entity.ID || '',\n Name: entity.Name || '',\n Type: entity.Type || 'Scalar',\n IsRequired: entity.IsRequired || false,\n Description: entity.Description || '',\n DefaultValue: entity.DefaultValue || '',\n LinkedParameterName: entity.LinkedParameterName || '',\n LinkedParameterField: entity.LinkedParameterField || '',\n IsNew: false\n };\n }\n\n private async saveParamRow(rowData: ParamRowData): Promise<void> {\n const entity = rowData.Entity;\n\n entity.Name = rowData.Name;\n entity.Type = rowData.Type;\n entity.IsRequired = rowData.IsRequired;\n entity.Description = rowData.Description;\n entity.DefaultValue = rowData.DefaultValue;\n\n // Handle linked parameter fields for Entity type\n if (rowData.Type === 'Entity') {\n entity.LinkedParameterName = rowData.LinkedParameterName;\n entity.LinkedParameterField = rowData.LinkedParameterField;\n } else {\n entity.LinkedParameterName = null;\n entity.LinkedParameterField = null;\n }\n\n try {\n const saved = await entity.Save();\n if (saved) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Parameter \"${entity.Name}\" saved successfully`,\n 'success'\n );\n // Update the row data with the saved entity ID\n rowData.ID = entity.ID;\n rowData.IsNew = false;\n // Refresh the grid to pick up the new ID\n this.templateParams = [...this.templateParams];\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to save parameter: ${entity.LatestResult?.Message || 'Unknown error'}`,\n 'error'\n );\n await this.loadTemplateParams();\n }\n } catch (error) {\n console.error('Error saving parameter:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error saving parameter',\n 'error'\n );\n await this.loadTemplateParams();\n }\n }\n\n private async createNewParamEntity(): Promise<MJTemplateParamEntity | null> {\n if (!this.template?.ID) return null;\n\n try {\n const md = this.ProviderToUse;\n const newParam = await md.GetEntityObject<MJTemplateParamEntity>('MJ: Template Params');\n newParam.TemplateID = this.template.ID;\n newParam.Type = 'Scalar';\n newParam.IsRequired = false;\n\n return newParam;\n } catch (error) {\n console.error('Error creating new parameter:', error);\n return null;\n }\n }\n\n private cancelCurrentEdit(): void {\n if (!this.gridApi) return;\n\n if (this.editingRowBackup && this.editingRowId) {\n const rowNode = this.gridApi.getRowNode(this.editingRowId);\n if (rowNode) {\n // If the row was new and unsaved, remove it\n if (this.editingRowBackup.IsNew) {\n const backup = this.editingRowBackup;\n this.clearEditState();\n this.gridApi.stopEditing(true);\n this.templateParams = this.templateParams.filter(p => p.Entity !== backup.Entity);\n return;\n }\n // Revert to backup\n this.revertRow(rowNode, this.editingRowBackup);\n }\n }\n\n this.clearEditState();\n this.gridApi.stopEditing(true);\n this.gridApi.refreshCells({ columns: ['actions'], force: true });\n }\n\n private revertRow(rowNode: { setData: (data: ParamRowData) => void }, backup: ParamRowData): void {\n rowNode.setData(backup);\n }\n\n private clearEditState(): void {\n this.editingRowBackup = null;\n this.editingRowId = null;\n }\n\n private buildColumnDefs(): void {\n const self = this;\n\n const cols: ColDef[] = [\n {\n field: 'Name',\n headerName: 'Parameter Name',\n width: 200,\n editable: this.editMode,\n cellRenderer: (params: ICellRendererParams) => {\n if (!params.value) return '';\n const row = params.data as ParamRowData;\n let html = `<strong>${params.value}</strong>`;\n if (row.IsRequired) {\n html += ` <span style=\"display: inline-flex; align-items: center; gap: 4px; background-color: var(--mj-status-error); color: var(--mj-text-inverse); padding: 2px 8px; border-radius: 12px; font-size: 0.75em; font-weight: 500;\"><i class=\"fa-solid fa-asterisk\" style=\"font-size: 0.6em;\"></i> Required</span>`;\n }\n return html;\n }\n },\n {\n field: 'Type',\n headerName: 'Type',\n width: 140,\n editable: this.editMode,\n cellEditor: 'agSelectCellEditor',\n cellEditorParams: {\n values: this.typeOptions\n },\n cellRenderer: (params: ICellRendererParams) => {\n if (!params.value) return '';\n const icon = self.getTypeIcon(params.value);\n return `<span style=\"display: flex; align-items: center; gap: 6px; color: var(--mj-text-secondary);\"><i class=\"fa-solid ${icon}\" style=\"color: var(--mj-text-muted);\"></i> ${params.value}</span>`;\n }\n },\n {\n field: 'IsRequired',\n headerName: 'Required',\n width: 100,\n editable: this.editMode,\n cellDataType: 'boolean',\n cellRenderer: (params: ICellRendererParams) => {\n if (params.value) {\n return `<div style=\"text-align: center;\"><i class=\"fa-solid fa-check\" style=\"color: var(--mj-status-success);\"></i></div>`;\n }\n return `<div style=\"text-align: center;\"><i class=\"fa-solid fa-times\" style=\"color: var(--mj-text-muted);\"></i></div>`;\n }\n },\n {\n field: 'Description',\n headerName: 'Description',\n width: 300,\n editable: this.editMode,\n cellRenderer: (params: ICellRendererParams) => {\n return params.value || '<span style=\"color: var(--mj-text-muted); font-style: italic; font-size: 0.9em;\">(No description)</span>';\n }\n },\n {\n field: 'DefaultValue',\n headerName: 'Default Value',\n width: 200,\n editable: this.editMode,\n cellRenderer: (params: ICellRendererParams) => {\n if (params.value) {\n return `<code style=\"background-color: var(--mj-bg-surface-card); padding: 2px 6px; border-radius: 3px; font-size: 0.85em; color: var(--mj-text-secondary);\">${params.value}</code>`;\n }\n return '<span style=\"color: var(--mj-text-muted); font-style: italic; font-size: 0.9em;\">(No default)</span>';\n }\n }\n ];\n\n if (this.editMode) {\n cols.push({\n headerName: 'Actions',\n width: 120,\n sortable: false,\n resizable: false,\n editable: false,\n cellRenderer: ActionsCellRenderer,\n cellRendererParams: {\n componentRef: self\n }\n });\n }\n\n this.ColumnDefs = cols;\n }\n}\n\n/**\n * Inline cell renderer for edit/delete/save/cancel action buttons.\n * This is a plain-JS AG Grid cell renderer (not an Angular component)\n * because the grid doesn't support Angular component renderers without\n * the AG Grid Enterprise \"Framework Components\" feature.\n */\nfunction ActionsCellRenderer(params: ICellRendererParams & { componentRef: TemplateParamsGridComponent }): HTMLElement {\n const container = document.createElement('div');\n container.style.display = 'flex';\n container.style.gap = '4px';\n container.style.alignItems = 'center';\n\n const comp = params.componentRef;\n const isEditing = params.node.rowIndex != null && params.api.getEditingCells().some(\n cell => cell.rowIndex === params.node.rowIndex\n );\n\n if (isEditing) {\n // Save button\n const saveBtn = createActionButton('fa-check', 'Save changes', 'var(--mj-brand-primary)');\n saveBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n comp.saveEditRow();\n });\n container.appendChild(saveBtn);\n\n // Cancel button\n const cancelBtn = createActionButton('fa-times', 'Cancel changes', 'var(--mj-text-secondary)');\n cancelBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n comp.cancelEditRow();\n });\n container.appendChild(cancelBtn);\n } else {\n // Edit button\n const editBtn = createActionButton('fa-edit', 'Edit parameter', 'var(--mj-text-secondary)');\n editBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n comp.startEditRow(params);\n });\n container.appendChild(editBtn);\n\n // Delete button\n const deleteBtn = createActionButton('fa-trash', 'Delete parameter', 'var(--mj-status-error)');\n deleteBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n comp.deleteRow(params);\n });\n container.appendChild(deleteBtn);\n }\n\n return container;\n}\n\nfunction createActionButton(iconClass: string, title: string, color: string): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.title = title;\n btn.style.cssText = `\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: ${color};\n border-radius: 4px;\n padding: 4px 8px;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n `;\n const icon = document.createElement('i');\n icon.className = `fa-solid ${iconClass}`;\n btn.appendChild(icon);\n return btn;\n}\n","<div class=\"template-params-grid\">\n <div class=\"params-header\">\n <h3><i class=\"fa-solid fa-sliders\"></i> Template Parameters</h3>\n <p class=\"params-description\">\n Define the parameters that can be used within this template. Parameters allow dynamic content injection at runtime.\n </p>\n </div>\n\n @if (editMode) {\n <div class=\"params-toolbar\">\n <button mjButton variant=\"primary\" (click)=\"addNewParam()\">\n <i class=\"fa-solid fa-plus\"></i> Add Parameter\n </button>\n </div>\n }\n\n <ag-grid-angular\n class=\"params-ag-grid\"\n [theme]=\"GridTheme\"\n [rowData]=\"templateParams\"\n [columnDefs]=\"ColumnDefs\"\n [defaultColDef]=\"DefaultColDef\"\n [editType]=\"'fullRow'\"\n [getRowId]=\"getRowId\"\n [suppressClickEdit]=\"true\"\n [overlayNoRowsTemplate]=\"noRowsTemplate\"\n (gridReady)=\"onGridReady($event)\"\n (rowEditingStopped)=\"onRowEditingStopped($event)\"\n style=\"width: 100%; height: 400px;\">\n </ag-grid-angular>\n\n <!-- Help Section -->\n @if (editMode) {\n <div class=\"params-help\">\n <h4><i class=\"fa-solid fa-question-circle\"></i> Parameter Types</h4>\n <ul>\n <li><strong>Scalar:</strong> Single value like text, number, or boolean</li>\n <li><strong>Array:</strong> List of values</li>\n <li><strong>Object:</strong> JSON object with multiple properties</li>\n <li><strong>Record:</strong> Single record from a MemberJunction entity</li>\n <li><strong>Entity:</strong> Multiple records from a MemberJunction entity (can be filtered)</li>\n </ul>\n <p class=\"help-note\">\n <i class=\"fa-solid fa-lightbulb\"></i>\n Use parameters in your template with the syntax: <code>{{ '{{' }} parameterName {{ '}}' }}</code>\n </p>\n </div>\n }\n</div>\n"]}
@@ -8,7 +8,7 @@ import { Component, ViewChild } from '@angular/core';
8
8
  import { RegisterClass } from '@memberjunction/global';
9
9
  import { BaseFormComponent, CUSTOM_LAYOUT_TOOLBAR_CONFIG } from '@memberjunction/ng-base-forms';
10
10
  import { MJTemplateFormComponent } from '../../generated/Entities/MJTemplate/mjtemplate.form.component';
11
- import { Metadata, RunView } from '@memberjunction/core';
11
+ import { RunView } from '@memberjunction/core';
12
12
  import { TemplateEngineBase } from '@memberjunction/templates-base-types';
13
13
  import { Subject } from 'rxjs';
14
14
  import { MJNotificationService } from '@memberjunction/ng-notifications';
@@ -345,7 +345,7 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
345
345
  async loadTemplateContents() {
346
346
  if (this.record && this.record.ID) {
347
347
  try {
348
- const rv = new RunView();
348
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
349
349
  const results = await rv.RunView({
350
350
  EntityName: 'MJ: Template Contents',
351
351
  ExtraFilter: `TemplateID='${this.record.ID}'`,
@@ -371,7 +371,7 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
371
371
  }
372
372
  }
373
373
  async createDefaultTemplateContent() {
374
- const md = new Metadata();
374
+ const md = this.ProviderToUse;
375
375
  const defaultContent = await md.GetEntityObject('MJ: Template Contents');
376
376
  defaultContent.TemplateID = this.record.ID;
377
377
  defaultContent.Priority = 1;
@@ -403,7 +403,7 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
403
403
  }
404
404
  async loadCategories() {
405
405
  try {
406
- const rv = new RunView();
406
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
407
407
  const results = await rv.RunView({
408
408
  EntityName: 'MJ: Template Categories'
409
409
  });
@@ -458,7 +458,7 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
458
458
  }
459
459
  try {
460
460
  // Create new category with trimmed name
461
- const md = new Metadata();
461
+ const md = this.ProviderToUse;
462
462
  const newCategory = await md.GetEntityObject('MJ: Template Categories');
463
463
  newCategory.Name = value.trim();
464
464
  newCategory.UserID = this.record.UserID || md.CurrentUser.ID;
@@ -483,7 +483,7 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
483
483
  }
484
484
  }
485
485
  async addNewTemplateContent() {
486
- const md = new Metadata();
486
+ const md = this.ProviderToUse;
487
487
  this.newTemplateContent = await md.GetEntityObject('MJ: Template Contents');
488
488
  this.newTemplateContent.TemplateID = this.record.ID;
489
489
  this.newTemplateContent.Priority = this.templateContents.length + 1;
@@ -657,7 +657,7 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
657
657
  else {
658
658
  try {
659
659
  // Create new category with trimmed name
660
- const md = new Metadata();
660
+ const md = this.ProviderToUse;
661
661
  const newCategory = await md.GetEntityObject('MJ: Template Categories');
662
662
  newCategory.Name = this.record.CategoryID.trim(); // CategoryID contains the new category name, trim it
663
663
  newCategory.UserID = this.record.UserID || md.CurrentUser.ID;
@@ -686,7 +686,7 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
686
686
  // Call the parent save method to save the template
687
687
  // Before saving, if a new record, make sure the UserID is set
688
688
  if (!this.record.IsSaved && !this.record.UserID) {
689
- const md = new Metadata();
689
+ const md = this.ProviderToUse;
690
690
  this.record.UserID = md.CurrentUser.ID;
691
691
  }
692
692
  const templateSaved = await super.SaveRecord(StopEditModeAfterSave);