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

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 (167) hide show
  1. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +1 -1
  2. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  3. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +2 -2
  4. package/dist/lib/custom/Conversations/conversation-overview.panel.js +1 -1
  5. package/dist/lib/custom/Conversations/conversation-overview.panel.js.map +1 -1
  6. package/dist/lib/custom/DiagnosticSenderRegistrations/sender-registration-toolbar-actions.d.ts +35 -0
  7. package/dist/lib/custom/DiagnosticSenderRegistrations/sender-registration-toolbar-actions.d.ts.map +1 -0
  8. package/dist/lib/custom/DiagnosticSenderRegistrations/sender-registration-toolbar-actions.js +155 -0
  9. package/dist/lib/custom/DiagnosticSenderRegistrations/sender-registration-toolbar-actions.js.map +1 -0
  10. package/dist/lib/custom/Entities/entity-form.component.js +3 -3
  11. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  12. package/dist/lib/custom/Files/file-form.component.d.ts +8 -0
  13. package/dist/lib/custom/Files/file-form.component.d.ts.map +1 -1
  14. package/dist/lib/custom/Files/file-form.component.js +21 -5
  15. package/dist/lib/custom/Files/file-form.component.js.map +1 -1
  16. package/dist/lib/custom/Files/file-form.logic.d.ts +7 -0
  17. package/dist/lib/custom/Files/file-form.logic.d.ts.map +1 -1
  18. package/dist/lib/custom/Files/file-form.logic.js +20 -0
  19. package/dist/lib/custom/Files/file-form.logic.js.map +1 -1
  20. package/dist/lib/custom/Lists/list-form.component.js +5 -5
  21. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  22. package/dist/lib/custom/Queries/query-child-labels.d.ts +12 -0
  23. package/dist/lib/custom/Queries/query-child-labels.d.ts.map +1 -0
  24. package/dist/lib/custom/Queries/query-child-labels.js +28 -0
  25. package/dist/lib/custom/Queries/query-child-labels.js.map +1 -0
  26. package/dist/lib/custom/Queries/query-fields-grid.component.d.ts +37 -0
  27. package/dist/lib/custom/Queries/query-fields-grid.component.d.ts.map +1 -0
  28. package/dist/lib/custom/Queries/query-fields-grid.component.js +321 -0
  29. package/dist/lib/custom/Queries/query-fields-grid.component.js.map +1 -0
  30. package/dist/lib/custom/Queries/query-form-logic.d.ts +37 -0
  31. package/dist/lib/custom/Queries/query-form-logic.d.ts.map +1 -0
  32. package/dist/lib/custom/Queries/query-form-logic.js +48 -0
  33. package/dist/lib/custom/Queries/query-form-logic.js.map +1 -0
  34. package/dist/lib/custom/Queries/query-form.component.d.ts +76 -7
  35. package/dist/lib/custom/Queries/query-form.component.d.ts.map +1 -1
  36. package/dist/lib/custom/Queries/query-form.component.js +740 -688
  37. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  38. package/dist/lib/custom/Queries/query-parameters-grid.component.d.ts +31 -0
  39. package/dist/lib/custom/Queries/query-parameters-grid.component.d.ts.map +1 -0
  40. package/dist/lib/custom/Queries/query-parameters-grid.component.js +298 -0
  41. package/dist/lib/custom/Queries/query-parameters-grid.component.js.map +1 -0
  42. package/dist/lib/custom/Rubrics/record-forms.component.js +2 -2
  43. package/dist/lib/custom/Rubrics/record-forms.component.js.map +1 -1
  44. package/dist/lib/custom/Rubrics/scale-form.component.d.ts.map +1 -1
  45. package/dist/lib/custom/Rubrics/scale-form.component.js +2 -1
  46. package/dist/lib/custom/Rubrics/scale-form.component.js.map +1 -1
  47. package/dist/lib/custom/SearchScopes/searchscope-form.component.js +1 -1
  48. package/dist/lib/custom/SearchScopes/searchscope-form.component.js.map +1 -1
  49. package/dist/lib/custom/custom-forms.module.d.ts +41 -35
  50. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  51. package/dist/lib/custom/custom-forms.module.js +36 -3
  52. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  53. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
  54. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +234 -226
  55. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  56. package/dist/lib/generated/Entities/MJAIAgentConfiguration/mjaiagentconfiguration.form.component.d.ts.map +1 -1
  57. package/dist/lib/generated/Entities/MJAIAgentConfiguration/mjaiagentconfiguration.form.component.js +25 -6
  58. package/dist/lib/generated/Entities/MJAIAgentConfiguration/mjaiagentconfiguration.form.component.js.map +1 -1
  59. package/dist/lib/generated/Entities/MJAIAgentRelationship/mjaiagentrelationship.form.component.d.ts.map +1 -1
  60. package/dist/lib/generated/Entities/MJAIAgentRelationship/mjaiagentrelationship.form.component.js +13 -3
  61. package/dist/lib/generated/Entities/MJAIAgentRelationship/mjaiagentrelationship.form.component.js.map +1 -1
  62. package/dist/lib/generated/Entities/MJBrandKit/mjbrandkit.form.component.d.ts +10 -0
  63. package/dist/lib/generated/Entities/MJBrandKit/mjbrandkit.form.component.d.ts.map +1 -0
  64. package/dist/lib/generated/Entities/MJBrandKit/mjbrandkit.form.component.js +91 -0
  65. package/dist/lib/generated/Entities/MJBrandKit/mjbrandkit.form.component.js.map +1 -0
  66. package/dist/lib/generated/Entities/MJBrandKitAsset/mjbrandkitasset.form.component.d.ts +10 -0
  67. package/dist/lib/generated/Entities/MJBrandKitAsset/mjbrandkitasset.form.component.d.ts.map +1 -0
  68. package/dist/lib/generated/Entities/MJBrandKitAsset/mjbrandkitasset.form.component.js +72 -0
  69. package/dist/lib/generated/Entities/MJBrandKitAsset/mjbrandkitasset.form.component.js.map +1 -0
  70. package/dist/lib/generated/Entities/MJCompany/mjcompany.form.component.d.ts.map +1 -1
  71. package/dist/lib/generated/Entities/MJCompany/mjcompany.form.component.js +82 -10
  72. package/dist/lib/generated/Entities/MJCompany/mjcompany.form.component.js.map +1 -1
  73. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.d.ts.map +1 -1
  74. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js +39 -31
  75. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js.map +1 -1
  76. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js +90 -78
  77. package/dist/lib/generated/Entities/MJConversation/mjconversation.form.component.js.map +1 -1
  78. package/dist/lib/generated/Entities/MJDiagnosticBundle/mjdiagnosticbundle.form.component.d.ts +10 -0
  79. package/dist/lib/generated/Entities/MJDiagnosticBundle/mjdiagnosticbundle.form.component.d.ts.map +1 -0
  80. package/dist/lib/generated/Entities/MJDiagnosticBundle/mjdiagnosticbundle.form.component.js +154 -0
  81. package/dist/lib/generated/Entities/MJDiagnosticBundle/mjdiagnosticbundle.form.component.js.map +1 -0
  82. package/dist/lib/generated/Entities/MJDiagnosticSenderRegistration/mjdiagnosticsenderregistration.form.component.d.ts +10 -0
  83. package/dist/lib/generated/Entities/MJDiagnosticSenderRegistration/mjdiagnosticsenderregistration.form.component.d.ts.map +1 -0
  84. package/dist/lib/generated/Entities/MJDiagnosticSenderRegistration/mjdiagnosticsenderregistration.form.component.js +98 -0
  85. package/dist/lib/generated/Entities/MJDiagnosticSenderRegistration/mjdiagnosticsenderregistration.form.component.js.map +1 -0
  86. package/dist/lib/generated/Entities/MJDiagnosticSession/mjdiagnosticsession.form.component.d.ts +10 -0
  87. package/dist/lib/generated/Entities/MJDiagnosticSession/mjdiagnosticsession.form.component.d.ts.map +1 -0
  88. package/dist/lib/generated/Entities/MJDiagnosticSession/mjdiagnosticsession.form.component.js +149 -0
  89. package/dist/lib/generated/Entities/MJDiagnosticSession/mjdiagnosticsession.form.component.js.map +1 -0
  90. package/dist/lib/generated/Entities/MJDiagnosticSessionChunk/mjdiagnosticsessionchunk.form.component.d.ts +10 -0
  91. package/dist/lib/generated/Entities/MJDiagnosticSessionChunk/mjdiagnosticsessionchunk.form.component.d.ts.map +1 -0
  92. package/dist/lib/generated/Entities/MJDiagnosticSessionChunk/mjdiagnosticsessionchunk.form.component.js +88 -0
  93. package/dist/lib/generated/Entities/MJDiagnosticSessionChunk/mjdiagnosticsessionchunk.form.component.js.map +1 -0
  94. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  95. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +513 -451
  96. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  97. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.d.ts.map +1 -1
  98. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js +24 -6
  99. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js.map +1 -1
  100. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.d.ts.map +1 -1
  101. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js +51 -15
  102. package/dist/lib/generated/Entities/MJFile/mjfile.form.component.js.map +1 -1
  103. package/dist/lib/generated/Entities/MJGraph/mjgraph.form.component.d.ts +10 -0
  104. package/dist/lib/generated/Entities/MJGraph/mjgraph.form.component.d.ts.map +1 -0
  105. package/dist/lib/generated/Entities/MJGraph/mjgraph.form.component.js +155 -0
  106. package/dist/lib/generated/Entities/MJGraph/mjgraph.form.component.js.map +1 -0
  107. package/dist/lib/generated/Entities/MJGraphAuthorityTier/mjgraphauthoritytier.form.component.d.ts +10 -0
  108. package/dist/lib/generated/Entities/MJGraphAuthorityTier/mjgraphauthoritytier.form.component.d.ts.map +1 -0
  109. package/dist/lib/generated/Entities/MJGraphAuthorityTier/mjgraphauthoritytier.form.component.js +83 -0
  110. package/dist/lib/generated/Entities/MJGraphAuthorityTier/mjgraphauthoritytier.form.component.js.map +1 -0
  111. package/dist/lib/generated/Entities/MJGraphConcept/mjgraphconcept.form.component.d.ts +10 -0
  112. package/dist/lib/generated/Entities/MJGraphConcept/mjgraphconcept.form.component.d.ts.map +1 -0
  113. package/dist/lib/generated/Entities/MJGraphConcept/mjgraphconcept.form.component.js +91 -0
  114. package/dist/lib/generated/Entities/MJGraphConcept/mjgraphconcept.form.component.js.map +1 -0
  115. package/dist/lib/generated/Entities/MJGraphConceptType/mjgraphconcepttype.form.component.d.ts +10 -0
  116. package/dist/lib/generated/Entities/MJGraphConceptType/mjgraphconcepttype.form.component.d.ts.map +1 -0
  117. package/dist/lib/generated/Entities/MJGraphConceptType/mjgraphconcepttype.form.component.js +83 -0
  118. package/dist/lib/generated/Entities/MJGraphConceptType/mjgraphconcepttype.form.component.js.map +1 -0
  119. package/dist/lib/generated/Entities/MJGraphEdge/mjgraphedge.form.component.d.ts +10 -0
  120. package/dist/lib/generated/Entities/MJGraphEdge/mjgraphedge.form.component.d.ts.map +1 -0
  121. package/dist/lib/generated/Entities/MJGraphEdge/mjgraphedge.form.component.js +78 -0
  122. package/dist/lib/generated/Entities/MJGraphEdge/mjgraphedge.form.component.js.map +1 -0
  123. package/dist/lib/generated/Entities/MJGraphEdgeProvider/mjgraphedgeprovider.form.component.d.ts +10 -0
  124. package/dist/lib/generated/Entities/MJGraphEdgeProvider/mjgraphedgeprovider.form.component.d.ts.map +1 -0
  125. package/dist/lib/generated/Entities/MJGraphEdgeProvider/mjgraphedgeprovider.form.component.js +68 -0
  126. package/dist/lib/generated/Entities/MJGraphEdgeProvider/mjgraphedgeprovider.form.component.js.map +1 -0
  127. package/dist/lib/generated/Entities/MJGraphEdgeType/mjgraphedgetype.form.component.d.ts +10 -0
  128. package/dist/lib/generated/Entities/MJGraphEdgeType/mjgraphedgetype.form.component.d.ts.map +1 -0
  129. package/dist/lib/generated/Entities/MJGraphEdgeType/mjgraphedgetype.form.component.js +105 -0
  130. package/dist/lib/generated/Entities/MJGraphEdgeType/mjgraphedgetype.form.component.js.map +1 -0
  131. package/dist/lib/generated/Entities/MJGraphEdgeTypeEndpoint/mjgraphedgetypeendpoint.form.component.d.ts +10 -0
  132. package/dist/lib/generated/Entities/MJGraphEdgeTypeEndpoint/mjgraphedgetypeendpoint.form.component.d.ts.map +1 -0
  133. package/dist/lib/generated/Entities/MJGraphEdgeTypeEndpoint/mjgraphedgetypeendpoint.form.component.js +60 -0
  134. package/dist/lib/generated/Entities/MJGraphEdgeTypeEndpoint/mjgraphedgetypeendpoint.form.component.js.map +1 -0
  135. package/dist/lib/generated/Entities/MJGraphType/mjgraphtype.form.component.d.ts +10 -0
  136. package/dist/lib/generated/Entities/MJGraphType/mjgraphtype.form.component.d.ts.map +1 -0
  137. package/dist/lib/generated/Entities/MJGraphType/mjgraphtype.form.component.js +85 -0
  138. package/dist/lib/generated/Entities/MJGraphType/mjgraphtype.form.component.js.map +1 -0
  139. package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js +67 -61
  140. package/dist/lib/generated/Entities/MJQuery/mjquery.form.component.js.map +1 -1
  141. package/dist/lib/generated/Entities/MJQueryField/mjqueryfield.form.component.d.ts.map +1 -1
  142. package/dist/lib/generated/Entities/MJQueryField/mjqueryfield.form.component.js +15 -3
  143. package/dist/lib/generated/Entities/MJQueryField/mjqueryfield.form.component.js.map +1 -1
  144. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  145. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +207 -135
  146. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  147. package/dist/lib/generated/Entities/MJVideoArchetype/mjvideoarchetype.form.component.d.ts +10 -0
  148. package/dist/lib/generated/Entities/MJVideoArchetype/mjvideoarchetype.form.component.d.ts.map +1 -0
  149. package/dist/lib/generated/Entities/MJVideoArchetype/mjvideoarchetype.form.component.js +80 -0
  150. package/dist/lib/generated/Entities/MJVideoArchetype/mjvideoarchetype.form.component.js.map +1 -0
  151. package/dist/lib/generated/generated-forms.module.d.ts +478 -462
  152. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  153. package/dist/lib/generated/generated-forms.module.js +50 -2
  154. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  155. package/dist/lib/panels/brand-kits/brand-kit-assets.panel.d.ts +15 -0
  156. package/dist/lib/panels/brand-kits/brand-kit-assets.panel.d.ts.map +1 -0
  157. package/dist/lib/panels/brand-kits/brand-kit-assets.panel.js +52 -0
  158. package/dist/lib/panels/brand-kits/brand-kit-assets.panel.js.map +1 -0
  159. package/dist/lib/panels/brand-kits/brand-kit-generation-policy.panel.d.ts +15 -0
  160. package/dist/lib/panels/brand-kits/brand-kit-generation-policy.panel.d.ts.map +1 -0
  161. package/dist/lib/panels/brand-kits/brand-kit-generation-policy.panel.js +52 -0
  162. package/dist/lib/panels/brand-kits/brand-kit-generation-policy.panel.js.map +1 -0
  163. package/dist/public-api.d.ts +2 -0
  164. package/dist/public-api.d.ts.map +1 -1
  165. package/dist/public-api.js +3 -0
  166. package/dist/public-api.js.map +1 -1
  167. package/package.json +50 -48
