@memberjunction/ng-core-entity-forms 5.21.0 → 5.23.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 (157) hide show
  1. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts +4 -5
  2. package/dist/lib/custom/AIAgents/add-action-dialog.component.d.ts.map +1 -1
  3. package/dist/lib/custom/AIAgents/add-action-dialog.component.js +55 -59
  4. package/dist/lib/custom/AIAgents/add-action-dialog.component.js.map +1 -1
  5. package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js +0 -1
  6. package/dist/lib/custom/AIAgents/agent-advanced-settings-dialog.component.js.map +1 -1
  7. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts +4 -5
  8. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.d.ts.map +1 -1
  9. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js +54 -71
  10. package/dist/lib/custom/AIAgents/agent-prompt-advanced-settings-dialog.component.js.map +1 -1
  11. package/dist/lib/custom/AIAgents/ai-agent-form.component.d.ts.map +1 -1
  12. package/dist/lib/custom/AIAgents/ai-agent-form.component.js +1053 -1096
  13. package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
  14. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts +2 -3
  15. package/dist/lib/custom/AIAgents/ai-agent-management.service.d.ts.map +1 -1
  16. package/dist/lib/custom/AIAgents/ai-agent-management.service.js +39 -82
  17. package/dist/lib/custom/AIAgents/ai-agent-management.service.js.map +1 -1
  18. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts +4 -5
  19. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.d.ts.map +1 -1
  20. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js +28 -31
  21. package/dist/lib/custom/AIAgents/create-prompt-dialog.component.js.map +1 -1
  22. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts +4 -5
  23. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.d.ts.map +1 -1
  24. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js +15 -14
  25. package/dist/lib/custom/AIAgents/create-sub-agent-dialog.component.js.map +1 -1
  26. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts +4 -7
  27. package/dist/lib/custom/AIAgents/new-agent-dialog.component.d.ts.map +1 -1
  28. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js +77 -124
  29. package/dist/lib/custom/AIAgents/new-agent-dialog.component.js.map +1 -1
  30. package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts +2 -2
  31. package/dist/lib/custom/AIAgents/new-agent-dialog.service.d.ts.map +1 -1
  32. package/dist/lib/custom/AIAgents/new-agent-dialog.service.js +10 -11
  33. package/dist/lib/custom/AIAgents/new-agent-dialog.service.js.map +1 -1
  34. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts +4 -5
  35. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.d.ts.map +1 -1
  36. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js +18 -18
  37. package/dist/lib/custom/AIAgents/prompt-selector-dialog.component.js.map +1 -1
  38. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts +4 -5
  39. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.d.ts.map +1 -1
  40. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js +59 -80
  41. package/dist/lib/custom/AIAgents/sub-agent-advanced-settings-dialog.component.js.map +1 -1
  42. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts +4 -5
  43. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.d.ts.map +1 -1
  44. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js +23 -24
  45. package/dist/lib/custom/AIAgents/sub-agent-selector-dialog.component.js.map +1 -1
  46. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.d.ts.map +1 -1
  47. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js +862 -906
  48. package/dist/lib/custom/AIPromptRuns/ai-prompt-run-form.component.js.map +1 -1
  49. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js +4 -5
  50. package/dist/lib/custom/AIPromptRuns/chat-message-viewer.component.js.map +1 -1
  51. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +448 -499
  52. package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
  53. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts +2 -2
  54. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.d.ts.map +1 -1
  55. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js +6 -11
  56. package/dist/lib/custom/AIPrompts/ai-prompt-management.service.js.map +1 -1
  57. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts +4 -5
  58. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.d.ts.map +1 -1
  59. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js +16 -15
  60. package/dist/lib/custom/AIPrompts/template-selector-dialog.component.js.map +1 -1
  61. package/dist/lib/custom/Actions/action-execution-log-form.component.js +160 -166
  62. package/dist/lib/custom/Actions/action-execution-log-form.component.js.map +1 -1
  63. package/dist/lib/custom/Actions/action-form.component.d.ts.map +1 -1
  64. package/dist/lib/custom/Actions/action-form.component.js +93 -94
  65. package/dist/lib/custom/Actions/action-form.component.js.map +1 -1
  66. package/dist/lib/custom/Entities/entity-form.component.js +2 -2
  67. package/dist/lib/custom/Lists/list-form.component.js +61 -63
  68. package/dist/lib/custom/Lists/list-form.component.js.map +1 -1
  69. package/dist/lib/custom/Queries/query-category-dialog.component.js +33 -59
  70. package/dist/lib/custom/Queries/query-category-dialog.component.js.map +1 -1
  71. package/dist/lib/custom/Queries/query-form.component.js +354 -360
  72. package/dist/lib/custom/Queries/query-form.component.js.map +1 -1
  73. package/dist/lib/custom/Queries/query-run-dialog.component.js +62 -71
  74. package/dist/lib/custom/Queries/query-run-dialog.component.js.map +1 -1
  75. package/dist/lib/custom/Templates/template-param-dialog.component.js +128 -124
  76. package/dist/lib/custom/Templates/template-param-dialog.component.js.map +1 -1
  77. package/dist/lib/custom/Templates/template-params-grid.component.d.ts +45 -22
  78. package/dist/lib/custom/Templates/template-params-grid.component.d.ts.map +1 -1
  79. package/dist/lib/custom/Templates/template-params-grid.component.js +380 -384
  80. package/dist/lib/custom/Templates/template-params-grid.component.js.map +1 -1
  81. package/dist/lib/custom/Templates/templates-form.component.js +34 -36
  82. package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
  83. package/dist/lib/custom/Tests/test-form.component.js +9 -10
  84. package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
  85. package/dist/lib/custom/Tests/test-run-feedback-form.component.js +4 -4
  86. package/dist/lib/custom/Tests/test-run-feedback-form.component.js.map +1 -1
  87. package/dist/lib/custom/Tests/test-run-form.component.js +8 -8
  88. package/dist/lib/custom/Tests/test-run-form.component.js.map +1 -1
  89. package/dist/lib/custom/Tests/test-suite-form.component.js +7 -8
  90. package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
  91. package/dist/lib/custom/Tests/test-suite-run-form.component.js +7 -8
  92. package/dist/lib/custom/Tests/test-suite-run-form.component.js.map +1 -1
  93. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js +381 -409
  94. package/dist/lib/custom/ai-agent-run/ai-agent-run-analytics.component.js.map +1 -1
  95. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.d.ts.map +1 -1
  96. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js +1 -1
  97. package/dist/lib/custom/ai-agent-run/ai-agent-run-data.service.js.map +1 -1
  98. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.d.ts.map +1 -1
  99. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js +74 -63
  100. package/dist/lib/custom/ai-agent-run/ai-agent-run-timeline.component.js.map +1 -1
  101. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js +10 -10
  102. package/dist/lib/custom/ai-agent-run/ai-agent-run-visualization.component.js.map +1 -1
  103. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.d.ts.map +1 -1
  104. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js +352 -332
  105. package/dist/lib/custom/ai-agent-run/ai-agent-run.component.js.map +1 -1
  106. package/dist/lib/custom/custom-forms.module.d.ts +22 -27
  107. package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
  108. package/dist/lib/custom/custom-forms.module.js +51 -81
  109. package/dist/lib/custom/custom-forms.module.js.map +1 -1
  110. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts +4 -5
  111. package/dist/lib/custom/shared/entity-selector-dialog.component.d.ts.map +1 -1
  112. package/dist/lib/custom/shared/entity-selector-dialog.component.js +59 -66
  113. package/dist/lib/custom/shared/entity-selector-dialog.component.js.map +1 -1
  114. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
  115. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +176 -156
  116. package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
  117. package/dist/lib/generated/Entities/MJAIAgentClientTool/mjaiagentclienttool.form.component.d.ts +10 -0
  118. package/dist/lib/generated/Entities/MJAIAgentClientTool/mjaiagentclienttool.form.component.d.ts.map +1 -0
  119. package/dist/lib/generated/Entities/MJAIAgentClientTool/mjaiagentclienttool.form.component.js +65 -0
  120. package/dist/lib/generated/Entities/MJAIAgentClientTool/mjaiagentclienttool.form.component.js.map +1 -0
  121. package/dist/lib/generated/Entities/MJAIClientToolDefinition/mjaiclienttooldefinition.form.component.d.ts +10 -0
  122. package/dist/lib/generated/Entities/MJAIClientToolDefinition/mjaiclienttooldefinition.form.component.d.ts.map +1 -0
  123. package/dist/lib/generated/Entities/MJAIClientToolDefinition/mjaiclienttooldefinition.form.component.js +89 -0
  124. package/dist/lib/generated/Entities/MJAIClientToolDefinition/mjaiclienttooldefinition.form.component.js.map +1 -0
  125. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.d.ts.map +1 -1
  126. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js +80 -44
  127. package/dist/lib/generated/Entities/MJAIModel/mjaimodel.form.component.js.map +1 -1
  128. package/dist/lib/generated/Entities/MJContentItemTag/mjcontentitemtag.form.component.js +11 -8
  129. package/dist/lib/generated/Entities/MJContentItemTag/mjcontentitemtag.form.component.js.map +1 -1
  130. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.d.ts.map +1 -1
  131. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js +39 -24
  132. package/dist/lib/generated/Entities/MJContentSource/mjcontentsource.form.component.js.map +1 -1
  133. package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.d.ts.map +1 -1
  134. package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js +35 -17
  135. package/dist/lib/generated/Entities/MJContentType/mjcontenttype.form.component.js.map +1 -1
  136. package/dist/lib/generated/Entities/MJDuplicateRunDetail/mjduplicaterundetail.form.component.js +15 -13
  137. package/dist/lib/generated/Entities/MJDuplicateRunDetail/mjduplicaterundetail.form.component.js.map +1 -1
  138. package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.d.ts.map +1 -1
  139. package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.js +7 -9
  140. package/dist/lib/generated/Entities/MJDuplicateRunDetailMatch/mjduplicaterundetailmatch.form.component.js.map +1 -1
  141. package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js +28 -24
  142. package/dist/lib/generated/Entities/MJEntityDocument/mjentitydocument.form.component.js.map +1 -1
  143. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.d.ts.map +1 -1
  144. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js +21 -9
  145. package/dist/lib/generated/Entities/MJEntityField/mjentityfield.form.component.js.map +1 -1
  146. package/dist/lib/generated/Entities/MJVectorDatabase/mjvectordatabase.form.component.js +19 -17
  147. package/dist/lib/generated/Entities/MJVectorDatabase/mjvectordatabase.form.component.js.map +1 -1
  148. package/dist/lib/generated/Entities/MJVectorIndex/mjvectorindex.form.component.d.ts.map +1 -1
  149. package/dist/lib/generated/Entities/MJVectorIndex/mjvectorindex.form.component.js +82 -14
  150. package/dist/lib/generated/Entities/MJVectorIndex/mjvectorindex.form.component.js.map +1 -1
  151. package/dist/lib/generated/generated-forms.module.d.ts +280 -279
  152. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
  153. package/dist/lib/generated/generated-forms.module.js +102 -142
  154. package/dist/lib/generated/generated-forms.module.js.map +1 -1
  155. package/dist/lib/shared/components/template-editor.component.js +14 -15
  156. package/dist/lib/shared/components/template-editor.component.js.map +1 -1
  157. package/package.json +34 -41
