@memberjunction/ng-core-entity-forms 6.2.0-edge.4 → 6.2.0-edge.6

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 (248) hide show
  1. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.d.ts +2 -0
  2. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.d.ts.map +1 -1
  3. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js +103 -95
  4. package/dist/lib/custom/AIAgentSessions/ai-agent-session-form.component.js.map +1 -1
  5. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts +13 -0
  6. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  7. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +37 -17
  8. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  9. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts +9 -1
  10. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
  11. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +193 -178
  12. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  13. package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.d.ts +48 -0
  14. package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.d.ts.map +1 -0
  15. package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.js +195 -0
  16. package/dist/lib/custom/AIPromptRuns/prompt-run-data-capture-note.component.js.map +1 -0
  17. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +2 -0
  18. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
  19. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +345 -323
  20. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  21. package/dist/lib/custom/Actions/action-form.component.d.ts +2 -0
  22. package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
  23. package/dist/lib/custom/Actions/action-form.component.js +29 -11
  24. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  25. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts +2 -0
  26. package/dist/lib/custom/EntityActions/entityaction.form.component.d.ts.map +1 -1
  27. package/dist/lib/custom/EntityActions/entityaction.form.component.js +2 -0
  28. package/dist/lib/custom/EntityActions/entityaction.form.component.js.map +1 -1
  29. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts +11 -4
  30. package/dist/lib/custom/MLModels/ml-model-view-models.d.ts.map +1 -1
  31. package/dist/lib/custom/MLModels/ml-model-view-models.js +14 -0
  32. package/dist/lib/custom/MLModels/ml-model-view-models.js.map +1 -1
  33. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts +15 -0
  34. package/dist/lib/custom/MLModels/ps-model-detail.component.d.ts.map +1 -1
  35. package/dist/lib/custom/MLModels/ps-model-detail.component.js +186 -92
  36. package/dist/lib/custom/MLModels/ps-model-detail.component.js.map +1 -1
  37. package/dist/lib/custom/Queries/query-form.component.d.ts +2 -0
  38. package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
  39. package/dist/lib/custom/Queries/query-form.component.js +2 -0
  40. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  41. package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -1
  42. package/dist/lib/custom/RecordProcesses/record-process-form.component.js +6 -3
  43. package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
  44. package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts +3 -3
  45. package/dist/lib/custom/SearchScopes/searchscope-form.component.d.ts.map +1 -1
  46. package/dist/lib/custom/SearchScopes/searchscope-form.component.js +5 -7
  47. package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
  48. package/dist/lib/custom/Templates/templates-form.component.d.ts +19 -1
  49. package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
  50. package/dist/lib/custom/Templates/templates-form.component.js +20 -27
  51. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  52. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
  53. package/dist/lib/custom/Tests/entity-link-pill.component.js +14 -6
  54. package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
  55. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
  56. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +8 -8
  57. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
  58. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts +37 -5
  59. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.d.ts.map +1 -1
  60. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js +155 -79
  61. package/dist/lib/custom/ai-agent-run/ai-agent-run-step-detail.component.js.map +1 -1
  62. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +8 -0
  63. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  64. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +59 -8
  65. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  66. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts +34 -9
  67. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  68. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +281 -150
  69. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  70. package/dist/lib/custom/ai-agent-run/run-tree-timeline-projection.js +3 -1
  71. package/dist/lib/custom/ai-agent-run/run-tree-timeline-projection.js.map +1 -1
  72. package/dist/lib/custom/custom-forms.module.d.ts +82 -80
  73. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  74. package/dist/lib/custom/custom-forms.module.js +10 -0
  75. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  76. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
  77. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +65 -47
  78. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  79. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +17 -17
  80. package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
  81. package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.d.ts.map +1 -1
  82. package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js +64 -24
  83. package/dist/lib/generated/Entities/MJAIAgentRunStep/mjaiagentrunstep.form.component.js.map +1 -1
  84. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js +74 -52
  85. package/dist/lib/generated/Entities/MJAIAgentSession/mjaiagentsession.form.component.js.map +1 -1
  86. package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.d.ts +10 -0
  87. package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.d.ts.map +1 -0
  88. package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.js +86 -0
  89. package/dist/lib/generated/Entities/MJAIAgentSessionRecordingShard/mjaiagentsessionrecordingshard.form.component.js.map +1 -0
  90. package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.d.ts +10 -0
  91. package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.d.ts.map +1 -0
  92. package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.js +132 -0
  93. package/dist/lib/generated/Entities/MJAIAgentUserPolicy/mjaiagentuserpolicy.form.component.js.map +1 -0
  94. package/dist/lib/generated/Entities/MJAIBridgeAgentIdentity/mjaibridgeagentidentity.form.component.js +12 -10
  95. package/dist/lib/generated/Entities/MJAIBridgeAgentIdentity/mjaibridgeagentidentity.form.component.js.map +1 -1
  96. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.d.ts.map +1 -1
  97. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js +86 -32
  98. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
  99. package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.d.ts.map +1 -1
  100. package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.js +25 -7
  101. package/dist/lib/generated/Entities/MJAIPersona/mjaipersona.form.component.js.map +1 -1
  102. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.d.ts.map +1 -1
  103. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js +180 -160
  104. package/dist/lib/generated/Entities/MJAIPrompt/mjaiprompt.form.component.js.map +1 -1
  105. package/dist/lib/generated/Entities/MJActionParam/mjactionparam.form.component.js +16 -14
  106. package/dist/lib/generated/Entities/MJActionParam/mjactionparam.form.component.js.map +1 -1
  107. package/dist/lib/generated/Entities/MJArchiveConfiguration/mjarchiveconfiguration.form.component.js +23 -21
  108. package/dist/lib/generated/Entities/MJArchiveConfiguration/mjarchiveconfiguration.form.component.js.map +1 -1
  109. package/dist/lib/generated/Entities/MJArchiveRun/mjarchiverun.form.component.js +21 -19
  110. package/dist/lib/generated/Entities/MJArchiveRun/mjarchiverun.form.component.js.map +1 -1
  111. package/dist/lib/generated/Entities/MJCalendarEventLink/mjcalendareventlink.form.component.d.ts +10 -0
  112. package/dist/lib/generated/Entities/MJCalendarEventLink/mjcalendareventlink.form.component.d.ts.map +1 -0
  113. package/dist/lib/generated/Entities/MJCalendarEventLink/mjcalendareventlink.form.component.js +74 -0
  114. package/dist/lib/generated/Entities/MJCalendarEventLink/mjcalendareventlink.form.component.js.map +1 -0
  115. package/dist/lib/generated/Entities/MJCalendarSyncState/mjcalendarsyncstate.form.component.d.ts +10 -0
  116. package/dist/lib/generated/Entities/MJCalendarSyncState/mjcalendarsyncstate.form.component.d.ts.map +1 -0
  117. package/dist/lib/generated/Entities/MJCalendarSyncState/mjcalendarsyncstate.form.component.js +64 -0
  118. package/dist/lib/generated/Entities/MJCalendarSyncState/mjcalendarsyncstate.form.component.js.map +1 -0
  119. package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.d.ts.map +1 -1
  120. package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.js +77 -21
  121. package/dist/lib/generated/Entities/MJCommunicationProvider/mjcommunicationprovider.form.component.js.map +1 -1
  122. package/dist/lib/generated/Entities/MJCompanyIntegration/mjcompanyintegration.form.component.d.ts.map +1 -1
  123. package/dist/lib/generated/Entities/MJCompanyIntegration/mjcompanyintegration.form.component.js +28 -10
  124. package/dist/lib/generated/Entities/MJCompanyIntegration/mjcompanyintegration.form.component.js.map +1 -1
  125. package/dist/lib/generated/Entities/MJCompanyIntegrationObject/mjcompanyintegrationobject.form.component.d.ts +10 -0
  126. package/dist/lib/generated/Entities/MJCompanyIntegrationObject/mjcompanyintegrationobject.form.component.d.ts.map +1 -0
  127. package/dist/lib/generated/Entities/MJCompanyIntegrationObject/mjcompanyintegrationobject.form.component.js +189 -0
  128. package/dist/lib/generated/Entities/MJCompanyIntegrationObject/mjcompanyintegrationobject.form.component.js.map +1 -0
  129. package/dist/lib/generated/Entities/MJCompanyIntegrationObjectField/mjcompanyintegrationobjectfield.form.component.d.ts +10 -0
  130. package/dist/lib/generated/Entities/MJCompanyIntegrationObjectField/mjcompanyintegrationobjectfield.form.component.d.ts.map +1 -0
  131. package/dist/lib/generated/Entities/MJCompanyIntegrationObjectField/mjcompanyintegrationobjectfield.form.component.js +116 -0
  132. package/dist/lib/generated/Entities/MJCompanyIntegrationObjectField/mjcompanyintegrationobjectfield.form.component.js.map +1 -0
  133. package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.d.ts.map +1 -1
  134. package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.js +51 -35
  135. package/dist/lib/generated/Entities/MJComponent/mjcomponent.form.component.js.map +1 -1
  136. package/dist/lib/generated/Entities/MJContentFileType/mjcontentfiletype.form.component.d.ts.map +1 -1
  137. package/dist/lib/generated/Entities/MJContentFileType/mjcontentfiletype.form.component.js +36 -18
  138. package/dist/lib/generated/Entities/MJContentFileType/mjcontentfiletype.form.component.js.map +1 -1
  139. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.d.ts.map +1 -1
  140. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js +74 -60
  141. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js.map +1 -1
  142. package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.d.ts.map +1 -1
  143. package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.js +30 -32
  144. package/dist/lib/generated/Entities/MJContentItemChunk/mjcontentitemchunk.form.component.js.map +1 -1
  145. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js +43 -35
  146. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js.map +1 -1
  147. package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js +21 -19
  148. package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js.map +1 -1
  149. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js +69 -75
  150. package/dist/lib/generated/Entities/MJConversationDetail/mjconversationdetail.form.component.js.map +1 -1
  151. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.d.ts.map +1 -1
  152. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js +35 -17
  153. package/dist/lib/generated/Entities/MJCredential/mjcredential.form.component.js.map +1 -1
  154. package/dist/lib/generated/Entities/MJDashboard/mjdashboard.form.component.d.ts.map +1 -1
  155. package/dist/lib/generated/Entities/MJDashboard/mjdashboard.form.component.js +45 -29
  156. package/dist/lib/generated/Entities/MJDashboard/mjdashboard.form.component.js.map +1 -1
  157. package/dist/lib/generated/Entities/MJDuplicateRun/mjduplicaterun.form.component.js +19 -17
  158. package/dist/lib/generated/Entities/MJDuplicateRun/mjduplicaterun.form.component.js.map +1 -1
  159. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  160. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +128 -92
  161. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  162. package/dist/lib/generated/Entities/MJEntityAlternateBaseView/mjentityalternatebaseview.form.component.d.ts +10 -0
  163. package/dist/lib/generated/Entities/MJEntityAlternateBaseView/mjentityalternatebaseview.form.component.d.ts.map +1 -0
  164. package/dist/lib/generated/Entities/MJEntityAlternateBaseView/mjentityalternatebaseview.form.component.js +129 -0
  165. package/dist/lib/generated/Entities/MJEntityAlternateBaseView/mjentityalternatebaseview.form.component.js.map +1 -0
  166. package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.d.ts.map +1 -1
  167. package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js +27 -9
  168. package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js.map +1 -1
  169. package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.d.ts +10 -0
  170. package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.d.ts.map +1 -0
  171. package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.js +130 -0
  172. package/dist/lib/generated/Entities/MJFeaturePipelineVersion/mjfeaturepipelineversion.form.component.js.map +1 -0
  173. package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js +26 -14
  174. package/dist/lib/generated/Entities/MJFeatureValue/mjfeaturevalue.form.component.js.map +1 -1
  175. package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.js +23 -19
  176. package/dist/lib/generated/Entities/MJFeatureValueCache/mjfeaturevaluecache.form.component.js.map +1 -1
  177. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.d.ts.map +1 -1
  178. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js +30 -12
  179. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js.map +1 -1
  180. package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.d.ts.map +1 -1
  181. package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.js +26 -8
  182. package/dist/lib/generated/Entities/MJIntegration/mjintegration.form.component.js.map +1 -1
  183. package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.d.ts.map +1 -1
  184. package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js +24 -6
  185. package/dist/lib/generated/Entities/MJIntegrationObject/mjintegrationobject.form.component.js.map +1 -1
  186. package/dist/lib/generated/Entities/MJIntegrationObjectField/mjintegrationobjectfield.form.component.d.ts.map +1 -1
  187. package/dist/lib/generated/Entities/MJIntegrationObjectField/mjintegrationobjectfield.form.component.js +25 -6
  188. package/dist/lib/generated/Entities/MJIntegrationObjectField/mjintegrationobjectfield.form.component.js.map +1 -1
  189. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js +29 -27
  190. package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js.map +1 -1
  191. package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.js +17 -15
  192. package/dist/lib/generated/Entities/MJProcessRunDetail/mjprocessrundetail.form.component.js.map +1 -1
  193. package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.d.ts.map +1 -1
  194. package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js +73 -59
  195. package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js.map +1 -1
  196. package/dist/lib/generated/Entities/MJQueryEntity/mjqueryentity.form.component.js +10 -8
  197. package/dist/lib/generated/Entities/MJQueryEntity/mjqueryentity.form.component.js.map +1 -1
  198. package/dist/lib/generated/Entities/MJQueryParameter/mjqueryparameter.form.component.d.ts.map +1 -1
  199. package/dist/lib/generated/Entities/MJQueryParameter/mjqueryparameter.form.component.js +12 -4
  200. package/dist/lib/generated/Entities/MJQueryParameter/mjqueryparameter.form.component.js.map +1 -1
  201. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.d.ts.map +1 -1
  202. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js +27 -9
  203. package/dist/lib/generated/Entities/MJRecordProcess/mjrecordprocess.form.component.js.map +1 -1
  204. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.d.ts.map +1 -1
  205. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js +24 -6
  206. package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js.map +1 -1
  207. package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.d.ts.map +1 -1
  208. package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.js +29 -11
  209. package/dist/lib/generated/Entities/MJTestRun/mjtestrun.form.component.js.map +1 -1
  210. package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.d.ts.map +1 -1
  211. package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.js +13 -3
  212. package/dist/lib/generated/Entities/MJTheme/mjtheme.form.component.js.map +1 -1
  213. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  214. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +256 -130
  215. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  216. package/dist/lib/generated/Entities/MJUserRoutine/mjuserroutine.form.component.js +31 -25
  217. package/dist/lib/generated/Entities/MJUserRoutine/mjuserroutine.form.component.js.map +1 -1
  218. package/dist/lib/generated/Entities/MJUserView/mjuserview.form.component.js +50 -38
  219. package/dist/lib/generated/Entities/MJUserView/mjuserview.form.component.js.map +1 -1
  220. package/dist/lib/generated/generated-forms.module.d.ts +446 -438
  221. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  222. package/dist/lib/generated/generated-forms.module.js +24 -0
  223. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  224. package/dist/lib/panels/feature-values/feature-values.logic.d.ts +55 -0
  225. package/dist/lib/panels/feature-values/feature-values.logic.d.ts.map +1 -0
  226. package/dist/lib/panels/feature-values/feature-values.logic.js +88 -0
  227. package/dist/lib/panels/feature-values/feature-values.logic.js.map +1 -0
  228. package/dist/lib/panels/feature-values/feature-values.panel.d.ts +39 -0
  229. package/dist/lib/panels/feature-values/feature-values.panel.d.ts.map +1 -0
  230. package/dist/lib/panels/feature-values/feature-values.panel.js +303 -0
  231. package/dist/lib/panels/feature-values/feature-values.panel.js.map +1 -0
  232. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts +10 -0
  233. package/dist/lib/panels/model-predictions/model-prediction.logic.d.ts.map +1 -1
  234. package/dist/lib/panels/model-predictions/model-prediction.logic.js +15 -1
  235. package/dist/lib/panels/model-predictions/model-prediction.logic.js.map +1 -1
  236. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts +4 -0
  237. package/dist/lib/panels/model-predictions/model-prediction.panel.d.ts.map +1 -1
  238. package/dist/lib/panels/model-predictions/model-prediction.panel.js +77 -61
  239. package/dist/lib/panels/model-predictions/model-prediction.panel.js.map +1 -1
  240. package/dist/lib/shared/components/template-editor.component.d.ts +37 -0
  241. package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
  242. package/dist/lib/shared/components/template-editor.component.js +425 -286
  243. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  244. package/dist/public-api.d.ts +1 -0
  245. package/dist/public-api.d.ts.map +1 -1
  246. package/dist/public-api.js +1 -0
  247. package/dist/public-api.js.map +1 -1
  248. package/package.json +48 -48
