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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/README.md +22 -0
  2. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.d.ts +1 -1
  3. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js +2 -2
  4. package/dist/lib/custom/AIAgentCategories/ai-agent-category-overview.panel.js.map +1 -1
  5. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
  6. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts +90 -16
  7. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
  8. package/dist/lib/custom/AIAgents/add-action-dialog.component.js +218 -70
  9. package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
  10. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +80 -16
  11. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -1
  12. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +146 -46
  13. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -1
  14. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +329 -27
  15. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  16. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +794 -262
  17. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  18. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts +76 -0
  19. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts.map +1 -1
  20. package/dist/lib/custom/AIAgents/ai-agent-management.service.js +77 -33
  21. package/dist/lib/custom/AIAgents/ai-agent-management.service.js.map +1 -1
  22. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +69 -15
  23. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
  24. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +182 -74
  25. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -1
  26. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +105 -25
  27. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
  28. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +272 -112
  29. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
  30. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts +32 -6
  31. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
  32. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +71 -19
  33. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
  34. package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts +10 -0
  35. package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts.map +1 -1
  36. package/dist/lib/custom/AIAgents/new-agent-dialog.service.js +27 -7
  37. package/dist/lib/custom/AIAgents/new-agent-dialog.service.js.map +1 -1
  38. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +65 -15
  39. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
  40. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +152 -52
  41. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
  42. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +81 -15
  43. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
  44. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +145 -45
  45. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -1
  46. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +71 -17
  47. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
  48. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +175 -67
  49. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
  50. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +173 -27
  51. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
  52. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +385 -93
  53. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  54. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts +64 -4
  55. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.d.ts.map +1 -1
  56. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +129 -29
  57. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
  58. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +260 -27
  59. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
  60. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +686 -238
  61. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  62. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts +10 -0
  63. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts.map +1 -1
  64. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js +17 -9
  65. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js.map +1 -1
  66. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +74 -16
  67. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -1
  68. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +174 -58
  69. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -1
  70. package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts +108 -14
  71. package/dist/lib/custom/Actions/action-execution-log-form.component.d.ts.map +1 -1
  72. package/dist/lib/custom/Actions/action-execution-log-form.component.js +258 -70
  73. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  74. package/dist/lib/custom/Actions/action-form.component.d.ts +198 -14
  75. package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
  76. package/dist/lib/custom/Actions/action-form.component.js +387 -107
  77. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  78. package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts +12 -6
  79. package/dist/lib/custom/BridgeProviders/bridge-provider-features.d.ts.map +1 -1
  80. package/dist/lib/custom/BridgeProviders/bridge-provider-features.js +41 -29
  81. package/dist/lib/custom/BridgeProviders/bridge-provider-features.js.map +1 -1
  82. package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js +14 -14
  83. package/dist/lib/custom/BridgeProviders/bridge-provider-form.component.js.map +1 -1
  84. package/dist/lib/custom/Companies/company-overview.panel.d.ts +1 -1
  85. package/dist/lib/custom/Companies/company-overview.panel.js +2 -2
  86. package/dist/lib/custom/Companies/company-overview.panel.js.map +1 -1
  87. package/dist/lib/custom/Conversations/conversation-overview.panel.d.ts +1 -1
  88. package/dist/lib/custom/Conversations/conversation-overview.panel.js +2 -2
  89. package/dist/lib/custom/Conversations/conversation-overview.panel.js.map +1 -1
  90. package/dist/lib/custom/Employees/employee-overview.panel.d.ts +1 -1
  91. package/dist/lib/custom/Employees/employee-overview.panel.js +2 -2
  92. package/dist/lib/custom/Employees/employee-overview.panel.js.map +1 -1
  93. package/dist/lib/custom/Entities/entity-form.component.d.ts +209 -28
  94. package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
  95. package/dist/lib/custom/Entities/entity-form.component.js +494 -138
  96. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  97. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts +5 -1
  98. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts.map +1 -1
  99. package/dist/lib/custom/EntityActions/entityaction.form.component.js +10 -2
  100. package/dist/lib/custom/EntityActions/entityaction.form.component.js.map +1 -1
  101. package/dist/lib/custom/Files/file-form.component.d.ts +1 -1
  102. package/dist/lib/custom/Files/file-form.component.js +2 -2
  103. package/dist/lib/custom/Files/file-form.component.js.map +1 -1
  104. package/dist/lib/custom/Lists/list-form.component.d.ts +300 -36
  105. package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
  106. package/dist/lib/custom/Lists/list-form.component.js +664 -208
  107. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  108. package/dist/lib/custom/MLModels/ml-model-form.component.d.ts +27 -0
  109. package/dist/lib/custom/MLModels/ml-model-form.component.d.ts.map +1 -0
  110. package/dist/lib/custom/MLModels/ml-model-form.component.js +193 -0
  111. package/dist/lib/custom/MLModels/ml-model-form.component.js.map +1 -0
  112. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts +75 -0
  113. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts.map +1 -0
  114. package/dist/lib/custom/MLModels/ml-model-view-models.js +244 -0
  115. package/dist/lib/custom/MLModels/ml-model-view-models.js.map +1 -0
  116. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts +173 -0
  117. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts.map +1 -0
  118. package/dist/lib/custom/MLModels/ps-model-detail.component.js +883 -0
  119. package/dist/lib/custom/MLModels/ps-model-detail.component.js.map +1 -0
  120. package/dist/lib/custom/Queries/query-form.component.d.ts +201 -26
  121. package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
  122. package/dist/lib/custom/Queries/query-form.component.js +429 -109
  123. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  124. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts +107 -14
  125. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts.map +1 -1
  126. package/dist/lib/custom/Queries/query-run-dialog.component.js +249 -79
  127. package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
  128. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts +133 -7
  129. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -1
  130. package/dist/lib/custom/RecordProcesses/record-process-form.component.js +1268 -19
  131. package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
  132. package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts +1 -1
  133. package/dist/lib/custom/SearchScopes/searchscope-form.component.js +4 -4
  134. package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
  135. package/dist/lib/custom/SessionBridges/session-bridge-form.component.js.map +1 -1
  136. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts +77 -13
  137. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts.map +1 -1
  138. package/dist/lib/custom/Templates/template-param-dialog.component.js +196 -78
  139. package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
  140. package/dist/lib/custom/Templates/template-params-grid.component.d.ts +49 -7
  141. package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
  142. package/dist/lib/custom/Templates/template-params-grid.component.js +132 -44
  143. package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
  144. package/dist/lib/custom/Templates/templates-form.component.d.ts +142 -17
  145. package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
  146. package/dist/lib/custom/Templates/templates-form.component.js +333 -113
  147. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  148. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts +24 -4
  149. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
  150. package/dist/lib/custom/Tests/entity-link-pill.component.js +64 -20
  151. package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
  152. package/dist/lib/custom/Tests/test-form.component.d.ts +217 -27
  153. package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
  154. package/dist/lib/custom/Tests/test-form.component.js +549 -169
  155. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  156. package/dist/lib/custom/Tests/test-run-checks.d.ts +2 -0
  157. package/dist/lib/custom/Tests/test-run-checks.d.ts.map +1 -1
  158. package/dist/lib/custom/Tests/test-run-checks.js +5 -1
  159. package/dist/lib/custom/Tests/test-run-checks.js.map +1 -1
  160. package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts +2 -0
  161. package/dist/lib/custom/Tests/test-run-feedback-form.component.d.ts.map +1 -1
  162. package/dist/lib/custom/Tests/test-run-feedback-form.component.js +5 -1
  163. package/dist/lib/custom/Tests/test-run-feedback-form.component.js.map +1 -1
  164. package/dist/lib/custom/Tests/test-run-form.component.d.ts +146 -18
  165. package/dist/lib/custom/Tests/test-run-form.component.d.ts.map +1 -1
  166. package/dist/lib/custom/Tests/test-run-form.component.js +362 -106
  167. package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
  168. package/dist/lib/custom/Tests/test-suite-form.component.d.ts +390 -47
  169. package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
  170. package/dist/lib/custom/Tests/test-suite-form.component.js +1015 -343
  171. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  172. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts +214 -26
  173. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
  174. package/dist/lib/custom/Tests/test-suite-run-form.component.js +535 -159
  175. package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
  176. package/dist/lib/custom/Users/user-overview.panel.d.ts +1 -1
  177. package/dist/lib/custom/Users/user-overview.panel.js +2 -2
  178. package/dist/lib/custom/Users/user-overview.panel.js.map +1 -1
  179. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +208 -29
  180. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
  181. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +446 -138
  182. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  183. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts +6 -0
  184. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.d.ts.map +1 -1
  185. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js +16 -4
  186. package/dist/lib/custom/ai-agent-run/ai-agent-run-cost.service.js.map +1 -1
  187. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +50 -6
  188. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
  189. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +84 -12
  190. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
  191. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts +89 -5
  192. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -1
  193. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +216 -70
  194. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
  195. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts +62 -3
  196. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.d.ts.map +1 -1
  197. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js +140 -42
  198. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-node.component.js.map +1 -1
  199. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +81 -10
  200. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  201. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +165 -37
  202. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  203. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +121 -14
  204. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  205. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +287 -79
  206. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  207. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts +101 -15
  208. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.d.ts.map +1 -1
  209. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js +281 -97
  210. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.component.js.map +1 -1
  211. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts +43 -25
  212. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.d.ts.map +1 -1
  213. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js +100 -64
  214. package/dist/lib/custom/ai-agent-run/flow/agent-run-flow.model.js.map +1 -1
  215. package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts +14 -2
  216. package/dist/lib/custom/ai-agent-run/flow/constellation.component.d.ts.map +1 -1
  217. package/dist/lib/custom/ai-agent-run/flow/constellation.component.js +71 -53
  218. package/dist/lib/custom/ai-agent-run/flow/constellation.component.js.map +1 -1
  219. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts +14 -2
  220. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.d.ts.map +1 -1
  221. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js +70 -52
  222. package/dist/lib/custom/ai-agent-run/flow/flame-cascade.component.js.map +1 -1
  223. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts +8 -0
  224. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.d.ts.map +1 -1
  225. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js +22 -6
  226. package/dist/lib/custom/ai-agent-run/flow/flow-svg.util.js.map +1 -1
  227. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts +24 -2
  228. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.d.ts.map +1 -1
  229. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js +91 -59
  230. package/dist/lib/custom/ai-agent-run/flow/flowchart.component.js.map +1 -1
  231. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts +10 -2
  232. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.d.ts.map +1 -1
  233. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js +33 -17
  234. package/dist/lib/custom/ai-agent-run/flow/pan-zoom.js.map +1 -1
  235. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts +2 -0
  236. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.d.ts.map +1 -1
  237. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js +34 -30
  238. package/dist/lib/custom/ai-agent-run/flow/run-tree-flow-projection.js.map +1 -1
  239. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts +14 -2
  240. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.d.ts.map +1 -1
  241. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js +69 -51
  242. package/dist/lib/custom/ai-agent-run/flow/subway-lines.component.js.map +1 -1
  243. package/dist/lib/custom/custom-forms.module.d.ts +32 -30
  244. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  245. package/dist/lib/custom/custom-forms.module.js +21 -4
  246. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  247. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +38 -12
  248. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
  249. package/dist/lib/custom/shared/entity-selector-dialog.component.js +103 -51
  250. package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
  251. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.d.ts.map +1 -1
  252. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js +62 -26
  253. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js.map +1 -1
  254. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
  255. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +59 -51
  256. package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
  257. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js +76 -74
  258. package/dist/lib/generated/Entities/MJAIVendor/mjaivendor.form.component.js.map +1 -1
  259. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.d.ts.map +1 -1
  260. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js +33 -15
  261. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js.map +1 -1
  262. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  263. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +100 -82
  264. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  265. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js +24 -20
  266. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js.map +1 -1
  267. package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.d.ts +10 -0
  268. package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.d.ts.map +1 -0
  269. package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js +122 -0
  270. package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js.map +1 -0
  271. package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.d.ts +10 -0
  272. package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.d.ts.map +1 -0
  273. package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.js +125 -0
  274. package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.js.map +1 -0
  275. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.d.ts.map +1 -1
  276. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js +23 -5
  277. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js.map +1 -1
  278. package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.d.ts.map +1 -1
  279. package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.js +25 -6
  280. package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.js.map +1 -1
  281. package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js +27 -25
  282. package/dist/lib/generated/Entities/MJProject/mjproject.form.component.js.map +1 -1
  283. package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.d.ts.map +1 -1
  284. package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js +11 -15
  285. package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js.map +1 -1
  286. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.d.ts.map +1 -1
  287. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js +43 -7
  288. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js.map +1 -1
  289. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  290. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +155 -119
  291. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  292. package/dist/lib/generated/Entities/MJWebSearchProvider/mjwebsearchprovider.form.component.d.ts +10 -0
  293. package/dist/lib/generated/Entities/MJWebSearchProvider/mjwebsearchprovider.form.component.d.ts.map +1 -0
  294. package/dist/lib/generated/Entities/MJWebSearchProvider/mjwebsearchprovider.form.component.js +78 -0
  295. package/dist/lib/generated/Entities/MJWebSearchProvider/mjwebsearchprovider.form.component.js.map +1 -0
  296. package/dist/lib/generated/generated-forms.module.d.ts +240 -237
  297. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  298. package/dist/lib/generated/generated-forms.module.js +11 -2
  299. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  300. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts +5 -1
  301. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.d.ts.map +1 -1
  302. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js +11 -3
  303. package/dist/lib/panels/ai-skill-sharing/ai-skill-sharing-panel.component.js.map +1 -1
  304. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts +2 -0
  305. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.d.ts.map +1 -1
  306. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js +16 -12
  307. package/dist/lib/panels/content-sources/tag-pipeline-configuration.panel.js.map +1 -1
  308. package/dist/lib/panels/content-sources/website-crawler-settings.panel.d.ts +1 -1
  309. package/dist/lib/panels/content-sources/website-crawler-settings.panel.js +2 -2
  310. package/dist/lib/panels/content-sources/website-crawler-settings.panel.js.map +1 -1
  311. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +122 -1
  312. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -1
  313. package/dist/lib/panels/model-predictions/model-prediction.logic.js +236 -11
  314. package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -1
  315. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts +72 -13
  316. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts.map +1 -1
  317. package/dist/lib/panels/model-predictions/model-prediction.panel.js +577 -78
  318. package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -1
  319. package/dist/lib/shared/components/template-editor.component.d.ts +133 -14
  320. package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
  321. package/dist/lib/shared/components/template-editor.component.js +322 -124
  322. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  323. package/dist/public-api.d.ts +4 -0
  324. package/dist/public-api.d.ts.map +1 -1
  325. package/dist/public-api.js +4 -0
  326. package/dist/public-api.js.map +1 -1
  327. package/package.json +43 -41