@@ -1 +1 @@
1
- {"version":3,"file":"query-run-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Queries/query-run-dialog.component.ts","../../../../src/lib/custom/Queries/query-run-dialog.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAoC,iBAAiB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAGpI,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;;;;;;;;;;ICSxC,8BAAyF;IACvF,uBAAqH;IACrH,+BAA2C;IAAA,2CAA2B;IACxE,AADwE,iBAAO,EACzE;;;IAQA,gCAA8E;IAC5E,wBAAwE;IACxE,kCACA;IAAA,gCAAwH;IACtH,YACF;IACF,AADE,iBAAO,EACF;;;IAFH,eACF;IADE,6DACF;;;IAkBY,gCAA8B;IAAA,iBAAC;IAAA,iBAAO;;;IAIxC,+BAA8E;IAC5E,YACF;IAAA,iBAAM;;;IADJ,cACF;IADE,qDACF;;;IAQA,wBAA4G;;;;IAMhH,gDAGuB;IAFrB,yXAAyB;IAG3B,iBAAuB;;;IAHrB,8CAAyB;;;;IAK3B,0CAI8D;IAH5D,mXAAyB;IAI3B,iBAAiB;;;IAJf,8CAAyB;IACzB,wBAAU;;;IAMZ,+BAA6E;IAC3E,0BAAS;IAAA,gCAA6F;IAAA,YAAwB;IAChI,AADgI,iBAAO,EACjI;;;IADkG,eAAwB;IAAxB,2CAAwB;;;IAvC9H,AADF,AADF,AADF,+BAAqI,cAC1B,UAClG,gBAC6G;IAC9G,wBAAsE;IACtE,YACA;IAAA,2IAAwB;IAG1B,iBAAQ;IACR,0IAAyB;IAK3B,iBAAM;IAEJ,AADF,+BAA2D,eAC4E;IACnI,aACF;IAAA,iBAAO;IACP,0IAAgC;IAIpC,AADE,iBAAM,EACF;IAQJ,AANF,6JAA+B,iIAMtB;IAQT,4IAA0B;IAK5B,iBAAM;;;;IAxCE,eACA;IADA,8CACA;IAAA,cAEC;IAFD,8CAEC;IAEH,cAIC;IAJD,+CAIC;IAIC,eACF;IADE,8CACF;IACA,cAEC;IAFD,8DAEC;IAIL,cAaC;IAbD,sDAaC;IACD,eAIC;IAJD,iDAIC;;;;IAhEX,gDAE+C;IAD7C,iXAAiC;IAEjC,mIAA+C;IAU7C,AADF,+BAA8B,cACsD;IAChF,wBAAuC;IACvC,iEACF;IAAA,iBAAM;IAEN,+BAA+D;IAC7D,sIA+CC;IAGP,AADE,AADE,iBAAM,EACF,EACe;;;IApErB,0DAAiC;IAkB7B,eA+CC;IA/CD,oCA+CC;;;IAKP,8BAA+J;IAC7J,wBAAuC;IAAC,+CAC1C;IAAA,iBAAM;;;IAWA,gCAAqI;IACnI,YACF;IAAA,iBAAO;;;IADL,cACF;IADE,yDACF;;;IANJ,gCAA8E;IAC5E,wBAA2E;IAC3E,qCACA;IAAA,qIAA8B;IAKhC,iBAAO;;;IALL,eAIC;IAJD,+DAIC;;;IAwDK,gCAAwH;IACtH,YACF;IAAA,iBAAO;;;IADL,cACF;IADE,wEACF;;;IANF,gCAAwH;IACtH,YACF;IAAA,iBAAO;IACP,kKAAoD;;;IAFlD,cACF;IADE,+DACF;IACA,cAIC;IAJD,qFAIC;;;IAED,gCAAwH;IACtH,uBACF;IAAA,iBAAO;;;IAGP,gCAAkF;IAChF,YACF;IAAA,iBAAO;;;IADL,cACF;IADE,mEACF;;;IApBJ,gCAA8E;IAC5E,wBAAyD;IACzD,+BACA;IASE,AATF,wIAAyB,8HAShB;IAKT,oJAA+B;IAKjC,iBAAO;;;IAnBL,eAaC;IAbD,kDAaC;IACD,eAIC;IAJD,yDAIC;;;;IAWO,gCAA6D;IAC3D,YACF;IAAA,iBAAO;IAEL,AADF,+BAAsC,iBAMf;IADnB,oQAAS,sBAAe,KAAC;IAEzB,wBAAuC;IACzC,iBAAS;IACT,kCAKwB;IADtB,oQAAS,yBAAkB,KAAC;IAE5B,wBAAsC;IACxC,iBAAS;IACT,kCAKoB;IADlB,oQAAS,qBAAc,KAAC;IAExB,wBAAuC;IACzC,iBAAS;IACT,kCAKoB;IADlB,oQAAS,qBAAc,KAAC;IAExB,yBAAwC;IAE5C,AADE,iBAAS,EACL;;;IAnCJ,cACF;IADE,6JACF;IAKI,eAA2B;IAA3B,gDAA2B;IAQ3B,eAA2B;IAA3B,gDAA2B;IAQ3B,eAAqE;IAArE,wGAAqE;IAQrE,eAAqE;IAArE,wGAAqE;;;IA8BrE,8BAAsN;IACpN,YACF;IAAA,iBAAK;;;IADH,cACF;IADE,8CACF;;;IAQE,8BAC2B;IACzB,YACF;IAAA,iBAAK;;;;IAFH,8CAAwB;IACxB,cACF;IADE,6DACF;;;IALJ,8BAAkG;IAChG,wKAKC;IACH,iBAAK;;;IANH,cAKC;IALD,mCAKC;;;IAMP,+BAA6E;IAC3E,wBAA6F;IAC7F,yBAAG;IAAA,kCAAkB;IACvB,AADuB,iBAAI,EACrB;;;;IAtFR,AAFF,+BAAmJ,cAErF;IAC1D,uJAAoE;IAuCtE,iBAAM;IAGJ,AADF,+BAAsC,iBAIR;IAD1B,qPAAS,wBAAiB,KAAC;IAE3B,wBAAgC;IAAC,sBACnC;IAAA,iBAAS;IACT,kCAGwB;IADtB,qPAAS,oBAAa,KAAC;IAEvB,wBAAoC;IAAC,4BACvC;IAEJ,AADE,AADE,iBAAS,EACL,EACF;IAKA,AADF,AADF,AADF,gCAAqJ,iBACrD,iBACG,UACzF;IACF,mKAIC;IAEL,AADE,iBAAK,EACC;IACR,8BAAO;IACL,kLASC;IAEL,AADE,iBAAQ,EACF;IACR,mKAA+B;IAMjC,iBAAM;;;IAvFF,eAsCC;IAtCD,4GAsCC;IAuBG,gBAIC;IAJD,mCAIC;IAIH,eASC;IATD,gCASC;IAGL,eAKC;IALD,0DAKC;;;IAGH,+BAAsH;IACpH,wBAA+E;IAC/E,yBAAG;IAAA,mCAAmB;IACxB,AADwB,iBAAI,EACtB;;;IAJN,AA7FF,yIAA6B,6HA6FpB;;;IA7FT,sDAkGC;;;IAQG,+BAAuF;IACrF,YACF;IAAA,iBAAM;;;IADJ,cACF;IADE,8DACF;;;IAPF,AADF,+BAA8G,cAC/E;IAC3B,wBAA8C;IAC9C,8BAAQ;IAAA,sCAAsB;IAChC,AADgC,iBAAS,EACnC;IACN,mJAA8B;IAKhC,iBAAM;;;IALJ,eAIC;IAJD,wDAIC;;;;IA3IT,gDAE2F;IADzF,4WAA8B;IAE9B,oIAA+C;IAyB/C,+BAA8F;IAqG1F,AApGF,0HAAyB,+GAoGhB;IAcb,AADE,iBAAM,EACe;;;IA9IrB,uDAA8B;IA4B5B,eAgHC;IAhHD,kDAgHC;;;;IA1ML,AAvEF,sIAAiC,+FAuExB;IAMT,gDAE+B;IAD7B,mWAAiC;IAEjC,qHAA+C;IAezC,AADF,AAFF,AADF,+BAA8B,cACmC,cAED,gBAC+C;IACvG,wBAA2F;IAC3F,2BACF;IAAA,iBAAQ;IACR,iDAKwB;IAJtB,4UAAqB;IAKvB,iBAAuB;IACvB,iCAA8D;IAC5D,iDACF;IACF,AADE,iBAAO,EACH;IAGJ,AADF,gCAA4D,iBAC+C;IACvG,yBAA2F;IAC3F,6BACF;IAAA,iBAAQ;IACR,iDAKwB;IAJtB,8UAAsB;IAKxB,iBAAuB;IACvB,iCAA8D;IAC5D,gDACF;IAIR,AADE,AADE,AADE,AADE,iBAAO,EACH,EACF,EACF,EACe;IAEvB,yIAAiB;;;IAnIjB,0DA2EC;IAGC,eAAiC;IAAjC,0DAAiC;IAsBzB,eAAqB;IAArB,8CAAqB;IAErB,AADA,uBAAS,aACG;IAeZ,eAAsB;IAAtB,+CAAsB;IAEtB,AADA,uBAAS,WACC;IAYpB,eAiJC;IAjJD,4CAiJC;;;IAaG,wBAA2C;IAAC,4BAC9C;;;IACE,wBAAgC;IAAC,2BACnC;;;;IAXF,kCAAsC;IAAlB,2MAAS,cAAO,KAAC;IACnC,wBAAiC;IAAC,wBACpC;IAAA,iBAAS;IACT,kCAGuB;IAArB,2MAAS,iBAAU,KAAC;IAGlB,AAFF,2GAAiB,qFAER;IAGX,iBAAS;;;IARP,eAAwB;IACxB,AADA,sCAAwB,+DACwB;IAEhD,cAIC;IAJD,0CAIC;;;;IAGH,kCAAsC;IAAlB,4MAAS,cAAO,KAAC;IACnC,wBAAiC;IAAC,uBACpC;IAAA,iBAAS;IACT,kCAGuB;IAArB,4MAAS,iBAAU,KAAC;IACpB,wBAAmC;IAAC,2BACtC;IAAA,iBAAS;;;IAJP,eAAwB;IACxB,AADA,sCAAwB,8BACF;;;;IA9T9B,uCAGoB;IAAlB,iMAAS,cAAO,KAAC;IAEf,AADF,6CAAuB,aACsC;IACzD,uBAA+E;IAC/E,YACF;IACF,AADE,iBAAM,EACgB;IACxB,8BAAwG;IAMpG,AALF,uGAAuB,wEAKd;IAwRX,iBAAM;IACN,4CAAsB;IAelB,AAdF,6FAAkB,yEAcT;IAYb,AADE,iBAAuB,EACV;;;IAlUb,AADA,2BAAa,eACC;IAKV,eACF;IADE,2GACF;IAGA,eA4RC;IA5RD,gDA4RC;IAGD,eAwBC;IAxBD,4CAwBC;;ADlSP,MAAM,OAAO,uBAAuB;IANpC;QAOY,QAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAE/B,UAAK,GAAyB,IAAI,CAAC;QACnC,eAAU,GAA6B,EAAE,CAAC;QAC1C,cAAS,GAAG,KAAK,CAAC;QACjB,oBAAe,GAAG,IAAI,YAAY,EAAW,CAAC;QAC9C,YAAO,GAAG,IAAI,YAAY,EAAQ,CAAC;QAEtC,cAAS,GAAG,KAAK,CAAC;QAClB,oBAAe,GAAG,KAAK,CAAC;QACxB,mBAAc,GAAoB,EAAE,CAAC;QACrC,uBAAkB,GAAG,IAAI,CAAC;QAC1B,oBAAe,GAAG,IAAI,CAAC;QACvB,uBAAkB,GAAG,KAAK,CAAC;QAC3B,cAAS,GAA0B,IAAI,CAAC;QACxC,kBAAa,GAAU,EAAE,CAAC;QAC1B,eAAU,GAAU,EAAE,CAAC;QACvB,iBAAY,GAAU,EAAE,CAAC;QACzB,YAAO,GAAkB,IAAI,CAAC;QAC9B,aAAQ,GAAW,CAAC,CAAC;KA+W/B;IA7WG,QAAQ;QACJ,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAChC,CAAC;IAED,WAAW,CAAC,OAAsB;QAC9B,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,YAAY,EAAE,CAAC;YAC5D,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC;QACD,IAAI,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC;IACL,CAAC;IAEO,oBAAoB;QACxB,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAE5C,4DAA4D;QAC5D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChD,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE;YAC/B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,QAAQ;YAC5B,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE;YACtC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;YACpC,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK;SACxC,CAAC,CAAC,CAAC;IACR,CAAC;IAED,mBAAmB,CAAC,SAAiB;QACjC,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAE1B,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACxD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED,gBAAgB,CAAC,KAAoB;QACjC,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,oDAAoD;QACpD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACzC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,sBAA+B,KAAK;QAC/C,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE;YAAE,OAAO;QAE5B,+BAA+B;QAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAChF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CACnD,gCAAgC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC3E,SAAS,EACT,IAAI,CACP,CAAC;YACF,OAAO;QACX,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,IAAI,CAAC;YACD,0BAA0B;YAC1B,MAAM,eAAe,GAAwB,EAAE,CAAC;YAChD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBAChC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBACd,IAAI,CAAC;wBACD,iDAAiD;wBACjD,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC1D,CAAC;oBAAC,MAAM,CAAC;wBACL,iEAAiE;wBACjE,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;4BAC1B,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;wBACtD,CAAC;6BAAM,CAAC;4BACJ,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;wBAC9C,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,4BAA4B;YAC5B,MAAM,YAAY,GAAG,QAAQ,CAAC,QAA+B,CAAC;YAE9D,yCAAyC;YACzC,MAAM,KAAK,GAAG;;;;;;;;;;;;;;aAcb,CAAC;YAEF,MAAM,SAAS,GAAQ;gBACnB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;gBACtB,UAAU,EAAE,eAAe;aAC9B,CAAC;YAEF,mCAAmC;YACnC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;gBACnC,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YACrC,CAAC;YAED,uDAAuD;YACvD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACrC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YACvC,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,SAAS,CAAC,CAAC;YAE1D,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,UAAU,CAC1C,KAAK,EACL,SAAS,CACsB,CAAC;YAEpC,IAAI,QAAQ,EAAE,YAAY,EAAE,CAAC;gBACzB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC;gBAEvC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;oBACnD,gCAAgC;oBAChC,IAAI,CAAC;wBACD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;wBACzD,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;wBACnC,uDAAuD;wBACvD,IAAI,CAAC,mBAAmB,EAAE,CAAC;4BACvB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ;gCACtE,CAAC,CAAC,wCAAwC,IAAI,CAAC,SAAS,CAAC,QAAQ,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,cAAc;gCAClH,CAAC,CAAC,gCAAgC,IAAI,CAAC,SAAS,CAAC,QAAQ,iBAAiB,CAAC;4BAC/E,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CACnD,WAAW,EACX,SAAS,EACT,IAAI,CACP,CAAC;wBACN,CAAC;wBAED,2DAA2D;wBAC3D,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;wBAChC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;wBAChC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;oBAChC,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACb,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;wBAC/C,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CACnD,+BAA+B,EAC/B,OAAO,EACP,IAAI,CACP,CAAC;oBACN,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;oBACzD,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CACnD,IAAI,CAAC,SAAS,EAAE,YAAY,IAAI,wBAAwB,EACxD,OAAO,EACP,IAAI,CACP,CAAC;oBAEF,uCAAuC;oBACvC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;oBAChC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;oBAChC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;gBAChC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC/C,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,IAAI,CAAC,SAAS,GAAG;gBACb,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;gBACtB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;gBAC1B,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI;gBACb,YAAY,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB;gBAC/E,QAAQ,EAAE,CAAC;gBACX,aAAa,EAAE,CAAC;gBAChB,aAAa,EAAE,CAAC;aACnB,CAAC;YACF,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CACnD,sEAAsE,EACtE,OAAO,EACP,IAAI,CACP,CAAC;QACN,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAEO,cAAc,CAAC,OAAc;QACjC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YACrB,OAAO;QACX,CAAC;QAED,iCAAiC;QACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnD,KAAK,EAAE,GAAG;YACV,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;YAClC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC;SACjD,CAAC,CAAC,CAAC;QAEJ,WAAW;QACX,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;IAC9B,CAAC;IAEO,iBAAiB,CAAC,KAAa;QACnC,gDAAgD;QAChD,OAAO,KAAK;aACP,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC;aAC1B,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;aAClB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;aACnB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aACvE,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAEO,oBAAoB,CAAC,KAAa,EAAE,IAAW;QACnD,sDAAsD;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACtB,KAAK,CAAC,MAAM,EACZ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CACnE,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IAED,WAAW;QACP,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CACnD,mBAAmB,EACnB,SAAS,EACT,IAAI,CACP,CAAC;YACF,OAAO;QACX,CAAC;QAED,qBAAqB;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CACnC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACzB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC7B,4CAA4C;YAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC5E,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;YAC5C,CAAC;YACD,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CACf,CAAC;QAEF,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1C,2BAA2B;QAC3B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;QACb,CAAC,CAAC,QAAQ,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,OAAO,YAAY,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC;QACnG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,KAAK,EAAE,CAAC;QACV,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAEhC,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CACnD,yBAAyB,EACzB,SAAS,EACT,IAAI,CACP,CAAC;IACN,CAAC;IAED,KAAK,CAAC,eAAe;QACjB,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CACnD,iBAAiB,EACjB,SAAS,EACT,IAAI,CACP,CAAC;YACF,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,sDAAsD;YACtD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpE,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CACnC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACjE,CAAC;YAEF,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAE7C,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CACnD,6BAA6B,EAC7B,SAAS,EACT,IAAI,CACP,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACrD,qBAAqB,CAAC,QAAQ,CAAC,wBAAwB,CACnD,6BAA6B,EAC7B,OAAO,EACP,IAAI,CACP,CAAC;QACN,CAAC;IACL,CAAC;IAED,KAAK;QACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAEpB,cAAc;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,yBAAyB;QACrB,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IAC3D,CAAC;IAED,oBAAoB;QAChB,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,qBAAqB;IACrB,aAAa;QACT,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,gBAAgB;QACZ,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;IACL,CAAC;IAED,YAAY;QACR,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;YAC3G,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;IACL,CAAC;IAED,YAAY;QACR,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1E,IAAI,CAAC,QAAQ,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YAChD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;IACL,CAAC;wHAlYQ,uBAAuB;oEAAvB,uBAAuB;YCjCpC,mGAAiB;;YAAjB,wCAsUC;;;iFDrSY,uBAAuB;cANnC,SAAS;6BACI,KAAK,YACL,qBAAqB;;kBAO9B,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,MAAM;;kBACN,MAAM;;kFAPE,uBAAuB","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef, inject } from '@angular/core';\nimport { MJQueryEntity, MJQueryParameterEntity } from '@memberjunction/core-entities';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { Metadata } from '@memberjunction/core';\n\ninterface QueryRunResult {\n QueryID: string;\n QueryName: string;\n Success: boolean;\n Results: string; // This is a JSON string that needs to be parsed\n ErrorMessage: string;\n RowCount: number;\n TotalRowCount: number;\n ExecutionTime: number;\n AppliedParameters?: string; // JSON string of applied parameters\n}\n\ninterface ParameterPair {\n name: string;\n value: string;\n type: string;\n defaultValue: string;\n description: string;\n isRequired: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-query-run-dialog',\n templateUrl: './query-run-dialog.component.html',\n styleUrls: ['./query-run-dialog.component.css']\n})\nexport class QueryRunDialogComponent implements OnInit, OnChanges {\n private cdr = inject(ChangeDetectorRef);\n\n @Input() query: MJQueryEntity | null = null;\n @Input() parameters: MJQueryParameterEntity[] = [];\n @Input() isVisible = false;\n @Output() isVisibleChange = new EventEmitter<boolean>();\n @Output() onClose = new EventEmitter<void>();\n\n public isRunning = false;\n public isLoadingParams = false;\n public parameterPairs: ParameterPair[] = [];\n public parametersExpanded = true;\n public resultsExpanded = true;\n public paginationExpanded = false;\n public runResult: QueryRunResult | null = null;\n public resultColumns: any[] = [];\n public resultRows: any[] = [];\n public selectedRows: any[] = [];\n public maxRows: number | null = null;\n public startRow: number = 0;\n\n ngOnInit() {\n this.initializeParameters();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['isVisible'] && changes['isVisible'].currentValue) {\n this.initializeParameters();\n }\n if (changes['parameters']) {\n this.initializeParameters();\n }\n }\n\n private initializeParameters() {\n if (!this.query || !this.parameters) return;\n\n // Create parameter pairs from defined query parameters only\n this.parameterPairs = this.parameters.map(param => ({\n name: param.Name,\n value: param.DefaultValue || '',\n type: param.Type || 'string',\n defaultValue: param.DefaultValue || '',\n description: param.Description || '',\n isRequired: param.IsRequired || false\n }));\n }\n\n getValueListOptions(valueList: string): Array<{text: string, value: string}> {\n if (!valueList) return [];\n \n try {\n const options = valueList.split(',').map(v => v.trim());\n return options.map(opt => ({ text: opt, value: opt }));\n } catch {\n return [];\n }\n }\n\n isParameterValid(param: ParameterPair): boolean {\n if (param.isRequired && !param.value) {\n return false;\n }\n \n // Additional type-specific validation could go here\n if (param.type === 'number' && param.value) {\n return !isNaN(Number(param.value));\n }\n \n return true;\n }\n\n async runQuery(isPaginationRequest: boolean = false) {\n if (!this.query?.ID) return;\n\n // Validate required parameters\n const invalidParams = this.parameterPairs.filter(p => p.isRequired && !p.value);\n if (invalidParams.length > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Required parameters missing: ${invalidParams.map(p => p.name).join(', ')}`,\n 'warning',\n 3000\n );\n return;\n }\n\n this.isRunning = true;\n this.runResult = null;\n\n try {\n // Build parameters object\n const queryParameters: Record<string, any> = {};\n this.parameterPairs.forEach(param => {\n if (param.value) {\n try {\n // Try to parse as JSON first, fallback to string\n queryParameters[param.name] = JSON.parse(param.value);\n } catch {\n // If JSON parsing fails, treat as string or number based on type\n if (param.type === 'number') {\n queryParameters[param.name] = Number(param.value);\n } else {\n queryParameters[param.name] = param.value;\n }\n }\n }\n });\n\n // Get GraphQL data provider\n const dataProvider = Metadata.Provider as GraphQLDataProvider;\n \n // Execute the GetQueryData GraphQL query\n const query = `\n query GetQueryData($QueryID: String!, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryData(QueryID: $QueryID, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n QueryID\n QueryName\n Success\n Results\n ErrorMessage\n RowCount\n TotalRowCount\n ExecutionTime\n AppliedParameters\n }\n }\n `;\n\n const variables: any = {\n QueryID: this.query.ID,\n Parameters: queryParameters\n };\n \n // Only include MaxRows if it's set\n if (this.maxRows && this.maxRows > 0) {\n variables.MaxRows = this.maxRows;\n }\n \n // Only include StartRow if it's set and greater than 0\n if (this.startRow && this.startRow > 0) {\n variables.StartRow = this.startRow;\n }\n\n console.log('Executing query with variables:', variables);\n \n const response = await dataProvider.ExecuteGQL(\n query, \n variables\n ) as {GetQueryData: QueryRunResult};\n\n if (response?.GetQueryData) {\n this.runResult = response.GetQueryData;\n \n if (this.runResult.Success && this.runResult.Results) {\n // Parse the JSON string results\n try {\n const parsedResults = JSON.parse(this.runResult.Results);\n this.processResults(parsedResults);\n // Only show notification on first run (not pagination)\n if (!isPaginationRequest) {\n const rowCountMsg = this.runResult.TotalRowCount > this.runResult.RowCount\n ? `Query executed successfully. Showing ${this.runResult.RowCount} of ${this.runResult.TotalRowCount} total rows.`\n : `Query executed successfully. ${this.runResult.RowCount} rows returned.`;\n MJNotificationService.Instance.CreateSimpleNotification(\n rowCountMsg,\n 'success',\n 3000\n );\n }\n \n // Automatically expand results and collapse other sections\n this.parametersExpanded = false;\n this.paginationExpanded = false;\n this.resultsExpanded = true;\n } catch (error) {\n console.error('Error parsing results:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to parse query results',\n 'error',\n 3000\n );\n }\n } else {\n console.error('Query execution failed:', this.runResult);\n MJNotificationService.Instance.CreateSimpleNotification(\n this.runResult?.ErrorMessage || 'Query execution failed',\n 'error',\n 3000\n );\n \n // Expand results section to show error\n this.parametersExpanded = false;\n this.paginationExpanded = false;\n this.resultsExpanded = true;\n }\n } else {\n throw new Error('No response from server');\n }\n } catch (error) {\n console.error('Error running query:', error);\n this.runResult = {\n QueryID: this.query.ID,\n QueryName: this.query.Name,\n Success: false,\n Results: '[]',\n ErrorMessage: error instanceof Error ? error.message : 'Unknown error occurred',\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0\n };\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to execute query. Please check your parameters and try again.',\n 'error',\n 3000\n );\n } finally {\n this.isRunning = false;\n this.cdr.detectChanges();\n }\n }\n\n private processResults(results: any[]) {\n if (!results || results.length === 0) {\n this.resultColumns = [];\n this.resultRows = [];\n return;\n }\n\n // Extract columns from first row\n const firstRow = results[0];\n this.resultColumns = Object.keys(firstRow).map(key => ({\n field: key,\n title: this.formatColumnTitle(key),\n width: this.calculateColumnWidth(key, results)\n }));\n\n // Set rows\n this.resultRows = results;\n }\n\n private formatColumnTitle(field: string): string {\n // Convert camelCase or snake_case to Title Case\n return field\n .replace(/([A-Z])/g, ' $1')\n .replace(/_/g, ' ')\n .replace(/^\\s+/, '')\n .split(' ')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n }\n\n private calculateColumnWidth(field: string, data: any[]): number {\n // Calculate appropriate column width based on content\n const maxLength = Math.max(\n field.length,\n ...data.slice(0, 10).map(row => String(row[field] || '').length)\n );\n return Math.min(Math.max(maxLength * 10, 100), 300);\n }\n\n exportToCSV() {\n if (!this.resultRows || this.resultRows.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'No data to export',\n 'warning',\n 3000\n );\n return;\n }\n\n // Create CSV content\n const headers = this.resultColumns.map(col => col.title).join(',');\n const rows = this.resultRows.map(row =>\n this.resultColumns.map(col => {\n const value = row[col.field];\n // Escape values containing commas or quotes\n if (typeof value === 'string' && (value.includes(',') || value.includes('\"'))) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n }).join(',')\n );\n\n const csv = [headers, ...rows].join('\\n');\n\n // Create and download file\n const blob = new Blob([csv], { type: 'text/csv' });\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${this.query?.Name || 'query'}_results_${new Date().toISOString().slice(0, 10)}.csv`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Results exported to CSV',\n 'success',\n 3000\n );\n }\n\n async copyToClipboard() {\n if (!this.resultRows || this.resultRows.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'No data to copy',\n 'warning',\n 3000\n );\n return;\n }\n\n try {\n // Create tab-delimited content for pasting into Excel\n const headers = this.resultColumns.map(col => col.title).join('\\t');\n const rows = this.resultRows.map(row =>\n this.resultColumns.map(col => row[col.field] || '').join('\\t')\n );\n\n const content = [headers, ...rows].join('\\n');\n await navigator.clipboard.writeText(content);\n\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Results copied to clipboard',\n 'success',\n 3000\n );\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to copy to clipboard',\n 'error',\n 3000\n );\n }\n }\n\n close() {\n this.isVisible = false;\n this.isVisibleChange.emit(false);\n this.onClose.emit();\n \n // Reset state\n this.runResult = null;\n this.resultColumns = [];\n this.resultRows = [];\n this.selectedRows = [];\n this.startRow = 0;\n }\n\n getAppliedParametersCount(): number {\n return this.parameterPairs.filter(p => p.value).length;\n }\n \n hasInvalidParameters(): boolean {\n return this.parameterPairs.some(p => !this.isParameterValid(p));\n }\n \n // Pagination methods\n goToFirstPage() {\n this.startRow = 0;\n this.runQuery(true);\n }\n \n goToPreviousPage() {\n if (this.startRow > 0 && this.maxRows) {\n this.startRow = Math.max(0, this.startRow - this.maxRows);\n this.runQuery(true);\n }\n }\n \n goToNextPage() {\n if (this.maxRows && this.runResult && this.startRow + this.runResult.RowCount < this.runResult.TotalRowCount) {\n this.startRow += this.maxRows;\n this.runQuery(true);\n }\n }\n \n goToLastPage() {\n if (this.maxRows && this.runResult) {\n const totalPages = Math.ceil(this.runResult.TotalRowCount / this.maxRows);\n this.startRow = (totalPages - 1) * this.maxRows;\n this.runQuery(true);\n }\n }\n}","@if (isVisible) {\n <kendo-dialog\n [width]=\"900\"\n [height]=\"800\"\n (close)=\"close()\">\n <kendo-dialog-titlebar>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <i class=\"fa-solid fa-play-circle\" style=\"color: var(--mj-brand-primary);\"></i>\n Run Query: {{ query?.Name || 'Untitled' }}\n </div>\n </kendo-dialog-titlebar>\n <div style=\"display: flex; flex-direction: column; height: 100%; overflow-y: auto; overflow-x: hidden;\">\n @if (isLoadingParams) {\n <div style=\"display: flex; align-items: center; justify-content: center; padding: 40px;\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; color: var(--mj-text-muted); margin-right: 12px;\"></i>\n <span style=\"color: var(--mj-text-muted);\">Loading query parameters...</span>\n </div>\n } @else {\n <!-- Query Parameters Section -->\n @if (parameterPairs.length > 0) {\n <kendo-expansionpanel\n [(expanded)]=\"parametersExpanded\"\n style=\"margin-bottom: 16px; flex-shrink: 0;\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-sliders\" style=\"color: var(--mj-text-muted);\"></i>\n Query Parameters\n <span class=\"badge\" style=\"background: #17a2b8; color: white; padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ parameterPairs.length }}\n </span>\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div style=\"margin-bottom: 12px; color: var(--mj-text-muted); font-size: 0.85em;\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Configure parameter values for query execution.\n </div>\n <!-- Parameters List -->\n <div style=\"display: flex; flex-direction: column; gap: 16px;\">\n @for (param of parameterPairs; track param.name) {\n <div style=\"background: var(--mj-bg-surface-sunken); border: 1px solid var(--mj-border-default); border-radius: 6px; padding: 16px;\">\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px;\">\n <div>\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); display: flex; align-items: center; gap: 6px;\">\n <i class=\"fa-solid fa-at\" style=\"color: var(--mj-brand-primary);\"></i>\n {{ param.name }}\n @if (param.isRequired) {\n <span style=\"color: #dc3545;\">*</span>\n }\n </label>\n @if (param.description) {\n <div style=\"font-size: 0.85em; color: var(--mj-text-muted); margin-top: 4px;\">\n {{ param.description }}\n </div>\n }\n </div>\n <div style=\"display: flex; gap: 8px; align-items: center;\">\n <span class=\"badge\" style=\"background: var(--mj-text-muted); color: white; padding: 2px 6px; border-radius: 4px; font-size: 0.75em;\">\n {{ param.type }}\n </span>\n @if (!isParameterValid(param)) {\n <i class=\"fa-solid fa-exclamation-triangle\" style=\"color: #dc3545;\" title=\"Required parameter is empty\"></i>\n }\n </div>\n </div>\n <!-- Parameter Value Input -->\n @if (param.type === 'number') {\n <kendo-numerictextbox\n [(ngModel)]=\"param.value\"\n placeholder=\"Enter number value...\"\n style=\"width: 100%;\">\n </kendo-numerictextbox>\n } @else {\n <kendo-textarea\n [(ngModel)]=\"param.value\"\n [rows]=\"2\"\n placeholder=\"Enter value (JSON, string, or number)...\"\n style=\"width: 100%; font-family: 'Courier New', monospace;\">\n </kendo-textarea>\n }\n @if (param.defaultValue) {\n <div style=\"font-size: 0.8em; color: var(--mj-text-muted); margin-top: 4px;\">\n Default: <code style=\"background: var(--mj-bg-surface-sunken); padding: 2px 4px; border-radius: 3px;\">{{ param.defaultValue }}</code>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </kendo-expansionpanel>\n } @else {\n <div style=\"padding: 20px; background: var(--mj-bg-surface-sunken); border-radius: 6px; margin-bottom: 16px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-info-circle\"></i> This query has no parameters.\n </div>\n }\n <!-- Pagination Settings -->\n <kendo-expansionpanel\n [(expanded)]=\"paginationExpanded\"\n style=\"margin-bottom: 16px;\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-table-list\" style=\"color: var(--mj-text-muted);\"></i>\n Pagination Settings\n @if (maxRows && maxRows > 0) {\n <span class=\"badge\" style=\"background: var(--mj-text-muted); color: white; padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ maxRows }} rows/page\n </span>\n }\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div style=\"display: flex; flex-direction: column; gap: 12px;\">\n <!-- Max Rows -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); white-space: nowrap; min-width: 100px;\">\n <i class=\"fa-solid fa-list-ol\" style=\"color: var(--mj-text-muted); margin-right: 6px;\"></i>\n Max Rows:\n </label>\n <kendo-numerictextbox\n [(ngModel)]=\"maxRows\"\n [min]=\"1\"\n [step]=\"100\"\n placeholder=\"All rows\"\n style=\"width: 150px;\">\n </kendo-numerictextbox>\n <span style=\"font-size: 0.85em; color: var(--mj-text-muted);\">\n Leave empty to return all rows\n </span>\n </div>\n <!-- Start Row -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); white-space: nowrap; min-width: 100px;\">\n <i class=\"fa-solid fa-forward\" style=\"color: var(--mj-text-muted); margin-right: 6px;\"></i>\n Start Row:\n </label>\n <kendo-numerictextbox\n [(ngModel)]=\"startRow\"\n [min]=\"0\"\n [step]=\"1\"\n placeholder=\"0\"\n style=\"width: 150px;\">\n </kendo-numerictextbox>\n <span style=\"font-size: 0.85em; color: var(--mj-text-muted);\">\n 0-based offset for pagination\n </span>\n </div>\n </div>\n </div>\n </kendo-expansionpanel>\n <!-- Results Section -->\n @if (runResult) {\n <kendo-expansionpanel\n [(expanded)]=\"resultsExpanded\"\n style=\"flex: 1; display: flex; flex-direction: column; overflow: hidden; min-height: 0;\">\n <ng-template kendoExpansionPanelTitleDirective>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-table\" style=\"color: #28a745;\"></i>\n Query Results\n @if (runResult.Success) {\n <span class=\"badge\" style=\"background: #28a745; color: white; padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ runResult.RowCount }} rows\n </span>\n @if (runResult.TotalRowCount > runResult.RowCount) {\n <span class=\"badge\" style=\"background: #17a2b8; color: white; padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n of {{ runResult.TotalRowCount }} total\n </span>\n }\n } @else {\n <span class=\"badge\" style=\"background: #dc3545; color: white; padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n Error\n </span>\n }\n @if (runResult.ExecutionTime) {\n <span style=\"font-size: 0.8em; color: var(--mj-text-muted); font-weight: normal;\">\n ({{ runResult.ExecutionTime }}ms)\n </span>\n }\n </span>\n </ng-template>\n <div style=\"flex: 1; display: flex; flex-direction: column; overflow: hidden; min-height: 0;\">\n @if (runResult.Success) {\n @if (resultRows.length > 0) {\n <!-- Export and Pagination Controls -->\n <div style=\"display: flex; justify-content: space-between; align-items: center; padding: 12px; border-bottom: 1px solid var(--mj-border-default);\">\n <!-- Pagination Info and Controls -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n @if (runResult.TotalRowCount > runResult.RowCount || startRow > 0) {\n <span style=\"font-size: 0.9em; color: var(--mj-text-muted);\">\n Showing rows {{ startRow + 1 }} - {{ startRow + runResult.RowCount }} of {{ runResult.TotalRowCount }}\n </span>\n <div style=\"display: flex; gap: 4px;\">\n <button kendoButton\n fillMode=\"flat\"\n size=\"small\"\n [disabled]=\"startRow === 0\"\n (click)=\"goToFirstPage()\"\n title=\"First page\">\n <i class=\"fa-solid fa-angles-left\"></i>\n </button>\n <button kendoButton\n fillMode=\"flat\"\n size=\"small\"\n [disabled]=\"startRow === 0\"\n (click)=\"goToPreviousPage()\"\n title=\"Previous page\">\n <i class=\"fa-solid fa-angle-left\"></i>\n </button>\n <button kendoButton\n fillMode=\"flat\"\n size=\"small\"\n [disabled]=\"startRow + runResult.RowCount >= runResult.TotalRowCount\"\n (click)=\"goToNextPage()\"\n title=\"Next page\">\n <i class=\"fa-solid fa-angle-right\"></i>\n </button>\n <button kendoButton\n fillMode=\"flat\"\n size=\"small\"\n [disabled]=\"startRow + runResult.RowCount >= runResult.TotalRowCount\"\n (click)=\"goToLastPage()\"\n title=\"Last page\">\n <i class=\"fa-solid fa-angles-right\"></i>\n </button>\n </div>\n }\n </div>\n <!-- Export Buttons -->\n <div style=\"display: flex; gap: 8px;\">\n <button kendoButton\n fillMode=\"flat\"\n (click)=\"copyToClipboard()\"\n title=\"Copy to clipboard\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n <button kendoButton\n fillMode=\"flat\"\n (click)=\"exportToCSV()\"\n title=\"Export to CSV\">\n <i class=\"fa-solid fa-download\"></i> Export CSV\n </button>\n </div>\n </div>\n <!-- Results Grid -->\n <div class=\"results-table-container\" style=\"flex: 1; overflow: auto; border: 1px solid var(--mj-border-default); border-radius: 4px; min-height: 0;\">\n <table class=\"results-table\" style=\"width: 100%; border-collapse: collapse; font-size: 14px;\">\n <thead style=\"position: sticky; top: 0; background: var(--mj-bg-surface-sunken); z-index: 10;\">\n <tr>\n @for (col of resultColumns; track col.field) {\n <th style=\"padding: 12px 16px; text-align: left; font-weight: 600; color: var(--mj-text-secondary); border-bottom: 2px solid var(--mj-border-default); background: var(--mj-bg-surface-sunken); white-space: nowrap;\">\n {{ col.title }}\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of resultRows; track $index) {\n <tr style=\"border-bottom: 1px solid var(--mj-border-default); transition: background-color 0.2s;\">\n @for (col of resultColumns; track col.field) {\n <td style=\"padding: 10px 16px; color: var(--mj-text-primary); max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\"\n [title]=\"row[col.field]\">\n {{ row[col.field] || '' }}\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n @if (resultRows.length === 0) {\n <div style=\"padding: 40px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-table\" style=\"font-size: 48px; margin-bottom: 12px; opacity: 0.3;\"></i>\n <p>No data in results</p>\n </div>\n }\n </div>\n } @else {\n <div style=\"display: flex; align-items: center; justify-content: center; height: 200px; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-inbox\" style=\"font-size: 48px; margin-bottom: 12px;\"></i>\n <p>No results returned</p>\n </div>\n }\n } @else {\n <div style=\"padding: 20px; background: #f8d7da; border: 1px solid #f5c6cb; border-radius: 6px; margin: 12px;\">\n <div style=\"color: #721c24;\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <strong>Query execution failed</strong>\n </div>\n @if (runResult.ErrorMessage) {\n <div style=\"margin-top: 8px; font-family: 'Courier New', monospace; font-size: 0.9em;\">\n {{ runResult.ErrorMessage }}\n </div>\n }\n </div>\n }\n </div>\n </kendo-expansionpanel>\n }\n }\n </div>\n <kendo-dialog-actions>\n @if (!runResult) {\n <button kendoButton (click)=\"close()\">\n <i class=\"fa-solid fa-times\"></i> Cancel\n </button>\n <button kendoButton\n [themeColor]=\"'primary'\"\n [disabled]=\"isRunning || hasInvalidParameters()\"\n (click)=\"runQuery()\">\n @if (isRunning) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i> Run Query\n }\n </button>\n } @else {\n <button kendoButton (click)=\"close()\">\n <i class=\"fa-solid fa-times\"></i> Close\n </button>\n <button kendoButton\n [themeColor]=\"'primary'\"\n [disabled]=\"isRunning\"\n (click)=\"runQuery()\">\n <i class=\"fa-solid fa-refresh\"></i> Run Again\n </button>\n }\n </kendo-dialog-actions>\n </kendo-dialog>\n}"]}
1
+ {"version":3,"file":"query-run-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/custom/Queries/query-run-dialog.component.ts","../../../../src/lib/custom/Queries/query-run-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ChangeDetectorRef, inject } from '@angular/core';\nimport { MJQueryEntity, MJQueryParameterEntity } from '@memberjunction/core-entities';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { Metadata } from '@memberjunction/core';\n\ninterface QueryRunResult {\n QueryID: string;\n QueryName: string;\n Success: boolean;\n Results: string; // This is a JSON string that needs to be parsed\n ErrorMessage: string;\n RowCount: number;\n TotalRowCount: number;\n ExecutionTime: number;\n AppliedParameters?: string; // JSON string of applied parameters\n}\n\ninterface ParameterPair {\n name: string;\n value: string;\n type: string;\n defaultValue: string;\n description: string;\n isRequired: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-query-run-dialog',\n templateUrl: './query-run-dialog.component.html',\n styleUrls: ['./query-run-dialog.component.css']\n})\nexport class QueryRunDialogComponent implements OnInit, OnChanges {\n private cdr = inject(ChangeDetectorRef);\n\n @Input() query: MJQueryEntity | null = null;\n @Input() parameters: MJQueryParameterEntity[] = [];\n @Input() isVisible = false;\n @Output() isVisibleChange = new EventEmitter<boolean>();\n @Output() onClose = new EventEmitter<void>();\n\n public isRunning = false;\n public isLoadingParams = false;\n public parameterPairs: ParameterPair[] = [];\n public parametersExpanded = true;\n public resultsExpanded = true;\n public paginationExpanded = false;\n public runResult: QueryRunResult | null = null;\n public resultColumns: any[] = [];\n public resultRows: any[] = [];\n public selectedRows: any[] = [];\n public maxRows: number | null = null;\n public startRow: number = 0;\n\n ngOnInit() {\n this.initializeParameters();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['isVisible'] && changes['isVisible'].currentValue) {\n this.initializeParameters();\n }\n if (changes['parameters']) {\n this.initializeParameters();\n }\n }\n\n private initializeParameters() {\n if (!this.query || !this.parameters) return;\n\n // Create parameter pairs from defined query parameters only\n this.parameterPairs = this.parameters.map(param => ({\n name: param.Name,\n value: param.DefaultValue || '',\n type: param.Type || 'string',\n defaultValue: param.DefaultValue || '',\n description: param.Description || '',\n isRequired: param.IsRequired || false\n }));\n }\n\n getValueListOptions(valueList: string): Array<{text: string, value: string}> {\n if (!valueList) return [];\n \n try {\n const options = valueList.split(',').map(v => v.trim());\n return options.map(opt => ({ text: opt, value: opt }));\n } catch {\n return [];\n }\n }\n\n isParameterValid(param: ParameterPair): boolean {\n if (param.isRequired && !param.value) {\n return false;\n }\n \n // Additional type-specific validation could go here\n if (param.type === 'number' && param.value) {\n return !isNaN(Number(param.value));\n }\n \n return true;\n }\n\n async runQuery(isPaginationRequest: boolean = false) {\n if (!this.query?.ID) return;\n\n // Validate required parameters\n const invalidParams = this.parameterPairs.filter(p => p.isRequired && !p.value);\n if (invalidParams.length > 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `Required parameters missing: ${invalidParams.map(p => p.name).join(', ')}`,\n 'warning',\n 3000\n );\n return;\n }\n\n this.isRunning = true;\n this.runResult = null;\n\n try {\n // Build parameters object\n const queryParameters: Record<string, any> = {};\n this.parameterPairs.forEach(param => {\n if (param.value) {\n try {\n // Try to parse as JSON first, fallback to string\n queryParameters[param.name] = JSON.parse(param.value);\n } catch {\n // If JSON parsing fails, treat as string or number based on type\n if (param.type === 'number') {\n queryParameters[param.name] = Number(param.value);\n } else {\n queryParameters[param.name] = param.value;\n }\n }\n }\n });\n\n // Get GraphQL data provider\n const dataProvider = Metadata.Provider as GraphQLDataProvider;\n \n // Execute the GetQueryData GraphQL query\n const query = `\n query GetQueryData($QueryID: String!, $Parameters: JSONObject, $MaxRows: Int, $StartRow: Int) {\n GetQueryData(QueryID: $QueryID, Parameters: $Parameters, MaxRows: $MaxRows, StartRow: $StartRow) {\n QueryID\n QueryName\n Success\n Results\n ErrorMessage\n RowCount\n TotalRowCount\n ExecutionTime\n AppliedParameters\n }\n }\n `;\n\n const variables: any = {\n QueryID: this.query.ID,\n Parameters: queryParameters\n };\n \n // Only include MaxRows if it's set\n if (this.maxRows && this.maxRows > 0) {\n variables.MaxRows = this.maxRows;\n }\n \n // Only include StartRow if it's set and greater than 0\n if (this.startRow && this.startRow > 0) {\n variables.StartRow = this.startRow;\n }\n\n console.log('Executing query with variables:', variables);\n \n const response = await dataProvider.ExecuteGQL(\n query, \n variables\n ) as {GetQueryData: QueryRunResult};\n\n if (response?.GetQueryData) {\n this.runResult = response.GetQueryData;\n \n if (this.runResult.Success && this.runResult.Results) {\n // Parse the JSON string results\n try {\n const parsedResults = JSON.parse(this.runResult.Results);\n this.processResults(parsedResults);\n // Only show notification on first run (not pagination)\n if (!isPaginationRequest) {\n const rowCountMsg = this.runResult.TotalRowCount > this.runResult.RowCount\n ? `Query executed successfully. Showing ${this.runResult.RowCount} of ${this.runResult.TotalRowCount} total rows.`\n : `Query executed successfully. ${this.runResult.RowCount} rows returned.`;\n MJNotificationService.Instance.CreateSimpleNotification(\n rowCountMsg,\n 'success',\n 3000\n );\n }\n \n // Automatically expand results and collapse other sections\n this.parametersExpanded = false;\n this.paginationExpanded = false;\n this.resultsExpanded = true;\n } catch (error) {\n console.error('Error parsing results:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to parse query results',\n 'error',\n 3000\n );\n }\n } else {\n console.error('Query execution failed:', this.runResult);\n MJNotificationService.Instance.CreateSimpleNotification(\n this.runResult?.ErrorMessage || 'Query execution failed',\n 'error',\n 3000\n );\n \n // Expand results section to show error\n this.parametersExpanded = false;\n this.paginationExpanded = false;\n this.resultsExpanded = true;\n }\n } else {\n throw new Error('No response from server');\n }\n } catch (error) {\n console.error('Error running query:', error);\n this.runResult = {\n QueryID: this.query.ID,\n QueryName: this.query.Name,\n Success: false,\n Results: '[]',\n ErrorMessage: error instanceof Error ? error.message : 'Unknown error occurred',\n RowCount: 0,\n TotalRowCount: 0,\n ExecutionTime: 0\n };\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to execute query. Please check your parameters and try again.',\n 'error',\n 3000\n );\n } finally {\n this.isRunning = false;\n this.cdr.detectChanges();\n }\n }\n\n private processResults(results: any[]) {\n if (!results || results.length === 0) {\n this.resultColumns = [];\n this.resultRows = [];\n return;\n }\n\n // Extract columns from first row\n const firstRow = results[0];\n this.resultColumns = Object.keys(firstRow).map(key => ({\n field: key,\n title: this.formatColumnTitle(key),\n width: this.calculateColumnWidth(key, results)\n }));\n\n // Set rows\n this.resultRows = results;\n }\n\n private formatColumnTitle(field: string): string {\n // Convert camelCase or snake_case to Title Case\n return field\n .replace(/([A-Z])/g, ' $1')\n .replace(/_/g, ' ')\n .replace(/^\\s+/, '')\n .split(' ')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n }\n\n private calculateColumnWidth(field: string, data: any[]): number {\n // Calculate appropriate column width based on content\n const maxLength = Math.max(\n field.length,\n ...data.slice(0, 10).map(row => String(row[field] || '').length)\n );\n return Math.min(Math.max(maxLength * 10, 100), 300);\n }\n\n exportToCSV() {\n if (!this.resultRows || this.resultRows.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'No data to export',\n 'warning',\n 3000\n );\n return;\n }\n\n // Create CSV content\n const headers = this.resultColumns.map(col => col.title).join(',');\n const rows = this.resultRows.map(row =>\n this.resultColumns.map(col => {\n const value = row[col.field];\n // Escape values containing commas or quotes\n if (typeof value === 'string' && (value.includes(',') || value.includes('\"'))) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n }).join(',')\n );\n\n const csv = [headers, ...rows].join('\\n');\n\n // Create and download file\n const blob = new Blob([csv], { type: 'text/csv' });\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${this.query?.Name || 'query'}_results_${new Date().toISOString().slice(0, 10)}.csv`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Results exported to CSV',\n 'success',\n 3000\n );\n }\n\n async copyToClipboard() {\n if (!this.resultRows || this.resultRows.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'No data to copy',\n 'warning',\n 3000\n );\n return;\n }\n\n try {\n // Create tab-delimited content for pasting into Excel\n const headers = this.resultColumns.map(col => col.title).join('\\t');\n const rows = this.resultRows.map(row =>\n this.resultColumns.map(col => row[col.field] || '').join('\\t')\n );\n\n const content = [headers, ...rows].join('\\n');\n await navigator.clipboard.writeText(content);\n\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Results copied to clipboard',\n 'success',\n 3000\n );\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n MJNotificationService.Instance.CreateSimpleNotification(\n 'Failed to copy to clipboard',\n 'error',\n 3000\n );\n }\n }\n\n close() {\n this.isVisible = false;\n this.isVisibleChange.emit(false);\n this.onClose.emit();\n \n // Reset state\n this.runResult = null;\n this.resultColumns = [];\n this.resultRows = [];\n this.selectedRows = [];\n this.startRow = 0;\n }\n\n getAppliedParametersCount(): number {\n return this.parameterPairs.filter(p => p.value).length;\n }\n \n hasInvalidParameters(): boolean {\n return this.parameterPairs.some(p => !this.isParameterValid(p));\n }\n \n // Pagination methods\n goToFirstPage() {\n this.startRow = 0;\n this.runQuery(true);\n }\n \n goToPreviousPage() {\n if (this.startRow > 0 && this.maxRows) {\n this.startRow = Math.max(0, this.startRow - this.maxRows);\n this.runQuery(true);\n }\n }\n \n goToNextPage() {\n if (this.maxRows && this.runResult && this.startRow + this.runResult.RowCount < this.runResult.TotalRowCount) {\n this.startRow += this.maxRows;\n this.runQuery(true);\n }\n }\n \n goToLastPage() {\n if (this.maxRows && this.runResult) {\n const totalPages = Math.ceil(this.runResult.TotalRowCount / this.maxRows);\n this.startRow = (totalPages - 1) * this.maxRows;\n this.runQuery(true);\n }\n }\n}","@if (isVisible) {\n <mj-dialog\n [Visible]=\"true\"\n [Width]=\"900\"\n (Close)=\"close()\">\n <mj-dialog-titlebar>\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <i class=\"fa-solid fa-play-circle\" style=\"color: var(--mj-brand-primary);\"></i>\n Run Query: {{ query?.Name || 'Untitled' }}\n </div>\n </mj-dialog-titlebar>\n <div style=\"display: flex; flex-direction: column; height: 100%; overflow-y: auto; overflow-x: hidden;\">\n @if (isLoadingParams) {\n <div style=\"display: flex; align-items: center; justify-content: center; padding: 40px;\">\n <i class=\"fa-solid fa-spinner fa-spin\" style=\"font-size: 24px; color: var(--mj-text-muted); margin-right: 12px;\"></i>\n <span style=\"color: var(--mj-text-muted);\">Loading query parameters...</span>\n </div>\n } @else {\n <!-- Query Parameters Section -->\n @if (parameterPairs.length > 0) {\n <mj-accordion-panel\n [(Expanded)]=\"parametersExpanded\"\n style=\"margin-bottom: 16px; flex-shrink: 0;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-sliders\" style=\"color: var(--mj-text-muted);\"></i>\n Query Parameters\n <span style=\"background: var(--mj-status-info); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ parameterPairs.length }}\n </span>\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div style=\"margin-bottom: 12px; color: var(--mj-text-muted); font-size: 0.85em;\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Configure parameter values for query execution.\n </div>\n <!-- Parameters List -->\n <div style=\"display: flex; flex-direction: column; gap: 16px;\">\n @for (param of parameterPairs; track param.name) {\n <div style=\"background: var(--mj-bg-surface-sunken); border: 1px solid var(--mj-border-default); border-radius: 6px; padding: 16px;\">\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px;\">\n <div>\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); display: flex; align-items: center; gap: 6px;\">\n <i class=\"fa-solid fa-at\" style=\"color: var(--mj-brand-primary);\"></i>\n {{ param.name }}\n @if (param.isRequired) {\n <span style=\"color: #dc3545;\">*</span>\n }\n </label>\n @if (param.description) {\n <div style=\"font-size: 0.85em; color: var(--mj-text-muted); margin-top: 4px;\">\n {{ param.description }}\n </div>\n }\n </div>\n <div style=\"display: flex; gap: 8px; align-items: center;\">\n <span class=\"badge\" style=\"background: var(--mj-text-muted); color: white; padding: 2px 6px; border-radius: 4px; font-size: 0.75em;\">\n {{ param.type }}\n </span>\n @if (!isParameterValid(param)) {\n <i class=\"fa-solid fa-exclamation-triangle\" style=\"color: #dc3545;\" title=\"Required parameter is empty\"></i>\n }\n </div>\n </div>\n <!-- Parameter Value Input -->\n @if (param.type === 'number') {\n <input type=\"number\" class=\"mj-input\"\n [(ngModel)]=\"param.value\"\n placeholder=\"Enter number value...\"\n style=\"width: 100%;\" />\n } @else {\n <textarea class=\"mj-input\"\n [(ngModel)]=\"param.value\"\n rows=\"2\"\n placeholder=\"Enter value (JSON, string, or number)...\"\n style=\"width: 100%; font-family: 'Courier New', monospace;\">\n </textarea>\n }\n @if (param.defaultValue) {\n <div style=\"font-size: 0.8em; color: var(--mj-text-muted); margin-top: 4px;\">\n Default: <code style=\"background: var(--mj-bg-surface-sunken); padding: 2px 4px; border-radius: 3px;\">{{ param.defaultValue }}</code>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n } @else {\n <div style=\"padding: 20px; background: var(--mj-bg-surface-sunken); border-radius: 6px; margin-bottom: 16px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-info-circle\"></i> This query has no parameters.\n </div>\n }\n <!-- Pagination Settings -->\n <mj-accordion-panel\n [(Expanded)]=\"paginationExpanded\"\n style=\"margin-bottom: 16px;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n <i class=\"fa-solid fa-table-list\" style=\"color: var(--mj-text-muted);\"></i>\n Pagination Settings\n @if (maxRows && maxRows > 0) {\n <span style=\"background: var(--mj-text-muted); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ maxRows }} rows/page\n </span>\n }\n </span>\n </ng-template>\n <div style=\"padding: 12px 0;\">\n <div style=\"display: flex; flex-direction: column; gap: 12px;\">\n <!-- Max Rows -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); white-space: nowrap; min-width: 100px;\">\n <i class=\"fa-solid fa-list-ol\" style=\"color: var(--mj-text-muted); margin-right: 6px;\"></i>\n Max Rows:\n </label>\n <input type=\"number\" class=\"mj-input\"\n [(ngModel)]=\"maxRows\"\n min=\"1\"\n step=\"100\"\n placeholder=\"All rows\"\n style=\"width: 150px;\" />\n <span style=\"font-size: 0.85em; color: var(--mj-text-muted);\">\n Leave empty to return all rows\n </span>\n </div>\n <!-- Start Row -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n <label style=\"font-weight: 600; color: var(--mj-text-secondary); white-space: nowrap; min-width: 100px;\">\n <i class=\"fa-solid fa-forward\" style=\"color: var(--mj-text-muted); margin-right: 6px;\"></i>\n Start Row:\n </label>\n <input type=\"number\" class=\"mj-input\"\n [(ngModel)]=\"startRow\"\n min=\"0\"\n step=\"1\"\n placeholder=\"0\"\n style=\"width: 150px;\" />\n <span style=\"font-size: 0.85em; color: var(--mj-text-muted);\">\n 0-based offset for pagination\n </span>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n <!-- Results Section -->\n @if (runResult) {\n <mj-accordion-panel\n [(Expanded)]=\"resultsExpanded\"\n style=\"flex: 1; display: flex; flex-direction: column; overflow: hidden; min-height: 0;\">\n <ng-template mjAccordionTitle>\n <span style=\"display: flex; align-items: center; gap: 8px; font-weight: 600;\">\n @if (runResult.Success) {\n <i class=\"fa-solid fa-table\" style=\"color: var(--mj-status-success);\"></i>\n Query Results\n <span style=\"background: var(--mj-status-success); color: var(--mj-text-inverse); padding: 2px 6px; border-radius: 10px; font-size: 0.7em;\">\n {{ runResult.RowCount }} rows@if (runResult.TotalRowCount > runResult.RowCount) { of {{ runResult.TotalRowCount }} total}\n </span>\n @if (runResult.ExecutionTime) {\n <span style=\"color: var(--mj-text-muted); font-size: 0.85em; font-weight: normal;\">&mdash; {{ runResult.ExecutionTime }}ms</span>\n }\n } @else {\n <i class=\"fa-solid fa-exclamation-circle\" style=\"color: var(--mj-status-error);\"></i>\n Query Results &mdash; Error\n }\n </span>\n </ng-template>\n <div style=\"flex: 1; display: flex; flex-direction: column; overflow: hidden; min-height: 0;\">\n @if (runResult.Success) {\n @if (resultRows.length > 0) {\n <!-- Export and Pagination Controls -->\n <div style=\"display: flex; justify-content: space-between; align-items: center; padding: 12px; border-bottom: 1px solid var(--mj-border-default);\">\n <!-- Pagination Info and Controls -->\n <div style=\"display: flex; align-items: center; gap: 12px;\">\n @if (runResult.TotalRowCount > runResult.RowCount || startRow > 0) {\n <span style=\"font-size: 0.9em; color: var(--mj-text-muted);\">\n Showing rows {{ startRow + 1 }} - {{ startRow + runResult.RowCount }} of {{ runResult.TotalRowCount }}\n </span>\n <div style=\"display: flex; gap: 4px;\">\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow === 0\"\n (click)=\"goToFirstPage()\"\n title=\"First page\">\n <i class=\"fa-solid fa-angles-left\"></i>\n </button>\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow === 0\"\n (click)=\"goToPreviousPage()\"\n title=\"Previous page\">\n <i class=\"fa-solid fa-angle-left\"></i>\n </button>\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow + runResult.RowCount >= runResult.TotalRowCount\"\n (click)=\"goToNextPage()\"\n title=\"Next page\">\n <i class=\"fa-solid fa-angle-right\"></i>\n </button>\n <button mjButton\n variant=\"flat\"\n [disabled]=\"startRow + runResult.RowCount >= runResult.TotalRowCount\"\n (click)=\"goToLastPage()\"\n title=\"Last page\">\n <i class=\"fa-solid fa-angles-right\"></i>\n </button>\n </div>\n }\n </div>\n <!-- Export Buttons -->\n <div style=\"display: flex; gap: 8px;\">\n <button mjButton\n variant=\"flat\"\n (click)=\"copyToClipboard()\"\n title=\"Copy to clipboard\">\n <i class=\"fa-solid fa-copy\"></i> Copy\n </button>\n <button mjButton\n variant=\"flat\"\n (click)=\"exportToCSV()\"\n title=\"Export to CSV\">\n <i class=\"fa-solid fa-download\"></i> Export CSV\n </button>\n </div>\n </div>\n <!-- Results Grid -->\n <div class=\"results-table-container\" style=\"flex: 1; overflow: auto; border: 1px solid var(--mj-border-default); border-radius: 4px; min-height: 0;\">\n <table class=\"results-table\" style=\"width: 100%; border-collapse: collapse; font-size: 14px;\">\n <thead style=\"position: sticky; top: 0; background: var(--mj-bg-surface-sunken); z-index: 10;\">\n <tr>\n @for (col of resultColumns; track col.field) {\n <th style=\"padding: 12px 16px; text-align: left; font-weight: 600; color: var(--mj-text-secondary); border-bottom: 2px solid var(--mj-border-default); background: var(--mj-bg-surface-sunken); white-space: nowrap;\">\n {{ col.title }}\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of resultRows; track $index) {\n <tr style=\"border-bottom: 1px solid var(--mj-border-default); transition: background-color 0.2s;\">\n @for (col of resultColumns; track col.field) {\n <td style=\"padding: 10px 16px; color: var(--mj-text-primary); max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\"\n [title]=\"row[col.field]\">\n {{ row[col.field] || '' }}\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n @if (resultRows.length === 0) {\n <div style=\"padding: 40px; text-align: center; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-table\" style=\"font-size: 48px; margin-bottom: 12px; opacity: 0.3;\"></i>\n <p>No data in results</p>\n </div>\n }\n </div>\n } @else {\n <div style=\"display: flex; align-items: center; justify-content: center; height: 200px; color: var(--mj-text-muted);\">\n <i class=\"fa-solid fa-inbox\" style=\"font-size: 48px; margin-bottom: 12px;\"></i>\n <p>No results returned</p>\n </div>\n }\n } @else {\n <div style=\"padding: 20px; background: #f8d7da; border: 1px solid #f5c6cb; border-radius: 6px; margin: 12px;\">\n <div style=\"color: #721c24;\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <strong>Query execution failed</strong>\n </div>\n @if (runResult.ErrorMessage) {\n <div style=\"margin-top: 8px; font-family: 'Courier New', monospace; font-size: 0.9em;\">\n {{ runResult.ErrorMessage }}\n </div>\n }\n </div>\n }\n </div>\n </mj-accordion-panel>\n }\n }\n </div>\n <mj-dialog-actions>\n @if (!runResult) {\n <button mjButton (click)=\"close()\">\n <i class=\"fa-solid fa-times\"></i> Cancel\n </button>\n <button mjButton\n variant=\"primary\"\n [disabled]=\"isRunning || hasInvalidParameters()\"\n (click)=\"runQuery()\">\n @if (isRunning) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Running...\n } @else {\n <i class=\"fa-solid fa-play\"></i> Run Query\n }\n </button>\n } @else {\n <button mjButton (click)=\"close()\">\n <i class=\"fa-solid fa-times\"></i> Close\n </button>\n <button mjButton\n variant=\"primary\"\n [disabled]=\"isRunning\"\n (click)=\"runQuery()\">\n <i class=\"fa-solid fa-refresh\"></i> Run Again\n </button>\n }\n </mj-dialog-actions>\n </mj-dialog>\n}\n"]}