@memberjunction/ng-core-entity-forms 5.11.0 → 5.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/custom/AIAgents/FlowAgentType/flow-agent-form-section.component.js +2 -2
- package/dist/lib/custom/AIAgents/add-action-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +8 -0
- package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +199 -139
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +6 -6
- package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +2 -2
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +6 -6
- package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +3 -3
- package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
- package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +2 -2
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +4 -4
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +2 -2
- package/dist/lib/custom/Actions/action-execution-log-form.component.js +5 -5
- package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
- package/dist/lib/custom/Actions/action-form.component.js +22 -22
- package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.d.ts +11 -0
- package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +244 -217
- package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
- package/dist/lib/custom/EntityActions/entityaction.form.component.js +3 -3
- package/dist/lib/custom/EntityActions/entityaction.form.component.js.map +1 -1
- package/dist/lib/custom/Lists/list-form.component.js +8 -8
- package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-category-dialog.component.js +3 -3
- package/dist/lib/custom/Queries/query-category-dialog.component.js.map +1 -1
- package/dist/lib/custom/Queries/query-form.component.js +2 -2
- package/dist/lib/custom/Queries/query-run-dialog.component.js +3 -3
- package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
- package/dist/lib/custom/Templates/template-param-dialog.component.js +107 -111
- package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
- package/dist/lib/custom/Templates/template-params-grid.component.js +2 -2
- package/dist/lib/custom/Templates/templates-form.component.js +40 -43
- package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/entity-link-pill.component.js +2 -2
- package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.js +2 -2
- package/dist/lib/custom/Tests/test-rubric-form.component.js +2 -2
- package/dist/lib/custom/Tests/test-rubric-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-feedback-form.component.js +2 -2
- package/dist/lib/custom/Tests/test-run-feedback-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-run-form.component.js +2 -2
- package/dist/lib/custom/Tests/test-suite-form.component.js +2 -2
- package/dist/lib/custom/Tests/test-suite-run-form.component.js +2 -2
- package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +2 -2
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +2 -2
- package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +2 -2
- package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +2 -2
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts +1 -0
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.d.ts.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js +28 -18
- package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js.map +1 -1
- package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +2 -2
- package/dist/lib/custom/custom-forms.module.d.ts +2 -1
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +7 -3
- package/dist/lib/custom/custom-forms.module.js.map +1 -1
- package/dist/lib/custom/shared/entity-selector-dialog.component.js +2 -2
- package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +155 -153
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.js +105 -0
- package/dist/lib/generated/Entities/MJAIAgentCategory/mjaiagentcategory.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentRequest/mjaiagentrequest.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRequest/mjaiagentrequest.form.component.js +31 -7
- package/dist/lib/generated/Entities/MJAIAgentRequest/mjaiagentrequest.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRequestType/mjaiagentrequesttype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIAgentRequestType/mjaiagentrequesttype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentRequestType/mjaiagentrequesttype.form.component.js +89 -0
- package/dist/lib/generated/Entities/MJAIAgentRequestType/mjaiagentrequesttype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +50 -14
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js +22 -4
- package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentType/mjaiagenttype.form.component.js +13 -11
- package/dist/lib/generated/Entities/MJAIAgentType/mjaiagenttype.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js +83 -81
- package/dist/lib/generated/Entities/MJAction/mjaction.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.js +35 -33
- package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js +25 -19
- package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +289 -287
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +102 -96
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/lib/shared/components/template-editor.component.js +85 -89
- package/dist/lib/shared/components/template-editor.component.js.map +1 -1
- package/package.json +31 -31
|
@@ -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 <kendo-dialog\n [minWidth]=\"600\"\n [width]=\"800\"\n [height]=\"700\"\n (close)=\"close()\"\n [title]=\"'Test Template: ' + (template?.Name || 'Unknown')\">\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=\"header-section\" style=\"margin-bottom: 20px; padding-bottom: 16px; border-bottom: 2px solid #e9ecef;\">\n <div style=\"display: flex; align-items: center; gap: 12px; margin-bottom: 8px;\">\n <i class=\"fa-solid fa-sliders\" style=\"color: #6c757d; font-size: 1.2em;\"></i>\n <h5 style=\"margin: 0; color: #495057; font-weight: 600;\">Template Testing</h5>\n </div>\n <p style=\"margin: 0; color: #6c757d; font-size: 0.9em;\">\n Configure parameter values for testing. Parameters with <span style=\"color: #dc3545;\">*</span> are required.\n </p>\n </div>\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-state\" style=\"display: flex; align-items: center; justify-content: center; padding: 40px;\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; color: #6c757d; margin-right: 12px;\"></i>\n <span style=\"color: #6c757d;\">Loading template parameters...</span>\n </div>\n } @else {\n <!-- Template Parameters Section -->\n <kendo-expansionpanel\n [(expanded)]=\"parametersExpanded\"\n style=\"margin-bottom: 16px; flex-shrink: 0;\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-sliders\" style=\"color: #6c757d;\"></i>\n Template Parameters\n @if (parameters.length > 0) {\n <span class=\"badge\" style=\"background: #17a2b8; color: white; padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ parameters.length }}\n </span>\n }\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div style=\"margin-bottom: 12px; color: #6c757d; font-size: 0.85em;\">\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 style=\"border: 1px solid #dee2e6; border-radius: 6px; background: #f8f9fa;\">\n <!-- Header -->\n <div style=\"display: grid; grid-template-columns: 200px 1fr 60px; gap: 12px; padding: 12px 16px; background: #e9ecef; font-weight: 600; font-size: 0.85em; color: #495057; border-bottom: 1px solid #dee2e6;\">\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 style=\"display: grid; grid-template-columns: 200px 1fr 60px; gap: 12px; padding: 12px 16px; border-bottom: 1px solid #e9ecef; align-items: start; background: white;\">\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\" style=\"color: #28a745; font-size: 0.75em;\" title=\"From template definition\"></i>\n } @else {\n <i class=\"fa-solid fa-edit\" style=\"color: #fd7e14; font-size: 0.75em;\" title=\"Custom parameter\"></i>\n }\n @if (param.isRequired) {\n <span style=\"color: #dc3545; font-weight: bold;\">*</span>\n }\n </div>\n @if (param.isFromTemplate) {\n <div style=\"font-family: 'Courier New', monospace; font-size: 0.9em; font-weight: 500; color: #495057; padding: 4px 0; word-break: break-word;\">\n {{ param.key }}\n </div>\n @if (param.description) {\n <div style=\"font-size: 0.75em; color: #6c757d; margin-top: 2px; font-style: italic; word-break: break-word;\">\n {{ param.description }}\n </div>\n }\n @if (param.type && param.type !== 'Scalar') {\n <div style=\"font-size: 0.7em; color: #17a2b8; margin-top: 2px;\">\n Type: {{ param.type }}\n </div>\n }\n } @else {\n <kendo-textbox [(ngModel)]=\"param.key\"\n (ngModelChange)=\"onParameterChange()\"\n placeholder=\"Parameter name...\"\n [disabled]=\"isRunning\"\n style=\"font-family: 'Courier New', monospace; width: 100%;\">\n </kendo-textbox>\n }\n </div>\n <!-- Parameter Value -->\n <div class=\"param-value\">\n <kendo-textarea [(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%;\">\n </kendo-textarea>\n </div>\n <!-- Actions -->\n <div class=\"param-actions\" style=\"display: flex; align-items: start; justify-content: center; padding-top: 4px;\">\n @if (!param.isFromTemplate && parameters.length > 1) {\n <button kendoButton fillMode=\"flat\"\n themeColor=\"error\"\n size=\"small\"\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 style=\"padding: 12px 16px; text-align: center; background: white; border-top: 1px solid #dee2e6;\">\n <button kendoButton fillMode=\"outline\"\n themeColor=\"success\"\n size=\"small\"\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 style=\"text-align: center; padding: 20px; color: #6c757d;\">\n <i class=\"fa-solid fa-info-circle\" style=\"font-size: 2em; margin-bottom: 12px; opacity: 0.5;\"></i>\n <p style=\"margin: 0 0 12px 0;\">No parameters defined yet</p>\n <button kendoButton themeColor=\"primary\" size=\"small\"\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 </kendo-expansionpanel>\n <!-- JSON Preview Section -->\n <kendo-expansionpanel\n [(expanded)]=\"jsonPreviewExpanded\"\n style=\"margin-bottom: 16px; flex-shrink: 0;\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-code\" style=\"color: #6c757d;\"></i>\n Context Data (JSON)\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div style=\"background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 4px; padding: 12px; font-family: 'Courier New', monospace; font-size: 0.85em; color: #495057; max-height: 200px; overflow-y: auto;\">\n <pre style=\"margin: 0; white-space: pre-wrap;\">{{ parametersAsJson }}</pre>\n </div>\n </div>\n </kendo-expansionpanel>\n <!-- Test Results Section -->\n <kendo-expansionpanel\n [(expanded)]=\"resultsExpanded\"\n style=\"margin-bottom: 16px; flex: 1; display: flex; flex-direction: column;\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-chart-line\" style=\"color: #6c757d;\"></i>\n Test Results\n @if (testResult) {\n <span class=\"badge\"\n [style.background]=\"testResult.success ? '#28a745' : '#dc3545'\"\n style=\"color: white; padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ testResult.success ? 'Success' : 'Error' }}\n </span>\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=\"loading-state\" style=\"display: flex; align-items: center; justify-content: center; padding: 40px; flex: 1;\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; color: #6c757d; margin-right: 12px;\"></i>\n <span style=\"color: #6c757d;\">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 style=\"display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 12px; margin-bottom: 16px; padding: 12px; border: 1px solid #dee2e6; border-radius: 6px;\"\n [style.background]=\"testResult.success ? '#d4edda' : '#f8d7da'\">\n <div style=\"text-align: center;\">\n <div style=\"font-size: 0.75em; margin-bottom: 2px;\" [style.color]=\"testResult.success ? '#155724' : '#721c24'\">STATUS</div>\n <div style=\"font-weight: 600;\" [style.color]=\"testResult.success ? '#155724' : '#721c24'\">\n {{ testResult.success ? 'Success' : 'Failed' }}\n </div>\n </div>\n @if (testResult.executionTimeMs) {\n <div style=\"text-align: center;\">\n <div style=\"font-size: 0.75em; margin-bottom: 2px;\" [style.color]=\"testResult.success ? '#155724' : '#721c24'\">EXECUTION TIME</div>\n <div style=\"font-weight: 600;\" [style.color]=\"testResult.success ? '#155724' : '#721c24'\">{{ testResult.executionTimeMs }}ms</div>\n </div>\n }\n <div style=\"text-align: center;\">\n <div style=\"font-size: 0.75em; margin-bottom: 2px;\" [style.color]=\"testResult.success ? '#155724' : '#721c24'\">ACTIONS</div>\n <button kendoButton fillMode=\"flat\" size=\"small\"\n (click)=\"saveResults()\"\n title=\"Save results to file\"\n style=\"min-width: auto; padding: 4px 8px;\">\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 style=\"margin: 0 0 8px 0; color: #495057; display: flex; align-items: center; gap: 6px;\">\n <i class=\"fa-solid fa-check-circle\" style=\"color: #28a745;\"></i>\n Template Output\n </h6>\n <div style=\"background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 4px; padding: 12px; font-family: 'Courier New', monospace; font-size: 0.9em; white-space: pre-wrap; overflow: auto; height: 150px;\">\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 style=\"margin: 0 0 8px 0; color: #dc3545; display: flex; align-items: center; gap: 6px;\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n Error Details\n </h6>\n <div style=\"background: #f8d7da; border: 1px solid #f5c6cb; border-radius: 4px; padding: 12px; color: #721c24; font-family: 'Courier New', monospace; font-size: 0.9em; white-space: pre-wrap; overflow: auto; height: 150px;\">{{ testResult.error }}</div>\n </div>\n }\n </div>\n </div>\n } @else {\n <div style=\"display: flex; align-items: center; justify-content: center; padding: 40px; color: #6c757d; flex: 1;\">\n <div style=\"text-align: center;\">\n <i class=\"fa-solid fa-play-circle\" style=\"font-size: 3em; margin-bottom: 12px; opacity: 0.3;\"></i>\n <p style=\"margin: 0;\">No test results yet. Run the template to see results here.</p>\n </div>\n </div>\n }\n </div>\n </kendo-expansionpanel>\n }\n </div>\n <!-- Dialog Actions -->\n <kendo-dialog-actions>\n <div style=\"display: flex; justify-content: space-between; align-items: center; width: 100%;\">\n <div>\n @if (hasUnsavedParameters) {\n <button kendoButton fillMode=\"outline\"\n themeColor=\"info\"\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 kendoButton fillMode=\"outline\" (click)=\"close()\">\n Close\n </button>\n @if (testResult) {\n <button kendoButton fillMode=\"outline\" themeColor=\"info\" (click)=\"saveResults()\">\n <i class=\"fa-solid fa-download\"></i> Save Results\n </button>\n }\n <button kendoButton themeColor=\"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 </kendo-dialog-actions>\n </kendo-dialog>\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\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 <kendo-dialog\n [minWidth]=\"600\"\n [width]=\"800\"\n [height]=\"700\"\n (close)=\"close()\"\n [title]=\"'Test Template: ' + (template?.Name || 'Unknown')\">\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 <kendo-expansionpanel\n [(expanded)]=\"parametersExpanded\"\n style=\"margin-bottom: 16px; flex-shrink: 0;\">\n <ng-template kendoExpansionPanelTitleDirective>\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\">\n {{ parameters.length }}\n </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 <kendo-textbox [(ngModel)]=\"param.key\"\n (ngModelChange)=\"onParameterChange()\"\n placeholder=\"Parameter name...\"\n [disabled]=\"isRunning\"\n style=\"font-family: 'Courier New', monospace; width: 100%;\">\n </kendo-textbox>\n }\n </div>\n <!-- Parameter Value -->\n <div class=\"param-value\">\n <kendo-textarea [(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%;\">\n </kendo-textarea>\n </div>\n <!-- Actions -->\n <div class=\"param-actions\">\n @if (!param.isFromTemplate && parameters.length > 1) {\n <button kendoButton fillMode=\"flat\"\n themeColor=\"error\"\n size=\"small\"\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 kendoButton fillMode=\"outline\"\n themeColor=\"success\"\n size=\"small\"\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 kendoButton themeColor=\"primary\" size=\"small\"\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 </kendo-expansionpanel>\n <!-- JSON Preview Section -->\n <kendo-expansionpanel\n [(expanded)]=\"jsonPreviewExpanded\"\n style=\"margin-bottom: 16px; flex-shrink: 0;\">\n <ng-template kendoExpansionPanelTitleDirective>\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 </kendo-expansionpanel>\n <!-- Test Results Section -->\n <kendo-expansionpanel\n [(expanded)]=\"resultsExpanded\"\n style=\"margin-bottom: 16px; flex: 1; display: flex; flex-direction: column;\">\n <ng-template kendoExpansionPanelTitleDirective>\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\">Success</span>\n } @else {\n <span class=\"result-badge-error\">Error</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 kendoButton fillMode=\"flat\" size=\"small\"\n (click)=\"saveResults()\"\n title=\"Save results to file\"\n style=\"min-width: auto; padding: 4px 8px;\">\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 </kendo-expansionpanel>\n }\n </div>\n <!-- Dialog Actions -->\n <kendo-dialog-actions>\n <div style=\"display: flex; justify-content: space-between; align-items: center; width: 100%;\">\n <div>\n @if (hasUnsavedParameters) {\n <button kendoButton fillMode=\"outline\"\n themeColor=\"info\"\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 kendoButton fillMode=\"outline\" (click)=\"close()\">\n Close\n </button>\n @if (testResult) {\n <button kendoButton fillMode=\"outline\" themeColor=\"info\" (click)=\"saveResults()\">\n <i class=\"fa-solid fa-download\"></i> Save Results\n </button>\n }\n <button kendoButton themeColor=\"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 </kendo-dialog-actions>\n </kendo-dialog>\n}\n"]}
|
|
@@ -524,11 +524,11 @@ export class TemplateParamsGridComponent {
|
|
|
524
524
|
i0.ɵɵconditional(ctx.editMode ? 24 : -1);
|
|
525
525
|
i0.ɵɵadvance(2);
|
|
526
526
|
i0.ɵɵconditional(ctx.editMode ? 26 : -1);
|
|
527
|
-
} }, dependencies: [i1.NgControlStatus, i1.FormControlDirective, i2.GridComponent, i2.ToolbarComponent, i2.GridToolbarFocusableDirective, i2.ColumnComponent, i2.FocusableDirective, i2.CellTemplateDirective, i2.EditTemplateDirective, i2.NoRecordsTemplateDirective, i2.EditCommandDirective, i2.CancelCommandDirective, i2.SaveCommandDirective, i2.RemoveCommandDirective, i2.AddCommandDirective, i3.TextBoxComponent, i3.TextAreaComponent, i3.SwitchComponent, i4.DropDownListComponent], styles: [".template-params-grid[_ngcontent-%COMP%] {\n padding: 20px;\n}\n\n.params-header[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.params-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color:
|
|
527
|
+
} }, dependencies: [i1.NgControlStatus, i1.FormControlDirective, i2.GridComponent, i2.ToolbarComponent, i2.GridToolbarFocusableDirective, i2.ColumnComponent, i2.FocusableDirective, i2.CellTemplateDirective, i2.EditTemplateDirective, i2.NoRecordsTemplateDirective, i2.EditCommandDirective, i2.CancelCommandDirective, i2.SaveCommandDirective, i2.RemoveCommandDirective, i2.AddCommandDirective, i3.TextBoxComponent, i3.TextAreaComponent, i3.SwitchComponent, i4.DropDownListComponent], styles: [".template-params-grid[_ngcontent-%COMP%] {\n padding: 20px;\n}\n\n.params-header[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.params-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n color: var(--mj-text-primary);\n font-size: 1.2em;\n}\n\n.params-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 8px;\n color: var(--mj-brand-primary);\n}\n\n.params-description[_ngcontent-%COMP%] {\n margin: 0;\n color: var(--mj-text-secondary);\n font-size: 0.9em;\n}\n\n.param-name[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.required-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n background-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n.required-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.6em;\n}\n\n.param-type[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-text-secondary);\n}\n\n.param-type[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.param-description[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 0.9em;\n line-height: 1.4;\n}\n\n.default-value[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-card);\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 0.85em;\n color: var(--mj-text-secondary);\n word-break: break-word;\n}\n\n.text-muted[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-style: italic;\n font-size: 0.9em;\n}\n\n.text-success[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.text-center[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.no-params-message[_ngcontent-%COMP%] {\n text-align: center;\n padding: 40px 20px;\n color: var(--mj-text-muted);\n}\n\n.no-params-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2em;\n margin-bottom: 10px;\n color: var(--mj-text-muted);\n}\n\n.no-params-message[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 5px 0;\n}\n\n\n\n.params-help[_ngcontent-%COMP%] {\n margin-top: 30px;\n padding: 20px;\n background-color: var(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.params-help[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 15px 0;\n color: var(--mj-text-primary);\n font-size: 1em;\n}\n\n.params-help[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n color: var(--mj-brand-primary);\n}\n\n.params-help[_ngcontent-%COMP%] ul[_ngcontent-%COMP%] {\n margin: 10px 0;\n padding-left: 25px;\n}\n\n.params-help[_ngcontent-%COMP%] li[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n color: var(--mj-text-secondary);\n font-size: 0.9em;\n}\n\n.params-help[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n}\n\n.help-note[_ngcontent-%COMP%] {\n margin-top: 15px;\n padding: 10px 15px;\n background-color: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-left: 4px solid var(--mj-brand-primary);\n border-radius: 4px;\n font-size: 0.9em;\n}\n\n.help-note[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n color: var(--mj-brand-primary);\n}\n\n.help-note[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface);\n padding: 2px 4px;\n border-radius: 3px;\n font-family: 'Courier New', monospace;\n color: var(--mj-status-error);\n}\n\n\n\n.k-grid-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n margin-right: 4px;\n}\n\n\n\n.k-invalid-msg[_ngcontent-%COMP%] {\n display: block;\n color: var(--mj-status-error);\n font-size: 0.85em;\n margin-top: 4px;\n}\n\n\n\n.k-grid[_ngcontent-%COMP%] .k-toolbar[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n padding: 12px;\n}\n\n.k-grid-header[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-card);\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n\n\n@media (max-width: 768px) {\n .template-params-grid[_ngcontent-%COMP%] {\n padding: 10px;\n }\n\n .params-help[_ngcontent-%COMP%] {\n padding: 15px;\n }\n}"] }); }
|
|
528
528
|
}
|
|
529
529
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TemplateParamsGridComponent, [{
|
|
530
530
|
type: Component,
|
|
531
|
-
args: [{ standalone: false, selector: 'mj-template-params-grid', template: "<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 <kendo-grid\n [data]=\"templateParams\"\n [loading]=\"isLoading\"\n [height]=\"400\"\n [pageable]=\"false\"\n [sortable]=\"true\"\n [resizable]=\"true\"\n (add)=\"addHandler($event)\"\n (edit)=\"editHandler($event)\"\n (cancel)=\"cancelHandler($event)\"\n (save)=\"saveHandler($event)\"\n (remove)=\"removeHandler($event)\">\n\n @if (editMode) {\n <kendo-grid-toolbar>\n <button kendoGridAddCommand type=\"button\" class=\"k-button k-button-md k-rounded-md k-button-solid k-button-solid-primary\">\n <i class=\"fa-solid fa-plus\"></i> Add Parameter\n </button>\n </kendo-grid-toolbar>\n }\n\n <kendo-grid-column field=\"Name\" title=\"Parameter Name\" [width]=\"200\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <div class=\"param-name\">\n <strong>{{ dataItem.Name }}</strong>\n @if (dataItem.IsRequired) {\n <span class=\"required-badge\">\n <i class=\"fa-solid fa-asterisk\"></i> Required\n </span>\n }\n </div>\n </ng-template>\n <ng-template kendoGridEditTemplate let-dataItem=\"dataItem\" let-formGroup=\"formGroup\">\n <kendo-textbox\n [formControl]=\"formGroup.get('name')\"\n placeholder=\"Enter parameter name...\"\n [style.width.%]=\"100\">\n </kendo-textbox>\n @if (formGroup.get('name')?.touched && formGroup.get('name')?.errors?.['required']) {\n <span class=\"k-invalid-msg\">\n Parameter name is required\n </span>\n }\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"Type\" title=\"Type\" [width]=\"140\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <div class=\"param-type\">\n <i class=\"fa-solid {{ getTypeIcon(dataItem.Type) }}\"></i>\n {{ dataItem.Type }}\n </div>\n </ng-template>\n <ng-template kendoGridEditTemplate let-dataItem=\"dataItem\" let-formGroup=\"formGroup\">\n <kendo-dropdownlist\n [formControl]=\"formGroup.get('type')\"\n [data]=\"typeOptions\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [style.width.%]=\"100\">\n </kendo-dropdownlist>\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"IsRequired\" title=\"Required\" [width]=\"100\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <div class=\"text-center\">\n @if (dataItem.IsRequired) {\n <i class=\"fa-solid fa-check text-success\"></i>\n }\n @if (!dataItem.IsRequired) {\n <i class=\"fa-solid fa-times text-muted\"></i>\n }\n </div>\n </ng-template>\n <ng-template kendoGridEditTemplate let-dataItem=\"dataItem\" let-formGroup=\"formGroup\">\n <kendo-switch [formControl]=\"formGroup.get('isRequired')\"></kendo-switch>\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"Description\" title=\"Description\" [width]=\"300\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <div class=\"param-description\">\n {{ dataItem.Description || '(No description)' }}\n </div>\n </ng-template>\n <ng-template kendoGridEditTemplate let-dataItem=\"dataItem\" let-formGroup=\"formGroup\">\n <kendo-textarea\n [formControl]=\"formGroup.get('description')\"\n placeholder=\"Enter parameter description...\"\n [rows]=\"2\"\n [style.width.%]=\"100\">\n </kendo-textarea>\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"DefaultValue\" title=\"Default Value\" [width]=\"200\">\n <ng-template kendoGridCellTemplate let-dataItem>\n @if (dataItem.DefaultValue) {\n <code class=\"default-value\">{{ dataItem.DefaultValue }}</code>\n }\n @if (!dataItem.DefaultValue) {\n <span class=\"text-muted\">(No default)</span>\n }\n </ng-template>\n <ng-template kendoGridEditTemplate let-dataItem=\"dataItem\" let-formGroup=\"formGroup\">\n <kendo-textarea\n [formControl]=\"formGroup.get('defaultValue')\"\n placeholder=\"Enter default value...\"\n [rows]=\"2\"\n [style.width.%]=\"100\">\n </kendo-textarea>\n </ng-template>\n </kendo-grid-column>\n\n @if (editMode) {\n <kendo-grid-column title=\"Actions\" [width]=\"120\">\n <ng-template kendoGridCellTemplate let-dataItem let-rowIndex=\"rowIndex\">\n @if (!isInEditMode(rowIndex)) {\n <button\n kendoGridEditCommand\n type=\"button\"\n class=\"k-button k-button-md k-rounded-md k-button-solid k-button-solid-base\"\n title=\"Edit parameter\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n }\n @if (!isInEditMode(rowIndex)) {\n <button\n kendoGridRemoveCommand\n type=\"button\"\n class=\"k-button k-button-md k-rounded-md k-button-solid k-button-solid-base\"\n title=\"Delete parameter\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n @if (isInEditMode(rowIndex)) {\n <button\n kendoGridSaveCommand\n type=\"button\"\n class=\"k-button k-button-md k-rounded-md k-button-solid k-button-solid-primary\"\n title=\"Save changes\">\n <i class=\"fa-solid fa-check\"></i>\n </button>\n }\n @if (isInEditMode(rowIndex)) {\n <button\n kendoGridCancelCommand\n type=\"button\"\n class=\"k-button k-button-md k-rounded-md k-button-solid k-button-solid-base\"\n title=\"Cancel changes\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </ng-template>\n </kendo-grid-column>\n }\n\n <ng-template kendoGridNoRecordsTemplate>\n <div class=\"no-params-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <p>No parameters defined for this template.</p>\n @if (editMode) {\n <p>Click \"Add Parameter\" to create your first parameter.</p>\n }\n </div>\n </ng-template>\n </kendo-grid>\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>", styles: [".template-params-grid {\n padding: 20px;\n}\n\n.params-header {\n margin-bottom: 20px;\n}\n\n.params-header h3 {\n margin: 0 0 8px 0;\n color: #333;\n font-size: 1.2em;\n}\n\n.params-header h3 i {\n margin-right: 8px;\n color: #007bff;\n}\n\n.params-description {\n margin: 0;\n color: #666;\n font-size: 0.9em;\n}\n\n.param-name {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.required-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n background-color: #dc3545;\n color: white;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n.required-badge i {\n font-size: 0.6em;\n}\n\n.param-type {\n display: flex;\n align-items: center;\n gap: 6px;\n color: #495057;\n}\n\n.param-type i {\n color: #6c757d;\n}\n\n.param-description {\n color: #666;\n font-size: 0.9em;\n line-height: 1.4;\n}\n\n.default-value {\n background-color: #f8f9fa;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 0.85em;\n color: #495057;\n word-break: break-word;\n}\n\n.text-muted {\n color: #6c757d;\n font-style: italic;\n font-size: 0.9em;\n}\n\n.text-success {\n color: #28a745;\n}\n\n.text-center {\n text-align: center;\n}\n\n.no-params-message {\n text-align: center;\n padding: 40px 20px;\n color: #6c757d;\n}\n\n.no-params-message i {\n font-size: 2em;\n margin-bottom: 10px;\n color: #adb5bd;\n}\n\n.no-params-message p {\n margin: 5px 0;\n}\n\n/* Help Section */\n.params-help {\n margin-top: 30px;\n padding: 20px;\n background-color: #f8f9fa;\n border-radius: 8px;\n border: 1px solid #dee2e6;\n}\n\n.params-help h4 {\n margin: 0 0 15px 0;\n color: #333;\n font-size: 1em;\n}\n\n.params-help h4 i {\n margin-right: 6px;\n color: #17a2b8;\n}\n\n.params-help ul {\n margin: 10px 0;\n padding-left: 25px;\n}\n\n.params-help li {\n margin-bottom: 8px;\n color: #495057;\n font-size: 0.9em;\n}\n\n.params-help strong {\n color: #333;\n}\n\n.help-note {\n margin-top: 15px;\n padding: 10px 15px;\n background-color: #e7f3ff;\n border-left: 4px solid #007bff;\n border-radius: 4px;\n font-size: 0.9em;\n}\n\n.help-note i {\n margin-right: 6px;\n color: #007bff;\n}\n\n.help-note code {\n background-color: #fff;\n padding: 2px 4px;\n border-radius: 3px;\n font-family: 'Courier New', monospace;\n color: #d73a49;\n}\n\n/* Grid action buttons */\n.k-grid-content button {\n margin-right: 4px;\n}\n\n/* Form validation */\n.k-invalid-msg {\n display: block;\n color: #dc3545;\n font-size: 0.85em;\n margin-top: 4px;\n}\n\n/* Kendo overrides for consistent styling */\n.k-grid .k-toolbar {\n background-color: #f8f9fa;\n border-bottom: 1px solid #dee2e6;\n padding: 12px;\n}\n\n.k-grid-header th {\n background-color: #f8f9fa;\n font-weight: 600;\n color: #495057;\n}\n\n/* Responsive adjustments */\n@media (max-width: 768px) {\n .template-params-grid {\n padding: 10px;\n }\n \n .params-help {\n padding: 15px;\n }\n}"] }]
|
|
531
|
+
args: [{ standalone: false, selector: 'mj-template-params-grid', template: "<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 <kendo-grid\n [data]=\"templateParams\"\n [loading]=\"isLoading\"\n [height]=\"400\"\n [pageable]=\"false\"\n [sortable]=\"true\"\n [resizable]=\"true\"\n (add)=\"addHandler($event)\"\n (edit)=\"editHandler($event)\"\n (cancel)=\"cancelHandler($event)\"\n (save)=\"saveHandler($event)\"\n (remove)=\"removeHandler($event)\">\n\n @if (editMode) {\n <kendo-grid-toolbar>\n <button kendoGridAddCommand type=\"button\" class=\"k-button k-button-md k-rounded-md k-button-solid k-button-solid-primary\">\n <i class=\"fa-solid fa-plus\"></i> Add Parameter\n </button>\n </kendo-grid-toolbar>\n }\n\n <kendo-grid-column field=\"Name\" title=\"Parameter Name\" [width]=\"200\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <div class=\"param-name\">\n <strong>{{ dataItem.Name }}</strong>\n @if (dataItem.IsRequired) {\n <span class=\"required-badge\">\n <i class=\"fa-solid fa-asterisk\"></i> Required\n </span>\n }\n </div>\n </ng-template>\n <ng-template kendoGridEditTemplate let-dataItem=\"dataItem\" let-formGroup=\"formGroup\">\n <kendo-textbox\n [formControl]=\"formGroup.get('name')\"\n placeholder=\"Enter parameter name...\"\n [style.width.%]=\"100\">\n </kendo-textbox>\n @if (formGroup.get('name')?.touched && formGroup.get('name')?.errors?.['required']) {\n <span class=\"k-invalid-msg\">\n Parameter name is required\n </span>\n }\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"Type\" title=\"Type\" [width]=\"140\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <div class=\"param-type\">\n <i class=\"fa-solid {{ getTypeIcon(dataItem.Type) }}\"></i>\n {{ dataItem.Type }}\n </div>\n </ng-template>\n <ng-template kendoGridEditTemplate let-dataItem=\"dataItem\" let-formGroup=\"formGroup\">\n <kendo-dropdownlist\n [formControl]=\"formGroup.get('type')\"\n [data]=\"typeOptions\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [style.width.%]=\"100\">\n </kendo-dropdownlist>\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"IsRequired\" title=\"Required\" [width]=\"100\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <div class=\"text-center\">\n @if (dataItem.IsRequired) {\n <i class=\"fa-solid fa-check text-success\"></i>\n }\n @if (!dataItem.IsRequired) {\n <i class=\"fa-solid fa-times text-muted\"></i>\n }\n </div>\n </ng-template>\n <ng-template kendoGridEditTemplate let-dataItem=\"dataItem\" let-formGroup=\"formGroup\">\n <kendo-switch [formControl]=\"formGroup.get('isRequired')\"></kendo-switch>\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"Description\" title=\"Description\" [width]=\"300\">\n <ng-template kendoGridCellTemplate let-dataItem>\n <div class=\"param-description\">\n {{ dataItem.Description || '(No description)' }}\n </div>\n </ng-template>\n <ng-template kendoGridEditTemplate let-dataItem=\"dataItem\" let-formGroup=\"formGroup\">\n <kendo-textarea\n [formControl]=\"formGroup.get('description')\"\n placeholder=\"Enter parameter description...\"\n [rows]=\"2\"\n [style.width.%]=\"100\">\n </kendo-textarea>\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"DefaultValue\" title=\"Default Value\" [width]=\"200\">\n <ng-template kendoGridCellTemplate let-dataItem>\n @if (dataItem.DefaultValue) {\n <code class=\"default-value\">{{ dataItem.DefaultValue }}</code>\n }\n @if (!dataItem.DefaultValue) {\n <span class=\"text-muted\">(No default)</span>\n }\n </ng-template>\n <ng-template kendoGridEditTemplate let-dataItem=\"dataItem\" let-formGroup=\"formGroup\">\n <kendo-textarea\n [formControl]=\"formGroup.get('defaultValue')\"\n placeholder=\"Enter default value...\"\n [rows]=\"2\"\n [style.width.%]=\"100\">\n </kendo-textarea>\n </ng-template>\n </kendo-grid-column>\n\n @if (editMode) {\n <kendo-grid-column title=\"Actions\" [width]=\"120\">\n <ng-template kendoGridCellTemplate let-dataItem let-rowIndex=\"rowIndex\">\n @if (!isInEditMode(rowIndex)) {\n <button\n kendoGridEditCommand\n type=\"button\"\n class=\"k-button k-button-md k-rounded-md k-button-solid k-button-solid-base\"\n title=\"Edit parameter\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n }\n @if (!isInEditMode(rowIndex)) {\n <button\n kendoGridRemoveCommand\n type=\"button\"\n class=\"k-button k-button-md k-rounded-md k-button-solid k-button-solid-base\"\n title=\"Delete parameter\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n @if (isInEditMode(rowIndex)) {\n <button\n kendoGridSaveCommand\n type=\"button\"\n class=\"k-button k-button-md k-rounded-md k-button-solid k-button-solid-primary\"\n title=\"Save changes\">\n <i class=\"fa-solid fa-check\"></i>\n </button>\n }\n @if (isInEditMode(rowIndex)) {\n <button\n kendoGridCancelCommand\n type=\"button\"\n class=\"k-button k-button-md k-rounded-md k-button-solid k-button-solid-base\"\n title=\"Cancel changes\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </ng-template>\n </kendo-grid-column>\n }\n\n <ng-template kendoGridNoRecordsTemplate>\n <div class=\"no-params-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <p>No parameters defined for this template.</p>\n @if (editMode) {\n <p>Click \"Add Parameter\" to create your first parameter.</p>\n }\n </div>\n </ng-template>\n </kendo-grid>\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>", styles: [".template-params-grid {\n padding: 20px;\n}\n\n.params-header {\n margin-bottom: 20px;\n}\n\n.params-header h3 {\n margin: 0 0 8px 0;\n color: var(--mj-text-primary);\n font-size: 1.2em;\n}\n\n.params-header h3 i {\n margin-right: 8px;\n color: var(--mj-brand-primary);\n}\n\n.params-description {\n margin: 0;\n color: var(--mj-text-secondary);\n font-size: 0.9em;\n}\n\n.param-name {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.required-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n background-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 0.75em;\n font-weight: 500;\n}\n\n.required-badge i {\n font-size: 0.6em;\n}\n\n.param-type {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-text-secondary);\n}\n\n.param-type i {\n color: var(--mj-text-muted);\n}\n\n.param-description {\n color: var(--mj-text-secondary);\n font-size: 0.9em;\n line-height: 1.4;\n}\n\n.default-value {\n background-color: var(--mj-bg-surface-card);\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 0.85em;\n color: var(--mj-text-secondary);\n word-break: break-word;\n}\n\n.text-muted {\n color: var(--mj-text-muted);\n font-style: italic;\n font-size: 0.9em;\n}\n\n.text-success {\n color: var(--mj-status-success);\n}\n\n.text-center {\n text-align: center;\n}\n\n.no-params-message {\n text-align: center;\n padding: 40px 20px;\n color: var(--mj-text-muted);\n}\n\n.no-params-message i {\n font-size: 2em;\n margin-bottom: 10px;\n color: var(--mj-text-muted);\n}\n\n.no-params-message p {\n margin: 5px 0;\n}\n\n/* Help Section */\n.params-help {\n margin-top: 30px;\n padding: 20px;\n background-color: var(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n\n.params-help h4 {\n margin: 0 0 15px 0;\n color: var(--mj-text-primary);\n font-size: 1em;\n}\n\n.params-help h4 i {\n margin-right: 6px;\n color: var(--mj-brand-primary);\n}\n\n.params-help ul {\n margin: 10px 0;\n padding-left: 25px;\n}\n\n.params-help li {\n margin-bottom: 8px;\n color: var(--mj-text-secondary);\n font-size: 0.9em;\n}\n\n.params-help strong {\n color: var(--mj-text-primary);\n}\n\n.help-note {\n margin-top: 15px;\n padding: 10px 15px;\n background-color: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-left: 4px solid var(--mj-brand-primary);\n border-radius: 4px;\n font-size: 0.9em;\n}\n\n.help-note i {\n margin-right: 6px;\n color: var(--mj-brand-primary);\n}\n\n.help-note code {\n background-color: var(--mj-bg-surface);\n padding: 2px 4px;\n border-radius: 3px;\n font-family: 'Courier New', monospace;\n color: var(--mj-status-error);\n}\n\n/* Grid action buttons */\n.k-grid-content button {\n margin-right: 4px;\n}\n\n/* Form validation */\n.k-invalid-msg {\n display: block;\n color: var(--mj-status-error);\n font-size: 0.85em;\n margin-top: 4px;\n}\n\n/* Kendo overrides for consistent styling */\n.k-grid .k-toolbar {\n background-color: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n padding: 12px;\n}\n\n.k-grid-header th {\n background-color: var(--mj-bg-surface-card);\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n/* Responsive adjustments */\n@media (max-width: 768px) {\n .template-params-grid {\n padding: 10px;\n }\n\n .params-help {\n padding: 15px;\n }\n}\n"] }]
|
|
532
532
|
}], () => [], { template: [{
|
|
533
533
|
type: Input
|
|
534
534
|
}], editMode: [{
|