@memberjunction/ng-core-entity-forms 6.2.0-edge.0 → 6.2.0-edge.1

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 (275) hide show
  1. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.d.ts +1 -1
  2. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js +2 -2
  3. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js.map +1 -1
  4. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
  5. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts +90 -16
  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 +218 -70
  8. package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
  9. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +80 -16
  10. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -1
  11. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +146 -46
  12. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -1
  13. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +329 -27
  14. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  15. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +794 -262
  16. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  17. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts +76 -0
  18. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts.map +1 -1
  19. package/dist/lib/custom/AIAgents/ai-agent-management.service.js +77 -33
  20. package/dist/lib/custom/AIAgents/ai-agent-management.service.js.map +1 -1
  21. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +69 -15
  22. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
  23. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +182 -74
  24. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -1
  25. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +105 -25
  26. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
  27. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +272 -112
  28. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
  29. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts +32 -6
  30. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
  31. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +71 -19
  32. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
  33. package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts +10 -0
  34. package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts.map +1 -1
  35. package/dist/lib/custom/AIAgents/new-agent-dialog.service.js +27 -7
  36. package/dist/lib/custom/AIAgents/new-agent-dialog.service.js.map +1 -1
  37. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +65 -15
  38. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
  39. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +152 -52
  40. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
  41. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +81 -15
  42. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
  43. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +145 -45
  44. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -1
  45. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +71 -17
  46. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
  47. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +175 -67
  48. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
  49. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +173 -27
  50. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
  51. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +385 -93
  52. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  53. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts +64 -4
  54. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts.map +1 -1
  55. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +129 -29
  56. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
  57. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +260 -27
  58. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
  59. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +686 -238
  60. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  61. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts +10 -0
  62. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts.map +1 -1
  63. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js +17 -9
  64. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js.map +1 -1
  65. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +74 -16
  66. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -1
  67. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +174 -58
  68. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -1
  69. package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts +108 -14
  70. package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts.map +1 -1
  71. package/dist/lib/custom/Actions/action-execution-log-form.component.js +258 -70
  72. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  73. package/dist/lib/custom/Actions/action-form.component.d.ts +198 -14
  74. package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
  75. package/dist/lib/custom/Actions/action-form.component.js +387 -107
  76. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  77. package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts +12 -6
  78. package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts.map +1 -1
  79. package/dist/lib/custom/BridgeProviders/bridge-provider-features.js +41 -29
  80. package/dist/lib/custom/BridgeProviders/bridge-provider-features.js.map +1 -1
  81. package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js +14 -14
  82. package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js.map +1 -1
  83. package/dist/lib/custom/Companies/company-overview.panel.d.ts +1 -1
  84. package/dist/lib/custom/Companies/company-overview.panel.js +2 -2
  85. package/dist/lib/custom/Companies/company-overview.panel.js.map +1 -1
  86. package/dist/lib/custom/Conversations/conversation-overview.panel.d.ts +1 -1
  87. package/dist/lib/custom/Conversations/conversation-overview.panel.js +2 -2
  88. package/dist/lib/custom/Conversations/conversation-overview.panel.js.map +1 -1
  89. package/dist/lib/custom/Employees/employee-overview.panel.d.ts +1 -1
  90. package/dist/lib/custom/Employees/employee-overview.panel.js +2 -2
  91. package/dist/lib/custom/Employees/employee-overview.panel.js.map +1 -1
  92. package/dist/lib/custom/Entities/entity-form.component.d.ts +209 -28
  93. package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
  94. package/dist/lib/custom/Entities/entity-form.component.js +494 -138
  95. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  96. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts +5 -1
  97. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts.map +1 -1
  98. package/dist/lib/custom/EntityActions/entityaction.form.component.js +10 -2
  99. package/dist/lib/custom/EntityActions/entityaction.form.component.js.map +1 -1
  100. package/dist/lib/custom/Files/file-form.component.d.ts +1 -1
  101. package/dist/lib/custom/Files/file-form.component.js +2 -2
  102. package/dist/lib/custom/Files/file-form.component.js.map +1 -1
  103. package/dist/lib/custom/Lists/list-form.component.d.ts +300 -36
  104. package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
  105. package/dist/lib/custom/Lists/list-form.component.js +664 -208
  106. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  107. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts +31 -0
  108. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts.map +1 -1
  109. package/dist/lib/custom/MLModels/ml-model-view-models.js +52 -16
  110. package/dist/lib/custom/MLModels/ml-model-view-models.js.map +1 -1
  111. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts +107 -10
  112. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts.map +1 -1
  113. package/dist/lib/custom/MLModels/ps-model-detail.component.js +291 -101
  114. package/dist/lib/custom/MLModels/ps-model-detail.component.js.map +1 -1
  115. package/dist/lib/custom/Queries/query-form.component.d.ts +201 -26
  116. package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
  117. package/dist/lib/custom/Queries/query-form.component.js +429 -109
  118. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  119. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts +107 -14
  120. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts.map +1 -1
  121. package/dist/lib/custom/Queries/query-run-dialog.component.js +249 -79
  122. package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
  123. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts +110 -4
  124. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -1
  125. package/dist/lib/custom/RecordProcesses/record-process-form.component.js +858 -86
  126. package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
  127. package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts +1 -1
  128. package/dist/lib/custom/SearchScopes/searchscope-form.component.js +4 -4
  129. package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
  130. package/dist/lib/custom/SessionBridges/session-bridge-form.component.js.map +1 -1
  131. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts +77 -13
  132. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts.map +1 -1
  133. package/dist/lib/custom/Templates/template-param-dialog.component.js +196 -78
  134. package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
  135. package/dist/lib/custom/Templates/template-params-grid.component.d.ts +49 -7
  136. package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
  137. package/dist/lib/custom/Templates/template-params-grid.component.js +132 -44
  138. package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
  139. package/dist/lib/custom/Templates/templates-form.component.d.ts +142 -17
  140. package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
  141. package/dist/lib/custom/Templates/templates-form.component.js +333 -113
  142. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  143. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts +24 -4
  144. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
  145. package/dist/lib/custom/Tests/entity-link-pill.component.js +64 -20
  146. package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
  147. package/dist/lib/custom/Tests/test-form.component.d.ts +217 -27
  148. package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
  149. package/dist/lib/custom/Tests/test-form.component.js +549 -169
  150. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  151. package/dist/lib/custom/Tests/test-run-checks.d.ts +2 -0
  152. package/dist/lib/custom/Tests/test-run-checks.d.ts.map +1 -1
  153. package/dist/lib/custom/Tests/test-run-checks.js +5 -1
  154. package/dist/lib/custom/Tests/test-run-checks.js.map +1 -1
  155. package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts +2 -0
  156. package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts.map +1 -1
  157. package/dist/lib/custom/Tests/test-run-feedback-form.component.js +5 -1
  158. package/dist/lib/custom/Tests/test-run-feedback-form.component.js.map +1 -1
  159. package/dist/lib/custom/Tests/test-run-form.component.d.ts +146 -18
  160. package/dist/lib/custom/Tests/test-run-form.component.d.ts.map +1 -1
  161. package/dist/lib/custom/Tests/test-run-form.component.js +362 -106
  162. package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
  163. package/dist/lib/custom/Tests/test-suite-form.component.d.ts +390 -47
  164. package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
  165. package/dist/lib/custom/Tests/test-suite-form.component.js +1015 -343
  166. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  167. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts +214 -26
  168. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
  169. package/dist/lib/custom/Tests/test-suite-run-form.component.js +535 -159
  170. package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
  171. package/dist/lib/custom/Users/user-overview.panel.d.ts +1 -1
  172. package/dist/lib/custom/Users/user-overview.panel.js +2 -2
  173. package/dist/lib/custom/Users/user-overview.panel.js.map +1 -1
  174. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +208 -29
  175. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
  176. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +446 -138
  177. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  178. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts +6 -0
  179. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts.map +1 -1
  180. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js +16 -4
  181. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js.map +1 -1
  182. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +50 -6
  183. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
  184. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +84 -12
  185. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
  186. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts +89 -5
  187. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -1
  188. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +216 -70
  189. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
  190. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts +62 -3
  191. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts.map +1 -1
  192. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +140 -42
  193. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js.map +1 -1
  194. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +81 -10
  195. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  196. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +165 -37
  197. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  198. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +140 -15
  199. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  200. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +326 -100
  201. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  202. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts +101 -15
  203. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts.map +1 -1
  204. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js +281 -97
  205. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js.map +1 -1
  206. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts +43 -25
  207. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts.map +1 -1
  208. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js +100 -64
  209. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js.map +1 -1
  210. package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts +14 -2
  211. package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts.map +1 -1
  212. package/dist/lib/custom/ai-agent-run/flow/constellation.component.js +71 -53
  213. package/dist/lib/custom/ai-agent-run/flow/constellation.component.js.map +1 -1
  214. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts +14 -2
  215. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts.map +1 -1
  216. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js +70 -52
  217. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js.map +1 -1
  218. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts +8 -0
  219. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts.map +1 -1
  220. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js +22 -6
  221. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js.map +1 -1
  222. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts +24 -2
  223. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts.map +1 -1
  224. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js +91 -59
  225. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js.map +1 -1
  226. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts +10 -2
  227. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts.map +1 -1
  228. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js +33 -17
  229. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js.map +1 -1
  230. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts +2 -0
  231. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts.map +1 -1
  232. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js +34 -30
  233. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js.map +1 -1
  234. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts +14 -2
  235. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts.map +1 -1
  236. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js +69 -51
  237. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js.map +1 -1
  238. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +38 -12
  239. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
  240. package/dist/lib/custom/shared/entity-selector-dialog.component.js +103 -51
  241. package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
  242. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
  243. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +59 -51
  244. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
  245. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js +76 -74
  246. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js.map +1 -1
  247. package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js +27 -25
  248. package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js.map +1 -1
  249. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  250. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +155 -119
  251. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  252. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts +5 -1
  253. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts.map +1 -1
  254. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js +11 -3
  255. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js.map +1 -1
  256. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts +2 -0
  257. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts.map +1 -1
  258. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js +16 -12
  259. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js.map +1 -1
  260. package/dist/lib/panels/content-sources/website-crawler-settings.panel.d.ts +1 -1
  261. package/dist/lib/panels/content-sources/website-crawler-settings.panel.js +2 -2
  262. package/dist/lib/panels/content-sources/website-crawler-settings.panel.js.map +1 -1
  263. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +45 -19
  264. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -1
  265. package/dist/lib/panels/model-predictions/model-prediction.logic.js +95 -43
  266. package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -1
  267. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts +20 -16
  268. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts.map +1 -1
  269. package/dist/lib/panels/model-predictions/model-prediction.panel.js +73 -65
  270. package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -1
  271. package/dist/lib/shared/components/template-editor.component.d.ts +133 -14
  272. package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
  273. package/dist/lib/shared/components/template-editor.component.js +322 -124
  274. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  275. package/package.json +43 -42