@@ -200,7 +200,7 @@ let ConversationOverviewPanel = class ConversationOverviewPanel extends BaseForm
200
200
  this.AgentMessageCount = agent?.TotalRowCount ?? 0;
201
201
  this.Messages = recent?.Results ?? [];
202
202
  }
203
- this.ForkCount = forks?.Success ? forks.TotalRowCount : 0;
203
+ this.ForkCount = forks?.Success ? forks.TotalRowCount ?? 0 : 0;
204
204
  }
205
205
  catch (e) {
206
206
  const message = e instanceof Error ? e.message : String(e);
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-overview.panel.js","sourceRoot":"","sources":["../../../../src/lib/custom/Conversations/conversation-overview.panel.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ChangeDetectionStrategy, OnInit, inject, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IMetadataProvider, LogError, Metadata, RunView } from '@memberjunction/core';\nimport { EscapeSQLString, RegisterClassEx } from '@memberjunction/global';\nimport { BaseFormPanel } from '@memberjunction/ng-base-forms';\nimport { ConversationEngine, MJConversationDetailEntity, MJConversationEntity } from '@memberjunction/core-entities';\n\ninterface ConversationDetailRow {\n ID: string;\n Role: MJConversationDetailEntity['Role'];\n Message: string;\n CreatedAt: string;\n}\n\n/** Number of newest messages the Recent Turns card shows. */\nconst RECENT_MESSAGE_COUNT = 4;\n\n@RegisterClassEx(BaseFormPanel, {\n key: 'form-panel:MJ: Conversations:overview',\n metadata: {\n entity: 'MJ: Conversations',\n slot: 'before-fields',\n sortKey: 10,\n },\n})\n@Component({\n selector: 'mj-conversation-overview-panel',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"mj-convo-overview-grid\">\n <!-- Card 1: Message Flow Metrics -->\n <div class=\"mj-overview-card\">\n <div class=\"mj-card-header\">\n <div class=\"mj-card-title\"><i class=\"fa-solid fa-comments\" style=\"color: var(--mj-brand-primary, #38bdf8);\"></i> Turn Summary</div>\n @if (!LoadError) {\n <span class=\"mj-card-badge\">{{ TotalMessageCount }} Turns</span>\n }\n </div>\n <div class=\"mj-card-body\">\n @if (LoadError) {\n <span class=\"mj-load-error\">{{ LoadError }}</span>\n } @else {\n <div class=\"mj-metric-row\">\n <span class=\"mj-metric-label\">Total Messages</span>\n <span class=\"mj-metric-val\">{{ TotalMessageCount }}</span>\n </div>\n @if (ForkCount > 0) {\n <div class=\"mj-fork-note\">plus {{ ForkCount }} {{ ForkCount === 1 ? 'fork' : 'forks' }}</div>\n }\n <div class=\"mj-metric-row\">\n <span class=\"mj-metric-label\">User Prompts</span>\n <span class=\"mj-metric-val\">{{ UserMessageCount }}</span>\n </div>\n <div class=\"mj-metric-row\">\n <span class=\"mj-metric-label\">Agent Responses</span>\n <span class=\"mj-metric-val\">{{ AgentMessageCount }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Card 2: Recent Activity Stream -->\n <div class=\"mj-overview-card\">\n <div class=\"mj-card-header\">\n <div class=\"mj-card-title\"><i class=\"fa-solid fa-clock-rotate-left\" style=\"color: #10b981;\"></i> Recent Turns</div>\n <span class=\"mj-card-badge\">History</span>\n </div>\n <div class=\"mj-card-body\">\n @if (LoadError) {\n <span class=\"mj-load-error\">{{ LoadError }}</span>\n } @else if (Messages.length === 0) {\n <span style=\"font-size: 12px; color: var(--mj-text-muted);\">No messages in this conversation yet.</span>\n } @else {\n @for (msg of RecentMessages; track msg.ID) {\n <div class=\"mj-metric-row\">\n <span class=\"mj-metric-label\" style=\"text-overflow: ellipsis; overflow: hidden; white-space: nowrap; max-width: 200px;\">\n <strong>{{ msg.Role }}:</strong> {{ msg.Message }}\n </span>\n <span class=\"mj-pill\" [class.mj-pill-blue]=\"IsUserTurn(msg)\" [class.mj-pill-green]=\"IsAgentTurn(msg)\">\n {{ msg.Role }}\n </span>\n </div>\n }\n }\n </div>\n </div>\n </div>\n `,\n styles: [`\n :host { display: block; width: 100%; margin-bottom: 20px; }\n .mj-convo-overview-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 16px;\n }\n .mj-overview-card {\n background: var(--mj-bg-surface-card, #141f36);\n border: 1px solid var(--mj-border-default, #223254);\n border-radius: 10px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n .mj-card-header {\n padding: 10px 14px;\n background: var(--mj-bg-surface, #111a2e);\n border-bottom: 1px solid var(--mj-border-default, #223254);\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .mj-card-title {\n font-size: 12.5px;\n font-weight: 700;\n color: var(--mj-text-primary, #f8fafc);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .mj-card-badge {\n font-size: 11px;\n padding: 2px 7px;\n border-radius: 9999px;\n background: var(--mj-bg-surface-elevated, #1a2744);\n color: var(--mj-text-secondary, #94a3b8);\n border: 1px solid var(--mj-border-default, #223254);\n }\n .mj-card-body {\n padding: 14px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n .mj-metric-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 12px;\n }\n .mj-metric-label { color: var(--mj-text-secondary, #94a3b8); }\n .mj-fork-note { font-size: 11px; color: var(--mj-text-muted); margin-top: -6px; }\n .mj-metric-val { font-weight: 600; color: var(--mj-text-primary, #f8fafc); font-family: monospace; }\n .mj-load-error { font-size: 12px; color: var(--mj-status-error); }\n .mj-pill { font-size: 10.5px; font-weight: 700; padding: 2px 6px; border-radius: 4px; }\n .mj-pill-green { background: rgba(16, 185, 129, 0.15); color: #10b981; }\n .mj-pill-blue { background: rgba(56, 189, 248, 0.15); color: #38bdf8; }\n `]\n})\nexport class ConversationOverviewPanel extends BaseFormPanel<MJConversationEntity> implements OnInit {\n private cdr = inject(ChangeDetectorRef);\n /** The newest messages in Main, newest first. */\n public Messages: ConversationDetailRow[] = [];\n /** Messages in Main. */\n public TotalMessageCount = 0;\n /** User messages in Main. */\n public UserMessageCount = 0;\n /** AI messages in Main. */\n public AgentMessageCount = 0;\n /** Forks of the conversation. */\n public ForkCount = 0;\n /** Set when a read fails, so the cards show the failure instead of zero messages. */\n public LoadError: string | null = null;\n\n public ngOnInit(): void {\n this.loadConversationMessages();\n }\n\n /** A turn the user sent. `Role` is stored as 'User', 'AI' or 'Error'. */\n protected IsUserTurn(detail: ConversationDetailRow): boolean {\n return detail.Role === 'User';\n }\n\n /** A turn an agent sent. An 'Error' turn is neither a user turn nor an agent turn. */\n protected IsAgentTurn(detail: ConversationDetailRow): boolean {\n return detail.Role === 'AI';\n }\n\n public get RecentMessages(): ConversationDetailRow[] {\n return this.Messages.slice(0, RECENT_MESSAGE_COUNT);\n }\n\n /** The host form's provider, or the default provider when the panel has no host form. */\n private get providerToUse(): IMetadataProvider {\n return this.FormComponent?.ProviderToUse ?? Metadata.Provider; // global-provider-ok: BaseFormPanel has no Provider input; a panel without a host form uses the default provider\n }\n\n /**\n * Loads the counts and newest messages in Main, and the conversation's fork count, in one\n * batch. When a detail read fails, the cards show the failure.\n */\n private async loadConversationMessages(): Promise<void> {\n if (!this.Record?.ID) return;\n const provider = this.providerToUse;\n const scope = ConversationEngine.TrunkScope(this.Record.ID);\n try {\n const rv = RunView.FromMetadataProvider(provider);\n const [total, user, agent, recent, forks] = await rv.RunViews<ConversationDetailRow>([\n {\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: ConversationEngine.ScopeFilter(scope),\n ResultType: 'count_only',\n },\n {\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: `${ConversationEngine.ScopeFilter(scope)} AND [Role]='User'`,\n ResultType: 'count_only',\n },\n {\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: `${ConversationEngine.ScopeFilter(scope)} AND [Role]='AI'`,\n ResultType: 'count_only',\n },\n {\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: ConversationEngine.ScopeFilter(scope),\n Fields: ['ID', 'Role', 'Message', '__mj_CreatedAt'],\n OrderBy: 'Sequence DESC',\n MaxRows: RECENT_MESSAGE_COUNT,\n ResultType: 'simple',\n },\n {\n EntityName: 'MJ: Conversation Branches',\n ExtraFilter: `ConversationID='${EscapeSQLString(this.Record.ID)}'`,\n ResultType: 'count_only',\n },\n ], provider.CurrentUser);\n const detailReads = [total, user, agent, recent];\n const failed = detailReads.findIndex(r => !r?.Success);\n if (failed >= 0) {\n this.showLoadError(detailReads[failed]?.ErrorMessage);\n } else {\n this.TotalMessageCount = total?.TotalRowCount ?? 0;\n this.UserMessageCount = user?.TotalRowCount ?? 0;\n this.AgentMessageCount = agent?.TotalRowCount ?? 0;\n this.Messages = recent?.Results ?? [];\n }\n this.ForkCount = forks?.Success ? forks.TotalRowCount : 0;\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n LogError(`Conversation overview: could not load the details of conversation ${this.Record.ID}: ${message}`);\n this.showLoadError(message);\n }\n this.cdr.markForCheck();\n }\n\n /** Shows a short \"could not load\" line, with the underlying message when there is one. */\n private showLoadError(detail: string | undefined): void {\n this.LoadError = detail ? `Could not load messages: ${detail}` : 'Could not load messages.';\n }\n}\n"]}
1
+ {"version":3,"file":"conversation-overview.panel.js","sourceRoot":"","sources":["../../../../src/lib/custom/Conversations/conversation-overview.panel.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, ChangeDetectionStrategy, OnInit, inject, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IMetadataProvider, LogError, Metadata, RunView } from '@memberjunction/core';\nimport { EscapeSQLString, RegisterClassEx } from '@memberjunction/global';\nimport { BaseFormPanel } from '@memberjunction/ng-base-forms';\nimport { ConversationEngine, MJConversationDetailEntity, MJConversationEntity } from '@memberjunction/core-entities';\n\ninterface ConversationDetailRow {\n ID: string;\n Role: MJConversationDetailEntity['Role'];\n Message: string;\n CreatedAt: string;\n}\n\n/** Number of newest messages the Recent Turns card shows. */\nconst RECENT_MESSAGE_COUNT = 4;\n\n@RegisterClassEx(BaseFormPanel, {\n key: 'form-panel:MJ: Conversations:overview',\n metadata: {\n entity: 'MJ: Conversations',\n slot: 'before-fields',\n sortKey: 10,\n },\n})\n@Component({\n selector: 'mj-conversation-overview-panel',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"mj-convo-overview-grid\">\n <!-- Card 1: Message Flow Metrics -->\n <div class=\"mj-overview-card\">\n <div class=\"mj-card-header\">\n <div class=\"mj-card-title\"><i class=\"fa-solid fa-comments\" style=\"color: var(--mj-brand-primary, #38bdf8);\"></i> Turn Summary</div>\n @if (!LoadError) {\n <span class=\"mj-card-badge\">{{ TotalMessageCount }} Turns</span>\n }\n </div>\n <div class=\"mj-card-body\">\n @if (LoadError) {\n <span class=\"mj-load-error\">{{ LoadError }}</span>\n } @else {\n <div class=\"mj-metric-row\">\n <span class=\"mj-metric-label\">Total Messages</span>\n <span class=\"mj-metric-val\">{{ TotalMessageCount }}</span>\n </div>\n @if (ForkCount > 0) {\n <div class=\"mj-fork-note\">plus {{ ForkCount }} {{ ForkCount === 1 ? 'fork' : 'forks' }}</div>\n }\n <div class=\"mj-metric-row\">\n <span class=\"mj-metric-label\">User Prompts</span>\n <span class=\"mj-metric-val\">{{ UserMessageCount }}</span>\n </div>\n <div class=\"mj-metric-row\">\n <span class=\"mj-metric-label\">Agent Responses</span>\n <span class=\"mj-metric-val\">{{ AgentMessageCount }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Card 2: Recent Activity Stream -->\n <div class=\"mj-overview-card\">\n <div class=\"mj-card-header\">\n <div class=\"mj-card-title\"><i class=\"fa-solid fa-clock-rotate-left\" style=\"color: #10b981;\"></i> Recent Turns</div>\n <span class=\"mj-card-badge\">History</span>\n </div>\n <div class=\"mj-card-body\">\n @if (LoadError) {\n <span class=\"mj-load-error\">{{ LoadError }}</span>\n } @else if (Messages.length === 0) {\n <span style=\"font-size: 12px; color: var(--mj-text-muted);\">No messages in this conversation yet.</span>\n } @else {\n @for (msg of RecentMessages; track msg.ID) {\n <div class=\"mj-metric-row\">\n <span class=\"mj-metric-label\" style=\"text-overflow: ellipsis; overflow: hidden; white-space: nowrap; max-width: 200px;\">\n <strong>{{ msg.Role }}:</strong> {{ msg.Message }}\n </span>\n <span class=\"mj-pill\" [class.mj-pill-blue]=\"IsUserTurn(msg)\" [class.mj-pill-green]=\"IsAgentTurn(msg)\">\n {{ msg.Role }}\n </span>\n </div>\n }\n }\n </div>\n </div>\n </div>\n `,\n styles: [`\n :host { display: block; width: 100%; margin-bottom: 20px; }\n .mj-convo-overview-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 16px;\n }\n .mj-overview-card {\n background: var(--mj-bg-surface-card, #141f36);\n border: 1px solid var(--mj-border-default, #223254);\n border-radius: 10px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n .mj-card-header {\n padding: 10px 14px;\n background: var(--mj-bg-surface, #111a2e);\n border-bottom: 1px solid var(--mj-border-default, #223254);\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .mj-card-title {\n font-size: 12.5px;\n font-weight: 700;\n color: var(--mj-text-primary, #f8fafc);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .mj-card-badge {\n font-size: 11px;\n padding: 2px 7px;\n border-radius: 9999px;\n background: var(--mj-bg-surface-elevated, #1a2744);\n color: var(--mj-text-secondary, #94a3b8);\n border: 1px solid var(--mj-border-default, #223254);\n }\n .mj-card-body {\n padding: 14px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n .mj-metric-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 12px;\n }\n .mj-metric-label { color: var(--mj-text-secondary, #94a3b8); }\n .mj-fork-note { font-size: 11px; color: var(--mj-text-muted); margin-top: -6px; }\n .mj-metric-val { font-weight: 600; color: var(--mj-text-primary, #f8fafc); font-family: monospace; }\n .mj-load-error { font-size: 12px; color: var(--mj-status-error); }\n .mj-pill { font-size: 10.5px; font-weight: 700; padding: 2px 6px; border-radius: 4px; }\n .mj-pill-green { background: rgba(16, 185, 129, 0.15); color: #10b981; }\n .mj-pill-blue { background: rgba(56, 189, 248, 0.15); color: #38bdf8; }\n `]\n})\nexport class ConversationOverviewPanel extends BaseFormPanel<MJConversationEntity> implements OnInit {\n private cdr = inject(ChangeDetectorRef);\n /** The newest messages in Main, newest first. */\n public Messages: ConversationDetailRow[] = [];\n /** Messages in Main. */\n public TotalMessageCount = 0;\n /** User messages in Main. */\n public UserMessageCount = 0;\n /** AI messages in Main. */\n public AgentMessageCount = 0;\n /** Forks of the conversation. */\n public ForkCount = 0;\n /** Set when a read fails, so the cards show the failure instead of zero messages. */\n public LoadError: string | null = null;\n\n public ngOnInit(): void {\n this.loadConversationMessages();\n }\n\n /** A turn the user sent. `Role` is stored as 'User', 'AI' or 'Error'. */\n protected IsUserTurn(detail: ConversationDetailRow): boolean {\n return detail.Role === 'User';\n }\n\n /** A turn an agent sent. An 'Error' turn is neither a user turn nor an agent turn. */\n protected IsAgentTurn(detail: ConversationDetailRow): boolean {\n return detail.Role === 'AI';\n }\n\n public get RecentMessages(): ConversationDetailRow[] {\n return this.Messages.slice(0, RECENT_MESSAGE_COUNT);\n }\n\n /** The host form's provider, or the default provider when the panel has no host form. */\n private get providerToUse(): IMetadataProvider {\n return this.FormComponent?.ProviderToUse ?? Metadata.Provider; // global-provider-ok: BaseFormPanel has no Provider input; a panel without a host form uses the default provider\n }\n\n /**\n * Loads the counts and newest messages in Main, and the conversation's fork count, in one\n * batch. When a detail read fails, the cards show the failure.\n */\n private async loadConversationMessages(): Promise<void> {\n if (!this.Record?.ID) return;\n const provider = this.providerToUse;\n const scope = ConversationEngine.TrunkScope(this.Record.ID);\n try {\n const rv = RunView.FromMetadataProvider(provider);\n const [total, user, agent, recent, forks] = await rv.RunViews<ConversationDetailRow>([\n {\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: ConversationEngine.ScopeFilter(scope),\n ResultType: 'count_only',\n },\n {\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: `${ConversationEngine.ScopeFilter(scope)} AND [Role]='User'`,\n ResultType: 'count_only',\n },\n {\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: `${ConversationEngine.ScopeFilter(scope)} AND [Role]='AI'`,\n ResultType: 'count_only',\n },\n {\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: ConversationEngine.ScopeFilter(scope),\n Fields: ['ID', 'Role', 'Message', '__mj_CreatedAt'],\n OrderBy: 'Sequence DESC',\n MaxRows: RECENT_MESSAGE_COUNT,\n ResultType: 'simple',\n },\n {\n EntityName: 'MJ: Conversation Branches',\n ExtraFilter: `ConversationID='${EscapeSQLString(this.Record.ID)}'`,\n ResultType: 'count_only',\n },\n ], provider.CurrentUser);\n const detailReads = [total, user, agent, recent];\n const failed = detailReads.findIndex(r => !r?.Success);\n if (failed >= 0) {\n this.showLoadError(detailReads[failed]?.ErrorMessage);\n } else {\n this.TotalMessageCount = total?.TotalRowCount ?? 0;\n this.UserMessageCount = user?.TotalRowCount ?? 0;\n this.AgentMessageCount = agent?.TotalRowCount ?? 0;\n this.Messages = recent?.Results ?? [];\n }\n this.ForkCount = forks?.Success ? forks.TotalRowCount ?? 0 : 0;\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n LogError(`Conversation overview: could not load the details of conversation ${this.Record.ID}: ${message}`);\n this.showLoadError(message);\n }\n this.cdr.markForCheck();\n }\n\n /** Shows a short \"could not load\" line, with the underlying message when there is one. */\n private showLoadError(detail: string | undefined): void {\n this.LoadError = detail ? `Could not load messages: ${detail}` : 'Could not load messages.';\n }\n}\n"]}
@@ -0,0 +1,35 @@
1
+ import type { RemoteOpResult } from '@memberjunction/core';
2
+ import { type MJDiagnosticSenderRegistrationEntity } from '@memberjunction/core-entities';
3
+ import { BaseFormToolbarAction, FormToolbarActionLifecycleContext } from '@memberjunction/ng-base-forms';
4
+ /** Shared run, notify and reload flow for the sender registration status actions. */
5
+ declare abstract class SenderRegistrationStatusAction extends BaseFormToolbarAction {
6
+ /** Returns the form's record as a sender registration. */
7
+ protected RegistrationOf(ctx: FormToolbarActionLifecycleContext): MJDiagnosticSenderRegistrationEntity;
8
+ /**
9
+ * Runs `call` with the button in its loading state. On success, reloads the record and shows
10
+ * `successMessage`, or a warning to reload when the reload fails. On failure, shows the
11
+ * server's error and leaves the record unchanged.
12
+ */
13
+ protected RunOperation(ctx: FormToolbarActionLifecycleContext, call: () => Promise<RemoteOpResult<object>>, successMessage: string, failureMessage: string): Promise<void>;
14
+ }
15
+ /**
16
+ * Revoke button on the sender registration form. Shown on a saved registration that is not
17
+ * Revoked. Asks for confirmation through `MJConfirmService` from `ctx.Injector`, then calls
18
+ * `Diagnostics.RevokeSender`. Without a confirm service it shows an error and makes no call.
19
+ */
20
+ export declare class DiagnosticsRevokeSenderToolbarAction extends SenderRegistrationStatusAction {
21
+ IsApplicable(ctx: FormToolbarActionLifecycleContext): boolean;
22
+ OnExecute(ctx: FormToolbarActionLifecycleContext): Promise<void>;
23
+ }
24
+ /**
25
+ * Reactivate button on the sender registration form. Shown on a saved Revoked registration that
26
+ * has an enrolled key. Calls `Diagnostics.ReactivateSender`.
27
+ */
28
+ export declare class DiagnosticsReactivateSenderToolbarAction extends SenderRegistrationStatusAction {
29
+ IsApplicable(ctx: FormToolbarActionLifecycleContext): boolean;
30
+ OnExecute(ctx: FormToolbarActionLifecycleContext): Promise<void>;
31
+ }
32
+ /** Keeps this file in the bundle so its toolbar actions register. */
33
+ export declare function LoadDiagnosticSenderRegistrationToolbarActions(): void;
34
+ export {};
35
+ //# sourceMappingURL=sender-registration-toolbar-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sender-registration-toolbar-actions.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/DiagnosticSenderRegistrations/sender-registration-toolbar-actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAGH,KAAK,oCAAoC,EAC5C,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACH,qBAAqB,EACrB,iCAAiC,EAEpC,MAAM,+BAA+B,CAAC;AAQvC,qFAAqF;AACrF,uBAAe,8BAA+B,SAAQ,qBAAqB;IACvE,0DAA0D;IAC1D,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,iCAAiC,GAAG,oCAAoC;IAItG;;;;OAIG;cACa,YAAY,CACxB,GAAG,EAAE,iCAAiC,EACtC,IAAI,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAC3C,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC;CAqBnB;AA0BD;;;;GAIG;AACH,qBAYa,oCAAqC,SAAQ,8BAA8B;IACpE,YAAY,CAAC,GAAG,EAAE,iCAAiC,GAAG,OAAO;IAKvD,SAAS,CAAC,GAAG,EAAE,iCAAiC,GAAG,OAAO,CAAC,IAAI,CAAC;CAuBzF;AAED;;;GAGG;AACH,qBAWa,wCAAyC,SAAQ,8BAA8B;IACxE,YAAY,CAAC,GAAG,EAAE,iCAAiC,GAAG,OAAO;IAUvD,SAAS,CAAC,GAAG,EAAE,iCAAiC,GAAG,OAAO,CAAC,IAAI,CAAC;CAUzF;AAED,qEAAqE;AACrE,wBAAgB,8CAA8C,IAAI,IAAI,CAErE"}
@@ -0,0 +1,155 @@
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 { DiagnosticsReactivateSenderOperation, DiagnosticsRevokeSenderOperation, } from '@memberjunction/core-entities';
8
+ import { BaseFormToolbarAction, RegisterFormToolbarAction, } from '@memberjunction/ng-base-forms';
9
+ import { MJNotificationService } from '@memberjunction/ng-notifications';
10
+ import { MJConfirmService } from '@memberjunction/ng-ui-components';
11
+ const SENDER_REGISTRATIONS_ENTITY = 'MJ: Diagnostic Sender Registrations';
12
+ const SUCCESS_DURATION_MS = 3000;
13
+ const ERROR_DURATION_MS = 6000;
14
+ /** Shared run, notify and reload flow for the sender registration status actions. */
15
+ class SenderRegistrationStatusAction extends BaseFormToolbarAction {
16
+ /** Returns the form's record as a sender registration. */
17
+ RegistrationOf(ctx) {
18
+ return ctx.Record;
19
+ }
20
+ /**
21
+ * Runs `call` with the button in its loading state. On success, reloads the record and shows
22
+ * `successMessage`, or a warning to reload when the reload fails. On failure, shows the
23
+ * server's error and leaves the record unchanged.
24
+ */
25
+ async RunOperation(ctx, call, successMessage, failureMessage) {
26
+ ctx.SetLoading(true);
27
+ ctx.RequestChangeDetection();
28
+ try {
29
+ const result = await call();
30
+ if (!result.Success) {
31
+ notify(result.ErrorMessage || failureMessage, 'error', ERROR_DURATION_MS);
32
+ return;
33
+ }
34
+ if (await reloadRecord(ctx)) {
35
+ notify(successMessage, 'success', SUCCESS_DURATION_MS);
36
+ }
37
+ else {
38
+ notify(`${successMessage} Reload the record to see the new status.`, 'warning', ERROR_DURATION_MS);
39
+ }
40
+ }
41
+ catch (e) {
42
+ notify(e instanceof Error && e.message ? e.message : failureMessage, 'error', ERROR_DURATION_MS);
43
+ }
44
+ finally {
45
+ ctx.SetLoading(false);
46
+ ctx.RequestChangeDetection();
47
+ }
48
+ }
49
+ }
50
+ /** Resolves MJConfirmService from the form container's injector, or null when it cannot. */
51
+ function confirmServiceOf(ctx) {
52
+ try {
53
+ return ctx.Injector?.get(MJConfirmService, null, { optional: true }) ?? null;
54
+ }
55
+ catch {
56
+ return null;
57
+ }
58
+ }
59
+ function notify(message, style, duration) {
60
+ MJNotificationService.Instance.CreateSimpleNotification(message, style, duration);
61
+ }
62
+ /**
63
+ * Reloads the record through the form, so the form and its toolbar show the new status. The
64
+ * form's own "Record refreshed" notification is skipped. Returns false when the reload fails.
65
+ */
66
+ async function reloadRecord(ctx) {
67
+ if (ctx.FormComponent) {
68
+ return ctx.FormComponent.RefreshRecord({ ShowSuccessNotification: false });
69
+ }
70
+ return ctx.Record.Refresh();
71
+ }
72
+ /**
73
+ * Revoke button on the sender registration form. Shown on a saved registration that is not
74
+ * Revoked. Asks for confirmation through `MJConfirmService` from `ctx.Injector`, then calls
75
+ * `Diagnostics.RevokeSender`. Without a confirm service it shows an error and makes no call.
76
+ */
77
+ let DiagnosticsRevokeSenderToolbarAction = class DiagnosticsRevokeSenderToolbarAction extends SenderRegistrationStatusAction {
78
+ IsApplicable(ctx) {
79
+ const registration = this.RegistrationOf(ctx);
80
+ return Boolean(registration?.IsSaved && registration.Status !== 'Revoked');
81
+ }
82
+ async OnExecute(ctx) {
83
+ if (this.IsLoading)
84
+ return;
85
+ const confirmService = confirmServiceOf(ctx);
86
+ if (!confirmService) {
87
+ notify('Cannot open the confirmation dialog, so the sender was not revoked.', 'error', ERROR_DURATION_MS);
88
+ return;
89
+ }
90
+ const registration = this.RegistrationOf(ctx);
91
+ const confirmed = await confirmService.Confirm({
92
+ title: 'Revoke sender',
93
+ message: `Revoke the sender registration for '${registration.InstallID}'?`,
94
+ detail: 'The collector refuses bundles from this sender. A sender with an enrolled key can be reactivated later.',
95
+ type: 'danger',
96
+ confirmText: 'Revoke',
97
+ });
98
+ if (!confirmed)
99
+ return;
100
+ await this.RunOperation(ctx, () => new DiagnosticsRevokeSenderOperation().Execute({ RegistrationID: registration.ID }, { provider: ctx.Provider }), 'Sender revoked.', 'Could not revoke the sender.');
101
+ }
102
+ };
103
+ DiagnosticsRevokeSenderToolbarAction = __decorate([
104
+ RegisterFormToolbarAction({
105
+ Key: 'diagnostics-revoke-sender',
106
+ EntityScope: SENDER_REGISTRATIONS_ENTITY,
107
+ Text: 'Revoke',
108
+ Description: 'Revoke this sender so it can no longer send bundles',
109
+ Icon: 'fa-solid fa-ban',
110
+ Variant: 'danger',
111
+ Mode: 'read',
112
+ Placement: 'actions',
113
+ Order: 40,
114
+ Pinnable: false,
115
+ })
116
+ ], DiagnosticsRevokeSenderToolbarAction);
117
+ export { DiagnosticsRevokeSenderToolbarAction };
118
+ /**
119
+ * Reactivate button on the sender registration form. Shown on a saved Revoked registration that
120
+ * has an enrolled key. Calls `Diagnostics.ReactivateSender`.
121
+ */
122
+ let DiagnosticsReactivateSenderToolbarAction = class DiagnosticsReactivateSenderToolbarAction extends SenderRegistrationStatusAction {
123
+ IsApplicable(ctx) {
124
+ const registration = this.RegistrationOf(ctx);
125
+ return Boolean(registration?.IsSaved &&
126
+ registration.Status === 'Revoked' &&
127
+ registration.KeyID &&
128
+ registration.PublicKeyBase64);
129
+ }
130
+ async OnExecute(ctx) {
131
+ if (this.IsLoading)
132
+ return;
133
+ const registration = this.RegistrationOf(ctx);
134
+ await this.RunOperation(ctx, () => new DiagnosticsReactivateSenderOperation().Execute({ RegistrationID: registration.ID }, { provider: ctx.Provider }), 'Sender reactivated.', 'Could not reactivate the sender.');
135
+ }
136
+ };
137
+ DiagnosticsReactivateSenderToolbarAction = __decorate([
138
+ RegisterFormToolbarAction({
139
+ Key: 'diagnostics-reactivate-sender',
140
+ EntityScope: SENDER_REGISTRATIONS_ENTITY,
141
+ Text: 'Reactivate',
142
+ Description: 'Set this revoked sender back to Active',
143
+ Icon: 'fa-solid fa-rotate-left',
144
+ Mode: 'read',
145
+ Placement: 'actions',
146
+ Order: 41,
147
+ Pinnable: false,
148
+ })
149
+ ], DiagnosticsReactivateSenderToolbarAction);
150
+ export { DiagnosticsReactivateSenderToolbarAction };
151
+ /** Keeps this file in the bundle so its toolbar actions register. */
152
+ export function LoadDiagnosticSenderRegistrationToolbarActions() {
153
+ /* no-op marker */
154
+ }
155
+ //# sourceMappingURL=sender-registration-toolbar-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sender-registration-toolbar-actions.js","sourceRoot":"","sources":["../../../../src/lib/custom/DiagnosticSenderRegistrations/sender-registration-toolbar-actions.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EACH,oCAAoC,EACpC,gCAAgC,GAEnC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACH,qBAAqB,EAErB,yBAAyB,GAC5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,MAAM,2BAA2B,GAAG,qCAAqC,CAAC;AAC1E,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACjC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B,qFAAqF;AACrF,MAAe,8BAA+B,SAAQ,qBAAqB;IACvE,0DAA0D;IAChD,cAAc,CAAC,GAAsC;QAC3D,OAAO,GAAG,CAAC,MAA8C,CAAC;IAC9D,CAAC;IAED;;;;OAIG;IACO,KAAK,CAAC,YAAY,CACxB,GAAsC,EACtC,IAA2C,EAC3C,cAAsB,EACtB,cAAsB;QAEtB,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACrB,GAAG,CAAC,sBAAsB,EAAE,CAAC;QAC7B,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,CAAC,MAAM,CAAC,YAAY,IAAI,cAAc,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;gBAC1E,OAAO;YACX,CAAC;YACD,IAAI,MAAM,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,cAAc,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,GAAG,cAAc,2CAA2C,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;YACvG,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,MAAM,CAAC,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;QACrG,CAAC;gBAAS,CAAC;YACP,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACtB,GAAG,CAAC,sBAAsB,EAAE,CAAC;QACjC,CAAC;IACL,CAAC;CACJ;AAED,4FAA4F;AAC5F,SAAS,gBAAgB,CAAC,GAAsC;IAC5D,IAAI,CAAC;QACD,OAAO,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,SAAS,MAAM,CAAC,OAAe,EAAE,KAAsC,EAAE,QAAgB;IACrF,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AACtF,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,YAAY,CAAC,GAAsC;IAC9D,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;AAChC,CAAC;AAED;;;;GAIG;AAaI,IAAM,oCAAoC,GAA1C,MAAM,oCAAqC,SAAQ,8BAA8B;IACpE,YAAY,CAAC,GAAsC;QAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,OAAO,CAAC,YAAY,EAAE,OAAO,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAC/E,CAAC;IAEe,KAAK,CAAC,SAAS,CAAC,GAAsC;QAClE,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,MAAM,cAAc,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,cAAc,EAAE,CAAC;YAClB,MAAM,CAAC,qEAAqE,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;YAC1G,OAAO;QACX,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC;YAC3C,KAAK,EAAE,eAAe;YACtB,OAAO,EAAE,uCAAuC,YAAY,CAAC,SAAS,IAAI;YAC1E,MAAM,EAAE,yGAAyG;YACjH,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,QAAQ;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,MAAM,IAAI,CAAC,YAAY,CACnB,GAAG,EACH,GAAG,EAAE,CAAC,IAAI,gCAAgC,EAAE,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,EACrH,iBAAiB,EACjB,8BAA8B,CACjC,CAAC;IACN,CAAC;CACJ,CAAA;AA7BY,oCAAoC;IAZhD,yBAAyB,CAAC;QACvB,GAAG,EAAE,2BAA2B;QAChC,WAAW,EAAE,2BAA2B;QACxC,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,qDAAqD;QAClE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,KAAK;KAClB,CAAC;GACW,oCAAoC,CA6BhD;;AAED;;;GAGG;AAYI,IAAM,wCAAwC,GAA9C,MAAM,wCAAyC,SAAQ,8BAA8B;IACxE,YAAY,CAAC,GAAsC;QAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,OAAO,CACV,YAAY,EAAE,OAAO;YACrB,YAAY,CAAC,MAAM,KAAK,SAAS;YACjC,YAAY,CAAC,KAAK;YAClB,YAAY,CAAC,eAAe,CAC/B,CAAC;IACN,CAAC;IAEe,KAAK,CAAC,SAAS,CAAC,GAAsC;QAClE,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,IAAI,CAAC,YAAY,CACnB,GAAG,EACH,GAAG,EAAE,CAAC,IAAI,oCAAoC,EAAE,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,EACzH,qBAAqB,EACrB,kCAAkC,CACrC,CAAC;IACN,CAAC;CACJ,CAAA;AArBY,wCAAwC;IAXpD,yBAAyB,CAAC;QACvB,GAAG,EAAE,+BAA+B;QACpC,WAAW,EAAE,2BAA2B;QACxC,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,wCAAwC;QACrD,IAAI,EAAE,yBAAyB;QAC/B,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,KAAK;KAClB,CAAC;GACW,wCAAwC,CAqBpD;;AAED,qEAAqE;AACrE,MAAM,UAAU,8CAA8C;IAC1D,kBAAkB;AACtB,CAAC","sourcesContent":["import type { RemoteOpResult } from '@memberjunction/core';\nimport {\n DiagnosticsReactivateSenderOperation,\n DiagnosticsRevokeSenderOperation,\n type MJDiagnosticSenderRegistrationEntity,\n} from '@memberjunction/core-entities';\nimport {\n BaseFormToolbarAction,\n FormToolbarActionLifecycleContext,\n RegisterFormToolbarAction,\n} from '@memberjunction/ng-base-forms';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { MJConfirmService } from '@memberjunction/ng-ui-components';\n\nconst SENDER_REGISTRATIONS_ENTITY = 'MJ: Diagnostic Sender Registrations';\nconst SUCCESS_DURATION_MS = 3000;\nconst ERROR_DURATION_MS = 6000;\n\n/** Shared run, notify and reload flow for the sender registration status actions. */\nabstract class SenderRegistrationStatusAction extends BaseFormToolbarAction {\n /** Returns the form's record as a sender registration. */\n protected RegistrationOf(ctx: FormToolbarActionLifecycleContext): MJDiagnosticSenderRegistrationEntity {\n return ctx.Record as MJDiagnosticSenderRegistrationEntity;\n }\n\n /**\n * Runs `call` with the button in its loading state. On success, reloads the record and shows\n * `successMessage`, or a warning to reload when the reload fails. On failure, shows the\n * server's error and leaves the record unchanged.\n */\n protected async RunOperation(\n ctx: FormToolbarActionLifecycleContext,\n call: () => Promise<RemoteOpResult<object>>,\n successMessage: string,\n failureMessage: string\n ): Promise<void> {\n ctx.SetLoading(true);\n ctx.RequestChangeDetection();\n try {\n const result = await call();\n if (!result.Success) {\n notify(result.ErrorMessage || failureMessage, 'error', ERROR_DURATION_MS);\n return;\n }\n if (await reloadRecord(ctx)) {\n notify(successMessage, 'success', SUCCESS_DURATION_MS);\n } else {\n notify(`${successMessage} Reload the record to see the new status.`, 'warning', ERROR_DURATION_MS);\n }\n } catch (e) {\n notify(e instanceof Error && e.message ? e.message : failureMessage, 'error', ERROR_DURATION_MS);\n } finally {\n ctx.SetLoading(false);\n ctx.RequestChangeDetection();\n }\n }\n}\n\n/** Resolves MJConfirmService from the form container's injector, or null when it cannot. */\nfunction confirmServiceOf(ctx: FormToolbarActionLifecycleContext): MJConfirmService | null {\n try {\n return ctx.Injector?.get(MJConfirmService, null, { optional: true }) ?? null;\n } catch {\n return null;\n }\n}\n\nfunction notify(message: string, style: 'success' | 'warning' | 'error', duration: number): void {\n MJNotificationService.Instance.CreateSimpleNotification(message, style, duration);\n}\n\n/**\n * Reloads the record through the form, so the form and its toolbar show the new status. The\n * form's own \"Record refreshed\" notification is skipped. Returns false when the reload fails.\n */\nasync function reloadRecord(ctx: FormToolbarActionLifecycleContext): Promise<boolean> {\n if (ctx.FormComponent) {\n return ctx.FormComponent.RefreshRecord({ ShowSuccessNotification: false });\n }\n return ctx.Record.Refresh();\n}\n\n/**\n * Revoke button on the sender registration form. Shown on a saved registration that is not\n * Revoked. Asks for confirmation through `MJConfirmService` from `ctx.Injector`, then calls\n * `Diagnostics.RevokeSender`. Without a confirm service it shows an error and makes no call.\n */\n@RegisterFormToolbarAction({\n Key: 'diagnostics-revoke-sender',\n EntityScope: SENDER_REGISTRATIONS_ENTITY,\n Text: 'Revoke',\n Description: 'Revoke this sender so it can no longer send bundles',\n Icon: 'fa-solid fa-ban',\n Variant: 'danger',\n Mode: 'read',\n Placement: 'actions',\n Order: 40,\n Pinnable: false,\n})\nexport class DiagnosticsRevokeSenderToolbarAction extends SenderRegistrationStatusAction {\n public override IsApplicable(ctx: FormToolbarActionLifecycleContext): boolean {\n const registration = this.RegistrationOf(ctx);\n return Boolean(registration?.IsSaved && registration.Status !== 'Revoked');\n }\n\n public override async OnExecute(ctx: FormToolbarActionLifecycleContext): Promise<void> {\n if (this.IsLoading) return;\n const confirmService = confirmServiceOf(ctx);\n if (!confirmService) {\n notify('Cannot open the confirmation dialog, so the sender was not revoked.', 'error', ERROR_DURATION_MS);\n return;\n }\n const registration = this.RegistrationOf(ctx);\n const confirmed = await confirmService.Confirm({\n title: 'Revoke sender',\n message: `Revoke the sender registration for '${registration.InstallID}'?`,\n detail: 'The collector refuses bundles from this sender. A sender with an enrolled key can be reactivated later.',\n type: 'danger',\n confirmText: 'Revoke',\n });\n if (!confirmed) return;\n await this.RunOperation(\n ctx,\n () => new DiagnosticsRevokeSenderOperation().Execute({ RegistrationID: registration.ID }, { provider: ctx.Provider }),\n 'Sender revoked.',\n 'Could not revoke the sender.'\n );\n }\n}\n\n/**\n * Reactivate button on the sender registration form. Shown on a saved Revoked registration that\n * has an enrolled key. Calls `Diagnostics.ReactivateSender`.\n */\n@RegisterFormToolbarAction({\n Key: 'diagnostics-reactivate-sender',\n EntityScope: SENDER_REGISTRATIONS_ENTITY,\n Text: 'Reactivate',\n Description: 'Set this revoked sender back to Active',\n Icon: 'fa-solid fa-rotate-left',\n Mode: 'read',\n Placement: 'actions',\n Order: 41,\n Pinnable: false,\n})\nexport class DiagnosticsReactivateSenderToolbarAction extends SenderRegistrationStatusAction {\n public override IsApplicable(ctx: FormToolbarActionLifecycleContext): boolean {\n const registration = this.RegistrationOf(ctx);\n return Boolean(\n registration?.IsSaved &&\n registration.Status === 'Revoked' &&\n registration.KeyID &&\n registration.PublicKeyBase64\n );\n }\n\n public override async OnExecute(ctx: FormToolbarActionLifecycleContext): Promise<void> {\n if (this.IsLoading) return;\n const registration = this.RegistrationOf(ctx);\n await this.RunOperation(\n ctx,\n () => new DiagnosticsReactivateSenderOperation().Execute({ RegistrationID: registration.ID }, { provider: ctx.Provider }),\n 'Sender reactivated.',\n 'Could not reactivate the sender.'\n );\n }\n}\n\n/** Keeps this file in the bundle so its toolbar actions register. */\nexport function LoadDiagnosticSenderRegistrationToolbarActions(): void {\n /* no-op marker */\n}\n"]}