@memberjunction/ng-core-entity-forms 5.30.0 → 5.31.0

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 (163) hide show
  1. package/dist/lib/__tests__/content-source-form.test.d.ts +2 -0
  2. package/dist/lib/__tests__/content-source-form.test.d.ts.map +1 -0
  3. package/dist/lib/__tests__/content-source-form.test.js +183 -0
  4. package/dist/lib/__tests__/content-source-form.test.js.map +1 -0
  5. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts +2 -1
  6. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
  7. package/dist/lib/custom/AIAgents/add-action-dialog.component.js +6 -4
  8. package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
  9. package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js +2 -2
  10. package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js.map +1 -1
  11. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +2 -1
  12. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -1
  13. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +6 -4
  14. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -1
  15. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +15 -15
  16. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  17. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +2 -1
  18. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
  19. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +9 -7
  20. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -1
  21. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +2 -1
  22. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
  23. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +11 -9
  24. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
  25. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts +2 -1
  26. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
  27. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +6 -5
  28. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
  29. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +2 -1
  30. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
  31. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +6 -4
  32. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
  33. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +2 -1
  34. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
  35. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +6 -4
  36. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -1
  37. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +2 -1
  38. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
  39. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +6 -4
  40. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
  41. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +3 -3
  42. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  43. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts +1 -1
  44. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
  45. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +6 -6
  46. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  47. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +2 -1
  48. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -1
  49. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +7 -5
  50. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -1
  51. package/dist/lib/custom/Actions/action-execution-log-form.component.js +3 -3
  52. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  53. package/dist/lib/custom/Actions/action-form.component.js +12 -12
  54. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  55. package/dist/lib/custom/ContentSources/content-source-form.component.d.ts +59 -5
  56. package/dist/lib/custom/ContentSources/content-source-form.component.d.ts.map +1 -1
  57. package/dist/lib/custom/ContentSources/content-source-form.component.js +379 -34
  58. package/dist/lib/custom/ContentSources/content-source-form.component.js.map +1 -1
  59. package/dist/lib/custom/Entities/entity-form.component.d.ts +1 -1
  60. package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
  61. package/dist/lib/custom/Entities/entity-form.component.js +5 -5
  62. package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
  63. package/dist/lib/custom/Lists/list-form.component.d.ts +1 -1
  64. package/dist/lib/custom/Lists/list-form.component.d.ts.map +1 -1
  65. package/dist/lib/custom/Lists/list-form.component.js +10 -10
  66. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  67. package/dist/lib/custom/Queries/query-category-dialog.component.d.ts +2 -1
  68. package/dist/lib/custom/Queries/query-category-dialog.component.d.ts.map +1 -1
  69. package/dist/lib/custom/Queries/query-category-dialog.component.js +9 -7
  70. package/dist/lib/custom/Queries/query-category-dialog.component.js.map +1 -1
  71. package/dist/lib/custom/Queries/query-form.component.js +17 -17
  72. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  73. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts +2 -1
  74. package/dist/lib/custom/Queries/query-run-dialog.component.d.ts.map +1 -1
  75. package/dist/lib/custom/Queries/query-run-dialog.component.js +7 -6
  76. package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
  77. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts +2 -1
  78. package/dist/lib/custom/Templates/template-param-dialog.component.d.ts.map +1 -1
  79. package/dist/lib/custom/Templates/template-param-dialog.component.js +10 -8
  80. package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
  81. package/dist/lib/custom/Templates/template-params-grid.component.d.ts +2 -1
  82. package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
  83. package/dist/lib/custom/Templates/template-params-grid.component.js +9 -7
  84. package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
  85. package/dist/lib/custom/Templates/templates-form.component.js +8 -8
  86. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  87. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts +3 -2
  88. package/dist/lib/custom/Tests/entity-link-pill.component.d.ts.map +1 -1
  89. package/dist/lib/custom/Tests/entity-link-pill.component.js +8 -6
  90. package/dist/lib/custom/Tests/entity-link-pill.component.js.map +1 -1
  91. package/dist/lib/custom/Tests/test-form.component.d.ts +1 -1
  92. package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
  93. package/dist/lib/custom/Tests/test-form.component.js +7 -7
  94. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  95. package/dist/lib/custom/Tests/test-run-form.component.js +5 -5
  96. package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
  97. package/dist/lib/custom/Tests/test-suite-form.component.d.ts +1 -1
  98. package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
  99. package/dist/lib/custom/Tests/test-suite-form.component.js +8 -8
  100. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  101. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts +1 -1
  102. package/dist/lib/custom/Tests/test-suite-run-form.component.d.ts.map +1 -1
  103. package/dist/lib/custom/Tests/test-suite-run-form.component.js +6 -6
  104. package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
  105. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts +2 -1
  106. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.d.ts.map +1 -1
  107. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +8 -6
  108. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  109. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts +9 -0
  110. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
  111. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +15 -3
  112. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
  113. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts +3 -2
  114. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  115. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +10 -5
  116. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  117. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +2 -2
  118. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  119. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +2 -1
  120. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
  121. package/dist/lib/custom/shared/entity-selector-dialog.component.js +6 -4
  122. package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
  123. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.d.ts.map +1 -1
  124. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js +46 -28
  125. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
  126. package/dist/lib/generated/Entities/MJCompanyIntegrationEntityMap/mjcompanyintegrationentitymap.form.component.js +10 -10
  127. package/dist/lib/generated/Entities/MJCompanyIntegrationEntityMap/mjcompanyintegrationentitymap.form.component.js.map +1 -1
  128. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.d.ts.map +1 -1
  129. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js +25 -7
  130. package/dist/lib/generated/Entities/MJContentItem/mjcontentitem.form.component.js.map +1 -1
  131. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.d.ts.map +1 -1
  132. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js +25 -7
  133. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js.map +1 -1
  134. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
  135. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +106 -88
  136. package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
  137. package/dist/lib/generated/Entities/MJTag/mjtag.form.component.d.ts.map +1 -1
  138. package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js +181 -61
  139. package/dist/lib/generated/Entities/MJTag/mjtag.form.component.js.map +1 -1
  140. package/dist/lib/generated/Entities/MJTagScope/mjtagscope.form.component.d.ts +10 -0
  141. package/dist/lib/generated/Entities/MJTagScope/mjtagscope.form.component.d.ts.map +1 -0
  142. package/dist/lib/generated/Entities/MJTagScope/mjtagscope.form.component.js +63 -0
  143. package/dist/lib/generated/Entities/MJTagScope/mjtagscope.form.component.js.map +1 -0
  144. package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.d.ts +10 -0
  145. package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.d.ts.map +1 -0
  146. package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.js +95 -0
  147. package/dist/lib/generated/Entities/MJTagSuggestion/mjtagsuggestion.form.component.js.map +1 -0
  148. package/dist/lib/generated/Entities/MJTagSynonym/mjtagsynonym.form.component.d.ts +10 -0
  149. package/dist/lib/generated/Entities/MJTagSynonym/mjtagsynonym.form.component.d.ts.map +1 -0
  150. package/dist/lib/generated/Entities/MJTagSynonym/mjtagsynonym.form.component.js +63 -0
  151. package/dist/lib/generated/Entities/MJTagSynonym/mjtagsynonym.form.component.js.map +1 -0
  152. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
  153. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +199 -181
  154. package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
  155. package/dist/lib/generated/generated-forms.module.d.ts +51 -48
  156. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  157. package/dist/lib/generated/generated-forms.module.js +27 -18
  158. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  159. package/dist/lib/shared/components/template-editor.component.d.ts +3 -2
  160. package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
  161. package/dist/lib/shared/components/template-editor.component.js +8 -6
  162. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  163. package/package.json +37 -35
@@ -2,6 +2,7 @@ import { OnInit, OnDestroy, ChangeDetectorRef, EventEmitter } from '@angular/cor
2
2
  import { Subject, BehaviorSubject } from 'rxjs';
3
3
  import { FormControl } from '@angular/forms';
4
4
  import { MJTemplateEntity, MJTemplateCategoryEntity } from '@memberjunction/core-entities';
5
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
5
6
  import * as i0 from "@angular/core";