@@ -462,62 +462,182 @@ function TemplateEditorComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
462
462
  i0.ɵɵconditional(ctx_r2.currentTemplateContent ? 2 : 3);
463
463
  } }
464
464
  export class TemplateEditorComponent extends BaseAngularComponent {
465
+ /** @deprecated Use {@link Template}. */
466
+ set template(value) {
467
+ this.Template = value;
468
+ }
469
+ /** @deprecated Use {@link Template}. */
470
+ get template() {
471
+ return this.Template;
472
+ }
473
+ /** @deprecated Use {@link TemplateContents}. */
474
+ get templateContents() {
475
+ return this.TemplateContents;
476
+ }
477
+ /** @deprecated Use {@link TemplateContents}. */
478
+ set templateContents(value) {
479
+ this.TemplateContents = value;
480
+ }
481
+ /** @deprecated Use {@link SelectedContentIndex}. */
482
+ get selectedContentIndex() {
483
+ return this.SelectedContentIndex;
484
+ }
485
+ /** @deprecated Use {@link SelectedContentIndex}. */
486
+ set selectedContentIndex(value) {
487
+ this.SelectedContentIndex = value;
488
+ }
489
+ /** @deprecated Use {@link IsAddingNewContent}. */
490
+ get isAddingNewContent() {
491
+ return this.IsAddingNewContent;
492
+ }
493
+ /** @deprecated Use {@link IsAddingNewContent}. */
494
+ set isAddingNewContent(value) {
495
+ this.IsAddingNewContent = value;
496
+ }
497
+ /** @deprecated Use {@link NewTemplateContent}. */
498
+ get newTemplateContent() {
499
+ return this.NewTemplateContent;
500
+ }
501
+ /** @deprecated Use {@link NewTemplateContent}. */
502
+ set newTemplateContent(value) {
503
+ this.NewTemplateContent = value;
504
+ }
505
+ /** @deprecated Use {@link HasUnsavedChanges}. */
506
+ get hasUnsavedChanges() {
507
+ return this.HasUnsavedChanges;
508
+ }
509
+ /** @deprecated Use {@link HasUnsavedChanges}. */
510
+ set hasUnsavedChanges(value) {
511
+ this.HasUnsavedChanges = value;
512
+ }
513
+ /** @deprecated Use {@link ContentTypeOptions}. */
514
+ get contentTypeOptions() {
515
+ return this.ContentTypeOptions;
516
+ }
517
+ /** @deprecated Use {@link ContentTypeOptions}. */
518
+ set contentTypeOptions(value) {
519
+ this.ContentTypeOptions = value;
520
+ }
521
+ /** @deprecated Use {@link SupportedLanguages}. */
522
+ get supportedLanguages() {
523
+ return this.SupportedLanguages;
524
+ }
525
+ /** @deprecated Use {@link SupportedLanguages}. */
526
+ set supportedLanguages(value) {
527
+ this.SupportedLanguages = value;
528
+ }
529
+ /** @deprecated Use {@link IsRunningTemplate}. */
530
+ get isRunningTemplate() {
531
+ return this.IsRunningTemplate;
532
+ }
533
+ /** @deprecated Use {@link IsRunningTemplate}. */
534
+ set isRunningTemplate(value) {
535
+ this.IsRunningTemplate = value;
536
+ }
537
+ /** @deprecated Use {@link ActiveHelpTab}. */
538
+ get activeHelpTab() {
539
+ return this.ActiveHelpTab;
540
+ }
541
+ /** @deprecated Use {@link ActiveHelpTab}. */
542
+ set activeHelpTab(value) {
543
+ this.ActiveHelpTab = value;
544
+ }
545
+ /** @deprecated Use {@link ActivePlaceholderCategory}. */
546
+ get activePlaceholderCategory() {
547
+ return this.ActivePlaceholderCategory;
548
+ }
549
+ /** @deprecated Use {@link ActivePlaceholderCategory}. */
550
+ set activePlaceholderCategory(value) {
551
+ this.ActivePlaceholderCategory = value;
552
+ }
553
+ /** @deprecated Use {@link PlaceholderCategories}. */
554
+ get placeholderCategories() {
555
+ return this.PlaceholderCategories;
556
+ }
557
+ /** @deprecated Use {@link PlaceholderCategories}. */
558
+ set placeholderCategories(value) {
559
+ this.PlaceholderCategories = value;
560
+ }
561
+ /** @deprecated Use {@link CodeEditor}. */
562
+ get codeEditor() {
563
+ return this.CodeEditor;
564
+ }
565
+ /** @deprecated Use {@link CodeEditor}. */
566
+ set codeEditor(value) {
567
+ this.CodeEditor = value;
568
+ }
465
569
  get _metadata() { return this.ProviderToUse; }
466
570
  constructor(notificationService, confirmService) {
467
571
  super();
468
572
  this.notificationService = notificationService;
469
573
  this.confirmService = confirmService;
470
- this.template = null;
574
+ this.Template = null;
471
575
  this.config = {
472
576
  allowEdit: true,
473
577
  showRunButton: false,
474
578
  compactMode: false
475
579
  };
476
- this.contentChange = new EventEmitter();
477
- this.runTemplate = new EventEmitter();
478
- this.templateContents = [];
479
- this.selectedContentIndex = 0;
480
- this.isAddingNewContent = false;
481
- this.newTemplateContent = null;
482
- this.hasUnsavedChanges = false;
483
- this.contentTypeOptions = [];
484
- this.supportedLanguages = languages;
485
- this.isRunningTemplate = false;
486
- this.activeHelpTab = 'syntax';
487
- this.activePlaceholderCategory = '';
580
+ this.ContentChange = new EventEmitter();
581
+ /**
582
+ * @deprecated Use {@link ContentChange}.
583
+ *
584
+ * The same emitter under the old binding name, so a template still binding
585
+ * (contentChange) keeps working. Must stay AFTER ContentChange: class fields
586
+ * initialise in order, and the other way round this captures undefined.
587
+ */
588
+ this.contentChange = this.ContentChange;
589
+ this.RunTemplate = new EventEmitter();
590
+ /**
591
+ * @deprecated Use {@link RunTemplate}.
592
+ *
593
+ * The same emitter under the old binding name, so a template still binding
594
+ * (runTemplate) keeps working. Must stay AFTER RunTemplate: class fields
595
+ * initialise in order, and the other way round this captures undefined.
596
+ */
597
+ this.runTemplate = this.RunTemplate;
598
+ this.TemplateContents = [];
599
+ this.SelectedContentIndex = 0;
600
+ this.IsAddingNewContent = false;
601
+ this.NewTemplateContent = null;
602
+ this.HasUnsavedChanges = false;
603
+ this.ContentTypeOptions = [];
604
+ this.SupportedLanguages = languages;
605
+ this.IsRunningTemplate = false;
606
+ this.ActiveHelpTab = 'syntax';
607
+ this.ActivePlaceholderCategory = '';
488
608
  // System placeholders organized by category
489
- this.placeholderCategories = [];
490
- this.codeEditor = null;
609
+ this.PlaceholderCategories = [];
610
+ this.CodeEditor = null;
491
611
  this.isUpdatingEditorValue = false;
492
612
  this.destroy$ = new Subject();
493
613
  this.activeTimeouts = [];
494
614
  }
495
615
  async ngOnInit() {
496
- this.loadContentTypes();
616
+ this.LoadContentTypes();
497
617
  this.organizePlaceholdersByCategory();
498
- if (this.template) {
499
- await this.loadTemplateContents();
618
+ if (this.Template) {
619
+ await this.LoadTemplateContents();
500
620
  }
501
621
  }
502
622
  async ngOnChanges(changes) {
503
623
  if (changes['template']) {
504
624
  // Template input has changed, reload contents
505
- if (this.template) {
506
- await this.loadTemplateContents();
625
+ if (this.Template) {
626
+ await this.LoadTemplateContents();
507
627
  }
508
628
  else {
509
629
  // Template cleared, reset state
510
- this.templateContents = [];
511
- this.selectedContentIndex = 0;
512
- this.isAddingNewContent = false;
513
- this.newTemplateContent = null;
514
- this.hasUnsavedChanges = false;
630
+ this.TemplateContents = [];
631
+ this.SelectedContentIndex = 0;
632
+ this.IsAddingNewContent = false;
633
+ this.NewTemplateContent = null;
634
+ this.HasUnsavedChanges = false;
515
635
  }
516
636
  }
517
637
  }
518
638
  organizePlaceholdersByCategory() {
519
639
  // Group placeholders by their category
520
- this.placeholderCategories = SYSTEM_PLACEHOLDER_CATEGORIES.map(category => {
640
+ this.PlaceholderCategories = SYSTEM_PLACEHOLDER_CATEGORIES.map(category => {
521
641
  const categoryPlaceholders = DEFAULT_SYSTEM_PLACEHOLDERS.filter(placeholder => placeholder.category === category.name);
522
642
  return {
523
643
  category: category,
@@ -528,7 +648,7 @@ export class TemplateEditorComponent extends BaseAngularComponent {
528
648
  const categorized = DEFAULT_SYSTEM_PLACEHOLDERS.filter(p => p.category);
529
649
  const uncategorized = DEFAULT_SYSTEM_PLACEHOLDERS.filter(p => !p.category);
530
650
  if (uncategorized.length > 0) {
531
- this.placeholderCategories.push({
651
+ this.PlaceholderCategories.push({
532
652
  category: {
533
653
  name: 'Other',
534
654
  icon: 'fa-ellipsis-h',
@@ -538,14 +658,14 @@ export class TemplateEditorComponent extends BaseAngularComponent {
538
658
  });
539
659
  }
540
660
  // Set the first category as active
541
- if (this.placeholderCategories.length > 0) {
542
- this.activePlaceholderCategory = this.placeholderCategories[0].category.name;
661
+ if (this.PlaceholderCategories.length > 0) {
662
+ this.ActivePlaceholderCategory = this.PlaceholderCategories[0].category.name;
543
663
  }
544
664
  }
545
665
  /**
546
666
  * Copies a placeholder to the clipboard
547
667
  */
548
- async copyPlaceholder(placeholderName) {
668
+ async CopyPlaceholder(placeholderName) {
549
669
  try {
550
670
  await navigator.clipboard.writeText(`{{ ${placeholderName} }}`);
551
671
  this.notificationService.CreateSimpleNotification('Placeholder copied to clipboard!', 'success', 2000);
@@ -555,6 +675,10 @@ export class TemplateEditorComponent extends BaseAngularComponent {
555
675
  this.notificationService.CreateSimpleNotification('Failed to copy placeholder', 'error', 3000);
556
676
  }
557
677
  }
678
+ /** @deprecated Use {@link CopyPlaceholder}. */
679
+ async copyPlaceholder(placeholderName) {
680
+ return this.CopyPlaceholder(placeholderName);
681
+ }
558
682
  ngOnDestroy() {
559
683
  this.destroy$.next();
560
684
  this.destroy$.complete();
@@ -566,86 +690,102 @@ export class TemplateEditorComponent extends BaseAngularComponent {
566
690
  // Initial sync when view is ready
567
691
  this.syncEditorValue();
568
692
  }
569
- async loadTemplateContents() {
570
- if (this.template) {
693
+ async LoadTemplateContents() {
694
+ if (this.Template) {
571
695
  // Reset state first
572
- this.templateContents = [];
573
- this.selectedContentIndex = 0;
574
- this.isAddingNewContent = false;
575
- this.newTemplateContent = null;
576
- this.hasUnsavedChanges = false;
577
- if (this.template.IsSaved && this.template.ID) {
696
+ this.TemplateContents = [];
697
+ this.SelectedContentIndex = 0;
698
+ this.IsAddingNewContent = false;
699
+ this.NewTemplateContent = null;
700
+ this.HasUnsavedChanges = false;
701
+ if (this.Template.IsSaved && this.Template.ID) {
578
702
  // Load existing template contents for saved templates
579
703
  try {
580
704
  const rv = RunView.FromMetadataProvider(this.ProviderToUse);
581
705
  const results = await rv.RunView({
582
706
  EntityName: 'MJ: Template Contents',
583
- ExtraFilter: `TemplateID='${this.template.ID}'`,
707
+ ExtraFilter: `TemplateID='${this.Template.ID}'`,
584
708
  OrderBy: 'Priority ASC, __mj_CreatedAt ASC',
585
709
  ResultType: 'entity_object'
586
710
  });
587
- this.templateContents = results.Results;
711
+ this.TemplateContents = results.Results;
588
712
  }
589
713
  catch (error) {
590
714
  console.error('Error loading template contents:', error);
591
715
  }
592
716
  }
593
717
  // If we have contents but no selection, select the first one
594
- if (this.templateContents.length > 0) {
595
- this.selectedContentIndex = 0;
718
+ if (this.TemplateContents.length > 0) {
719
+ this.SelectedContentIndex = 0;
596
720
  }
597
721
  // If no template contents exist (either new template or saved template with no content),
598
722
  // create a default one for single-content optimization
599
- if (this.templateContents.length === 0) {
600
- await this.createDefaultTemplateContent();
723
+ if (this.TemplateContents.length === 0) {
724
+ await this.CreateDefaultTemplateContent();
601
725
  }
602
726
  // Sync editor value after loading content
603
727
  this.syncEditorValue();
604
- this.contentChange.emit(this.templateContents);
728
+ this.ContentChange.emit(this.TemplateContents);
605
729
  }
606
730
  }
731
+ /** @deprecated Use {@link LoadTemplateContents}. */
732
+ async loadTemplateContents() {
733
+ return this.LoadTemplateContents();
734
+ }
607
735
  /**
608
736
  * Public method to refresh the template editor and discard unsaved changes
609
737
  * This should be called when canceling edits to restore the original state
610
738
  */
739
+ async RefreshAndDiscardChanges() {
740
+ await this.LoadTemplateContents();
741
+ }
742
+ /** @deprecated Use {@link RefreshAndDiscardChanges}. */
611
743
  async refreshAndDiscardChanges() {
612
- await this.loadTemplateContents();
744
+ return this.RefreshAndDiscardChanges();
613
745
  }
614
- async createDefaultTemplateContent() {
746
+ async CreateDefaultTemplateContent() {
615
747
  const defaultContent = await this._metadata.GetEntityObject('MJ: Template Contents');
616
- defaultContent.TemplateID = this.template.ID;
748
+ defaultContent.TemplateID = this.Template.ID;
617
749
  defaultContent.Priority = 1;
618
750
  defaultContent.IsActive = true;
619
751
  // Set default to first real content type (skip "Select Type..." if it exists)
620
- const validContentTypes = this.contentTypeOptions.filter(option => option.value !== '');
752
+ const validContentTypes = this.ContentTypeOptions.filter(option => option.value !== '');
621
753
  if (validContentTypes.length > 0) {
622
754
  defaultContent.TypeID = validContentTypes[0].value;
623
755
  }
624
- this.templateContents = [defaultContent];
625
- this.selectedContentIndex = 0;
756
+ this.TemplateContents = [defaultContent];
757
+ this.SelectedContentIndex = 0;
626
758
  // Sync editor value after creating default content
627
759
  this.syncEditorValue();
628
760
  }
629
- async selectTemplateContent(index, confirmSwitch = true) {
761
+ /** @deprecated Use {@link CreateDefaultTemplateContent}. */
762
+ async createDefaultTemplateContent() {
763
+ return this.CreateDefaultTemplateContent();
764
+ }
765
+ async SelectTemplateContent(index, confirmSwitch = true) {
630
766
  // If we're adding new content and user clicks on existing content, ask for confirmation
631
- if (this.isAddingNewContent && confirmSwitch) {
767
+ if (this.IsAddingNewContent && confirmSwitch) {
632
768
  if (!(await this.confirmService.Confirm({ title: 'Discard changes?', message: 'Switch content version and lose your unsaved changes?', detail: 'Your changes to the new content version will be lost.' }))) {
633
769
  return;
634
770
  }
635
771
  }
636
- if (index >= 0 && index < this.templateContents.length) {
637
- this.selectedContentIndex = index;
638
- this.isAddingNewContent = false;
772
+ if (index >= 0 && index < this.TemplateContents.length) {
773
+ this.SelectedContentIndex = index;
774
+ this.IsAddingNewContent = false;
639
775
  // Don't clear newTemplateContent to preserve the work in progress
640
776
  // Sync editor value when switching content
641
777
  this.syncEditorValue();
642
778
  }
643
779
  }
644
- loadContentTypes() {
780
+ /** @deprecated Use {@link SelectTemplateContent}. */
781
+ async selectTemplateContent(index, confirmSwitch = true) {
782
+ return this.SelectTemplateContent(index, confirmSwitch);
783
+ }
784
+ LoadContentTypes() {
645
785
  try {
646
786
  // Get content types from TemplateEngine cache
647
787
  const contentTypes = TemplateEngineBase.Instance.TemplateContentTypes;
648
- this.contentTypeOptions = [
788
+ this.ContentTypeOptions = [
649
789
  { text: 'Select Type...', value: '' },
650
790
  ...contentTypes.map(ct => ({
651
791
  text: ct.Name,
@@ -656,7 +796,7 @@ export class TemplateEditorComponent extends BaseAngularComponent {
656
796
  catch (error) {
657
797
  console.error('Error loading content types:', error);
658
798
  // Fallback to basic types
659
- this.contentTypeOptions = [
799
+ this.ContentTypeOptions = [
660
800
  { text: 'Select Type...', value: '' },
661
801
  { text: 'HTML', value: 'HTML' },
662
802
  { text: 'Plain Text', value: 'Text' },
@@ -664,45 +804,53 @@ export class TemplateEditorComponent extends BaseAngularComponent {
664
804
  ];
665
805
  }
666
806
  }
667
- async addNewTemplateContent() {
807
+ /** @deprecated Use {@link LoadContentTypes}. */
808
+ loadContentTypes() {
809
+ return this.LoadContentTypes();
810
+ }
811
+ async AddNewTemplateContent() {
668
812
  if (!this.config.allowEdit)
669
813
  return;
670
- this.newTemplateContent = await this._metadata.GetEntityObject('MJ: Template Contents');
671
- this.newTemplateContent.TemplateID = this.template.ID;
672
- this.newTemplateContent.Priority = this.templateContents.length + 1;
673
- this.newTemplateContent.IsActive = true;
814
+ this.NewTemplateContent = await this._metadata.GetEntityObject('MJ: Template Contents');
815
+ this.NewTemplateContent.TemplateID = this.Template.ID;
816
+ this.NewTemplateContent.Priority = this.TemplateContents.length + 1;
817
+ this.NewTemplateContent.IsActive = true;
674
818
  // Set default to first real content type (skip "Select Type..." if it exists)
675
- const validContentTypes = this.contentTypeOptions.filter(option => option.value !== '');
819
+ const validContentTypes = this.ContentTypeOptions.filter(option => option.value !== '');
676
820
  if (validContentTypes.length > 0) {
677
- this.newTemplateContent.TypeID = validContentTypes[0].value;
821
+ this.NewTemplateContent.TypeID = validContentTypes[0].value;
678
822
  }
679
- this.newTemplateContent.TemplateText = '';
823
+ this.NewTemplateContent.TemplateText = '';
680
824
  // Add immediately to the array
681
- this.templateContents.push(this.newTemplateContent);
682
- this.selectedContentIndex = this.templateContents.length - 1;
683
- this.isAddingNewContent = true;
825
+ this.TemplateContents.push(this.NewTemplateContent);
826
+ this.SelectedContentIndex = this.TemplateContents.length - 1;
827
+ this.IsAddingNewContent = true;
684
828
  // Sync editor value when adding new content
685
829
  this.syncEditorValue();
686
830
  }
687
- async deleteTemplateContent(index) {
688
- if (!this.config.allowEdit || index < 0 || index >= this.templateContents.length)
831
+ /** @deprecated Use {@link AddNewTemplateContent}. */
832
+ async addNewTemplateContent() {
833
+ return this.AddNewTemplateContent();
834
+ }
835
+ async DeleteTemplateContent(index) {
836
+ if (!this.config.allowEdit || index < 0 || index >= this.TemplateContents.length)
689
837
  return;
690
- const contentToDelete = this.templateContents[index];
838
+ const contentToDelete = this.TemplateContents[index];
691
839
  // Check if the entity is actually saved, not just if it has an ID
692
840
  if (contentToDelete.IsSaved) {
693
841
  try {
694
842
  const result = await contentToDelete.Delete();
695
843
  if (result) {
696
- this.templateContents.splice(index, 1);
844
+ this.TemplateContents.splice(index, 1);
697
845
  // Adjust selected index if necessary
698
- if (this.selectedContentIndex >= this.templateContents.length) {
699
- this.selectedContentIndex = Math.max(0, this.templateContents.length - 1);
846
+ if (this.SelectedContentIndex >= this.TemplateContents.length) {
847
+ this.SelectedContentIndex = Math.max(0, this.TemplateContents.length - 1);
700
848
  }
701
849
  // If no contents remain, create a default one
702
- if (this.templateContents.length === 0) {
703
- await this.createDefaultTemplateContent();
850
+ if (this.TemplateContents.length === 0) {
851
+ await this.CreateDefaultTemplateContent();
704
852
  }
705
- this.contentChange.emit(this.templateContents);
853
+ this.ContentChange.emit(this.TemplateContents);
706
854
  }
707
855
  else {
708
856
  MJNotificationService.Instance.CreateSimpleNotification(`Failed to delete template content. ${contentToDelete.LatestResult?.Message}`, 'error');
@@ -715,53 +863,77 @@ export class TemplateEditorComponent extends BaseAngularComponent {
715
863
  }
716
864
  else {
717
865
  // Not saved yet, just remove from array
718
- this.templateContents.splice(index, 1);
719
- if (this.selectedContentIndex >= this.templateContents.length) {
720
- this.selectedContentIndex = Math.max(0, this.templateContents.length - 1);
866
+ this.TemplateContents.splice(index, 1);
867
+ if (this.SelectedContentIndex >= this.TemplateContents.length) {
868
+ this.SelectedContentIndex = Math.max(0, this.TemplateContents.length - 1);
721
869
  }
722
870
  // Reset adding new content state if we're deleting the new content
723
- if (this.isAddingNewContent && index === this.templateContents.length) {
724
- this.isAddingNewContent = false;
725
- this.newTemplateContent = null;
871
+ if (this.IsAddingNewContent && index === this.TemplateContents.length) {
872
+ this.IsAddingNewContent = false;
873
+ this.NewTemplateContent = null;
726
874
  }
727
- this.contentChange.emit(this.templateContents);
875
+ this.ContentChange.emit(this.TemplateContents);
728
876
  }
729
877
  }
730
- get currentTemplateContent() {
731
- if (this.isAddingNewContent) {
732
- return this.newTemplateContent;
878
+ /** @deprecated Use {@link DeleteTemplateContent}. */
879
+ async deleteTemplateContent(index) {
880
+ return this.DeleteTemplateContent(index);
881
+ }
882
+ get CurrentTemplateContent() {
883
+ if (this.IsAddingNewContent) {
884
+ return this.NewTemplateContent;
733
885
  }
734
- return this.templateContents[this.selectedContentIndex] || null;
886
+ return this.TemplateContents[this.SelectedContentIndex] || null;
887
+ }
888
+ /** @deprecated Use {@link CurrentTemplateContent}. */
889
+ get currentTemplateContent() {
890
+ return this.CurrentTemplateContent;
891
+ }
892
+ get HasMultipleContents() {
893
+ return this.TemplateContents.length > 1 || this.IsAddingNewContent;
735
894
  }
895
+ /** @deprecated Use {@link HasMultipleContents}. */
736
896
  get hasMultipleContents() {
737
- return this.templateContents.length > 1 || this.isAddingNewContent;
897
+ return this.HasMultipleContents;
738
898
  }
739
- onContentTypeChange() {
899
+ OnContentTypeChange() {
740
900
  // Content type changes just modify the current content, no new record creation
741
901
  this.updateUnsavedChangesFlag();
742
902
  }
743
- onContentChange() {
903
+ /** @deprecated Use {@link OnContentTypeChange}. */
904
+ onContentTypeChange() {
905
+ return this.OnContentTypeChange();
906
+ }
907
+ OnContentChange() {
744
908
  this.updateUnsavedChangesFlag();
745
909
  }
910
+ /** @deprecated Use {@link OnContentChange}. */
911
+ onContentChange() {
912
+ return this.OnContentChange();
913
+ }
746
914
  /**
747
915
  * Updates the hasUnsavedChanges flag based on entity dirty states
748
916
  */
749
917
  updateUnsavedChangesFlag() {
750
- this.hasUnsavedChanges = this.templateContents.some(content => content.Dirty) ||
751
- this.isAddingNewContent;
918
+ this.HasUnsavedChanges = this.TemplateContents.some(content => content.Dirty) ||
919
+ this.IsAddingNewContent;
752
920
  }
753
- onTemplateTextChange(event) {
921
+ OnTemplateTextChange(event) {
754
922
  if (this.isUpdatingEditorValue) {
755
923
  // Ignore change events when we're programmatically updating the editor
756
924
  return;
757
925
  }
758
- if (this.currentTemplateContent) {
926
+ if (this.CurrentTemplateContent) {
759
927
  // Extract value from event - might be event.target.value or just event depending on component
760
928
  const value = typeof event === 'string' ? event : (event.target?.value || event);
761
- this.currentTemplateContent.TemplateText = value;
929
+ this.CurrentTemplateContent.TemplateText = value;
762
930
  this.updateUnsavedChangesFlag();
763
931
  }
764
932
  }
933
+ /** @deprecated Use {@link OnTemplateTextChange}. */
934
+ onTemplateTextChange(event) {
935
+ return this.OnTemplateTextChange(event);
936
+ }
765
937
  /**
766
938
  * Helper method to track setTimeout calls for cleanup
767
939
  */
@@ -785,26 +957,26 @@ export class TemplateEditorComponent extends BaseAngularComponent {
785
957
  Promise.resolve().then(() => {
786
958
  // Then tracked setTimeout for the next macrotask to ensure DOM is updated
787
959
  this.setTrackedTimeout(() => {
788
- if (!this.codeEditor) {
960
+ if (!this.CodeEditor) {
789
961
  return;
790
962
  }
791
963
  this.isUpdatingEditorValue = true;
792
- const newValue = this.currentTemplateContent?.TemplateText || '';
964
+ const newValue = this.CurrentTemplateContent?.TemplateText || '';
793
965
  // Use the setValue method from mj-code-editor component
794
- this.codeEditor.setValue(newValue);
966
+ this.CodeEditor.setValue(newValue);
795
967
  this.isUpdatingEditorValue = false;
796
968
  }, 0);
797
969
  });
798
970
  }
799
- async saveTemplateContents() {
971
+ async SaveTemplateContents() {
800
972
  if (!this.config.allowEdit)
801
973
  return false;
802
974
  try {
803
975
  // Ensure FK is set on all contents, then persist the dirty/new ones atomically
804
- for (const content of this.templateContents) {
805
- content.TemplateID = this.template.ID;
976
+ for (const content of this.TemplateContents) {
977
+ content.TemplateID = this.Template.ID;
806
978
  }
807
- const toSave = this.templateContents.filter(c => c.Dirty || !c.ID);
979
+ const toSave = this.TemplateContents.filter(c => c.Dirty || !c.ID);
808
980
  if (toSave.length > 0) {
809
981
  const tg = await this._metadata.CreateTransactionGroup();
810
982
  for (const content of toSave) {
@@ -817,10 +989,10 @@ export class TemplateEditorComponent extends BaseAngularComponent {
817
989
  return false;
818
990
  }
819
991
  }
820
- this.isAddingNewContent = false;
821
- this.newTemplateContent = null;
992
+ this.IsAddingNewContent = false;
993
+ this.NewTemplateContent = null;
822
994
  this.updateUnsavedChangesFlag();
823
- this.contentChange.emit(this.templateContents);
995
+ this.ContentChange.emit(this.TemplateContents);
824
996
  return true;
825
997
  }
826
998
  catch (error) {
@@ -828,17 +1000,25 @@ export class TemplateEditorComponent extends BaseAngularComponent {
828
1000
  return false;
829
1001
  }
830
1002
  }
831
- getContentTypeDisplayText(typeId) {
1003
+ /** @deprecated Use {@link SaveTemplateContents}. */
1004
+ async saveTemplateContents() {
1005
+ return this.SaveTemplateContents();
1006
+ }
1007
+ GetContentTypeDisplayText(typeId) {
832
1008
  if (!typeId)
833
1009
  return '-';
834
- const option = this.contentTypeOptions.find(opt => opt.value === typeId);
1010
+ const option = this.ContentTypeOptions.find(opt => opt.value === typeId);
835
1011
  return option ? option.text : typeId;
836
1012
  }
837
- getEditorLanguage() {
838
- if (!this.currentTemplateContent?.TypeID) {
1013
+ /** @deprecated Use {@link GetContentTypeDisplayText}. */
1014
+ getContentTypeDisplayText(typeId) {
1015
+ return this.GetContentTypeDisplayText(typeId);
1016
+ }
1017
+ GetEditorLanguage() {
1018
+ if (!this.CurrentTemplateContent?.TypeID) {
839
1019
  return 'jinja2'; // default to jinja2 for template syntax (compatible with Nunjucks)
840
1020
  }
841
- const contentType = this.currentTemplateContent.TypeID.toLowerCase();
1021
+ const contentType = this.CurrentTemplateContent.TypeID.toLowerCase();
842
1022
  // Map content types to CodeMirror language modes
843
1023
  switch (contentType) {
844
1024
  case 'html':
@@ -863,36 +1043,48 @@ export class TemplateEditorComponent extends BaseAngularComponent {
863
1043
  return 'jinja2'; // Default to jinja2 since templates often contain template syntax
864
1044
  }
865
1045
  }
1046
+ /** @deprecated Use {@link GetEditorLanguage}. */
1047
+ getEditorLanguage() {
1048
+ return this.GetEditorLanguage();
1049
+ }
866
1050
  /**
867
1051
  * Test run the current template using the parameter dialog
868
1052
  */
869
- async onRunTemplate() {
870
- if (!this.template?.IsSaved || !this.currentTemplateContent) {
1053
+ async OnRunTemplate() {
1054
+ if (!this.Template?.IsSaved || !this.CurrentTemplateContent) {
871
1055
  MJNotificationService.Instance.CreateSimpleNotification('Please save the template before running it.', 'warning');
872
1056
  return;
873
1057
  }
874
1058
  // Save any unsaved changes first
875
- if (this.hasUnsavedChanges) {
876
- const saveResult = await this.saveTemplateContents();
1059
+ if (this.HasUnsavedChanges) {
1060
+ const saveResult = await this.SaveTemplateContents();
877
1061
  if (!saveResult) {
878
1062
  MJNotificationService.Instance.CreateSimpleNotification('Failed to save template changes.', 'error');
879
1063
  return;
880
1064
  }
881
1065
  }
882
1066
  // Emit the run template event
883
- this.runTemplate.emit(this.template);
1067
+ this.RunTemplate.emit(this.Template);
884
1068
  }
885
- getContentTypeOptionsForContent() {
1069
+ /** @deprecated Use {@link OnRunTemplate}. */
1070
+ async onRunTemplate() {
1071
+ return this.OnRunTemplate();
1072
+ }
1073
+ GetContentTypeOptionsForContent() {
886
1074
  // Always exclude "Select Type..." option for all content
887
- return this.contentTypeOptions.filter(option => option.value !== '');
1075
+ return this.ContentTypeOptions.filter(option => option.value !== '');
1076
+ }
1077
+ /** @deprecated Use {@link GetContentTypeOptionsForContent}. */
1078
+ getContentTypeOptionsForContent() {
1079
+ return this.GetContentTypeOptionsForContent();
888
1080
  }
889
1081
  static { this.ɵfac = function TemplateEditorComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TemplateEditorComponent)(i0.ɵɵdirectiveInject(i1.MJNotificationService), i0.ɵɵdirectiveInject(i2.MJConfirmService)); }; }
890
1082
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TemplateEditorComponent, selectors: [["mj-template-editor"]], viewQuery: function TemplateEditorComponent_Query(rf, ctx) { if (rf & 1) {
891
1083
  i0.ɵɵviewQuery(_c0, 5);
892
1084
  } if (rf & 2) {
893
1085
  let _t;
894
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.codeEditor = _t.first);
895
- } }, inputs: { template: "template", config: "config" }, outputs: { contentChange: "contentChange", runTemplate: "runTemplate" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["codeEditor", ""], [1, "template-editor", 2, "height", "100%", "display", "flex", "flex-direction", "column"], [1, "content-versions-tabs"], [1, "content-editor-container"], [1, "no-content-state"], [1, "content-tabs"], [1, "content-version-tab", 3, "active"], [1, "content-version-tab", "adding-new"], ["title", "Add new template content", 1, "content-version-tab", "add-new"], [1, "content-version-tab", 3, "click"], [2, "flex", "1"], [1, "tab-label"], [1, "tab-meta"], ["type", "button", "title", "Delete this content version", 1, "delete-btn"], [1, "inactive-label"], ["type", "button", "title", "Delete this content version", 1, "delete-btn", 3, "click"], [1, "fa-solid", "fa-trash", "fa-xs"], [1, "fa-solid", "fa-plus", "text-success"], [1, "new-label"], ["title", "Add new template content", 1, "content-version-tab", "add-new", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "content-metadata-bar"], [1, "metadata-grid"], [1, "form-group"], ["for", "contentType", 1, "form-label"], [1, "fa-solid", "fa-tag"], ["name", "contentType", "TextField", "text", "ValueField", "value", 3, "ngModel", "Data", "ValuePrimitive"], [1, "form-control-plaintext"], ["for", "priority", 1, "form-label"], [1, "fa-solid", "fa-sort-numeric-up"], ["name", "priority", 3, "ngModel", "Min", "Step", "Format"], [1, "form-label"], [1, "fa-solid", "fa-toggle-on"], [1, "form-check"], [1, "content-text-editor"], [1, "editor-header"], ["for", "templateContent", 1, "editor-label"], [1, "fa-solid", "fa-code"], [1, "content-type-badge"], [1, "editor-actions"], [1, "unsaved-indicator"], ["type", "button", "title", "Test run this template", 1, "run-btn", 3, "disabled"], [1, "code-editor-wrapper", 3, "change", "readonly", "language", "languages"], [1, "template-help-section"], ["name", "contentType", "TextField", "text", "ValueField", "value", 3, "ngModelChange", "ValueChange", "ngModel", "Data", "ValuePrimitive"], ["name", "priority", 3, "ngModelChange", "ngModel", "Min", "Step", "Format"], ["type", "checkbox", "id", "isActive", "name", "isActive", 1, "form-check-input", 3, "ngModelChange", "ngModel"], ["for", "isActive", 1, "form-check-label"], [1, "badge-success"], [1, "badge-secondary"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-pause-circle"], [1, "fa-solid", "fa-circle"], ["type", "button", "title", "Test run this template", 1, "run-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-play"], [1, "help-tabs"], ["type", "button", 1, "help-tab", 3, "click"], [1, "fa-solid", "fa-at"], [1, "help-content"], [1, "syntax-help"], [1, "placeholders-help"], [1, "section-title"], [1, "fa-solid", "fa-lightbulb"], [1, "syntax-grid"], [1, "syntax-item"], [1, "placeholders-description"], [1, "category-tabs"], ["type", "button", 1, "category-tab", 3, "active"], [1, "placeholder-content"], [1, "usage-example"], [1, "usage-example-inner"], [1, "fa-solid", "fa-info-circle"], [1, "usage-example-text"], ["type", "button", 1, "category-tab", 3, "click"], [2, "font-size", "0.9em"], [1, "tab-badge"], [1, "category-header"], [1, "placeholder-grid"], [1, "placeholder-item"], [1, "placeholder-item-inner"], [1, "placeholder-name-row"], [1, "placeholder-code"], ["type", "button", "title", "Copy placeholder to clipboard", 1, "copy-btn", 3, "click"], [1, "fa-solid", "fa-copy"], [1, "placeholder-description"], [1, "fa-solid", "fa-file-plus"], ["type", "button", 1, "btn", "btn-primary"], ["type", "button", 1, "btn", "btn-primary", 3, "click"]], template: function TemplateEditorComponent_Template(rf, ctx) { if (rf & 1) {
1086
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.CodeEditor = _t.first);
1087
+ } }, inputs: { Template: "Template", template: "template", config: "config" }, outputs: { ContentChange: "ContentChange", contentChange: "contentChange", RunTemplate: "RunTemplate", runTemplate: "runTemplate" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["codeEditor", ""], [1, "template-editor", 2, "height", "100%", "display", "flex", "flex-direction", "column"], [1, "content-versions-tabs"], [1, "content-editor-container"], [1, "no-content-state"], [1, "content-tabs"], [1, "content-version-tab", 3, "active"], [1, "content-version-tab", "adding-new"], ["title", "Add new template content", 1, "content-version-tab", "add-new"], [1, "content-version-tab", 3, "click"], [2, "flex", "1"], [1, "tab-label"], [1, "tab-meta"], ["type", "button", "title", "Delete this content version", 1, "delete-btn"], [1, "inactive-label"], ["type", "button", "title", "Delete this content version", 1, "delete-btn", 3, "click"], [1, "fa-solid", "fa-trash", "fa-xs"], [1, "fa-solid", "fa-plus", "text-success"], [1, "new-label"], ["title", "Add new template content", 1, "content-version-tab", "add-new", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "content-metadata-bar"], [1, "metadata-grid"], [1, "form-group"], ["for", "contentType", 1, "form-label"], [1, "fa-solid", "fa-tag"], ["name", "contentType", "TextField", "text", "ValueField", "value", 3, "ngModel", "Data", "ValuePrimitive"], [1, "form-control-plaintext"], ["for", "priority", 1, "form-label"], [1, "fa-solid", "fa-sort-numeric-up"], ["name", "priority", 3, "ngModel", "Min", "Step", "Format"], [1, "form-label"], [1, "fa-solid", "fa-toggle-on"], [1, "form-check"], [1, "content-text-editor"], [1, "editor-header"], ["for", "templateContent", 1, "editor-label"], [1, "fa-solid", "fa-code"], [1, "content-type-badge"], [1, "editor-actions"], [1, "unsaved-indicator"], ["type", "button", "title", "Test run this template", 1, "run-btn", 3, "disabled"], [1, "code-editor-wrapper", 3, "change", "readonly", "language", "languages"], [1, "template-help-section"], ["name", "contentType", "TextField", "text", "ValueField", "value", 3, "ngModelChange", "ValueChange", "ngModel", "Data", "ValuePrimitive"], ["name", "priority", 3, "ngModelChange", "ngModel", "Min", "Step", "Format"], ["type", "checkbox", "id", "isActive", "name", "isActive", 1, "form-check-input", 3, "ngModelChange", "ngModel"], ["for", "isActive", 1, "form-check-label"], [1, "badge-success"], [1, "badge-secondary"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-pause-circle"], [1, "fa-solid", "fa-circle"], ["type", "button", "title", "Test run this template", 1, "run-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-play"], [1, "help-tabs"], ["type", "button", 1, "help-tab", 3, "click"], [1, "fa-solid", "fa-at"], [1, "help-content"], [1, "syntax-help"], [1, "placeholders-help"], [1, "section-title"], [1, "fa-solid", "fa-lightbulb"], [1, "syntax-grid"], [1, "syntax-item"], [1, "placeholders-description"], [1, "category-tabs"], ["type", "button", 1, "category-tab", 3, "active"], [1, "placeholder-content"], [1, "usage-example"], [1, "usage-example-inner"], [1, "fa-solid", "fa-info-circle"], [1, "usage-example-text"], ["type", "button", 1, "category-tab", 3, "click"], [2, "font-size", "0.9em"], [1, "tab-badge"], [1, "category-header"], [1, "placeholder-grid"], [1, "placeholder-item"], [1, "placeholder-item-inner"], [1, "placeholder-name-row"], [1, "placeholder-code"], ["type", "button", "title", "Copy placeholder to clipboard", 1, "copy-btn", 3, "click"], [1, "fa-solid", "fa-copy"], [1, "placeholder-description"], [1, "fa-solid", "fa-file-plus"], ["type", "button", 1, "btn", "btn-primary"], ["type", "button", 1, "btn", "btn-primary", 3, "click"]], template: function TemplateEditorComponent_Template(rf, ctx) { if (rf & 1) {
896
1088
  i0.ɵɵconditionalCreate(0, TemplateEditorComponent_Conditional_0_Template, 4, 2, "div", 1);
897
1089
  } if (rf & 2) {
898
1090
  i0.ɵɵconditional(ctx.template ? 0 : -1);
@@ -901,15 +1093,21 @@ export class TemplateEditorComponent extends BaseAngularComponent {
901
1093
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TemplateEditorComponent, [{
902
1094
  type: Component,
903
1095
  args: [{ standalone: false, selector: 'mj-template-editor', template: "@if (template) {\n <div class=\"template-editor\" style=\"height: 100%; display: flex; flex-direction: column;\">\n <!-- Content Versions List/Tabs -->\n @if (templateContents.length > 0) {\n <div class=\"content-versions-tabs\">\n <div class=\"content-tabs\">\n @for (content of templateContents; track content.ID || $index; let i = $index) {\n <div class=\"content-version-tab\"\n [class.active]=\"selectedContentIndex === i && !isAddingNewContent\"\n (click)=\"selectTemplateContent(i, false)\">\n <div style=\"flex: 1;\">\n <div class=\"tab-label\">\n {{ content.Type || 'Version ' + (i + 1) }}\n </div>\n <div class=\"tab-meta\">\n P:{{ content.Priority }}\n @if (!content.IsActive) {\n \u2022 <span class=\"inactive-label\">Inactive</span>\n }\n </div>\n </div>\n @if (templateContents.length > 1 && config.allowEdit) {\n <button type=\"button\"\n (click)=\"deleteTemplateContent(i); $event.stopPropagation()\"\n class=\"delete-btn\"\n title=\"Delete this content version\">\n <i class=\"fa-solid fa-trash fa-xs\"></i>\n </button>\n }\n </div>\n }\n @if (isAddingNewContent) {\n <div class=\"content-version-tab adding-new\">\n <i class=\"fa-solid fa-plus text-success\"></i>\n <span class=\"new-label\">New</span>\n </div>\n }\n <!-- Add New Content (Edit Mode Only) -->\n @if (config.allowEdit && !isAddingNewContent) {\n <div class=\"content-version-tab add-new\"\n (click)=\"addNewTemplateContent()\"\n title=\"Add new template content\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New</span>\n </div>\n }\n </div>\n </div>\n }\n <!-- Content Editor -->\n @if (currentTemplateContent) {\n <div class=\"content-editor-container\">\n <!-- Content Metadata Bar -->\n <div class=\"content-metadata-bar\">\n <div class=\"metadata-grid\">\n <div class=\"form-group\">\n <label for=\"contentType\" class=\"form-label\">\n <i class=\"fa-solid fa-tag\"></i> Content Type\n </label>\n @if (config.allowEdit) {\n <mj-dropdown [(ngModel)]=\"currentTemplateContent.TypeID\"\n name=\"contentType\"\n [Data]=\"getContentTypeOptionsForContent()\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n (ValueChange)=\"onContentTypeChange()\">\n </mj-dropdown>\n } @else {\n <div class=\"form-control-plaintext\">\n {{ getContentTypeDisplayText(currentTemplateContent.TypeID) }}\n </div>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"priority\" class=\"form-label\">\n <i class=\"fa-solid fa-sort-numeric-up\"></i> Priority\n </label>\n @if (config.allowEdit) {\n <mj-numeric-input [(ngModel)]=\"currentTemplateContent.Priority\"\n name=\"priority\"\n [Min]=\"1\"\n [Step]=\"1\"\n [Format]=\"'n0'\">\n </mj-numeric-input>\n } @else {\n <div class=\"form-control-plaintext\">\n {{ currentTemplateContent.Priority || '-' }}\n </div>\n }\n </div>\n <div class=\"form-group\">\n <label class=\"form-label\">\n <i class=\"fa-solid fa-toggle-on\"></i> Status\n </label>\n @if (config.allowEdit) {\n <div class=\"form-check\">\n <input type=\"checkbox\"\n id=\"isActive\"\n class=\"form-check-input\"\n [(ngModel)]=\"currentTemplateContent.IsActive\"\n name=\"isActive\">\n <label class=\"form-check-label\" for=\"isActive\">\n Active\n </label>\n </div>\n } @else {\n <div class=\"form-control-plaintext\">\n @if (currentTemplateContent.IsActive) {\n <span class=\"badge-success\">\n <i class=\"fa-solid fa-check-circle\"></i> Active\n </span>\n } @else {\n <span class=\"badge-secondary\">\n <i class=\"fa-solid fa-pause-circle\"></i> Inactive\n </span>\n }\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Content Text Editor -->\n <div class=\"content-text-editor\">\n <div class=\"editor-header\">\n <label for=\"templateContent\" class=\"editor-label\">\n <i class=\"fa-solid fa-code\"></i> Template Content\n <span class=\"content-type-badge\"\n [class.new]=\"!currentTemplateContent.ID\"\n [class.existing]=\"!!currentTemplateContent.ID\">\n @if (!currentTemplateContent.ID) {\n New\n } @else {\n {{ getContentTypeDisplayText(currentTemplateContent.TypeID) }}\n }\n </span>\n </label>\n <div class=\"editor-actions\">\n @if (!isAddingNewContent && hasUnsavedChanges) {\n <span class=\"unsaved-indicator\">\n <i class=\"fa-solid fa-circle\"></i>\n Unsaved changes\n </span>\n }\n @if (template.IsSaved && currentTemplateContent && config.showRunButton) {\n <button type=\"button\"\n class=\"run-btn\"\n [disabled]=\"isRunningTemplate\"\n (click)=\"onRunTemplate()\"\n title=\"Test run this template\">\n @if (isRunningTemplate) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Run\n }\n </button>\n }\n </div>\n </div>\n <mj-code-editor\n #codeEditor\n (change)=\"onTemplateTextChange($event)\"\n [readonly]=\"!config.allowEdit\"\n [language]=\"getEditorLanguage()\"\n [languages]=\"supportedLanguages\"\n class=\"code-editor-wrapper\">\n </mj-code-editor>\n <!-- Template Help Section with Tabs -->\n @if (!config.compactMode) {\n <div class=\"template-help-section\">\n <!-- Tab Navigation -->\n <div class=\"help-tabs\">\n <button type=\"button\"\n class=\"help-tab\"\n [class.active]=\"activeHelpTab === 'syntax'\"\n (click)=\"activeHelpTab = 'syntax'\">\n <i class=\"fa-solid fa-code\"></i> Template Syntax\n </button>\n <button type=\"button\"\n class=\"help-tab\"\n [class.active]=\"activeHelpTab === 'placeholders'\"\n (click)=\"activeHelpTab = 'placeholders'\">\n <i class=\"fa-solid fa-at\"></i> System Placeholders\n </button>\n </div>\n <!-- Tab Content -->\n <div class=\"help-content\">\n <!-- Template Syntax Tab -->\n @if (activeHelpTab === 'syntax') {\n <div class=\"syntax-help\">\n <div class=\"section-title\">\n <i class=\"fa-solid fa-lightbulb\"></i> Template Syntax Quick Reference\n </div>\n <div class=\"syntax-grid\">\n <div>\n <div class=\"syntax-item\">\n <strong>Parameters:</strong><br>\n <code>{{'{{'}} paramName {{'}}'}}</code>\n </div>\n <div>\n <strong>Template Includes:</strong><br>\n <code>{{'{% template \"TemplateName\" %}'}}</code>\n </div>\n </div>\n <div>\n <div class=\"syntax-item\">\n <strong>Conditionals:</strong><br>\n <code>{{'{% if condition %}'}} ... {{'{% endif %}'}}</code>\n </div>\n <div>\n <strong>Loops:</strong><br>\n <code>{{'{% for item in items %}'}} ... {{'{% endfor %}'}}</code>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- System Placeholders Tab -->\n @if (activeHelpTab === 'placeholders') {\n <div class=\"placeholders-help\">\n <div class=\"section-title\">\n <i class=\"fa-solid fa-at\"></i> System Placeholders Reference\n </div>\n <p class=\"placeholders-description\">\n System placeholders are automatically available in all AI prompt templates. Simply use them in your template text and they will be replaced with their current values at execution time.\n </p>\n <!-- Category Sub-tabs -->\n <div class=\"category-tabs\">\n @for (categoryGroup of placeholderCategories; track categoryGroup.category.name) {\n <button type=\"button\"\n class=\"category-tab\"\n [class.active]=\"activePlaceholderCategory === categoryGroup.category.name\"\n (click)=\"activePlaceholderCategory = categoryGroup.category.name\">\n <i [class]=\"'fa-solid ' + categoryGroup.category.icon\" style=\"font-size: 0.9em;\"></i>\n {{ categoryGroup.category.name }}\n <span class=\"tab-badge\">\n {{ categoryGroup.placeholders.length }}\n </span>\n </button>\n }\n </div>\n <!-- Active Category Content -->\n <div class=\"placeholder-content\">\n @for (categoryGroup of placeholderCategories; track categoryGroup.category.name) {\n @if (activePlaceholderCategory === categoryGroup.category.name) {\n <div class=\"category-header\">\n <i [class]=\"'fa-solid ' + categoryGroup.category.icon\"\n [style.color]=\"categoryGroup.category.color\"></i>\n <h5>{{ categoryGroup.category.name }}</h5>\n </div>\n <div class=\"placeholder-grid\">\n @for (placeholder of categoryGroup.placeholders; track placeholder.name) {\n <div class=\"placeholder-item\">\n <div class=\"placeholder-item-inner\">\n <div>\n <div class=\"placeholder-name-row\">\n <code class=\"placeholder-code\">{{'{{'}} {{ placeholder.name }} {{'}}'}}</code>\n <button type=\"button\"\n class=\"copy-btn\"\n (click)=\"copyPlaceholder(placeholder.name)\"\n title=\"Copy placeholder to clipboard\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (placeholder.description) {\n <div class=\"placeholder-description\">{{ placeholder.description }}</div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n <!-- Usage Example -->\n <div class=\"usage-example\">\n <div class=\"usage-example-inner\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <div class=\"usage-example-text\">\n <strong>Usage Example:</strong> To use a system placeholder in your template, simply include it in double curly braces.\n For example: <code>\"Today is {{'{{'}} _CURRENT_DATE {{'}}'}} and the current user is {{'{{'}} _USER_NAME {{'}}'}}\"</code>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n } @else {\n <!-- No Content State -->\n <div class=\"no-content-state\">\n <i class=\"fa-solid fa-file-plus\"></i>\n <h5>No Template Content</h5>\n <p>Create your first template content version to get started.</p>\n @if (config.allowEdit) {\n <button type=\"button\"\n (click)=\"addNewTemplateContent()\"\n class=\"btn btn-primary\">\n <i class=\"fa-solid fa-plus\"></i> Create First Content Version\n </button>\n }\n </div>\n }\n </div>\n}\n", styles: [".template-editor {\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\n.section-header h6 {\n font-size: 0.9em;\n}\n\n.param-row:hover {\n background-color: var(--mj-bg-surface-card) !important;\n}\n\n.content-item {\n transition: box-shadow 0.2s ease;\n}\n\n.content-item:hover {\n box-shadow: 0 2px 4px var(--mj-shadow-sm);\n}\n\n.loading-state {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n}\n\n.badge {\n display: inline-block;\n font-size: 0.7em;\n line-height: 1;\n}\n\n/* Form control sizing */\n.template-editor .mj-input,\n.template-editor .mj-textarea,\n.template-editor mj-dropdown {\n width: 100%;\n}\n\n.template-editor [mjButton] {\n min-width: auto;\n}\n\n/* Content version tabs */\n.content-versions-tabs {\n margin-bottom: 16px;\n border-bottom: 2px solid var(--mj-border-default);\n padding-bottom: 8px;\n}\n\n.content-tabs {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.content-version-tab {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n cursor: pointer;\n background: var(--mj-bg-surface);\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n position: relative;\n}\n\n.content-version-tab.active {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.content-version-tab .tab-label {\n font-weight: 600;\n font-size: 0.85em;\n color: var(--mj-text-secondary);\n}\n\n.content-version-tab .tab-meta {\n font-size: 0.7em;\n color: var(--mj-text-muted);\n}\n\n.content-version-tab .tab-meta .inactive-label {\n color: var(--mj-status-error);\n}\n\n.content-version-tab .delete-btn {\n background: none;\n border: none;\n color: var(--mj-status-error);\n padding: 4px;\n border-radius: 3px;\n transition: all 0.2s;\n cursor: pointer;\n}\n\n.content-version-tab .delete-btn:hover {\n background-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n/* New content tab (adding state) */\n.content-version-tab.adding-new {\n border-color: var(--mj-status-success);\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n}\n\n.content-version-tab.adding-new .new-label {\n font-weight: 600;\n color: var(--mj-status-success);\n font-size: 0.85em;\n}\n\n/* Add new content button */\n.content-version-tab.add-new {\n border: 1px dashed var(--mj-status-success);\n background: var(--mj-bg-surface-card);\n}\n\n.content-version-tab.add-new:hover {\n background: color-mix(in srgb, var(--mj-status-success) 8%, var(--mj-bg-surface));\n border-style: solid;\n}\n\n.content-version-tab.add-new i {\n color: var(--mj-status-success);\n font-size: 0.75em;\n}\n\n.content-version-tab.add-new span {\n font-weight: 500;\n color: var(--mj-status-success);\n font-size: 0.85em;\n}\n\n/* Content editor container */\n.content-editor-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n/* Content metadata bar */\n.content-metadata-bar {\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n padding: 16px 20px;\n}\n\n.metadata-grid {\n display: grid;\n grid-template-columns: 2fr 1fr 1fr auto;\n gap: 20px;\n align-items: end;\n}\n\n.form-group {\n margin: 0;\n}\n\n.form-label {\n margin-bottom: 4px;\n font-size: 0.9em;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.form-control-plaintext {\n font-size: 0.9em;\n padding: 4px 0;\n}\n\n.form-check {\n margin-top: 8px;\n}\n\n.form-check-label {\n font-size: 0.9em;\n}\n\n.badge-success {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 30%, transparent);\n padding: 3px 8px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n.badge-secondary {\n background: color-mix(in srgb, var(--mj-text-muted) 15%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n border: 1px solid color-mix(in srgb, var(--mj-text-muted) 30%, transparent);\n padding: 3px 8px;\n border-radius: 10px;\n font-size: 0.75em;\n font-weight: 600;\n}\n\n/* Content text editor area */\n.content-text-editor {\n flex: 1;\n padding: 20px;\n display: flex;\n flex-direction: column;\n}\n\n.editor-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.editor-label {\n margin: 0;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.content-type-badge {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.75em;\n color: var(--mj-text-inverse);\n}\n\n.content-type-badge.new {\n background: var(--mj-status-success);\n}\n\n.content-type-badge.existing {\n background: var(--mj-text-muted);\n}\n\n.editor-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.unsaved-indicator {\n color: var(--mj-status-warning);\n font-size: 0.85em;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.unsaved-indicator i {\n font-size: 0.5em;\n}\n\n.run-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 6px 12px;\n border-radius: 4px;\n font-size: 0.85em;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n cursor: pointer;\n}\n\n.run-btn:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n/* Code editor border */\n.code-editor-wrapper {\n flex: 1;\n height: 350px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 4px;\n}\n\n/* Help section tabs */\n.template-help-section {\n margin-top: 16px;\n}\n\n.help-tabs {\n display: flex;\n border-bottom: 2px solid var(--mj-border-default);\n margin-bottom: 0;\n}\n\n.help-tab {\n padding: 8px 16px;\n border: none;\n background: none;\n cursor: pointer;\n font-size: 0.9em;\n font-weight: 600;\n color: var(--mj-text-muted);\n border-bottom: 3px solid transparent;\n transition: all 0.2s;\n}\n\n.help-tab.active {\n color: var(--mj-status-success);\n border-bottom-color: var(--mj-status-success);\n}\n\n/* Help content area */\n.help-content {\n padding: 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-top: none;\n border-radius: 0 0 4px 4px;\n}\n\n/* Syntax help */\n.syntax-help {\n font-size: 0.85em;\n}\n\n.syntax-help .section-title {\n font-weight: 600;\n margin-bottom: 12px;\n color: var(--mj-status-success);\n}\n\n.syntax-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n}\n\n.syntax-item {\n margin-bottom: 8px;\n}\n\n.syntax-help code {\n background: var(--mj-bg-surface);\n padding: 4px 6px;\n border-radius: 3px;\n display: inline-block;\n margin-top: 4px;\n color: var(--mj-text-primary);\n}\n\n/* Placeholders help */\n.placeholders-help {\n font-size: 0.85em;\n}\n\n.placeholders-help .section-title {\n font-weight: 600;\n margin-bottom: 12px;\n color: var(--mj-status-success);\n}\n\n.placeholders-description {\n margin-bottom: 16px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n/* Category tabs */\n.category-tabs {\n display: flex;\n gap: 8px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.category-tab {\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 20px;\n cursor: pointer;\n font-size: 0.85em;\n font-weight: 500;\n display: flex;\n align-items: center;\n gap: 6px;\n transition: all 0.2s;\n color: var(--mj-text-muted);\n}\n\n.category-tab.active {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.category-tab .tab-badge {\n background: color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n color: inherit;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.75em;\n margin-left: 4px;\n}\n\n/* Placeholder content area */\n.placeholder-content {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n}\n\n.category-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 16px;\n}\n\n.category-header i {\n font-size: 1.2em;\n}\n\n.category-header h5 {\n margin: 0;\n color: var(--mj-text-primary);\n font-weight: 600;\n}\n\n.placeholder-grid {\n display: grid;\n gap: 10px;\n}\n\n/* Placeholder item */\n.placeholder-item {\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n position: relative;\n transition: all 0.2s;\n max-width: 800px;\n}\n\n.placeholder-item:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.placeholder-item:hover .copy-btn {\n opacity: 1 !important;\n}\n\n.placeholder-item-inner {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n.placeholder-name-row {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.placeholder-code {\n color: var(--mj-status-error);\n font-weight: 600;\n font-size: 0.95em;\n}\n\n.copy-btn {\n opacity: 0;\n transition: opacity 0.2s;\n background: none;\n border: none;\n padding: 4px 8px;\n cursor: pointer;\n color: var(--mj-brand-primary);\n border-radius: 4px;\n display: inline-flex;\n align-items: center;\n}\n\n.copy-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.copy-btn i {\n font-size: 0.85em;\n}\n\n.placeholder-description {\n color: var(--mj-text-muted);\n margin-top: 4px;\n line-height: 1.4;\n}\n\n/* Usage example box */\n.usage-example {\n margin-top: 20px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-radius: 6px;\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface));\n}\n\n.usage-example-inner {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n.usage-example i {\n color: var(--mj-brand-primary);\n margin-top: 2px;\n}\n\n.usage-example-text {\n flex: 1;\n font-size: 0.85em;\n color: var(--mj-brand-primary);\n line-height: 1.5;\n}\n\n.usage-example code {\n background: var(--mj-bg-surface);\n padding: 2px 4px;\n border-radius: 3px;\n}\n\n/* No content state */\n.no-content-state {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-card);\n border: 2px dashed var(--mj-border-default);\n border-radius: 8px;\n padding: 40px;\n text-align: center;\n}\n\n.no-content-state i {\n font-size: 48px;\n margin-bottom: 16px;\n color: var(--mj-text-muted);\n opacity: 0.6;\n}\n\n.no-content-state h5 {\n color: var(--mj-text-secondary);\n margin-bottom: 8px;\n}\n\n.no-content-state p {\n color: var(--mj-text-muted);\n margin-bottom: 20px;\n}\n"] }]
904
- }], () => [{ type: i1.MJNotificationService }, { type: i2.MJConfirmService }], { template: [{
1096
+ }], () => [{ type: i1.MJNotificationService }, { type: i2.MJConfirmService }], { Template: [{
1097
+ type: Input
1098
+ }], template: [{
905
1099
  type: Input
906
1100
  }], config: [{
907
1101
  type: Input
1102
+ }], ContentChange: [{
1103
+ type: Output
908
1104
  }], contentChange: [{
909
1105
  type: Output
1106
+ }], RunTemplate: [{
1107
+ type: Output
910
1108
  }], runTemplate: [{
911
1109
  type: Output
912
- }], codeEditor: [{
1110
+ }], CodeEditor: [{
913
1111
  type: ViewChild,
914
1112
  args: ['codeEditor']
915
1113
  }] }); })();