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

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 (398) 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-form-tabs.d.ts +1 -0
  10. package/dist/lib/custom/AIAgents/agent-form-tabs.d.ts.map +1 -1
  11. package/dist/lib/custom/AIAgents/agent-form-tabs.js +2 -0
  12. package/dist/lib/custom/AIAgents/agent-form-tabs.js.map +1 -1
  13. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +80 -16
  14. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -1
  15. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +146 -46
  16. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -1
  17. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +329 -27
  18. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  19. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +1322 -783
  20. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  21. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts +76 -0
  22. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts.map +1 -1
  23. package/dist/lib/custom/AIAgents/ai-agent-management.service.js +77 -33
  24. package/dist/lib/custom/AIAgents/ai-agent-management.service.js.map +1 -1
  25. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +69 -15
  26. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
  27. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +182 -74
  28. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -1
  29. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +105 -25
  30. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
  31. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +272 -112
  32. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
  33. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts +32 -6
  34. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
  35. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +71 -19
  36. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
  37. package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts +10 -0
  38. package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts.map +1 -1
  39. package/dist/lib/custom/AIAgents/new-agent-dialog.service.js +27 -7
  40. package/dist/lib/custom/AIAgents/new-agent-dialog.service.js.map +1 -1
  41. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +65 -15
  42. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
  43. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +152 -52
  44. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
  45. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +81 -15
  46. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
  47. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +145 -45
  48. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -1
  49. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +71 -17
  50. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
  51. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +175 -67
  52. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
  53. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +173 -27
  54. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
  55. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +385 -93
  56. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  57. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts +64 -4
  58. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts.map +1 -1
  59. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +129 -29
  60. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
  61. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +260 -27
  62. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
  63. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +694 -252
  64. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  65. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts +10 -0
  66. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts.map +1 -1
  67. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js +17 -9
  68. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js.map +1 -1
  69. package/dist/lib/custom/AIPrompts/pending-records.d.ts +11 -0
  70. package/dist/lib/custom/AIPrompts/pending-records.d.ts.map +1 -0
  71. package/dist/lib/custom/AIPrompts/pending-records.js +21 -0
  72. package/dist/lib/custom/AIPrompts/pending-records.js.map +1 -0
  73. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +74 -16
  74. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -1
  75. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +174 -58
  76. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -1
  77. package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts +108 -14
  78. package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts.map +1 -1
  79. package/dist/lib/custom/Actions/action-execution-log-form.component.js +258 -70
  80. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  81. package/dist/lib/custom/Actions/action-form.component.d.ts +198 -14
  82. package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
  83. package/dist/lib/custom/Actions/action-form.component.js +387 -107
  84. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  85. package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts +12 -6
  86. package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts.map +1 -1
  87. package/dist/lib/custom/BridgeProviders/bridge-provider-features.js +41 -29
  88. package/dist/lib/custom/BridgeProviders/bridge-provider-features.js.map +1 -1
  89. package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js +14 -14
  90. package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js.map +1 -1
  91. package/dist/lib/custom/Companies/company-overview.panel.d.ts +1 -1
  92. package/dist/lib/custom/Companies/company-overview.panel.js +2 -2
  93. package/dist/lib/custom/Companies/company-overview.panel.js.map +1 -1
  94. package/dist/lib/custom/Conversations/conversation-overview.panel.d.ts +1 -1
  95. package/dist/lib/custom/Conversations/conversation-overview.panel.js +2 -2
  96. package/dist/lib/custom/Conversations/conversation-overview.panel.js.map +1 -1
  97. package/dist/lib/custom/Employees/employee-overview.panel.d.ts +1 -1
  98. package/dist/lib/custom/Employees/employee-overview.panel.js +2 -2
  99. package/dist/lib/custom/Employees/employee-overview.panel.js.map +1 -1
  100. package/dist/lib/custom/Entities/entity-form.component.d.ts +217 -29
  101. package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
  102. package/dist/lib/custom/Entities/entity-form.component.js +734 -285
  103. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  104. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts +5 -1
  105. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts.map +1 -1
  106. package/dist/lib/custom/EntityActions/entityaction.form.component.js +10 -2
  107. package/dist/lib/custom/EntityActions/entityaction.form.component.js.map +1 -1
  108. package/dist/lib/custom/Files/file-form.component.d.ts +1 -1
  109. package/dist/lib/custom/Files/file-form.component.js +2 -2
  110. package/dist/lib/custom/Files/file-form.component.js.map +1 -1
  111. package/dist/lib/custom/Lists/list-form.component.d.ts +300 -36
  112. package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
  113. package/dist/lib/custom/Lists/list-form.component.js +664 -208
  114. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  115. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts +31 -0
  116. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts.map +1 -1
  117. package/dist/lib/custom/MLModels/ml-model-view-models.js +52 -16
  118. package/dist/lib/custom/MLModels/ml-model-view-models.js.map +1 -1
  119. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts +107 -10
  120. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts.map +1 -1
  121. package/dist/lib/custom/MLModels/ps-model-detail.component.js +291 -101
  122. package/dist/lib/custom/MLModels/ps-model-detail.component.js.map +1 -1
  123. package/dist/lib/custom/Queries/query-form.component.d.ts +201 -26
  124. package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
  125. package/dist/lib/custom/Queries/query-form.component.js +429 -109
  126. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  127. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts +107 -14
  128. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts.map +1 -1
  129. package/dist/lib/custom/Queries/query-run-dialog.component.js +249 -79
  130. package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
  131. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts +129 -4
  132. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -1
  133. package/dist/lib/custom/RecordProcesses/record-process-form.component.js +904 -90
  134. package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
  135. package/dist/lib/custom/Rubrics/evaluation-form.component.d.ts +37 -0
  136. package/dist/lib/custom/Rubrics/evaluation-form.component.d.ts.map +1 -0
  137. package/dist/lib/custom/Rubrics/evaluation-form.component.js +399 -0
  138. package/dist/lib/custom/Rubrics/evaluation-form.component.js.map +1 -0
  139. package/dist/lib/custom/Rubrics/record-forms.component.d.ts +69 -0
  140. package/dist/lib/custom/Rubrics/record-forms.component.d.ts.map +1 -0
  141. package/dist/lib/custom/Rubrics/record-forms.component.js +587 -0
  142. package/dist/lib/custom/Rubrics/record-forms.component.js.map +1 -0
  143. package/dist/lib/custom/Rubrics/rubric-form.component.d.ts +67 -0
  144. package/dist/lib/custom/Rubrics/rubric-form.component.d.ts.map +1 -0
  145. package/dist/lib/custom/Rubrics/rubric-form.component.js +534 -0
  146. package/dist/lib/custom/Rubrics/rubric-form.component.js.map +1 -0
  147. package/dist/lib/custom/Rubrics/rubric-form.panels.d.ts +25 -0
  148. package/dist/lib/custom/Rubrics/rubric-form.panels.d.ts.map +1 -0
  149. package/dist/lib/custom/Rubrics/rubric-form.panels.js +299 -0
  150. package/dist/lib/custom/Rubrics/rubric-form.panels.js.map +1 -0
  151. package/dist/lib/custom/Rubrics/scale-form.component.d.ts +31 -0
  152. package/dist/lib/custom/Rubrics/scale-form.component.d.ts.map +1 -0
  153. package/dist/lib/custom/Rubrics/scale-form.component.js +395 -0
  154. package/dist/lib/custom/Rubrics/scale-form.component.js.map +1 -0
  155. package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts +1 -1
  156. package/dist/lib/custom/SearchScopes/searchscope-form.component.js +4 -4
  157. package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
  158. package/dist/lib/custom/SessionBridges/session-bridge-form.component.js.map +1 -1
  159. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts +77 -13
  160. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts.map +1 -1
  161. package/dist/lib/custom/Templates/template-param-dialog.component.js +196 -78
  162. package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
  163. package/dist/lib/custom/Templates/template-params-grid.component.d.ts +49 -7
  164. package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
  165. package/dist/lib/custom/Templates/template-params-grid.component.js +132 -44
  166. package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
  167. package/dist/lib/custom/Templates/templates-form.component.d.ts +153 -19
  168. package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
  169. package/dist/lib/custom/Templates/templates-form.component.js +434 -217
  170. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  171. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts +24 -4
  172. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
  173. package/dist/lib/custom/Tests/entity-link-pill.component.js +64 -20
  174. package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
  175. package/dist/lib/custom/Tests/test-form.component.d.ts +223 -27
  176. package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
  177. package/dist/lib/custom/Tests/test-form.component.js +951 -530
  178. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  179. package/dist/lib/custom/Tests/test-run-checks.d.ts +2 -0
  180. package/dist/lib/custom/Tests/test-run-checks.d.ts.map +1 -1
  181. package/dist/lib/custom/Tests/test-run-checks.js +5 -1
  182. package/dist/lib/custom/Tests/test-run-checks.js.map +1 -1
  183. package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts +2 -0
  184. package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts.map +1 -1
  185. package/dist/lib/custom/Tests/test-run-feedback-form.component.js +5 -1
  186. package/dist/lib/custom/Tests/test-run-feedback-form.component.js.map +1 -1
  187. package/dist/lib/custom/Tests/test-run-form.component.d.ts +146 -18
  188. package/dist/lib/custom/Tests/test-run-form.component.d.ts.map +1 -1
  189. package/dist/lib/custom/Tests/test-run-form.component.js +362 -106
  190. package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
  191. package/dist/lib/custom/Tests/test-suite-form.component.d.ts +395 -47
  192. package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
  193. package/dist/lib/custom/Tests/test-suite-form.component.js +1719 -1007
  194. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  195. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts +214 -26
  196. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
  197. package/dist/lib/custom/Tests/test-suite-run-form.component.js +535 -159
  198. package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
  199. package/dist/lib/custom/Users/user-overview.panel.d.ts +1 -1
  200. package/dist/lib/custom/Users/user-overview.panel.js +3 -3
  201. package/dist/lib/custom/Users/user-overview.panel.js.map +1 -1
  202. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +208 -29
  203. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
  204. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +446 -138
  205. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  206. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts +6 -0
  207. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts.map +1 -1
  208. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js +16 -4
  209. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js.map +1 -1
  210. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +50 -6
  211. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
  212. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +84 -12
  213. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
  214. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts +89 -5
  215. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -1
  216. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +216 -70
  217. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
  218. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts +62 -3
  219. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts.map +1 -1
  220. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +140 -42
  221. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js.map +1 -1
  222. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +81 -10
  223. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  224. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +165 -37
  225. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  226. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +140 -15
  227. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  228. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +326 -100
  229. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  230. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts +101 -15
  231. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts.map +1 -1
  232. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js +281 -97
  233. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js.map +1 -1
  234. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts +43 -25
  235. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts.map +1 -1
  236. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js +100 -64
  237. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js.map +1 -1
  238. package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts +14 -2
  239. package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts.map +1 -1
  240. package/dist/lib/custom/ai-agent-run/flow/constellation.component.js +71 -53
  241. package/dist/lib/custom/ai-agent-run/flow/constellation.component.js.map +1 -1
  242. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts +14 -2
  243. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts.map +1 -1
  244. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js +70 -52
  245. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js.map +1 -1
  246. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts +8 -0
  247. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts.map +1 -1
  248. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js +22 -6
  249. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js.map +1 -1
  250. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts +24 -2
  251. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts.map +1 -1
  252. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js +91 -59
  253. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js.map +1 -1
  254. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts +10 -2
  255. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts.map +1 -1
  256. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js +33 -17
  257. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js.map +1 -1
  258. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts +2 -0
  259. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts.map +1 -1
  260. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js +34 -30
  261. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js.map +1 -1
  262. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts +14 -2
  263. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts.map +1 -1
  264. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js +69 -51
  265. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js.map +1 -1
  266. package/dist/lib/custom/custom-forms.module.d.ts +56 -48
  267. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  268. package/dist/lib/custom/custom-forms.module.js +60 -0
  269. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  270. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +38 -12
  271. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
  272. package/dist/lib/custom/shared/entity-selector-dialog.component.js +103 -51
  273. package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
  274. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
  275. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +61 -43
  276. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  277. package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.d.ts +10 -0
  278. package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.d.ts.map +1 -0
  279. package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.js +74 -0
  280. package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.js.map +1 -0
  281. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
  282. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +37 -19
  283. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
  284. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
  285. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +78 -52
  286. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
  287. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js +76 -74
  288. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js.map +1 -1
  289. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  290. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +156 -84
  291. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  292. package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.d.ts +10 -0
  293. package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.d.ts.map +1 -0
  294. package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.js +62 -0
  295. package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.js.map +1 -0
  296. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.d.ts.map +1 -1
  297. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js +24 -6
  298. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js.map +1 -1
  299. package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js +27 -25
  300. package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js.map +1 -1
  301. package/dist/lib/generated/Entities/MJRecordChange/mjrecordchange.form.component.d.ts.map +1 -1
  302. package/dist/lib/generated/Entities/MJRecordChange/mjrecordchange.form.component.js +24 -16
  303. package/dist/lib/generated/Entities/MJRecordChange/mjrecordchange.form.component.js.map +1 -1
  304. package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.d.ts +10 -0
  305. package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.d.ts.map +1 -0
  306. package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.js +107 -0
  307. package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.js.map +1 -0
  308. package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.d.ts +10 -0
  309. package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.d.ts.map +1 -0
  310. package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.js +74 -0
  311. package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.js.map +1 -0
  312. package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.d.ts +10 -0
  313. package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.d.ts.map +1 -0
  314. package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.js +135 -0
  315. package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.js.map +1 -0
  316. package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.d.ts +10 -0
  317. package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.d.ts.map +1 -0
  318. package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.js +87 -0
  319. package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.js.map +1 -0
  320. package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.d.ts +10 -0
  321. package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.d.ts.map +1 -0
  322. package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.js +107 -0
  323. package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.js.map +1 -0
  324. package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.d.ts +10 -0
  325. package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.d.ts.map +1 -0
  326. package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.js +155 -0
  327. package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.js.map +1 -0
  328. package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.d.ts +10 -0
  329. package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.d.ts.map +1 -0
  330. package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.js +62 -0
  331. package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.js.map +1 -0
  332. package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.d.ts +10 -0
  333. package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.d.ts.map +1 -0
  334. package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.js +183 -0
  335. package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.js.map +1 -0
  336. package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.d.ts +10 -0
  337. package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.d.ts.map +1 -0
  338. package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.js +120 -0
  339. package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.js.map +1 -0
  340. package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.d.ts +10 -0
  341. package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.d.ts.map +1 -0
  342. package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.js +107 -0
  343. package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.js.map +1 -0
  344. package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.d.ts +10 -0
  345. package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.d.ts.map +1 -0
  346. package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.js +103 -0
  347. package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.js.map +1 -0
  348. package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.d.ts +10 -0
  349. package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.d.ts.map +1 -0
  350. package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.js +171 -0
  351. package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.js.map +1 -0
  352. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.d.ts.map +1 -1
  353. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js +24 -16
  354. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js.map +1 -1
  355. package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.js +27 -25
  356. package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.js.map +1 -1
  357. package/dist/lib/generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component.d.ts.map +1 -1
  358. package/dist/lib/generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component.js +19 -11
  359. package/dist/lib/generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component.js.map +1 -1
  360. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  361. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +209 -119
  362. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  363. package/dist/lib/generated/generated-forms.module.d.ts +436 -422
  364. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  365. package/dist/lib/generated/generated-forms.module.js +44 -2
  366. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  367. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts +5 -1
  368. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts.map +1 -1
  369. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js +11 -3
  370. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js.map +1 -1
  371. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts +2 -0
  372. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts.map +1 -1
  373. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js +16 -12
  374. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js.map +1 -1
  375. package/dist/lib/panels/content-sources/website-crawler-settings.panel.d.ts +1 -1
  376. package/dist/lib/panels/content-sources/website-crawler-settings.panel.js +2 -2
  377. package/dist/lib/panels/content-sources/website-crawler-settings.panel.js.map +1 -1
  378. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +45 -19
  379. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -1
  380. package/dist/lib/panels/model-predictions/model-prediction.logic.js +95 -43
  381. package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -1
  382. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts +20 -16
  383. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts.map +1 -1
  384. package/dist/lib/panels/model-predictions/model-prediction.panel.js +73 -65
  385. package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -1
  386. package/dist/lib/panels/record-clone/entity-clone-config-editor.component.d.ts +116 -0
  387. package/dist/lib/panels/record-clone/entity-clone-config-editor.component.d.ts.map +1 -0
  388. package/dist/lib/panels/record-clone/entity-clone-config-editor.component.js +820 -0
  389. package/dist/lib/panels/record-clone/entity-clone-config-editor.component.js.map +1 -0
  390. package/dist/lib/shared/components/template-editor.component.d.ts +158 -15
  391. package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
  392. package/dist/lib/shared/components/template-editor.component.js +389 -127
  393. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  394. package/dist/public-api.d.ts +5 -0
  395. package/dist/public-api.d.ts.map +1 -1
  396. package/dist/public-api.js +5 -0
  397. package/dist/public-api.js.map +1 -1
  398. package/package.json +47 -42