6
7
  export interface TemplateSelectorConfig {
7
8
  /** Title for the dialog */
@@ -27,7 +28,7 @@ export interface TemplateSelectorResult {
27
28
  * Template selector dialog that allows users to search and select from existing templates.
28
29
  * This dialog provides a searchable interface with category filtering and template preview.
29
30
  */
30
- export declare class TemplateSelectorDialogComponent implements OnInit, OnDestroy {
31
+ export declare class TemplateSelectorDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {
31
32
  private cdr;
32
33
  config: TemplateSelectorConfig;
33
34
  private destroy$;
@@ -1 +1 @@
1
- {"version":3,"file":"template-selector-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/AIPrompts/template-selector-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAU,YAAY,EAAE,MAAM,eAAe,CAAC;AACtG,OAAO,EAAE,OAAO,EAAE,eAAe,EAAiD,MAAM,MAAM,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAuB,MAAM,gBAAgB,CAAC;AAGlE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;;AAI3F,MAAM,WAAW,sBAAsB;IACrC,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gCAAgC;IAChC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,iCAAiC;IACjC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,yBAAyB;IACzB,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,qBAOa,+BAAgC,YAAW,MAAM,EAAE,SAAS;IA0BrE,OAAO,CAAC,GAAG;IAvBb,MAAM,EAAE,sBAAsB,CAAgC;IAG9D,OAAO,CAAC,QAAQ,CAAuB;IAChC,MAAM,yCAAgD;IAG7D,UAAU,2BAAuC;IACjD,UAAU,sCAA+C;IACzD,kBAAkB,sCAA+C;IACjE,WAAW,8CAAuD;IAGlE,aAAa,6BAAuB;IACpC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACvC,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAG3C,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAU;IAEzB,WAAW,qBAA4B;gBAGvC,GAAG,EAAE,iBAAiB;IAGhC,QAAQ;IAUR,WAAW;IAKX,OAAO,CAAC,WAAW;YAYL,QAAQ;YAqBR,aAAa;YAmCb,cAAc;IAwB5B,OAAO,CAAC,eAAe;IAwBvB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAK1C,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAOlD,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB;IAclD,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO;IAIvD,0BAA0B,IAAI,gBAAgB,EAAE;IAOhD,cAAc;IAId,sBAAsB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM;IAO1D,qBAAqB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM;IAOzD,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM;IAOtD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM;IAQ9C,eAAe;IAoBf,SAAS;IAUT,MAAM;yCApQK,+BAA+B;2CAA/B,+BAA+B;CAwQ3C"}
1
+ {"version":3,"file":"template-selector-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/AIPrompts/template-selector-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAU,YAAY,EAAE,MAAM,eAAe,CAAC;AACtG,OAAO,EAAE,OAAO,EAAE,eAAe,EAAiD,MAAM,MAAM,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAuB,MAAM,gBAAgB,CAAC;AAGlE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAI3F,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AACrE,MAAM,WAAW,sBAAsB;IACrC,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gCAAgC;IAChC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,iCAAiC;IACjC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,yBAAyB;IACzB,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,qBAOa,+BAAgC,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IA0BlG,OAAO,CAAC,GAAG;IAvBb,MAAM,EAAE,sBAAsB,CAAgC;IAG9D,OAAO,CAAC,QAAQ,CAAuB;IAChC,MAAM,yCAAgD;IAG7D,UAAU,2BAAuC;IACjD,UAAU,sCAA+C;IACzD,kBAAkB,sCAA+C;IACjE,WAAW,8CAAuD;IAGlE,aAAa,6BAAuB;IACpC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACvC,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAG3C,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAU;IAEzB,WAAW,qBAA4B;gBAGvC,GAAG,EAAE,iBAAiB;IAIhC,QAAQ;IAUR,WAAW;IAKX,OAAO,CAAC,WAAW;YAYL,QAAQ;YAqBR,aAAa;YAmCb,cAAc;IAwB5B,OAAO,CAAC,eAAe;IAwBvB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAK1C,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAOlD,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB;IAclD,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO;IAIvD,0BAA0B,IAAI,gBAAgB,EAAE;IAOhD,cAAc;IAId,sBAAsB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM;IAO1D,qBAAqB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM;IAOzD,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM;IAOtD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM;IAQ9C,eAAe;IAoBf,SAAS;IAUT,MAAM;yCArQK,+BAA+B;2CAA/B,+BAA+B;CAyQ3C"}
@@ -5,6 +5,7 @@ import { CommonModule } from '@angular/common';
5
5
  import { RunView } from '@memberjunction/core';
6
6
  import { MJNotificationService } from '@memberjunction/ng-notifications';
7
7
  import { UUIDsEqual } from '@memberjunction/global';
8
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
8
9
  import * as i0 from "@angular/core";
9
10
  import * as i1 from "@angular/forms";
10
11
  import * as i2 from "@angular/common";
@@ -155,8 +156,9 @@ function TemplateSelectorDialogComponent_Conditional_25_Template(rf, ctx) { if (
155
156
  * Template selector dialog that allows users to search and select from existing templates.
156
157
  * This dialog provides a searchable interface with category filtering and template preview.
157
158
  */
158
- export class TemplateSelectorDialogComponent {
159
+ export class TemplateSelectorDialogComponent extends BaseAngularComponent {
159
160
  constructor(cdr) {
161
+ super();
160
162
  this.cdr = cdr;
161
163
  // Input configuration
162
164
  this.config = { title: 'Select Template' };
@@ -214,7 +216,7 @@ export class TemplateSelectorDialogComponent {
214
216
  }
215
217
  async loadTemplates() {
216
218
  try {
217
- const rv = new RunView();
219
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
218
220
  // Build filter
219
221
  let filter = '';
220
222
  if (this.config.showActiveOnly !== false) {
@@ -247,7 +249,7 @@ export class TemplateSelectorDialogComponent {
247
249
  }
248
250
  async loadCategories() {
249
251
  try {
250
- const rv = new RunView();
252
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
251
253
  const result = await rv.RunView({
252
254
  EntityName: 'MJ: Template Categories',
253
255
  ExtraFilter: '',
@@ -375,7 +377,7 @@ export class TemplateSelectorDialogComponent {
375
377
  this.DialogClose.emit();
376
378
  }
377
379
  static { this.ɵfac = function TemplateSelectorDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TemplateSelectorDialogComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
378
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TemplateSelectorDialogComponent, selectors: [["mj-template-selector-dialog"]], outputs: { DialogClose: "DialogClose" }, decls: 31, vars: 17, consts: [[1, "template-selector-dialog"], [1, "dialog-header"], [1, "header-actions"], ["mjButton", "", "size", "sm", 3, "click"], [1, "search-filter-section"], [1, "search-container"], ["type", "text", "placeholder", "Search templates...", 1, "mj-input", 3, "formControl"], [1, "fa-solid", "fa-search", "search-icon"], [1, "category-filter"], [1, "mj-input", 3, "change", "value"], ["value", ""], [3, "value"], [1, "loading-container"], [1, "templates-container", 3, "grid-mode"], [1, "dialog-actions"], [1, "action-buttons"], ["mjButton", "", "variant", "outline"], ["mjButton", "", 3, "click"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "fa-solid", "fa-check"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "templates-container"], [1, "template-item", 3, "selected"], [1, "no-templates"], [1, "template-item", 3, "click"], [1, "selection-indicator"], ["type", "checkbox", 3, "checked"], ["type", "radio", 3, "checked"], [1, "template-info"], [1, "template-header"], [1, "template-name"], [1, "template-status"], [1, "status-badge"], [1, "template-description"], [1, "template-metadata"], [1, "metadata-item"], [1, "fa-solid", "fa-user"], ["type", "checkbox", 3, "change", "checked"], ["type", "radio", 3, "change", "checked"], [1, "fa-solid", "fa-folder"], [1, "fa-solid", "fa-calendar"], [1, "fa-solid", "fa-file-alt", "fa-3x"], ["mjButton", "", "variant", "outline", 3, "click"], [1, "fa-solid", "fa-plus"]], template: function TemplateSelectorDialogComponent_Template(rf, ctx) { if (rf & 1) {
380
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TemplateSelectorDialogComponent, selectors: [["mj-template-selector-dialog"]], outputs: { DialogClose: "DialogClose" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 31, vars: 17, consts: [[1, "template-selector-dialog"], [1, "dialog-header"], [1, "header-actions"], ["mjButton", "", "size", "sm", 3, "click"], [1, "search-filter-section"], [1, "search-container"], ["type", "text", "placeholder", "Search templates...", 1, "mj-input", 3, "formControl"], [1, "fa-solid", "fa-search", "search-icon"], [1, "category-filter"], [1, "mj-input", 3, "change", "value"], ["value", ""], [3, "value"], [1, "loading-container"], [1, "templates-container", 3, "grid-mode"], [1, "dialog-actions"], [1, "action-buttons"], ["mjButton", "", "variant", "outline"], ["mjButton", "", 3, "click"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "fa-solid", "fa-check"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "templates-container"], [1, "template-item", 3, "selected"], [1, "no-templates"], [1, "template-item", 3, "click"], [1, "selection-indicator"], ["type", "checkbox", 3, "checked"], ["type", "radio", 3, "checked"], [1, "template-info"], [1, "template-header"], [1, "template-name"], [1, "template-status"], [1, "status-badge"], [1, "template-description"], [1, "template-metadata"], [1, "metadata-item"], [1, "fa-solid", "fa-user"], ["type", "checkbox", 3, "change", "checked"], ["type", "radio", 3, "change", "checked"], [1, "fa-solid", "fa-folder"], [1, "fa-solid", "fa-calendar"], [1, "fa-solid", "fa-file-alt", "fa-3x"], ["mjButton", "", "variant", "outline", 3, "click"], [1, "fa-solid", "fa-plus"]], template: function TemplateSelectorDialogComponent_Template(rf, ctx) { if (rf & 1) {
379
381
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "h3");
380
382
  i0.ɵɵtext(3);
381
383
  i0.ɵɵelementEnd();
@@ -441,5 +443,5 @@ export class TemplateSelectorDialogComponent {
441
443
  }], () => [{ type: i0.ChangeDetectorRef }], { DialogClose: [{
442
444
  type: Output
443
445
  }] }); })();
444
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TemplateSelectorDialogComponent, { className: "TemplateSelectorDialogComponent", filePath: "src/lib/custom/AIPrompts/template-selector-dialog.component.ts", lineNumber: 43 }); })();
446
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TemplateSelectorDialogComponent, { className: "TemplateSelectorDialogComponent", filePath: "src/lib/custom/AIPrompts/template-selector-dialog.component.ts", lineNumber: 44 }); })();
445
447
  //# sourceMappingURL=template-selector-dialog.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"template-selector-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIPrompts/template-selector-dialog.component.ts","../../../../src/lib/custom/AIPrompts/template-selector-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, Output, EventEmitter } from '@angular/core';\nimport { Subject, BehaviorSubject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { RunView } from '@memberjunction/core';\nimport { MJTemplateEntity, MJTemplateCategoryEntity } from '@memberjunction/core-entities';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nexport interface TemplateSelectorConfig {\n /** Title for the dialog */\n title: string;\n /** Whether to show the \"Create New\" option */\n showCreateNew?: boolean;\n /** Filter criteria for templates */\n extraFilter?: string;\n /** Allow multiple selection */\n multiSelect?: boolean;\n /** Pre-selected template IDs */\n selectedTemplateIds?: string[];\n /** Show only active templates */\n showActiveOnly?: boolean;\n}\n\nexport interface TemplateSelectorResult {\n /** Selected templates */\n selectedTemplates: MJTemplateEntity[];\n /** Whether user chose to create new */\n createNew?: boolean;\n}\n\n/**\n * Template selector dialog that allows users to search and select from existing templates.\n * This dialog provides a searchable interface with category filtering and template preview.\n */\n@Component({\n selector: 'mj-template-selector-dialog',\n templateUrl: './template-selector-dialog.component.html',\n styleUrls: ['./template-selector-dialog.component.css'],\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule]\n})\nexport class TemplateSelectorDialogComponent implements OnInit, OnDestroy {\n \n // Input configuration\n config: TemplateSelectorConfig = { title: 'Select Template' };\n \n // State management\n private destroy$ = new Subject<void>();\n public result = new Subject<TemplateSelectorResult | null>();\n \n // Data and UI state\n isLoading$ = new BehaviorSubject<boolean>(false);\n templates$ = new BehaviorSubject<MJTemplateEntity[]>([]);\n filteredTemplates$ = new BehaviorSubject<MJTemplateEntity[]>([]);\n categories$ = new BehaviorSubject<MJTemplateCategoryEntity[]>([]);\n \n // Search and filtering\n searchControl = new FormControl('');\n selectedCategory: string | null = null;\n selectedTemplates: Set<string> = new Set();\n \n // View mode\n viewMode: 'grid' | 'list' = 'list';\n\n @Output() DialogClose = new EventEmitter<void>();\n\n constructor(\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit() {\n this.setupSearch();\n this.loadData();\n \n // Initialize selected templates if provided\n if (this.config.selectedTemplateIds) {\n this.selectedTemplates = new Set(this.config.selectedTemplateIds);\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupSearch() {\n this.searchControl.valueChanges\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n )\n .subscribe(searchTerm => {\n this.filterTemplates(searchTerm || '');\n });\n }\n\n private async loadData() {\n this.isLoading$.next(true);\n \n try {\n // Load both templates and categories in parallel\n await Promise.all([\n this.loadTemplates(),\n this.loadCategories()\n ]);\n } catch (error) {\n console.error('Error loading template data:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error loading templates. Please try again.',\n 'error',\n 3000\n );\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n private async loadTemplates() {\n try {\n const rv = new RunView();\n \n // Build filter\n let filter = '';\n if (this.config.showActiveOnly !== false) {\n filter = \"IsActive = 1\";\n }\n if (this.config.extraFilter) {\n filter += filter ? ` AND ${this.config.extraFilter}` : this.config.extraFilter;\n }\n \n const result = await rv.RunView<MJTemplateEntity>({\n EntityName: 'MJ: Templates',\n ExtraFilter: filter,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object',\n MaxRows: 1000\n });\n\n if (result.Success) {\n const templates = result.Results || [];\n this.templates$.next(templates);\n this.filteredTemplates$.next(templates);\n } else {\n throw new Error(result.ErrorMessage || 'Failed to load templates');\n }\n } catch (error) {\n console.error('Error loading templates:', error);\n this.templates$.next([]);\n this.filteredTemplates$.next([]);\n }\n }\n\n private async loadCategories() {\n try {\n const rv = new RunView();\n \n const result = await rv.RunView<MJTemplateCategoryEntity>({\n EntityName: 'MJ: Template Categories',\n ExtraFilter: '',\n OrderBy: 'Name ASC',\n ResultType: 'entity_object',\n MaxRows: 1000\n });\n\n if (result.Success) {\n const categories = result.Results || [];\n this.categories$.next(categories);\n } else {\n throw new Error(result.ErrorMessage || 'Failed to load categories');\n }\n } catch (error) {\n console.error('Error loading categories:', error);\n this.categories$.next([]);\n }\n }\n\n private filterTemplates(searchTerm: string) {\n const allTemplates = this.templates$.value;\n let filtered = allTemplates;\n \n // Apply search filter\n if (searchTerm.trim()) {\n filtered = filtered.filter(template => \n template.Name?.toLowerCase().includes(searchTerm.toLowerCase()) ||\n template.Description?.toLowerCase().includes(searchTerm.toLowerCase())\n );\n }\n \n // Apply category filter\n if (this.selectedCategory) {\n filtered = filtered.filter(template => \n UUIDsEqual(template.CategoryID, this.selectedCategory)\n );\n }\n \n this.filteredTemplates$.next(filtered);\n }\n\n // === Category Management ===\n\n onCategoryChange(categoryId: string | null) {\n this.selectedCategory = categoryId === '' ? null : categoryId;\n this.filterTemplates(this.searchControl.value || '');\n }\n\n getCategoryDisplayName(categoryId: string): string {\n const category = this.categories$.value.find(c => UUIDsEqual(c.ID, categoryId));\n return category?.Name || 'Unknown Category';\n }\n\n // === Selection Management ===\n\n toggleTemplateSelection(template: MJTemplateEntity) {\n if (this.config.multiSelect) {\n if (this.selectedTemplates.has(template.ID)) {\n this.selectedTemplates.delete(template.ID);\n } else {\n this.selectedTemplates.add(template.ID);\n }\n } else {\n // Single select - replace current selection\n this.selectedTemplates.clear();\n this.selectedTemplates.add(template.ID);\n }\n }\n\n isTemplateSelected(template: MJTemplateEntity): boolean {\n return this.selectedTemplates.has(template.ID);\n }\n\n getSelectedTemplateObjects(): MJTemplateEntity[] {\n const allTemplates = this.templates$.value;\n return allTemplates.filter(template => this.selectedTemplates.has(template.ID));\n }\n\n // === UI Helpers ===\n\n toggleViewMode() {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n }\n\n getTemplateStatusColor(template: MJTemplateEntity): string {\n if (!template.IsActive) return '#6c757d';\n if (template.DisabledAt && new Date(template.DisabledAt) <= new Date()) return '#dc3545';\n if (template.ActiveAt && new Date(template.ActiveAt) > new Date()) return '#ffc107';\n return '#28a745';\n }\n\n getTemplateStatusText(template: MJTemplateEntity): string {\n if (!template.IsActive) return 'Inactive';\n if (template.DisabledAt && new Date(template.DisabledAt) <= new Date()) return 'Disabled';\n if (template.ActiveAt && new Date(template.ActiveAt) > new Date()) return 'Scheduled';\n return 'Active';\n }\n\n getTemplatePreview(template: MJTemplateEntity): string {\n if (!template.Description) return 'No description available';\n return template.Description.length > 100 \n ? template.Description.substring(0, 100) + '...' \n : template.Description;\n }\n\n formatDate(date: Date | string | null): string {\n if (!date) return '';\n const d = new Date(date);\n return d.toLocaleDateString();\n }\n\n // === Dialog Actions ===\n\n selectTemplates() {\n const selectedTemplateObjects = this.getSelectedTemplateObjects();\n \n if (selectedTemplateObjects.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please select at least one template',\n 'warning',\n 2000\n );\n return;\n }\n\n const result: TemplateSelectorResult = {\n selectedTemplates: selectedTemplateObjects\n };\n\n this.result.next(result);\n this.DialogClose.emit();\n }\n\n createNew() {\n const result: TemplateSelectorResult = {\n selectedTemplates: [],\n createNew: true\n };\n\n this.result.next(result);\n this.DialogClose.emit();\n }\n\n cancel() {\n this.result.next(null);\n this.DialogClose.emit();\n }\n}","<!-- Template Selector Dialog -->\n<div class=\"template-selector-dialog\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <h3>{{ config.title }}</h3>\n <div class=\"header-actions\">\n <button\n mjButton\n size=\"sm\"\n (click)=\"toggleViewMode()\"\n >\n <i [class]=\"viewMode === 'list' ? 'fa-solid fa-th' : 'fa-solid fa-list'\"></i>\n {{ viewMode === 'list' ? 'Grid' : 'List' }}\n </button>\n </div>\n </div>\n\n <!-- Search and Filter Section -->\n <div class=\"search-filter-section\">\n <!-- Search Input -->\n <div class=\"search-container\">\n <input\n class=\"mj-input\"\n type=\"text\"\n [formControl]=\"searchControl\"\n placeholder=\"Search templates...\"\n />\n <i class=\"fa-solid fa-search search-icon\"></i>\n </div>\n\n <!-- Category Filter -->\n <div class=\"category-filter\">\n <select\n class=\"mj-input\"\n [value]=\"selectedCategory || ''\"\n (change)=\"onCategoryChange($any($event.target).value || null)\"\n >\n <option value=\"\">All Categories</option>\n @for (category of categories$ | async; track category.ID) {\n <option [value]=\"category.ID\">{{ category.Name }}</option>\n }\n </select>\n </div>\n </div>\n\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-container\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading templates...</span>\n </div>\n }\n\n <!-- Template List/Grid -->\n @if (!(isLoading$ | async)) {\n <div class=\"templates-container\" [class.grid-mode]=\"viewMode === 'grid'\">\n @for (template of filteredTemplates$ | async; track template.ID) {\n <div \n class=\"template-item\"\n [class.selected]=\"isTemplateSelected(template)\"\n (click)=\"toggleTemplateSelection(template)\"\n >\n <!-- Selection Checkbox -->\n <div class=\"selection-indicator\">\n @if (config.multiSelect) {\n <input\n type=\"checkbox\"\n [checked]=\"isTemplateSelected(template)\"\n (change)=\"toggleTemplateSelection(template)\"\n />\n } @else {\n <input\n type=\"radio\"\n [checked]=\"isTemplateSelected(template)\"\n (change)=\"toggleTemplateSelection(template)\"\n />\n }\n </div>\n\n <!-- Template Info -->\n <div class=\"template-info\">\n <div class=\"template-header\">\n <h4 class=\"template-name\">{{ template.Name }}</h4>\n <div class=\"template-status\">\n <span \n class=\"status-badge\"\n [style.background-color]=\"getTemplateStatusColor(template)\"\n >\n {{ getTemplateStatusText(template) }}\n </span>\n </div>\n </div>\n\n <!-- Template Description -->\n @if (template.Description) {\n <div class=\"template-description\">\n {{ getTemplatePreview(template) }}\n </div>\n }\n\n <!-- Template Metadata -->\n <div class=\"template-metadata\">\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-user\"></i>\n <span>{{ template.User || 'Unknown User' }}</span>\n </div>\n \n @if (template.Category) {\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-folder\"></i>\n <span>{{ template.Category }}</span>\n </div>\n }\n \n @if (template.__mj_CreatedAt) {\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n <span>{{ formatDate(template.__mj_CreatedAt) }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"no-templates\">\n <i class=\"fa-solid fa-file-alt fa-3x\"></i>\n <h4>No templates found</h4>\n <p>No templates match your current search criteria.</p>\n </div>\n }\n </div>\n }\n\n <!-- Dialog Actions -->\n <div class=\"dialog-actions\">\n <div class=\"action-buttons\">\n @if (config.showCreateNew) {\n <button\n mjButton\n variant=\"outline\"\n (click)=\"createNew()\"\n >\n <i class=\"fa-solid fa-plus\"></i>\n Create New\n </button>\n }\n \n <button\n mjButton\n (click)=\"cancel()\"\n >\n Cancel\n </button>\n \n <button\n mjButton\n variant=\"primary\"\n (click)=\"selectTemplates()\"\n [disabled]=\"selectedTemplates.size === 0\"\n >\n <i class=\"fa-solid fa-check\"></i>\n Select {{ selectedTemplates.size > 0 ? '(' + selectedTemplates.size + ')' : '' }}\n </button>\n </div>\n </div>\n</div>"]}
1
+ {"version":3,"file":"template-selector-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/AIPrompts/template-selector-dialog.component.ts","../../../../src/lib/custom/AIPrompts/template-selector-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, Output, EventEmitter } from '@angular/core';\nimport { Subject, BehaviorSubject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { RunView } from '@memberjunction/core';\nimport { MJTemplateEntity, MJTemplateCategoryEntity } from '@memberjunction/core-entities';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nexport interface TemplateSelectorConfig {\n /** Title for the dialog */\n title: string;\n /** Whether to show the \"Create New\" option */\n showCreateNew?: boolean;\n /** Filter criteria for templates */\n extraFilter?: string;\n /** Allow multiple selection */\n multiSelect?: boolean;\n /** Pre-selected template IDs */\n selectedTemplateIds?: string[];\n /** Show only active templates */\n showActiveOnly?: boolean;\n}\n\nexport interface TemplateSelectorResult {\n /** Selected templates */\n selectedTemplates: MJTemplateEntity[];\n /** Whether user chose to create new */\n createNew?: boolean;\n}\n\n/**\n * Template selector dialog that allows users to search and select from existing templates.\n * This dialog provides a searchable interface with category filtering and template preview.\n */\n@Component({\n selector: 'mj-template-selector-dialog',\n templateUrl: './template-selector-dialog.component.html',\n styleUrls: ['./template-selector-dialog.component.css'],\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule]\n})\nexport class TemplateSelectorDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n \n // Input configuration\n config: TemplateSelectorConfig = { title: 'Select Template' };\n \n // State management\n private destroy$ = new Subject<void>();\n public result = new Subject<TemplateSelectorResult | null>();\n \n // Data and UI state\n isLoading$ = new BehaviorSubject<boolean>(false);\n templates$ = new BehaviorSubject<MJTemplateEntity[]>([]);\n filteredTemplates$ = new BehaviorSubject<MJTemplateEntity[]>([]);\n categories$ = new BehaviorSubject<MJTemplateCategoryEntity[]>([]);\n \n // Search and filtering\n searchControl = new FormControl('');\n selectedCategory: string | null = null;\n selectedTemplates: Set<string> = new Set();\n \n // View mode\n viewMode: 'grid' | 'list' = 'list';\n\n @Output() DialogClose = new EventEmitter<void>();\n\n constructor(\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnInit() {\n this.setupSearch();\n this.loadData();\n \n // Initialize selected templates if provided\n if (this.config.selectedTemplateIds) {\n this.selectedTemplates = new Set(this.config.selectedTemplateIds);\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupSearch() {\n this.searchControl.valueChanges\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n )\n .subscribe(searchTerm => {\n this.filterTemplates(searchTerm || '');\n });\n }\n\n private async loadData() {\n this.isLoading$.next(true);\n \n try {\n // Load both templates and categories in parallel\n await Promise.all([\n this.loadTemplates(),\n this.loadCategories()\n ]);\n } catch (error) {\n console.error('Error loading template data:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Error loading templates. Please try again.',\n 'error',\n 3000\n );\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n private async loadTemplates() {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n \n // Build filter\n let filter = '';\n if (this.config.showActiveOnly !== false) {\n filter = \"IsActive = 1\";\n }\n if (this.config.extraFilter) {\n filter += filter ? ` AND ${this.config.extraFilter}` : this.config.extraFilter;\n }\n \n const result = await rv.RunView<MJTemplateEntity>({\n EntityName: 'MJ: Templates',\n ExtraFilter: filter,\n OrderBy: 'Name ASC',\n ResultType: 'entity_object',\n MaxRows: 1000\n });\n\n if (result.Success) {\n const templates = result.Results || [];\n this.templates$.next(templates);\n this.filteredTemplates$.next(templates);\n } else {\n throw new Error(result.ErrorMessage || 'Failed to load templates');\n }\n } catch (error) {\n console.error('Error loading templates:', error);\n this.templates$.next([]);\n this.filteredTemplates$.next([]);\n }\n }\n\n private async loadCategories() {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n \n const result = await rv.RunView<MJTemplateCategoryEntity>({\n EntityName: 'MJ: Template Categories',\n ExtraFilter: '',\n OrderBy: 'Name ASC',\n ResultType: 'entity_object',\n MaxRows: 1000\n });\n\n if (result.Success) {\n const categories = result.Results || [];\n this.categories$.next(categories);\n } else {\n throw new Error(result.ErrorMessage || 'Failed to load categories');\n }\n } catch (error) {\n console.error('Error loading categories:', error);\n this.categories$.next([]);\n }\n }\n\n private filterTemplates(searchTerm: string) {\n const allTemplates = this.templates$.value;\n let filtered = allTemplates;\n \n // Apply search filter\n if (searchTerm.trim()) {\n filtered = filtered.filter(template => \n template.Name?.toLowerCase().includes(searchTerm.toLowerCase()) ||\n template.Description?.toLowerCase().includes(searchTerm.toLowerCase())\n );\n }\n \n // Apply category filter\n if (this.selectedCategory) {\n filtered = filtered.filter(template => \n UUIDsEqual(template.CategoryID, this.selectedCategory)\n );\n }\n \n this.filteredTemplates$.next(filtered);\n }\n\n // === Category Management ===\n\n onCategoryChange(categoryId: string | null) {\n this.selectedCategory = categoryId === '' ? null : categoryId;\n this.filterTemplates(this.searchControl.value || '');\n }\n\n getCategoryDisplayName(categoryId: string): string {\n const category = this.categories$.value.find(c => UUIDsEqual(c.ID, categoryId));\n return category?.Name || 'Unknown Category';\n }\n\n // === Selection Management ===\n\n toggleTemplateSelection(template: MJTemplateEntity) {\n if (this.config.multiSelect) {\n if (this.selectedTemplates.has(template.ID)) {\n this.selectedTemplates.delete(template.ID);\n } else {\n this.selectedTemplates.add(template.ID);\n }\n } else {\n // Single select - replace current selection\n this.selectedTemplates.clear();\n this.selectedTemplates.add(template.ID);\n }\n }\n\n isTemplateSelected(template: MJTemplateEntity): boolean {\n return this.selectedTemplates.has(template.ID);\n }\n\n getSelectedTemplateObjects(): MJTemplateEntity[] {\n const allTemplates = this.templates$.value;\n return allTemplates.filter(template => this.selectedTemplates.has(template.ID));\n }\n\n // === UI Helpers ===\n\n toggleViewMode() {\n this.viewMode = this.viewMode === 'grid' ? 'list' : 'grid';\n }\n\n getTemplateStatusColor(template: MJTemplateEntity): string {\n if (!template.IsActive) return '#6c757d';\n if (template.DisabledAt && new Date(template.DisabledAt) <= new Date()) return '#dc3545';\n if (template.ActiveAt && new Date(template.ActiveAt) > new Date()) return '#ffc107';\n return '#28a745';\n }\n\n getTemplateStatusText(template: MJTemplateEntity): string {\n if (!template.IsActive) return 'Inactive';\n if (template.DisabledAt && new Date(template.DisabledAt) <= new Date()) return 'Disabled';\n if (template.ActiveAt && new Date(template.ActiveAt) > new Date()) return 'Scheduled';\n return 'Active';\n }\n\n getTemplatePreview(template: MJTemplateEntity): string {\n if (!template.Description) return 'No description available';\n return template.Description.length > 100 \n ? template.Description.substring(0, 100) + '...' \n : template.Description;\n }\n\n formatDate(date: Date | string | null): string {\n if (!date) return '';\n const d = new Date(date);\n return d.toLocaleDateString();\n }\n\n // === Dialog Actions ===\n\n selectTemplates() {\n const selectedTemplateObjects = this.getSelectedTemplateObjects();\n \n if (selectedTemplateObjects.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Please select at least one template',\n 'warning',\n 2000\n );\n return;\n }\n\n const result: TemplateSelectorResult = {\n selectedTemplates: selectedTemplateObjects\n };\n\n this.result.next(result);\n this.DialogClose.emit();\n }\n\n createNew() {\n const result: TemplateSelectorResult = {\n selectedTemplates: [],\n createNew: true\n };\n\n this.result.next(result);\n this.DialogClose.emit();\n }\n\n cancel() {\n this.result.next(null);\n this.DialogClose.emit();\n }\n}","<!-- Template Selector Dialog -->\n<div class=\"template-selector-dialog\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <h3>{{ config.title }}</h3>\n <div class=\"header-actions\">\n <button\n mjButton\n size=\"sm\"\n (click)=\"toggleViewMode()\"\n >\n <i [class]=\"viewMode === 'list' ? 'fa-solid fa-th' : 'fa-solid fa-list'\"></i>\n {{ viewMode === 'list' ? 'Grid' : 'List' }}\n </button>\n </div>\n </div>\n\n <!-- Search and Filter Section -->\n <div class=\"search-filter-section\">\n <!-- Search Input -->\n <div class=\"search-container\">\n <input\n class=\"mj-input\"\n type=\"text\"\n [formControl]=\"searchControl\"\n placeholder=\"Search templates...\"\n />\n <i class=\"fa-solid fa-search search-icon\"></i>\n </div>\n\n <!-- Category Filter -->\n <div class=\"category-filter\">\n <select\n class=\"mj-input\"\n [value]=\"selectedCategory || ''\"\n (change)=\"onCategoryChange($any($event.target).value || null)\"\n >\n <option value=\"\">All Categories</option>\n @for (category of categories$ | async; track category.ID) {\n <option [value]=\"category.ID\">{{ category.Name }}</option>\n }\n </select>\n </div>\n </div>\n\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <div class=\"loading-container\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading templates...</span>\n </div>\n }\n\n <!-- Template List/Grid -->\n @if (!(isLoading$ | async)) {\n <div class=\"templates-container\" [class.grid-mode]=\"viewMode === 'grid'\">\n @for (template of filteredTemplates$ | async; track template.ID) {\n <div \n class=\"template-item\"\n [class.selected]=\"isTemplateSelected(template)\"\n (click)=\"toggleTemplateSelection(template)\"\n >\n <!-- Selection Checkbox -->\n <div class=\"selection-indicator\">\n @if (config.multiSelect) {\n <input\n type=\"checkbox\"\n [checked]=\"isTemplateSelected(template)\"\n (change)=\"toggleTemplateSelection(template)\"\n />\n } @else {\n <input\n type=\"radio\"\n [checked]=\"isTemplateSelected(template)\"\n (change)=\"toggleTemplateSelection(template)\"\n />\n }\n </div>\n\n <!-- Template Info -->\n <div class=\"template-info\">\n <div class=\"template-header\">\n <h4 class=\"template-name\">{{ template.Name }}</h4>\n <div class=\"template-status\">\n <span \n class=\"status-badge\"\n [style.background-color]=\"getTemplateStatusColor(template)\"\n >\n {{ getTemplateStatusText(template) }}\n </span>\n </div>\n </div>\n\n <!-- Template Description -->\n @if (template.Description) {\n <div class=\"template-description\">\n {{ getTemplatePreview(template) }}\n </div>\n }\n\n <!-- Template Metadata -->\n <div class=\"template-metadata\">\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-user\"></i>\n <span>{{ template.User || 'Unknown User' }}</span>\n </div>\n \n @if (template.Category) {\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-folder\"></i>\n <span>{{ template.Category }}</span>\n </div>\n }\n \n @if (template.__mj_CreatedAt) {\n <div class=\"metadata-item\">\n <i class=\"fa-solid fa-calendar\"></i>\n <span>{{ formatDate(template.__mj_CreatedAt) }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"no-templates\">\n <i class=\"fa-solid fa-file-alt fa-3x\"></i>\n <h4>No templates found</h4>\n <p>No templates match your current search criteria.</p>\n </div>\n }\n </div>\n }\n\n <!-- Dialog Actions -->\n <div class=\"dialog-actions\">\n <div class=\"action-buttons\">\n @if (config.showCreateNew) {\n <button\n mjButton\n variant=\"outline\"\n (click)=\"createNew()\"\n >\n <i class=\"fa-solid fa-plus\"></i>\n Create New\n </button>\n }\n \n <button\n mjButton\n (click)=\"cancel()\"\n >\n Cancel\n </button>\n \n <button\n mjButton\n variant=\"primary\"\n (click)=\"selectTemplates()\"\n [disabled]=\"selectedTemplates.size === 0\"\n >\n <i class=\"fa-solid fa-check\"></i>\n Select {{ selectedTemplates.size > 0 ? '(' + selectedTemplates.size + ')' : '' }}\n </button>\n </div>\n </div>\n</div>"]}
@@ -8,7 +8,7 @@ import { Component } from '@angular/core';
8
8
  import { RegisterClass, ParseJSONRecursive } from '@memberjunction/global';
9
9
  import { BaseFormComponent } from '@memberjunction/ng-base-forms';
10
10
  import { SharedService } from '@memberjunction/ng-shared';
11
- import { Metadata, CompositeKey } from '@memberjunction/core';
11
+ import { CompositeKey } from '@memberjunction/core';
12
12
  import { MJActionExecutionLogFormComponent } from '../../generated/Entities/MJActionExecutionLog/mjactionexecutionlog.form.component';
13
13
  import * as i0 from "@angular/core";
14
14
  import * as i1 from "@angular/common";
@@ -405,7 +405,7 @@ let MJActionExecutionLogFormComponentExtended = class MJActionExecutionLogFormCo
405
405
  return;
406
406
  this.isLoadingAction = true;
407
407
  try {
408
- const md = new Metadata();
408
+ const md = this.ProviderToUse;
409
409
  this.action = await md.GetEntityObject('MJ: Actions');
410
410
  if (this.action) {
411
411
  await this.action.Load(this.record.ActionID);
@@ -423,7 +423,7 @@ let MJActionExecutionLogFormComponentExtended = class MJActionExecutionLogFormCo
423
423
  return;
424
424
  this.isLoadingUser = true;
425
425
  try {
426
- const md = new Metadata();
426
+ const md = this.ProviderToUse;
427
427
  this.user = await md.GetEntityObject('MJ: Users');
428
428
  if (this.user) {
429
429
  await this.user.Load(this.record.UserID);
@@ -1 +1 @@
1
- {"version":3,"file":"action-execution-log-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Actions/action-execution-log-form.component.ts","../../../../src/lib/custom/Actions/action-execution-log-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit } from '@angular/core';\nimport { MJActionExecutionLogEntity, MJActionEntity, MJUserEntity } from '@memberjunction/core-entities';\nimport { RegisterClass, ParseJSONRecursive, ParseJSONOptions } from '@memberjunction/global';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\nimport { MJActionExecutionLogFormComponent } from '../../generated/Entities/MJActionExecutionLog/mjactionexecutionlog.form.component';\n\ntype ParamType = 'Input' | 'Output' | 'Both';\ntype TypeFilter = 'All' | ParamType;\ntype SortKey = 'name' | 'type';\ntype SortDir = 'asc' | 'desc';\n\ninterface ActionParameter {\n Name: string;\n Value: unknown;\n Type: ParamType;\n}\n\ninterface DisplayParameter extends ActionParameter {\n ValueKind: 'string' | 'number' | 'boolean' | 'null' | 'undefined' | 'array' | 'object';\n Preview: string;\n IsExpandable: boolean;\n Expanded: boolean;\n FormattedValue: string;\n}\n\n@RegisterClass(BaseFormComponent, 'MJ: Action Execution Logs')\n@Component({\n standalone: false,\n selector: 'mj-action-execution-log-form',\n templateUrl: './action-execution-log-form.component.html',\n styleUrls: ['./action-execution-log-form.component.css']\n})\nexport class MJActionExecutionLogFormComponentExtended extends MJActionExecutionLogFormComponent implements OnInit {\n public record!: MJActionExecutionLogEntity;\n\n // Related entities\n public action: MJActionEntity | null = null;\n public user: MJUserEntity | null = null;\n\n // Loading states\n public isLoadingAction = false;\n public isLoadingUser = false;\n\n // Formatted JSON fields\n public formattedParams: string = '';\n public formattedMessage: string = '';\n\n // Unified parameter display\n public allParameters: DisplayParameter[] = [];\n public paramCounts: Record<TypeFilter, number> = { All: 0, Input: 0, Output: 0, Both: 0 };\n public hasAnyParameters = false;\n\n // Filter / sort / view state\n public typeFilter: TypeFilter = 'All';\n public searchText: string = '';\n public sortKey: SortKey = 'type';\n public sortDir: SortDir = 'asc';\n public showRawJson: boolean = false;\n\n async ngOnInit() {\n await super.ngOnInit();\n \n if (this.record?.IsSaved) {\n // Load related data\n await Promise.all([\n this.loadAction(),\n this.loadUser()\n ]);\n \n // Format JSON fields\n this.formatJSONFields();\n this.cdr.detectChanges();\n }\n }\n\n private async loadAction() {\n if (!this.record.ActionID) return;\n \n this.isLoadingAction = true;\n try {\n const md = new Metadata();\n this.action = await md.GetEntityObject<MJActionEntity>('MJ: Actions');\n if (this.action) {\n await this.action.Load(this.record.ActionID);\n }\n } catch (error) {\n console.error('Error loading action:', error);\n } finally {\n this.isLoadingAction = false;\n }\n }\n\n private async loadUser() {\n if (!this.record.UserID) return;\n \n this.isLoadingUser = true;\n try {\n const md = new Metadata();\n this.user = await md.GetEntityObject<MJUserEntity>('MJ: Users');\n if (this.user) {\n await this.user.Load(this.record.UserID);\n }\n } catch (error) {\n console.error('Error loading user:', error);\n } finally {\n this.isLoadingUser = false;\n }\n }\n\n private formatJSONFields() {\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n\n // Format Params with recursive JSON parsing\n if (this.record.Params) {\n try {\n const parsed = JSON.parse(this.record.Params);\n const recursivelyParsed = ParseJSONRecursive(parsed, parseOptions);\n this.formattedParams = JSON.stringify(recursivelyParsed, null, 2);\n\n if (Array.isArray(recursivelyParsed)) {\n this.buildDisplayParameters(recursivelyParsed as ActionParameter[]);\n }\n } catch (e) {\n this.formattedParams = this.record.Params;\n }\n }\n\n // Format Message field with recursive JSON parsing\n if (this.record.Message) {\n try {\n const parsed = JSON.parse(this.record.Message);\n const recursivelyParsed = ParseJSONRecursive(parsed, parseOptions);\n this.formattedMessage = JSON.stringify(recursivelyParsed, null, 2);\n } catch (e) {\n this.formattedMessage = this.record.Message;\n }\n }\n }\n\n /**\n * Build the unified parameter display list once, so filtering/sorting can\n * operate on a cheap, pre-computed structure.\n */\n private buildDisplayParameters(params: ActionParameter[]) {\n this.paramCounts = { All: 0, Input: 0, Output: 0, Both: 0 };\n this.allParameters = params\n .filter((p) => p && typeof p.Name === 'string')\n .map((p) => {\n const valueKind = this.detectValueKind(p.Value);\n const isExpandable = valueKind === 'array' || valueKind === 'object';\n this.paramCounts.All += 1;\n if (p.Type === 'Input' || p.Type === 'Output' || p.Type === 'Both') {\n this.paramCounts[p.Type] += 1;\n }\n return {\n Name: p.Name,\n Value: p.Value,\n Type: p.Type,\n ValueKind: valueKind,\n Preview: this.buildPreview(p.Value, valueKind),\n IsExpandable: isExpandable,\n Expanded: false,\n FormattedValue: isExpandable ? JSON.stringify(p.Value, null, 2) : ''\n };\n });\n this.hasAnyParameters = this.allParameters.length > 0;\n }\n\n private detectValueKind(value: unknown): DisplayParameter['ValueKind'] {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (Array.isArray(value)) return 'array';\n const t = typeof value;\n if (t === 'string' || t === 'number' || t === 'boolean') return t;\n if (t === 'object') return 'object';\n return 'string';\n }\n\n /**\n * Short inline preview for the row header. Objects/arrays get a compact\n * one-liner; expansion reveals the full formatted JSON below.\n */\n private buildPreview(value: unknown, kind: DisplayParameter['ValueKind']): string {\n switch (kind) {\n case 'null': return 'null';\n case 'undefined': return 'undefined';\n case 'boolean': return value ? 'true' : 'false';\n case 'number': return String(value);\n case 'string': {\n const s = value as string;\n return s.length > 160 ? `\"${s.slice(0, 157)}…\"` : `\"${s}\"`;\n }\n case 'array': {\n const arr = value as unknown[];\n if (arr.length === 0) return '[]';\n if (arr.length <= 5 && arr.every((v) => v === null || typeof v !== 'object')) {\n return `[${arr.map((v) => this.buildPreview(v, this.detectValueKind(v))).join(', ')}]`;\n }\n return `Array(${arr.length})`;\n }\n case 'object': {\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n if (keys.length === 0) return '{}';\n const head = keys.slice(0, 3).join(', ');\n return keys.length <= 3 ? `{ ${head} }` : `{ ${head}, …+${keys.length - 3} }`;\n }\n }\n }\n\n // --- Filter / sort / view helpers (invoked from template) ----------------\n\n public get filteredParameters(): DisplayParameter[] {\n const needle = this.searchText.trim().toLowerCase();\n let list = this.allParameters;\n if (this.typeFilter !== 'All') {\n list = list.filter((p) => p.Type === this.typeFilter);\n }\n if (needle) {\n list = list.filter(\n (p) =>\n p.Name.toLowerCase().includes(needle) ||\n (p.Preview && p.Preview.toLowerCase().includes(needle))\n );\n }\n const typeOrder: Record<ParamType, number> = { Input: 0, Both: 1, Output: 2 };\n const dirMult = this.sortDir === 'asc' ? 1 : -1;\n return [...list].sort((a, b) => {\n if (this.sortKey === 'name') {\n return dirMult * a.Name.localeCompare(b.Name, undefined, { sensitivity: 'base' });\n }\n const typeCmp = typeOrder[a.Type] - typeOrder[b.Type];\n if (typeCmp !== 0) return dirMult * typeCmp;\n return a.Name.localeCompare(b.Name, undefined, { sensitivity: 'base' });\n });\n }\n\n public setTypeFilter(filter: TypeFilter): void {\n this.typeFilter = filter;\n }\n\n public toggleSort(key: SortKey): void {\n if (this.sortKey === key) {\n this.sortDir = this.sortDir === 'asc' ? 'desc' : 'asc';\n } else {\n this.sortKey = key;\n this.sortDir = 'asc';\n }\n }\n\n public toggleExpanded(param: DisplayParameter): void {\n if (!param.IsExpandable) return;\n param.Expanded = !param.Expanded;\n }\n\n public toggleRawJson(): void {\n this.showRawJson = !this.showRawJson;\n }\n\n public clearFilters(): void {\n this.typeFilter = 'All';\n this.searchText = '';\n }\n\n public trackParam(_index: number, p: DisplayParameter): string {\n return `${p.Type}::${p.Name}`;\n }\n\n public copyParamValue(param: DisplayParameter): void {\n const text = param.IsExpandable\n ? param.FormattedValue\n : this.formatScalarForCopy(param.Value);\n void this.copyToClipboard(text);\n }\n\n private formatScalarForCopy(value: unknown): string {\n if (value === null) return 'null';\n if (value === undefined) return '';\n if (typeof value === 'string') return value;\n return String(value);\n }\n\n /**\n * Returns the icon class for a value kind — rendered to the left of each\n * preview so object/array/scalar rows are visually distinct at a glance.\n */\n public getValueKindIcon(kind: DisplayParameter['ValueKind']): string {\n switch (kind) {\n case 'string': return 'fa-quote-right';\n case 'number': return 'fa-hashtag';\n case 'boolean': return 'fa-toggle-on';\n case 'array': return 'fa-list-ol';\n case 'object': return 'fa-code';\n case 'null': return 'fa-circle-minus';\n case 'undefined': return 'fa-ban';\n }\n }\n\n public getTypeLabel(type: ParamType): string {\n return type === 'Both' ? 'In/Out' : type;\n }\n\n // Navigation\n navigateToEntity(entityName: string, recordId: string | null) {\n if (!recordId) return;\n SharedService.Instance.OpenEntityRecord(entityName, CompositeKey.FromID(recordId));\n }\n\n navigateToAction() {\n if (this.record.ActionID) {\n this.navigateToEntity('MJ: Actions', this.record.ActionID);\n }\n }\n\n navigateToUser() {\n if (this.record.UserID) {\n this.navigateToEntity('MJ: Users', this.record.UserID);\n }\n }\n\n // UI Helpers\n getExecutionDuration(): number {\n if (!this.record.StartedAt || !this.record.EndedAt) return 0;\n return new Date(this.record.EndedAt).getTime() - new Date(this.record.StartedAt).getTime();\n }\n\n formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) return `${(ms / 60000).toFixed(1)}m`;\n return `${(ms / 3600000).toFixed(1)}h`;\n }\n\n getResultCodeColor(): string {\n const code = this.record.ResultCode?.toLowerCase();\n if (code === 'success' || code === 'ok' || code === 'completed' || code === '200') {\n return 'var(--mj-status-success)';\n }\n return 'var(--mj-status-error)';\n }\n\n getResultCodeIcon(): string {\n const code = this.record.ResultCode?.toLowerCase();\n if (code === 'success' || code === 'ok' || code === 'completed' || code === '200') {\n return 'fa-check-circle';\n }\n return 'fa-times-circle';\n }\n\n // Save handlers for JSON fields\n async saveParams() {\n if (!this.EditMode) return;\n \n try {\n // Validate JSON\n JSON.parse(this.formattedParams);\n this.record.Params = this.formattedParams;\n await this.record.Save();\n } catch (e) {\n console.error('Invalid JSON in Params field:', e);\n // Could show notification here\n }\n }\n\n async saveMessage() {\n if (!this.EditMode) return;\n \n try {\n // Validate JSON\n JSON.parse(this.formattedMessage);\n this.record.Message = this.formattedMessage;\n await this.record.Save();\n } catch (e) {\n console.error('Invalid JSON in Message field:', e);\n // Could show notification here\n }\n }\n \n async copyToClipboard(text: string) {\n try {\n await navigator.clipboard.writeText(text);\n // Could show a toast notification here\n } catch (err) {\n console.error('Failed to copy to clipboard:', err);\n }\n }\n}\n","<div class=\"record-form-container action-execution-log-form\" style=\"height: 100%; display: flex; flex-direction: column;\">\n <div class=\"record-form\" style=\"display: flex; flex-direction: column; height: 100%; overflow: hidden;\">\n <!-- Header -->\n <div class=\"header\">\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"icon-wrapper\">\n <i class=\"fas fa-terminal\"></i>\n </div>\n <div class=\"header-info\">\n <h2>Action Execution Log</h2>\n <div class=\"meta-info\">\n @if (action) {\n <span class=\"action-name\">{{ action.Name }}</span>\n }\n <span class=\"log-id\">{{ record.ID }}</span>\n </div>\n </div>\n </div>\n <div class=\"header-right\">\n <div class=\"status-badge\" [attr.data-status]=\"record.ResultCode?.toLowerCase()\">\n <i class=\"fas\" [ngClass]=\"getResultCodeIcon()\"></i>\n {{ record.ResultCode || 'UNKNOWN' }}\n </div>\n <div class=\"execution-time\">\n <i class=\"fas fa-clock\"></i>\n {{ formatDuration(getExecutionDuration()) }}\n </div>\n </div>\n </div>\n <div class=\"header-stats\">\n <div class=\"stat\">\n <span class=\"label\">Started</span>\n <span class=\"value\">{{ record.StartedAt | date:'short' }}</span>\n </div>\n @if (record.EndedAt) {\n <div class=\"stat\">\n <span class=\"label\">Ended</span>\n <span class=\"value\">{{ record.EndedAt | date:'short' }}</span>\n </div>\n }\n @if (action) {\n <div class=\"stat\">\n <span class=\"label\">Action</span>\n <span class=\"value\">\n <button class=\"btn-link\" (click)=\"navigateToAction()\">\n {{ action.Name }}\n <i class=\"fas fa-external-link-alt\"></i>\n </button>\n </span>\n </div>\n }\n @if (user) {\n <div class=\"stat\">\n <span class=\"label\">User</span>\n <span class=\"value\">\n <button class=\"btn-link\" (click)=\"navigateToUser()\">\n {{ user.Name }}\n <i class=\"fas fa-external-link-alt\"></i>\n </button>\n </span>\n </div>\n }\n </div>\n </div>\n\n <!-- Content Area -->\n <div class=\"content-area\">\n <div class=\"accordion-container\">\n <!-- Execution Details -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-info-circle\"></i> Execution Details\n </ng-template>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Execution ID</label>\n <span class=\"monospace\">{{ record.ID }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Action ID</label>\n <span class=\"monospace\">{{ record.ActionID }}</span>\n </div>\n <div class=\"detail-item\">\n <label>User ID</label>\n <span class=\"monospace\">{{ record.UserID }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Result Code</label>\n <span class=\"detail-value\">\n <i class=\"fas\" [ngClass]=\"getResultCodeIcon()\" [style.color]=\"getResultCodeColor()\"></i>\n <span [style.color]=\"getResultCodeColor()\">{{ record.ResultCode || 'N/A' }}</span>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Duration</label>\n <span>{{ formatDuration(getExecutionDuration()) }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Retention Period</label>\n <span>{{ record.RetentionPeriod ? record.RetentionPeriod + ' days' : 'Indefinite' }}</span>\n </div>\n </div>\n </mj-accordion-panel>\n\n <!-- Unified Parameters section -->\n @if (hasAnyParameters) {\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-sliders-h\"></i>\n Parameters\n <span class=\"param-count-pill\">{{ paramCounts.All }}</span>\n </ng-template>\n <div class=\"params-panel\">\n <!-- Toolbar: filter chips, search, sort, raw toggle -->\n <div class=\"params-toolbar\">\n <div class=\"filter-chips\">\n <button\n type=\"button\"\n class=\"chip\"\n [class.active]=\"typeFilter === 'All'\"\n (click)=\"setTypeFilter('All')\">\n All <span class=\"chip-count\">{{ paramCounts.All }}</span>\n </button>\n <button\n type=\"button\"\n class=\"chip chip-input\"\n [class.active]=\"typeFilter === 'Input'\"\n [disabled]=\"paramCounts.Input === 0\"\n (click)=\"setTypeFilter('Input')\">\n <i class=\"fas fa-sign-in-alt\"></i>\n Input <span class=\"chip-count\">{{ paramCounts.Input }}</span>\n </button>\n <button\n type=\"button\"\n class=\"chip chip-both\"\n [class.active]=\"typeFilter === 'Both'\"\n [disabled]=\"paramCounts.Both === 0\"\n (click)=\"setTypeFilter('Both')\">\n <i class=\"fas fa-exchange-alt\"></i>\n In/Out <span class=\"chip-count\">{{ paramCounts.Both }}</span>\n </button>\n <button\n type=\"button\"\n class=\"chip chip-output\"\n [class.active]=\"typeFilter === 'Output'\"\n [disabled]=\"paramCounts.Output === 0\"\n (click)=\"setTypeFilter('Output')\">\n <i class=\"fas fa-sign-out-alt\"></i>\n Output <span class=\"chip-count\">{{ paramCounts.Output }}</span>\n </button>\n </div>\n\n <div class=\"toolbar-right\">\n <div class=\"search-wrapper\">\n <i class=\"fas fa-search search-icon\"></i>\n <input\n type=\"text\"\n class=\"mj-input params-search\"\n placeholder=\"Search name or value…\"\n [(ngModel)]=\"searchText\"\n name=\"paramSearch\" />\n @if (searchText) {\n <button type=\"button\" class=\"search-clear\" (click)=\"searchText = ''\" title=\"Clear search\">\n <i class=\"fas fa-times\"></i>\n </button>\n }\n </div>\n\n <div class=\"sort-group\" role=\"group\" aria-label=\"Sort parameters\">\n <button\n type=\"button\"\n class=\"sort-btn\"\n [class.active]=\"sortKey === 'type'\"\n (click)=\"toggleSort('type')\"\n title=\"Sort by type\">\n Type\n @if (sortKey === 'type') {\n <i class=\"fas\" [ngClass]=\"sortDir === 'asc' ? 'fa-arrow-down-short-wide' : 'fa-arrow-up-wide-short'\"></i>\n }\n </button>\n <button\n type=\"button\"\n class=\"sort-btn\"\n [class.active]=\"sortKey === 'name'\"\n (click)=\"toggleSort('name')\"\n title=\"Sort by name\">\n Name\n @if (sortKey === 'name') {\n <i class=\"fas\" [ngClass]=\"sortDir === 'asc' ? 'fa-arrow-down-a-z' : 'fa-arrow-up-z-a'\"></i>\n }\n </button>\n </div>\n\n <button\n type=\"button\"\n class=\"raw-toggle\"\n [class.active]=\"showRawJson\"\n (click)=\"toggleRawJson()\"\n title=\"Toggle raw JSON view\">\n <i class=\"fas fa-code\"></i>\n Raw\n </button>\n </div>\n </div>\n\n @if (showRawJson) {\n <div class=\"json-viewer raw-json-viewer\">\n <div class=\"json-toolbar\">\n <span class=\"json-label\">Raw JSON</span>\n <button class=\"btn-icon\" title=\"Copy JSON\" (click)=\"copyToClipboard(formattedParams)\">\n <i class=\"fas fa-copy\"></i>\n </button>\n </div>\n <mj-code-editor\n [(ngModel)]=\"formattedParams\"\n name=\"formattedParamsRaw\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 360px; width: 100%;\">\n </mj-code-editor>\n </div>\n } @else {\n <!-- Rich param list -->\n @if (filteredParameters.length === 0) {\n <div class=\"empty-filter\">\n <i class=\"fas fa-filter-circle-xmark\"></i>\n <p>No parameters match the current filter.</p>\n <button type=\"button\" class=\"btn-link\" (click)=\"clearFilters()\">\n Clear filters\n </button>\n </div>\n } @else {\n <ul class=\"params-list\">\n @for (p of filteredParameters; track trackParam($index, p)) {\n <li class=\"param-row\" [attr.data-type]=\"p.Type\">\n <div class=\"param-header\">\n <span class=\"type-badge\" [attr.data-type]=\"p.Type\">\n @if (p.Type === 'Input') {\n <i class=\"fas fa-sign-in-alt\"></i>\n } @else if (p.Type === 'Output') {\n <i class=\"fas fa-sign-out-alt\"></i>\n } @else {\n <i class=\"fas fa-exchange-alt\"></i>\n }\n {{ getTypeLabel(p.Type) }}\n </span>\n <div class=\"param-name-wrap\">\n <span class=\"param-name\">{{ p.Name }}</span>\n <span class=\"value-kind-chip\" [attr.data-kind]=\"p.ValueKind\">\n <i class=\"fas\" [ngClass]=\"getValueKindIcon(p.ValueKind)\"></i>\n {{ p.ValueKind }}\n </span>\n </div>\n <div class=\"param-actions\">\n @if (p.IsExpandable) {\n <button type=\"button\" class=\"btn-icon param-expand\" [class.is-expanded]=\"p.Expanded\" (click)=\"toggleExpanded(p)\" [title]=\"p.Expanded ? 'Collapse' : 'Expand'\">\n <i class=\"fas\" [ngClass]=\"p.Expanded ? 'fa-chevron-up' : 'fa-chevron-down'\"></i>\n </button>\n }\n <button type=\"button\" class=\"btn-icon\" (click)=\"copyParamValue(p)\" title=\"Copy value\">\n <i class=\"fas fa-copy\"></i>\n </button>\n </div>\n </div>\n <div class=\"param-preview\" [attr.data-kind]=\"p.ValueKind\">{{ p.Preview }}</div>\n @if (p.IsExpandable && p.Expanded) {\n <div class=\"param-expanded\">\n <mj-code-editor\n [(ngModel)]=\"p.FormattedValue\"\n [name]=\"'param-' + p.Name\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 240px; width: 100%;\">\n </mj-code-editor>\n </div>\n }\n </li>\n }\n </ul>\n }\n }\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Output Message -->\n @if (record.Message) {\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-comment-alt\"></i> Output Message\n </ng-template>\n <div class=\"json-viewer\">\n <div class=\"json-toolbar\">\n <span class=\"json-label\">JSON</span>\n <button class=\"btn-icon\" title=\"Copy JSON\" (click)=\"copyToClipboard(formattedMessage)\">\n <i class=\"fas fa-copy\"></i>\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedMessage\"\n name=\"formattedMessage\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Empty States for missing data -->\n @if (!record.Params && !record.Message && !hasAnyParameters) {\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-database\"></i> Execution Data\n </ng-template>\n <div class=\"empty-state\">\n <i class=\"fas fa-inbox\"></i>\n <p>No execution data recorded</p>\n </div>\n </mj-accordion-panel>\n }\n </div>\n </div>\n </div>\n</div>"]}
1
+ {"version":3,"file":"action-execution-log-form.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Actions/action-execution-log-form.component.ts","../../../../src/lib/custom/Actions/action-execution-log-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit } from '@angular/core';\nimport { MJActionExecutionLogEntity, MJActionEntity, MJUserEntity } from '@memberjunction/core-entities';\nimport { RegisterClass, ParseJSONRecursive, ParseJSONOptions } from '@memberjunction/global';\nimport { BaseFormComponent } from '@memberjunction/ng-base-forms';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\nimport { MJActionExecutionLogFormComponent } from '../../generated/Entities/MJActionExecutionLog/mjactionexecutionlog.form.component';\n\ntype ParamType = 'Input' | 'Output' | 'Both';\ntype TypeFilter = 'All' | ParamType;\ntype SortKey = 'name' | 'type';\ntype SortDir = 'asc' | 'desc';\n\ninterface ActionParameter {\n Name: string;\n Value: unknown;\n Type: ParamType;\n}\n\ninterface DisplayParameter extends ActionParameter {\n ValueKind: 'string' | 'number' | 'boolean' | 'null' | 'undefined' | 'array' | 'object';\n Preview: string;\n IsExpandable: boolean;\n Expanded: boolean;\n FormattedValue: string;\n}\n\n@RegisterClass(BaseFormComponent, 'MJ: Action Execution Logs')\n@Component({\n standalone: false,\n selector: 'mj-action-execution-log-form',\n templateUrl: './action-execution-log-form.component.html',\n styleUrls: ['./action-execution-log-form.component.css']\n})\nexport class MJActionExecutionLogFormComponentExtended extends MJActionExecutionLogFormComponent implements OnInit {\n public record!: MJActionExecutionLogEntity;\n\n // Related entities\n public action: MJActionEntity | null = null;\n public user: MJUserEntity | null = null;\n\n // Loading states\n public isLoadingAction = false;\n public isLoadingUser = false;\n\n // Formatted JSON fields\n public formattedParams: string = '';\n public formattedMessage: string = '';\n\n // Unified parameter display\n public allParameters: DisplayParameter[] = [];\n public paramCounts: Record<TypeFilter, number> = { All: 0, Input: 0, Output: 0, Both: 0 };\n public hasAnyParameters = false;\n\n // Filter / sort / view state\n public typeFilter: TypeFilter = 'All';\n public searchText: string = '';\n public sortKey: SortKey = 'type';\n public sortDir: SortDir = 'asc';\n public showRawJson: boolean = false;\n\n async ngOnInit() {\n await super.ngOnInit();\n \n if (this.record?.IsSaved) {\n // Load related data\n await Promise.all([\n this.loadAction(),\n this.loadUser()\n ]);\n \n // Format JSON fields\n this.formatJSONFields();\n this.cdr.detectChanges();\n }\n }\n\n private async loadAction() {\n if (!this.record.ActionID) return;\n \n this.isLoadingAction = true;\n try {\n const md = this.ProviderToUse;\n this.action = await md.GetEntityObject<MJActionEntity>('MJ: Actions');\n if (this.action) {\n await this.action.Load(this.record.ActionID);\n }\n } catch (error) {\n console.error('Error loading action:', error);\n } finally {\n this.isLoadingAction = false;\n }\n }\n\n private async loadUser() {\n if (!this.record.UserID) return;\n \n this.isLoadingUser = true;\n try {\n const md = this.ProviderToUse;\n this.user = await md.GetEntityObject<MJUserEntity>('MJ: Users');\n if (this.user) {\n await this.user.Load(this.record.UserID);\n }\n } catch (error) {\n console.error('Error loading user:', error);\n } finally {\n this.isLoadingUser = false;\n }\n }\n\n private formatJSONFields() {\n const parseOptions: ParseJSONOptions = {\n extractInlineJson: true,\n maxDepth: 100,\n debug: false\n };\n\n // Format Params with recursive JSON parsing\n if (this.record.Params) {\n try {\n const parsed = JSON.parse(this.record.Params);\n const recursivelyParsed = ParseJSONRecursive(parsed, parseOptions);\n this.formattedParams = JSON.stringify(recursivelyParsed, null, 2);\n\n if (Array.isArray(recursivelyParsed)) {\n this.buildDisplayParameters(recursivelyParsed as ActionParameter[]);\n }\n } catch (e) {\n this.formattedParams = this.record.Params;\n }\n }\n\n // Format Message field with recursive JSON parsing\n if (this.record.Message) {\n try {\n const parsed = JSON.parse(this.record.Message);\n const recursivelyParsed = ParseJSONRecursive(parsed, parseOptions);\n this.formattedMessage = JSON.stringify(recursivelyParsed, null, 2);\n } catch (e) {\n this.formattedMessage = this.record.Message;\n }\n }\n }\n\n /**\n * Build the unified parameter display list once, so filtering/sorting can\n * operate on a cheap, pre-computed structure.\n */\n private buildDisplayParameters(params: ActionParameter[]) {\n this.paramCounts = { All: 0, Input: 0, Output: 0, Both: 0 };\n this.allParameters = params\n .filter((p) => p && typeof p.Name === 'string')\n .map((p) => {\n const valueKind = this.detectValueKind(p.Value);\n const isExpandable = valueKind === 'array' || valueKind === 'object';\n this.paramCounts.All += 1;\n if (p.Type === 'Input' || p.Type === 'Output' || p.Type === 'Both') {\n this.paramCounts[p.Type] += 1;\n }\n return {\n Name: p.Name,\n Value: p.Value,\n Type: p.Type,\n ValueKind: valueKind,\n Preview: this.buildPreview(p.Value, valueKind),\n IsExpandable: isExpandable,\n Expanded: false,\n FormattedValue: isExpandable ? JSON.stringify(p.Value, null, 2) : ''\n };\n });\n this.hasAnyParameters = this.allParameters.length > 0;\n }\n\n private detectValueKind(value: unknown): DisplayParameter['ValueKind'] {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (Array.isArray(value)) return 'array';\n const t = typeof value;\n if (t === 'string' || t === 'number' || t === 'boolean') return t;\n if (t === 'object') return 'object';\n return 'string';\n }\n\n /**\n * Short inline preview for the row header. Objects/arrays get a compact\n * one-liner; expansion reveals the full formatted JSON below.\n */\n private buildPreview(value: unknown, kind: DisplayParameter['ValueKind']): string {\n switch (kind) {\n case 'null': return 'null';\n case 'undefined': return 'undefined';\n case 'boolean': return value ? 'true' : 'false';\n case 'number': return String(value);\n case 'string': {\n const s = value as string;\n return s.length > 160 ? `\"${s.slice(0, 157)}…\"` : `\"${s}\"`;\n }\n case 'array': {\n const arr = value as unknown[];\n if (arr.length === 0) return '[]';\n if (arr.length <= 5 && arr.every((v) => v === null || typeof v !== 'object')) {\n return `[${arr.map((v) => this.buildPreview(v, this.detectValueKind(v))).join(', ')}]`;\n }\n return `Array(${arr.length})`;\n }\n case 'object': {\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj);\n if (keys.length === 0) return '{}';\n const head = keys.slice(0, 3).join(', ');\n return keys.length <= 3 ? `{ ${head} }` : `{ ${head}, …+${keys.length - 3} }`;\n }\n }\n }\n\n // --- Filter / sort / view helpers (invoked from template) ----------------\n\n public get filteredParameters(): DisplayParameter[] {\n const needle = this.searchText.trim().toLowerCase();\n let list = this.allParameters;\n if (this.typeFilter !== 'All') {\n list = list.filter((p) => p.Type === this.typeFilter);\n }\n if (needle) {\n list = list.filter(\n (p) =>\n p.Name.toLowerCase().includes(needle) ||\n (p.Preview && p.Preview.toLowerCase().includes(needle))\n );\n }\n const typeOrder: Record<ParamType, number> = { Input: 0, Both: 1, Output: 2 };\n const dirMult = this.sortDir === 'asc' ? 1 : -1;\n return [...list].sort((a, b) => {\n if (this.sortKey === 'name') {\n return dirMult * a.Name.localeCompare(b.Name, undefined, { sensitivity: 'base' });\n }\n const typeCmp = typeOrder[a.Type] - typeOrder[b.Type];\n if (typeCmp !== 0) return dirMult * typeCmp;\n return a.Name.localeCompare(b.Name, undefined, { sensitivity: 'base' });\n });\n }\n\n public setTypeFilter(filter: TypeFilter): void {\n this.typeFilter = filter;\n }\n\n public toggleSort(key: SortKey): void {\n if (this.sortKey === key) {\n this.sortDir = this.sortDir === 'asc' ? 'desc' : 'asc';\n } else {\n this.sortKey = key;\n this.sortDir = 'asc';\n }\n }\n\n public toggleExpanded(param: DisplayParameter): void {\n if (!param.IsExpandable) return;\n param.Expanded = !param.Expanded;\n }\n\n public toggleRawJson(): void {\n this.showRawJson = !this.showRawJson;\n }\n\n public clearFilters(): void {\n this.typeFilter = 'All';\n this.searchText = '';\n }\n\n public trackParam(_index: number, p: DisplayParameter): string {\n return `${p.Type}::${p.Name}`;\n }\n\n public copyParamValue(param: DisplayParameter): void {\n const text = param.IsExpandable\n ? param.FormattedValue\n : this.formatScalarForCopy(param.Value);\n void this.copyToClipboard(text);\n }\n\n private formatScalarForCopy(value: unknown): string {\n if (value === null) return 'null';\n if (value === undefined) return '';\n if (typeof value === 'string') return value;\n return String(value);\n }\n\n /**\n * Returns the icon class for a value kind — rendered to the left of each\n * preview so object/array/scalar rows are visually distinct at a glance.\n */\n public getValueKindIcon(kind: DisplayParameter['ValueKind']): string {\n switch (kind) {\n case 'string': return 'fa-quote-right';\n case 'number': return 'fa-hashtag';\n case 'boolean': return 'fa-toggle-on';\n case 'array': return 'fa-list-ol';\n case 'object': return 'fa-code';\n case 'null': return 'fa-circle-minus';\n case 'undefined': return 'fa-ban';\n }\n }\n\n public getTypeLabel(type: ParamType): string {\n return type === 'Both' ? 'In/Out' : type;\n }\n\n // Navigation\n navigateToEntity(entityName: string, recordId: string | null) {\n if (!recordId) return;\n SharedService.Instance.OpenEntityRecord(entityName, CompositeKey.FromID(recordId));\n }\n\n navigateToAction() {\n if (this.record.ActionID) {\n this.navigateToEntity('MJ: Actions', this.record.ActionID);\n }\n }\n\n navigateToUser() {\n if (this.record.UserID) {\n this.navigateToEntity('MJ: Users', this.record.UserID);\n }\n }\n\n // UI Helpers\n getExecutionDuration(): number {\n if (!this.record.StartedAt || !this.record.EndedAt) return 0;\n return new Date(this.record.EndedAt).getTime() - new Date(this.record.StartedAt).getTime();\n }\n\n formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n if (ms < 3600000) return `${(ms / 60000).toFixed(1)}m`;\n return `${(ms / 3600000).toFixed(1)}h`;\n }\n\n getResultCodeColor(): string {\n const code = this.record.ResultCode?.toLowerCase();\n if (code === 'success' || code === 'ok' || code === 'completed' || code === '200') {\n return 'var(--mj-status-success)';\n }\n return 'var(--mj-status-error)';\n }\n\n getResultCodeIcon(): string {\n const code = this.record.ResultCode?.toLowerCase();\n if (code === 'success' || code === 'ok' || code === 'completed' || code === '200') {\n return 'fa-check-circle';\n }\n return 'fa-times-circle';\n }\n\n // Save handlers for JSON fields\n async saveParams() {\n if (!this.EditMode) return;\n \n try {\n // Validate JSON\n JSON.parse(this.formattedParams);\n this.record.Params = this.formattedParams;\n await this.record.Save();\n } catch (e) {\n console.error('Invalid JSON in Params field:', e);\n // Could show notification here\n }\n }\n\n async saveMessage() {\n if (!this.EditMode) return;\n \n try {\n // Validate JSON\n JSON.parse(this.formattedMessage);\n this.record.Message = this.formattedMessage;\n await this.record.Save();\n } catch (e) {\n console.error('Invalid JSON in Message field:', e);\n // Could show notification here\n }\n }\n \n async copyToClipboard(text: string) {\n try {\n await navigator.clipboard.writeText(text);\n // Could show a toast notification here\n } catch (err) {\n console.error('Failed to copy to clipboard:', err);\n }\n }\n}\n","<div class=\"record-form-container action-execution-log-form\" style=\"height: 100%; display: flex; flex-direction: column;\">\n <div class=\"record-form\" style=\"display: flex; flex-direction: column; height: 100%; overflow: hidden;\">\n <!-- Header -->\n <div class=\"header\">\n <div class=\"header-content\">\n <div class=\"header-left\">\n <div class=\"icon-wrapper\">\n <i class=\"fas fa-terminal\"></i>\n </div>\n <div class=\"header-info\">\n <h2>Action Execution Log</h2>\n <div class=\"meta-info\">\n @if (action) {\n <span class=\"action-name\">{{ action.Name }}</span>\n }\n <span class=\"log-id\">{{ record.ID }}</span>\n </div>\n </div>\n </div>\n <div class=\"header-right\">\n <div class=\"status-badge\" [attr.data-status]=\"record.ResultCode?.toLowerCase()\">\n <i class=\"fas\" [ngClass]=\"getResultCodeIcon()\"></i>\n {{ record.ResultCode || 'UNKNOWN' }}\n </div>\n <div class=\"execution-time\">\n <i class=\"fas fa-clock\"></i>\n {{ formatDuration(getExecutionDuration()) }}\n </div>\n </div>\n </div>\n <div class=\"header-stats\">\n <div class=\"stat\">\n <span class=\"label\">Started</span>\n <span class=\"value\">{{ record.StartedAt | date:'short' }}</span>\n </div>\n @if (record.EndedAt) {\n <div class=\"stat\">\n <span class=\"label\">Ended</span>\n <span class=\"value\">{{ record.EndedAt | date:'short' }}</span>\n </div>\n }\n @if (action) {\n <div class=\"stat\">\n <span class=\"label\">Action</span>\n <span class=\"value\">\n <button class=\"btn-link\" (click)=\"navigateToAction()\">\n {{ action.Name }}\n <i class=\"fas fa-external-link-alt\"></i>\n </button>\n </span>\n </div>\n }\n @if (user) {\n <div class=\"stat\">\n <span class=\"label\">User</span>\n <span class=\"value\">\n <button class=\"btn-link\" (click)=\"navigateToUser()\">\n {{ user.Name }}\n <i class=\"fas fa-external-link-alt\"></i>\n </button>\n </span>\n </div>\n }\n </div>\n </div>\n\n <!-- Content Area -->\n <div class=\"content-area\">\n <div class=\"accordion-container\">\n <!-- Execution Details -->\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-info-circle\"></i> Execution Details\n </ng-template>\n <div class=\"details-grid\">\n <div class=\"detail-item\">\n <label>Execution ID</label>\n <span class=\"monospace\">{{ record.ID }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Action ID</label>\n <span class=\"monospace\">{{ record.ActionID }}</span>\n </div>\n <div class=\"detail-item\">\n <label>User ID</label>\n <span class=\"monospace\">{{ record.UserID }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Result Code</label>\n <span class=\"detail-value\">\n <i class=\"fas\" [ngClass]=\"getResultCodeIcon()\" [style.color]=\"getResultCodeColor()\"></i>\n <span [style.color]=\"getResultCodeColor()\">{{ record.ResultCode || 'N/A' }}</span>\n </span>\n </div>\n <div class=\"detail-item\">\n <label>Duration</label>\n <span>{{ formatDuration(getExecutionDuration()) }}</span>\n </div>\n <div class=\"detail-item\">\n <label>Retention Period</label>\n <span>{{ record.RetentionPeriod ? record.RetentionPeriod + ' days' : 'Indefinite' }}</span>\n </div>\n </div>\n </mj-accordion-panel>\n\n <!-- Unified Parameters section -->\n @if (hasAnyParameters) {\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-sliders-h\"></i>\n Parameters\n <span class=\"param-count-pill\">{{ paramCounts.All }}</span>\n </ng-template>\n <div class=\"params-panel\">\n <!-- Toolbar: filter chips, search, sort, raw toggle -->\n <div class=\"params-toolbar\">\n <div class=\"filter-chips\">\n <button\n type=\"button\"\n class=\"chip\"\n [class.active]=\"typeFilter === 'All'\"\n (click)=\"setTypeFilter('All')\">\n All <span class=\"chip-count\">{{ paramCounts.All }}</span>\n </button>\n <button\n type=\"button\"\n class=\"chip chip-input\"\n [class.active]=\"typeFilter === 'Input'\"\n [disabled]=\"paramCounts.Input === 0\"\n (click)=\"setTypeFilter('Input')\">\n <i class=\"fas fa-sign-in-alt\"></i>\n Input <span class=\"chip-count\">{{ paramCounts.Input }}</span>\n </button>\n <button\n type=\"button\"\n class=\"chip chip-both\"\n [class.active]=\"typeFilter === 'Both'\"\n [disabled]=\"paramCounts.Both === 0\"\n (click)=\"setTypeFilter('Both')\">\n <i class=\"fas fa-exchange-alt\"></i>\n In/Out <span class=\"chip-count\">{{ paramCounts.Both }}</span>\n </button>\n <button\n type=\"button\"\n class=\"chip chip-output\"\n [class.active]=\"typeFilter === 'Output'\"\n [disabled]=\"paramCounts.Output === 0\"\n (click)=\"setTypeFilter('Output')\">\n <i class=\"fas fa-sign-out-alt\"></i>\n Output <span class=\"chip-count\">{{ paramCounts.Output }}</span>\n </button>\n </div>\n\n <div class=\"toolbar-right\">\n <div class=\"search-wrapper\">\n <i class=\"fas fa-search search-icon\"></i>\n <input\n type=\"text\"\n class=\"mj-input params-search\"\n placeholder=\"Search name or value…\"\n [(ngModel)]=\"searchText\"\n name=\"paramSearch\" />\n @if (searchText) {\n <button type=\"button\" class=\"search-clear\" (click)=\"searchText = ''\" title=\"Clear search\">\n <i class=\"fas fa-times\"></i>\n </button>\n }\n </div>\n\n <div class=\"sort-group\" role=\"group\" aria-label=\"Sort parameters\">\n <button\n type=\"button\"\n class=\"sort-btn\"\n [class.active]=\"sortKey === 'type'\"\n (click)=\"toggleSort('type')\"\n title=\"Sort by type\">\n Type\n @if (sortKey === 'type') {\n <i class=\"fas\" [ngClass]=\"sortDir === 'asc' ? 'fa-arrow-down-short-wide' : 'fa-arrow-up-wide-short'\"></i>\n }\n </button>\n <button\n type=\"button\"\n class=\"sort-btn\"\n [class.active]=\"sortKey === 'name'\"\n (click)=\"toggleSort('name')\"\n title=\"Sort by name\">\n Name\n @if (sortKey === 'name') {\n <i class=\"fas\" [ngClass]=\"sortDir === 'asc' ? 'fa-arrow-down-a-z' : 'fa-arrow-up-z-a'\"></i>\n }\n </button>\n </div>\n\n <button\n type=\"button\"\n class=\"raw-toggle\"\n [class.active]=\"showRawJson\"\n (click)=\"toggleRawJson()\"\n title=\"Toggle raw JSON view\">\n <i class=\"fas fa-code\"></i>\n Raw\n </button>\n </div>\n </div>\n\n @if (showRawJson) {\n <div class=\"json-viewer raw-json-viewer\">\n <div class=\"json-toolbar\">\n <span class=\"json-label\">Raw JSON</span>\n <button class=\"btn-icon\" title=\"Copy JSON\" (click)=\"copyToClipboard(formattedParams)\">\n <i class=\"fas fa-copy\"></i>\n </button>\n </div>\n <mj-code-editor\n [(ngModel)]=\"formattedParams\"\n name=\"formattedParamsRaw\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 360px; width: 100%;\">\n </mj-code-editor>\n </div>\n } @else {\n <!-- Rich param list -->\n @if (filteredParameters.length === 0) {\n <div class=\"empty-filter\">\n <i class=\"fas fa-filter-circle-xmark\"></i>\n <p>No parameters match the current filter.</p>\n <button type=\"button\" class=\"btn-link\" (click)=\"clearFilters()\">\n Clear filters\n </button>\n </div>\n } @else {\n <ul class=\"params-list\">\n @for (p of filteredParameters; track trackParam($index, p)) {\n <li class=\"param-row\" [attr.data-type]=\"p.Type\">\n <div class=\"param-header\">\n <span class=\"type-badge\" [attr.data-type]=\"p.Type\">\n @if (p.Type === 'Input') {\n <i class=\"fas fa-sign-in-alt\"></i>\n } @else if (p.Type === 'Output') {\n <i class=\"fas fa-sign-out-alt\"></i>\n } @else {\n <i class=\"fas fa-exchange-alt\"></i>\n }\n {{ getTypeLabel(p.Type) }}\n </span>\n <div class=\"param-name-wrap\">\n <span class=\"param-name\">{{ p.Name }}</span>\n <span class=\"value-kind-chip\" [attr.data-kind]=\"p.ValueKind\">\n <i class=\"fas\" [ngClass]=\"getValueKindIcon(p.ValueKind)\"></i>\n {{ p.ValueKind }}\n </span>\n </div>\n <div class=\"param-actions\">\n @if (p.IsExpandable) {\n <button type=\"button\" class=\"btn-icon param-expand\" [class.is-expanded]=\"p.Expanded\" (click)=\"toggleExpanded(p)\" [title]=\"p.Expanded ? 'Collapse' : 'Expand'\">\n <i class=\"fas\" [ngClass]=\"p.Expanded ? 'fa-chevron-up' : 'fa-chevron-down'\"></i>\n </button>\n }\n <button type=\"button\" class=\"btn-icon\" (click)=\"copyParamValue(p)\" title=\"Copy value\">\n <i class=\"fas fa-copy\"></i>\n </button>\n </div>\n </div>\n <div class=\"param-preview\" [attr.data-kind]=\"p.ValueKind\">{{ p.Preview }}</div>\n @if (p.IsExpandable && p.Expanded) {\n <div class=\"param-expanded\">\n <mj-code-editor\n [(ngModel)]=\"p.FormattedValue\"\n [name]=\"'param-' + p.Name\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 240px; width: 100%;\">\n </mj-code-editor>\n </div>\n }\n </li>\n }\n </ul>\n }\n }\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Output Message -->\n @if (record.Message) {\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-comment-alt\"></i> Output Message\n </ng-template>\n <div class=\"json-viewer\">\n <div class=\"json-toolbar\">\n <span class=\"json-label\">JSON</span>\n <button class=\"btn-icon\" title=\"Copy JSON\" (click)=\"copyToClipboard(formattedMessage)\">\n <i class=\"fas fa-copy\"></i>\n </button>\n </div>\n <mj-code-editor \n [(ngModel)]=\"formattedMessage\"\n name=\"formattedMessage\"\n [readonly]=\"true\"\n [language]=\"'json'\"\n [lineWrapping]=\"true\"\n style=\"height: 300px; width: 100%;\">\n </mj-code-editor>\n </div>\n </mj-accordion-panel>\n }\n\n <!-- Empty States for missing data -->\n @if (!record.Params && !record.Message && !hasAnyParameters) {\n <mj-accordion-panel [Expanded]=\"true\">\n <ng-template mjAccordionTitle>\n <i class=\"fas fa-database\"></i> Execution Data\n </ng-template>\n <div class=\"empty-state\">\n <i class=\"fas fa-inbox\"></i>\n <p>No execution data recorded</p>\n </div>\n </mj-accordion-panel>\n }\n </div>\n </div>\n </div>\n</div>"]}