@@ -1191,34 +1191,34 @@ function MJQueryFormComponentExtended_Conditional_0_Template(rf, ctx) { if (rf &
1191
1191
  let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJQueryFormComponent {
1192
1192
  constructor() {
1193
1193
  super(...arguments);
1194
- this.queryParameters = [];
1195
- this.queryFields = [];
1196
- this.queryEntities = [];
1197
- this.queryPermissions = [];
1198
- this.isLoadingParameters = false;
1199
- this.isLoadingFields = false;
1200
- this.isLoadingEntities = false;
1201
- this.isLoadingPermissions = false;
1202
- this.hasUnsavedChanges = false;
1203
- this.showFiltersHelp = false;
1204
- this.showRunDialog = false;
1205
- this.categoryPathDisplay = '';
1194
+ this.QueryParameters = [];
1195
+ this.QueryFields = [];
1196
+ this.QueryEntities = [];
1197
+ this.QueryPermissions = [];
1198
+ this.IsLoadingParameters = false;
1199
+ this.IsLoadingFields = false;
1200
+ this.IsLoadingEntities = false;
1201
+ this.IsLoadingPermissions = false;
1202
+ this.HasUnsavedChanges = false;
1203
+ this.ShowFiltersHelp = false;
1204
+ this.ShowRunDialog = false;
1205
+ this.CategoryPathDisplay = '';
1206
1206
  this.IsSaving = false;
1207
1207
  // Expansion panel states
1208
- this.sqlPanelExpanded = true;
1209
- this.parametersPanelExpanded = false;
1210
- this.fieldsPanelExpanded = false;
1211
- this.entitiesPanelExpanded = false;
1212
- this.technicalDescriptionPanelExpanded = false;
1213
- this.detailsPanelExpanded = false;
1214
- this.permissionsPanelExpanded = false;
1215
- this.dependentsPanelExpanded = false;
1208
+ this.SqlPanelExpanded = true;
1209
+ this.ParametersPanelExpanded = false;
1210
+ this.FieldsPanelExpanded = false;
1211
+ this.EntitiesPanelExpanded = false;
1212
+ this.TechnicalDescriptionPanelExpanded = false;
1213
+ this.DetailsPanelExpanded = false;
1214
+ this.PermissionsPanelExpanded = false;
1215
+ this.DependentsPanelExpanded = false;
1216
1216
  // Category data
1217
- this.categoryOptions = [
1217
+ this.CategoryOptions = [
1218
1218
  { text: 'Select Category...', value: '' }
1219
1219
  ];
1220
- this.categories = [];
1221
- this.categoryTreeData = [];
1220
+ this.Categories = [];
1221
+ this.CategoryTreeData = [];
1222
1222
  /** Tree dropdown config for Query Categories */
1223
1223
  this.CategoryBranchConfig = {
1224
1224
  EntityName: 'MJ: Query Categories',
@@ -1230,7 +1230,7 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1230
1230
  OrderBy: 'Name ASC'
1231
1231
  };
1232
1232
  // Status options — matches MJQueryEntity.Status type from database CHECK constraint
1233
- this.statusOptions = [
1233
+ this.StatusOptions = [
1234
1234
  { text: 'Pending', value: 'Pending' },
1235
1235
  { text: 'Approved', value: 'Approved' },
1236
1236
  { text: 'Rejected', value: 'Rejected' },
@@ -1240,9 +1240,9 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1240
1240
  // group, keeps all left-side action buttons (delete/favorite/history/list)
1241
1241
  // since they're now wired through `<mj-record-form-container>`.
1242
1242
  this.ToolbarConfig = CUSTOM_LAYOUT_TOOLBAR_CONFIG;
1243
- this.sqlEditor = null;
1243
+ this.SqlEditor = null;
1244
1244
  // SQL Filters for help display
1245
- this.sqlFilters = RUN_QUERY_SQL_FILTERS;
1245
+ this.SqlFilters = RUN_QUERY_SQL_FILTERS;
1246
1246
  this.navigationService = inject(NavigationService);
1247
1247
  this.formPresenter = inject(MJFormPresenterService);
1248
1248
  this.confirmService = inject(MJConfirmService);
@@ -1250,6 +1250,190 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1250
1250
  this.isUpdatingEditorValue = false;
1251
1251
  this.isInitialLoad = true;
1252
1252
  }
1253
+ /** @deprecated Use {@link QueryParameters}. */
1254
+ get queryParameters() {
1255
+ return this.QueryParameters;
1256
+ }
1257
+ /** @deprecated Use {@link QueryParameters}. */
1258
+ set queryParameters(value) {
1259
+ this.QueryParameters = value;
1260
+ }
1261
+ /** @deprecated Use {@link QueryFields}. */
1262
+ get queryFields() {
1263
+ return this.QueryFields;
1264
+ }
1265
+ /** @deprecated Use {@link QueryFields}. */
1266
+ set queryFields(value) {
1267
+ this.QueryFields = value;
1268
+ }
1269
+ /** @deprecated Use {@link QueryEntities}. */
1270
+ get queryEntities() {
1271
+ return this.QueryEntities;
1272
+ }
1273
+ /** @deprecated Use {@link QueryEntities}. */
1274
+ set queryEntities(value) {
1275
+ this.QueryEntities = value;
1276
+ }
1277
+ /** @deprecated Use {@link QueryPermissions}. */
1278
+ get queryPermissions() {
1279
+ return this.QueryPermissions;
1280
+ }
1281
+ /** @deprecated Use {@link QueryPermissions}. */
1282
+ set queryPermissions(value) {
1283
+ this.QueryPermissions = value;
1284
+ }
1285
+ /** @deprecated Use {@link IsLoadingParameters}. */
1286
+ get isLoadingParameters() {
1287
+ return this.IsLoadingParameters;
1288
+ }
1289
+ /** @deprecated Use {@link IsLoadingParameters}. */
1290
+ set isLoadingParameters(value) {
1291
+ this.IsLoadingParameters = value;
1292
+ }
1293
+ /** @deprecated Use {@link IsLoadingFields}. */
1294
+ get isLoadingFields() {
1295
+ return this.IsLoadingFields;
1296
+ }
1297
+ /** @deprecated Use {@link IsLoadingFields}. */
1298
+ set isLoadingFields(value) {
1299
+ this.IsLoadingFields = value;
1300
+ }
1301
+ /** @deprecated Use {@link IsLoadingEntities}. */
1302
+ get isLoadingEntities() {
1303
+ return this.IsLoadingEntities;
1304
+ }
1305
+ /** @deprecated Use {@link IsLoadingEntities}. */
1306
+ set isLoadingEntities(value) {
1307
+ this.IsLoadingEntities = value;
1308
+ }
1309
+ /** @deprecated Use {@link IsLoadingPermissions}. */
1310
+ get isLoadingPermissions() {
1311
+ return this.IsLoadingPermissions;
1312
+ }
1313
+ /** @deprecated Use {@link IsLoadingPermissions}. */
1314
+ set isLoadingPermissions(value) {
1315
+ this.IsLoadingPermissions = value;
1316
+ }
1317
+ /** @deprecated Use {@link HasUnsavedChanges}. */
1318
+ get hasUnsavedChanges() {
1319
+ return this.HasUnsavedChanges;
1320
+ }
1321
+ /** @deprecated Use {@link HasUnsavedChanges}. */
1322
+ set hasUnsavedChanges(value) {
1323
+ this.HasUnsavedChanges = value;
1324
+ }
1325
+ /** @deprecated Use {@link ShowFiltersHelp}. */
1326
+ get showFiltersHelp() {
1327
+ return this.ShowFiltersHelp;
1328
+ }
1329
+ /** @deprecated Use {@link ShowFiltersHelp}. */
1330
+ set showFiltersHelp(value) {
1331
+ this.ShowFiltersHelp = value;
1332
+ }
1333
+ /** @deprecated Use {@link ShowRunDialog}. */
1334
+ get showRunDialog() {
1335
+ return this.ShowRunDialog;
1336
+ }
1337
+ /** @deprecated Use {@link ShowRunDialog}. */
1338
+ set showRunDialog(value) {
1339
+ this.ShowRunDialog = value;
1340
+ }
1341
+ /** @deprecated Use {@link CategoryPathDisplay}. */
1342
+ get categoryPathDisplay() {
1343
+ return this.CategoryPathDisplay;
1344
+ }
1345
+ /** @deprecated Use {@link CategoryPathDisplay}. */
1346
+ set categoryPathDisplay(value) {
1347
+ this.CategoryPathDisplay = value;
1348
+ }
1349
+ /** @deprecated Use {@link SqlPanelExpanded}. */
1350
+ get sqlPanelExpanded() {
1351
+ return this.SqlPanelExpanded;
1352
+ }
1353
+ /** @deprecated Use {@link SqlPanelExpanded}. */
1354
+ set sqlPanelExpanded(value) {
1355
+ this.SqlPanelExpanded = value;
1356
+ }
1357
+ /** @deprecated Use {@link ParametersPanelExpanded}. */
1358
+ get parametersPanelExpanded() {
1359
+ return this.ParametersPanelExpanded;
1360
+ }
1361
+ /** @deprecated Use {@link ParametersPanelExpanded}. */
1362
+ set parametersPanelExpanded(value) {
1363
+ this.ParametersPanelExpanded = value;
1364
+ }
1365
+ /** @deprecated Use {@link FieldsPanelExpanded}. */
1366
+ get fieldsPanelExpanded() {
1367
+ return this.FieldsPanelExpanded;
1368
+ }
1369
+ /** @deprecated Use {@link FieldsPanelExpanded}. */
1370
+ set fieldsPanelExpanded(value) {
1371
+ this.FieldsPanelExpanded = value;
1372
+ }
1373
+ /** @deprecated Use {@link EntitiesPanelExpanded}. */
1374
+ get entitiesPanelExpanded() {
1375
+ return this.EntitiesPanelExpanded;
1376
+ }
1377
+ /** @deprecated Use {@link EntitiesPanelExpanded}. */
1378
+ set entitiesPanelExpanded(value) {
1379
+ this.EntitiesPanelExpanded = value;
1380
+ }
1381
+ /** @deprecated Use {@link TechnicalDescriptionPanelExpanded}. */
1382
+ get technicalDescriptionPanelExpanded() {
1383
+ return this.TechnicalDescriptionPanelExpanded;
1384
+ }
1385
+ /** @deprecated Use {@link TechnicalDescriptionPanelExpanded}. */
1386
+ set technicalDescriptionPanelExpanded(value) {
1387
+ this.TechnicalDescriptionPanelExpanded = value;
1388
+ }
1389
+ /** @deprecated Use {@link DetailsPanelExpanded}. */
1390
+ get detailsPanelExpanded() {
1391
+ return this.DetailsPanelExpanded;
1392
+ }
1393
+ /** @deprecated Use {@link DetailsPanelExpanded}. */
1394
+ set detailsPanelExpanded(value) {
1395
+ this.DetailsPanelExpanded = value;
1396
+ }
1397
+ /** @deprecated Use {@link PermissionsPanelExpanded}. */
1398
+ get permissionsPanelExpanded() {
1399
+ return this.PermissionsPanelExpanded;
1400
+ }
1401
+ /** @deprecated Use {@link PermissionsPanelExpanded}. */
1402
+ set permissionsPanelExpanded(value) {
1403
+ this.PermissionsPanelExpanded = value;
1404
+ }
1405
+ /** @deprecated Use {@link DependentsPanelExpanded}. */
1406
+ get dependentsPanelExpanded() {
1407
+ return this.DependentsPanelExpanded;
1408
+ }
1409
+ /** @deprecated Use {@link DependentsPanelExpanded}. */
1410
+ set dependentsPanelExpanded(value) {
1411
+ this.DependentsPanelExpanded = value;
1412
+ }
1413
+ /** @deprecated Use {@link CategoryOptions}. */
1414
+ get categoryOptions() {
1415
+ return this.CategoryOptions;
1416
+ }
1417
+ /** @deprecated Use {@link CategoryOptions}. */
1418
+ set categoryOptions(value) {
1419
+ this.CategoryOptions = value;
1420
+ }
1421
+ /** @deprecated Use {@link Categories}. */
1422
+ get categories() {
1423
+ return this.Categories;
1424
+ }
1425
+ /** @deprecated Use {@link Categories}. */
1426
+ set categories(value) {
1427
+ this.Categories = value;
1428
+ }
1429
+ /** @deprecated Use {@link CategoryTreeData}. */
1430
+ get categoryTreeData() {
1431
+ return this.CategoryTreeData;
1432
+ }
1433
+ /** @deprecated Use {@link CategoryTreeData}. */
1434
+ set categoryTreeData(value) {
1435
+ this.CategoryTreeData = value;
1436
+ }
1253
1437
  /** CategoryID as CompositeKey for tree dropdown binding */
1254
1438
  get CategoryIDAsKey() {
1255
1439
  return this.record?.CategoryID ? CompositeKey.FromID(this.record.CategoryID) : null; // first-pk-ok: FK target — Query CategoryID references the single-column ID key of Query Categories
@@ -1266,8 +1450,32 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1266
1450
  }
1267
1451
  this.updateCategoryPathDisplay();
1268
1452
  }
1453
+ /** @deprecated Use {@link StatusOptions}. */
1454
+ get statusOptions() {
1455
+ return this.StatusOptions;
1456
+ }
1457
+ /** @deprecated Use {@link StatusOptions}. */
1458
+ set statusOptions(value) {
1459
+ this.StatusOptions = value;
1460
+ }
1269
1461
  /** Custom-layout Query form looks best full-width on first open. */
1270
1462
  getDefaultFormWidthMode() { return 'full-width'; }
1463
+ /** @deprecated Use {@link SqlEditor}. */
1464
+ get sqlEditor() {
1465
+ return this.SqlEditor;
1466
+ }
1467
+ /** @deprecated Use {@link SqlEditor}. */
1468
+ set sqlEditor(value) {
1469
+ this.SqlEditor = value;
1470
+ }
1471
+ /** @deprecated Use {@link SqlFilters}. */
1472
+ get sqlFilters() {
1473
+ return this.SqlFilters;
1474
+ }
1475
+ /** @deprecated Use {@link SqlFilters}. */
1476
+ set sqlFilters(value) {
1477
+ this.SqlFilters = value;
1478
+ }
1271
1479
  /**
1272
1480
  * Gets queries that depend on (reference) this query via composition.
1273
1481
  */
@@ -1280,11 +1488,11 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1280
1488
  // We do one unified detectChanges after everything completes.
1281
1489
  this.isInitialLoad = true;
1282
1490
  // Load all data synchronously from QueryEngine cache
1283
- this.loadCategories();
1284
- this.loadQueryParameters();
1285
- this.loadQueryFields();
1286
- this.loadQueryEntities();
1287
- this.loadQueryPermissions();
1491
+ this.LoadCategories();
1492
+ this.LoadQueryParameters();
1493
+ this.LoadQueryFields();
1494
+ this.LoadQueryEntities();
1495
+ this.LoadQueryPermissions();
1288
1496
  this.isInitialLoad = false;
1289
1497
  this.cdr.detectChanges();
1290
1498
  }
@@ -1294,17 +1502,17 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1294
1502
  }
1295
1503
  ngAfterViewInit() {
1296
1504
  super.ngAfterViewInit();
1297
- this.sqlEditor?.setEditable(this.EditMode);
1505
+ this.SqlEditor?.setEditable(this.EditMode);
1298
1506
  // Set initial SQL value in the editor
1299
1507
  this.updateEditorValue();
1300
1508
  }
1301
1509
  EndEditMode() {
1302
1510
  super.EndEditMode();
1303
- this.sqlEditor?.setEditable(false);
1511
+ this.SqlEditor?.setEditable(false);
1304
1512
  }
1305
1513
  StartEditMode() {
1306
1514
  super.StartEditMode();
1307
- this.sqlEditor?.setEditable(true);
1515
+ this.SqlEditor?.setEditable(true);
1308
1516
  // Force change detection after a brief delay to ensure form controls are initialized
1309
1517
  setTimeout(() => {
1310
1518
  this.cdr.detectChanges();
@@ -1313,74 +1521,98 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1313
1521
  CancelEdit() {
1314
1522
  super.CancelEdit();
1315
1523
  this.updateEditorValue(); // Reset editor value to record SQL
1316
- this.sqlEditor?.setEditable(false);
1524
+ this.SqlEditor?.setEditable(false);
1317
1525
  this.updateUnsavedChangesFlag(); // Reset unsaved changes flag
1318
1526
  }
1319
1527
  updateEditorValue() {
1320
- if (!this.sqlEditor || this.isUpdatingEditorValue) {
1528
+ if (!this.SqlEditor || this.isUpdatingEditorValue) {
1321
1529
  return;
1322
1530
  }
1323
1531
  // Use setTimeout to avoid ExpressionChangedAfterItHasBeenCheckedError
1324
1532
  setTimeout(() => {
1325
- if (!this.sqlEditor) {
1533
+ if (!this.SqlEditor) {
1326
1534
  return;
1327
1535
  }
1328
1536
  this.isUpdatingEditorValue = true;
1329
1537
  const sqlValue = this.record?.SQL || '';
1330
1538
  // Use the setValue method from mj-code-editor component
1331
- this.sqlEditor.setValue(sqlValue);
1539
+ this.SqlEditor.setValue(sqlValue);
1332
1540
  this.isUpdatingEditorValue = false;
1333
1541
  }, 0);
1334
1542
  }
1335
- isFormReadOnly() {
1543
+ IsFormReadOnly() {
1336
1544
  return !this.EditMode;
1337
1545
  }
1338
- loadQueryParameters() {
1546
+ /** @deprecated Use {@link IsFormReadOnly}. */
1547
+ isFormReadOnly() {
1548
+ return this.IsFormReadOnly();
1549
+ }
1550
+ LoadQueryParameters() {
1339
1551
  if (this.record && this.record.ID) {
1340
- this.queryParameters = this.record.QueryParameters;
1552
+ this.QueryParameters = this.record.QueryParameters;
1341
1553
  if (!this.isInitialLoad)
1342
1554
  this.cdr.detectChanges();
1343
1555
  }
1344
1556
  }
1345
- loadQueryFields() {
1557
+ /** @deprecated Use {@link LoadQueryParameters}. */
1558
+ loadQueryParameters() {
1559
+ return this.LoadQueryParameters();
1560
+ }
1561
+ LoadQueryFields() {
1346
1562
  if (this.record && this.record.ID) {
1347
- this.queryFields = this.record.QueryFields;
1563
+ this.QueryFields = this.record.QueryFields;
1348
1564
  if (!this.isInitialLoad)
1349
1565
  this.cdr.detectChanges();
1350
1566
  }
1351
1567
  }
1352
- loadQueryEntities() {
1568
+ /** @deprecated Use {@link LoadQueryFields}. */
1569
+ loadQueryFields() {
1570
+ return this.LoadQueryFields();
1571
+ }
1572
+ LoadQueryEntities() {
1353
1573
  if (this.record && this.record.ID) {
1354
- this.queryEntities = this.record.QueryEntities;
1574
+ this.QueryEntities = this.record.QueryEntities;
1355
1575
  if (!this.isInitialLoad)
1356
1576
  this.cdr.detectChanges();
1357
1577
  }
1358
1578
  }
1359
- loadQueryPermissions() {
1579
+ /** @deprecated Use {@link LoadQueryEntities}. */
1580
+ loadQueryEntities() {
1581
+ return this.LoadQueryEntities();
1582
+ }
1583
+ LoadQueryPermissions() {
1360
1584
  if (this.record && this.record.ID) {
1361
- this.queryPermissions = this.record.QueryPermissions;
1585
+ this.QueryPermissions = this.record.QueryPermissions;
1362
1586
  if (!this.isInitialLoad)
1363
1587
  this.cdr.detectChanges();
1364
1588
  }
1365
1589
  }
1366
- loadCategories() {
1367
- this.categories = QueryEngine.Instance.Categories;
1590
+ /** @deprecated Use {@link LoadQueryPermissions}. */
1591
+ loadQueryPermissions() {
1592
+ return this.LoadQueryPermissions();
1593
+ }
1594
+ LoadCategories() {
1595
+ this.Categories = QueryEngine.Instance.Categories;
1368
1596
  // Build flat options for legacy compatibility
1369
- this.categoryOptions = [
1597
+ this.CategoryOptions = [
1370
1598
  { text: 'Select Category...', value: '' },
1371
- ...this.categories.map(cat => ({
1599
+ ...this.Categories.map(cat => ({
1372
1600
  text: cat.Name,
1373
1601
  value: cat.ID
1374
1602
  }))
1375
1603
  ];
1376
1604
  // Build tree data after options are set
1377
- this.categoryTreeData = this.buildCategoryTree(this.categories);
1605
+ this.CategoryTreeData = this.buildCategoryTree(this.Categories);
1378
1606
  // Update cached category path display
1379
1607
  this.updateCategoryPathDisplay();
1380
1608
  // Trigger change detection to update the view (skip during init)
1381
1609
  if (!this.isInitialLoad)
1382
1610
  this.cdr.detectChanges();
1383
1611
  }
1612
+ /** @deprecated Use {@link LoadCategories}. */
1613
+ loadCategories() {
1614
+ return this.LoadCategories();
1615
+ }
1384
1616
  buildCategoryTree(categories) {
1385
1617
  const categoryMap = new Map();
1386
1618
  const rootCategories = [];
@@ -1417,11 +1649,11 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1417
1649
  sortNodes(rootCategories);
1418
1650
  return rootCategories;
1419
1651
  }
1420
- getCategoryPath() {
1652
+ GetCategoryPath() {
1421
1653
  if (!this.record?.CategoryID)
1422
1654
  return '';
1423
1655
  const findPath = (categoryId) => {
1424
- const category = this.categories.find(c => UUIDsEqual(c.ID, categoryId));
1656
+ const category = this.Categories.find(c => UUIDsEqual(c.ID, categoryId));
1425
1657
  if (!category)
1426
1658
  return [];
1427
1659
  if (category.ParentID) {
@@ -1431,15 +1663,19 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1431
1663
  };
1432
1664
  return findPath(this.record.CategoryID).join(' / ');
1433
1665
  }
1666
+ /** @deprecated Use {@link GetCategoryPath}. */
1667
+ getCategoryPath() {
1668
+ return this.GetCategoryPath();
1669
+ }
1434
1670
  updateCategoryPathDisplay() {
1435
- this.categoryPathDisplay = this.getCategoryPath();
1671
+ this.CategoryPathDisplay = this.GetCategoryPath();
1436
1672
  }
1437
- async onCategoryChange(value) {
1673
+ async OnCategoryChange(value) {
1438
1674
  // If it's a new category (string but not in existing options)
1439
- if (value && !this.categoryOptions.find(opt => opt.value === value)) {
1675
+ if (value && !this.CategoryOptions.find(opt => opt.value === value)) {
1440
1676
  // Check for duplicate category names (case-insensitive, trimmed)
1441
1677
  if (this.isDuplicateCategory(value)) {
1442
- const existingCategory = this.categoryOptions.find(option => option.text && option.text.trim().toLowerCase() === value.trim().toLowerCase());
1678
+ const existingCategory = this.CategoryOptions.find(option => option.text && option.text.trim().toLowerCase() === value.trim().toLowerCase());
1443
1679
  if (existingCategory) {
1444
1680
  // Use the existing category instead
1445
1681
  this.record.CategoryID = existingCategory.value;
@@ -1455,7 +1691,7 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1455
1691
  const saved = await newCategory.Save();
1456
1692
  if (saved) {
1457
1693
  // Add to options and set the ID
1458
- this.categoryOptions.push({
1694
+ this.CategoryOptions.push({
1459
1695
  text: newCategory.Name,
1460
1696
  value: newCategory.ID
1461
1697
  });
@@ -1472,30 +1708,38 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1472
1708
  }
1473
1709
  }
1474
1710
  }
1711
+ /** @deprecated Use {@link OnCategoryChange}. */
1712
+ async onCategoryChange(value) {
1713
+ return this.OnCategoryChange(value);
1714
+ }
1475
1715
  isDuplicateCategory(categoryName) {
1476
1716
  const normalizedName = categoryName?.trim().toLowerCase();
1477
- return this.categoryOptions.some(option => option.text && option.text.trim().toLowerCase() === normalizedName);
1717
+ return this.CategoryOptions.some(option => option.text && option.text.trim().toLowerCase() === normalizedName);
1478
1718
  }
1479
1719
  /**
1480
1720
  * Updates the hasUnsavedChanges flag based on entity dirty states
1481
1721
  */
1482
1722
  updateUnsavedChangesFlag() {
1483
- this.hasUnsavedChanges = this.queryParameters.some(param => param.Dirty) ||
1723
+ this.HasUnsavedChanges = this.QueryParameters.some(param => param.Dirty) ||
1484
1724
  this.record?.Dirty || false;
1485
1725
  }
1726
+ ToggleFiltersHelp() {
1727
+ this.ShowFiltersHelp = !this.ShowFiltersHelp;
1728
+ }
1729
+ /** @deprecated Use {@link ToggleFiltersHelp}. */
1486
1730
  toggleFiltersHelp() {
1487
- this.showFiltersHelp = !this.showFiltersHelp;
1731
+ return this.ToggleFiltersHelp();
1488
1732
  }
1489
1733
  /**
1490
1734
  * Run the query with parameter dialog
1491
1735
  */
1492
- async runQuery() {
1736
+ async RunQuery() {
1493
1737
  if (!this.record?.IsSaved) {
1494
1738
  MJNotificationService.Instance.CreateSimpleNotification('Please save the query before running it.', 'warning', 3000);
1495
1739
  return;
1496
1740
  }
1497
1741
  // Save any unsaved changes first
1498
- if (this.hasUnsavedChanges) {
1742
+ if (this.HasUnsavedChanges) {
1499
1743
  const saveResult = await this.SaveRecord(false); // Don't exit edit mode
1500
1744
  if (!saveResult) {
1501
1745
  MJNotificationService.Instance.CreateSimpleNotification('Failed to save query changes.', 'error', 3000);
@@ -1507,31 +1751,39 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1507
1751
  console.warn(`Executing query '${this.record.Name}' with status '${this.record.Status}'. Query has not been approved.`);
1508
1752
  }
1509
1753
  // Reload parameters in case they were updated
1510
- this.loadQueryParameters();
1754
+ this.LoadQueryParameters();
1511
1755
  // Show the run dialog — set before detectChanges to avoid NG0100
1512
- this.showRunDialog = true;
1756
+ this.ShowRunDialog = true;
1513
1757
  this.cdr.detectChanges();
1514
1758
  }
1759
+ /** @deprecated Use {@link RunQuery}. */
1760
+ async runQuery() {
1761
+ return this.RunQuery();
1762
+ }
1515
1763
  /**
1516
1764
  * Handle run dialog close
1517
1765
  */
1766
+ OnRunDialogClose() {
1767
+ this.ShowRunDialog = false;
1768
+ }
1769
+ /** @deprecated Use {@link OnRunDialogClose}. */
1518
1770
  onRunDialogClose() {
1519
- this.showRunDialog = false;
1771
+ return this.OnRunDialogClose();
1520
1772
  }
1521
1773
  /**
1522
1774
  * Add a new parameter
1523
1775
  */
1524
- async addParameter() {
1776
+ async AddParameter() {
1525
1777
  try {
1526
1778
  const md = this.ProviderToUse;
1527
1779
  const newParam = await md.GetEntityObject('MJ: Query Parameters');
1528
1780
  newParam.QueryID = this.record.ID;
1529
- newParam.Name = `param${this.queryParameters.length + 1}`;
1781
+ newParam.Name = `param${this.QueryParameters.length + 1}`;
1530
1782
  newParam.Type = 'string';
1531
1783
  newParam.IsRequired = false;
1532
1784
  const saved = await newParam.Save();
1533
1785
  if (saved) {
1534
- this.queryParameters.push(newParam);
1786
+ this.QueryParameters.push(newParam);
1535
1787
  this.updateUnsavedChangesFlag();
1536
1788
  MJNotificationService.Instance.CreateSimpleNotification('Parameter added successfully', 'success', 3000);
1537
1789
  }
@@ -1544,17 +1796,25 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1544
1796
  MJNotificationService.Instance.CreateSimpleNotification('Error adding parameter', 'error', 3000);
1545
1797
  }
1546
1798
  }
1799
+ /** @deprecated Use {@link AddParameter}. */
1800
+ async addParameter() {
1801
+ return this.AddParameter();
1802
+ }
1547
1803
  /**
1548
1804
  * Edit a parameter
1549
1805
  */
1550
- async editParameter(param) {
1806
+ async EditParameter(param) {
1551
1807
  // TODO: Show parameter edit dialog
1552
1808
  console.log('Edit parameter:', param);
1553
1809
  }
1810
+ /** @deprecated Use {@link EditParameter}. */
1811
+ async editParameter(param) {
1812
+ return this.EditParameter(param);
1813
+ }
1554
1814
  /**
1555
1815
  * Delete a parameter
1556
1816
  */
1557
- async deleteParameter(param) {
1817
+ async DeleteParameter(param) {
1558
1818
  if (!(await this.confirmService.ConfirmDelete({ title: 'Delete Parameter', message: `Delete parameter "${param.Name}"?` }))) {
1559
1819
  return;
1560
1820
  }
@@ -1586,10 +1846,14 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1586
1846
  MJNotificationService.Instance.CreateSimpleNotification('Error deleting parameter', 'error', 3000);
1587
1847
  }
1588
1848
  }
1849
+ /** @deprecated Use {@link DeleteParameter}. */
1850
+ async deleteParameter(param) {
1851
+ return this.DeleteParameter(param);
1852
+ }
1589
1853
  removeParameterFromList(param) {
1590
- const index = this.queryParameters.indexOf(param);
1854
+ const index = this.QueryParameters.indexOf(param);
1591
1855
  if (index > -1) {
1592
- this.queryParameters.splice(index, 1);
1856
+ this.QueryParameters.splice(index, 1);
1593
1857
  }
1594
1858
  this.cdr.detectChanges();
1595
1859
  }
@@ -1598,7 +1862,7 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1598
1862
  * MJFormPresenterService. A new record opens in edit mode automatically.
1599
1863
  * On save, refresh the category tree and select the new category.
1600
1864
  */
1601
- async createCategory() {
1865
+ async CreateCategory() {
1602
1866
  const ref = this.formPresenter.Open({
1603
1867
  EntityName: 'MJ: Query Categories',
1604
1868
  Presentation: 'slide-in',
@@ -1609,15 +1873,19 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1609
1873
  });
1610
1874
  const saved = await ref.AfterSaved();
1611
1875
  if (saved) {
1612
- this.onCategoryCreated(saved);
1876
+ this.OnCategoryCreated(saved);
1613
1877
  }
1614
1878
  }
1879
+ /** @deprecated Use {@link CreateCategory}. */
1880
+ async createCategory() {
1881
+ return this.CreateCategory();
1882
+ }
1615
1883
  /**
1616
1884
  * Edit the currently-selected category in a slide-in via the generic
1617
1885
  * MJFormPresenterService. `StartInEditMode` opens the existing record
1618
1886
  * editable. On save, refresh the category tree.
1619
1887
  */
1620
- async editSelectedCategory() {
1888
+ async EditSelectedCategory() {
1621
1889
  if (!this.record.CategoryID)
1622
1890
  return;
1623
1891
  const ref = this.formPresenter.Open({
@@ -1631,18 +1899,26 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1631
1899
  });
1632
1900
  const saved = await ref.AfterSaved();
1633
1901
  if (saved) {
1634
- this.loadCategories();
1902
+ this.LoadCategories();
1635
1903
  this.cdr.detectChanges();
1636
1904
  }
1637
1905
  }
1638
- onCategoryCreated(newCategory) {
1906
+ /** @deprecated Use {@link EditSelectedCategory}. */
1907
+ async editSelectedCategory() {
1908
+ return this.EditSelectedCategory();
1909
+ }
1910
+ OnCategoryCreated(newCategory) {
1639
1911
  // Reload categories to include the new one
1640
- this.loadCategories();
1912
+ this.LoadCategories();
1641
1913
  // Set the new category as selected
1642
1914
  this.record.CategoryID = newCategory.ID;
1643
1915
  // Trigger change detection
1644
1916
  this.cdr.detectChanges();
1645
1917
  }
1918
+ /** @deprecated Use {@link OnCategoryCreated}. */
1919
+ onCategoryCreated(newCategory) {
1920
+ return this.OnCategoryCreated(newCategory);
1921
+ }
1646
1922
  /**
1647
1923
  * Format date for display
1648
1924
  */
@@ -1666,9 +1942,9 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1666
1942
  }
1667
1943
  async internalSaveRecord(StopEditModeAfterSave) {
1668
1944
  // Handle category creation before saving query
1669
- if (this.record.CategoryID && !this.categoryOptions.find(opt => opt.value === this.record.CategoryID)) {
1945
+ if (this.record.CategoryID && !this.CategoryOptions.find(opt => opt.value === this.record.CategoryID)) {
1670
1946
  if (this.isDuplicateCategory(this.record.CategoryID)) {
1671
- const existingCategory = this.categoryOptions.find(option => option.text && option.text.trim().toLowerCase() === this.record.CategoryID?.trim().toLowerCase());
1947
+ const existingCategory = this.CategoryOptions.find(option => option.text && option.text.trim().toLowerCase() === this.record.CategoryID?.trim().toLowerCase());
1672
1948
  if (existingCategory) {
1673
1949
  this.record.CategoryID = existingCategory.value;
1674
1950
  MJNotificationService.Instance.CreateSimpleNotification(`Category "${existingCategory.text}" already exists. Using existing category.`, 'warning', 3000);
@@ -1681,7 +1957,7 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1681
1957
  newCategory.Name = this.record.CategoryID.trim();
1682
1958
  const saved = await newCategory.Save();
1683
1959
  if (saved) {
1684
- this.categoryOptions.push({
1960
+ this.CategoryOptions.push({
1685
1961
  text: newCategory.Name,
1686
1962
  value: newCategory.ID
1687
1963
  });
@@ -1702,7 +1978,7 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1702
1978
  }
1703
1979
  // Save any unsaved query entities first
1704
1980
  if (this.EditMode) {
1705
- for (const entity of this.queryEntities) {
1981
+ for (const entity of this.QueryEntities) {
1706
1982
  if (!entity.IsSaved && entity.EntityID) {
1707
1983
  try {
1708
1984
  await entity.Save();
@@ -1719,16 +1995,16 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1719
1995
  this.updateUnsavedChangesFlag();
1720
1996
  // Reload related data after successful save as server-side processes may have updated them
1721
1997
  if (this.record && this.record.ID) {
1722
- this.loadQueryParameters();
1723
- this.loadQueryFields();
1724
- this.loadQueryEntities();
1998
+ this.LoadQueryParameters();
1999
+ this.LoadQueryFields();
2000
+ this.LoadQueryEntities();
1725
2001
  this.updateCategoryPathDisplay();
1726
2002
  this.cdr.detectChanges();
1727
2003
  }
1728
2004
  }
1729
2005
  return result;
1730
2006
  }
1731
- getStatusBadgeColor() {
2007
+ GetStatusBadgeColor() {
1732
2008
  switch (this.record?.Status) {
1733
2009
  case 'Approved': return '#28a745';
1734
2010
  case 'Pending': return '#f59e0b';
@@ -1737,7 +2013,11 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1737
2013
  default: return '#6c757d';
1738
2014
  }
1739
2015
  }
1740
- getStatusBannerIcon() {
2016
+ /** @deprecated Use {@link GetStatusBadgeColor}. */
2017
+ getStatusBadgeColor() {
2018
+ return this.GetStatusBadgeColor();
2019
+ }
2020
+ GetStatusBannerIcon() {
1741
2021
  switch (this.record?.Status) {
1742
2022
  case 'Pending': return 'fa-clock';
1743
2023
  case 'Rejected': return 'fa-times-circle';
@@ -1745,7 +2025,11 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1745
2025
  default: return 'fa-info-circle';
1746
2026
  }
1747
2027
  }
1748
- getStatusBannerMessage() {
2028
+ /** @deprecated Use {@link GetStatusBannerIcon}. */
2029
+ getStatusBannerIcon() {
2030
+ return this.GetStatusBannerIcon();
2031
+ }
2032
+ GetStatusBannerMessage() {
1749
2033
  switch (this.record?.Status) {
1750
2034
  case 'Pending': return 'It can be executed for testing but has not yet been approved.';
1751
2035
  case 'Rejected': return 'It was rejected and may need revision before approval.';
@@ -1753,10 +2037,14 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1753
2037
  default: return '';
1754
2038
  }
1755
2039
  }
2040
+ /** @deprecated Use {@link GetStatusBannerMessage}. */
2041
+ getStatusBannerMessage() {
2042
+ return this.GetStatusBannerMessage();
2043
+ }
1756
2044
  /**
1757
2045
  * Handle composition token click — navigate to the referenced query
1758
2046
  */
1759
- onCompositionTokenClick(event) {
2047
+ OnCompositionTokenClick(event) {
1760
2048
  const allQueries = QueryEngine.Instance.Queries;
1761
2049
  const segments = event.FullPath.split('/').map(s => s.trim()).filter(s => s.length > 0);
1762
2050
  if (segments.length === 0)
@@ -1783,16 +2071,24 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1783
2071
  MJNotificationService.Instance.CreateSimpleNotification(`Referenced query "${event.FullPath}" not found.`, 'warning', 3000);
1784
2072
  }
1785
2073
  }
2074
+ /** @deprecated Use {@link OnCompositionTokenClick}. */
2075
+ onCompositionTokenClick(event) {
2076
+ return this.OnCompositionTokenClick(event);
2077
+ }
1786
2078
  /**
1787
2079
  * Navigate to a dependent query's record
1788
2080
  */
1789
- onDependentQueryClick(dep) {
2081
+ OnDependentQueryClick(dep) {
1790
2082
  this.navigationService.OpenEntityRecord('MJ: Queries', CompositeKey.FromID(dep.QueryID));
1791
2083
  }
2084
+ /** @deprecated Use {@link OnDependentQueryClick}. */
2085
+ onDependentQueryClick(dep) {
2086
+ return this.OnDependentQueryClick(dep);
2087
+ }
1792
2088
  /**
1793
2089
  * Handle SQL value changes from the code editor
1794
2090
  */
1795
- onSQLChange(value) {
2091
+ OnSQLChange(value) {
1796
2092
  if (this.isUpdatingEditorValue || !this.record) {
1797
2093
  return;
1798
2094
  }
@@ -1800,23 +2096,27 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1800
2096
  this.record.SQL = value;
1801
2097
  this.updateUnsavedChangesFlag();
1802
2098
  }
2099
+ /** @deprecated Use {@link OnSQLChange}. */
2100
+ onSQLChange(value) {
2101
+ return this.OnSQLChange(value);
2102
+ }
1803
2103
  /**
1804
2104
  * Add a new field
1805
2105
  */
1806
- async addField() {
2106
+ async AddField() {
1807
2107
  try {
1808
2108
  const md = this.ProviderToUse;
1809
2109
  const newField = await md.GetEntityObject('MJ: Query Fields');
1810
2110
  newField.QueryID = this.record.ID;
1811
- newField.Name = `field${this.queryFields.length + 1}`;
2111
+ newField.Name = `field${this.QueryFields.length + 1}`;
1812
2112
  newField.Description = '';
1813
- newField.Sequence = (this.queryFields.length + 1) * 10;
2113
+ newField.Sequence = (this.QueryFields.length + 1) * 10;
1814
2114
  newField.SQLBaseType = 'nvarchar';
1815
2115
  newField.SQLFullType = 'nvarchar(255)';
1816
2116
  const saved = await newField.Save();
1817
2117
  if (saved) {
1818
- this.queryFields.push(newField);
1819
- this.queryFields.sort((a, b) => (a.Sequence || 0) - (b.Sequence || 0));
2118
+ this.QueryFields.push(newField);
2119
+ this.QueryFields.sort((a, b) => (a.Sequence || 0) - (b.Sequence || 0));
1820
2120
  this.updateUnsavedChangesFlag();
1821
2121
  MJNotificationService.Instance.CreateSimpleNotification('Field added successfully', 'success', 3000);
1822
2122
  }
@@ -1826,10 +2126,14 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1826
2126
  MJNotificationService.Instance.CreateSimpleNotification('Failed to add field', 'error', 3000);
1827
2127
  }
1828
2128
  }
2129
+ /** @deprecated Use {@link AddField}. */
2130
+ async addField() {
2131
+ return this.AddField();
2132
+ }
1829
2133
  /**
1830
2134
  * Delete a field
1831
2135
  */
1832
- async deleteField(field) {
2136
+ async DeleteField(field) {
1833
2137
  if (!(await this.confirmService.ConfirmDelete({ title: 'Delete Field', message: `Delete field "${field.Name}"?` }))) {
1834
2138
  return;
1835
2139
  }
@@ -1838,13 +2142,13 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1838
2142
  const freshField = await md.GetEntityObject('MJ: Query Fields');
1839
2143
  const loaded = await freshField.Load(field.ID);
1840
2144
  if (!loaded) {
1841
- this.queryFields = this.queryFields.filter(f => !UUIDsEqual(f.ID, field.ID));
2145
+ this.QueryFields = this.QueryFields.filter(f => !UUIDsEqual(f.ID, field.ID));
1842
2146
  this.cdr.detectChanges();
1843
2147
  return;
1844
2148
  }
1845
2149
  const deleted = await freshField.Delete();
1846
2150
  if (deleted) {
1847
- this.queryFields = this.queryFields.filter(f => !UUIDsEqual(f.ID, field.ID));
2151
+ this.QueryFields = this.QueryFields.filter(f => !UUIDsEqual(f.ID, field.ID));
1848
2152
  this.updateUnsavedChangesFlag();
1849
2153
  MJNotificationService.Instance.CreateSimpleNotification('Field deleted successfully', 'success', 3000);
1850
2154
  }
@@ -1859,16 +2163,20 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1859
2163
  MJNotificationService.Instance.CreateSimpleNotification('Failed to delete field', 'error', 3000);
1860
2164
  }
1861
2165
  }
2166
+ /** @deprecated Use {@link DeleteField}. */
2167
+ async deleteField(field) {
2168
+ return this.DeleteField(field);
2169
+ }
1862
2170
  /**
1863
2171
  * Add a new entity
1864
2172
  */
1865
- async addEntity() {
2173
+ async AddEntity() {
1866
2174
  try {
1867
2175
  const md = this.ProviderToUse;
1868
2176
  const newEntity = await md.GetEntityObject('MJ: Query Entities');
1869
2177
  newEntity.QueryID = this.record.ID;
1870
2178
  // Add to the list immediately for UI responsiveness
1871
- this.queryEntities.push(newEntity);
2179
+ this.QueryEntities.push(newEntity);
1872
2180
  this.updateUnsavedChangesFlag();
1873
2181
  }
1874
2182
  catch (error) {
@@ -1876,10 +2184,14 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1876
2184
  MJNotificationService.Instance.CreateSimpleNotification('Failed to add entity', 'error', 3000);
1877
2185
  }
1878
2186
  }
2187
+ /** @deprecated Use {@link AddEntity}. */
2188
+ async addEntity() {
2189
+ return this.AddEntity();
2190
+ }
1879
2191
  /**
1880
2192
  * Delete an entity
1881
2193
  */
1882
- async deleteEntity(entity) {
2194
+ async DeleteEntity(entity) {
1883
2195
  if (!(await this.confirmService.ConfirmDelete({ title: 'Delete Entity', message: `Delete entity "${entity.Entity}"?` }))) {
1884
2196
  return;
1885
2197
  }
@@ -1888,13 +2200,13 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1888
2200
  const freshEntity = await md.GetEntityObject('MJ: Query Entities');
1889
2201
  const loaded = await freshEntity.Load(entity.ID);
1890
2202
  if (!loaded) {
1891
- this.queryEntities = this.queryEntities.filter(e => !UUIDsEqual(e.ID, entity.ID));
2203
+ this.QueryEntities = this.QueryEntities.filter(e => !UUIDsEqual(e.ID, entity.ID));
1892
2204
  this.cdr.detectChanges();
1893
2205
  return;
1894
2206
  }
1895
2207
  const deleted = await freshEntity.Delete();
1896
2208
  if (deleted) {
1897
- this.queryEntities = this.queryEntities.filter(e => !UUIDsEqual(e.ID, entity.ID));
2209
+ this.QueryEntities = this.QueryEntities.filter(e => !UUIDsEqual(e.ID, entity.ID));
1898
2210
  this.updateUnsavedChangesFlag();
1899
2211
  MJNotificationService.Instance.CreateSimpleNotification('Entity deleted successfully', 'success', 3000);
1900
2212
  }
@@ -1909,15 +2221,23 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1909
2221
  MJNotificationService.Instance.CreateSimpleNotification('Failed to delete entity', 'error', 3000);
1910
2222
  }
1911
2223
  }
2224
+ /** @deprecated Use {@link DeleteEntity}. */
2225
+ async deleteEntity(entity) {
2226
+ return this.DeleteEntity(entity);
2227
+ }
1912
2228
  /**
1913
2229
  * Get entity options for dropdown
1914
2230
  */
1915
- getEntityOptions() {
2231
+ GetEntityOptions() {
1916
2232
  return this.ProviderToUse.Entities.map(e => ({
1917
2233
  text: e.Name,
1918
2234
  id: e.ID
1919
2235
  })).sort((a, b) => a.text.localeCompare(b.text));
1920
2236
  }
2237
+ /** @deprecated Use {@link GetEntityOptions}. */
2238
+ getEntityOptions() {
2239
+ return this.GetEntityOptions();
2240
+ }
1921
2241
  /**
1922
2242
  * Get the grid edit mode based on component edit mode
1923
2243
  */
@@ -1929,7 +2249,7 @@ let MJQueryFormComponentExtended = class MJQueryFormComponentExtended extends MJ
1929
2249
  i0.ɵɵviewQuery(_c0, 5);
1930
2250
  } if (rf & 2) {
1931
2251
  let _t;
1932
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.sqlEditor = _t.first);
2252
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.SqlEditor = _t.first);
1933
2253
  } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [["form", "ngForm"], ["sqlEditor", ""], [3, "Navigate", "DeleteRequested", "FavoriteToggled", "HistoryRequested", "ListManagementRequested", "Record", "FormComponent", "ToolbarConfig", "IsSaving", "WidthMode"], [1, "record-form", 2, "display", "flex", "flex-direction", "column", "height", "100%", "overflow", "hidden"], [1, "saving-overlay"], [1, "query-header"], [1, "query-header-content"], [1, "query-header-top"], [1, "query-name-section"], [1, "fa-solid", "fa-database", "query-title-icon"], ["name", "queryName", "placeholder", "Enter query name...", 1, "mj-input", "query-name-input", 3, "ngModel"], [1, "query-name-display"], [1, "query-header-actions"], ["mjButton", "", "variant", "primary", "title", "Run Query", 1, "run-query-btn", 3, "disabled"], [1, "query-meta-row"], [1, "query-meta-item"], [1, "meta-label"], [1, "meta-dropdown-row"], [1, "meta-value"], ["name", "status", "TextField", "text", "ValueField", "value", 1, "meta-dropdown", "status-dropdown", 3, "ngModel", "Data", "ValuePrimitive"], [1, "status-pill", 3, "background"], [1, "query-description-row"], ["Variant", "warning"], [1, "query-content"], [1, "query-panel", 3, "ExpandedChange", "Expanded"], ["mjAccordionTitle", ""], [1, "sql-panel-toolbar", 2, "display", "flex", "justify-content", "flex-end", "padding", "4px 0 8px"], ["type", "button", "mjButton", "", "variant", "flat", "title", "Show/hide SQL filters help", 1, "filters-help-btn", 3, "click"], [1, "fa-solid", "fa-question-circle"], [1, "fa-solid", 3, "ngClass"], [1, "sql-panel-content"], [1, "sql-editor", 3, "change", "CompositionTokenClick", "language"], [1, "filters-help"], [1, "query-panel", 3, "Expanded"], [1, "panel-body"], [1, "details-grid"], [1, "detail-item"], [1, "detail-label"], [1, "fa-solid", "fa-puzzle-piece"], [1, "detail-value"], [1, "fa-solid", "fa-bolt"], [1, "fa-solid", "fa-clipboard-list"], [1, "fa-solid", "fa-file-code"], ["name", "usesTemplate", 3, "ngModel"], [1, "fa-solid", "fa-calendar-plus"], [1, "fa-solid", "fa-calendar-check"], [3, "isVisibleChange", "onClose", "query", "parameters", "isVisible"], [1, "fa-solid", "fa-spinner", "fa-spin", "saving-spinner"], ["name", "queryName", "placeholder", "Enter query name...", 1, "mj-input", "query-name-input", 3, "ngModelChange", "ngModel"], ["mjButton", "", "variant", "primary", "title", "Run Query", 1, "run-query-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-play"], [1, "meta-dropdown", 3, "ValueChange", "BranchConfig", "Value", "SelectableTypes", "SelectionMode", "Placeholder", "EnableSearch", "Clearable"], ["mjButton", "", "variant", "icon", "title", "New category", 3, "click"], [1, "fa-solid", "fa-plus"], ["mjButton", "", "variant", "icon", "title", "Edit category"], ["mjButton", "", "variant", "icon", "title", "Edit category", 3, "click"], [1, "fa-solid", "fa-pen"], ["name", "status", "TextField", "text", "ValueField", "value", 1, "meta-dropdown", "status-dropdown", 3, "ngModelChange", "ngModel", "Data", "ValuePrimitive"], [1, "status-pill"], [1, "fa-solid"], ["name", "description", "rows", "2", "placeholder", "Enter query description...", 1, "mj-input", "query-description-input", 3, "ngModel"], [1, "query-description-text"], ["name", "description", "rows", "2", "placeholder", "Enter query description...", 1, "mj-input", "query-description-input", 3, "ngModelChange", "ngModel"], [1, "panel-title-row"], [1, "panel-title"], [1, "fa-solid", "fa-code", "panel-icon", "sql-icon"], [1, "panel-badge", "defined"], [1, "filters-help-title"], [1, "fa-solid", "fa-filter"], [1, "filters-grid"], [1, "filter-card"], [1, "filter-name"], [1, "filter-description"], [1, "filter-syntax"], [1, "filter-notes"], [1, "technical-description-view"], [1, "fa-solid", "fa-book", "panel-icon"], ["name", "technicalDescription", "rows", "8", "placeholder", "Technical documentation of the query logic, performance considerations, and parameter usage. Supports markdown and mermaid diagrams.", 1, "mj-input", "technical-description-textarea", 3, "ngModelChange", "ngModel"], [1, "technical-description-preview"], [1, "preview-label"], [1, "fa-solid", "fa-eye"], [3, "data", "enableMermaid", "enableHighlight", "enableCollapsibleHeadings", "enableSmartypants"], [1, "panel-loading"], [1, "fa-solid", "fa-sliders", "panel-icon"], [1, "panel-badge", "count"], ["text", "Loading parameters..."], ["Icon", "fa-solid fa-sliders", "Title", "No Parameters Defined", "Message", "Add parameters to make your query dynamic and reusable.", "ActionIcon", "fa-solid fa-plus", 3, "ActionText"], ["Icon", "fa-solid fa-sliders", "Title", "No Parameters Defined", "Message", "Add parameters to make your query dynamic and reusable.", "ActionIcon", "fa-solid fa-plus", 3, "Action", "ActionText"], [1, "panel-toolbar"], [1, "card-grid"], [1, "item-card", 3, "required"], ["type", "button", 1, "add-item-btn", 3, "click"], [1, "item-card", 3, "click"], [1, "item-card-header"], [1, "item-name"], [1, "fa-solid", "fa-at", "item-name-icon", "param-icon"], [1, "item-badges"], [1, "item-badge", "required"], [1, "item-card-body"], [1, "item-description"], [1, "item-meta"], [1, "meta-tag"], [1, "item-actions"], [1, "meta-code"], [1, "item-actions", 3, "click"], ["type", "button", "title", "Edit parameter", 1, "item-action-btn", 3, "click"], ["type", "button", "title", "Delete parameter", 1, "item-action-btn", "delete", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "fa-solid", "fa-table", "panel-icon"], ["text", "Loading fields..."], ["Icon", "fa-solid fa-table", "Title", "No Fields Defined", "Message", "Define output fields for your query results.", "ActionIcon", "fa-solid fa-plus", 3, "ActionText"], ["Icon", "fa-solid fa-table", "Title", "No Fields Defined", "Message", "Define output fields for your query results.", "ActionIcon", "fa-solid fa-plus", 3, "Action", "ActionText"], [1, "item-card"], [1, "fa-solid", "fa-columns", "item-name-icon", "field-icon"], [1, "item-badge", "type"], [1, "item-badge", "sequence"], [1, "fa-solid", "fa-code"], [1, "item-card-actions"], ["type", "button", "title", "Delete field", 1, "item-action-btn", "delete", 3, "click"], [1, "dependents-description"], [1, "item-card", "dependent-card"], [1, "fa-solid", "fa-arrow-left", "panel-icon", "dependents-icon"], [1, "item-card", "dependent-card", 3, "click"], [1, "fa-solid", "fa-arrow-left", "item-name-icon", "dependent-query-icon"], [1, "item-card-footer"], [1, "open-link"], [1, "fa-solid", "fa-arrow-up-right-from-square"], [1, "fa-solid", "fa-link"], [1, "fa-solid", "fa-database", "panel-icon"], ["text", "Loading entities..."], ["Icon", "fa-solid fa-database", "Title", "No Entities Tracked", "Message", "Track which entities this query uses for documentation.", "ActionIcon", "fa-solid fa-plus", 3, "ActionText"], ["Icon", "fa-solid fa-database", "Title", "No Entities Tracked", "Message", "Track which entities this query uses for documentation.", "ActionIcon", "fa-solid fa-plus", 3, "Action", "ActionText"], [1, "fa-solid", "fa-table", "item-name-icon", "entity-icon"], [1, "entity-dropdown-wrapper"], ["TextField", "text", "ValueField", "id", "Placeholder", "Select entity...", 1, "entity-dropdown", 3, "ngModelChange", "ngModel", "name", "Data", "ValuePrimitive"], [1, "fa-solid", "fa-database"], ["type", "button", "title", "Delete entity", 1, "item-action-btn", "delete", 3, "click"], [1, "fa-solid", "fa-info-circle", "panel-icon"], ["name", "reusable", 3, "ngModelChange", "ngModel"], [1, "detail-hint"], [1, "detail-tag", "positive"], [1, "detail-tag", "neutral"], [1, "fa-solid", "fa-check"], [1, "fa-solid", "fa-times"], ["name", "cacheEnabled", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-clock"], ["type", "number", "name", "cacheTTLMinutes", "min", "1", "placeholder", "Default", 1, "mj-input", "detail-input-narrow", 3, "ngModelChange", "ngModel"], ["name", "auditQueryRuns", 3, "ngModelChange", "ngModel"], ["name", "usesTemplate", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-star"], [1, "fa-solid", "fa-shield-alt", "panel-icon"], ["text", "Loading permissions..."], ["Icon", "fa-solid fa-shield-halved", "Title", "No Permissions Set", "Message", "This query uses default permissions."], [3, "Params", "NewRecordValues", "AllowLoad", "ShowToolbar"], [1, "permissions-list"], [1, "permission-card"], [1, "fa-solid", "fa-users", "permission-icon"], [1, "permission-info"], [1, "permission-role"], [1, "permission-type"], [1, "permission-badge"]], template: function MJQueryFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
1934
2254
  i0.ɵɵconditionalCreate(0, MJQueryFormComponentExtended_Conditional_0_Template, 88, 38);
1935
2255
  } if (rf & 2) {
@@ -1943,7 +2263,7 @@ export { MJQueryFormComponentExtended };
1943
2263
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJQueryFormComponentExtended, [{
1944
2264
  type: Component,
1945
2265
  args: [{ standalone: false, selector: 'mj-query-form', template: "@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n [ToolbarConfig]=\"ToolbarConfig\"\n [IsSaving]=\"IsSaving\"\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 <!-- Saving Overlay -->\n @if (IsSaving) {\n <div class=\"saving-overlay\">\n <i class=\"fa-solid fa-spinner fa-spin saving-spinner\"></i>\n <span>Saving...</span>\n </div>\n }\n\n <!-- Header Section -->\n <div class=\"query-header\" [class.content-saving]=\"IsSaving\">\n <div class=\"query-header-content\">\n <!-- Top Row: Name and Run Button -->\n <div class=\"query-header-top\">\n <!-- Left: Query Name -->\n <div class=\"query-name-section\">\n <i class=\"fa-solid fa-database query-title-icon\"></i>\n @if (EditMode) {\n <input class=\"mj-input query-name-input\"\n [(ngModel)]=\"record.Name\"\n name=\"queryName\"\n placeholder=\"Enter query name...\" />\n } @else {\n <h4 class=\"query-name-display\">{{ record.Name || 'Untitled Query' }}</h4>\n }\n </div>\n\n <!-- Right: Action Buttons -->\n <div class=\"query-header-actions\">\n @if (record.ID) {\n <button mjButton\n variant=\"primary\"\n [disabled]=\"EditMode || !record.SQL || record.SQL.trim().length === 0\"\n (click)=\"runQuery()\"\n title=\"Run Query\"\n class=\"run-query-btn\">\n <i class=\"fa-solid fa-play\"></i> Run\n </button>\n }\n </div>\n </div>\n\n <!-- Second Row: Category and Status -->\n <div class=\"query-meta-row\">\n <!-- Category -->\n <div class=\"query-meta-item\">\n <label class=\"meta-label\">Category</label>\n @if (EditMode) {\n <div class=\"meta-dropdown-row\">\n <mj-tree-dropdown\n [BranchConfig]=\"CategoryBranchConfig\"\n [Value]=\"CategoryIDAsKey\"\n [SelectableTypes]=\"'branch'\"\n [SelectionMode]=\"'single'\"\n [Placeholder]=\"'Select category...'\"\n [EnableSearch]=\"true\"\n [Clearable]=\"true\"\n (ValueChange)=\"OnCategoryTreeChange($event)\"\n class=\"meta-dropdown\">\n </mj-tree-dropdown>\n <button mjButton variant=\"icon\" title=\"New category\" (click)=\"createCategory()\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n @if (record.CategoryID) {\n <button mjButton variant=\"icon\" title=\"Edit category\" (click)=\"editSelectedCategory()\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n }\n </div>\n } @else {\n <span class=\"meta-value\">{{ categoryPathDisplay || 'Uncategorized' }}</span>\n }\n </div>\n\n <!-- Status -->\n <div class=\"query-meta-item\">\n <label class=\"meta-label\">Status</label>\n @if (EditMode) {\n <mj-dropdown\n [(ngModel)]=\"record.Status\"\n name=\"status\"\n [Data]=\"statusOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n class=\"meta-dropdown status-dropdown\">\n </mj-dropdown>\n } @else {\n <span class=\"status-pill\"\n [style.background]=\"getStatusBadgeColor()\">\n <i class=\"fa-solid\" [class]=\"getStatusBannerIcon()\"></i>\n {{ record.Status || 'Unknown' }}\n </span>\n }\n </div>\n </div>\n\n <!-- Third Row: Description -->\n @if (EditMode || record.Description) {\n <div class=\"query-description-row\">\n @if (EditMode) {\n <textarea class=\"mj-input query-description-input\"\n [(ngModel)]=\"record.Description\"\n name=\"description\"\n rows=\"2\"\n placeholder=\"Enter query description...\">\n </textarea>\n } @else {\n <p class=\"query-description-text\">{{ record.Description }}</p>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Status Warning Banner for Non-Approved Queries -->\n @if (record.Status && record.Status !== 'Approved' && !EditMode) {\n <mj-alert Variant=\"warning\">\n <span>\n This query has status <strong>{{ record.Status }}</strong>. {{ getStatusBannerMessage() }}\n </span>\n </mj-alert>\n }\n\n <!-- Main Content Area with Expansion Panels -->\n <div class=\"query-content\" [class.content-saving]=\"IsSaving\">\n\n <!-- SQL Query Panel -->\n <mj-accordion-panel\n [(Expanded)]=\"sqlPanelExpanded\"\n class=\"query-panel\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title-row\">\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-code panel-icon sql-icon\"></i>\n SQL\n @if (record.SQL) {\n <span class=\"panel-badge defined\">&mdash; Defined</span>\n }\n </span>\n </span>\n </ng-template>\n\n <div class=\"sql-panel-toolbar\" style=\"display: flex; justify-content: flex-end; padding: 4px 0 8px;\">\n <button type=\"button\"\n mjButton\n variant=\"flat\"\n (click)=\"toggleFiltersHelp()\"\n title=\"Show/hide SQL filters help\"\n class=\"filters-help-btn\">\n <i class=\"fa-solid fa-question-circle\"></i>\n <span>Filters Help</span>\n <i class=\"fa-solid\" [ngClass]=\"showFiltersHelp ? 'fa-chevron-up' : 'fa-chevron-down'\"></i>\n </button>\n </div>\n\n <div class=\"sql-panel-content\">\n <!-- Code Editor -->\n <mj-code-editor #sqlEditor\n (change)=\"onSQLChange($event)\"\n (CompositionTokenClick)=\"onCompositionTokenClick($event)\"\n [language]=\"'sql'\"\n class=\"sql-editor\">\n </mj-code-editor>\n\n <!-- SQL Filters Help (Below Editor) -->\n @if (showFiltersHelp) {\n <div class=\"filters-help\">\n <h6 class=\"filters-help-title\">\n <i class=\"fa-solid fa-filter\"></i> Available SQL Filters for Parameterized Queries\n </h6>\n <div class=\"filters-grid\">\n @for (filter of sqlFilters; track filter.name) {\n <div class=\"filter-card\">\n <div class=\"filter-name\">{{ filter.name }}</div>\n <div class=\"filter-description\">{{ filter.description }}</div>\n <div class=\"filter-syntax\">{{ filter.exampleSyntax }}</div>\n @if (filter.notes) {\n <div class=\"filter-notes\">{{ filter.notes }}</div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n </mj-accordion-panel>\n\n <!-- Technical Description Panel -->\n @if (record.TechnicalDescription || EditMode) {\n <mj-accordion-panel\n [(Expanded)]=\"technicalDescriptionPanelExpanded\"\n class=\"query-panel\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-book panel-icon\"></i>\n Technical Description\n @if (record.TechnicalDescription) {\n <span class=\"panel-badge defined\">&mdash; Documented</span>\n }\n </span>\n </ng-template>\n\n <div class=\"panel-body\">\n @if (EditMode) {\n <textarea class=\"mj-input technical-description-textarea\"\n [(ngModel)]=\"record.TechnicalDescription\"\n name=\"technicalDescription\"\n rows=\"8\"\n placeholder=\"Technical documentation of the query logic, performance considerations, and parameter usage. Supports markdown and mermaid diagrams.\">\n </textarea>\n @if (record.TechnicalDescription) {\n <div class=\"technical-description-preview\">\n <div class=\"preview-label\">\n <i class=\"fa-solid fa-eye\"></i> Preview\n </div>\n <mj-markdown\n [data]=\"record.TechnicalDescription || ''\"\n [enableMermaid]=\"true\"\n [enableHighlight]=\"true\"\n [enableCollapsibleHeadings]=\"false\"\n [enableSmartypants]=\"true\">\n </mj-markdown>\n </div>\n }\n } @else {\n <div class=\"technical-description-view\">\n <mj-markdown\n [data]=\"record.TechnicalDescription || ''\"\n [enableMermaid]=\"true\"\n [enableHighlight]=\"true\"\n [enableCollapsibleHeadings]=\"false\"\n [enableSmartypants]=\"true\">\n </mj-markdown>\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Parameters Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [(Expanded)]=\"parametersPanelExpanded\"\n class=\"query-panel\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-sliders panel-icon\"></i>\n Parameters\n @if (queryParameters.length > 0) {\n <span class=\"panel-badge count\">{{ queryParameters.length }}</span>\n }\n </span>\n </ng-template>\n\n <div class=\"panel-body\">\n @if (isLoadingParameters) {\n <div class=\"panel-loading\">\n <mj-loading text=\"Loading parameters...\"></mj-loading>\n </div>\n } @else {\n @if (queryParameters.length === 0) {\n <mj-empty-state Icon=\"fa-solid fa-sliders\"\n Title=\"No Parameters Defined\"\n Message=\"Add parameters to make your query dynamic and reusable.\"\n [ActionText]=\"EditMode ? 'Add First Parameter' : ''\"\n ActionIcon=\"fa-solid fa-plus\"\n (Action)=\"addParameter()\" />\n } @else {\n @if (EditMode) {\n <div class=\"panel-toolbar\">\n <button type=\"button\" class=\"add-item-btn\" (click)=\"addParameter()\">\n <i class=\"fa-solid fa-plus\"></i> Add Parameter\n </button>\n </div>\n }\n <div class=\"card-grid\">\n @for (param of queryParameters; track param.ID || $index) {\n <div class=\"item-card\" [class.required]=\"param.IsRequired\" (click)=\"editParameter(param)\">\n <div class=\"item-card-header\">\n <div class=\"item-name\">\n <i class=\"fa-solid fa-at item-name-icon param-icon\"></i>\n {{ param.Name }}\n </div>\n <div class=\"item-badges\">\n @if (param.IsRequired) {\n <span class=\"item-badge required\">Required</span>\n }\n </div>\n </div>\n <div class=\"item-card-body\">\n @if (param.Description) {\n <div class=\"item-description\">{{ param.Description }}</div>\n }\n <div class=\"item-meta\">\n <span class=\"meta-tag\">\n <strong>Type:</strong> {{ param.Type || 'Text' }}\n </span>\n @if (param.DefaultValue) {\n <span class=\"meta-tag\">\n <strong>Default:</strong>\n <code class=\"meta-code\">{{ param.DefaultValue }}</code>\n </span>\n }\n </div>\n </div>\n @if (EditMode) {\n <div class=\"item-actions\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"item-action-btn\" (click)=\"editParameter(param)\" title=\"Edit parameter\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button type=\"button\" class=\"item-action-btn delete\" (click)=\"deleteParameter(param)\" title=\"Delete parameter\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Query Fields Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [(Expanded)]=\"fieldsPanelExpanded\"\n class=\"query-panel\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-table panel-icon\"></i>\n Fields\n @if (queryFields.length > 0) {\n <span class=\"panel-badge count\">{{ queryFields.length }}</span>\n }\n </span>\n </ng-template>\n\n <div class=\"panel-body\">\n @if (isLoadingFields) {\n <div class=\"panel-loading\">\n <mj-loading text=\"Loading fields...\"></mj-loading>\n </div>\n } @else {\n @if (queryFields.length === 0) {\n <mj-empty-state Icon=\"fa-solid fa-table\"\n Title=\"No Fields Defined\"\n Message=\"Define output fields for your query results.\"\n [ActionText]=\"EditMode ? 'Add First Field' : ''\"\n ActionIcon=\"fa-solid fa-plus\"\n (Action)=\"addField()\" />\n } @else {\n @if (EditMode) {\n <div class=\"panel-toolbar\">\n <button type=\"button\" class=\"add-item-btn\" (click)=\"addField()\">\n <i class=\"fa-solid fa-plus\"></i> Add Field\n </button>\n </div>\n }\n <div class=\"card-grid\">\n @for (field of queryFields; track field.ID) {\n <div class=\"item-card\">\n <div class=\"item-card-header\">\n <div class=\"item-name\">\n <i class=\"fa-solid fa-columns item-name-icon field-icon\"></i>\n {{ field.Name }}\n </div>\n <div class=\"item-badges\">\n <span class=\"item-badge type\">{{ field.SQLBaseType }}</span>\n @if (field.Sequence) {\n <span class=\"item-badge sequence\">#{{ field.Sequence }}</span>\n }\n </div>\n </div>\n <div class=\"item-card-body\">\n @if (field.Description) {\n <div class=\"item-description\">{{ field.Description }}</div>\n }\n <div class=\"item-meta\">\n <span class=\"meta-tag\">\n <i class=\"fa-solid fa-code\"></i> {{ field.SQLFullType || field.SQLBaseType }}\n </span>\n </div>\n </div>\n @if (EditMode) {\n <div class=\"item-card-actions\">\n <button type=\"button\" class=\"item-action-btn delete\" (click)=\"deleteField(field)\" title=\"Delete field\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Dependent Queries Panel -->\n @if (record.IsSaved && DependentQueries.length > 0) {\n <mj-accordion-panel\n [(Expanded)]=\"dependentsPanelExpanded\"\n class=\"query-panel\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-arrow-left panel-icon dependents-icon\"></i>\n Dependent Queries\n <span class=\"panel-badge count\">{{ DependentQueries.length }}</span>\n </span>\n </ng-template>\n\n <div class=\"panel-body\">\n <div class=\"dependents-description\">\n These queries reference this query via <code>{{\"{{query:\\\"...\\\"}}\"}} </code> composition syntax.\n </div>\n <div class=\"card-grid\">\n @for (dep of DependentQueries; track dep.ID) {\n <div class=\"item-card dependent-card\" (click)=\"onDependentQueryClick(dep)\">\n <div class=\"item-card-header\">\n <div class=\"item-name\">\n <i class=\"fa-solid fa-arrow-left item-name-icon dependent-query-icon\"></i>\n {{ dep.Query }}\n </div>\n </div>\n <div class=\"item-card-body\">\n @if (dep.ReferencePath) {\n <div class=\"item-meta\">\n <span class=\"meta-tag\">\n <i class=\"fa-solid fa-link\"></i> {{ dep.ReferencePath }}\n </span>\n </div>\n }\n @if (dep.Alias) {\n <div class=\"item-meta\">\n <span class=\"meta-tag\">\n <strong>Alias:</strong> <code class=\"meta-code\">{{ dep.Alias }}</code>\n </span>\n </div>\n }\n </div>\n <div class=\"item-card-footer\">\n <span class=\"open-link\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Open\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Query Entities Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [(Expanded)]=\"entitiesPanelExpanded\"\n class=\"query-panel\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-database panel-icon\"></i>\n Entities\n @if (queryEntities.length > 0) {\n <span class=\"panel-badge count\">{{ queryEntities.length }}</span>\n }\n </span>\n </ng-template>\n\n <div class=\"panel-body\">\n @if (isLoadingEntities) {\n <div class=\"panel-loading\">\n <mj-loading text=\"Loading entities...\"></mj-loading>\n </div>\n } @else {\n @if (queryEntities.length === 0) {\n <mj-empty-state Icon=\"fa-solid fa-database\"\n Title=\"No Entities Tracked\"\n Message=\"Track which entities this query uses for documentation.\"\n [ActionText]=\"EditMode ? 'Add First Entity' : ''\"\n ActionIcon=\"fa-solid fa-plus\"\n (Action)=\"addEntity()\" />\n } @else {\n @if (EditMode) {\n <div class=\"panel-toolbar\">\n <button type=\"button\" class=\"add-item-btn\" (click)=\"addEntity()\">\n <i class=\"fa-solid fa-plus\"></i> Add Entity\n </button>\n </div>\n }\n <div class=\"card-grid\">\n @for (entity of queryEntities; track entity.ID) {\n <div class=\"item-card\">\n <div class=\"item-card-header\">\n <div class=\"item-name\">\n <i class=\"fa-solid fa-table item-name-icon entity-icon\"></i>\n {{ entity.Entity || 'Select Entity...' }}\n </div>\n @if (EditMode) {\n <div class=\"entity-dropdown-wrapper\">\n <mj-dropdown\n [(ngModel)]=\"entity.EntityID\"\n [name]=\"'entity_' + entity.ID\"\n [Data]=\"getEntityOptions()\"\n TextField=\"text\"\n ValueField=\"id\"\n [ValuePrimitive]=\"true\"\n Placeholder=\"Select entity...\"\n class=\"entity-dropdown\">\n </mj-dropdown>\n </div>\n }\n </div>\n @if (!EditMode && entity.Entity) {\n <div class=\"item-card-body\">\n <div class=\"item-meta\">\n <span class=\"meta-tag\">\n <i class=\"fa-solid fa-database\"></i> Data Source\n </span>\n </div>\n </div>\n }\n @if (EditMode) {\n <div class=\"item-card-actions\">\n <button type=\"button\" class=\"item-action-btn delete\" (click)=\"deleteEntity(entity)\" title=\"Delete entity\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Details Panel -->\n <mj-accordion-panel\n [(Expanded)]=\"detailsPanelExpanded\"\n class=\"query-panel\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-info-circle panel-icon\"></i>\n Details\n </span>\n </ng-template>\n\n <div class=\"panel-body\">\n <div class=\"details-grid\">\n <!-- Reusable -->\n <div class=\"detail-item\">\n <label class=\"detail-label\">\n <i class=\"fa-solid fa-puzzle-piece\"></i> Reusable\n </label>\n @if (EditMode) {\n <mj-switch [(ngModel)]=\"record.Reusable\" name=\"reusable\"></mj-switch>\n <div class=\"detail-hint\">Allow other queries to reference this query using composition syntax</div>\n } @else {\n <div class=\"detail-value\">\n @if (record.Reusable) {\n <span class=\"detail-tag positive\"><i class=\"fa-solid fa-check\"></i> Reusable</span>\n } @else {\n <span class=\"detail-tag neutral\"><i class=\"fa-solid fa-times\"></i> Not Reusable</span>\n }\n </div>\n }\n </div>\n\n <!-- Cache Enabled -->\n <div class=\"detail-item\">\n <label class=\"detail-label\">\n <i class=\"fa-solid fa-bolt\"></i> Cache Enabled\n </label>\n @if (EditMode) {\n <mj-switch [(ngModel)]=\"record.CacheEnabled\" name=\"cacheEnabled\"></mj-switch>\n <div class=\"detail-hint\">Cache query results in memory to reduce database load on repeated runs</div>\n } @else {\n <div class=\"detail-value\">\n @if (record.CacheEnabled) {\n <span class=\"detail-tag positive\"><i class=\"fa-solid fa-check\"></i> Caching On</span>\n } @else {\n <span class=\"detail-tag neutral\"><i class=\"fa-solid fa-times\"></i> Caching Off</span>\n }\n </div>\n }\n </div>\n\n <!-- Cache TTL -->\n @if (record.CacheEnabled) {\n <div class=\"detail-item\">\n <label class=\"detail-label\">\n <i class=\"fa-solid fa-clock\"></i> Cache TTL (Minutes)\n </label>\n @if (EditMode) {\n <input class=\"mj-input detail-input-narrow\"\n type=\"number\"\n [(ngModel)]=\"record.CacheTTLMinutes\"\n name=\"cacheTTLMinutes\"\n min=\"1\"\n placeholder=\"Default\" />\n <div class=\"detail-hint\">How long cached results remain valid. Leave blank for default TTL.</div>\n } @else {\n <div class=\"detail-value\">{{ record.CacheTTLMinutes != null ? record.CacheTTLMinutes + ' min' : 'Default' }}</div>\n }\n </div>\n }\n\n <!-- Audit Query Runs -->\n <div class=\"detail-item\">\n <label class=\"detail-label\">\n <i class=\"fa-solid fa-clipboard-list\"></i> Audit Runs\n </label>\n @if (EditMode) {\n <mj-switch [(ngModel)]=\"record.AuditQueryRuns\" name=\"auditQueryRuns\"></mj-switch>\n <div class=\"detail-hint\">Log all executions of this query to the Audit Log for tracking and compliance</div>\n } @else {\n <div class=\"detail-value\">\n @if (record.AuditQueryRuns) {\n <span class=\"detail-tag positive\"><i class=\"fa-solid fa-check\"></i> Auditing On</span>\n } @else {\n <span class=\"detail-tag neutral\"><i class=\"fa-solid fa-times\"></i> Auditing Off</span>\n }\n </div>\n }\n </div>\n\n <!-- Uses Template -->\n <div class=\"detail-item\">\n <label class=\"detail-label\">\n <i class=\"fa-solid fa-file-code\"></i> Template Usage\n </label>\n @if (EditMode) {\n <mj-switch [(ngModel)]=\"record.UsesTemplate\" name=\"usesTemplate\"></mj-switch>\n } @else {\n <div class=\"detail-value\">\n @if (record.UsesTemplate) {\n <span class=\"detail-tag positive\"><i class=\"fa-solid fa-check\"></i> Uses Templates</span>\n } @else {\n <span class=\"detail-tag neutral\"><i class=\"fa-solid fa-times\"></i> No Templates</span>\n }\n </div>\n }\n </div>\n\n <!-- Created Date -->\n <div class=\"detail-item\">\n <label class=\"detail-label\">\n <i class=\"fa-solid fa-calendar-plus\"></i> Created\n </label>\n <div class=\"detail-value\">{{ formatDate(record.__mj_CreatedAt) }}</div>\n </div>\n\n <!-- Updated Date -->\n <div class=\"detail-item\">\n <label class=\"detail-label\">\n <i class=\"fa-solid fa-calendar-check\"></i> Last Updated\n </label>\n <div class=\"detail-value\">{{ formatDate(record.__mj_UpdatedAt) }}</div>\n </div>\n\n <!-- Quality Rank -->\n @if (record.QualityRank != null) {\n <div class=\"detail-item\">\n <label class=\"detail-label\">\n <i class=\"fa-solid fa-star\"></i> Quality Rank\n </label>\n <div class=\"detail-value\">{{ record.QualityRank }}/10</div>\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n\n <!-- Permissions Panel -->\n @if (record.IsSaved) {\n <mj-accordion-panel\n [(Expanded)]=\"permissionsPanelExpanded\"\n class=\"query-panel\">\n <ng-template mjAccordionTitle>\n <span class=\"panel-title\">\n <i class=\"fa-solid fa-shield-alt panel-icon\"></i>\n Permissions\n </span>\n </ng-template>\n\n <div class=\"panel-body\">\n @if (isLoadingPermissions) {\n <div class=\"panel-loading\">\n <mj-loading text=\"Loading permissions...\"></mj-loading>\n </div>\n } @else {\n @if (queryPermissions.length === 0 && !EditMode) {\n <mj-empty-state Icon=\"fa-solid fa-shield-halved\"\n Title=\"No Permissions Set\"\n Message=\"This query uses default permissions.\" />\n } @else {\n @if (EditMode) {\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Query Permissions','QueryID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Query Permissions')\"\n [AllowLoad]=\"true\"\n [ShowToolbar]=\"false\">\n </mj-explorer-entity-data-grid>\n } @else {\n <div class=\"permissions-list\">\n @for (permission of queryPermissions; track permission.ID) {\n <div class=\"permission-card\">\n <i class=\"fa-solid fa-users permission-icon\"></i>\n <div class=\"permission-info\">\n <div class=\"permission-role\">{{ permission.Role }}</div>\n <div class=\"permission-type\">Role Permission</div>\n </div>\n <span class=\"permission-badge\">\n <i class=\"fa-solid fa-play\"></i> Can Execute\n </span>\n </div>\n }\n </div>\n }\n }\n }\n </div>\n </mj-accordion-panel>\n }\n\n </div>\n </form>\n</mj-record-form-container>\n\n<!-- Query Run Dialog -->\n<mj-query-run-dialog\n [query]=\"record\"\n [parameters]=\"queryParameters\"\n [(isVisible)]=\"showRunDialog\"\n (onClose)=\"onRunDialogClose()\">\n</mj-query-run-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/* Override the shared record-form min-height so flex layout works properly */\n.record-form {\n min-height: 0 !important;\n}\n\n/* ========================================\n Saving Overlay\n ======================================== */\n\n.saving-overlay {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 8px 16px;\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n flex-shrink: 0;\n}\n\n.saving-spinner {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.content-saving {\n pointer-events: none;\n opacity: 0.6;\n}\n\n/* ========================================\n Header Section \u2014 matches Query Browser gradient\n ======================================== */\n\n.query-header {\n flex-shrink: 0;\n background: var(--mj-brand-primary);\n border-bottom: none;\n padding: 0;\n}\n\n.query-header-content {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px 20px;\n}\n\n.query-header-top {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n}\n\n.query-name-section {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.query-title-icon {\n color: rgba(255, 255, 255, 0.85);\n font-size: 1.3em;\n flex-shrink: 0;\n}\n\n.query-name-input {\n font-size: 1.2em;\n font-weight: 600;\n min-width: 300px;\n flex: 1;\n}\n\n.query-name-display {\n margin: 0;\n color: var(--mj-text-inverse, white);\n font-weight: 600;\n font-size: 1.2em;\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.query-header-actions {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.run-query-btn {\n white-space: nowrap;\n}\n\n/* Meta row (category + status) */\n.query-meta-row {\n display: flex;\n gap: 24px;\n align-items: center;\n flex-wrap: wrap;\n}\n\n.query-meta-item {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.meta-label {\n font-weight: 500;\n color: rgba(255, 255, 255, 0.75);\n font-size: var(--mj-text-sm);\n min-width: 60px;\n}\n\n.meta-value {\n color: rgba(255, 255, 255, 0.95);\n font-size: var(--mj-text-sm);\n}\n\n.meta-dropdown {\n min-width: 200px;\n}\n\n.status-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n border-radius: var(--mj-radius-xl);\n color: var(--mj-text-inverse, white);\n font-size: var(--mj-text-sm);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.status-pill i {\n font-size: var(--mj-text-xs);\n}\n\n/* Description row */\n.query-description-row {\n margin-top: 2px;\n}\n\n.query-description-input {\n width: 100%;\n}\n\n.query-description-text {\n margin: 0;\n color: rgba(255, 255, 255, 0.8);\n font-size: var(--mj-text-sm);\n line-height: 1.4;\n}\n\n/* ========================================\n Status Warning Banner\n ======================================== */\n\n\n/* ========================================\n Main Content Area\n ======================================== */\n\n.query-content {\n flex: 1;\n min-height: 0;\n padding: 16px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n}\n\n/* ========================================\n Accordion Panel Overrides \u2014 Modern Style\n ======================================== */\n\n.query-panel {\n margin-bottom: 12px;\n}\n\n::ng-deep .query-content mj-accordion-panel .mj-accordion-panel {\n border: none !important;\n border-radius: var(--mj-radius-md) !important;\n margin-bottom: 12px !important;\n box-shadow: var(--mj-shadow-sm) !important;\n background: var(--mj-bg-surface) !important;\n overflow: hidden !important;\n}\n\n::ng-deep .query-content .mj-accordion-header {\n background: var(--mj-bg-surface) !important;\n border: none !important;\n padding: 14px 18px !important;\n border-radius: var(--mj-radius-md) !important;\n color: var(--mj-text-primary) !important;\n font-weight: 600 !important;\n font-size: var(--mj-text-sm) !important;\n transition: background 0.15s ease !important;\n}\n\n::ng-deep .query-content .mj-accordion-header:hover {\n background: var(--mj-bg-surface-card) !important;\n}\n\n::ng-deep .query-content .mj-accordion-panel--expanded .mj-accordion-header {\n background: var(--mj-brand-primary) !important;\n color: white !important;\n border-radius: var(--mj-radius-md) var(--mj-radius-md) 0 0 !important;\n}\n\n::ng-deep .query-content .mj-accordion-body {\n padding: 0 !important;\n border: none !important;\n background: var(--mj-bg-surface) !important;\n border-radius: 0 0 var(--mj-radius-md) var(--mj-radius-md) !important;\n}\n\n/* ========================================\n Panel Title & Badges\n ======================================== */\n\n.panel-title-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n}\n\n.panel-icon {\n opacity: 0.7;\n}\n\n.sql-icon {\n color: var(--mj-brand-primary);\n}\n\n::ng-deep .mj-accordion-panel--expanded .panel-icon {\n color: rgba(255, 255, 255, 0.85) !important;\n opacity: 1;\n}\n\n.panel-badge {\n padding: 2px 8px;\n border-radius: var(--mj-radius-lg);\n font-size: var(--mj-text-xs);\n font-weight: 600;\n}\n\n.panel-badge.defined {\n background: var(--mj-status-success);\n color: white;\n}\n\n.panel-badge.count {\n background: var(--mj-brand-primary);\n color: white;\n}\n\n::ng-deep .mj-accordion-panel--expanded .panel-badge.count {\n background: rgba(255, 255, 255, 0.25) !important;\n}\n\n::ng-deep .mj-accordion-panel--expanded .panel-badge.defined {\n background: rgba(255, 255, 255, 0.25) !important;\n}\n\n.filters-help-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-right: 8px;\n font-size: var(--mj-text-xs);\n}\n\n/* ========================================\n Panel Body & Loading\n ======================================== */\n\n.panel-body {\n padding: 16px 0;\n}\n\n.panel-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px;\n}\n\n.panel-toolbar {\n display: flex;\n justify-content: flex-end;\n padding: 0 20px 12px;\n}\n\n/* ========================================\n SQL Panel\n ======================================== */\n\n.sql-panel-content {\n display: flex;\n flex-direction: column;\n}\n\n.sql-editor {\n flex: 1;\n height: 400px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n margin: 16px;\n}\n\n/* Filters Help */\n.filters-help {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n padding: 16px;\n margin: 0 16px 16px;\n}\n\n.filters-help-title {\n margin: 0 0 12px 0;\n color: var(--mj-text-primary);\n font-weight: 600;\n font-size: var(--mj-text-sm);\n}\n\n.filters-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 10px;\n}\n\n.filter-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n padding: 12px;\n transition: transform 0.15s ease, box-shadow 0.15s ease;\n}\n\n.filter-card:hover {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-md);\n}\n\n.filter-name {\n font-family: 'Courier New', monospace;\n font-weight: bold;\n color: var(--mj-brand-primary);\n margin-bottom: 4px;\n}\n\n.filter-description {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-secondary);\n margin-bottom: 6px;\n}\n\n.filter-syntax {\n font-family: 'Courier New', monospace;\n font-size: var(--mj-text-xs);\n background: var(--mj-bg-surface-card);\n padding: 6px;\n border-radius: var(--mj-radius-sm);\n margin-bottom: 4px;\n}\n\n.filter-notes {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-disabled);\n font-style: italic;\n}\n\n/* ========================================\n Card Grid (Parameters, Fields, Entities)\n ======================================== */\n\n.card-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));\n gap: 12px;\n padding: 0 20px 20px;\n}\n\n.item-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n padding: 14px;\n transition: all 0.15s ease;\n cursor: pointer;\n position: relative;\n}\n\n.item-card:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.item-card.required {\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.item-card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 10px;\n}\n\n.item-name {\n font-weight: 600;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.item-name-icon {\n font-size: var(--mj-text-sm);\n}\n\n.item-name-icon.param-icon {\n color: var(--mj-brand-primary);\n}\n\n.item-name-icon.field-icon {\n color: var(--mj-brand-primary);\n}\n\n.item-name-icon.entity-icon {\n color: var(--mj-status-success);\n}\n\n.item-badges {\n display: flex;\n gap: 6px;\n}\n\n.item-badge {\n padding: 2px 8px;\n border-radius: var(--mj-radius-lg);\n font-size: var(--mj-text-xs);\n font-weight: 600;\n color: white;\n}\n\n.item-badge.required {\n background: var(--mj-status-warning);\n}\n\n.item-badge.type {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.item-badge.sequence {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: color-mix(in srgb, var(--mj-brand-primary) 80%, purple);\n}\n\n.item-card-body {\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-sm);\n}\n\n.item-description {\n margin-bottom: 8px;\n}\n\n.item-meta {\n display: flex;\n gap: 16px;\n font-size: var(--mj-text-xs);\n}\n\n.meta-tag {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.meta-code {\n background: var(--mj-bg-surface-card);\n padding: 1px 4px;\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-xs);\n}\n\n/* Card actions (edit/delete) */\n.item-actions {\n position: absolute;\n top: 10px;\n right: 10px;\n display: flex;\n gap: 4px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.item-card:hover .item-actions {\n opacity: 1;\n}\n\n.item-card-actions {\n display: flex;\n justify-content: flex-end;\n margin-top: 8px;\n}\n\n.item-action-btn {\n background: none;\n border: none;\n padding: 4px 8px;\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n color: var(--mj-text-disabled);\n transition: all 0.15s ease;\n}\n\n.item-action-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.item-action-btn.delete:hover {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n/* Entity dropdown in card */\n.entity-dropdown-wrapper {\n flex: 1;\n margin-left: 12px;\n}\n\n.entity-dropdown {\n width: 100%;\n}\n\n/* ========================================\n Details Grid\n ======================================== */\n\n.details-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 16px;\n padding: 16px 20px;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.detail-label {\n font-size: var(--mj-text-xs);\n font-weight: 600;\n color: var(--mj-text-disabled);\n display: flex;\n align-items: center;\n gap: 6px;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.detail-value {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n}\n\n.detail-tag {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: var(--mj-text-sm);\n}\n\n.detail-tag.positive {\n color: var(--mj-status-success);\n}\n\n.detail-tag.neutral {\n color: var(--mj-text-disabled);\n}\n\n.detail-hint {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n line-height: 1.4;\n}\n\n.detail-input-narrow {\n max-width: 120px;\n padding: 4px 8px;\n font-size: var(--mj-text-sm);\n}\n\n/* ========================================\n Permissions\n ======================================== */\n\n.permissions-list {\n padding: 0 20px;\n}\n\n.permission-card {\n display: flex;\n align-items: center;\n gap: 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n padding: 14px 16px;\n margin-bottom: 8px;\n}\n\n.permission-icon {\n font-size: 1.3em;\n color: var(--mj-brand-primary);\n}\n\n.permission-info {\n flex: 1;\n}\n\n.permission-role {\n font-weight: 600;\n color: var(--mj-text-primary);\n font-size: var(--mj-text-sm);\n}\n\n.permission-type {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-disabled);\n}\n\n.permission-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n background: var(--mj-brand-primary);\n color: white;\n padding: 4px 10px;\n border-radius: var(--mj-radius-md);\n font-size: var(--mj-text-xs);\n font-weight: 500;\n}\n\n/* ========================================\n Empty State\n ======================================== */\n\n/* ========================================\n Buttons\n ======================================== */\n\n.add-item-btn {\n background: var(--mj-brand-primary);\n color: white;\n border: none;\n padding: 8px 16px;\n border-radius: var(--mj-radius-md);\n cursor: pointer;\n transition: all 0.15s ease;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-weight: 500;\n font-size: var(--mj-text-sm);\n}\n\n.add-item-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 85%, black);\n box-shadow: 0 2px 6px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n/* ========================================\n Badge (reused across components)\n ======================================== */\n\n.badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n/* ========================================\n Technical Description Panel\n ======================================== */\n\n.technical-description-textarea {\n width: 100%;\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n font-size: 13px;\n}\n\n.technical-description-preview {\n margin-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n padding-top: 12px;\n}\n\n.preview-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-muted);\n margin-bottom: 8px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.technical-description-view {\n max-height: 500px;\n overflow-y: auto;\n padding: 12px 16px;\n}\n\n/* Dependent Queries */\n.dependents-icon {\n color: var(--mj-status-warning);\n}\n\n.dependents-description {\n padding: 0 20px 12px;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.dependents-description code {\n background: var(--mj-bg-surface-sunken);\n padding: 1px 5px;\n border-radius: 3px;\n font-size: 12px;\n}\n\n.dependent-card {\n cursor: pointer;\n border-left: 3px solid var(--mj-status-warning) !important;\n}\n\n.dependent-card:hover {\n border-left-color: var(--mj-status-warning-text) !important;\n background: color-mix(in srgb, var(--mj-status-warning) 8%, var(--mj-bg-surface)) !important;\n}\n\n.dependent-query-icon {\n color: var(--mj-status-warning) !important;\n}\n\n.item-card-footer {\n padding-top: 8px;\n border-top: 1px solid var(--mj-bg-surface-sunken);\n margin-top: 8px;\n}\n\n.open-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.dependent-card:hover .open-link {\n color: var(--mj-brand-primary-hover);\n}\n\n/* Category selector row: tree-dropdown + create/edit icon buttons */\n.meta-dropdown-row {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.meta-dropdown-row .meta-dropdown {\n flex: 1;\n min-width: 0;\n}\n"] }]
1946
- }], null, { sqlEditor: [{
2266
+ }], null, { SqlEditor: [{
1947
2267
  type: ViewChild,
1948
2268
  args: ['sqlEditor']
1949
2269
  }] }); })();