@@ -22,9 +22,10 @@ import * as i4 from "./template-param-dialog.component";
22
22
  import * as i5 from "./template-params-grid.component";
23
23
  import * as i6 from "../../shared/components/template-editor.component";
24
24
  const _c0 = ["codeEditor"];
25
+ const _c1 = ["templateEditor"];
25
26
  function MJTemplateFormComponentExtended_Conditional_0_Conditional_9_Template(rf, ctx) { if (rf & 1) {
26
27
  const _r3 = i0.ɵɵgetCurrentView();
27
- i0.ɵɵelementStart(0, "input", 37);
28
+ i0.ɵɵelementStart(0, "input", 38);
28
29
  i0.ɵɵtwoWayListener("ngModelChange", function MJTemplateFormComponentExtended_Conditional_0_Conditional_9_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.record.Name, $event) || (ctx_r1.record.Name = $event); return i0.ɵɵresetView($event); });
29
30
  i0.ɵɵelementEnd();
30
31
  } if (rf & 2) {
@@ -32,14 +33,14 @@ function MJTemplateFormComponentExtended_Conditional_0_Conditional_9_Template(rf
32
33
  i0.ɵɵtwoWayProperty("ngModel", ctx_r1.record.Name);
33
34
  } }
34
35
  function MJTemplateFormComponentExtended_Conditional_0_Conditional_10_Conditional_2_Template(rf, ctx) { if (rf & 1) {
35
- i0.ɵɵelementStart(0, "span", 38);
36
- i0.ɵɵelement(1, "i", 40);
36
+ i0.ɵɵelementStart(0, "span", 39);
37
+ i0.ɵɵelement(1, "i", 41);
37
38
  i0.ɵɵtext(2, " Active ");
38
39
  i0.ɵɵelementEnd();
39
40
  } }
40
41
  function MJTemplateFormComponentExtended_Conditional_0_Conditional_10_Conditional_3_Template(rf, ctx) { if (rf & 1) {
41
- i0.ɵɵelementStart(0, "span", 39);
42
- i0.ɵɵelement(1, "i", 41);
42
+ i0.ɵɵelementStart(0, "span", 40);
43
+ i0.ɵɵelement(1, "i", 42);
43
44
  i0.ɵɵtext(2, " Inactive ");
44
45
  i0.ɵɵelementEnd();
45
46
  } }
@@ -47,7 +48,7 @@ function MJTemplateFormComponentExtended_Conditional_0_Conditional_10_Template(r
47
48
  i0.ɵɵelementStart(0, "h4");
48
49
  i0.ɵɵtext(1);
49
50
  i0.ɵɵelementEnd();
50
- i0.ɵɵconditionalCreate(2, MJTemplateFormComponentExtended_Conditional_0_Conditional_10_Conditional_2_Template, 3, 0, "span", 38)(3, MJTemplateFormComponentExtended_Conditional_0_Conditional_10_Conditional_3_Template, 3, 0, "span", 39);
51
+ i0.ɵɵconditionalCreate(2, MJTemplateFormComponentExtended_Conditional_0_Conditional_10_Conditional_2_Template, 3, 0, "span", 39)(3, MJTemplateFormComponentExtended_Conditional_0_Conditional_10_Conditional_3_Template, 3, 0, "span", 40);
51
52
  } if (rf & 2) {
52
53
  const ctx_r1 = i0.ɵɵnextContext(2);
53
54
  i0.ɵɵadvance();
@@ -57,17 +58,17 @@ function MJTemplateFormComponentExtended_Conditional_0_Conditional_10_Template(r
57
58
  } }
58
59
  function MJTemplateFormComponentExtended_Conditional_0_Conditional_11_Template(rf, ctx) { if (rf & 1) {
59
60
  const _r4 = i0.ɵɵgetCurrentView();
60
- i0.ɵɵelementStart(0, "div", 10)(1, "div")(2, "label", 42);
61
+ i0.ɵɵelementStart(0, "div", 11)(1, "div")(2, "label", 43);
61
62
  i0.ɵɵtext(3, "Category");
62
63
  i0.ɵɵelementEnd();
63
- i0.ɵɵelementStart(4, "mj-combobox", 43);
64
+ i0.ɵɵelementStart(4, "mj-combobox", 44);
64
65
  i0.ɵɵtwoWayListener("ngModelChange", function MJTemplateFormComponentExtended_Conditional_0_Conditional_11_Template_mj_combobox_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.record.CategoryID, $event) || (ctx_r1.record.CategoryID = $event); return i0.ɵɵresetView($event); });
65
66
  i0.ɵɵlistener("ValueChange", function MJTemplateFormComponentExtended_Conditional_0_Conditional_11_Template_mj_combobox_ValueChange_4_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onCategoryChange($event)); });
66
67
  i0.ɵɵelementEnd()();
67
- i0.ɵɵelementStart(5, "div")(6, "label", 42);
68
+ i0.ɵɵelementStart(5, "div")(6, "label", 43);
68
69
  i0.ɵɵtext(7, "Active");
69
70
  i0.ɵɵelementEnd();
70
- i0.ɵɵelementStart(8, "mj-switch", 44);
71
+ i0.ɵɵelementStart(8, "mj-switch", 45);
71
72
  i0.ɵɵtwoWayListener("ngModelChange", function MJTemplateFormComponentExtended_Conditional_0_Conditional_11_Template_mj_switch_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.record.IsActive, $event) || (ctx_r1.record.IsActive = $event); return i0.ɵɵresetView($event); });
72
73
  i0.ɵɵelementEnd()()();
73
74
  } if (rf & 2) {
@@ -80,7 +81,7 @@ function MJTemplateFormComponentExtended_Conditional_0_Conditional_11_Template(r
80
81
  } }
81
82
  function MJTemplateFormComponentExtended_Conditional_0_Conditional_12_Template(rf, ctx) { if (rf & 1) {
82
83
  const _r5 = i0.ɵɵgetCurrentView();
83
- i0.ɵɵelementStart(0, "textarea", 45);
84
+ i0.ɵɵelementStart(0, "textarea", 46);
84
85
  i0.ɵɵtwoWayListener("ngModelChange", function MJTemplateFormComponentExtended_Conditional_0_Conditional_12_Template_textarea_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.record.Description, $event) || (ctx_r1.record.Description = $event); return i0.ɵɵresetView($event); });
85
86
  i0.ɵɵelementEnd();
86
87
  } if (rf & 2) {
@@ -89,7 +90,7 @@ function MJTemplateFormComponentExtended_Conditional_0_Conditional_12_Template(r
89
90
  i0.ɵɵproperty("rows", 2);
90
91
  } }
91
92
  function MJTemplateFormComponentExtended_Conditional_0_Conditional_13_Template(rf, ctx) { if (rf & 1) {
92
- i0.ɵɵelementStart(0, "p", 12);
93
+ i0.ɵɵelementStart(0, "p", 13);
93
94
  i0.ɵɵtext(1);
94
95
  i0.ɵɵelementEnd();
95
96
  } if (rf & 2) {
@@ -98,12 +99,12 @@ function MJTemplateFormComponentExtended_Conditional_0_Conditional_13_Template(r
98
99
  i0.ɵɵtextInterpolate(ctx_r1.record.Description);
99
100
  } }
100
101
  function MJTemplateFormComponentExtended_Conditional_0_Conditional_15_Template(rf, ctx) { if (rf & 1) {
101
- i0.ɵɵelementStart(0, "div", 14);
102
- i0.ɵɵelement(1, "i", 46);
103
- i0.ɵɵelementStart(2, "span", 16);
102
+ i0.ɵɵelementStart(0, "div", 15);
103
+ i0.ɵɵelement(1, "i", 47);
104
+ i0.ɵɵelementStart(2, "span", 17);
104
105
  i0.ɵɵtext(3, "Category:");
105
106
  i0.ɵɵelementEnd();
106
- i0.ɵɵelementStart(4, "span", 17);
107
+ i0.ɵɵelementStart(4, "span", 18);
107
108
  i0.ɵɵtext(5);
108
109
  i0.ɵɵelementEnd()();
109
110
  } if (rf & 2) {
@@ -113,14 +114,14 @@ function MJTemplateFormComponentExtended_Conditional_0_Conditional_15_Template(r
113
114
  } }
114
115
  function MJTemplateFormComponentExtended_Conditional_0_Conditional_23_Template(rf, ctx) { if (rf & 1) {
115
116
  const _r6 = i0.ɵɵgetCurrentView();
116
- i0.ɵɵelementStart(0, "button", 47);
117
+ i0.ɵɵelementStart(0, "button", 48);
117
118
  i0.ɵɵlistener("click", function MJTemplateFormComponentExtended_Conditional_0_Conditional_23_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.runTemplate()); });
118
- i0.ɵɵelement(1, "i", 48);
119
+ i0.ɵɵelement(1, "i", 49);
119
120
  i0.ɵɵtext(2, " Run ");
120
121
  i0.ɵɵelementEnd();
121
122
  } }
122
123
  function MJTemplateFormComponentExtended_Conditional_0_ng_template_26_Conditional_3_Template(rf, ctx) { if (rf & 1) {
123
- i0.ɵɵelementStart(0, "span", 51);
124
+ i0.ɵɵelementStart(0, "span", 52);
124
125
  i0.ɵɵtext(1);
125
126
  i0.ɵɵelementEnd();
126
127
  } if (rf & 2) {
@@ -129,33 +130,33 @@ function MJTemplateFormComponentExtended_Conditional_0_ng_template_26_Conditiona
129
130
  i0.ɵɵtextInterpolate(ctx_r1.templateContents.length);
130
131
  } }
131
132
  function MJTemplateFormComponentExtended_Conditional_0_ng_template_26_Template(rf, ctx) { if (rf & 1) {
132
- i0.ɵɵelementStart(0, "span", 49);
133
- i0.ɵɵelement(1, "i", 50);
133
+ i0.ɵɵelementStart(0, "span", 50);
134
+ i0.ɵɵelement(1, "i", 51);
134
135
  i0.ɵɵtext(2, " Template Editor ");
135
- i0.ɵɵconditionalCreate(3, MJTemplateFormComponentExtended_Conditional_0_ng_template_26_Conditional_3_Template, 2, 1, "span", 51);
136
+ i0.ɵɵconditionalCreate(3, MJTemplateFormComponentExtended_Conditional_0_ng_template_26_Conditional_3_Template, 2, 1, "span", 52);
136
137
  i0.ɵɵelementEnd();
137
138
  } if (rf & 2) {
138
139
  const ctx_r1 = i0.ɵɵnextContext(2);
139
140
  i0.ɵɵadvance(3);
140
141
  i0.ɵɵconditional(ctx_r1.templateContents.length > 0 ? 3 : -1);
141
142
  } }