@@ -0,0 +1,55 @@
1
+ import type { MJFeatureValueEntity } from '@memberjunction/core-entities';
2
+ /** One row of the `MJ: Feature Values` view as returned by a simple RunView. */
3
+ export interface FeatureValueRow {
4
+ ID: string;
5
+ RecordProcessID: string;
6
+ /** The producing pipeline's display name. */
7
+ RecordProcess: string | null;
8
+ FeatureName: string;
9
+ ValueText: string | null;
10
+ ValueNumeric: number | null;
11
+ ValueBoolean: boolean | number | string | null;
12
+ ValueDate: string | Date | null;
13
+ ValueJSON: string | null;
14
+ Source: MJFeatureValueEntity['Source'];
15
+ Confidence: number | null;
16
+ PipelineVersion: number | null;
17
+ ComputedAt: string | Date | null;
18
+ Reasoning: string | null;
19
+ ProcessRunID: string | null;
20
+ }
21
+ /** The latest value of one feature from one pipeline, ready to render. */
22
+ export interface FeatureValueCard {
23
+ Key: string;
24
+ Pipeline: string;
25
+ RecordProcessID: string;
26
+ FeatureName: string;
27
+ /** The value to show; "no value" when the pipeline's latest answer withheld or cleared the value. */
28
+ DisplayValue: string;
29
+ /** False when the latest row is valueless (an abstention or a cleared value). */
30
+ HasValue: boolean;
31
+ Source: MJFeatureValueEntity['Source'];
32
+ Confidence: number | null;
33
+ PipelineVersion: number | null;
34
+ ComputedAt: Date | null;
35
+ Reasoning: string | null;
36
+ RowID: string;
37
+ }
38
+ export declare class FeatureValuesPanelModel {
39
+ /** Human-readable value: number, Yes/No, ISO date part, compact JSON, or text. Empty when valueless. */
40
+ static DisplayValue(row: FeatureValueRow): string;
41
+ /** A row's display value; "no value" for a valueless row (an abstention or a cleared value). */
42
+ static HistoryValue(row: FeatureValueRow): string;
43
+ private static hasValue;
44
+ /**
45
+ * Newest row per (RecordProcessID, FeatureName), valued or not. A valueless row is the
46
+ * pipeline's latest answer too — it withheld (below its confidence floor, or the input no
47
+ * longer states the fact) or a person cleared the value — so it supersedes an older value
48
+ * rather than letting that value stand as if it were current. The card then reads
49
+ * "no value" and carries the row's reasoning and confidence.
50
+ */
51
+ static Latest(rows: FeatureValueRow[]): FeatureValueCard[];
52
+ /** Other rows for the card's pipeline+feature, newest first, excluding the card's own row. */
53
+ static History(rows: FeatureValueRow[], card: FeatureValueCard): FeatureValueRow[];
54
+ }
55
+ //# sourceMappingURL=feature-values.logic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-values.logic.d.ts","sourceRoot":"","sources":["../../../../src/lib/panels/feature-values/feature-values.logic.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAE1E,gFAAgF;AAChF,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/C,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACvC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,qGAAqG;IACrG,YAAY,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACvC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACjB;AAqBD,qBAAa,uBAAuB;IAChC,wGAAwG;WAC1F,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM;IAkBxD,gGAAgG;WAClF,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM;IAIxD,OAAO,CAAC,MAAM,CAAC,QAAQ;IAKvB;;;;;;OAMG;WACW,MAAM,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,gBAAgB,EAAE;IAuBjE,8FAA8F;WAChF,OAAO,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,gBAAgB,GAAG,eAAe,EAAE;CAK5F"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Pure logic for the generic Feature Values panel. No Angular imports so it is
3
+ * unit-testable in isolation.
4
+ */
5
+ import { SafeJSONParse, UUIDsEqual } from '@memberjunction/global';
6
+ /** True for null and undefined alike. `unknown` because a view row's column may be absent as well as null. */
7
+ function isNullish(value) {
8
+ return value === null || value === undefined;
9
+ }
10
+ function toDate(value) {
11
+ if (isNullish(value))
12
+ return null;
13
+ const d = value instanceof Date ? value : new Date(value);
14
+ return Number.isNaN(d.getTime()) ? null : d;
15
+ }
16
+ function time(row) {
17
+ return toDate(row.ComputedAt)?.getTime() ?? 0;
18
+ }
19
+ function keyOf(recordProcessID, featureName) {
20
+ return `${recordProcessID}|${featureName}`;
21
+ }
22
+ export class FeatureValuesPanelModel {
23
+ /** Human-readable value: number, Yes/No, ISO date part, compact JSON, or text. Empty when valueless. */
24
+ static DisplayValue(row) {
25
+ if (!isNullish(row.ValueNumeric))
26
+ return String(row.ValueNumeric);
27
+ if (!isNullish(row.ValueBoolean)) {
28
+ const v = row.ValueBoolean;
29
+ return v === true || v === 1 || v === '1' ? 'Yes' : 'No';
30
+ }
31
+ if (!isNullish(row.ValueDate)) {
32
+ const d = toDate(row.ValueDate);
33
+ return d ? d.toISOString().slice(0, 10) : String(row.ValueDate);
34
+ }
35
+ if (!isNullish(row.ValueJSON) && row.ValueJSON !== '') {
36
+ const parsed = SafeJSONParse(row.ValueJSON);
37
+ return parsed !== null ? JSON.stringify(parsed) : row.ValueJSON;
38
+ }
39
+ if (!isNullish(row.ValueText))
40
+ return row.ValueText;
41
+ return '';
42
+ }
43
+ /** A row's display value; "no value" for a valueless row (an abstention or a cleared value). */
44
+ static HistoryValue(row) {
45
+ return FeatureValuesPanelModel.hasValue(row) ? FeatureValuesPanelModel.DisplayValue(row) : 'no value';
46
+ }
47
+ static hasValue(row) {
48
+ return !isNullish(row.ValueNumeric) || !isNullish(row.ValueBoolean) || !isNullish(row.ValueDate)
49
+ || (!isNullish(row.ValueJSON) && row.ValueJSON !== '') || !isNullish(row.ValueText);
50
+ }
51
+ /**
52
+ * Newest row per (RecordProcessID, FeatureName), valued or not. A valueless row is the
53
+ * pipeline's latest answer too — it withheld (below its confidence floor, or the input no
54
+ * longer states the fact) or a person cleared the value — so it supersedes an older value
55
+ * rather than letting that value stand as if it were current. The card then reads
56
+ * "no value" and carries the row's reasoning and confidence.
57
+ */
58
+ static Latest(rows) {
59
+ const best = new Map();
60
+ for (const row of rows) {
61
+ const key = keyOf(row.RecordProcessID, row.FeatureName);
62
+ const current = best.get(key);
63
+ if (!current || time(row) > time(current))
64
+ best.set(key, row);
65
+ }
66
+ return [...best.entries()].map(([key, row]) => ({
67
+ Key: key,
68
+ Pipeline: row.RecordProcess ?? '',
69
+ RecordProcessID: row.RecordProcessID,
70
+ FeatureName: row.FeatureName,
71
+ DisplayValue: FeatureValuesPanelModel.HistoryValue(row),
72
+ HasValue: FeatureValuesPanelModel.hasValue(row),
73
+ Source: row.Source,
74
+ Confidence: row.Confidence,
75
+ PipelineVersion: row.PipelineVersion,
76
+ ComputedAt: toDate(row.ComputedAt),
77
+ Reasoning: row.Reasoning,
78
+ RowID: row.ID,
79
+ }));
80
+ }
81
+ /** Other rows for the card's pipeline+feature, newest first, excluding the card's own row. */
82
+ static History(rows, card) {
83
+ return rows
84
+ .filter(r => !UUIDsEqual(r.ID, card.RowID) && keyOf(r.RecordProcessID, r.FeatureName) === card.Key)
85
+ .sort((a, b) => time(b) - time(a));
86
+ }
87
+ }
88
+ //# sourceMappingURL=feature-values.logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-values.logic.js","sourceRoot":"","sources":["../../../../src/lib/panels/feature-values/feature-values.logic.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure logic for the generic Feature Values panel. No Angular imports so it is\n * unit-testable in isolation.\n */\nimport { SafeJSONParse, UUIDsEqual } from '@memberjunction/global';\nimport type { MJFeatureValueEntity } from '@memberjunction/core-entities';\n\n/** One row of the `MJ: Feature Values` view as returned by a simple RunView. */\nexport interface FeatureValueRow {\n ID: string;\n RecordProcessID: string;\n /** The producing pipeline's display name. */\n RecordProcess: string | null;\n FeatureName: string;\n ValueText: string | null;\n ValueNumeric: number | null;\n ValueBoolean: boolean | number | string | null;\n ValueDate: string | Date | null;\n ValueJSON: string | null;\n Source: MJFeatureValueEntity['Source'];\n Confidence: number | null;\n PipelineVersion: number | null;\n ComputedAt: string | Date | null;\n Reasoning: string | null;\n ProcessRunID: string | null;\n}\n\n/** The latest value of one feature from one pipeline, ready to render. */\nexport interface FeatureValueCard {\n Key: string;\n Pipeline: string;\n RecordProcessID: string;\n FeatureName: string;\n /** The value to show; \"no value\" when the pipeline's latest answer withheld or cleared the value. */\n DisplayValue: string;\n /** False when the latest row is valueless (an abstention or a cleared value). */\n HasValue: boolean;\n Source: MJFeatureValueEntity['Source'];\n Confidence: number | null;\n PipelineVersion: number | null;\n ComputedAt: Date | null;\n Reasoning: string | null;\n RowID: string;\n}\n\n/** True for null and undefined alike. `unknown` because a view row's column may be absent as well as null. */\nfunction isNullish(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\nfunction toDate(value: string | Date | null | undefined): Date | null {\n if (isNullish(value)) return null;\n const d = value instanceof Date ? value : new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\nfunction time(row: FeatureValueRow): number {\n return toDate(row.ComputedAt)?.getTime() ?? 0;\n}\n\nfunction keyOf(recordProcessID: string, featureName: string): string {\n return `${recordProcessID}|${featureName}`;\n}\n\nexport class FeatureValuesPanelModel {\n /** Human-readable value: number, Yes/No, ISO date part, compact JSON, or text. Empty when valueless. */\n public static DisplayValue(row: FeatureValueRow): string {\n if (!isNullish(row.ValueNumeric)) return String(row.ValueNumeric);\n if (!isNullish(row.ValueBoolean)) {\n const v: boolean | number | string = row.ValueBoolean;\n return v === true || v === 1 || v === '1' ? 'Yes' : 'No';\n }\n if (!isNullish(row.ValueDate)) {\n const d = toDate(row.ValueDate);\n return d ? d.toISOString().slice(0, 10) : String(row.ValueDate);\n }\n if (!isNullish(row.ValueJSON) && row.ValueJSON !== '') {\n const parsed = SafeJSONParse<unknown>(row.ValueJSON);\n return parsed !== null ? JSON.stringify(parsed) : row.ValueJSON;\n }\n if (!isNullish(row.ValueText)) return row.ValueText;\n return '';\n }\n\n /** A row's display value; \"no value\" for a valueless row (an abstention or a cleared value). */\n public static HistoryValue(row: FeatureValueRow): string {\n return FeatureValuesPanelModel.hasValue(row) ? FeatureValuesPanelModel.DisplayValue(row) : 'no value';\n }\n\n private static hasValue(row: FeatureValueRow): boolean {\n return !isNullish(row.ValueNumeric) || !isNullish(row.ValueBoolean) || !isNullish(row.ValueDate)\n || (!isNullish(row.ValueJSON) && row.ValueJSON !== '') || !isNullish(row.ValueText);\n }\n\n /**\n * Newest row per (RecordProcessID, FeatureName), valued or not. A valueless row is the\n * pipeline's latest answer too — it withheld (below its confidence floor, or the input no\n * longer states the fact) or a person cleared the value — so it supersedes an older value\n * rather than letting that value stand as if it were current. The card then reads\n * \"no value\" and carries the row's reasoning and confidence.\n */\n public static Latest(rows: FeatureValueRow[]): FeatureValueCard[] {\n const best = new Map<string, FeatureValueRow>();\n for (const row of rows) {\n const key = keyOf(row.RecordProcessID, row.FeatureName);\n const current = best.get(key);\n if (!current || time(row) > time(current)) best.set(key, row);\n }\n return [...best.entries()].map(([key, row]) => ({\n Key: key,\n Pipeline: row.RecordProcess ?? '',\n RecordProcessID: row.RecordProcessID,\n FeatureName: row.FeatureName,\n DisplayValue: FeatureValuesPanelModel.HistoryValue(row),\n HasValue: FeatureValuesPanelModel.hasValue(row),\n Source: row.Source,\n Confidence: row.Confidence,\n PipelineVersion: row.PipelineVersion,\n ComputedAt: toDate(row.ComputedAt),\n Reasoning: row.Reasoning,\n RowID: row.ID,\n }));\n }\n\n /** Other rows for the card's pipeline+feature, newest first, excluding the card's own row. */\n public static History(rows: FeatureValueRow[], card: FeatureValueCard): FeatureValueRow[] {\n return rows\n .filter(r => !UUIDsEqual(r.ID, card.RowID) && keyOf(r.RecordProcessID, r.FeatureName) === card.Key)\n .sort((a, b) => time(b) - time(a));\n }\n}\n"]}
@@ -0,0 +1,39 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { BaseFormPanel } from '@memberjunction/ng-base-forms';
3
+ import { FeatureValueCard, FeatureValueRow } from './feature-values.logic';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Entity-agnostic, read-only Feature Values panel. Shows the latest value of every
7
+ * feature that any pipeline has materialized for the current record, with an
8
+ * expander for reasoning and value history. Renders nothing when there are no rows.
9
+ */
10
+ export declare class FeatureValuesPanel extends BaseFormPanel implements OnInit {
11
+ private cdr;
12
+ /** Latest card per pipeline+feature. */
13
+ Cards: FeatureValueCard[];
14
+ /** True once the load has completed (success, empty or skipped). */
15
+ Loaded: boolean;
16
+ /** Key of the card whose detail/history is expanded. */
17
+ ExpandedKey: string | null;
18
+ /** The expanded card's older values, newest first; computed when the card is toggled or the rows reload, not per binding. */
19
+ ExpandedHistory: FeatureValueRow[];
20
+ private rows;
21
+ /** Sequence number of the latest load; an older load's answer is dropped. */
22
+ private loadSequence;
23
+ ngOnInit(): Promise<void>;
24
+ /** Reload when the parent form reloads the record, so stale rows never show. */
25
+ OnRecordRefreshed(): void;
26
+ /** Reload the feature values for the current record (one RunView); a load overtaken by a later one is dropped. */
27
+ Refresh(): Promise<void>;
28
+ /** Expand/collapse a card's reasoning + history. */
29
+ Toggle(card: FeatureValueCard): void;
30
+ /** Recomputes the expanded card's history from the current rows; collapses when that card is no longer shown. */
31
+ private syncExpandedHistory;
32
+ /** Display string for a history row ("no value" for a valueless one). */
33
+ ValueOf(row: FeatureValueRow): string;
34
+ private runView;
35
+ private contextUser;
36
+ static ɵfac: i0.ɵɵFactoryDeclaration<FeatureValuesPanel, never>;
37
+ static ɵcmp: i0.ɵɵComponentDeclaration<FeatureValuesPanel, "mj-feature-values-panel", never, {}, {}, never, never, false, never>;
38
+ }
39
+ //# sourceMappingURL=feature-values.panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-values.panel.d.ts","sourceRoot":"","sources":["../../../../src/lib/panels/feature-values/feature-values.panel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,MAAM,EAAU,MAAM,eAAe,CAAC;AAE7E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAA2B,MAAM,wBAAwB,CAAC;;AAEpG;;;;GAIG;AACH,qBAea,kBAAmB,SAAQ,aAAc,YAAW,MAAM;IACnE,OAAO,CAAC,GAAG,CAA6B;IAExC,wCAAwC;IACjC,KAAK,EAAE,gBAAgB,EAAE,CAAM;IACtC,oEAAoE;IAC7D,MAAM,UAAS;IACtB,wDAAwD;IACjD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IACzC,6HAA6H;IACtH,eAAe,EAAE,eAAe,EAAE,CAAM;IAE/C,OAAO,CAAC,IAAI,CAAyB;IACrC,6EAA6E;IAC7E,OAAO,CAAC,YAAY,CAAK;IAEZ,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC,gFAAgF;IAChE,iBAAiB,IAAI,IAAI;IAIzC,kHAAkH;IACrG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmDrC,oDAAoD;IAC7C,MAAM,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAK3C,iHAAiH;IACjH,OAAO,CAAC,mBAAmB;IAM3B,yEAAyE;IAClE,OAAO,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM;IAI5C,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,WAAW;yCApGV,kBAAkB;2CAAlB,kBAAkB;CAuG9B"}
@@ -0,0 +1,303 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { ChangeDetectorRef, Component, inject } from '@angular/core';
8
+ import { EscapeSQLString, RegisterClassEx } from '@memberjunction/global';
9
+ import { BaseFormPanel } from '@memberjunction/ng-base-forms';
10
+ import { LogError, Metadata, RunView } from '@memberjunction/core';
11
+ import { FeatureValuesPanelModel } from './feature-values.logic';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@memberjunction/ng-ui-components";
14
+ import * as i2 from "@memberjunction/ng-base-forms";
15
+ import * as i3 from "@angular/common";
16
+ const _forTrack0 = ($index, $item) => $item.Key;
17
+ const _forTrack1 = ($index, $item) => $item.ID;
18
+ function FeatureValuesPanel_Conditional_0_For_21_Conditional_7_Template(rf, ctx) { if (rf & 1) {
19
+ i0.ɵɵelementStart(0, "span", 8);
20
+ i0.ɵɵtext(1);
21
+ i0.ɵɵelementEnd();
22
+ } if (rf & 2) {
23
+ const card_r4 = i0.ɵɵnextContext().$implicit;
24
+ i0.ɵɵadvance();
25
+ i0.ɵɵtextInterpolate1(" v", card_r4.PipelineVersion);
26
+ } }
27
+ function FeatureValuesPanel_Conditional_0_For_21_Conditional_10_Template(rf, ctx) { if (rf & 1) {
28
+ i0.ɵɵelementStart(0, "span", 8);
29
+ i0.ɵɵtext(1);
30
+ i0.ɵɵelementEnd();
31
+ } if (rf & 2) {
32
+ const card_r4 = i0.ɵɵnextContext().$implicit;
33
+ i0.ɵɵadvance();
34
+ i0.ɵɵtextInterpolate1(" (", card_r4.Confidence, ")");
35
+ } }
36
+ function FeatureValuesPanel_Conditional_0_For_21_Conditional_17_Conditional_2_Template(rf, ctx) { if (rf & 1) {
37
+ i0.ɵɵelementStart(0, "div", 13);
38
+ i0.ɵɵtext(1);
39
+ i0.ɵɵelementEnd();
40
+ } if (rf & 2) {
41
+ const card_r4 = i0.ɵɵnextContext(2).$implicit;
42
+ i0.ɵɵadvance();
43
+ i0.ɵɵtextInterpolate(card_r4.Reasoning);
44
+ } }
45
+ function FeatureValuesPanel_Conditional_0_For_21_Conditional_17_Conditional_5_Template(rf, ctx) { if (rf & 1) {
46
+ i0.ɵɵelementStart(0, "div", 15);
47
+ i0.ɵɵtext(1, "No earlier values.");
48
+ i0.ɵɵelementEnd();
49
+ } }
50
+ function FeatureValuesPanel_Conditional_0_For_21_Conditional_17_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
51
+ i0.ɵɵelementStart(0, "li", 17)(1, "span", 7);
52
+ i0.ɵɵtext(2);
53
+ i0.ɵɵelementEnd();
54
+ i0.ɵɵelementStart(3, "span", 8);
55
+ i0.ɵɵtext(4);
56
+ i0.ɵɵpipe(5, "date");
57
+ i0.ɵɵelementEnd()();
58
+ } if (rf & 2) {
59
+ const h_r5 = ctx.$implicit;
60
+ const ctx_r1 = i0.ɵɵnextContext(5);
61
+ i0.ɵɵadvance(2);
62
+ i0.ɵɵtextInterpolate(ctx_r1.ValueOf(h_r5));
63
+ i0.ɵɵadvance(2);
64
+ i0.ɵɵtextInterpolate(h_r5.ComputedAt ? i0.ɵɵpipeBind2(5, 2, h_r5.ComputedAt, "yyyy-MM-dd HH:mm") : "");
65
+ } }
66
+ function FeatureValuesPanel_Conditional_0_For_21_Conditional_17_Conditional_6_Template(rf, ctx) { if (rf & 1) {
67
+ i0.ɵɵelementStart(0, "ul", 16);
68
+ i0.ɵɵrepeaterCreate(1, FeatureValuesPanel_Conditional_0_For_21_Conditional_17_Conditional_6_For_2_Template, 6, 5, "li", 17, _forTrack1);
69
+ i0.ɵɵelementEnd();
70
+ } if (rf & 2) {
71
+ const ctx_r1 = i0.ɵɵnextContext(4);
72
+ i0.ɵɵadvance();
73
+ i0.ɵɵrepeater(ctx_r1.ExpandedHistory);
74
+ } }
75
+ function FeatureValuesPanel_Conditional_0_For_21_Conditional_17_Template(rf, ctx) { if (rf & 1) {
76
+ i0.ɵɵelementStart(0, "tr", 11)(1, "td", 12);
77
+ i0.ɵɵconditionalCreate(2, FeatureValuesPanel_Conditional_0_For_21_Conditional_17_Conditional_2_Template, 2, 1, "div", 13);
78
+ i0.ɵɵelementStart(3, "div", 14);
79
+ i0.ɵɵtext(4, "History");
80
+ i0.ɵɵelementEnd();
81
+ i0.ɵɵconditionalCreate(5, FeatureValuesPanel_Conditional_0_For_21_Conditional_17_Conditional_5_Template, 2, 0, "div", 15)(6, FeatureValuesPanel_Conditional_0_For_21_Conditional_17_Conditional_6_Template, 3, 0, "ul", 16);
82
+ i0.ɵɵelementEnd()();
83
+ } if (rf & 2) {
84
+ const card_r4 = i0.ɵɵnextContext().$implicit;
85
+ const ctx_r1 = i0.ɵɵnextContext(2);
86
+ i0.ɵɵadvance(2);
87
+ i0.ɵɵconditional(card_r4.Reasoning ? 2 : -1);
88
+ i0.ɵɵadvance(3);
89
+ i0.ɵɵconditional(ctx_r1.ExpandedHistory.length === 0 ? 5 : 6);
90
+ } }
91
+ function FeatureValuesPanel_Conditional_0_For_21_Template(rf, ctx) { if (rf & 1) {
92
+ const _r3 = i0.ɵɵgetCurrentView();
93
+ i0.ɵɵelementStart(0, "tr", 5)(1, "td", 6);
94
+ i0.ɵɵtext(2);
95
+ i0.ɵɵelementEnd();
96
+ i0.ɵɵelementStart(3, "td", 7);
97
+ i0.ɵɵtext(4);
98
+ i0.ɵɵelementEnd();
99
+ i0.ɵɵelementStart(5, "td");
100
+ i0.ɵɵtext(6);
101
+ i0.ɵɵconditionalCreate(7, FeatureValuesPanel_Conditional_0_For_21_Conditional_7_Template, 2, 1, "span", 8);
102
+ i0.ɵɵelementEnd();
103
+ i0.ɵɵelementStart(8, "td");
104
+ i0.ɵɵtext(9);
105
+ i0.ɵɵconditionalCreate(10, FeatureValuesPanel_Conditional_0_For_21_Conditional_10_Template, 2, 1, "span", 8);
106
+ i0.ɵɵelementEnd();
107
+ i0.ɵɵelementStart(11, "td", 8);
108
+ i0.ɵɵtext(12);
109
+ i0.ɵɵpipe(13, "date");
110
+ i0.ɵɵelementEnd();
111
+ i0.ɵɵelementStart(14, "td")(15, "button", 9);
112
+ i0.ɵɵlistener("click", function FeatureValuesPanel_Conditional_0_For_21_Template_button_click_15_listener() { const card_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.Toggle(card_r4)); });
113
+ i0.ɵɵelement(16, "i", 10);
114
+ i0.ɵɵelementEnd()()();
115
+ i0.ɵɵconditionalCreate(17, FeatureValuesPanel_Conditional_0_For_21_Conditional_17_Template, 7, 2, "tr", 11);
116
+ } if (rf & 2) {
117
+ const card_r4 = ctx.$implicit;
118
+ const ctx_r1 = i0.ɵɵnextContext(2);
119
+ i0.ɵɵadvance(2);
120
+ i0.ɵɵtextInterpolate(card_r4.FeatureName);
121
+ i0.ɵɵadvance();
122
+ i0.ɵɵclassProp("fvp-value--none", !card_r4.HasValue);
123
+ i0.ɵɵadvance();
124
+ i0.ɵɵtextInterpolate(card_r4.DisplayValue);
125
+ i0.ɵɵadvance(2);
126
+ i0.ɵɵtextInterpolate(card_r4.Pipeline);
127
+ i0.ɵɵadvance();
128
+ i0.ɵɵconditional(card_r4.PipelineVersion !== null ? 7 : -1);
129
+ i0.ɵɵadvance(2);
130
+ i0.ɵɵtextInterpolate(card_r4.Source);
131
+ i0.ɵɵadvance();
132
+ i0.ɵɵconditional(card_r4.Confidence !== null ? 10 : -1);
133
+ i0.ɵɵadvance(2);
134
+ i0.ɵɵtextInterpolate(card_r4.ComputedAt ? i0.ɵɵpipeBind2(13, 15, card_r4.ComputedAt, "yyyy-MM-dd HH:mm") : "");
135
+ i0.ɵɵadvance(3);
136
+ i0.ɵɵattribute("aria-expanded", ctx_r1.ExpandedKey === card_r4.Key);
137
+ i0.ɵɵadvance();
138
+ i0.ɵɵclassProp("fa-chevron-down", ctx_r1.ExpandedKey !== card_r4.Key)("fa-chevron-up", ctx_r1.ExpandedKey === card_r4.Key);
139
+ i0.ɵɵadvance();
140
+ i0.ɵɵconditional(ctx_r1.ExpandedKey === card_r4.Key ? 17 : -1);
141
+ } }
142
+ function FeatureValuesPanel_Conditional_0_Template(rf, ctx) { if (rf & 1) {
143
+ const _r1 = i0.ɵɵgetCurrentView();
144
+ i0.ɵɵelementStart(0, "mj-collapsible-panel", 0)(1, "div", 1)(2, "button", 2);
145
+ i0.ɵɵlistener("click", function FeatureValuesPanel_Conditional_0_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.Refresh()); });
146
+ i0.ɵɵelement(3, "i", 3);
147
+ i0.ɵɵtext(4, " Refresh ");
148
+ i0.ɵɵelementEnd()();
149
+ i0.ɵɵelementStart(5, "table", 4)(6, "thead")(7, "tr")(8, "th");
150
+ i0.ɵɵtext(9, "Feature");
151
+ i0.ɵɵelementEnd();
152
+ i0.ɵɵelementStart(10, "th");
153
+ i0.ɵɵtext(11, "Value");
154
+ i0.ɵɵelementEnd();
155
+ i0.ɵɵelementStart(12, "th");
156
+ i0.ɵɵtext(13, "Pipeline");
157
+ i0.ɵɵelementEnd();
158
+ i0.ɵɵelementStart(14, "th");
159
+ i0.ɵɵtext(15, "Source");
160
+ i0.ɵɵelementEnd();
161
+ i0.ɵɵelementStart(16, "th");
162
+ i0.ɵɵtext(17, "Computed");
163
+ i0.ɵɵelementEnd();
164
+ i0.ɵɵelement(18, "th");
165
+ i0.ɵɵelementEnd()();
166
+ i0.ɵɵelementStart(19, "tbody");
167
+ i0.ɵɵrepeaterCreate(20, FeatureValuesPanel_Conditional_0_For_21_Template, 18, 18, null, null, _forTrack0);
168
+ i0.ɵɵelementEnd()()();
169
+ } if (rf & 2) {
170
+ const ctx_r1 = i0.ɵɵnextContext();
171
+ i0.ɵɵproperty("Order", ctx_r1.DisplayOrder)("Form", ctx_r1.FormComponent)("FormContext", ctx_r1.FormContext)("BadgeCount", ctx_r1.Cards.length);
172
+ i0.ɵɵadvance(2);
173
+ i0.ɵɵproperty("disabled", !ctx_r1.Loaded);
174
+ i0.ɵɵadvance();
175
+ i0.ɵɵclassProp("fa-spin", !ctx_r1.Loaded);
176
+ i0.ɵɵadvance(17);
177
+ i0.ɵɵrepeater(ctx_r1.Cards);
178
+ } }
179
+ /**
180
+ * Entity-agnostic, read-only Feature Values panel. Shows the latest value of every
181
+ * feature that any pipeline has materialized for the current record, with an
182
+ * expander for reasoning and value history. Renders nothing when there are no rows.
183
+ */
184
+ let FeatureValuesPanel = class FeatureValuesPanel extends BaseFormPanel {
185
+ constructor() {
186
+ super(...arguments);
187
+ this.cdr = inject(ChangeDetectorRef);
188
+ /** Latest card per pipeline+feature. */
189
+ this.Cards = [];
190
+ /** True once the load has completed (success, empty or skipped). */
191
+ this.Loaded = false;
192
+ /** Key of the card whose detail/history is expanded. */
193
+ this.ExpandedKey = null;
194
+ /** The expanded card's older values, newest first; computed when the card is toggled or the rows reload, not per binding. */
195
+ this.ExpandedHistory = [];
196
+ this.rows = [];
197
+ /** Sequence number of the latest load; an older load's answer is dropped. */
198
+ this.loadSequence = 0;
199
+ }
200
+ async ngOnInit() {
201
+ await this.Refresh();
202
+ }
203
+ /** Reload when the parent form reloads the record, so stale rows never show. */
204
+ OnRecordRefreshed() {
205
+ void this.Refresh();
206
+ }
207
+ /** Reload the feature values for the current record (one RunView); a load overtaken by a later one is dropped. */
208
+ async Refresh() {
209
+ const sequence = ++this.loadSequence;
210
+ const entityID = this.Record?.EntityInfo?.ID ?? null;
211
+ // Same encoding the pipeline writes into RecordID: bare value for a single key, F1|v1||F2|v2 for composite.
212
+ const recordID = this.Record?.PrimaryKey?.ToCompactURLSegment() ?? '';
213
+ if (!this.Record?.IsSaved || !entityID || !recordID) {
214
+ this.rows = [];
215
+ this.Cards = [];
216
+ this.syncExpandedHistory();
217
+ this.Loaded = true;
218
+ this.cdr.markForCheck();
219
+ return;
220
+ }
221
+ this.Loaded = false;
222
+ try {
223
+ const result = await this.runView().RunView({
224
+ EntityName: 'MJ: Feature Values',
225
+ Fields: ['ID', 'RecordProcessID', 'EntityID', 'RecordID', 'FeatureName', 'ValueText', 'ValueNumeric',
226
+ 'ValueDate', 'ValueBoolean', 'ValueJSON', 'Reasoning', 'Confidence', 'ProcessRunID', 'ComputedAt',
227
+ 'PipelineVersion', 'Source', 'RecordProcess'],
228
+ ExtraFilter: `EntityID='${EscapeSQLString(entityID)}' AND RecordID='${EscapeSQLString(recordID)}'`,
229
+ OrderBy: 'ComputedAt DESC',
230
+ MaxRows: 500,
231
+ ResultType: 'simple',
232
+ }, this.contextUser());
233
+ if (sequence !== this.loadSequence) {
234
+ return;
235
+ }
236
+ if (!result.Success) {
237
+ LogError(`[FeatureValuesPanel] Failed to load feature values: ${result.ErrorMessage}`);
238
+ this.rows = [];
239
+ }
240
+ else {
241
+ this.rows = result.Results ?? [];
242
+ }
243
+ this.Cards = FeatureValuesPanelModel.Latest(this.rows);
244
+ }
245
+ catch (e) {
246
+ if (sequence !== this.loadSequence) {
247
+ return;
248
+ }
249
+ LogError(`[FeatureValuesPanel] ${e instanceof Error ? e.message : String(e)}`);
250
+ this.rows = [];
251
+ this.Cards = [];
252
+ }
253
+ this.syncExpandedHistory();
254
+ this.Loaded = true;
255
+ this.cdr.markForCheck();
256
+ }
257
+ /** Expand/collapse a card's reasoning + history. */
258
+ Toggle(card) {
259
+ this.ExpandedKey = this.ExpandedKey === card.Key ? null : card.Key;
260
+ this.syncExpandedHistory();
261
+ }
262
+ /** Recomputes the expanded card's history from the current rows; collapses when that card is no longer shown. */
263
+ syncExpandedHistory() {
264
+ const card = this.Cards.find((c) => c.Key === this.ExpandedKey);
265
+ this.ExpandedKey = card ? card.Key : null;
266
+ this.ExpandedHistory = card ? FeatureValuesPanelModel.History(this.rows, card) : [];
267
+ }
268
+ /** Display string for a history row ("no value" for a valueless one). */
269
+ ValueOf(row) {
270
+ return FeatureValuesPanelModel.HistoryValue(row);
271
+ }
272
+ runView() {
273
+ const provider = this.FormComponent?.ProviderToUse;
274
+ return provider ? RunView.FromMetadataProvider(provider) : new RunView();
275
+ }
276
+ contextUser() {
277
+ return this.FormComponent?.ProviderToUse?.CurrentUser ?? new Metadata().CurrentUser;
278
+ }
279
+ static { this.ɵfac = /*@__PURE__*/ (() => { let ɵFeatureValuesPanel_BaseFactory; return function FeatureValuesPanel_Factory(__ngFactoryType__) { return (ɵFeatureValuesPanel_BaseFactory || (ɵFeatureValuesPanel_BaseFactory = i0.ɵɵgetInheritedFactory(FeatureValuesPanel)))(__ngFactoryType__ || FeatureValuesPanel); }; })(); }
280
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FeatureValuesPanel, selectors: [["mj-feature-values-panel"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [["SectionKey", "featureValues", "SectionName", "Feature Values", "Icon", "fa-solid fa-table-list", 3, "Order", "Form", "FormContext", "BadgeCount"], [1, "fvp-toolbar"], ["type", "button", "mjButton", "", "Variant", "secondary", "Size", "sm", "title", "Refresh feature values", 1, "fvp-refresh", 3, "click", "disabled"], ["aria-hidden", "true", 1, "fa-solid", "fa-rotate"], [1, "fvp-table"], [1, "fvp-row"], [1, "fvp-feature"], [1, "fvp-value"], [1, "fvp-muted"], ["type", "button", "mjButton", "", "Variant", "icon", "Size", "sm", "AriaLabel", "Show reasoning and history", "title", "Show reasoning and history", 1, "fvp-toggle", 3, "click"], ["aria-hidden", "true", 1, "fa-solid"], [1, "fvp-detail"], ["colspan", "6"], [1, "fvp-reasoning"], [1, "fvp-history-title"], [1, "fvp-muted", "fvp-history-empty"], [1, "fvp-history"], [1, "fvp-history-item"]], template: function FeatureValuesPanel_Template(rf, ctx) { if (rf & 1) {
281
+ i0.ɵɵconditionalCreate(0, FeatureValuesPanel_Conditional_0_Template, 22, 7, "mj-collapsible-panel", 0);
282
+ } if (rf & 2) {
283
+ i0.ɵɵconditional(ctx.Cards.length > 0 ? 0 : -1);
284
+ } }, dependencies: [i1.MJButtonDirective, i2.MjCollapsiblePanelComponent, i3.DatePipe], styles: ["\n.fvp-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.fvp-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n padding: 6px 10px;\n color: var(--mj-text-secondary);\n font-weight: 600;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.fvp-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 6px 10px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n vertical-align: top;\n}\n\n.fvp-feature[_ngcontent-%COMP%], \n.fvp-value[_ngcontent-%COMP%] {\n font-weight: 600;\n word-break: break-word;\n}\n\n.fvp-muted[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-weight: 400;\n}\n\n\n.fvp-value--none[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-weight: 400;\n font-style: italic;\n}\n\n.fvp-detail[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n}\n\n.fvp-reasoning[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n}\n\n.fvp-history-title[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 4px;\n}\n\n.fvp-history[_ngcontent-%COMP%] {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.fvp-history-item[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 2px 0;\n}\n\n\n.fvp-toolbar[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 6px;\n}"] }); }
285
+ };
286
+ FeatureValuesPanel = __decorate([
287
+ RegisterClassEx(BaseFormPanel, {
288
+ key: 'feature-values:feature-values',
289
+ skipNullKeyWarning: true,
290
+ metadata: {
291
+ entity: '*',
292
+ slot: 'after-fields',
293
+ sortKey: 41,
294
+ },
295
+ })
296
+ ], FeatureValuesPanel);
297
+ export { FeatureValuesPanel };
298
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FeatureValuesPanel, [{
299
+ type: Component,
300
+ args: [{ standalone: false, selector: 'mj-feature-values-panel', template: "<!--\n Entity-agnostic Feature Values panel (read-only). Renders NOTHING unless at\n least one pipeline has answered for this record. A latest answer that withheld\n the value reads \"no value\" \u2014 it supersedes any older value rather than letting\n that value stand as if it were current.\n-->\n@if (Cards.length > 0) {\n <mj-collapsible-panel\n SectionKey=\"featureValues\"\n [Order]=\"DisplayOrder\"\n SectionName=\"Feature Values\"\n Icon=\"fa-solid fa-table-list\"\n [Form]=\"FormComponent\"\n [FormContext]=\"FormContext\"\n [BadgeCount]=\"Cards.length\">\n <div class=\"fvp-toolbar\">\n <button type=\"button\" mjButton Variant=\"secondary\" Size=\"sm\" class=\"fvp-refresh\" [disabled]=\"!Loaded\" (click)=\"Refresh()\" title=\"Refresh feature values\">\n <i class=\"fa-solid fa-rotate\" [class.fa-spin]=\"!Loaded\" aria-hidden=\"true\"></i> Refresh\n </button>\n </div>\n <table class=\"fvp-table\">\n <thead>\n <tr>\n <th>Feature</th>\n <th>Value</th>\n <th>Pipeline</th>\n <th>Source</th>\n <th>Computed</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (card of Cards; track card.Key) {\n <tr class=\"fvp-row\">\n <td class=\"fvp-feature\">{{ card.FeatureName }}</td>\n <td class=\"fvp-value\" [class.fvp-value--none]=\"!card.HasValue\">{{ card.DisplayValue }}</td>\n <td>{{ card.Pipeline }}@if (card.PipelineVersion !== null) { <span class=\"fvp-muted\"> v{{ card.PipelineVersion }}</span> }</td>\n <td>{{ card.Source }}@if (card.Confidence !== null) { <span class=\"fvp-muted\"> ({{ card.Confidence }})</span> }</td>\n <td class=\"fvp-muted\">{{ card.ComputedAt ? (card.ComputedAt | date: 'yyyy-MM-dd HH:mm') : '' }}</td>\n <td>\n <button type=\"button\" mjButton Variant=\"icon\" Size=\"sm\" class=\"fvp-toggle\" (click)=\"Toggle(card)\"\n [attr.aria-expanded]=\"ExpandedKey === card.Key\" AriaLabel=\"Show reasoning and history\" title=\"Show reasoning and history\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"ExpandedKey !== card.Key\" [class.fa-chevron-up]=\"ExpandedKey === card.Key\" aria-hidden=\"true\"></i>\n </button>\n </td>\n </tr>\n @if (ExpandedKey === card.Key) {\n <tr class=\"fvp-detail\">\n <td colspan=\"6\">\n @if (card.Reasoning) {\n <div class=\"fvp-reasoning\">{{ card.Reasoning }}</div>\n }\n <div class=\"fvp-history-title\">History</div>\n @if (ExpandedHistory.length === 0) {\n <div class=\"fvp-muted fvp-history-empty\">No earlier values.</div>\n } @else {\n <ul class=\"fvp-history\">\n @for (h of ExpandedHistory; track h.ID) {\n <li class=\"fvp-history-item\">\n <span class=\"fvp-value\">{{ ValueOf(h) }}</span>\n <span class=\"fvp-muted\">{{ h.ComputedAt ? (h.ComputedAt | date: 'yyyy-MM-dd HH:mm') : '' }}</span>\n </li>\n }\n </ul>\n }\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </mj-collapsible-panel>\n}\n", styles: ["/* Read-only Feature Values panel. Semantic design tokens only. */\n.fvp-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.fvp-table th {\n text-align: left;\n padding: 6px 10px;\n color: var(--mj-text-secondary);\n font-weight: 600;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.fvp-table td {\n padding: 6px 10px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n vertical-align: top;\n}\n\n.fvp-feature,\n.fvp-value {\n font-weight: 600;\n word-break: break-word;\n}\n\n.fvp-muted {\n color: var(--mj-text-secondary);\n font-weight: 400;\n}\n\n/* The latest answer withheld or cleared the value: read as absence, not as a value. */\n.fvp-value--none {\n color: var(--mj-text-secondary);\n font-weight: 400;\n font-style: italic;\n}\n\n.fvp-detail td {\n background: var(--mj-bg-surface-card);\n}\n\n.fvp-reasoning {\n margin-bottom: 8px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n}\n\n.fvp-history-title {\n font-weight: 600;\n color: var(--mj-text-secondary);\n margin-bottom: 4px;\n}\n\n.fvp-history {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.fvp-history-item {\n display: flex;\n gap: 12px;\n padding: 2px 0;\n}\n\n/* The Refresh and expand buttons are mjButton; .fvp-refresh / .fvp-toggle are hooks only. */\n.fvp-toolbar {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 6px;\n}\n"] }]
301
+ }], null, null); })();
302
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FeatureValuesPanel, { className: "FeatureValuesPanel", filePath: "src/lib/panels/feature-values/feature-values.panel.ts", lineNumber: 27 }); })();
303
+ //# sourceMappingURL=feature-values.panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-values.panel.js","sourceRoot":"","sources":["../../../../src/lib/panels/feature-values/feature-values.panel.ts","../../../../src/lib/panels/feature-values/feature-values.panel.html"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAU,MAAM,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAY,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAqC,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;;;;;;;;ICgC3B,+BAAwB;IAAC,YAA2B;IAAA,iBAAO;;;IAAlC,cAA2B;IAA3B,oDAA2B;;;IAC3D,+BAAwB;IAAC,YAAuB;IAAA,iBAAO;;;IAA9B,cAAuB;IAAvB,oDAAuB;;;IAahG,+BAA2B;IAAA,YAAoB;IAAA,iBAAM;;;IAA1B,cAAoB;IAApB,uCAAoB;;;IAI/C,+BAAyC;IAAA,kCAAkB;IAAA,iBAAM;;;IAK3D,AADF,8BAA6B,cACH;IAAA,YAAgB;IAAA,iBAAO;IAC/C,+BAAwB;IAAA,YAAmE;;IAC7F,AAD6F,iBAAO,EAC/F;;;;IAFqB,eAAgB;IAAhB,0CAAgB;IAChB,eAAmE;IAAnE,sGAAmE;;;IAJjG,8BAAwB;IACtB,uIAKC;IACH,iBAAK;;;IANH,cAKC;IALD,qCAKC;;;IAdP,AADF,8BAAuB,aACL;IACd,yHAAsB;IAGtB,+BAA+B;IAAA,uBAAO;IAAA,iBAAM;IAG1C,AAFF,yHAAoC,kGAE3B;IAWb,AADE,iBAAK,EACF;;;;IAjBD,eAEC;IAFD,4CAEC;IAED,eAWC;IAXD,6DAWC;;;;IA9BL,AADF,6BAAoB,YACM;IAAA,YAAsB;IAAA,iBAAK;IACnD,6BAA+D;IAAA,YAAuB;IAAA,iBAAK;IAC3F,0BAAI;IAAA,YAAmB;IAAA,0GAAqC;IAA8D,iBAAK;IAC/H,0BAAI;IAAA,YAAiB;IAAA,4GAAgC;IAA0D,iBAAK;IACpH,8BAAsB;IAAA,aAAyE;;IAAA,iBAAK;IAElG,AADF,2BAAI,iBAEgI;IADvD,yNAAS,sBAAY,KAAC;IAE/F,yBAA+I;IAGrJ,AADE,AADE,iBAAS,EACN,EACF;IACL,2GAAgC;;;;IAZN,eAAsB;IAAtB,yCAAsB;IACxB,cAAwC;IAAxC,oDAAwC;IAAC,cAAuB;IAAvB,0CAAuB;IAClF,eAAmB;IAAnB,sCAAmB;IAAA,cAAmG;IAAnG,2DAAmG;IACtH,eAAiB;IAAjB,oCAAiB;IAAA,cAA0F;IAA1F,uDAA0F;IACzF,eAAyE;IAAzE,8GAAyE;IAGrF,eAA+C;;IACjC,cAAkD;IAAC,AAAnD,qEAAkD,qDAAiD;IAI7H,cAqBC;IArBD,8DAqBC;;;;IAnDL,AADF,AARF,+CAOgC,aACL,gBACkI;IAAnD,sLAAS,gBAAS,KAAC;IACvH,uBAA+E;IAAC,yBAClF;IACF,AADE,iBAAS,EACL;IAIA,AADF,AADF,AADF,gCAAyB,YAChB,SACD,SACE;IAAA,uBAAO;IAAA,iBAAK;IAChB,2BAAI;IAAA,sBAAK;IAAA,iBAAK;IACd,2BAAI;IAAA,yBAAQ;IAAA,iBAAK;IACjB,2BAAI;IAAA,uBAAM;IAAA,iBAAK;IACf,2BAAI;IAAA,yBAAQ;IAAA,iBAAK;IACjB,sBAAS;IAEb,AADE,iBAAK,EACC;IACR,8BAAO;IACL,yGAoCC;IAGP,AADE,AADE,iBAAQ,EACF,EACa;;;IAzDnB,AADA,AADA,AAHA,2CAAsB,8BAGA,mCACK,mCACA;IAEsD,eAAoB;IAApB,yCAAoB;IACrE,cAAyB;IAAzB,yCAAyB;IAevD,gBAoCC;IApCD,2BAoCC;;AD9DT;;;;GAIG;AAgBI,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,aAAa;IAA9C;;QACK,QAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAExC,wCAAwC;QACjC,UAAK,GAAuB,EAAE,CAAC;QACtC,oEAAoE;QAC7D,WAAM,GAAG,KAAK,CAAC;QACtB,wDAAwD;QACjD,gBAAW,GAAkB,IAAI,CAAC;QACzC,6HAA6H;QACtH,oBAAe,GAAsB,EAAE,CAAC;QAEvC,SAAI,GAAsB,EAAE,CAAC;QACrC,6EAA6E;QACrE,iBAAY,GAAG,CAAC,CAAC;KAyF5B;IAvFU,KAAK,CAAC,QAAQ;QACjB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC;IAED,gFAAgF;IAChE,iBAAiB;QAC7B,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,kHAAkH;IAC3G,KAAK,CAAC,OAAO;QAChB,MAAM,QAAQ,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,IAAI,CAAC;QACrD,4GAA4G;QAC5G,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClD,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACxB,OAAO;QACX,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,CACvC;gBACI,UAAU,EAAE,oBAAoB;gBAChC,MAAM,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc;oBAChG,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY;oBACjG,iBAAiB,EAAE,QAAQ,EAAE,eAAe,CAAC;gBACjD,WAAW,EAAE,aAAa,eAAe,CAAC,QAAQ,CAAC,mBAAmB,eAAe,CAAC,QAAQ,CAAC,GAAG;gBAClG,OAAO,EAAE,iBAAiB;gBAC1B,OAAO,EAAE,GAAG;gBACZ,UAAU,EAAE,QAAQ;aACvB,EACD,IAAI,CAAC,WAAW,EAAE,CACrB,CAAC;YACF,IAAI,QAAQ,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;gBACjC,OAAO;YACX,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,QAAQ,CAAC,uDAAuD,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;gBACvF,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;YACrC,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,uBAAuB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,QAAQ,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;gBACjC,OAAO;YACX,CAAC;YACD,QAAQ,CAAC,wBAAwB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/E,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,oDAAoD;IAC7C,MAAM,CAAC,IAAsB;QAChC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QACnE,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC/B,CAAC;IAED,iHAAiH;IACzG,mBAAmB;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,CAAC;IAED,yEAAyE;IAClE,OAAO,CAAC,GAAoB;QAC/B,OAAO,uBAAuB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IAEO,OAAO;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC;QACnD,OAAO,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;IAC7E,CAAC;IAEO,WAAW;QACf,OAAO,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,IAAI,IAAI,QAAQ,EAAE,CAAC,WAAW,CAAC;IACxF,CAAC;4PAtGQ,kBAAkB,yBAAlB,kBAAkB;oEAAlB,kBAAkB;YCpB/B,sGAAwB;;YAAxB,+CAkEC;;;AD9CY,kBAAkB;IAf9B,eAAe,CAAC,aAAa,EAAE;QAC5B,GAAG,EAAE,+BAA+B;QACpC,kBAAkB,EAAE,IAAI;QACxB,QAAQ,EAAE;YACN,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,EAAE;SACd;KACJ,CAAC;GAOW,kBAAkB,CAuG9B;;iFAvGY,kBAAkB;cAN9B,SAAS;6BACM,KAAK,YACP,yBAAyB;;kFAI1B,kBAAkB","sourcesContent":["import { ChangeDetectorRef, Component, OnInit, inject } from '@angular/core';\nimport { EscapeSQLString, RegisterClassEx } from '@memberjunction/global';\nimport { BaseFormPanel } from '@memberjunction/ng-base-forms';\nimport { LogError, Metadata, RunView, UserInfo } from '@memberjunction/core';\nimport { FeatureValueCard, FeatureValueRow, FeatureValuesPanelModel } from './feature-values.logic';\n\n/**\n * Entity-agnostic, read-only Feature Values panel. Shows the latest value of every\n * feature that any pipeline has materialized for the current record, with an\n * expander for reasoning and value history. Renders nothing when there are no rows.\n */\n@RegisterClassEx(BaseFormPanel, {\n key: 'feature-values:feature-values',\n skipNullKeyWarning: true,\n metadata: {\n entity: '*',\n slot: 'after-fields',\n sortKey: 41,\n },\n})\n@Component({\n standalone: false,\n selector: 'mj-feature-values-panel',\n templateUrl: './feature-values.panel.html',\n styleUrls: ['./feature-values.panel.css'],\n})\nexport class FeatureValuesPanel extends BaseFormPanel implements OnInit {\n private cdr = inject(ChangeDetectorRef);\n\n /** Latest card per pipeline+feature. */\n public Cards: FeatureValueCard[] = [];\n /** True once the load has completed (success, empty or skipped). */\n public Loaded = false;\n /** Key of the card whose detail/history is expanded. */\n public ExpandedKey: string | null = null;\n /** The expanded card's older values, newest first; computed when the card is toggled or the rows reload, not per binding. */\n public ExpandedHistory: FeatureValueRow[] = [];\n\n private rows: FeatureValueRow[] = [];\n /** Sequence number of the latest load; an older load's answer is dropped. */\n private loadSequence = 0;\n\n public async ngOnInit(): Promise<void> {\n await this.Refresh();\n }\n\n /** Reload when the parent form reloads the record, so stale rows never show. */\n public override OnRecordRefreshed(): void {\n void this.Refresh();\n }\n\n /** Reload the feature values for the current record (one RunView); a load overtaken by a later one is dropped. */\n public async Refresh(): Promise<void> {\n const sequence = ++this.loadSequence;\n const entityID = this.Record?.EntityInfo?.ID ?? null;\n // Same encoding the pipeline writes into RecordID: bare value for a single key, F1|v1||F2|v2 for composite.\n const recordID = this.Record?.PrimaryKey?.ToCompactURLSegment() ?? '';\n if (!this.Record?.IsSaved || !entityID || !recordID) {\n this.rows = [];\n this.Cards = [];\n this.syncExpandedHistory();\n this.Loaded = true;\n this.cdr.markForCheck();\n return;\n }\n this.Loaded = false;\n try {\n const result = await this.runView().RunView<FeatureValueRow>(\n {\n EntityName: 'MJ: Feature Values',\n Fields: ['ID', 'RecordProcessID', 'EntityID', 'RecordID', 'FeatureName', 'ValueText', 'ValueNumeric',\n 'ValueDate', 'ValueBoolean', 'ValueJSON', 'Reasoning', 'Confidence', 'ProcessRunID', 'ComputedAt',\n 'PipelineVersion', 'Source', 'RecordProcess'],\n ExtraFilter: `EntityID='${EscapeSQLString(entityID)}' AND RecordID='${EscapeSQLString(recordID)}'`,\n OrderBy: 'ComputedAt DESC',\n MaxRows: 500,\n ResultType: 'simple',\n },\n this.contextUser(),\n );\n if (sequence !== this.loadSequence) {\n return;\n }\n if (!result.Success) {\n LogError(`[FeatureValuesPanel] Failed to load feature values: ${result.ErrorMessage}`);\n this.rows = [];\n } else {\n this.rows = result.Results ?? [];\n }\n this.Cards = FeatureValuesPanelModel.Latest(this.rows);\n } catch (e) {\n if (sequence !== this.loadSequence) {\n return;\n }\n LogError(`[FeatureValuesPanel] ${e instanceof Error ? e.message : String(e)}`);\n this.rows = [];\n this.Cards = [];\n }\n this.syncExpandedHistory();\n this.Loaded = true;\n this.cdr.markForCheck();\n }\n\n /** Expand/collapse a card's reasoning + history. */\n public Toggle(card: FeatureValueCard): void {\n this.ExpandedKey = this.ExpandedKey === card.Key ? null : card.Key;\n this.syncExpandedHistory();\n }\n\n /** Recomputes the expanded card's history from the current rows; collapses when that card is no longer shown. */\n private syncExpandedHistory(): void {\n const card = this.Cards.find((c) => c.Key === this.ExpandedKey);\n this.ExpandedKey = card ? card.Key : null;\n this.ExpandedHistory = card ? FeatureValuesPanelModel.History(this.rows, card) : [];\n }\n\n /** Display string for a history row (\"no value\" for a valueless one). */\n public ValueOf(row: FeatureValueRow): string {\n return FeatureValuesPanelModel.HistoryValue(row);\n }\n\n private runView(): RunView {\n const provider = this.FormComponent?.ProviderToUse;\n return provider ? RunView.FromMetadataProvider(provider) : new RunView();\n }\n\n private contextUser(): UserInfo | undefined {\n return this.FormComponent?.ProviderToUse?.CurrentUser ?? new Metadata().CurrentUser;\n }\n}\n","<!--\n Entity-agnostic Feature Values panel (read-only). Renders NOTHING unless at\n least one pipeline has answered for this record. A latest answer that withheld\n the value reads \"no value\" — it supersedes any older value rather than letting\n that value stand as if it were current.\n-->\n@if (Cards.length > 0) {\n <mj-collapsible-panel\n SectionKey=\"featureValues\"\n [Order]=\"DisplayOrder\"\n SectionName=\"Feature Values\"\n Icon=\"fa-solid fa-table-list\"\n [Form]=\"FormComponent\"\n [FormContext]=\"FormContext\"\n [BadgeCount]=\"Cards.length\">\n <div class=\"fvp-toolbar\">\n <button type=\"button\" mjButton Variant=\"secondary\" Size=\"sm\" class=\"fvp-refresh\" [disabled]=\"!Loaded\" (click)=\"Refresh()\" title=\"Refresh feature values\">\n <i class=\"fa-solid fa-rotate\" [class.fa-spin]=\"!Loaded\" aria-hidden=\"true\"></i> Refresh\n </button>\n </div>\n <table class=\"fvp-table\">\n <thead>\n <tr>\n <th>Feature</th>\n <th>Value</th>\n <th>Pipeline</th>\n <th>Source</th>\n <th>Computed</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (card of Cards; track card.Key) {\n <tr class=\"fvp-row\">\n <td class=\"fvp-feature\">{{ card.FeatureName }}</td>\n <td class=\"fvp-value\" [class.fvp-value--none]=\"!card.HasValue\">{{ card.DisplayValue }}</td>\n <td>{{ card.Pipeline }}@if (card.PipelineVersion !== null) { <span class=\"fvp-muted\"> v{{ card.PipelineVersion }}</span> }</td>\n <td>{{ card.Source }}@if (card.Confidence !== null) { <span class=\"fvp-muted\"> ({{ card.Confidence }})</span> }</td>\n <td class=\"fvp-muted\">{{ card.ComputedAt ? (card.ComputedAt | date: 'yyyy-MM-dd HH:mm') : '' }}</td>\n <td>\n <button type=\"button\" mjButton Variant=\"icon\" Size=\"sm\" class=\"fvp-toggle\" (click)=\"Toggle(card)\"\n [attr.aria-expanded]=\"ExpandedKey === card.Key\" AriaLabel=\"Show reasoning and history\" title=\"Show reasoning and history\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"ExpandedKey !== card.Key\" [class.fa-chevron-up]=\"ExpandedKey === card.Key\" aria-hidden=\"true\"></i>\n </button>\n </td>\n </tr>\n @if (ExpandedKey === card.Key) {\n <tr class=\"fvp-detail\">\n <td colspan=\"6\">\n @if (card.Reasoning) {\n <div class=\"fvp-reasoning\">{{ card.Reasoning }}</div>\n }\n <div class=\"fvp-history-title\">History</div>\n @if (ExpandedHistory.length === 0) {\n <div class=\"fvp-muted fvp-history-empty\">No earlier values.</div>\n } @else {\n <ul class=\"fvp-history\">\n @for (h of ExpandedHistory; track h.ID) {\n <li class=\"fvp-history-item\">\n <span class=\"fvp-value\">{{ ValueOf(h) }}</span>\n <span class=\"fvp-muted\">{{ h.ComputedAt ? (h.ComputedAt | date: 'yyyy-MM-dd HH:mm') : '' }}</span>\n </li>\n }\n </ul>\n }\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </mj-collapsible-panel>\n}\n"]}
@@ -79,6 +79,16 @@ export declare function resolveLabel(targetVariable: string | null, targetColumn
79
79
  export declare function ParseDrivers(featureImportanceJson: string | null): PredictionDriver[];
80
80
  /** @deprecated Use {@link ParseDrivers}. */
81
81
  export declare function parseDrivers(featureImportanceJson: string | null): PredictionDriver[];
82
+ /** The global drivers a prediction card may show. */
83
+ export declare class PredictionDrivers {
84
+ /** Global drivers for a model's card: coefficient models only (split / impurity counts are not comparable across features and read as importance they are not, so they are hidden). */
85
+ static DriversForModel(lineageJSON: string | null | undefined, featureImportanceJson: string | null): PredictionDriver[];
86
+ /**
87
+ * True when the model has stored importances that {@link DriversForModel} withholds because of their kind, so the card
88
+ * shows {@link ImportanceDisplay.HiddenNote} in their place (the same note the model detail page shows).
89
+ */
90
+ static DriversHidden(lineageJSON: string | null | undefined, featureImportanceJson: string | null): boolean;
91
+ }
82
92
  /** Format a last-scored timestamp to a short date, or null when absent/invalid. */
83
93
  export declare function FormatLastScored(lastScoredAt: Date | string | null): string | null;
84
94
  /** @deprecated Use {@link FormatLastScored}. */
@@ -1 +1 @@
1
- {"version":3,"file":"model-prediction.logic.d.ts","sourceRoot":"","sources":["../../../../src/lib/panels/model-predictions/model-prediction.logic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-prediction.logic.d.ts","sourceRoot":"","sources":["../../../../src/lib/panels/model-predictions/model-prediction.logic.ts"],"names":[],"mappings":"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"}