@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":"templates-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Templates/templates-form.component.ts","../../../../src/lib/custom/Templates/templates-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ViewChild, AfterViewInit, ChangeDetectorRef } from '@angular/core';\nimport { MJTemplateEntity, MJTemplateContentEntity, MJTemplateCategoryEntity } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseFormComponent, CUSTOM_LAYOUT_TOOLBAR_CONFIG } from '@memberjunction/ng-base-forms';\nimport { MJTemplateFormComponent } from '../../generated/Entities/MJTemplate/mjtemplate.form.component';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { TemplateEngineBase } from '@memberjunction/templates-base-types';\nimport { Subject } from 'rxjs';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { LanguageDescription } from '@codemirror/language';\nimport { languages } from '@codemirror/language-data';\nimport { CodeEditorComponent } from '@memberjunction/ng-code-editor';\nimport { TemplateEditorConfig } from '../../shared/components/template-editor.component';\n\n@RegisterClass(BaseFormComponent, 'MJ: Templates') \n@Component({\n standalone: false,\n selector: 'mj-templates-form',\n templateUrl: './templates-form.component.html',\n styleUrls: ['../../../shared/form-styles.css', './templates-form.component.css']\n})\nexport class MJTemplateFormComponentExtended extends MJTemplateFormComponent implements OnInit, OnDestroy, AfterViewInit {\n public record!: MJTemplateEntity;\n public readonly toolbarConfig = CUSTOM_LAYOUT_TOOLBAR_CONFIG;\n\n /** Custom-layout Template form looks best full-width on first open. */\n public override getDefaultFormWidthMode(): 'centered' | 'full-width' { return 'full-width'; }\n public templateContents: MJTemplateContentEntity[] = [];\n public selectedContentIndex: number = 0;\n public isAddingNewContent: boolean = false;\n public newTemplateContent: MJTemplateContentEntity | null = null;\n public hasUnsavedChanges: boolean = false;\n public templateInfoExpanded: boolean = true;\n public templateContentsExpanded: boolean = true;\n public categoryOptions: Array<{text: string, value: string}> = [\n { text: 'Select Category...', value: '' },\n // TODO: Load from database\n ];\n public contentTypeOptions: Array<{text: string, value: string}> = [];\n public supportedLanguages: LanguageDescription[] = languages;\n \n @ViewChild('codeEditor') codeEditor: CodeEditorComponent | null = null;\n private isUpdatingEditorValue = false;\n public isRunningTemplate = false;\n public templateTestResult: string | null = null;\n public templateTestError: string | null = null;\n public showParamDialog = false;\n \n // Template editor configuration for shared component\n public templateEditorConfig: TemplateEditorConfig = {\n allowEdit: true,\n showRunButton: true,\n compactMode: false\n };\n \n private destroy$ = new Subject<void>();\n private activeTimeouts: number[] = [];\n\n async ngOnInit() {\n await super.ngOnInit();\n await this.loadTemplateContents();\n await this.loadCategories();\n this.loadContentTypes();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n \n // Clean up any active timeouts\n this.activeTimeouts.forEach(timeoutId => clearTimeout(timeoutId));\n this.activeTimeouts.length = 0;\n }\n\n ngAfterViewInit() {\n // Initial sync when view is ready\n this.syncEditorValue();\n }\n\n async loadTemplateContents() {\n if (this.record && this.record.ID) {\n try {\n const rv = new RunView();\n const results = await rv.RunView<MJTemplateContentEntity>({\n EntityName: 'MJ: Template Contents',\n ExtraFilter: `TemplateID='${this.record.ID}'`,\n OrderBy: 'Priority ASC, __mj_CreatedAt ASC',\n ResultType: 'entity_object'\n });\n \n this.templateContents = results.Results;\n \n // If we have contents but no selection, select the first one\n if (this.templateContents.length > 0 && this.selectedContentIndex === 0) {\n this.selectedContentIndex = 0;\n }\n \n // If no template contents exist, create a default one for single-content optimization\n if (this.templateContents.length === 0) {\n await this.createDefaultTemplateContent();\n }\n\n // Entity change tracking is handled automatically by BaseEntity\n \n // Sync editor value after loading content\n this.syncEditorValue();\n } catch (error) {\n console.error('Error loading template contents:', error);\n }\n }\n }\n\n async createDefaultTemplateContent() {\n const md = new Metadata();\n const defaultContent = await md.GetEntityObject<MJTemplateContentEntity>('MJ: Template Contents');\n defaultContent.TemplateID = this.record.ID;\n defaultContent.Priority = 1;\n defaultContent.IsActive = true;\n \n // Set default to first real content type (skip \"Select Type...\" if it exists)\n const validContentTypes = this.contentTypeOptions.filter(option => option.value !== '');\n if (validContentTypes.length > 0) {\n defaultContent.TypeID = validContentTypes[0].value;\n }\n \n this.templateContents = [defaultContent];\n this.selectedContentIndex = 0;\n \n // Sync editor value after creating default content\n this.syncEditorValue();\n }\n\n selectTemplateContent(index: number, confirmSwitch: boolean = true) {\n // If we're adding new content and user clicks on existing content, ask for confirmation\n if (this.isAddingNewContent && confirmSwitch) {\n if (!confirm('You have unsaved changes to a new content version. Are you sure you want to switch? Your changes will be lost.')) {\n return;\n }\n }\n \n if (index >= 0 && index < this.templateContents.length) {\n this.selectedContentIndex = index;\n this.isAddingNewContent = false;\n // Don't clear newTemplateContent to preserve the work in progress\n \n // Sync editor value when switching content\n this.syncEditorValue();\n }\n }\n\n async loadCategories() {\n try {\n const rv = new RunView();\n const results = await rv.RunView({\n EntityName: 'MJ: Template Categories' \n });\n \n this.categoryOptions = [\n { text: 'Select Category...', value: '' },\n ...results.Results.map((cat: any) => ({\n text: cat.Name,\n value: cat.ID\n }))\n ];\n } catch (error) {\n console.error('Error loading categories:', error);\n this.categoryOptions = [{ text: 'Select Category...', value: '' }];\n }\n }\n\n loadContentTypes() {\n try {\n // Get content types from TemplateEngine cache\n const contentTypes = TemplateEngineBase.Instance.TemplateContentTypes;\n this.contentTypeOptions = [\n { text: 'Select Type...', value: '' },\n ...contentTypes.map(ct => ({\n text: ct.Name,\n value: ct.ID\n }))\n ];\n } catch (error) {\n console.error('Error loading content types:', error);\n // Fallback to basic types\n this.contentTypeOptions = [\n { text: 'Select Type...', value: '' },\n { text: 'HTML', value: 'HTML' },\n { text: 'Plain Text', value: 'Text' },\n { text: 'Markdown', value: 'Markdown' }\n ];\n }\n }\n\n async onCategoryChange(value: string) {\n // If it's a new category (string but not in existing options)\n if (value && !this.categoryOptions.find(opt => opt.value === value)) {\n // Check for duplicate category names (case-insensitive, trimmed)\n if (this.isDuplicateCategory(value)) {\n const existingCategory = this.categoryOptions.find(option => \n option.text && option.text.trim().toLowerCase() === value.trim().toLowerCase()\n );\n if (existingCategory) {\n // Use the existing category instead\n this.record.CategoryID = existingCategory.value;\n MJNotificationService.Instance.CreateSimpleNotification(\n `Category \"${existingCategory.text}\" already exists. Using existing category.`, \n 'warning'\n );\n }\n return;\n }\n\n try {\n // Create new category with trimmed name\n const md = new Metadata();\n const newCategory = await md.GetEntityObject<MJTemplateCategoryEntity>('MJ: Template Categories');\n newCategory.Name = value.trim();\n newCategory.UserID = this.record.UserID || md.CurrentUser.ID;\n const saved = await newCategory.Save();\n \n if (saved) {\n // Add to options and set the ID\n this.categoryOptions.push({\n text: newCategory.Name,\n value: newCategory.ID\n });\n this.record.CategoryID = newCategory.ID;\n MJNotificationService.Instance.CreateSimpleNotification(\n `New category \"${newCategory.Name}\" created successfully.`, \n 'success'\n );\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to create new category. ${newCategory.LatestResult?.CompleteMessage || ''}`, \n 'error'\n );\n }\n } catch (error) {\n console.error('Error creating new category:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error creating new category. Please try again.', \n 'error'\n );\n }\n }\n }\n\n async addNewTemplateContent() {\n const md = new Metadata();\n this.newTemplateContent = await md.GetEntityObject<MJTemplateContentEntity>('MJ: Template Contents');\n this.newTemplateContent.TemplateID = this.record.ID;\n this.newTemplateContent.Priority = this.templateContents.length + 1;\n this.newTemplateContent.IsActive = true;\n \n // Set default to first real content type (skip \"Select Type...\" if it exists)\n const validContentTypes = this.contentTypeOptions.filter(option => option.value !== '');\n if (validContentTypes.length > 0) {\n this.newTemplateContent.TypeID = validContentTypes[0].value;\n }\n this.newTemplateContent.TemplateText = '';\n \n // Add immediately to the array\n this.templateContents.push(this.newTemplateContent);\n this.selectedContentIndex = this.templateContents.length - 1;\n this.isAddingNewContent = true;\n \n // Sync editor value when adding new content\n this.syncEditorValue();\n }\n\n cancelNewTemplateContent() {\n this.isAddingNewContent = false;\n this.newTemplateContent = null;\n }\n\n async deleteTemplateContent(index: number) {\n if (index >= 0 && index < this.templateContents.length) {\n const contentToDelete = this.templateContents[index];\n\n if (contentToDelete.ID) {\n try {\n const result = await contentToDelete.Delete();\n if (result) {\n this.templateContents.splice(index, 1);\n \n // Adjust selected index if necessary\n if (this.selectedContentIndex >= this.templateContents.length) {\n this.selectedContentIndex = Math.max(0, this.templateContents.length - 1);\n }\n \n // If no contents remain, create a default one\n if (this.templateContents.length === 0) {\n await this.createDefaultTemplateContent();\n }\n } else {\n console.error('Delete returned false');\n MJNotificationService.Instance.CreateSimpleNotification(`Failed to delete template content. ${contentToDelete.LatestResult.CompleteMessage}`, 'error');\n }\n } catch (error) {\n console.error('Error deleting template content:', error);\n }\n } else {\n // Not saved yet, just remove from array\n this.templateContents.splice(index, 1);\n if (this.selectedContentIndex >= this.templateContents.length) {\n this.selectedContentIndex = Math.max(0, this.templateContents.length - 1);\n }\n \n // Reset adding new content state if we're deleting the new content\n if (this.isAddingNewContent && index === this.templateContents.length) {\n this.isAddingNewContent = false;\n this.newTemplateContent = null;\n }\n }\n } else {\n console.error('Invalid index for deletion:', index);\n }\n }\n\n get currentTemplateContent(): MJTemplateContentEntity | null {\n if (this.isAddingNewContent) {\n return this.newTemplateContent;\n }\n return this.templateContents[this.selectedContentIndex] || null;\n }\n\n get hasMultipleContents(): boolean {\n return this.templateContents.length > 1 || this.isAddingNewContent;\n }\n\n onContentTypeChange() {\n // Content type changes just modify the current content, no new record creation\n this.updateUnsavedChangesFlag();\n }\n\n onContentChange() {\n this.updateUnsavedChangesFlag();\n }\n\n /**\n * Updates the hasUnsavedChanges flag based on entity dirty states\n */\n private updateUnsavedChangesFlag() {\n this.hasUnsavedChanges = this.templateContents.some(content => content.Dirty) || \n this.isAddingNewContent ||\n this.record?.Dirty || false;\n }\n\n onTemplateTextChange(event: any) {\n if (this.isUpdatingEditorValue) {\n // Ignore change events when we're programmatically updating the editor\n return;\n }\n \n if (this.currentTemplateContent) {\n // Extract value from event - might be event.target.value or just event depending on component\n const value = typeof event === 'string' ? event : (event.target?.value || event);\n this.currentTemplateContent.TemplateText = value;\n // hasUnsavedChanges is automatically handled by entity's IsDirty flag\n this.updateUnsavedChangesFlag();\n }\n }\n\n /**\n * Helper method to track setTimeout calls for cleanup\n */\n private setTrackedTimeout(callback: () => void, delay: number): number {\n const timeoutId = setTimeout(() => {\n // Remove from tracking when it executes\n const index = this.activeTimeouts.indexOf(timeoutId);\n if (index > -1) {\n this.activeTimeouts.splice(index, 1);\n }\n callback();\n }, delay) as any as number;\n this.activeTimeouts.push(timeoutId);\n return timeoutId;\n }\n\n /**\n * Manually sync the editor value without triggering change events\n */\n private syncEditorValue() {\n // Use Promise.resolve() to wait for the next microtask after any pending changes\n Promise.resolve().then(() => {\n // Then tracked setTimeout for the next macrotask to ensure DOM is updated\n this.setTrackedTimeout(() => {\n if (!this.codeEditor) {\n return;\n }\n \n this.isUpdatingEditorValue = true;\n const newValue = this.currentTemplateContent?.TemplateText || '';\n \n // Use the setValue method from mj-code-editor component\n this.codeEditor.setValue(newValue); \n this.isUpdatingEditorValue = false;\n }, 0);\n });\n }\n\n async saveTemplateContents(): Promise<boolean> {\n try {\n // Save all template contents that have changes\n for (const content of this.templateContents) {\n content.TemplateID = this.record.ID; // Ensure FK is set\n if (content.Dirty || !content.ID) {\n const contentResult = await content.Save();\n if (!contentResult) {\n console.error('Failed to save template content:', content);\n return false;\n }\n }\n }\n\n this.isAddingNewContent = false;\n this.newTemplateContent = null;\n this.updateUnsavedChangesFlag(); // Update based on current entity states\n return true;\n } catch (error) {\n console.error('Error saving template contents:', error);\n return false;\n }\n }\n\n async SaveRecord(StopEditModeAfterSave: boolean = true): Promise<boolean> {\n // Check if we need to create a new category first\n if (this.record.CategoryID && !this.categoryOptions.find(opt => opt.value === this.record.CategoryID)) {\n // Check for duplicate category names (case-insensitive, trimmed)\n if (this.isDuplicateCategory(this.record.CategoryID)) {\n const existingCategory = this.categoryOptions.find(option => \n option.text && option.text.trim().toLowerCase() === this.record.CategoryID?.trim().toLowerCase()\n );\n if (existingCategory) {\n // Use the existing category instead\n this.record.CategoryID = existingCategory.value;\n MJNotificationService.Instance.CreateSimpleNotification(\n `Category \"${existingCategory.text}\" already exists. Using existing category.`, \n 'warning'\n );\n }\n } else {\n try {\n // Create new category with trimmed name\n const md = new Metadata();\n const newCategory = await md.GetEntityObject<MJTemplateCategoryEntity>('MJ: Template Categories');\n newCategory.Name = this.record.CategoryID.trim(); // CategoryID contains the new category name, trim it\n newCategory.UserID = this.record.UserID || md.CurrentUser.ID; \n const saved = await newCategory.Save();\n \n if (saved) {\n // Add to options and set the ID\n this.categoryOptions.push({\n text: newCategory.Name,\n value: newCategory.ID\n });\n this.record.CategoryID = newCategory.ID;\n } else {\n console.error('Failed to create new category');\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to create new category. ${newCategory.LatestResult?.CompleteMessage || ''}`, \n 'error'\n );\n return false;\n }\n } catch (error) {\n console.error('Error creating new category during save:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error creating new category during save. Please try again.', \n 'error'\n );\n return false;\n }\n }\n }\n\n // Call the parent save method to save the template\n // Before saving, if a new record, make sure the UserID is set\n if (!this.record.IsSaved && !this.record.UserID) {\n const md = new Metadata();\n this.record.UserID = md.CurrentUser.ID;\n }\n const templateSaved = await super.SaveRecord(StopEditModeAfterSave);\n \n if (templateSaved) {\n // Then save all template contents\n return await this.saveTemplateContents();\n }\n \n return false;\n }\n\n getContentTypeDisplayText(typeId: string): string {\n if (!typeId) return '-';\n const option = this.contentTypeOptions.find(opt => opt.value === typeId);\n return option ? option.text : typeId;\n }\n\n getEditorLanguage(): string {\n if (!this.currentTemplateContent?.TypeID) {\n return 'jinja2'; // default to jinja2 for template syntax (compatible with Nunjucks)\n }\n\n const contentType = this.currentTemplateContent.TypeID.toLowerCase();\n \n // Map content types to CodeMirror language modes\n switch (contentType) {\n case 'html':\n return 'jinja2'; // Use jinja2 for HTML templates to get template syntax highlighting\n case 'markdown':\n case 'md':\n return 'markdown';\n case 'javascript':\n case 'js':\n return 'javascript';\n case 'css':\n return 'css';\n case 'json':\n return 'json';\n case 'xml':\n return 'xml';\n case 'sql':\n return 'sql';\n case 'text':\n case 'plain':\n default:\n return 'jinja2'; // Default to jinja2 since templates often contain template syntax\n }\n }\n\n private isDuplicateCategory(categoryName: string): boolean {\n const normalizedName = categoryName.trim().toLowerCase();\n return this.categoryOptions.some(option => \n option.text && option.text.trim().toLowerCase() === normalizedName\n );\n }\n\n /**\n * Test run the current template using the parameter dialog\n */\n async runTemplate() {\n if (!this.record?.IsSaved || !this.currentTemplateContent) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please save the template before running it.', \n 'warning'\n );\n return;\n }\n\n // Save any unsaved changes first\n if (this.hasUnsavedChanges) {\n const saveResult = await this.SaveRecord(false); // Don't exit edit mode\n if (!saveResult) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to save template changes.', \n 'error'\n );\n return;\n }\n }\n\n // Show the parameter dialog\n this.showParamDialog = true;\n }\n\n /**\n * Handle parameter dialog close\n */\n onParamDialogClose() {\n this.showParamDialog = false;\n }\n\n getContentTypeOptionsForContent(): Array<{text: string, value: string}> {\n // Always exclude \"Select Type...\" option for all content\n return this.contentTypeOptions.filter(option => option.value !== '');\n }\n\n /**\n * Handles template content changes from the shared editor\n */\n public onSharedTemplateContentChange(content: MJTemplateContentEntity[]) {\n this.templateContents = content;\n this.updateUnsavedChangesFlag();\n }\n\n /**\n * Handles template run requests from the shared editor\n */\n public onSharedTemplateRun(template: MJTemplateEntity) {\n this.runTemplate();\n }\n\n} \n","@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n [ToolbarConfig]=\"toolbarConfig\"\n [WidthMode]=\"'full-width'\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n <form class=\"record-form\" #form=\"ngForm\" style=\"display: flex; flex-direction: column; height: 100%; overflow: hidden;\">\n\n <!-- Main Content Area -->\n <div class=\"template-main-area\" style=\"display: flex; flex-direction: column; flex: 1; min-height: 0; overflow-y: auto;\">\n\n <!-- Header Section -->\n <div class=\"template-header-area\">\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; gap: 20px;\">\n\n <!-- Left: Template Info -->\n <div style=\"flex: 1; min-width: 0;\">\n <div style=\"display: flex; align-items: center; gap: 12px; margin-bottom: 8px;\">\n <i class=\"fa-solid fa-file-code template-icon\"></i>\n @if (EditMode) {\n <input type=\"text\" class=\"mj-input\"\n [(ngModel)]=\"record.Name\"\n name=\"templateName\"\n placeholder=\"Enter template name...\"\n style=\"font-size: 1.2em; font-weight: 600; min-width: 300px; flex: 1;\" />\n } @else {\n <h4>{{ record.Name || 'Unnamed Template' }}</h4>\n @if (record.IsActive) {\n <span class=\"active-badge\">\n <i class=\"fa-solid fa-check-circle\"></i> Active\n </span>\n } @else {\n <span class=\"inactive-badge\">\n <i class=\"fa-solid fa-pause-circle\"></i> Inactive\n </span>\n }\n }\n </div>\n\n <!-- Category and Active toggle when in edit mode -->\n @if (EditMode) {\n <div style=\"display: flex; gap: 16px; margin-bottom: 12px; flex-wrap: wrap; align-items: center;\">\n <div>\n <label class=\"field-label\">Category</label>\n <mj-combobox [(ngModel)]=\"record.CategoryID\"\n name=\"categoryId\"\n [Data]=\"categoryOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [AllowCustom]=\"true\"\n (ValueChange)=\"onCategoryChange($any($event))\"\n Placeholder=\"Select or enter new category...\"\n style=\"width: 250px;\">\n </mj-combobox>\n </div>\n <div>\n <label class=\"field-label\">Active</label>\n <mj-switch [(ngModel)]=\"record.IsActive\" name=\"isActive\"></mj-switch>\n </div>\n </div>\n }\n\n @if (EditMode) {\n <textarea class=\"mj-textarea\"\n [(ngModel)]=\"record.Description\"\n name=\"description\"\n [rows]=\"2\"\n placeholder=\"Enter template description...\"\n style=\"width: 100%; max-width: 600px; margin-bottom: 12px;\"></textarea>\n } @else if (record.Description) {\n <p class=\"description-text\">{{ record.Description }}</p>\n }\n\n <!-- Quick Info Row -->\n <div style=\"display: flex; align-items: center; gap: 16px; flex-wrap: wrap;\">\n @if (record.Category) {\n <div style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-folder meta-icon\"></i>\n <span class=\"meta-label\">Category:</span>\n <span class=\"meta-value\">{{ record.Category }}</span>\n </div>\n }\n\n <div style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-file-lines meta-icon\"></i>\n <span class=\"meta-label\">Contents:</span>\n <span class=\"meta-value\">{{ templateContents.length }}</span>\n </div>\n </div>\n </div>\n\n <!-- Right: Action Buttons -->\n <div style=\"display: flex; flex-direction: column; gap: 8px; align-items: flex-end;\">\n @if (record.IsSaved) {\n <button class=\"run-template-btn\"\n (click)=\"runTemplate()\"\n title=\"Run Template\">\n <i class=\"fa-solid fa-play\"></i> Run\n </button>\n }\n </div>\n </div>\n </div>\n\n <!-- Configuration Sections with Expansion Panels -->\n <div class=\"configuration-sections\">\n\n <!-- Template Editor Section -->\n <mj-accordion-panel\n [Expanded]=\"true\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-code\"></i>\n Template Editor\n @if (templateContents.length > 0) {\n <span class=\"count-badge\">{{ templateContents.length }}</span>\n }\n </span>\n </ng-template>\n\n <div style=\"padding: 8px; min-height: 400px;\">\n <mj-template-editor\n [template]=\"record\"\n [config]=\"templateEditorConfig\"\n (contentChange)=\"onSharedTemplateContentChange($event)\"\n (runTemplate)=\"onSharedTemplateRun($event)\"\n style=\"height: 100%; display: block;\">\n </mj-template-editor>\n </div>\n </mj-accordion-panel>\n\n <!-- Details Section -->\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-cogs\"></i>\n Details\n </span>\n </ng-template>\n\n <div style=\"padding: 16px;\">\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 20px;\">\n <!-- Left Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"UserPrompt\"\n Type=\"textarea\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"UserID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n LinkType=\"Record\"\n LinkComponentType=\"Search\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ActiveAt\"\n Type=\"datepicker\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"DisabledAt\"\n Type=\"datepicker\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n </div>\n\n <!-- Right Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"IsActive\"\n Type=\"checkbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_CreatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_UpdatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Category\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"User\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n\n <!-- Template Parameters Section -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-sliders\"></i>\n Parameters\n </span>\n </ng-template>\n\n <div style=\"padding: 16px 0;\">\n <mj-template-params-grid\n [template]=\"record\"\n [editMode]=\"EditMode\">\n </mj-template-params-grid>\n </div>\n </mj-accordion-panel>\n }\n\n <!-- AI Prompts Section -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-robot\"></i>\n AI Prompts\n </span>\n </ng-template>\n\n <div style=\"padding: 16px 0;\">\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Prompts','TemplateID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Prompts')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Entity Documents Section -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-file-text\"></i>\n Entity Documents\n </span>\n </ng-template>\n\n <div style=\"padding: 16px 0;\">\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Entity Documents','TemplateID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Entity Documents')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n </div>\n </mj-accordion-panel>\n }\n </div>\n </div>\n </form>\n</mj-record-form-container>\n\n<!-- Template Parameter Dialog -->\n<mj-template-param-dialog\n [template]=\"record\"\n [(isVisible)]=\"showParamDialog\"\n (onClose)=\"onParamDialogClose()\">\n</mj-template-param-dialog>\n}\n"]}
1
+ {"version":3,"file":"templates-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Templates/templates-form.component.ts","../../../../src/lib/custom/Templates/templates-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ViewChild, AfterViewInit, ChangeDetectorRef } from '@angular/core';\nimport { MJTemplateEntity, MJTemplateContentEntity, MJTemplateCategoryEntity } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseFormComponent, CUSTOM_LAYOUT_TOOLBAR_CONFIG } from '@memberjunction/ng-base-forms';\nimport { MJTemplateFormComponent } from '../../generated/Entities/MJTemplate/mjtemplate.form.component';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { TemplateEngineBase } from '@memberjunction/templates-base-types';\nimport { Subject } from 'rxjs';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { LanguageDescription } from '@codemirror/language';\nimport { languages } from '@codemirror/language-data';\nimport { CodeEditorComponent } from '@memberjunction/ng-code-editor';\nimport { TemplateEditorConfig } from '../../shared/components/template-editor.component';\n\n@RegisterClass(BaseFormComponent, 'MJ: Templates') \n@Component({\n standalone: false,\n selector: 'mj-templates-form',\n templateUrl: './templates-form.component.html',\n styleUrls: ['../../../shared/form-styles.css', './templates-form.component.css']\n})\nexport class MJTemplateFormComponentExtended extends MJTemplateFormComponent implements OnInit, OnDestroy, AfterViewInit {\n public record!: MJTemplateEntity;\n public readonly toolbarConfig = CUSTOM_LAYOUT_TOOLBAR_CONFIG;\n\n /** Custom-layout Template form looks best full-width on first open. */\n public override getDefaultFormWidthMode(): 'centered' | 'full-width' { return 'full-width'; }\n public templateContents: MJTemplateContentEntity[] = [];\n public selectedContentIndex: number = 0;\n public isAddingNewContent: boolean = false;\n public newTemplateContent: MJTemplateContentEntity | null = null;\n public hasUnsavedChanges: boolean = false;\n public templateInfoExpanded: boolean = true;\n public templateContentsExpanded: boolean = true;\n public categoryOptions: Array<{text: string, value: string}> = [\n { text: 'Select Category...', value: '' },\n // TODO: Load from database\n ];\n public contentTypeOptions: Array<{text: string, value: string}> = [];\n public supportedLanguages: LanguageDescription[] = languages;\n \n @ViewChild('codeEditor') codeEditor: CodeEditorComponent | null = null;\n private isUpdatingEditorValue = false;\n public isRunningTemplate = false;\n public templateTestResult: string | null = null;\n public templateTestError: string | null = null;\n public showParamDialog = false;\n \n // Template editor configuration for shared component\n public templateEditorConfig: TemplateEditorConfig = {\n allowEdit: true,\n showRunButton: true,\n compactMode: false\n };\n \n private destroy$ = new Subject<void>();\n private activeTimeouts: number[] = [];\n\n async ngOnInit() {\n await super.ngOnInit();\n await this.loadTemplateContents();\n await this.loadCategories();\n this.loadContentTypes();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n \n // Clean up any active timeouts\n this.activeTimeouts.forEach(timeoutId => clearTimeout(timeoutId));\n this.activeTimeouts.length = 0;\n }\n\n ngAfterViewInit() {\n // Initial sync when view is ready\n this.syncEditorValue();\n }\n\n async loadTemplateContents() {\n if (this.record && this.record.ID) {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const results = await rv.RunView<MJTemplateContentEntity>({\n EntityName: 'MJ: Template Contents',\n ExtraFilter: `TemplateID='${this.record.ID}'`,\n OrderBy: 'Priority ASC, __mj_CreatedAt ASC',\n ResultType: 'entity_object'\n });\n \n this.templateContents = results.Results;\n \n // If we have contents but no selection, select the first one\n if (this.templateContents.length > 0 && this.selectedContentIndex === 0) {\n this.selectedContentIndex = 0;\n }\n \n // If no template contents exist, create a default one for single-content optimization\n if (this.templateContents.length === 0) {\n await this.createDefaultTemplateContent();\n }\n\n // Entity change tracking is handled automatically by BaseEntity\n \n // Sync editor value after loading content\n this.syncEditorValue();\n } catch (error) {\n console.error('Error loading template contents:', error);\n }\n }\n }\n\n async createDefaultTemplateContent() {\n const md = this.ProviderToUse;\n const defaultContent = await md.GetEntityObject<MJTemplateContentEntity>('MJ: Template Contents');\n defaultContent.TemplateID = this.record.ID;\n defaultContent.Priority = 1;\n defaultContent.IsActive = true;\n \n // Set default to first real content type (skip \"Select Type...\" if it exists)\n const validContentTypes = this.contentTypeOptions.filter(option => option.value !== '');\n if (validContentTypes.length > 0) {\n defaultContent.TypeID = validContentTypes[0].value;\n }\n \n this.templateContents = [defaultContent];\n this.selectedContentIndex = 0;\n \n // Sync editor value after creating default content\n this.syncEditorValue();\n }\n\n selectTemplateContent(index: number, confirmSwitch: boolean = true) {\n // If we're adding new content and user clicks on existing content, ask for confirmation\n if (this.isAddingNewContent && confirmSwitch) {\n if (!confirm('You have unsaved changes to a new content version. Are you sure you want to switch? Your changes will be lost.')) {\n return;\n }\n }\n \n if (index >= 0 && index < this.templateContents.length) {\n this.selectedContentIndex = index;\n this.isAddingNewContent = false;\n // Don't clear newTemplateContent to preserve the work in progress\n \n // Sync editor value when switching content\n this.syncEditorValue();\n }\n }\n\n async loadCategories() {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const results = await rv.RunView({\n EntityName: 'MJ: Template Categories' \n });\n \n this.categoryOptions = [\n { text: 'Select Category...', value: '' },\n ...results.Results.map((cat: any) => ({\n text: cat.Name,\n value: cat.ID\n }))\n ];\n } catch (error) {\n console.error('Error loading categories:', error);\n this.categoryOptions = [{ text: 'Select Category...', value: '' }];\n }\n }\n\n loadContentTypes() {\n try {\n // Get content types from TemplateEngine cache\n const contentTypes = TemplateEngineBase.Instance.TemplateContentTypes;\n this.contentTypeOptions = [\n { text: 'Select Type...', value: '' },\n ...contentTypes.map(ct => ({\n text: ct.Name,\n value: ct.ID\n }))\n ];\n } catch (error) {\n console.error('Error loading content types:', error);\n // Fallback to basic types\n this.contentTypeOptions = [\n { text: 'Select Type...', value: '' },\n { text: 'HTML', value: 'HTML' },\n { text: 'Plain Text', value: 'Text' },\n { text: 'Markdown', value: 'Markdown' }\n ];\n }\n }\n\n async onCategoryChange(value: string) {\n // If it's a new category (string but not in existing options)\n if (value && !this.categoryOptions.find(opt => opt.value === value)) {\n // Check for duplicate category names (case-insensitive, trimmed)\n if (this.isDuplicateCategory(value)) {\n const existingCategory = this.categoryOptions.find(option => \n option.text && option.text.trim().toLowerCase() === value.trim().toLowerCase()\n );\n if (existingCategory) {\n // Use the existing category instead\n this.record.CategoryID = existingCategory.value;\n MJNotificationService.Instance.CreateSimpleNotification(\n `Category \"${existingCategory.text}\" already exists. Using existing category.`, \n 'warning'\n );\n }\n return;\n }\n\n try {\n // Create new category with trimmed name\n const md = this.ProviderToUse;\n const newCategory = await md.GetEntityObject<MJTemplateCategoryEntity>('MJ: Template Categories');\n newCategory.Name = value.trim();\n newCategory.UserID = this.record.UserID || md.CurrentUser.ID;\n const saved = await newCategory.Save();\n \n if (saved) {\n // Add to options and set the ID\n this.categoryOptions.push({\n text: newCategory.Name,\n value: newCategory.ID\n });\n this.record.CategoryID = newCategory.ID;\n MJNotificationService.Instance.CreateSimpleNotification(\n `New category \"${newCategory.Name}\" created successfully.`, \n 'success'\n );\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to create new category. ${newCategory.LatestResult?.CompleteMessage || ''}`, \n 'error'\n );\n }\n } catch (error) {\n console.error('Error creating new category:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error creating new category. Please try again.', \n 'error'\n );\n }\n }\n }\n\n async addNewTemplateContent() {\n const md = this.ProviderToUse;\n this.newTemplateContent = await md.GetEntityObject<MJTemplateContentEntity>('MJ: Template Contents');\n this.newTemplateContent.TemplateID = this.record.ID;\n this.newTemplateContent.Priority = this.templateContents.length + 1;\n this.newTemplateContent.IsActive = true;\n \n // Set default to first real content type (skip \"Select Type...\" if it exists)\n const validContentTypes = this.contentTypeOptions.filter(option => option.value !== '');\n if (validContentTypes.length > 0) {\n this.newTemplateContent.TypeID = validContentTypes[0].value;\n }\n this.newTemplateContent.TemplateText = '';\n \n // Add immediately to the array\n this.templateContents.push(this.newTemplateContent);\n this.selectedContentIndex = this.templateContents.length - 1;\n this.isAddingNewContent = true;\n \n // Sync editor value when adding new content\n this.syncEditorValue();\n }\n\n cancelNewTemplateContent() {\n this.isAddingNewContent = false;\n this.newTemplateContent = null;\n }\n\n async deleteTemplateContent(index: number) {\n if (index >= 0 && index < this.templateContents.length) {\n const contentToDelete = this.templateContents[index];\n\n if (contentToDelete.ID) {\n try {\n const result = await contentToDelete.Delete();\n if (result) {\n this.templateContents.splice(index, 1);\n \n // Adjust selected index if necessary\n if (this.selectedContentIndex >= this.templateContents.length) {\n this.selectedContentIndex = Math.max(0, this.templateContents.length - 1);\n }\n \n // If no contents remain, create a default one\n if (this.templateContents.length === 0) {\n await this.createDefaultTemplateContent();\n }\n } else {\n console.error('Delete returned false');\n MJNotificationService.Instance.CreateSimpleNotification(`Failed to delete template content. ${contentToDelete.LatestResult.CompleteMessage}`, 'error');\n }\n } catch (error) {\n console.error('Error deleting template content:', error);\n }\n } else {\n // Not saved yet, just remove from array\n this.templateContents.splice(index, 1);\n if (this.selectedContentIndex >= this.templateContents.length) {\n this.selectedContentIndex = Math.max(0, this.templateContents.length - 1);\n }\n \n // Reset adding new content state if we're deleting the new content\n if (this.isAddingNewContent && index === this.templateContents.length) {\n this.isAddingNewContent = false;\n this.newTemplateContent = null;\n }\n }\n } else {\n console.error('Invalid index for deletion:', index);\n }\n }\n\n get currentTemplateContent(): MJTemplateContentEntity | null {\n if (this.isAddingNewContent) {\n return this.newTemplateContent;\n }\n return this.templateContents[this.selectedContentIndex] || null;\n }\n\n get hasMultipleContents(): boolean {\n return this.templateContents.length > 1 || this.isAddingNewContent;\n }\n\n onContentTypeChange() {\n // Content type changes just modify the current content, no new record creation\n this.updateUnsavedChangesFlag();\n }\n\n onContentChange() {\n this.updateUnsavedChangesFlag();\n }\n\n /**\n * Updates the hasUnsavedChanges flag based on entity dirty states\n */\n private updateUnsavedChangesFlag() {\n this.hasUnsavedChanges = this.templateContents.some(content => content.Dirty) || \n this.isAddingNewContent ||\n this.record?.Dirty || false;\n }\n\n onTemplateTextChange(event: any) {\n if (this.isUpdatingEditorValue) {\n // Ignore change events when we're programmatically updating the editor\n return;\n }\n \n if (this.currentTemplateContent) {\n // Extract value from event - might be event.target.value or just event depending on component\n const value = typeof event === 'string' ? event : (event.target?.value || event);\n this.currentTemplateContent.TemplateText = value;\n // hasUnsavedChanges is automatically handled by entity's IsDirty flag\n this.updateUnsavedChangesFlag();\n }\n }\n\n /**\n * Helper method to track setTimeout calls for cleanup\n */\n private setTrackedTimeout(callback: () => void, delay: number): number {\n const timeoutId = setTimeout(() => {\n // Remove from tracking when it executes\n const index = this.activeTimeouts.indexOf(timeoutId);\n if (index > -1) {\n this.activeTimeouts.splice(index, 1);\n }\n callback();\n }, delay) as any as number;\n this.activeTimeouts.push(timeoutId);\n return timeoutId;\n }\n\n /**\n * Manually sync the editor value without triggering change events\n */\n private syncEditorValue() {\n // Use Promise.resolve() to wait for the next microtask after any pending changes\n Promise.resolve().then(() => {\n // Then tracked setTimeout for the next macrotask to ensure DOM is updated\n this.setTrackedTimeout(() => {\n if (!this.codeEditor) {\n return;\n }\n \n this.isUpdatingEditorValue = true;\n const newValue = this.currentTemplateContent?.TemplateText || '';\n \n // Use the setValue method from mj-code-editor component\n this.codeEditor.setValue(newValue); \n this.isUpdatingEditorValue = false;\n }, 0);\n });\n }\n\n async saveTemplateContents(): Promise<boolean> {\n try {\n // Save all template contents that have changes\n for (const content of this.templateContents) {\n content.TemplateID = this.record.ID; // Ensure FK is set\n if (content.Dirty || !content.ID) {\n const contentResult = await content.Save();\n if (!contentResult) {\n console.error('Failed to save template content:', content);\n return false;\n }\n }\n }\n\n this.isAddingNewContent = false;\n this.newTemplateContent = null;\n this.updateUnsavedChangesFlag(); // Update based on current entity states\n return true;\n } catch (error) {\n console.error('Error saving template contents:', error);\n return false;\n }\n }\n\n async SaveRecord(StopEditModeAfterSave: boolean = true): Promise<boolean> {\n // Check if we need to create a new category first\n if (this.record.CategoryID && !this.categoryOptions.find(opt => opt.value === this.record.CategoryID)) {\n // Check for duplicate category names (case-insensitive, trimmed)\n if (this.isDuplicateCategory(this.record.CategoryID)) {\n const existingCategory = this.categoryOptions.find(option => \n option.text && option.text.trim().toLowerCase() === this.record.CategoryID?.trim().toLowerCase()\n );\n if (existingCategory) {\n // Use the existing category instead\n this.record.CategoryID = existingCategory.value;\n MJNotificationService.Instance.CreateSimpleNotification(\n `Category \"${existingCategory.text}\" already exists. Using existing category.`, \n 'warning'\n );\n }\n } else {\n try {\n // Create new category with trimmed name\n const md = this.ProviderToUse;\n const newCategory = await md.GetEntityObject<MJTemplateCategoryEntity>('MJ: Template Categories');\n newCategory.Name = this.record.CategoryID.trim(); // CategoryID contains the new category name, trim it\n newCategory.UserID = this.record.UserID || md.CurrentUser.ID; \n const saved = await newCategory.Save();\n \n if (saved) {\n // Add to options and set the ID\n this.categoryOptions.push({\n text: newCategory.Name,\n value: newCategory.ID\n });\n this.record.CategoryID = newCategory.ID;\n } else {\n console.error('Failed to create new category');\n MJNotificationService.Instance.CreateSimpleNotification(\n `Failed to create new category. ${newCategory.LatestResult?.CompleteMessage || ''}`, \n 'error'\n );\n return false;\n }\n } catch (error) {\n console.error('Error creating new category during save:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error creating new category during save. Please try again.', \n 'error'\n );\n return false;\n }\n }\n }\n\n // Call the parent save method to save the template\n // Before saving, if a new record, make sure the UserID is set\n if (!this.record.IsSaved && !this.record.UserID) {\n const md = this.ProviderToUse;\n this.record.UserID = md.CurrentUser.ID;\n }\n const templateSaved = await super.SaveRecord(StopEditModeAfterSave);\n \n if (templateSaved) {\n // Then save all template contents\n return await this.saveTemplateContents();\n }\n \n return false;\n }\n\n getContentTypeDisplayText(typeId: string): string {\n if (!typeId) return '-';\n const option = this.contentTypeOptions.find(opt => opt.value === typeId);\n return option ? option.text : typeId;\n }\n\n getEditorLanguage(): string {\n if (!this.currentTemplateContent?.TypeID) {\n return 'jinja2'; // default to jinja2 for template syntax (compatible with Nunjucks)\n }\n\n const contentType = this.currentTemplateContent.TypeID.toLowerCase();\n \n // Map content types to CodeMirror language modes\n switch (contentType) {\n case 'html':\n return 'jinja2'; // Use jinja2 for HTML templates to get template syntax highlighting\n case 'markdown':\n case 'md':\n return 'markdown';\n case 'javascript':\n case 'js':\n return 'javascript';\n case 'css':\n return 'css';\n case 'json':\n return 'json';\n case 'xml':\n return 'xml';\n case 'sql':\n return 'sql';\n case 'text':\n case 'plain':\n default:\n return 'jinja2'; // Default to jinja2 since templates often contain template syntax\n }\n }\n\n private isDuplicateCategory(categoryName: string): boolean {\n const normalizedName = categoryName.trim().toLowerCase();\n return this.categoryOptions.some(option => \n option.text && option.text.trim().toLowerCase() === normalizedName\n );\n }\n\n /**\n * Test run the current template using the parameter dialog\n */\n async runTemplate() {\n if (!this.record?.IsSaved || !this.currentTemplateContent) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please save the template before running it.', \n 'warning'\n );\n return;\n }\n\n // Save any unsaved changes first\n if (this.hasUnsavedChanges) {\n const saveResult = await this.SaveRecord(false); // Don't exit edit mode\n if (!saveResult) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to save template changes.', \n 'error'\n );\n return;\n }\n }\n\n // Show the parameter dialog\n this.showParamDialog = true;\n }\n\n /**\n * Handle parameter dialog close\n */\n onParamDialogClose() {\n this.showParamDialog = false;\n }\n\n getContentTypeOptionsForContent(): Array<{text: string, value: string}> {\n // Always exclude \"Select Type...\" option for all content\n return this.contentTypeOptions.filter(option => option.value !== '');\n }\n\n /**\n * Handles template content changes from the shared editor\n */\n public onSharedTemplateContentChange(content: MJTemplateContentEntity[]) {\n this.templateContents = content;\n this.updateUnsavedChangesFlag();\n }\n\n /**\n * Handles template run requests from the shared editor\n */\n public onSharedTemplateRun(template: MJTemplateEntity) {\n this.runTemplate();\n }\n\n} \n","@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n [ToolbarConfig]=\"toolbarConfig\"\n [WidthMode]=\"'full-width'\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n <form class=\"record-form\" #form=\"ngForm\" style=\"display: flex; flex-direction: column; height: 100%; overflow: hidden;\">\n\n <!-- Main Content Area -->\n <div class=\"template-main-area\" style=\"display: flex; flex-direction: column; flex: 1; min-height: 0; overflow-y: auto;\">\n\n <!-- Header Section -->\n <div class=\"template-header-area\">\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; gap: 20px;\">\n\n <!-- Left: Template Info -->\n <div style=\"flex: 1; min-width: 0;\">\n <div style=\"display: flex; align-items: center; gap: 12px; margin-bottom: 8px;\">\n <i class=\"fa-solid fa-file-code template-icon\"></i>\n @if (EditMode) {\n <input type=\"text\" class=\"mj-input\"\n [(ngModel)]=\"record.Name\"\n name=\"templateName\"\n placeholder=\"Enter template name...\"\n style=\"font-size: 1.2em; font-weight: 600; min-width: 300px; flex: 1;\" />\n } @else {\n <h4>{{ record.Name || 'Unnamed Template' }}</h4>\n @if (record.IsActive) {\n <span class=\"active-badge\">\n <i class=\"fa-solid fa-check-circle\"></i> Active\n </span>\n } @else {\n <span class=\"inactive-badge\">\n <i class=\"fa-solid fa-pause-circle\"></i> Inactive\n </span>\n }\n }\n </div>\n\n <!-- Category and Active toggle when in edit mode -->\n @if (EditMode) {\n <div style=\"display: flex; gap: 16px; margin-bottom: 12px; flex-wrap: wrap; align-items: center;\">\n <div>\n <label class=\"field-label\">Category</label>\n <mj-combobox [(ngModel)]=\"record.CategoryID\"\n name=\"categoryId\"\n [Data]=\"categoryOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [AllowCustom]=\"true\"\n (ValueChange)=\"onCategoryChange($any($event))\"\n Placeholder=\"Select or enter new category...\"\n style=\"width: 250px;\">\n </mj-combobox>\n </div>\n <div>\n <label class=\"field-label\">Active</label>\n <mj-switch [(ngModel)]=\"record.IsActive\" name=\"isActive\"></mj-switch>\n </div>\n </div>\n }\n\n @if (EditMode) {\n <textarea class=\"mj-textarea\"\n [(ngModel)]=\"record.Description\"\n name=\"description\"\n [rows]=\"2\"\n placeholder=\"Enter template description...\"\n style=\"width: 100%; max-width: 600px; margin-bottom: 12px;\"></textarea>\n } @else if (record.Description) {\n <p class=\"description-text\">{{ record.Description }}</p>\n }\n\n <!-- Quick Info Row -->\n <div style=\"display: flex; align-items: center; gap: 16px; flex-wrap: wrap;\">\n @if (record.Category) {\n <div style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-folder meta-icon\"></i>\n <span class=\"meta-label\">Category:</span>\n <span class=\"meta-value\">{{ record.Category }}</span>\n </div>\n }\n\n <div style=\"display: flex; align-items: center; gap: 6px; font-size: 0.85em;\">\n <i class=\"fa-solid fa-file-lines meta-icon\"></i>\n <span class=\"meta-label\">Contents:</span>\n <span class=\"meta-value\">{{ templateContents.length }}</span>\n </div>\n </div>\n </div>\n\n <!-- Right: Action Buttons -->\n <div style=\"display: flex; flex-direction: column; gap: 8px; align-items: flex-end;\">\n @if (record.IsSaved) {\n <button class=\"run-template-btn\"\n (click)=\"runTemplate()\"\n title=\"Run Template\">\n <i class=\"fa-solid fa-play\"></i> Run\n </button>\n }\n </div>\n </div>\n </div>\n\n <!-- Configuration Sections with Expansion Panels -->\n <div class=\"configuration-sections\">\n\n <!-- Template Editor Section -->\n <mj-accordion-panel\n [Expanded]=\"true\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-code\"></i>\n Template Editor\n @if (templateContents.length > 0) {\n <span class=\"count-badge\">{{ templateContents.length }}</span>\n }\n </span>\n </ng-template>\n\n <div style=\"padding: 8px; min-height: 400px;\">\n <mj-template-editor\n [template]=\"record\"\n [config]=\"templateEditorConfig\"\n (contentChange)=\"onSharedTemplateContentChange($event)\"\n (runTemplate)=\"onSharedTemplateRun($event)\"\n style=\"height: 100%; display: block;\">\n </mj-template-editor>\n </div>\n </mj-accordion-panel>\n\n <!-- Details Section -->\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-cogs\"></i>\n Details\n </span>\n </ng-template>\n\n <div style=\"padding: 16px;\">\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 20px;\">\n <!-- Left Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"UserPrompt\"\n Type=\"textarea\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"UserID\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\"\n LinkType=\"Record\"\n LinkComponentType=\"Search\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"ActiveAt\"\n Type=\"datepicker\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"DisabledAt\"\n Type=\"datepicker\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n </div>\n\n <!-- Right Column -->\n <div>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"IsActive\"\n Type=\"checkbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_CreatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"__mj_UpdatedAt\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"Category\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n <mj-form-field\n [Record]=\"record\"\n [ShowLabel]=\"true\"\n FieldName=\"User\"\n Type=\"textbox\"\n [EditMode]=\"EditMode\">\n </mj-form-field>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n\n <!-- Template Parameters Section -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-sliders\"></i>\n Parameters\n </span>\n </ng-template>\n\n <div style=\"padding: 16px 0;\">\n <mj-template-params-grid\n [template]=\"record\"\n [editMode]=\"EditMode\">\n </mj-template-params-grid>\n </div>\n </mj-accordion-panel>\n }\n\n <!-- AI Prompts Section -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-robot\"></i>\n AI Prompts\n </span>\n </ng-template>\n\n <div style=\"padding: 16px 0;\">\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: AI Prompts','TemplateID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: AI Prompts')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Entity Documents Section -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [Expanded]=\"false\"\n style=\"margin-bottom: 12px;\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-file-text\"></i>\n Entity Documents\n </span>\n </ng-template>\n\n <div style=\"padding: 16px 0;\">\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Entity Documents','TemplateID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Entity Documents')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n </div>\n </mj-accordion-panel>\n }\n </div>\n </div>\n </form>\n</mj-record-form-container>\n\n<!-- Template Parameter Dialog -->\n<mj-template-param-dialog\n [template]=\"record\"\n [(isVisible)]=\"showParamDialog\"\n (onClose)=\"onParamDialogClose()\">\n</mj-template-param-dialog>\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { ChangeDetectorRef, OnChanges, SimpleChanges } from '@angular/core';
2
2
  import { EntityInfo } from '@memberjunction/core';
3
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
4
  import * as i0 from "@angular/core";
4
5
  /**
5
6
  * A clickable pill component that displays a link to a related entity record.
@@ -15,7 +16,7 @@ import * as i0 from "@angular/core";
15
16
  * </mj-entity-link-pill>
16
17
  * ```
17
18
  */
18
- export declare class EntityLinkPillComponent implements OnChanges {
19
+ export declare class EntityLinkPillComponent extends BaseAngularComponent implements OnChanges {
19
20
  private cdr;
20
21
  /**
21
22
  * The entity name to link to (e.g., 'MJ: AI Agent Runs')
@@ -30,7 +31,7 @@ export declare class EntityLinkPillComponent implements OnChanges {
30
31
  */
31
32
  recordName: string | null;
32
33
  entityInfo: EntityInfo | null;
33
- private metadata;
34
+ private get metadata();
34
35
  constructor(cdr: ChangeDetectorRef);
35
36
  ngOnChanges(changes: SimpleChanges): void;
36
37
  get iconClass(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"entity-link-pill.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/entity-link-pill.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,iBAAiB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACvH,OAAO,EAA0B,UAAU,EAAE,MAAM,sBAAsB,CAAC;;AAG1E;;;;;;;;;;;;;GAaG;AACH,qBA4Da,uBAAwB,YAAW,SAAS;IAmB3C,OAAO,CAAC,GAAG;IAlBvB;;OAEG;IACM,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C;;OAEG;IACM,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAExC;;OAEG;IACM,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C,UAAU,EAAE,UAAU,GAAG,IAAI,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAkB;gBAEd,GAAG,EAAE,iBAAiB;IAE1C,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAOzC,IAAI,SAAS,IAAI,MAAM,CAYtB;IAED,IAAI,YAAY,IAAI,MAAM,CAQzB;IAED,IAAI,WAAW,IAAI,MAAM,CAMxB;IAED,UAAU,IAAI,IAAI;yCA5DP,uBAAuB;2CAAvB,uBAAuB;CAiEnC"}
1
+ {"version":3,"file":"entity-link-pill.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/entity-link-pill.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,iBAAiB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACvH,OAAO,EAA0B,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAG1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AACrE;;;;;;;;;;;;;GAaG;AACH,qBA4Da,uBAAwB,SAAQ,oBAAqB,YAAW,SAAS;IAkBxE,OAAO,CAAC,GAAG;IAjBvB;;OAEG;IACM,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C;;OAEG;IACM,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAExC;;OAEG;IACM,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE1C,UAAU,EAAE,UAAU,GAAG,IAAI,CAAQ;IACrC,OAAO,KAAK,QAAQ,GAAiC;gBACjC,GAAG,EAAE,iBAAiB;IAG1C,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAOzC,IAAI,SAAS,IAAI,MAAM,CAYtB;IAED,IAAI,YAAY,IAAI,MAAM,CAQzB;IAED,IAAI,WAAW,IAAI,MAAM,CAMxB;IAED,UAAU,IAAI,IAAI;yCA5DP,uBAAuB;2CAAvB,uBAAuB;CAiEnC"}
@@ -1,6 +1,7 @@
1
1
  import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
2
- import { CompositeKey, Metadata } from '@memberjunction/core';
2
+ import { CompositeKey } from '@memberjunction/core';
3
3
  import { SharedService } from '@memberjunction/ng-shared';
4
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "@angular/common";
6
7
  function EntityLinkPillComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
@@ -35,8 +36,10 @@ function EntityLinkPillComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
35
36
  * </mj-entity-link-pill>
36
37
  * ```
37
38
  */
38
- export class EntityLinkPillComponent {
39
+ export class EntityLinkPillComponent extends BaseAngularComponent {
40
+ get metadata() { return this.ProviderToUse; }
39
41
  constructor(cdr) {
42
+ super();
40
43
  this.cdr = cdr;
41
44
  /**
42
45
  * The entity name to link to (e.g., 'MJ: AI Agent Runs')
@@ -51,11 +54,10 @@ export class EntityLinkPillComponent {
51
54
  */
52
55
  this.recordName = null;
53
56
  this.entityInfo = null;
54
- this.metadata = new Metadata();
55
57
  }
56
58
  ngOnChanges(changes) {
57
59
  if (changes['entityName'] && this.entityName) {
58
- this.entityInfo = this.metadata.EntityByName(this.entityName);
60
+ this.entityInfo = this.metadata.EntityByName(this.entityName) ?? null;
59
61
  this.cdr.markForCheck();
60
62
  }
61
63
  }
@@ -94,7 +96,7 @@ export class EntityLinkPillComponent {
94
96
  }
95
97
  }
96
98
  static { this.ɵfac = function EntityLinkPillComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || EntityLinkPillComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
97
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: EntityLinkPillComponent, selectors: [["mj-entity-link-pill"]], inputs: { entityName: "entityName", recordId: "recordId", recordName: "recordName" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [[1, "entity-link-pill", 3, "title"], [1, "entity-link-pill", 3, "click", "title"], [1, "entity-icon", 3, "ngClass"], [1, "entity-label"], [1, "fas", "fa-external-link-alt", "pill-action"]], template: function EntityLinkPillComponent_Template(rf, ctx) { if (rf & 1) {
99
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: EntityLinkPillComponent, selectors: [["mj-entity-link-pill"]], inputs: { entityName: "entityName", recordId: "recordId", recordName: "recordName" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [[1, "entity-link-pill", 3, "title"], [1, "entity-link-pill", 3, "click", "title"], [1, "entity-icon", 3, "ngClass"], [1, "entity-label"], [1, "fas", "fa-external-link-alt", "pill-action"]], template: function EntityLinkPillComponent_Template(rf, ctx) { if (rf & 1) {
98
100
  i0.ɵɵconditionalCreate(0, EntityLinkPillComponent_Conditional_0_Template, 5, 3, "span", 0);
99
101
  } if (rf & 2) {
100
102
  i0.ɵɵconditional(ctx.entityInfo && ctx.recordId ? 0 : -1);
@@ -118,5 +120,5 @@ export class EntityLinkPillComponent {
118
120
  }], recordName: [{
119
121
  type: Input
120
122
  }] }); })();
121
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(EntityLinkPillComponent, { className: "EntityLinkPillComponent", filePath: "src/lib/custom/Tests/entity-link-pill.component.ts", lineNumber: 79 }); })();
123
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(EntityLinkPillComponent, { className: "EntityLinkPillComponent", filePath: "src/lib/custom/Tests/entity-link-pill.component.ts", lineNumber: 80 }); })();
122
124
  //# sourceMappingURL=entity-link-pill.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entity-link-pill.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/entity-link-pill.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,uBAAuB,EAA+C,MAAM,eAAe,CAAC;AACvH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAc,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;;;;;IAqBpD,+BAA4E;IAA7C,yLAAS,mBAAY,KAAC;IACnD,uBAAiD;IACjD,+BAA2B;IAAA,YAAkB;IAAA,iBAAO;IACpD,uBAAoD;IACtD,iBAAO;;;IAJ+C,0CAAqB;IAClD,cAAqB;IAArB,0CAAqB;IACjB,eAAkB;IAAlB,yCAAkB;;AArBrD;;;;;;;;;;;;;GAaG;AA6DH,MAAM,OAAO,uBAAuB;IAmBlC,YAAoB,GAAsB;QAAtB,QAAG,GAAH,GAAG,CAAmB;QAlB1C;;WAEG;QACM,eAAU,GAAkB,IAAI,CAAC;QAE1C;;WAEG;QACM,aAAQ,GAAkB,IAAI,CAAC;QAExC;;WAEG;QACM,eAAU,GAAkB,IAAI,CAAC;QAE1C,eAAU,GAAsB,IAAI,CAAC;QAC7B,aAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAEW,CAAC;IAE9C,WAAW,CAAC,OAAsB;QAChC,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9D,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,SAAS;QACX,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;YAC1B,gEAAgE;YAChE,kCAAkC;YAClC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAClC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,OAAO,IAAI,EAAE,CAAC;YACvB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,iCAAiC;QACjC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,IAAI,YAAY;QACd,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAC9B,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,IAAI,WAAW;QACb,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,QAAQ,CAAC;QACtD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,QAAQ,WAAW,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;QACnD,CAAC;QACD,OAAO,QAAQ,WAAW,EAAE,CAAC;IAC/B,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;wHAhEU,uBAAuB;oEAAvB,uBAAuB;YAxDhC,0FAA8B;;YAA9B,yDAMC;;;iFAkDQ,uBAAuB;cA5DnC,SAAS;6BACI,KAAK,YACP,qBAAqB,YACrB;;;;;;;;KAQP,mBA+Cc,uBAAuB,CAAC,MAAM;;kBAM9C,KAAK;;kBAKL,KAAK;;kBAKL,KAAK;;kFAdK,uBAAuB","sourcesContent":["import { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef, OnChanges, SimpleChanges } from '@angular/core';\nimport { CompositeKey, Metadata, EntityInfo } from '@memberjunction/core';\nimport { SharedService } from '@memberjunction/ng-shared';\n\n/**\n * A clickable pill component that displays a link to a related entity record.\n * Shows the entity icon (from metadata) and either the record name or entity name.\n * Clicking opens the entity record in a new tab.\n *\n * Usage:\n * ```html\n * <mj-entity-link-pill\n * [entityName]=\"'MJ: AI Agent Runs'\"\n * [recordId]=\"run.TargetLogID\"\n * [recordName]=\"run.AgentRunName\">\n * </mj-entity-link-pill>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-entity-link-pill',\n template: `\n @if (entityInfo && recordId) {\n <span class=\"entity-link-pill\" (click)=\"openRecord()\" [title]=\"tooltipText\">\n <i class=\"entity-icon\" [ngClass]=\"iconClass\"></i>\n <span class=\"entity-label\">{{ displayLabel }}</span>\n <i class=\"fas fa-external-link-alt pill-action\"></i>\n </span>\n }\n `,\n styles: [`\n .entity-link-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-brand-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n max-width: 200px;\n }\n\n .entity-link-pill:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .entity-icon {\n font-size: 11px;\n opacity: 0.9;\n }\n\n .entity-label {\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 150px;\n }\n\n .pill-action {\n font-size: 9px;\n opacity: 0.6;\n transition: opacity 0.2s ease;\n }\n\n .entity-link-pill:hover .pill-action {\n opacity: 1;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EntityLinkPillComponent implements OnChanges {\n /**\n * The entity name to link to (e.g., 'MJ: AI Agent Runs')\n */\n @Input() entityName: string | null = null;\n\n /**\n * The record ID to link to\n */\n @Input() recordId: string | null = null;\n\n /**\n * Optional display name for the record. If not provided, uses entity name.\n */\n @Input() recordName: string | null = null;\n\n entityInfo: EntityInfo | null = null;\n private metadata = new Metadata();\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['entityName'] && this.entityName) {\n this.entityInfo = this.metadata.EntityByName(this.entityName);\n this.cdr.markForCheck();\n }\n }\n\n get iconClass(): string {\n if (this.entityInfo?.Icon) {\n // Entity icon is typically a Font Awesome class like 'fa-robot'\n // Ensure it has the proper prefix\n const icon = this.entityInfo.Icon;\n if (icon.startsWith('fa-')) {\n return `fas ${icon}`;\n }\n return icon;\n }\n // Default icon if none specified\n return 'fas fa-link';\n }\n\n get displayLabel(): string {\n if (this.recordName) {\n return this.recordName;\n }\n if (this.entityInfo) {\n return this.entityInfo.Name;\n }\n return 'View Record';\n }\n\n get tooltipText(): string {\n const entityLabel = this.entityInfo?.Name || 'Record';\n if (this.recordName) {\n return `Open ${entityLabel}: ${this.recordName}`;\n }\n return `Open ${entityLabel}`;\n }\n\n openRecord(): void {\n if (this.entityName && this.recordId) {\n SharedService.Instance.OpenEntityRecord(this.entityName, CompositeKey.FromID(this.recordId));\n }\n }\n}\n"]}
1
+ {"version":3,"file":"entity-link-pill.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/entity-link-pill.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef, OnChanges, SimpleChanges } from '@angular/core';\nimport { CompositeKey, Metadata, EntityInfo } from '@memberjunction/core';\nimport { SharedService } from '@memberjunction/ng-shared';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n/**\n * A clickable pill component that displays a link to a related entity record.\n * Shows the entity icon (from metadata) and either the record name or entity name.\n * Clicking opens the entity record in a new tab.\n *\n * Usage:\n * ```html\n * <mj-entity-link-pill\n * [entityName]=\"'MJ: AI Agent Runs'\"\n * [recordId]=\"run.TargetLogID\"\n * [recordName]=\"run.AgentRunName\">\n * </mj-entity-link-pill>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-entity-link-pill',\n template: `\n @if (entityInfo && recordId) {\n <span class=\"entity-link-pill\" (click)=\"openRecord()\" [title]=\"tooltipText\">\n <i class=\"entity-icon\" [ngClass]=\"iconClass\"></i>\n <span class=\"entity-label\">{{ displayLabel }}</span>\n <i class=\"fas fa-external-link-alt pill-action\"></i>\n </span>\n }\n `,\n styles: [`\n .entity-link-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n border-radius: 16px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-brand-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n max-width: 200px;\n }\n\n .entity-link-pill:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .entity-icon {\n font-size: 11px;\n opacity: 0.9;\n }\n\n .entity-label {\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 150px;\n }\n\n .pill-action {\n font-size: 9px;\n opacity: 0.6;\n transition: opacity 0.2s ease;\n }\n\n .entity-link-pill:hover .pill-action {\n opacity: 1;\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class EntityLinkPillComponent extends BaseAngularComponent implements OnChanges {\n /**\n * The entity name to link to (e.g., 'MJ: AI Agent Runs')\n */\n @Input() entityName: string | null = null;\n\n /**\n * The record ID to link to\n */\n @Input() recordId: string | null = null;\n\n /**\n * Optional display name for the record. If not provided, uses entity name.\n */\n @Input() recordName: string | null = null;\n\n entityInfo: EntityInfo | null = null;\n private get metadata() { return this.ProviderToUse; }\n constructor(private cdr: ChangeDetectorRef) {\n super();}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['entityName'] && this.entityName) {\n this.entityInfo = this.metadata.EntityByName(this.entityName) ?? null;\n this.cdr.markForCheck();\n }\n }\n\n get iconClass(): string {\n if (this.entityInfo?.Icon) {\n // Entity icon is typically a Font Awesome class like 'fa-robot'\n // Ensure it has the proper prefix\n const icon = this.entityInfo.Icon;\n if (icon.startsWith('fa-')) {\n return `fas ${icon}`;\n }\n return icon;\n }\n // Default icon if none specified\n return 'fas fa-link';\n }\n\n get displayLabel(): string {\n if (this.recordName) {\n return this.recordName;\n }\n if (this.entityInfo) {\n return this.entityInfo.Name;\n }\n return 'View Record';\n }\n\n get tooltipText(): string {\n const entityLabel = this.entityInfo?.Name || 'Record';\n if (this.recordName) {\n return `Open ${entityLabel}: ${this.recordName}`;\n }\n return `Open ${entityLabel}`;\n }\n\n openRecord(): void {\n if (this.entityName && this.recordId) {\n SharedService.Instance.OpenEntityRecord(this.entityName, CompositeKey.FromID(this.recordId));\n }\n }\n}\n"]}
@@ -60,7 +60,7 @@ export declare class MJTestFormComponentExtended extends MJTestFormComponent imp
60
60
  keyboardShortcutsEnabled: boolean;
61
61
  showShortcuts: boolean;
62
62
  private shortcutsSettingEntity;
63
- private metadata;
63
+ private get metadata();
64
64
  evalPreferences: EvaluationPreferences;
65
65
  private navigationService;
66
66
  testingDialogService: TestingDialogService;
@@ -1 +1 @@
1
- {"version":3,"file":"test-form.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/test-form.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test-form.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/Tests/test-form.component.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  import { Component, ChangeDetectionStrategy, HostListener, ViewContainerRef, inject } from '@angular/core';
8
8
  import { Subject } from 'rxjs';
9
9
  import { takeUntil } from 'rxjs/operators';
10
- import { CompositeKey, Metadata, RunView } from '@memberjunction/core';
10
+ import { CompositeKey, RunView } from '@memberjunction/core';
11
11
  import { UserInfoEngine } from '@memberjunction/core-entities';
12
12
  import { BaseFormComponent } from '@memberjunction/ng-base-forms';
13
13
  import { RegisterClass } from '@memberjunction/global';
@@ -1182,7 +1182,6 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
1182
1182
  this.keyboardShortcutsEnabled = true;
1183
1183
  this.showShortcuts = false; // Hidden by default
1184
1184
  this.shortcutsSettingEntity = null;
1185
- this.metadata = new Metadata();
1186
1185
  // Evaluation preferences
1187
1186
  this.evalPreferences = { showExecution: true, showHuman: true, showAuto: false };
1188
1187
  // Service injections
@@ -1192,6 +1191,7 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
1192
1191
  this.viewContainerRef = inject(ViewContainerRef);
1193
1192
  this.appManager = inject(ApplicationManager);
1194
1193
  }
1194
+ get metadata() { return this.ProviderToUse; }
1195
1195
  async ngOnInit() {
1196
1196
  await super.ngOnInit();
1197
1197
  this.loadShortcutsSetting();
@@ -1259,7 +1259,7 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
1259
1259
  this.loadingRuns = true;
1260
1260
  this.cdr.markForCheck();
1261
1261
  try {
1262
- const rv = new RunView();
1262
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
1263
1263
  const result = await rv.RunView({
1264
1264
  EntityName: 'MJ: Test Runs',
1265
1265
  ExtraFilter: `TestID='${this.record.ID}'`,
@@ -1292,7 +1292,7 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
1292
1292
  if (testRunIds.length === 0)
1293
1293
  return;
1294
1294
  try {
1295
- const rv = new RunView();
1295
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
1296
1296
  const chunkSize = 50;
1297
1297
  for (let i = 0; i < testRunIds.length; i += chunkSize) {
1298
1298
  const chunk = testRunIds.slice(i, i + chunkSize);
@@ -1351,7 +1351,7 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
1351
1351
  this.loadingSuites = true;
1352
1352
  this.cdr.markForCheck();
1353
1353
  try {
1354
- const rv = new RunView();
1354
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
1355
1355
  const result = await rv.RunView({
1356
1356
  EntityName: 'MJ: Test Suite Tests',
1357
1357
  ExtraFilter: `TestID='${this.record.ID}'`,
@@ -1586,7 +1586,7 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
1586
1586
  this.cdr.markForCheck();
1587
1587
  try {
1588
1588
  // Load all test runs for this test
1589
- const rv = new RunView();
1589
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
1590
1590
  const runsResult = await rv.RunView({
1591
1591
  EntityName: 'MJ: Test Runs',
1592
1592
  ExtraFilter: `TestID='${this.record.ID}'`,
@@ -1683,7 +1683,7 @@ let MJTestFormComponentExtended = class MJTestFormComponentExtended extends MJTe
1683
1683
  // Load suite run info for each unique suite run
1684
1684
  if (suiteMap.size > 0) {
1685
1685
  const suiteRunIds = Array.from(suiteMap.keys()).map(id => `'${id}'`).join(',');
1686
- const rv = new RunView();
1686
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
1687
1687
  const suiteRunsResult = await rv.RunView({
1688
1688
  EntityName: 'MJ: Test Suite Runs',
1689
1689
  ExtraFilter: `ID IN (${suiteRunIds})`,