142
- function MJTemplateFormComponentExtended_Conditional_0_ng_template_30_Template(rf, ctx) { if (rf & 1) {
143
- i0.ɵɵelementStart(0, "span", 49);
144
- i0.ɵɵelement(1, "i", 52);
143
+ function MJTemplateFormComponentExtended_Conditional_0_ng_template_31_Template(rf, ctx) { if (rf & 1) {
144
+ i0.ɵɵelementStart(0, "span", 50);
145
+ i0.ɵɵelement(1, "i", 53);
145
146
  i0.ɵɵtext(2, " Details ");
146
147
  i0.ɵɵelementEnd();
147
148
  } }
148
- function MJTemplateFormComponentExtended_Conditional_0_Conditional_44_ng_template_1_Template(rf, ctx) { if (rf & 1) {
149
- i0.ɵɵelementStart(0, "span", 49);
150
- i0.ɵɵelement(1, "i", 55);
149
+ function MJTemplateFormComponentExtended_Conditional_0_Conditional_45_ng_template_1_Template(rf, ctx) { if (rf & 1) {
150
+ i0.ɵɵelementStart(0, "span", 50);
151
+ i0.ɵɵelement(1, "i", 56);
151
152
  i0.ɵɵtext(2, " Parameters ");
152
153
  i0.ɵɵelementEnd();
153
154
  } }
154
- function MJTemplateFormComponentExtended_Conditional_0_Conditional_44_Template(rf, ctx) { if (rf & 1) {
155
- i0.ɵɵelementStart(0, "mj-accordion-panel", 21);
156
- i0.ɵɵtemplate(1, MJTemplateFormComponentExtended_Conditional_0_Conditional_44_ng_template_1_Template, 3, 0, "ng-template", 22);
157
- i0.ɵɵelementStart(2, "div", 53);
158
- i0.ɵɵelement(3, "mj-template-params-grid", 54);
155
+ function MJTemplateFormComponentExtended_Conditional_0_Conditional_45_Template(rf, ctx) { if (rf & 1) {
156
+ i0.ɵɵelementStart(0, "mj-accordion-panel", 22);
157
+ i0.ɵɵtemplate(1, MJTemplateFormComponentExtended_Conditional_0_Conditional_45_ng_template_1_Template, 3, 0, "ng-template", 23);
158
+ i0.ɵɵelementStart(2, "div", 54);
159
+ i0.ɵɵelement(3, "mj-template-params-grid", 55);
159
160
  i0.ɵɵelementEnd()();
160
161
  } if (rf & 2) {
161
162
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -163,17 +164,17 @@ function MJTemplateFormComponentExtended_Conditional_0_Conditional_44_Template(r
163
164
  i0.ɵɵadvance(3);
164
165
  i0.ɵɵproperty("template", ctx_r1.record)("editMode", ctx_r1.EditMode);
165
166
  } }
166
- function MJTemplateFormComponentExtended_Conditional_0_Conditional_45_ng_template_1_Template(rf, ctx) { if (rf & 1) {
167
- i0.ɵɵelementStart(0, "span", 49);
168
- i0.ɵɵelement(1, "i", 57);
167
+ function MJTemplateFormComponentExtended_Conditional_0_Conditional_46_ng_template_1_Template(rf, ctx) { if (rf & 1) {
168
+ i0.ɵɵelementStart(0, "span", 50);
169
+ i0.ɵɵelement(1, "i", 58);
169
170
  i0.ɵɵtext(2, " AI Prompts ");
170
171
  i0.ɵɵelementEnd();
171
172
  } }
172
- function MJTemplateFormComponentExtended_Conditional_0_Conditional_45_Template(rf, ctx) { if (rf & 1) {
173
- i0.ɵɵelementStart(0, "mj-accordion-panel", 21);
174
- i0.ɵɵtemplate(1, MJTemplateFormComponentExtended_Conditional_0_Conditional_45_ng_template_1_Template, 3, 0, "ng-template", 22);
175
- i0.ɵɵelementStart(2, "div", 53);
176
- i0.ɵɵelement(3, "mj-explorer-entity-data-grid", 56);
173
+ function MJTemplateFormComponentExtended_Conditional_0_Conditional_46_Template(rf, ctx) { if (rf & 1) {
174
+ i0.ɵɵelementStart(0, "mj-accordion-panel", 22);
175
+ i0.ɵɵtemplate(1, MJTemplateFormComponentExtended_Conditional_0_Conditional_46_ng_template_1_Template, 3, 0, "ng-template", 23);
176
+ i0.ɵɵelementStart(2, "div", 54);
177
+ i0.ɵɵelement(3, "mj-explorer-entity-data-grid", 57);
177
178
  i0.ɵɵelementEnd()();
178
179
  } if (rf & 2) {
179
180
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -181,17 +182,17 @@ function MJTemplateFormComponentExtended_Conditional_0_Conditional_45_Template(r
181
182
  i0.ɵɵadvance(3);
182
183
  i0.ɵɵproperty("Params", ctx_r1.BuildRelationshipViewParamsByEntityName("MJ: AI Prompts", "TemplateID"))("NewRecordValues", ctx_r1.NewRecordValues("MJ: AI Prompts"))("AllowLoad", true)("ShowToolbar", false);
183
184
  } }
184
- function MJTemplateFormComponentExtended_Conditional_0_Conditional_46_ng_template_1_Template(rf, ctx) { if (rf & 1) {
185
- i0.ɵɵelementStart(0, "span", 49);
186
- i0.ɵɵelement(1, "i", 58);
185
+ function MJTemplateFormComponentExtended_Conditional_0_Conditional_47_ng_template_1_Template(rf, ctx) { if (rf & 1) {
186
+ i0.ɵɵelementStart(0, "span", 50);
187
+ i0.ɵɵelement(1, "i", 59);
187
188
  i0.ɵɵtext(2, " Entity Documents ");
188
189
  i0.ɵɵelementEnd();
189
190
  } }
190
- function MJTemplateFormComponentExtended_Conditional_0_Conditional_46_Template(rf, ctx) { if (rf & 1) {
191
- i0.ɵɵelementStart(0, "mj-accordion-panel", 21);
192
- i0.ɵɵtemplate(1, MJTemplateFormComponentExtended_Conditional_0_Conditional_46_ng_template_1_Template, 3, 0, "ng-template", 22);
193
- i0.ɵɵelementStart(2, "div", 53);
194
- i0.ɵɵelement(3, "mj-explorer-entity-data-grid", 56);
191
+ function MJTemplateFormComponentExtended_Conditional_0_Conditional_47_Template(rf, ctx) { if (rf & 1) {
192
+ i0.ɵɵelementStart(0, "mj-accordion-panel", 22);
193
+ i0.ɵɵtemplate(1, MJTemplateFormComponentExtended_Conditional_0_Conditional_47_ng_template_1_Template, 3, 0, "ng-template", 23);
194
+ i0.ɵɵelementStart(2, "div", 54);
195
+ i0.ɵɵelement(3, "mj-explorer-entity-data-grid", 57);
195
196
  i0.ɵɵelementEnd()();
196
197
  } if (rf & 2) {
197
198
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -201,47 +202,47 @@ function MJTemplateFormComponentExtended_Conditional_0_Conditional_46_Template(r
201
202
  } }
202
203
  function MJTemplateFormComponentExtended_Conditional_0_Template(rf, ctx) { if (rf & 1) {
203
204
  const _r1 = i0.ɵɵgetCurrentView();
204
- i0.ɵɵelementStart(0, "mj-record-form-container", 1);
205
+ i0.ɵɵelementStart(0, "mj-record-form-container", 2);
205
206
  i0.ɵɵlistener("Navigate", function MJTemplateFormComponentExtended_Conditional_0_Template_mj_record_form_container_Navigate_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFormNavigate($event)); })("DeleteRequested", function MJTemplateFormComponentExtended_Conditional_0_Template_mj_record_form_container_DeleteRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDeleteRequested()); })("FavoriteToggled", function MJTemplateFormComponentExtended_Conditional_0_Template_mj_record_form_container_FavoriteToggled_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFavoriteToggled()); })("HistoryRequested", function MJTemplateFormComponentExtended_Conditional_0_Template_mj_record_form_container_HistoryRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnHistoryRequested()); })("ListManagementRequested", function MJTemplateFormComponentExtended_Conditional_0_Template_mj_record_form_container_ListManagementRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnListManagementRequested()); });
206
- i0.ɵɵelementStart(1, "form", 2, 0)(3, "div", 3)(4, "div", 4)(5, "div", 5)(6, "div", 6)(7, "div", 7);
207
- i0.ɵɵelement(8, "i", 8);
208
- i0.ɵɵconditionalCreate(9, MJTemplateFormComponentExtended_Conditional_0_Conditional_9_Template, 1, 1, "input", 9)(10, MJTemplateFormComponentExtended_Conditional_0_Conditional_10_Template, 4, 2);
207
+ i0.ɵɵelementStart(1, "form", 3, 0)(3, "div", 4)(4, "div", 5)(5, "div", 6)(6, "div", 7)(7, "div", 8);
208
+ i0.ɵɵelement(8, "i", 9);
209
+ i0.ɵɵconditionalCreate(9, MJTemplateFormComponentExtended_Conditional_0_Conditional_9_Template, 1, 1, "input", 10)(10, MJTemplateFormComponentExtended_Conditional_0_Conditional_10_Template, 4, 2);
209
210
  i0.ɵɵelementEnd();
210
- i0.ɵɵconditionalCreate(11, MJTemplateFormComponentExtended_Conditional_0_Conditional_11_Template, 9, 5, "div", 10);
211
- i0.ɵɵconditionalCreate(12, MJTemplateFormComponentExtended_Conditional_0_Conditional_12_Template, 1, 2, "textarea", 11)(13, MJTemplateFormComponentExtended_Conditional_0_Conditional_13_Template, 2, 1, "p", 12);
212
- i0.ɵɵelementStart(14, "div", 13);
213
- i0.ɵɵconditionalCreate(15, MJTemplateFormComponentExtended_Conditional_0_Conditional_15_Template, 6, 1, "div", 14);
214
- i0.ɵɵelementStart(16, "div", 14);
215
- i0.ɵɵelement(17, "i", 15);
216
- i0.ɵɵelementStart(18, "span", 16);
211
+ i0.ɵɵconditionalCreate(11, MJTemplateFormComponentExtended_Conditional_0_Conditional_11_Template, 9, 5, "div", 11);
212
+ i0.ɵɵconditionalCreate(12, MJTemplateFormComponentExtended_Conditional_0_Conditional_12_Template, 1, 2, "textarea", 12)(13, MJTemplateFormComponentExtended_Conditional_0_Conditional_13_Template, 2, 1, "p", 13);
213
+ i0.ɵɵelementStart(14, "div", 14);
214
+ i0.ɵɵconditionalCreate(15, MJTemplateFormComponentExtended_Conditional_0_Conditional_15_Template, 6, 1, "div", 15);
215
+ i0.ɵɵelementStart(16, "div", 15);
216
+ i0.ɵɵelement(17, "i", 16);
217
+ i0.ɵɵelementStart(18, "span", 17);
217
218
  i0.ɵɵtext(19, "Contents:");
218
219
  i0.ɵɵelementEnd();
219
- i0.ɵɵelementStart(20, "span", 17);
220
+ i0.ɵɵelementStart(20, "span", 18);
220
221
  i0.ɵɵtext(21);
221
222
  i0.ɵɵelementEnd()()()();
222
- i0.ɵɵelementStart(22, "div", 18);
223
- i0.ɵɵconditionalCreate(23, MJTemplateFormComponentExtended_Conditional_0_Conditional_23_Template, 3, 0, "button", 19);
223
+ i0.ɵɵelementStart(22, "div", 19);
224
+ i0.ɵɵconditionalCreate(23, MJTemplateFormComponentExtended_Conditional_0_Conditional_23_Template, 3, 0, "button", 20);
224
225
  i0.ɵɵelementEnd()()();
225
- i0.ɵɵelementStart(24, "div", 20)(25, "mj-accordion-panel", 21);
226
- i0.ɵɵtemplate(26, MJTemplateFormComponentExtended_Conditional_0_ng_template_26_Template, 4, 1, "ng-template", 22);
227
- i0.ɵɵelementStart(27, "div", 23)(28, "mj-template-editor", 24);
226
+ i0.ɵɵelementStart(24, "div", 21)(25, "mj-accordion-panel", 22);
227
+ i0.ɵɵtemplate(26, MJTemplateFormComponentExtended_Conditional_0_ng_template_26_Template, 4, 1, "ng-template", 23);
228
+ i0.ɵɵelementStart(27, "div", 24)(28, "mj-template-editor", 25, 1);
228
229
  i0.ɵɵlistener("contentChange", function MJTemplateFormComponentExtended_Conditional_0_Template_mj_template_editor_contentChange_28_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSharedTemplateContentChange($event)); })("runTemplate", function MJTemplateFormComponentExtended_Conditional_0_Template_mj_template_editor_runTemplate_28_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSharedTemplateRun($event)); });
229
230
  i0.ɵɵelementEnd()()();
230
- i0.ɵɵelementStart(29, "mj-accordion-panel", 21);
231
- i0.ɵɵtemplate(30, MJTemplateFormComponentExtended_Conditional_0_ng_template_30_Template, 3, 0, "ng-template", 22);
232
- i0.ɵɵelementStart(31, "div", 25)(32, "div", 26)(33, "div");
233
- i0.ɵɵelement(34, "mj-form-field", 27)(35, "mj-form-field", 28)(36, "mj-form-field", 29)(37, "mj-form-field", 30);
231
+ i0.ɵɵelementStart(30, "mj-accordion-panel", 22);
232
+ i0.ɵɵtemplate(31, MJTemplateFormComponentExtended_Conditional_0_ng_template_31_Template, 3, 0, "ng-template", 23);
233
+ i0.ɵɵelementStart(32, "div", 26)(33, "div", 27)(34, "div");
234
+ i0.ɵɵelement(35, "mj-form-field", 28)(36, "mj-form-field", 29)(37, "mj-form-field", 30)(38, "mj-form-field", 31);
234
235
  i0.ɵɵelementEnd();
235
- i0.ɵɵelementStart(38, "div");
236
- i0.ɵɵelement(39, "mj-form-field", 31)(40, "mj-form-field", 32)(41, "mj-form-field", 33)(42, "mj-form-field", 34)(43, "mj-form-field", 35);
236
+ i0.ɵɵelementStart(39, "div");
237
+ i0.ɵɵelement(40, "mj-form-field", 32)(41, "mj-form-field", 33)(42, "mj-form-field", 34)(43, "mj-form-field", 35)(44, "mj-form-field", 36);
237
238
  i0.ɵɵelementEnd()()()();
238
- i0.ɵɵconditionalCreate(44, MJTemplateFormComponentExtended_Conditional_0_Conditional_44_Template, 4, 3, "mj-accordion-panel", 21);
239
- i0.ɵɵconditionalCreate(45, MJTemplateFormComponentExtended_Conditional_0_Conditional_45_Template, 4, 5, "mj-accordion-panel", 21);
240
- i0.ɵɵconditionalCreate(46, MJTemplateFormComponentExtended_Conditional_0_Conditional_46_Template, 4, 5, "mj-accordion-panel", 21);
239
+ i0.ɵɵconditionalCreate(45, MJTemplateFormComponentExtended_Conditional_0_Conditional_45_Template, 4, 3, "mj-accordion-panel", 22);
240
+ i0.ɵɵconditionalCreate(46, MJTemplateFormComponentExtended_Conditional_0_Conditional_46_Template, 4, 5, "mj-accordion-panel", 22);
241
+ i0.ɵɵconditionalCreate(47, MJTemplateFormComponentExtended_Conditional_0_Conditional_47_Template, 4, 5, "mj-accordion-panel", 22);
241
242
  i0.ɵɵelementEnd()()()();
242
- i0.ɵɵelementStart(47, "mj-template-param-dialog", 36);
243
- i0.ɵɵtwoWayListener("isVisibleChange", function MJTemplateFormComponentExtended_Conditional_0_Template_mj_template_param_dialog_isVisibleChange_47_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.showParamDialog, $event) || (ctx_r1.showParamDialog = $event); return i0.ɵɵresetView($event); });
244
- i0.ɵɵlistener("onClose", function MJTemplateFormComponentExtended_Conditional_0_Template_mj_template_param_dialog_onClose_47_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onParamDialogClose()); });
243
+ i0.ɵɵelementStart(48, "mj-template-param-dialog", 37);
244
+ i0.ɵɵtwoWayListener("isVisibleChange", function MJTemplateFormComponentExtended_Conditional_0_Template_mj_template_param_dialog_isVisibleChange_48_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.showParamDialog, $event) || (ctx_r1.showParamDialog = $event); return i0.ɵɵresetView($event); });
245
+ i0.ɵɵlistener("onClose", function MJTemplateFormComponentExtended_Conditional_0_Template_mj_template_param_dialog_onClose_48_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onParamDialogClose()); });
245
246
  i0.ɵɵelementEnd();
246
247
  } if (rf & 2) {
247
248
  const ctx_r1 = i0.ɵɵnextContext();
@@ -262,7 +263,7 @@ function MJTemplateFormComponentExtended_Conditional_0_Template(rf, ctx) { if (r
262
263
  i0.ɵɵproperty("Expanded", true);
263
264
  i0.ɵɵadvance(3);
264
265
  i0.ɵɵproperty("template", ctx_r1.record)("config", ctx_r1.templateEditorConfig);
265
- i0.ɵɵadvance();
266
+ i0.ɵɵadvance(2);
266
267
  i0.ɵɵproperty("Expanded", false);
267
268
  i0.ɵɵadvance(5);
268
269
  i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode);
@@ -283,40 +284,40 @@ function MJTemplateFormComponentExtended_Conditional_0_Template(rf, ctx) { if (r
283
284
  i0.ɵɵadvance();
284
285
  i0.ɵɵproperty("Record", ctx_r1.record)("ShowLabel", true)("EditMode", ctx_r1.EditMode);
285
286
  i0.ɵɵadvance();
286
- i0.ɵɵconditional(ctx_r1.record.IsSaved ? 44 : -1);
287
- i0.ɵɵadvance();
288
287
  i0.ɵɵconditional(ctx_r1.record.IsSaved ? 45 : -1);
289
288
  i0.ɵɵadvance();
290
289
  i0.ɵɵconditional(ctx_r1.record.IsSaved ? 46 : -1);
291
290
  i0.ɵɵadvance();
291
+ i0.ɵɵconditional(ctx_r1.record.IsSaved ? 47 : -1);
292
+ i0.ɵɵadvance();
292
293
  i0.ɵɵproperty("template", ctx_r1.record);
293
294
  i0.ɵɵtwoWayProperty("isVisible", ctx_r1.showParamDialog);
294
295
  } }
295
296
  let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended extends MJTemplateFormComponent {
296
297
  constructor() {
297
298
  super(...arguments);
298
- this.toolbarConfig = CUSTOM_LAYOUT_TOOLBAR_CONFIG;
299
- this.templateContents = [];
300
- this.selectedContentIndex = 0;
301
- this.isAddingNewContent = false;
302
- this.newTemplateContent = null;
303
- this.hasUnsavedChanges = false;
304
- this.templateInfoExpanded = true;
305
- this.templateContentsExpanded = true;
306
- this.categoryOptions = [
299
+ this.ToolbarConfig = CUSTOM_LAYOUT_TOOLBAR_CONFIG;
300
+ this.TemplateContents = [];
301
+ this.SelectedContentIndex = 0;
302
+ this.IsAddingNewContent = false;
303
+ this.NewTemplateContent = null;
304
+ this.HasUnsavedChanges = false;
305
+ this.TemplateInfoExpanded = true;
306
+ this.TemplateContentsExpanded = true;
307
+ this.CategoryOptions = [
307
308
  { text: 'Select Category...', value: '' },
308
309
  // TODO: Load from database
309
310
  ];
310
- this.contentTypeOptions = [];
311
- this.supportedLanguages = languages;
312
- this.codeEditor = null;
311
+ this.ContentTypeOptions = [];
312
+ this.SupportedLanguages = languages;
313
+ this.CodeEditor = null;
313
314
  this.isUpdatingEditorValue = false;
314
- this.isRunningTemplate = false;
315
- this.templateTestResult = null;
316
- this.templateTestError = null;
317
- this.showParamDialog = false;
315
+ this.IsRunningTemplate = false;
316
+ this.TemplateTestResult = null;
317
+ this.TemplateTestError = null;
318
+ this.ShowParamDialog = false;
318
319
  // Template editor configuration for shared component
319
- this.templateEditorConfig = {
320
+ this.TemplateEditorConfig = {
320
321
  allowEdit: true,
321
322
  showRunButton: true,
322
323
  compactMode: false
@@ -325,13 +326,145 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
325
326
  this.activeTimeouts = [];
326
327
  this.confirmService = inject(MJConfirmService);
327
328
  }
329
+ /** @deprecated Use {@link ToolbarConfig}. */
330
+ get toolbarConfig() {
331
+ return this.ToolbarConfig;
332
+ }
328
333
  /** Custom-layout Template form looks best full-width on first open. */
329
334
  getDefaultFormWidthMode() { return 'full-width'; }
335
+ /** @deprecated Use {@link TemplateContents}. */
336
+ get templateContents() {
337
+ return this.TemplateContents;
338
+ }
339
+ /** @deprecated Use {@link TemplateContents}. */
340
+ set templateContents(value) {
341
+ this.TemplateContents = value;
342
+ }
343
+ /** @deprecated Use {@link SelectedContentIndex}. */
344
+ get selectedContentIndex() {
345
+ return this.SelectedContentIndex;
346
+ }
347
+ /** @deprecated Use {@link SelectedContentIndex}. */
348
+ set selectedContentIndex(value) {
349
+ this.SelectedContentIndex = value;
350
+ }
351
+ /** @deprecated Use {@link IsAddingNewContent}. */
352
+ get isAddingNewContent() {
353
+ return this.IsAddingNewContent;
354
+ }
355
+ /** @deprecated Use {@link IsAddingNewContent}. */
356
+ set isAddingNewContent(value) {
357
+ this.IsAddingNewContent = value;
358
+ }
359
+ /** @deprecated Use {@link NewTemplateContent}. */
360
+ get newTemplateContent() {
361
+ return this.NewTemplateContent;
362
+ }
363
+ /** @deprecated Use {@link NewTemplateContent}. */
364
+ set newTemplateContent(value) {
365
+ this.NewTemplateContent = value;
366
+ }
367
+ /** @deprecated Use {@link HasUnsavedChanges}. */
368
+ get hasUnsavedChanges() {
369
+ return this.HasUnsavedChanges;
370
+ }
371
+ /** @deprecated Use {@link HasUnsavedChanges}. */
372
+ set hasUnsavedChanges(value) {
373
+ this.HasUnsavedChanges = value;
374
+ }
375
+ /** @deprecated Use {@link TemplateInfoExpanded}. */
376
+ get templateInfoExpanded() {
377
+ return this.TemplateInfoExpanded;
378
+ }
379
+ /** @deprecated Use {@link TemplateInfoExpanded}. */
380
+ set templateInfoExpanded(value) {
381
+ this.TemplateInfoExpanded = value;
382
+ }
383
+ /** @deprecated Use {@link TemplateContentsExpanded}. */
384
+ get templateContentsExpanded() {
385
+ return this.TemplateContentsExpanded;
386
+ }
387
+ /** @deprecated Use {@link TemplateContentsExpanded}. */
388
+ set templateContentsExpanded(value) {
389
+ this.TemplateContentsExpanded = value;
390
+ }
391
+ /** @deprecated Use {@link CategoryOptions}. */
392
+ get categoryOptions() {
393
+ return this.CategoryOptions;
394
+ }
395
+ /** @deprecated Use {@link CategoryOptions}. */
396
+ set categoryOptions(value) {
397
+ this.CategoryOptions = value;
398
+ }
399
+ /** @deprecated Use {@link ContentTypeOptions}. */
400
+ get contentTypeOptions() {
401
+ return this.ContentTypeOptions;
402
+ }
403
+ /** @deprecated Use {@link ContentTypeOptions}. */
404
+ set contentTypeOptions(value) {
405
+ this.ContentTypeOptions = value;
406
+ }
407
+ /** @deprecated Use {@link SupportedLanguages}. */
408
+ get supportedLanguages() {
409
+ return this.SupportedLanguages;
410
+ }
411
+ /** @deprecated Use {@link SupportedLanguages}. */
412
+ set supportedLanguages(value) {
413
+ this.SupportedLanguages = value;
414
+ }
415
+ /** @deprecated Use {@link CodeEditor}. */
416
+ get codeEditor() {
417
+ return this.CodeEditor;
418
+ }
419
+ /** @deprecated Use {@link CodeEditor}. */
420
+ set codeEditor(value) {
421
+ this.CodeEditor = value;
422
+ }
423
+ /** @deprecated Use {@link IsRunningTemplate}. */
424
+ get isRunningTemplate() {
425
+ return this.IsRunningTemplate;
426
+ }
427
+ /** @deprecated Use {@link IsRunningTemplate}. */
428
+ set isRunningTemplate(value) {
429
+ this.IsRunningTemplate = value;
430
+ }
431
+ /** @deprecated Use {@link TemplateTestResult}. */
432
+ get templateTestResult() {
433
+ return this.TemplateTestResult;
434
+ }
435
+ /** @deprecated Use {@link TemplateTestResult}. */
436
+ set templateTestResult(value) {
437
+ this.TemplateTestResult = value;
438
+ }
439
+ /** @deprecated Use {@link TemplateTestError}. */
440
+ get templateTestError() {
441
+ return this.TemplateTestError;
442
+ }
443
+ /** @deprecated Use {@link TemplateTestError}. */
444
+ set templateTestError(value) {
445
+ this.TemplateTestError = value;
446
+ }
447
+ /** @deprecated Use {@link ShowParamDialog}. */
448
+ get showParamDialog() {
449
+ return this.ShowParamDialog;
450
+ }
451
+ /** @deprecated Use {@link ShowParamDialog}. */
452
+ set showParamDialog(value) {
453
+ this.ShowParamDialog = value;
454
+ }
455
+ /** @deprecated Use {@link TemplateEditorConfig}. */
456
+ get templateEditorConfig() {
457
+ return this.TemplateEditorConfig;
458
+ }
459
+ /** @deprecated Use {@link TemplateEditorConfig}. */
460
+ set templateEditorConfig(value) {
461
+ this.TemplateEditorConfig = value;
462
+ }
330
463
  async ngOnInit() {
331
464
  await super.ngOnInit();
332
- await this.loadTemplateContents();
333
- await this.loadCategories();
334
- this.loadContentTypes();
465
+ await this.LoadTemplateContents();
466
+ await this.LoadCategories();
467
+ this.LoadContentTypes();
335
468
  }
336
469
  ngOnDestroy() {
337
470
  this.destroy$.next();
@@ -344,7 +477,7 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
344
477
  // Initial sync when view is ready
345
478
  this.syncEditorValue();
346
479
  }
347
- async loadTemplateContents() {
480
+ async LoadTemplateContents() {
348
481
  if (this.record && this.record.ID) {
349
482
  try {
350
483
  const rv = RunView.FromMetadataProvider(this.ProviderToUse);
@@ -354,14 +487,14 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
354
487
  OrderBy: 'Priority ASC, __mj_CreatedAt ASC',
355
488
  ResultType: 'entity_object'
356
489
  });
357
- this.templateContents = results.Results;
490
+ this.TemplateContents = results.Results;
358
491
  // If we have contents but no selection, select the first one
359
- if (this.templateContents.length > 0 && this.selectedContentIndex === 0) {
360
- this.selectedContentIndex = 0;
492
+ if (this.TemplateContents.length > 0 && this.SelectedContentIndex === 0) {
493
+ this.SelectedContentIndex = 0;
361
494
  }
362
495
  // If no template contents exist, create a default one for single-content optimization
363
- if (this.templateContents.length === 0) {
364
- await this.createDefaultTemplateContent();
496
+ if (this.TemplateContents.length === 0) {
497
+ await this.CreateDefaultTemplateContent();
365
498
  }
366
499
  // Entity change tracking is handled automatically by BaseEntity
367
500
  // Sync editor value after loading content
@@ -372,25 +505,33 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
372
505
  }
373
506
  }
374
507
  }
375
- async createDefaultTemplateContent() {
508
+ /** @deprecated Use {@link LoadTemplateContents}. */
509
+ async loadTemplateContents() {
510
+ return this.LoadTemplateContents();
511
+ }
512
+ async CreateDefaultTemplateContent() {
376
513
  const md = this.ProviderToUse;
377
514
  const defaultContent = await md.GetEntityObject('MJ: Template Contents');
378
515
  defaultContent.TemplateID = this.record.ID;
379
516
  defaultContent.Priority = 1;
380
517
  defaultContent.IsActive = true;
381
518
  // Set default to first real content type (skip "Select Type..." if it exists)
382
- const validContentTypes = this.contentTypeOptions.filter(option => option.value !== '');
519
+ const validContentTypes = this.ContentTypeOptions.filter(option => option.value !== '');
383
520
  if (validContentTypes.length > 0) {
384
521
  defaultContent.TypeID = validContentTypes[0].value;
385
522
  }
386
- this.templateContents = [defaultContent];
387
- this.selectedContentIndex = 0;
523
+ this.TemplateContents = [defaultContent];
524
+ this.SelectedContentIndex = 0;
388
525
  // Sync editor value after creating default content
389
526
  this.syncEditorValue();
390
527
  }
391
- async selectTemplateContent(index, confirmSwitch = true) {
528
+ /** @deprecated Use {@link CreateDefaultTemplateContent}. */
529
+ async createDefaultTemplateContent() {
530
+ return this.CreateDefaultTemplateContent();
531
+ }
532
+ async SelectTemplateContent(index, confirmSwitch = true) {
392
533
  // If we're adding new content and user clicks on existing content, ask for confirmation
393
- if (this.isAddingNewContent && confirmSwitch) {
534
+ if (this.IsAddingNewContent && confirmSwitch) {
394
535
  if (!(await this.confirmService.Confirm({
395
536
  title: 'Discard changes?',
396
537
  message: 'Switch content version and lose your unsaved changes?',
@@ -399,21 +540,25 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
399
540
  return;
400
541
  }
401
542
  }
402
- if (index >= 0 && index < this.templateContents.length) {
403
- this.selectedContentIndex = index;
404
- this.isAddingNewContent = false;
543
+ if (index >= 0 && index < this.TemplateContents.length) {
544
+ this.SelectedContentIndex = index;
545
+ this.IsAddingNewContent = false;
405
546
  // Don't clear newTemplateContent to preserve the work in progress
406
547
  // Sync editor value when switching content
407
548
  this.syncEditorValue();
408
549
  }
409
550
  }
410
- async loadCategories() {
551
+ /** @deprecated Use {@link SelectTemplateContent}. */
552
+ async selectTemplateContent(index, confirmSwitch = true) {
553
+ return this.SelectTemplateContent(index, confirmSwitch);
554
+ }
555
+ async LoadCategories() {
411
556
  try {
412
557
  const rv = RunView.FromMetadataProvider(this.ProviderToUse);
413
558
  const results = await rv.RunView({
414
559
  EntityName: 'MJ: Template Categories'
415
560
  });
416
- this.categoryOptions = [
561
+ this.CategoryOptions = [
417
562
  { text: 'Select Category...', value: '' },
418
563
  ...results.Results.map((cat) => ({
419
564
  text: cat.Name,
@@ -423,14 +568,18 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
423
568
  }
424
569
  catch (error) {
425
570
  console.error('Error loading categories:', error);
426
- this.categoryOptions = [{ text: 'Select Category...', value: '' }];
571
+ this.CategoryOptions = [{ text: 'Select Category...', value: '' }];
427
572
  }
428
573
  }
429
- loadContentTypes() {
574
+ /** @deprecated Use {@link LoadCategories}. */
575
+ async loadCategories() {
576
+ return this.LoadCategories();
577
+ }
578
+ LoadContentTypes() {
430
579
  try {
431
580
  // Get content types from TemplateEngine cache
432
581
  const contentTypes = TemplateEngineBase.Instance.TemplateContentTypes;
433
- this.contentTypeOptions = [
582
+ this.ContentTypeOptions = [
434
583
  { text: 'Select Type...', value: '' },
435
584
  ...contentTypes.map(ct => ({
436
585
  text: ct.Name,
@@ -441,7 +590,7 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
441
590
  catch (error) {
442
591
  console.error('Error loading content types:', error);
443
592
  // Fallback to basic types
444
- this.contentTypeOptions = [
593
+ this.ContentTypeOptions = [
445
594
  { text: 'Select Type...', value: '' },
446
595
  { text: 'HTML', value: 'HTML' },
447
596
  { text: 'Plain Text', value: 'Text' },
@@ -449,12 +598,16 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
449
598
  ];
450
599
  }
451
600
  }
452
- async onCategoryChange(value) {
601
+ /** @deprecated Use {@link LoadContentTypes}. */
602
+ loadContentTypes() {
603
+ return this.LoadContentTypes();
604
+ }
605
+ async OnCategoryChange(value) {
453
606
  // If it's a new category (string but not in existing options)
454
- if (value && !this.categoryOptions.find(opt => opt.value === value)) {
607
+ if (value && !this.CategoryOptions.find(opt => opt.value === value)) {
455
608
  // Check for duplicate category names (case-insensitive, trimmed)
456
609
  if (this.isDuplicateCategory(value)) {
457
- const existingCategory = this.categoryOptions.find(option => option.text && option.text.trim().toLowerCase() === value.trim().toLowerCase());
610
+ const existingCategory = this.CategoryOptions.find(option => option.text && option.text.trim().toLowerCase() === value.trim().toLowerCase());
458
611
  if (existingCategory) {
459
612
  // Use the existing category instead
460
613
  this.record.CategoryID = existingCategory.value;
@@ -471,7 +624,7 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
471
624
  const saved = await newCategory.Save();
472
625
  if (saved) {
473
626
  // Add to options and set the ID
474
- this.categoryOptions.push({
627
+ this.CategoryOptions.push({
475
628
  text: newCategory.Name,
476
629
  value: newCategory.ID
477
630
  });
@@ -488,44 +641,56 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
488
641
  }
489
642
  }
490
643
  }
491
- async addNewTemplateContent() {
644
+ /** @deprecated Use {@link OnCategoryChange}. */
645
+ async onCategoryChange(value) {
646
+ return this.OnCategoryChange(value);
647
+ }
648
+ async AddNewTemplateContent() {
492
649
  const md = this.ProviderToUse;
493
- this.newTemplateContent = await md.GetEntityObject('MJ: Template Contents');
494
- this.newTemplateContent.TemplateID = this.record.ID;
495
- this.newTemplateContent.Priority = this.templateContents.length + 1;
496
- this.newTemplateContent.IsActive = true;
650
+ this.NewTemplateContent = await md.GetEntityObject('MJ: Template Contents');
651
+ this.NewTemplateContent.TemplateID = this.record.ID;
652
+ this.NewTemplateContent.Priority = this.TemplateContents.length + 1;
653
+ this.NewTemplateContent.IsActive = true;
497
654
  // Set default to first real content type (skip "Select Type..." if it exists)
498
- const validContentTypes = this.contentTypeOptions.filter(option => option.value !== '');
655
+ const validContentTypes = this.ContentTypeOptions.filter(option => option.value !== '');
499
656
  if (validContentTypes.length > 0) {
500
- this.newTemplateContent.TypeID = validContentTypes[0].value;
657
+ this.NewTemplateContent.TypeID = validContentTypes[0].value;
501
658
  }
502
- this.newTemplateContent.TemplateText = '';
659
+ this.NewTemplateContent.TemplateText = '';
503
660
  // Add immediately to the array
504
- this.templateContents.push(this.newTemplateContent);
505
- this.selectedContentIndex = this.templateContents.length - 1;
506
- this.isAddingNewContent = true;
661
+ this.TemplateContents.push(this.NewTemplateContent);
662
+ this.SelectedContentIndex = this.TemplateContents.length - 1;
663
+ this.IsAddingNewContent = true;
507
664
  // Sync editor value when adding new content
508
665
  this.syncEditorValue();
509
666
  }
667
+ /** @deprecated Use {@link AddNewTemplateContent}. */
668
+ async addNewTemplateContent() {
669
+ return this.AddNewTemplateContent();
670
+ }
671
+ CancelNewTemplateContent() {
672
+ this.IsAddingNewContent = false;
673
+ this.NewTemplateContent = null;
674
+ }
675
+ /** @deprecated Use {@link CancelNewTemplateContent}. */
510
676
  cancelNewTemplateContent() {
511
- this.isAddingNewContent = false;
512
- this.newTemplateContent = null;
677
+ return this.CancelNewTemplateContent();
513
678
  }
514
- async deleteTemplateContent(index) {
515
- if (index >= 0 && index < this.templateContents.length) {
516
- const contentToDelete = this.templateContents[index];
679
+ async DeleteTemplateContent(index) {
680
+ if (index >= 0 && index < this.TemplateContents.length) {
681
+ const contentToDelete = this.TemplateContents[index];
517
682
  if (contentToDelete.ID) {
518
683
  try {
519
684
  const result = await contentToDelete.Delete();
520
685
  if (result) {
521
- this.templateContents.splice(index, 1);
686
+ this.TemplateContents.splice(index, 1);
522
687
  // Adjust selected index if necessary
523
- if (this.selectedContentIndex >= this.templateContents.length) {
524
- this.selectedContentIndex = Math.max(0, this.templateContents.length - 1);
688
+ if (this.SelectedContentIndex >= this.TemplateContents.length) {
689
+ this.SelectedContentIndex = Math.max(0, this.TemplateContents.length - 1);
525
690
  }
526
691
  // If no contents remain, create a default one
527
- if (this.templateContents.length === 0) {
528
- await this.createDefaultTemplateContent();
692
+ if (this.TemplateContents.length === 0) {
693
+ await this.CreateDefaultTemplateContent();
529
694
  }
530
695
  }
531
696
  else {
@@ -539,14 +704,14 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
539
704
  }
540
705
  else {
541
706
  // Not saved yet, just remove from array
542
- this.templateContents.splice(index, 1);
543
- if (this.selectedContentIndex >= this.templateContents.length) {
544
- this.selectedContentIndex = Math.max(0, this.templateContents.length - 1);
707
+ this.TemplateContents.splice(index, 1);
708
+ if (this.SelectedContentIndex >= this.TemplateContents.length) {
709
+ this.SelectedContentIndex = Math.max(0, this.TemplateContents.length - 1);
545
710
  }
546
711
  // Reset adding new content state if we're deleting the new content
547
- if (this.isAddingNewContent && index === this.templateContents.length) {
548
- this.isAddingNewContent = false;
549
- this.newTemplateContent = null;
712
+ if (this.IsAddingNewContent && index === this.TemplateContents.length) {
713
+ this.IsAddingNewContent = false;
714
+ this.NewTemplateContent = null;
550
715
  }
551
716
  }
552
717
  }
@@ -554,43 +719,67 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
554
719
  console.error('Invalid index for deletion:', index);
555
720
  }
556
721
  }
557
- get currentTemplateContent() {
558
- if (this.isAddingNewContent) {
559
- return this.newTemplateContent;
722
+ /** @deprecated Use {@link DeleteTemplateContent}. */
723
+ async deleteTemplateContent(index) {
724
+ return this.DeleteTemplateContent(index);
725
+ }
726
+ get CurrentTemplateContent() {
727
+ if (this.IsAddingNewContent) {
728
+ return this.NewTemplateContent;
560
729
  }
561
- return this.templateContents[this.selectedContentIndex] || null;
730
+ return this.TemplateContents[this.SelectedContentIndex] || null;
562
731
  }
732
+ /** @deprecated Use {@link CurrentTemplateContent}. */
733
+ get currentTemplateContent() {
734
+ return this.CurrentTemplateContent;
735
+ }
736
+ get HasMultipleContents() {
737
+ return this.TemplateContents.length > 1 || this.IsAddingNewContent;
738
+ }
739
+ /** @deprecated Use {@link HasMultipleContents}. */
563
740
  get hasMultipleContents() {
564
- return this.templateContents.length > 1 || this.isAddingNewContent;
741
+ return this.HasMultipleContents;
565
742
  }
566
- onContentTypeChange() {
743
+ OnContentTypeChange() {
567
744
  // Content type changes just modify the current content, no new record creation
568
745
  this.updateUnsavedChangesFlag();
569
746
  }
570
- onContentChange() {
747
+ /** @deprecated Use {@link OnContentTypeChange}. */
748
+ onContentTypeChange() {
749
+ return this.OnContentTypeChange();
750
+ }
751
+ OnContentChange() {
571
752
  this.updateUnsavedChangesFlag();
572
753
  }
754
+ /** @deprecated Use {@link OnContentChange}. */
755
+ onContentChange() {
756
+ return this.OnContentChange();
757
+ }
573
758
  /**
574
759
  * Updates the hasUnsavedChanges flag based on entity dirty states
575
760
  */
576
761
  updateUnsavedChangesFlag() {
577
- this.hasUnsavedChanges = this.templateContents.some(content => content.Dirty) ||
578
- this.isAddingNewContent ||
762
+ this.HasUnsavedChanges = this.TemplateContents.some(content => content.Dirty) ||
763
+ this.IsAddingNewContent ||
579
764
  this.record?.Dirty || false;
580
765
  }
581
- onTemplateTextChange(event) {
766
+ OnTemplateTextChange(event) {
582
767
  if (this.isUpdatingEditorValue) {
583
768
  // Ignore change events when we're programmatically updating the editor
584
769
  return;
585
770
  }
586
- if (this.currentTemplateContent) {
771
+ if (this.CurrentTemplateContent) {
587
772
  // Extract value from event - might be event.target.value or just event depending on component
588
773
  const value = typeof event === 'string' ? event : (event.target?.value || event);
589
- this.currentTemplateContent.TemplateText = value;
774
+ this.CurrentTemplateContent.TemplateText = value;
590
775
  // hasUnsavedChanges is automatically handled by entity's IsDirty flag
591
776
  this.updateUnsavedChangesFlag();
592
777
  }
593
778
  }
779
+ /** @deprecated Use {@link OnTemplateTextChange}. */
780
+ onTemplateTextChange(event) {
781
+ return this.OnTemplateTextChange(event);
782
+ }
594
783
  /**
595
784
  * Helper method to track setTimeout calls for cleanup
596
785
  */
@@ -614,46 +803,39 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
614
803
  Promise.resolve().then(() => {
615
804
  // Then tracked setTimeout for the next macrotask to ensure DOM is updated
616
805
  this.setTrackedTimeout(() => {
617
- if (!this.codeEditor) {
806
+ if (!this.CodeEditor) {
618
807
  return;
619
808
  }
620
809
  this.isUpdatingEditorValue = true;
621
- const newValue = this.currentTemplateContent?.TemplateText || '';
810
+ const newValue = this.CurrentTemplateContent?.TemplateText || '';
622
811
  // Use the setValue method from mj-code-editor component
623
- this.codeEditor.setValue(newValue);
812
+ this.CodeEditor.setValue(newValue);
624
813
  this.isUpdatingEditorValue = false;
625
814
  }, 0);
626
815
  });
627
816
  }
628
- async saveTemplateContents() {
629
- try {
630
- // Save all template contents that have changes
631
- for (const content of this.templateContents) {
632
- content.TemplateID = this.record.ID; // Ensure FK is set
633
- if (content.Dirty || !content.ID) {
634
- const contentResult = await content.Save();
635
- if (!contentResult) {
636
- console.error('Failed to save template content:', content);
637
- return false;
638
- }
639
- }
640
- }
641
- this.isAddingNewContent = false;
642
- this.newTemplateContent = null;
643
- this.updateUnsavedChangesFlag(); // Update based on current entity states
644
- return true;
645
- }
646
- catch (error) {
647
- console.error('Error saving template contents:', error);
648
- return false;
817
+ /**
818
+ * The embedded editor's new/dirty Template Contents join this form's pending records, so
819
+ * `InternalSaveRecord()` commits the template and its contents in ONE transaction group (the
820
+ * template first, so the content's TemplateID resolves) and `Validate()` covers the contents too.
821
+ *
822
+ * Before this, the form saved each content on its own AFTER the template save had already been
823
+ * reported as successful; a content whose `Save()` returned false only reached `console.error`,
824
+ * no mutation was issued, and the editor kept showing "Unsaved changes" forever.
825
+ */
826
+ PopulatePendingRecords() {
827
+ super.PopulatePendingRecords();
828
+ const editorChanges = this.TemplateEditor?.GetPendingChanges() ?? [];
829
+ for (const change of editorChanges) {
830
+ this.PendingRecords.push(change);
649
831
  }
650
832
  }
651
833
  async SaveRecord(StopEditModeAfterSave = true) {
652
834
  // Check if we need to create a new category first
653
- if (this.record.CategoryID && !this.categoryOptions.find(opt => opt.value === this.record.CategoryID)) {
835
+ if (this.record.CategoryID && !this.CategoryOptions.find(opt => opt.value === this.record.CategoryID)) {
654
836
  // Check for duplicate category names (case-insensitive, trimmed)
655
837
  if (this.isDuplicateCategory(this.record.CategoryID)) {
656
- const existingCategory = this.categoryOptions.find(option => option.text && option.text.trim().toLowerCase() === this.record.CategoryID?.trim().toLowerCase());
838
+ const existingCategory = this.CategoryOptions.find(option => option.text && option.text.trim().toLowerCase() === this.record.CategoryID?.trim().toLowerCase());
657
839
  if (existingCategory) {
658
840
  // Use the existing category instead
659
841
  this.record.CategoryID = existingCategory.value;
@@ -670,7 +852,7 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
670
852
  const saved = await newCategory.Save();
671
853
  if (saved) {
672
854
  // Add to options and set the ID
673
- this.categoryOptions.push({
855
+ this.CategoryOptions.push({
674
856
  text: newCategory.Name,
675
857
  value: newCategory.ID
676
858
  });
@@ -695,24 +877,31 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
695
877
  const md = this.ProviderToUse;
696
878
  this.record.UserID = md.CurrentUser.ID;
697
879
  }
880
+ // The template AND the editor's contents commit together here (see PopulatePendingRecords)
698
881
  const templateSaved = await super.SaveRecord(StopEditModeAfterSave);
699
882
  if (templateSaved) {
700
- // Then save all template contents
701
- return await this.saveTemplateContents();
883
+ this.TemplateEditor?.MarkContentsSaved();
884
+ this.IsAddingNewContent = false;
885
+ this.NewTemplateContent = null;
886
+ this.updateUnsavedChangesFlag();
702
887
  }
703
- return false;
888
+ return templateSaved;
704
889
  }
705
- getContentTypeDisplayText(typeId) {
890
+ GetContentTypeDisplayText(typeId) {
706
891
  if (!typeId)
707
892
  return '-';
708
- const option = this.contentTypeOptions.find(opt => opt.value === typeId);
893
+ const option = this.ContentTypeOptions.find(opt => opt.value === typeId);
709
894
  return option ? option.text : typeId;
710
895
  }
711
- getEditorLanguage() {
712
- if (!this.currentTemplateContent?.TypeID) {
896
+ /** @deprecated Use {@link GetContentTypeDisplayText}. */
897
+ getContentTypeDisplayText(typeId) {
898
+ return this.GetContentTypeDisplayText(typeId);
899
+ }
900
+ GetEditorLanguage() {
901
+ if (!this.CurrentTemplateContent?.TypeID) {
713
902
  return 'jinja2'; // default to jinja2 for template syntax (compatible with Nunjucks)
714
903
  }
715
- const contentType = this.currentTemplateContent.TypeID.toLowerCase();
904
+ const contentType = this.CurrentTemplateContent.TypeID.toLowerCase();
716
905
  // Map content types to CodeMirror language modes
717
906
  switch (contentType) {
718
907
  case 'html':
@@ -737,20 +926,24 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
737
926
  return 'jinja2'; // Default to jinja2 since templates often contain template syntax
738
927
  }
739
928
  }
929
+ /** @deprecated Use {@link GetEditorLanguage}. */
930
+ getEditorLanguage() {
931
+ return this.GetEditorLanguage();
932
+ }
740
933
  isDuplicateCategory(categoryName) {
741
934
  const normalizedName = categoryName.trim().toLowerCase();
742
- return this.categoryOptions.some(option => option.text && option.text.trim().toLowerCase() === normalizedName);
935
+ return this.CategoryOptions.some(option => option.text && option.text.trim().toLowerCase() === normalizedName);
743
936
  }
744
937
  /**
745
938
  * Test run the current template using the parameter dialog
746
939
  */
747
- async runTemplate() {
748
- if (!this.record?.IsSaved || !this.currentTemplateContent) {
940
+ async RunTemplate() {
941
+ if (!this.record?.IsSaved || !this.CurrentTemplateContent) {
749
942
  MJNotificationService.Instance.CreateSimpleNotification('Please save the template before running it.', 'warning');
750
943
  return;
751
944
  }
752
945
  // Save any unsaved changes first
753
- if (this.hasUnsavedChanges) {
946
+ if (this.HasUnsavedChanges) {
754
947
  const saveResult = await this.SaveRecord(false); // Don't exit edit mode
755
948
  if (!saveResult) {
756
949
  MJNotificationService.Instance.CreateSimpleNotification('Failed to save template changes.', 'error');
@@ -758,39 +951,60 @@ let MJTemplateFormComponentExtended = class MJTemplateFormComponentExtended exte
758
951
  }
759
952
  }
760
953
  // Show the parameter dialog
761
- this.showParamDialog = true;
954
+ this.ShowParamDialog = true;
955
+ }
956
+ /** @deprecated Use {@link RunTemplate}. */
957
+ async runTemplate() {
958
+ return this.RunTemplate();
762
959
  }
763
960
  /**
764
961
  * Handle parameter dialog close
765
962
  */
963
+ OnParamDialogClose() {
964
+ this.ShowParamDialog = false;
965
+ }
966
+ /** @deprecated Use {@link OnParamDialogClose}. */
766
967
  onParamDialogClose() {
767
- this.showParamDialog = false;
968
+ return this.OnParamDialogClose();
768
969
  }
769
- getContentTypeOptionsForContent() {
970
+ GetContentTypeOptionsForContent() {
770
971
  // Always exclude "Select Type..." option for all content
771
- return this.contentTypeOptions.filter(option => option.value !== '');
972
+ return this.ContentTypeOptions.filter(option => option.value !== '');
973
+ }
974
+ /** @deprecated Use {@link GetContentTypeOptionsForContent}. */
975
+ getContentTypeOptionsForContent() {
976
+ return this.GetContentTypeOptionsForContent();
772
977
  }
773
978
  /**
774
979
  * Handles template content changes from the shared editor
775
980
  */
776
- onSharedTemplateContentChange(content) {
777
- this.templateContents = content;
981
+ OnSharedTemplateContentChange(content) {
982
+ this.TemplateContents = content;
778
983
  this.updateUnsavedChangesFlag();
779
984
  }
985
+ /** @deprecated Use {@link OnSharedTemplateContentChange}. */
986
+ onSharedTemplateContentChange(content) {
987
+ return this.OnSharedTemplateContentChange(content);
988
+ }
780
989
  /**
781
990
  * Handles template run requests from the shared editor
782
991
  */
992
+ OnSharedTemplateRun(template) {
993
+ this.RunTemplate();
994
+ }
995
+ /** @deprecated Use {@link OnSharedTemplateRun}. */
783
996
  onSharedTemplateRun(template) {
784
- this.runTemplate();
997
+ return this.OnSharedTemplateRun(template);
785
998
  }
786
999
  static { this.ɵfac = /*@__PURE__*/ (() => { let ɵMJTemplateFormComponentExtended_BaseFactory; return function MJTemplateFormComponentExtended_Factory(__ngFactoryType__) { return (ɵMJTemplateFormComponentExtended_BaseFactory || (ɵMJTemplateFormComponentExtended_BaseFactory = i0.ɵɵgetInheritedFactory(MJTemplateFormComponentExtended)))(__ngFactoryType__ || MJTemplateFormComponentExtended); }; })(); }
787
1000
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJTemplateFormComponentExtended, selectors: [["mj-templates-form"]], viewQuery: function MJTemplateFormComponentExtended_Query(rf, ctx) { if (rf & 1) {
788
- i0.ɵɵviewQuery(_c0, 5);
1001
+ i0.ɵɵviewQuery(_c0, 5)(_c1, 5);
789
1002
  } if (rf & 2) {
790
1003
  let _t;
791
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.codeEditor = _t.first);
792
- } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [["form", "ngForm"], [3, "Navigate", "DeleteRequested", "FavoriteToggled", "HistoryRequested", "ListManagementRequested", "Record", "FormComponent", "ToolbarConfig", "WidthMode"], [1, "record-form", 2, "display", "flex", "flex-direction", "column", "height", "100%", "overflow", "hidden"], [1, "template-main-area", 2, "display", "flex", "flex-direction", "column", "flex", "1", "min-height", "0", "overflow-y", "auto"], [1, "template-header-area"], [2, "display", "flex", "justify-content", "space-between", "align-items", "flex-start", "gap", "20px"], [2, "flex", "1", "min-width", "0"], [2, "display", "flex", "align-items", "center", "gap", "12px", "margin-bottom", "8px"], [1, "fa-solid", "fa-file-code", "template-icon"], ["type", "text", "name", "templateName", "placeholder", "Enter template name...", 1, "mj-input", 2, "font-size", "1.2em", "font-weight", "600", "min-width", "300px", "flex", "1", 3, "ngModel"], [2, "display", "flex", "gap", "16px", "margin-bottom", "12px", "flex-wrap", "wrap", "align-items", "center"], ["name", "description", "placeholder", "Enter template description...", 1, "mj-textarea", 2, "width", "100%", "max-width", "600px", "margin-bottom", "12px", 3, "ngModel", "rows"], [1, "description-text"], [2, "display", "flex", "align-items", "center", "gap", "16px", "flex-wrap", "wrap"], [2, "display", "flex", "align-items", "center", "gap", "6px", "font-size", "0.85em"], [1, "fa-solid", "fa-file-lines", "meta-icon"], [1, "meta-label"], [1, "meta-value"], [2, "display", "flex", "flex-direction", "column", "gap", "8px", "align-items", "flex-end"], ["title", "Run Template", 1, "run-template-btn"], [1, "configuration-sections"], [2, "margin-bottom", "12px", 3, "Expanded"], ["mjAccordionTitle", ""], [2, "padding", "8px", "min-height", "400px"], [2, "height", "100%", "display", "block", 3, "contentChange", "runTemplate", "template", "config"], [2, "padding", "16px"], [2, "display", "grid", "grid-template-columns", "1fr 1fr", "gap", "20px"], ["FieldName", "UserPrompt", "Type", "textarea", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "UserID", "Type", "textbox", "LinkType", "Record", "LinkComponentType", "Search", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "ActiveAt", "Type", "datepicker", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "DisabledAt", "Type", "datepicker", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "IsActive", "Type", "checkbox", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "__mj_CreatedAt", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "__mj_UpdatedAt", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "Category", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "User", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode"], [3, "isVisibleChange", "onClose", "template", "isVisible"], ["type", "text", "name", "templateName", "placeholder", "Enter template name...", 1, "mj-input", 2, "font-size", "1.2em", "font-weight", "600", "min-width", "300px", "flex", "1", 3, "ngModelChange", "ngModel"], [1, "active-badge"], [1, "inactive-badge"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-pause-circle"], [1, "field-label"], ["name", "categoryId", "TextField", "text", "ValueField", "value", "Placeholder", "Select or enter new category...", 2, "width", "250px", 3, "ngModelChange", "ValueChange", "ngModel", "Data", "ValuePrimitive", "AllowCustom"], ["name", "isActive", 3, "ngModelChange", "ngModel"], ["name", "description", "placeholder", "Enter template description...", 1, "mj-textarea", 2, "width", "100%", "max-width", "600px", "margin-bottom", "12px", 3, "ngModelChange", "ngModel", "rows"], [1, "fa-solid", "fa-folder", "meta-icon"], ["title", "Run Template", 1, "run-template-btn", 3, "click"], [1, "fa-solid", "fa-play"], [1, "panel-title"], [1, "fa-solid", "fa-code"], [1, "count-badge"], [1, "fa-solid", "fa-cogs"], [2, "padding", "16px 0"], [3, "template", "editMode"], [1, "fa-solid", "fa-sliders"], [3, "Params", "NewRecordValues", "AllowLoad", "ShowToolbar"], [1, "fa-solid", "fa-robot"], [1, "fa-solid", "fa-file-text"]], template: function MJTemplateFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
793
- i0.ɵɵconditionalCreate(0, MJTemplateFormComponentExtended_Conditional_0_Template, 48, 46);
1004
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.CodeEditor = _t.first);
1005
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.TemplateEditor = _t.first);
1006
+ } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [["form", "ngForm"], ["templateEditor", ""], [3, "Navigate", "DeleteRequested", "FavoriteToggled", "HistoryRequested", "ListManagementRequested", "Record", "FormComponent", "ToolbarConfig", "WidthMode"], [1, "record-form", 2, "display", "flex", "flex-direction", "column", "height", "100%", "overflow", "hidden"], [1, "template-main-area", 2, "display", "flex", "flex-direction", "column", "flex", "1", "min-height", "0", "overflow-y", "auto"], [1, "template-header-area"], [2, "display", "flex", "justify-content", "space-between", "align-items", "flex-start", "gap", "20px"], [2, "flex", "1", "min-width", "0"], [2, "display", "flex", "align-items", "center", "gap", "12px", "margin-bottom", "8px"], [1, "fa-solid", "fa-file-code", "template-icon"], ["type", "text", "name", "templateName", "placeholder", "Enter template name...", 1, "mj-input", 2, "font-size", "1.2em", "font-weight", "600", "min-width", "300px", "flex", "1", 3, "ngModel"], [2, "display", "flex", "gap", "16px", "margin-bottom", "12px", "flex-wrap", "wrap", "align-items", "center"], ["name", "description", "placeholder", "Enter template description...", 1, "mj-textarea", 2, "width", "100%", "max-width", "600px", "margin-bottom", "12px", 3, "ngModel", "rows"], [1, "description-text"], [2, "display", "flex", "align-items", "center", "gap", "16px", "flex-wrap", "wrap"], [2, "display", "flex", "align-items", "center", "gap", "6px", "font-size", "0.85em"], [1, "fa-solid", "fa-file-lines", "meta-icon"], [1, "meta-label"], [1, "meta-value"], [2, "display", "flex", "flex-direction", "column", "gap", "8px", "align-items", "flex-end"], ["title", "Run Template", 1, "run-template-btn"], [1, "configuration-sections"], [2, "margin-bottom", "12px", 3, "Expanded"], ["mjAccordionTitle", ""], [2, "padding", "8px", "min-height", "400px"], [2, "height", "100%", "display", "block", 3, "contentChange", "runTemplate", "template", "config"], [2, "padding", "16px"], [2, "display", "grid", "grid-template-columns", "1fr 1fr", "gap", "20px"], ["FieldName", "UserPrompt", "Type", "textarea", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "UserID", "Type", "textbox", "LinkType", "Record", "LinkComponentType", "Search", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "ActiveAt", "Type", "datepicker", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "DisabledAt", "Type", "datepicker", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "IsActive", "Type", "checkbox", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "__mj_CreatedAt", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "__mj_UpdatedAt", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "Category", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode"], ["FieldName", "User", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode"], [3, "isVisibleChange", "onClose", "template", "isVisible"], ["type", "text", "name", "templateName", "placeholder", "Enter template name...", 1, "mj-input", 2, "font-size", "1.2em", "font-weight", "600", "min-width", "300px", "flex", "1", 3, "ngModelChange", "ngModel"], [1, "active-badge"], [1, "inactive-badge"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-pause-circle"], [1, "field-label"], ["name", "categoryId", "TextField", "text", "ValueField", "value", "Placeholder", "Select or enter new category...", 2, "width", "250px", 3, "ngModelChange", "ValueChange", "ngModel", "Data", "ValuePrimitive", "AllowCustom"], ["name", "isActive", 3, "ngModelChange", "ngModel"], ["name", "description", "placeholder", "Enter template description...", 1, "mj-textarea", 2, "width", "100%", "max-width", "600px", "margin-bottom", "12px", 3, "ngModelChange", "ngModel", "rows"], [1, "fa-solid", "fa-folder", "meta-icon"], ["title", "Run Template", 1, "run-template-btn", 3, "click"], [1, "fa-solid", "fa-play"], [1, "panel-title"], [1, "fa-solid", "fa-code"], [1, "count-badge"], [1, "fa-solid", "fa-cogs"], [2, "padding", "16px 0"], [3, "template", "editMode"], [1, "fa-solid", "fa-sliders"], [3, "Params", "NewRecordValues", "AllowLoad", "ShowToolbar"], [1, "fa-solid", "fa-robot"], [1, "fa-solid", "fa-file-text"]], template: function MJTemplateFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
1007
+ i0.ɵɵconditionalCreate(0, MJTemplateFormComponentExtended_Conditional_0_Template, 49, 46);
794
1008
  } if (rf & 2) {
795
1009
  i0.ɵɵconditional(ctx.record ? 0 : -1);
796
1010
  } }, dependencies: [i1.ɵNgNoValidate, i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgControlStatusGroup, i1.NgModel, i1.NgForm, i2.MJAccordionPanelComponent, i2.MJAccordionTitleDirective, i2.MJComboboxComponent, i2.MJSwitchComponent, i3.MjFormFieldComponent, i3.MjRecordFormContainerComponent, i3.ExplorerEntityDataGridComponent, i4.TemplateParamDialogComponent, i5.TemplateParamsGridComponent, i6.TemplateEditorComponent], styles: [".k-pane[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface);\n}\n\n.content-margin[_ngcontent-%COMP%] {\n margin: 10px;\n}\n\n\na[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: bolder;\n}\n\n.tab-header-icon[_ngcontent-%COMP%] {\n margin-right: 5px;\n}\n\n.record-form[_ngcontent-%COMP%] {\n display: block;\n flex-direction: column;\n background-color: var(--mj-bg-surface);\n padding: 0;\n min-height: 100vh;\n}\n\n.record-form-group[_ngcontent-%COMP%] {\n margin-top: 0px;\n background-color: var(--mj-bg-surface);\n}\n\nbutton[_ngcontent-%COMP%] {\n margin-right: 5px;\n}\n\n.record-form[_ngcontent-%COMP%] h2[_ngcontent-%COMP%] {\n margin-bottom: 10px;\n}\n\n.k-splitter[_ngcontent-%COMP%] {\n border-width: 0px;\n}\n\n.record-form-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: auto 1fr;\n align-items: start;\n gap: 10px;\n margin-bottom: 12px;\n padding-top: 5px;\n padding-bottom: 5px;\n}\n\n.record-form[_ngcontent-%COMP%] .record-form-row[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child {\n font-weight: bold;\n padding-right: 10px;\n}\n\n.record-form[_ngcontent-%COMP%] .record-form-row[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n white-space: pre-line;\n max-height: 300px;\n overflow: auto;\n}\n\n@media (min-width: 768px) {\n .record-form-row[_ngcontent-%COMP%] {\n flex-direction: row;\n align-items: center;\n }\n\n .record-form-row[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n width: 240px;\n margin-bottom: 0;\n }\n}\n\n\n.form-panels-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px;\n background-color: var(--mj-bg-surface);\n}\n\n\n.form-panels-container[_ngcontent-%COMP%] > .form-card[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n\n.form-panels-container[_ngcontent-%COMP%] .related-entity-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n}\n\n\n@media (min-width: 1400px) {\n .form-panels-container[_ngcontent-%COMP%] .related-entity-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fit, minmax(600px, 1fr));\n }\n}\n\n.form-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: 0 2px 4px var(--mj-shadow-sm);\n overflow: hidden;\n}\n\n.collapsible-card[_ngcontent-%COMP%] {\n overflow: hidden;\n}\n\n.collapsible-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 2px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n transition: all 0.3s ease;\n}\n\n.collapsible-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.collapsible-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n}\n\n.collapsible-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n.collapsible-title[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.collapsible-header[_ngcontent-%COMP%] .collapse-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n transition: transform 0.3s ease;\n}\n\n.collapsible-body[_ngcontent-%COMP%] {\n max-height: 2000px;\n overflow: hidden;\n transition: max-height 0.4s ease, padding 0.4s ease, opacity 0.3s ease;\n opacity: 1;\n}\n\n.collapsible-body.collapsed[_ngcontent-%COMP%] {\n max-height: 0;\n padding: 0;\n opacity: 0;\n}\n\n.form-body[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n\n.form-card.related-entity[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n.form-card.related-entity[_ngcontent-%COMP%] .collapsible-header[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n}\n\n.form-card.related-entity[_ngcontent-%COMP%] .collapsible-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.form-card.related-entity[_ngcontent-%COMP%] .collapsible-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n\n.form-section-controls[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n padding: 14px 18px;\n background: var(--mj-bg-surface-card);\n border-bottom: 2px solid var(--mj-border-default);\n align-items: center;\n flex-wrap: wrap;\n box-shadow: 0 1px 3px var(--mj-shadow-sm);\n}\n\n.form-section-controls[_ngcontent-%COMP%] .control-group[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.form-section-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n padding: 8px 14px;\n font-size: 13px;\n border: 1px solid var(--mj-border-strong);\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n margin-right: 0;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-weight: 500;\n}\n\n.form-section-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px var(--mj-shadow-md);\n}\n\n.form-section-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:active {\n transform: translateY(0);\n}\n\n.form-section-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 0;\n font-size: 14px;\n}\n\n.form-section-controls[_ngcontent-%COMP%] .section-search[_ngcontent-%COMP%] {\n padding: 8px 14px;\n font-size: 13px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n width: 240px;\n transition: all 0.2s;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n.form-section-controls[_ngcontent-%COMP%] .section-search[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.form-section-controls[_ngcontent-%COMP%] .section-search[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.form-section-controls[_ngcontent-%COMP%] .section-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-left: auto;\n font-weight: 500;\n}\n\n\n.form-card.search-hidden[_ngcontent-%COMP%] {\n display: none;\n}\n\n\n.section-count-badge[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n}\n\n\n.collapsible-title[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] .search-highlight[_ngcontent-%COMP%] {\n background-color: var(--mj-status-warning);\n color: var(--mj-text-primary);\n padding: 2px 4px;\n border-radius: 3px;\n font-weight: 700;\n}\n\n\n.collapsible-title[_ngcontent-%COMP%] .row-count-badge[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n padding: 3px 6px 2px 6px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n margin-left: 8px;\n vertical-align: middle;\n position: relative;\n top: -2px;\n display: inline-block;\n line-height: 1;\n}\n\n\n.collapsible-title[_ngcontent-%COMP%] .row-count-badge.zero-rows[_ngcontent-%COMP%] {\n background: var(--mj-text-muted);\n}", "\n[_nghost-%COMP%] {\n display: block;\n height: 100%;\n}\n\n.record-form-container[_ngcontent-%COMP%] {\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n background: var(--mj-bg-surface);\n}\n\n\n.record-form[_ngcontent-%COMP%] {\n min-height: 0 !important;\n}\n\n.template-header[_ngcontent-%COMP%] {\n border-bottom: 2px solid var(--mj-border-default);\n}\n\n\n.template-header-area[_ngcontent-%COMP%] {\n flex-shrink: 0;\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-bottom: 2px solid var(--mj-border-default);\n}\n\n.template-header-area[_ngcontent-%COMP%] .template-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 1.4em;\n}\n\n.template-header-area[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n color: var(--mj-text-primary);\n font-weight: 600;\n flex: 1;\n}\n\n.template-header-area[_ngcontent-%COMP%] .active-badge[_ngcontent-%COMP%] {\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: 4px 12px;\n border-radius: 16px;\n font-size: 0.8em;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n}\n\n.template-header-area[_ngcontent-%COMP%] .inactive-badge[_ngcontent-%COMP%] {\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: 4px 12px;\n border-radius: 16px;\n font-size: 0.8em;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n}\n\n.template-header-area[_ngcontent-%COMP%] .field-label[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 4px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-size: 0.9em;\n}\n\n.template-header-area[_ngcontent-%COMP%] .description-text[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n color: var(--mj-text-muted);\n font-size: 0.9em;\n line-height: 1.4;\n}\n\n.template-header-area[_ngcontent-%COMP%] .meta-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.template-header-area[_ngcontent-%COMP%] .meta-label[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.template-header-area[_ngcontent-%COMP%] .meta-value[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n\n.run-template-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 10px 20px;\n border-radius: 8px;\n font-size: 0.95em;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.run-template-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n\n.configuration-sections[_ngcontent-%COMP%] {\n flex: 1;\n background: var(--mj-bg-surface);\n border-top: 2px solid var(--mj-border-default);\n padding: 16px;\n min-height: 0;\n}\n\n\n.panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.panel-title[_ngcontent-%COMP%] .count-badge[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.7em;\n}\n\n.badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n\n .configuration-sections mj-accordion-panel {\n margin-bottom: 12px;\n}\n\n .configuration-sections .mj-accordion-panel {\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n background: var(--mj-bg-surface-card);\n}\n\n .configuration-sections .mj-accordion-header {\n padding: 16px 20px;\n font-weight: 600;\n font-size: 16px;\n}\n\n .configuration-sections .mj-accordion-panel--expanded .mj-accordion-header {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n .configuration-sections .mj-accordion-body {\n padding: 0;\n}\n\n\n.template-header[_ngcontent-%COMP%], \n.badge[_ngcontent-%COMP%] {\n transition: all 0.2s ease;\n}"] }); }
@@ -801,10 +1015,13 @@ MJTemplateFormComponentExtended = __decorate([
801
1015
  export { MJTemplateFormComponentExtended };
802
1016
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJTemplateFormComponentExtended, [{
803
1017
  type: Component,
804
- args: [{ standalone: false, selector: 'mj-templates-form', template: "@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", styles: [".k-pane {\n background-color: var(--mj-bg-surface);\n}\n\n.content-margin {\n margin: 10px;\n}\n\n\na {\n font-size: 14px;\n font-weight: bolder;\n}\n\n.tab-header-icon {\n margin-right: 5px;\n}\n\n.record-form {\n display: block;\n flex-direction: column;\n background-color: var(--mj-bg-surface);\n padding: 0;\n min-height: 100vh;\n}\n\n.record-form-group {\n margin-top: 0px;\n background-color: var(--mj-bg-surface);\n}\n\nbutton {\n margin-right: 5px;\n}\n\n.record-form h2 {\n margin-bottom: 10px;\n}\n\n.k-splitter {\n border-width: 0px;\n}\n\n.record-form-row {\n display: grid;\n grid-template-columns: auto 1fr;\n align-items: start;\n gap: 10px;\n margin-bottom: 12px;\n padding-top: 5px;\n padding-bottom: 5px;\n}\n\n.record-form .record-form-row > :first-child {\n font-weight: bold;\n padding-right: 10px;\n}\n\n.record-form .record-form-row > span {\n white-space: pre-line;\n max-height: 300px;\n overflow: auto;\n}\n\n@media (min-width: 768px) {\n .record-form-row {\n flex-direction: row;\n align-items: center;\n }\n\n .record-form-row label {\n width: 240px;\n margin-bottom: 0;\n }\n}\n\n/* Collapsible Panel Styles */\n.form-panels-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px;\n background-color: var(--mj-bg-surface);\n}\n\n/* All field sections take full width */\n.form-panels-container > .form-card {\n width: 100%;\n}\n\n/* Related entity grid container - responsive layout */\n.form-panels-container .related-entity-grid {\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n}\n\n/* Responsive multi-column layout for related entities on wider screens */\n@media (min-width: 1400px) {\n .form-panels-container .related-entity-grid {\n grid-template-columns: repeat(auto-fit, minmax(600px, 1fr));\n }\n}\n\n.form-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: 0 2px 4px var(--mj-shadow-sm);\n overflow: hidden;\n}\n\n.collapsible-card {\n overflow: hidden;\n}\n\n.collapsible-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 2px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n transition: all 0.3s ease;\n}\n\n.collapsible-header:hover {\n background: var(--mj-bg-surface-sunken);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.collapsible-title {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n}\n\n.collapsible-title i {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n.collapsible-title h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.collapsible-header .collapse-icon {\n color: var(--mj-text-muted);\n transition: transform 0.3s ease;\n}\n\n.collapsible-body {\n max-height: 2000px;\n overflow: hidden;\n transition: max-height 0.4s ease, padding 0.4s ease, opacity 0.3s ease;\n opacity: 1;\n}\n\n.collapsible-body.collapsed {\n max-height: 0;\n padding: 0;\n opacity: 0;\n}\n\n.form-body {\n padding: 24px;\n}\n\n/* Related Entity Sections - Visual Distinction */\n.form-card.related-entity {\n background: var(--mj-bg-surface-card);\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n.form-card.related-entity .collapsible-header {\n background: var(--mj-bg-surface-sunken);\n}\n\n.form-card.related-entity .collapsible-header:hover {\n background: var(--mj-bg-surface-card);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.form-card.related-entity .collapsible-title i {\n color: var(--mj-brand-primary);\n}\n\n/* Section Controls */\n.form-section-controls {\n display: flex;\n gap: 10px;\n padding: 14px 18px;\n background: var(--mj-bg-surface-card);\n border-bottom: 2px solid var(--mj-border-default);\n align-items: center;\n flex-wrap: wrap;\n box-shadow: 0 1px 3px var(--mj-shadow-sm);\n}\n\n.form-section-controls .control-group {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.form-section-controls button {\n padding: 8px 14px;\n font-size: 13px;\n border: 1px solid var(--mj-border-strong);\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n margin-right: 0;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-weight: 500;\n}\n\n.form-section-controls button:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px var(--mj-shadow-md);\n}\n\n.form-section-controls button:active {\n transform: translateY(0);\n}\n\n.form-section-controls button i {\n margin-right: 0;\n font-size: 14px;\n}\n\n.form-section-controls .section-search {\n padding: 8px 14px;\n font-size: 13px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n width: 240px;\n transition: all 0.2s;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n.form-section-controls .section-search:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.form-section-controls .section-search::placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.form-section-controls .section-count {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-left: auto;\n font-weight: 500;\n}\n\n/* Hidden sections for search filter */\n.form-card.search-hidden {\n display: none;\n}\n\n/* Section count badge */\n.section-count-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n}\n\n/* Search highlighting in section names */\n.collapsible-title h3 .search-highlight {\n background-color: var(--mj-status-warning);\n color: var(--mj-text-primary);\n padding: 2px 4px;\n border-radius: 3px;\n font-weight: 700;\n}\n\n/* Row count badge in section headers */\n.collapsible-title .row-count-badge {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n padding: 3px 6px 2px 6px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n margin-left: 8px;\n vertical-align: middle;\n position: relative;\n top: -2px;\n display: inline-block;\n line-height: 1;\n}\n\n/* Gray badge for zero rows (loaded but empty) */\n.collapsible-title .row-count-badge.zero-rows {\n background: var(--mj-text-muted);\n}\n", "/* Override shared form-styles to enable flex layout */\n:host {\n display: block;\n height: 100%;\n}\n\n.record-form-container {\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n background: var(--mj-bg-surface);\n}\n\n/* Override the shared record-form min-height so flex layout works properly */\n.record-form {\n min-height: 0 !important;\n}\n\n.template-header {\n border-bottom: 2px solid var(--mj-border-default);\n}\n\n/* Header section */\n.template-header-area {\n flex-shrink: 0;\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-bottom: 2px solid var(--mj-border-default);\n}\n\n.template-header-area .template-icon {\n color: var(--mj-brand-primary);\n font-size: 1.4em;\n}\n\n.template-header-area h4 {\n margin: 0;\n color: var(--mj-text-primary);\n font-weight: 600;\n flex: 1;\n}\n\n.template-header-area .active-badge {\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: 4px 12px;\n border-radius: 16px;\n font-size: 0.8em;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n}\n\n.template-header-area .inactive-badge {\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: 4px 12px;\n border-radius: 16px;\n font-size: 0.8em;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n}\n\n.template-header-area .field-label {\n display: block;\n margin-bottom: 4px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-size: 0.9em;\n}\n\n.template-header-area .description-text {\n margin: 0 0 12px 0;\n color: var(--mj-text-muted);\n font-size: 0.9em;\n line-height: 1.4;\n}\n\n.template-header-area .meta-icon {\n color: var(--mj-text-muted);\n}\n\n.template-header-area .meta-label {\n color: var(--mj-text-muted);\n}\n\n.template-header-area .meta-value {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n/* Run template button */\n.run-template-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 10px 20px;\n border-radius: 8px;\n font-size: 0.95em;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.run-template-btn:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n/* Configuration sections */\n.configuration-sections {\n flex: 1;\n background: var(--mj-bg-surface);\n border-top: 2px solid var(--mj-border-default);\n padding: 16px;\n min-height: 0;\n}\n\n/* Expansion panel titles */\n.panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n.panel-title i {\n color: var(--mj-text-muted);\n}\n\n.panel-title .count-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.7em;\n}\n\n.badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n/* Accordion Panel Styling */\n::ng-deep .configuration-sections mj-accordion-panel {\n margin-bottom: 12px;\n}\n\n::ng-deep .configuration-sections .mj-accordion-panel {\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n background: var(--mj-bg-surface-card);\n}\n\n::ng-deep .configuration-sections .mj-accordion-header {\n padding: 16px 20px;\n font-weight: 600;\n font-size: 16px;\n}\n\n::ng-deep .configuration-sections .mj-accordion-panel--expanded .mj-accordion-header {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n::ng-deep .configuration-sections .mj-accordion-body {\n padding: 0;\n}\n\n/* Smooth transitions */\n.template-header,\n.badge {\n transition: all 0.2s ease;\n}\n"] }]
805
- }], null, { codeEditor: [{
1018
+ args: [{ standalone: false, selector: 'mj-templates-form', template: "@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 #templateEditor\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", styles: [".k-pane {\n background-color: var(--mj-bg-surface);\n}\n\n.content-margin {\n margin: 10px;\n}\n\n\na {\n font-size: 14px;\n font-weight: bolder;\n}\n\n.tab-header-icon {\n margin-right: 5px;\n}\n\n.record-form {\n display: block;\n flex-direction: column;\n background-color: var(--mj-bg-surface);\n padding: 0;\n min-height: 100vh;\n}\n\n.record-form-group {\n margin-top: 0px;\n background-color: var(--mj-bg-surface);\n}\n\nbutton {\n margin-right: 5px;\n}\n\n.record-form h2 {\n margin-bottom: 10px;\n}\n\n.k-splitter {\n border-width: 0px;\n}\n\n.record-form-row {\n display: grid;\n grid-template-columns: auto 1fr;\n align-items: start;\n gap: 10px;\n margin-bottom: 12px;\n padding-top: 5px;\n padding-bottom: 5px;\n}\n\n.record-form .record-form-row > :first-child {\n font-weight: bold;\n padding-right: 10px;\n}\n\n.record-form .record-form-row > span {\n white-space: pre-line;\n max-height: 300px;\n overflow: auto;\n}\n\n@media (min-width: 768px) {\n .record-form-row {\n flex-direction: row;\n align-items: center;\n }\n\n .record-form-row label {\n width: 240px;\n margin-bottom: 0;\n }\n}\n\n/* Collapsible Panel Styles */\n.form-panels-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px;\n background-color: var(--mj-bg-surface);\n}\n\n/* All field sections take full width */\n.form-panels-container > .form-card {\n width: 100%;\n}\n\n/* Related entity grid container - responsive layout */\n.form-panels-container .related-entity-grid {\n display: grid;\n grid-template-columns: 1fr;\n gap: 16px;\n width: 100%;\n}\n\n/* Responsive multi-column layout for related entities on wider screens */\n@media (min-width: 1400px) {\n .form-panels-container .related-entity-grid {\n grid-template-columns: repeat(auto-fit, minmax(600px, 1fr));\n }\n}\n\n.form-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: 0 2px 4px var(--mj-shadow-sm);\n overflow: hidden;\n}\n\n.collapsible-card {\n overflow: hidden;\n}\n\n.collapsible-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 2px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n transition: all 0.3s ease;\n}\n\n.collapsible-header:hover {\n background: var(--mj-bg-surface-sunken);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.collapsible-title {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n}\n\n.collapsible-title i {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n.collapsible-title h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.collapsible-header .collapse-icon {\n color: var(--mj-text-muted);\n transition: transform 0.3s ease;\n}\n\n.collapsible-body {\n max-height: 2000px;\n overflow: hidden;\n transition: max-height 0.4s ease, padding 0.4s ease, opacity 0.3s ease;\n opacity: 1;\n}\n\n.collapsible-body.collapsed {\n max-height: 0;\n padding: 0;\n opacity: 0;\n}\n\n.form-body {\n padding: 24px;\n}\n\n/* Related Entity Sections - Visual Distinction */\n.form-card.related-entity {\n background: var(--mj-bg-surface-card);\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n.form-card.related-entity .collapsible-header {\n background: var(--mj-bg-surface-sunken);\n}\n\n.form-card.related-entity .collapsible-header:hover {\n background: var(--mj-bg-surface-card);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.form-card.related-entity .collapsible-title i {\n color: var(--mj-brand-primary);\n}\n\n/* Section Controls */\n.form-section-controls {\n display: flex;\n gap: 10px;\n padding: 14px 18px;\n background: var(--mj-bg-surface-card);\n border-bottom: 2px solid var(--mj-border-default);\n align-items: center;\n flex-wrap: wrap;\n box-shadow: 0 1px 3px var(--mj-shadow-sm);\n}\n\n.form-section-controls .control-group {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.form-section-controls button {\n padding: 8px 14px;\n font-size: 13px;\n border: 1px solid var(--mj-border-strong);\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n margin-right: 0;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-weight: 500;\n}\n\n.form-section-controls button:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px var(--mj-shadow-md);\n}\n\n.form-section-controls button:active {\n transform: translateY(0);\n}\n\n.form-section-controls button i {\n margin-right: 0;\n font-size: 14px;\n}\n\n.form-section-controls .section-search {\n padding: 8px 14px;\n font-size: 13px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n width: 240px;\n transition: all 0.2s;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n.form-section-controls .section-search:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.form-section-controls .section-search::placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.form-section-controls .section-count {\n font-size: 13px;\n color: var(--mj-text-muted);\n margin-left: auto;\n font-weight: 500;\n}\n\n/* Hidden sections for search filter */\n.form-card.search-hidden {\n display: none;\n}\n\n/* Section count badge */\n.section-count-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n}\n\n/* Search highlighting in section names */\n.collapsible-title h3 .search-highlight {\n background-color: var(--mj-status-warning);\n color: var(--mj-text-primary);\n padding: 2px 4px;\n border-radius: 3px;\n font-weight: 700;\n}\n\n/* Row count badge in section headers */\n.collapsible-title .row-count-badge {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n padding: 3px 6px 2px 6px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n margin-left: 8px;\n vertical-align: middle;\n position: relative;\n top: -2px;\n display: inline-block;\n line-height: 1;\n}\n\n/* Gray badge for zero rows (loaded but empty) */\n.collapsible-title .row-count-badge.zero-rows {\n background: var(--mj-text-muted);\n}\n", "/* Override shared form-styles to enable flex layout */\n:host {\n display: block;\n height: 100%;\n}\n\n.record-form-container {\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n background: var(--mj-bg-surface);\n}\n\n/* Override the shared record-form min-height so flex layout works properly */\n.record-form {\n min-height: 0 !important;\n}\n\n.template-header {\n border-bottom: 2px solid var(--mj-border-default);\n}\n\n/* Header section */\n.template-header-area {\n flex-shrink: 0;\n padding: 20px;\n background: var(--mj-bg-surface-card);\n border-bottom: 2px solid var(--mj-border-default);\n}\n\n.template-header-area .template-icon {\n color: var(--mj-brand-primary);\n font-size: 1.4em;\n}\n\n.template-header-area h4 {\n margin: 0;\n color: var(--mj-text-primary);\n font-weight: 600;\n flex: 1;\n}\n\n.template-header-area .active-badge {\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: 4px 12px;\n border-radius: 16px;\n font-size: 0.8em;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n}\n\n.template-header-area .inactive-badge {\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: 4px 12px;\n border-radius: 16px;\n font-size: 0.8em;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n}\n\n.template-header-area .field-label {\n display: block;\n margin-bottom: 4px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-size: 0.9em;\n}\n\n.template-header-area .description-text {\n margin: 0 0 12px 0;\n color: var(--mj-text-muted);\n font-size: 0.9em;\n line-height: 1.4;\n}\n\n.template-header-area .meta-icon {\n color: var(--mj-text-muted);\n}\n\n.template-header-area .meta-label {\n color: var(--mj-text-muted);\n}\n\n.template-header-area .meta-value {\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n/* Run template button */\n.run-template-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n padding: 10px 20px;\n border-radius: 8px;\n font-size: 0.95em;\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.run-template-btn:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n/* Configuration sections */\n.configuration-sections {\n flex: 1;\n background: var(--mj-bg-surface);\n border-top: 2px solid var(--mj-border-default);\n padding: 16px;\n min-height: 0;\n}\n\n/* Expansion panel titles */\n.panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n.panel-title i {\n color: var(--mj-text-muted);\n}\n\n.panel-title .count-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 0.7em;\n}\n\n.badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n/* Accordion Panel Styling */\n::ng-deep .configuration-sections mj-accordion-panel {\n margin-bottom: 12px;\n}\n\n::ng-deep .configuration-sections .mj-accordion-panel {\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n background: var(--mj-bg-surface-card);\n}\n\n::ng-deep .configuration-sections .mj-accordion-header {\n padding: 16px 20px;\n font-weight: 600;\n font-size: 16px;\n}\n\n::ng-deep .configuration-sections .mj-accordion-panel--expanded .mj-accordion-header {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n::ng-deep .configuration-sections .mj-accordion-body {\n padding: 0;\n}\n\n/* Smooth transitions */\n.template-header,\n.badge {\n transition: all 0.2s ease;\n}\n"] }]
1019
+ }], null, { CodeEditor: [{
806
1020
  type: ViewChild,
807
1021
  args: ['codeEditor']
1022
+ }], TemplateEditor: [{
1023
+ type: ViewChild,
1024
+ args: ['templateEditor']
808
1025
  }] }); })();
809
1026
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJTemplateFormComponentExtended, { className: "MJTemplateFormComponentExtended", filePath: "src/lib/custom/Templates/templates-form.component.ts", lineNumber: 24 }); })();
810
1027
  //# sourceMappingURL=templates-form.component.js.map