@memberjunction/ng-dashboards 5.21.0 → 5.22.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 (99) hide show
  1. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +102 -0
  2. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -0
  3. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +583 -0
  4. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -0
  5. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +148 -0
  6. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -0
  7. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +773 -0
  8. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -0
  9. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +241 -0
  10. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -0
  11. package/dist/AI/components/vectors/vector-management-resource.component.js +1782 -0
  12. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -0
  13. package/dist/AI/index.d.ts +3 -0
  14. package/dist/AI/index.d.ts.map +1 -1
  15. package/dist/AI/index.js +6 -0
  16. package/dist/AI/index.js.map +1 -1
  17. package/dist/AI/services/ai-instrumentation.service.d.ts +50 -7
  18. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  19. package/dist/AI/services/ai-instrumentation.service.js +161 -193
  20. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  21. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +11 -0
  22. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  23. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +57 -0
  24. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  25. package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +1 -1
  26. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +10 -2
  27. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  28. package/dist/DataExplorer/data-explorer-dashboard.component.js +35 -11
  29. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  30. package/dist/DataExplorer/data-explorer-resource.component.d.ts +1 -0
  31. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  32. package/dist/DataExplorer/data-explorer-resource.component.js +8 -4
  33. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  34. package/dist/Home/home-dashboard.component.d.ts +181 -1
  35. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  36. package/dist/Home/home-dashboard.component.js +1704 -182
  37. package/dist/Home/home-dashboard.component.js.map +1 -1
  38. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +121 -0
  39. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -0
  40. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +1058 -0
  41. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -0
  42. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts +56 -0
  43. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.d.ts.map +1 -0
  44. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js +291 -0
  45. package/dist/KnowledgeHub/components/results-detail/search-result-detail.component.js.map +1 -0
  46. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +85 -0
  47. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +1 -0
  48. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +461 -0
  49. package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +1 -0
  50. package/dist/KnowledgeHub/index.d.ts +4 -0
  51. package/dist/KnowledgeHub/index.d.ts.map +1 -0
  52. package/dist/KnowledgeHub/index.js +5 -0
  53. package/dist/KnowledgeHub/index.js.map +1 -0
  54. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  55. package/dist/QueryBrowser/query-browser-resource.component.js +5 -1
  56. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  57. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  58. package/dist/SystemDiagnostics/system-diagnostics.component.js +1 -0
  59. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  60. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +7 -1
  61. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  62. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +63 -8
  63. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  64. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +9 -1
  65. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
  66. package/dist/Testing/components/testing-dashboard-tab.component.js +109 -62
  67. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  68. package/dist/Testing/components/testing-explorer.component.d.ts +2 -1
  69. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  70. package/dist/Testing/components/testing-explorer.component.js +241 -200
  71. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  72. package/dist/Testing/components/testing-runs-resource.component.d.ts +7 -1
  73. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  74. package/dist/Testing/components/testing-runs-resource.component.js +63 -8
  75. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  76. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  77. package/dist/Testing/components/testing-runs.component.js +7 -5
  78. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  79. package/dist/Testing/testing-dashboard.component.d.ts +9 -1
  80. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  81. package/dist/Testing/testing-dashboard.component.js +128 -59
  82. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  83. package/dist/ai-dashboards.module.d.ts +26 -19
  84. package/dist/ai-dashboards.module.d.ts.map +1 -1
  85. package/dist/ai-dashboards.module.js +40 -5
  86. package/dist/ai-dashboards.module.js.map +1 -1
  87. package/dist/core-dashboards.module.d.ts +1 -0
  88. package/dist/core-dashboards.module.d.ts.map +1 -1
  89. package/dist/core-dashboards.module.js +3 -0
  90. package/dist/core-dashboards.module.js.map +1 -1
  91. package/dist/public-api.d.ts +4 -1
  92. package/dist/public-api.d.ts.map +1 -1
  93. package/dist/public-api.js +5 -1
  94. package/dist/public-api.js.map +1 -1
  95. package/dist/testing-dashboards.module.d.ts +5 -4
  96. package/dist/testing-dashboards.module.d.ts.map +1 -1
  97. package/dist/testing-dashboards.module.js +4 -0
  98. package/dist/testing-dashboards.module.js.map +1 -1
  99. package/package.json +44 -42
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicate-detection-resource.component.js","sourceRoot":"","sources":["../../../../src/AI/components/duplicates/duplicate-detection-resource.component.ts","../../../../src/AI/components/duplicates/duplicate-detection-resource.component.html"],"names":[],"mappings":";;;;;;AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAA4B,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACtG,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAO/C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;;;;;ICkB9C,kCAAuB;IAAA,YAAU;IAAA,iBAAS;;;IAAlC,+BAAc;IAAC,cAAU;IAAV,6BAAU;;;;IAwCzC,kCAA2D;IAAzB,wMAAS,qBAAc,KAAC;IACtD,wBAAiC;IAAC,+BACtC;IAAA,iBAAS;;;IAMb,+BAA+B;IAC3B,iCAAuE;IAC3E,iBAAM;;;IAEN,+BAAyB;IACrB,wBAA4C;IAC5C,6BAAsB;IAAA,qDAAqC;IAAA,iBAAI;IAC/D,6BAAyB;IAAA,mEAAmD;IAChF,AADgF,iBAAI,EAC9E;;;;IAekB,AADJ,AADJ,+BAAyB,cACI,eACM;IAAA,YAAsB;IAAA,iBAAO;IACxD,gCAA0E;IACtE,YACJ;IACJ,AADI,iBAAO,EACL;IAEF,AADJ,+BAAuB,cACK;IACpB,wBAAkD;IAClD,gCAA6D;IAAA,aAAoB;IACrF,AADqF,iBAAO,EACtF;IACN,gCAAwB;IACpB,yBAAkD;IAClD,iCAA0B;IAAA,aAAoE;IAClG,AADkG,iBAAO,EACnG;IACN,gCAAwB;IACpB,yBAA+C;IAC/C,iCAA0B;IAAA,aAAiC;IAEnE,AADI,AAD+D,iBAAO,EAChE,EACJ;IAEF,AADJ,gCAA0B,kBAGgB;IAA9B,4OAAS,6BAAmB,KAAC;IACjC,yBAAiC;IAAC,0BACtC;IAAA,iBAAS;IACT,mCAEqC;IAA7B,4OAAS,4BAAkB,KAAC;IAChC,yBAAiC;IAAC,yBACtC;IAER,AADI,AADI,iBAAS,EACP,EACJ;;;;IA/B6B,eAAsB;IAAtB,yCAAsB;IACnB,cAA2C;IAA3C,0DAA2C;IACrE,cACJ;IADI,0EACJ;IAKwC,eAAwB;IAAxB,yCAAwB;IAAC,cAAoB;IAApB,uCAAoB;IAIvD,eAAoE;IAApE,+FAAoE;IAIpE,eAAiC;IAAjC,2DAAiC;IAKvD,eAAqB;IAArB,0CAAqB;IAKrB,eAAqB;IAArB,0CAAqB;;;IAQrC,+BAA0B;IACtB,wBAAwC;IACxC,4BAAM;IAAA,gCAAgB;IAC1B,AAD0B,iBAAO,EAC3B;;;IAgBE,AADJ,AADJ,+BAAyB,cACI,eACM;IAAA,YAAsB;IAAA,iBAAO;IACxD,gCAA0E;IACtE,YACJ;IACJ,AADI,iBAAO,EACL;IAEF,AADJ,+BAAuB,cACK;IACpB,wBAAkD;IAClD,gCAA6D;IAAA,aAAoB;IACrF,AADqF,iBAAO,EACtF;IACN,gCAAwB;IACpB,yBAAkD;IAClD,iCAA0B;IAAA,aAAoE;IAClG,AADkG,iBAAO,EACnG;IACN,gCAAwB;IACpB,yBAA+C;IAC/C,iCAA0B;IAAA,aAAiC;IAGvE,AADI,AADI,AAD+D,iBAAO,EAChE,EACJ,EACJ;;;;IAnB6B,eAAsB;IAAtB,yCAAsB;IACnB,cAA2C;IAA3C,0DAA2C;IACrE,cACJ;IADI,0EACJ;IAKwC,eAAwB;IAAxB,yCAAwB;IAAC,cAAoB;IAApB,uCAAoB;IAIvD,eAAoE;IAApE,+FAAoE;IAIpE,eAAiC;IAAjC,2DAAiC;;;IAMvE,+BAA0B;IACtB,wBAAiC;IACjC,4BAAM;IAAA,iCAAiB;IAC3B,AAD2B,iBAAO,EAC5B;;;IAgBE,AADJ,AADJ,+BAAyB,cACI,eACM;IAAA,YAAsB;IAAA,iBAAO;IACxD,gCAA0E;IACtE,YACJ;IACJ,AADI,iBAAO,EACL;IAEF,AADJ,+BAAuB,cACK;IACpB,wBAAkD;IAClD,gCAA6D;IAAA,aAAoB;IACrF,AADqF,iBAAO,EACtF;IACN,gCAAwB;IACpB,yBAAkD;IAClD,iCAA0B;IAAA,aAAoE;IAClG,AADkG,iBAAO,EACnG;IACN,gCAAwB;IACpB,yBAA+C;IAC/C,iCAA0B;IAAA,aAAiC;IAGvE,AADI,AADI,AAD+D,iBAAO,EAChE,EACJ,EACJ;;;;IAnB6B,eAAsB;IAAtB,yCAAsB;IACnB,cAA2C;IAA3C,0DAA2C;IACrE,cACJ;IADI,0EACJ;IAKwC,eAAwB;IAAxB,yCAAwB;IAAC,cAAoB;IAApB,uCAAoB;IAIvD,eAAoE;IAApE,+FAAoE;IAIpE,eAAiC;IAAjC,2DAAiC;;;IAMvE,+BAA0B;IACtB,wBAAiC;IACjC,4BAAM;IAAA,iCAAiB;IAC3B,AAD2B,iBAAO,EAC5B;;;IAhId,AADJ,AAFJ,+BAA0B,cAEK,cAC0B;IAC7C,wBAAiC;IACjC,gCAA2B;IAAA,8BAAc;IAAA,iBAAO;IAChD,gCAA2B;IAAA,YAAkB;IACjD,AADiD,iBAAO,EAClD;IACN,+BAAyB;IACrB,yHAmCC;IACD,uHAAkC;IAO1C,AADI,iBAAM,EACJ;IAIF,AADJ,gCAA2B,eAC2B;IAC9C,yBAAwC;IACxC,iCAA2B;IAAA,yBAAQ;IAAA,iBAAO;IAC1C,iCAA2B;IAAA,aAAmB;IAClD,AADkD,iBAAO,EACnD;IACN,gCAAyB;IACrB,yHAuBC;IACD,uHAAmC;IAO3C,AADI,iBAAM,EACJ;IAIF,AADJ,gCAA2B,eAC2B;IAC9C,yBAA+B;IAC/B,iCAA2B;IAAA,yBAAQ;IAAA,iBAAO;IAC1C,iCAA2B;IAAA,aAAmB;IAClD,AADkD,iBAAO,EACnD;IACN,gCAAyB;IACrB,yHAuBC;IACD,uHAAmC;IAQ/C,AADI,AADI,iBAAM,EACJ,EACJ;;;IAjIiC,eAAkB;IAAlB,yCAAkB;IAG7C,eAmCC;IAnCD,mCAmCC;IACD,eAKC;IALD,6DAKC;IAS0B,eAAmB;IAAnB,0CAAmB;IAG9C,eAuBC;IAvBD,oCAuBC;IACD,eAKC;IALD,8DAKC;IAS0B,eAAmB;IAAnB,0CAAmB;IAG9C,eAuBC;IAvBD,oCAuBC;IACD,eAKC;IALD,8DAKC;;;IAQb,+BAA4B;IACxB,iCAAuD;IAC3D,iBAAM;;AD1LP,IAAM,mCAAmC,GAAzC,MAAM,mCAAoC,SAAQ,qBAAqB;IAClE,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAChC,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAC/B,aAAa,GAAG,IAAI,OAAO,EAAQ,CAAC;IAE5C,gBAAgB;IACT,SAAS,GAAG,KAAK,CAAC;IAClB,QAAQ,GAAG,KAAK,CAAC;IAExB,WAAW;IACJ,IAAI,GAA2B,EAAE,CAAC;IAClC,OAAO,GAAiC,EAAE,CAAC;IAC3C,OAAO,GAAsC,EAAE,CAAC;IAEvD,gCAAgC;IACzB,SAAS,GAAqB,EAAE,CAAC;IACjC,aAAa,GAAqB,EAAE,CAAC;IACrC,cAAc,GAAqB,EAAE,CAAC;IACtC,cAAc,GAAqB,EAAE,CAAC;IAE7C,eAAe;IACR,OAAO,GAAoB;QAC9B,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,EAAE;KACb,CAAC;IAEF,0CAA0C;IACnC,WAAW,GAAa,EAAE,CAAC;IAElC,wEAAwE;IAC/D,YAAY,GAAG,KAAK,CAAC;IAE9B,+DAA+D;IACxD,WAAW,GAAuB,QAAQ,CAAC;IAElD,+BAA+B;IACxB,QAAQ,GAAG,EAAE,CAAC;IAErB,6BAA6B;IACtB,WAAW,GAAG,CAAC,CAAC;IAEvB,6BAA6B;IACtB,oBAAoB,GAAG,EAAE,CAAC;IAEjC,+CAA+C;IACxC,kBAAkB,GAA0B,IAAI,CAAC;IAExD,yCAAyC;IAClC,cAAc,GAAG,KAAK,CAAC;IAE9B,6DAA6D;IAC5C,eAAe,GAAG,EAAE,CAAC;IAEtC,0BAA0B;IACnB,iBAAiB;QACpB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QACtE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,4BAA4B;IACrB,cAAc,CAAC,UAAkB;QACpC,IAAI,CAAC,oBAAoB,GAAG,UAAU,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;QACrC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,sCAAsC;IAC/B,cAAc;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAED,2BAA2B;IAC3B,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,4BAA4B;IACrB,QAAQ;QACX,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,gCAAgC;IACzB,QAAQ;QACX,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,iDAAiD;IAC1C,cAAc,CAAC,KAAqB;QACvC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,4BAA4B;IACrB,eAAe;QAClB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,oDAAoD;IAC5C,qBAAqB;QACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IACzF,CAAC;IAED,aAAa;IACb,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;IACjC,CAAC;IACD,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;IACrC,CAAC;IACD,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;IACtC,CAAC;IACD,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,eAAe;QACjB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED,WAAW;QACP,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,KAAmB;QAC5C,OAAO,qBAAqB,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,KAAmB;QAC1C,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,QAAQ;QACjB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,CAAC,UAAU,EAAE,aAAa,EAAE,aAAa,CAAC,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC;gBACjE;oBACI,UAAU,EAAE,oBAAoB;oBAChC,WAAW,EAAE,+BAA+B;oBAC5C,OAAO,EAAE,gBAAgB;oBACzB,UAAU,EAAE,eAAe;iBAC9B;gBACD;oBACI,UAAU,EAAE,2BAA2B;oBACvC,WAAW,EAAE,0BAA0B;oBACvC,OAAO,EAAE,qBAAqB;oBAC9B,UAAU,EAAE,eAAe;iBAC9B;gBACD;oBACI,UAAU,EAAE,kCAAkC;oBAC9C,OAAO,EAAE,uBAAuB;oBAChC,UAAU,EAAE,eAAe;iBAC9B;aACJ,CAAC,CAAC;YAEH,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACrB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,OAAiC,CAAC;YAC7D,CAAC;YACD,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,OAAuC,CAAC;YACzE,CAAC;YACD,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,OAA4C,CAAC;YAC9E,CAAC;YAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;QACpE,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,YAAY,CAAC,KAAqB;QAC3C,MAAM,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,WAAW,CAAC,KAAqB;QAC1C,MAAM,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC5D,CAAC;IAED,0CAA0C;IACnC,cAAc;QACjB,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,wBAAwB;IACjB,YAAY;QACf,IAAI,CAAC,OAAO,GAAG;YACX,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE;SACb,CAAC;QACF,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,wDAAwD;IACjD,aAAa,CAAC,KAAa;QAC9B,IAAI,KAAK,GAAG,GAAG;YAAE,OAAO,YAAY,CAAC;QACrC,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,cAAc,CAAC;QACxC,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,uDAAuD;IAChD,aAAa,CAAC,KAAa;QAC9B,IAAI,KAAK,GAAG,GAAG;YAAE,OAAO,MAAM,CAAC;QAC/B,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,QAAQ,CAAC;QAClC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,gCAAgC;IACzB,UAAU,CAAC,IAAiB;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,qCAAqC;IACrC,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,EAAE;YACjC,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC;YACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC;YACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,EAAE;YAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,4BAA4B;IAEpB,mBAAmB;QACvB,IAAI,CAAC,aAAa,CAAC,IAAI,CACnB,YAAY,CAAC,GAAG,CAAC,EACjB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAC3B,CAAC,SAAS,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,mDAAmD;IAC3C,kBAAkB;QACtB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,CAAC;IAED;;;OAGG;IACK,WAAW;QACf,MAAM,MAAM,GAAG,IAAI,GAAG,EAAgC,CAAC;QACvD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,GAAG,EAA6C,CAAC;QAC7E,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,oBAAoB,CAAC;YACvC,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1C,IAAI,QAAQ,EAAE,CAAC;gBACX,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACJ,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YACtC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAChC,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrD,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/C,SAAS,CAAC,+BAA+B;YAC7C,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YAC9C,MAAM,UAAU,GAAG,GAAG,EAAE,MAAM,IAAI,SAAS,CAAC;YAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;YAC7D,MAAM,cAAc,GAAG,IAAI,CAAC,6BAA6B,CAAC,aAAa,CAAC,CAAC;YACzE,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC;YAEnE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAChB,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,KAAK,EAAE,MAAM,CAAC,cAAc;gBAC5B,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,UAAU,EAAE,UAAU;gBACtB,cAAc,EAAE,cAAc;gBAC9B,UAAU,EAAE,aAAa,CAAC,MAAM;gBAChC,YAAY,EAAE,YAAY;gBAC1B,OAAO,EAAE,aAAa;gBACtB,SAAS,EAAE,eAAe;aAC7B,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,iEAAiE;IACzD,mBAAmB,CAAC,OAA0C;QAClE,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,gBAAgB,GAAG,GAAG,EAAE,CAAC;gBAC3B,GAAG,GAAG,CAAC,CAAC,gBAAgB,CAAC;YAC7B,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAED;;;;;;OAMG;IACK,6BAA6B,CAAC,OAA0C;QAC5E,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,cAAc,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YACrD,IAAI,CAAC,CAAC,cAAc,KAAK,UAAU;gBAAE,WAAW,GAAG,IAAI,CAAC;YACxD,IAAI,CAAC,CAAC,cAAc,KAAK,UAAU;gBAAE,WAAW,GAAG,IAAI,CAAC;QAC5D,CAAC;QACD,IAAI,WAAW,IAAI,CAAC,WAAW;YAAE,OAAO,UAAU,CAAC;QACnD,IAAI,WAAW,IAAI,CAAC,WAAW;YAAE,OAAO,UAAU,CAAC;QACnD,OAAO,SAAS,CAAC,CAAC,QAAQ;IAC9B,CAAC;IAED,6DAA6D;IACrD,sBAAsB,CAAC,OAA0C;QACrE,IAAI,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC;gBACb,MAAM,GAAG,CAAC,CAAC;YACf,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,8DAA8D;IACtD,YAAY;QAChB,IAAI,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QAEnC,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC1B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC5B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC5B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC7C,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACzC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC;QAC1E,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,UAAU,CAAC,CAAC;QAC5E,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,UAAU,CAAC,CAAC;QAC5E,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,yBAAyB,CACnC,KAAqB,EACrB,MAA+B;QAE/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,IAAI,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChC,KAAK,CAAC,cAAc,GAAG,MAAM,CAAC;gBAC9B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YACvB,CAAC;YAED,+BAA+B;YAC/B,KAAK,CAAC,cAAc,GAAG,MAAM,CAAC;YAC9B,IAAI,CAAC,YAAY,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,MAAM,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/E,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;yTAhbQ,mCAAmC,yBAAnC,mCAAmC;6DAAnC,mCAAmC;YCjDpC,AADJ,AADJ,AAFJ,8BAA2C,aAEd,aACI,YACE;YACnB,uBAAiC;YAAC,qCACtC;YAER,AADI,AADI,iBAAK,EACH,EACJ;YAKE,AADJ,AADJ,8BAAuB,aACG,aACK;YAAA,YAAqB;YAAA,iBAAM;YAClD,+BAAuB;YAAA,6BAAY;YACvC,AADuC,iBAAM,EACvC;YAEF,AADJ,+BAAkC,cACP;YAAA,aAAkB;YAAA,iBAAM;YAC/C,+BAAuB;YAAA,wBAAO;YAClC,AADkC,iBAAM,EAClC;YAEF,AADJ,gCAAmC,cACR;YAAA,aAAmB;YAAA,iBAAM;YAChD,+BAAuB;YAAA,yBAAQ;YACnC,AADmC,iBAAM,EACnC;YAEF,AADJ,gCAAmC,cACR;YAAA,aAAmB;YAAA,iBAAM;YAChD,+BAAuB;YAAA,yBAAQ;YAEvC,AADI,AADmC,iBAAM,EACnC,EACJ;YAKE,AADJ,AADJ,gCAAwB,eACM,kBAGqB;YADnC,mPAAgC;YAChC,iIAAiB,oBAAgB,IAAC;YACtC,mCAAiB;YAAA,6BAAY;YAAA,iBAAS;YACtC,8HAEC;YACL,iBAAS;YAGL,AADJ,gCAA0B,iBACM;YAAA,0BAAS;YAAA,iBAAQ;YAC7C,kCAI0C;YADnC,8OAA8B;YAC9B,gIAAiB,oBAAgB,IAAC;YAC7C,AALI,iBAI0C,EACxC;YAGF,AADJ,gCAA0B,iBACM;YAAA,0BAAS;YAAA,iBAAQ;YAC7C,kCAI0C;YADnC,8OAA8B;YAC9B,gIAAiB,oBAAgB,IAAC;YAC7C,AALI,iBAI0C,EACxC;YAGF,AADJ,gCAA0B,iBACM;YAAA,qBAAI;YAAA,iBAAQ;YACxC,kCAG0C;YADnC,8OAA8B;YAC9B,gIAAiB,oBAAgB,IAAC;YAC7C,AAJI,iBAG0C,EACxC;YAGF,AADJ,gCAA0B,iBACM;YAAA,mBAAE;YAAA,iBAAQ;YACtC,kCAG0C;YADnC,0OAA4B;YAC5B,gIAAiB,oBAAgB,IAAC;YAEjD,AADI,AAJI,iBAG0C,EACxC,EACJ;YAEN,2GAAwB;YAK5B,iBAAM;YAaJ,AANA,AAJF,wGAAiB,kFAImB,mFAM3B;YA6IT,wGAAgB;YAKpB,iBAAM;;YApO6B,eAAqB;YAArB,yCAAqB;YAIrB,eAAkB;YAAlB,sCAAkB;YAIlB,eAAmB;YAAnB,uCAAmB;YAInB,eAAmB;YAAnB,uCAAmB;YASlC,eAAgC;YAAhC,sDAAgC;YAGpC,eAEC;YAFD,8BAEC;YAQM,eAA8B;YAA9B,oDAA8B;YAS9B,eAA8B;YAA9B,oDAA8B;YAQ9B,eAA8B;YAA9B,oDAA8B;YAQ9B,eAA4B;YAA5B,kDAA4B;YAK3C,cAIC;YAJD,gDAIC;YAIL,cAoJC;YApJD,0EAoJC;YAGD,eAIC;YAJD,wCAIC;;;AD3LQ,mCAAmC;IAP/C,aAAa,CAAC,qBAAqB,EAAE,4BAA4B,CAAC;GAOtD,mCAAmC,CAib/C;;iFAjbY,mCAAmC;cAN/C,SAAS;6BACM,KAAK,YACP,kCAAkC;;kBAqC3C,KAAK;;kFAjCG,mCAAmC;AAmbhD,MAAM,UAAU,8BAA8B;IAC1C,wBAAwB;AAC5B,CAAC","sourcesContent":["/**\n * @fileoverview Duplicate Detection Kanban Board Resource Component\n *\n * Dashboard resource for reviewing duplicate detection results in a Kanban-style\n * board with three columns: Pending Review, Approved, and Rejected.\n * Loads data from MJ: Duplicate Runs, MJ: Duplicate Run Details, and\n * MJ: Duplicate Run Detail Matches entities.\n */\n\nimport { Component, ChangeDetectorRef, OnDestroy, AfterViewInit, Input, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { RunView } from '@memberjunction/core';\nimport {\n ResourceData,\n MJDuplicateRunEntity,\n MJDuplicateRunDetailEntity,\n MJDuplicateRunDetailMatchEntity\n} from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\n\n/**\n * Represents a group of duplicate matches for a single source record,\n * aggregated from detail and match entities for display on the Kanban board.\n */\ninterface DuplicateGroup {\n DetailId: string;\n RunId: string;\n RecordId: string;\n EntityName: string;\n ApprovalStatus: 'Pending' | 'Approved' | 'Rejected';\n MatchCount: number;\n HighestScore: number;\n Matches: MJDuplicateRunDetailMatchEntity[];\n MatchedAt: Date;\n}\n\ninterface DuplicateFilter {\n EntityName: string;\n MinScore: number;\n MaxScore: number;\n DateFrom: string;\n DateTo: string;\n}\n\n@RegisterClass(BaseResourceComponent, 'DuplicateDetectionResource')\n@Component({\n standalone: false,\n selector: 'app-duplicate-detection-resource',\n templateUrl: './duplicate-detection-resource.component.html',\n styleUrls: ['./duplicate-detection-resource.component.css']\n})\nexport class DuplicateDetectionResourceComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private destroy$ = new Subject<void>();\n private filterSubject = new Subject<void>();\n\n // Loading state\n public IsLoading = false;\n public IsSaving = false;\n\n // Raw data\n public Runs: MJDuplicateRunEntity[] = [];\n public Details: MJDuplicateRunDetailEntity[] = [];\n public Matches: MJDuplicateRunDetailMatchEntity[] = [];\n\n // Aggregated groups for display\n public AllGroups: DuplicateGroup[] = [];\n public PendingGroups: DuplicateGroup[] = [];\n public ApprovedGroups: DuplicateGroup[] = [];\n public RejectedGroups: DuplicateGroup[] = [];\n\n // Filter state\n public Filters: DuplicateFilter = {\n EntityName: '',\n MinScore: 0,\n MaxScore: 1,\n DateFrom: '',\n DateTo: ''\n };\n\n // Available entity names from loaded runs\n public EntityNames: string[] = [];\n\n /** Whether this component is embedded inside the Knowledge Hub shell */\n @Input() EmbeddedMode = false;\n\n /** View mode: 'kanban' (card board) or 'table' (paged grid) */\n public DisplayMode: 'kanban' | 'table' = 'kanban';\n\n /** Page size for table view */\n public PageSize = 50;\n\n /** Current page (0-based) */\n public CurrentPage = 0;\n\n /** Selected entity filter */\n public SelectedEntityFilter = '';\n\n /** Currently selected group for merge panel */\n public SelectedMergeGroup: DuplicateGroup | null = null;\n\n /** Whether the merge panel is visible */\n public ShowMergePanel = false;\n\n /** Auto-switch to table mode when groups exceed threshold */\n private readonly kanbanThreshold = 50;\n\n /** Toggle display mode */\n public ToggleDisplayMode(): void {\n this.DisplayMode = this.DisplayMode === 'kanban' ? 'table' : 'kanban';\n this.CurrentPage = 0;\n this.cdr.detectChanges();\n }\n\n /** Filter by entity name */\n public FilterByEntity(entityName: string): void {\n this.SelectedEntityFilter = entityName;\n this.Filters.EntityName = entityName;\n this.autoSelectDisplayMode();\n this.cdr.detectChanges();\n }\n\n /** Get paged groups for table view */\n public GetPagedGroups(): DuplicateGroup[] {\n const start = this.CurrentPage * this.PageSize;\n return this.AllGroups.slice(start, start + this.PageSize);\n }\n\n /** Get total page count */\n public get TotalPages(): number {\n return Math.ceil(this.AllGroups.length / this.PageSize);\n }\n\n /** Navigate to next page */\n public NextPage(): void {\n if (this.CurrentPage < this.TotalPages - 1) {\n this.CurrentPage++;\n this.cdr.detectChanges();\n }\n }\n\n /** Navigate to previous page */\n public PrevPage(): void {\n if (this.CurrentPage > 0) {\n this.CurrentPage--;\n this.cdr.detectChanges();\n }\n }\n\n /** Open the merge panel for a duplicate group */\n public OpenMergePanel(group: DuplicateGroup): void {\n this.SelectedMergeGroup = group;\n this.ShowMergePanel = true;\n this.cdr.detectChanges();\n }\n\n /** Close the merge panel */\n public CloseMergePanel(): void {\n this.SelectedMergeGroup = null;\n this.ShowMergePanel = false;\n this.cdr.detectChanges();\n }\n\n /** Auto-select display mode based on group count */\n private autoSelectDisplayMode(): void {\n this.DisplayMode = this.AllGroups.length > this.kanbanThreshold ? 'table' : 'kanban';\n }\n\n // KPI values\n public get TotalGroupCount(): number {\n return this.AllGroups.length;\n }\n public get PendingCount(): number {\n return this.PendingGroups.length;\n }\n public get ApprovedCount(): number {\n return this.ApprovedGroups.length;\n }\n public get RejectedCount(): number {\n return this.RejectedGroups.length;\n }\n\n async ngAfterViewInit(): Promise<void> {\n this.setupFilterDebounce();\n await this.LoadData();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Duplicate Detection';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-clone';\n }\n\n /**\n * Loads all duplicate run data and builds the Kanban groups.\n */\n public async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = new RunView();\n const [runsResult, detailsResult, matchesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Duplicate Runs',\n ExtraFilter: \"ProcessingStatus = 'Complete'\",\n OrderBy: 'StartedAt DESC',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: Duplicate Run Details',\n ExtraFilter: \"MatchStatus = 'Complete'\",\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: Duplicate Run Detail Matches',\n OrderBy: 'MatchProbability DESC',\n ResultType: 'entity_object'\n }\n ]);\n\n if (runsResult.Success) {\n this.Runs = runsResult.Results as MJDuplicateRunEntity[];\n }\n if (detailsResult.Success) {\n this.Details = detailsResult.Results as MJDuplicateRunDetailEntity[];\n }\n if (matchesResult.Success) {\n this.Matches = matchesResult.Results as MJDuplicateRunDetailMatchEntity[];\n }\n\n this.extractEntityNames();\n this.buildGroups();\n this.applyFilters();\n } catch (error) {\n console.error('Error loading duplicate detection data:', error);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Approves all matches within a duplicate group by updating each match's ApprovalStatus.\n */\n public async ApproveMatch(group: DuplicateGroup): Promise<void> {\n await this.updateGroupApprovalStatus(group, 'Approved');\n }\n\n /**\n * Rejects all matches within a duplicate group by updating each match's ApprovalStatus.\n */\n public async RejectMatch(group: DuplicateGroup): Promise<void> {\n await this.updateGroupApprovalStatus(group, 'Rejected');\n }\n\n /** Handle filter changes with debounce */\n public OnFilterChange(): void {\n this.filterSubject.next();\n }\n\n /** Clear all filters */\n public ClearFilters(): void {\n this.Filters = {\n EntityName: '',\n MinScore: 0,\n MaxScore: 1,\n DateFrom: '',\n DateTo: ''\n };\n this.applyFilters();\n }\n\n /** Returns the CSS class for a match score indicator */\n public GetScoreClass(score: number): string {\n if (score > 0.9) return 'score-high';\n if (score >= 0.7) return 'score-medium';\n return 'score-low';\n }\n\n /** Returns a human-readable label for a match score */\n public GetScoreLabel(score: number): string {\n if (score > 0.9) return 'High';\n if (score >= 0.7) return 'Medium';\n return 'Low';\n }\n\n /** Format a date for display */\n public FormatDate(date: Date | null): string {\n if (!date) return '';\n const d = new Date(date);\n return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' });\n }\n\n /** Whether any filters are active */\n public get HasActiveFilters(): boolean {\n return this.Filters.EntityName !== '' ||\n this.Filters.MinScore > 0 ||\n this.Filters.MaxScore < 1 ||\n this.Filters.DateFrom !== '' ||\n this.Filters.DateTo !== '';\n }\n\n // ---- Private Methods ----\n\n private setupFilterDebounce(): void {\n this.filterSubject.pipe(\n debounceTime(300),\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.applyFilters();\n });\n }\n\n /** Extract unique entity names from loaded runs */\n private extractEntityNames(): void {\n const nameSet = new Set<string>();\n for (const run of this.Runs) {\n if (run.Entity) {\n nameSet.add(run.Entity);\n }\n }\n this.EntityNames = Array.from(nameSet).sort();\n }\n\n /**\n * Build DuplicateGroup objects by joining details to their matches,\n * and resolving the entity name from the parent run.\n */\n private buildGroups(): void {\n const runMap = new Map<string, MJDuplicateRunEntity>();\n for (const run of this.Runs) {\n runMap.set(run.ID, run);\n }\n\n const matchesByDetail = new Map<string, MJDuplicateRunDetailMatchEntity[]>();\n for (const match of this.Matches) {\n const key = match.DuplicateRunDetailID;\n const existing = matchesByDetail.get(key);\n if (existing) {\n existing.push(match);\n } else {\n matchesByDetail.set(key, [match]);\n }\n }\n\n this.AllGroups = [];\n for (const detail of this.Details) {\n const detailMatches = matchesByDetail.get(detail.ID);\n if (!detailMatches || detailMatches.length === 0) {\n continue; // Skip details with no matches\n }\n\n const run = runMap.get(detail.DuplicateRunID);\n const entityName = run?.Entity ?? 'Unknown';\n const highestScore = this.computeHighestScore(detailMatches);\n const dominantStatus = this.computeDominantApprovalStatus(detailMatches);\n const latestMatchDate = this.computeLatestMatchDate(detailMatches);\n\n this.AllGroups.push({\n DetailId: detail.ID,\n RunId: detail.DuplicateRunID,\n RecordId: detail.RecordID,\n EntityName: entityName,\n ApprovalStatus: dominantStatus,\n MatchCount: detailMatches.length,\n HighestScore: highestScore,\n Matches: detailMatches,\n MatchedAt: latestMatchDate\n });\n }\n }\n\n /** Find the highest match probability across a set of matches */\n private computeHighestScore(matches: MJDuplicateRunDetailMatchEntity[]): number {\n let max = 0;\n for (const m of matches) {\n if (m.MatchProbability > max) {\n max = m.MatchProbability;\n }\n }\n return max;\n }\n\n /**\n * Determine the dominant approval status for a group of matches.\n * If any match is Pending, the group is Pending.\n * Otherwise, if all are Approved, the group is Approved.\n * If all are Rejected, the group is Rejected.\n * Mixed Approved/Rejected defaults to Pending.\n */\n private computeDominantApprovalStatus(matches: MJDuplicateRunDetailMatchEntity[]): 'Pending' | 'Approved' | 'Rejected' {\n let hasApproved = false;\n let hasRejected = false;\n for (const m of matches) {\n if (m.ApprovalStatus === 'Pending') return 'Pending';\n if (m.ApprovalStatus === 'Approved') hasApproved = true;\n if (m.ApprovalStatus === 'Rejected') hasRejected = true;\n }\n if (hasApproved && !hasRejected) return 'Approved';\n if (hasRejected && !hasApproved) return 'Rejected';\n return 'Pending'; // mixed\n }\n\n /** Find the latest MatchedAt date across a set of matches */\n private computeLatestMatchDate(matches: MJDuplicateRunDetailMatchEntity[]): Date {\n let latest = new Date(0);\n for (const m of matches) {\n const d = new Date(m.MatchedAt);\n if (d > latest) {\n latest = d;\n }\n }\n return latest;\n }\n\n /** Apply filters and distribute groups into Kanban columns */\n private applyFilters(): void {\n let filtered = [...this.AllGroups];\n\n if (this.Filters.EntityName) {\n filtered = filtered.filter(g => g.EntityName === this.Filters.EntityName);\n }\n\n if (this.Filters.MinScore > 0) {\n filtered = filtered.filter(g => g.HighestScore >= this.Filters.MinScore);\n }\n\n if (this.Filters.MaxScore < 1) {\n filtered = filtered.filter(g => g.HighestScore <= this.Filters.MaxScore);\n }\n\n if (this.Filters.DateFrom) {\n const from = new Date(this.Filters.DateFrom);\n filtered = filtered.filter(g => new Date(g.MatchedAt) >= from);\n }\n\n if (this.Filters.DateTo) {\n const to = new Date(this.Filters.DateTo);\n filtered = filtered.filter(g => new Date(g.MatchedAt) <= to);\n }\n\n this.PendingGroups = filtered.filter(g => g.ApprovalStatus === 'Pending');\n this.ApprovedGroups = filtered.filter(g => g.ApprovalStatus === 'Approved');\n this.RejectedGroups = filtered.filter(g => g.ApprovalStatus === 'Rejected');\n this.cdr.detectChanges();\n }\n\n /** Update the ApprovalStatus of all matches within a group and re-sort.\n * Since this.Matches already contains entity_object instances, we update and save them directly\n * instead of loading each one individually from the database.\n */\n private async updateGroupApprovalStatus(\n group: DuplicateGroup,\n status: 'Approved' | 'Rejected'\n ): Promise<void> {\n this.IsSaving = true;\n this.cdr.detectChanges();\n\n try {\n for (const match of group.Matches) {\n match.ApprovalStatus = status;\n await match.Save();\n }\n\n // Update the local group state\n group.ApprovalStatus = status;\n this.applyFilters();\n } catch (error) {\n console.error(`Error updating match approval status to ${status}:`, error);\n } finally {\n this.IsSaving = false;\n this.cdr.detectChanges();\n }\n }\n}\n\nexport function LoadDuplicateDetectionResource(): void {\n // Prevents tree-shaking\n}\n","<div class=\"duplicate-detection-container\">\n <!-- Header -->\n <div class=\"page-header\">\n <div class=\"header-left\">\n <h2 class=\"page-title\">\n <i class=\"fa-solid fa-clone\"></i> Duplicate Detection\n </h2>\n </div>\n </div>\n\n <!-- KPI Strip -->\n <div class=\"kpi-strip\">\n <div class=\"kpi-card\">\n <div class=\"kpi-value\">{{ TotalGroupCount }}</div>\n <div class=\"kpi-label\">Total Groups</div>\n </div>\n <div class=\"kpi-card kpi-pending\">\n <div class=\"kpi-value\">{{ PendingCount }}</div>\n <div class=\"kpi-label\">Pending</div>\n </div>\n <div class=\"kpi-card kpi-approved\">\n <div class=\"kpi-value\">{{ ApprovedCount }}</div>\n <div class=\"kpi-label\">Approved</div>\n </div>\n <div class=\"kpi-card kpi-rejected\">\n <div class=\"kpi-value\">{{ RejectedCount }}</div>\n <div class=\"kpi-label\">Rejected</div>\n </div>\n </div>\n\n <!-- Filter Bar -->\n <div class=\"filter-bar\">\n <div class=\"filter-group\">\n <select class=\"filter-select\"\n [(ngModel)]=\"Filters.EntityName\"\n (ngModelChange)=\"OnFilterChange()\">\n <option value=\"\">All Entities</option>\n @for (name of EntityNames; track name) {\n <option [value]=\"name\">{{ name }}</option>\n }\n </select>\n\n <div class=\"filter-range\">\n <label class=\"filter-label\">Min Score</label>\n <input type=\"number\"\n class=\"filter-input\"\n min=\"0\" max=\"1\" step=\"0.05\"\n [(ngModel)]=\"Filters.MinScore\"\n (ngModelChange)=\"OnFilterChange()\">\n </div>\n\n <div class=\"filter-range\">\n <label class=\"filter-label\">Max Score</label>\n <input type=\"number\"\n class=\"filter-input\"\n min=\"0\" max=\"1\" step=\"0.05\"\n [(ngModel)]=\"Filters.MaxScore\"\n (ngModelChange)=\"OnFilterChange()\">\n </div>\n\n <div class=\"filter-range\">\n <label class=\"filter-label\">From</label>\n <input type=\"date\"\n class=\"filter-input\"\n [(ngModel)]=\"Filters.DateFrom\"\n (ngModelChange)=\"OnFilterChange()\">\n </div>\n\n <div class=\"filter-range\">\n <label class=\"filter-label\">To</label>\n <input type=\"date\"\n class=\"filter-input\"\n [(ngModel)]=\"Filters.DateTo\"\n (ngModelChange)=\"OnFilterChange()\">\n </div>\n </div>\n\n @if (HasActiveFilters) {\n <button class=\"clear-filters-btn\" (click)=\"ClearFilters()\">\n <i class=\"fa-solid fa-times\"></i> Clear Filters\n </button>\n }\n </div>\n\n <!-- Content -->\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading duplicate detection results...\"></mj-loading>\n </div>\n } @else if (TotalGroupCount === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-clone empty-icon\"></i>\n <p class=\"empty-text\">No duplicate detection results found.</p>\n <p class=\"empty-subtext\">Run a duplicate detection scan to see results here.</p>\n </div>\n } @else {\n <!-- Kanban Board -->\n <div class=\"kanban-board\">\n <!-- Pending Column -->\n <div class=\"kanban-column\">\n <div class=\"column-header column-header-pending\">\n <i class=\"fa-solid fa-clock\"></i>\n <span class=\"column-title\">Pending Review</span>\n <span class=\"column-count\">{{ PendingCount }}</span>\n </div>\n <div class=\"column-body\">\n @for (group of PendingGroups; track group.DetailId) {\n <div class=\"kanban-card\">\n <div class=\"card-header\">\n <span class=\"entity-badge\">{{ group.EntityName }}</span>\n <span class=\"score-indicator\" [class]=\"GetScoreClass(group.HighestScore)\">\n {{ (group.HighestScore * 100).toFixed(0) }}%\n </span>\n </div>\n <div class=\"card-body\">\n <div class=\"card-field\">\n <i class=\"fa-solid fa-fingerprint field-icon\"></i>\n <span class=\"field-value record-id\" [title]=\"group.RecordId\">{{ group.RecordId }}</span>\n </div>\n <div class=\"card-field\">\n <i class=\"fa-solid fa-layer-group field-icon\"></i>\n <span class=\"field-value\">{{ group.MatchCount }} match{{ group.MatchCount !== 1 ? 'es' : '' }}</span>\n </div>\n <div class=\"card-field\">\n <i class=\"fa-solid fa-calendar field-icon\"></i>\n <span class=\"field-value\">{{ FormatDate(group.MatchedAt) }}</span>\n </div>\n </div>\n <div class=\"card-actions\">\n <button class=\"action-btn approve-btn\"\n [disabled]=\"IsSaving\"\n (click)=\"ApproveMatch(group)\">\n <i class=\"fa-solid fa-check\"></i> Approve\n </button>\n <button class=\"action-btn reject-btn\"\n [disabled]=\"IsSaving\"\n (click)=\"RejectMatch(group)\">\n <i class=\"fa-solid fa-times\"></i> Reject\n </button>\n </div>\n </div>\n }\n @if (PendingGroups.length === 0) {\n <div class=\"column-empty\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>No pending items</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Approved Column -->\n <div class=\"kanban-column\">\n <div class=\"column-header column-header-approved\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span class=\"column-title\">Approved</span>\n <span class=\"column-count\">{{ ApprovedCount }}</span>\n </div>\n <div class=\"column-body\">\n @for (group of ApprovedGroups; track group.DetailId) {\n <div class=\"kanban-card\">\n <div class=\"card-header\">\n <span class=\"entity-badge\">{{ group.EntityName }}</span>\n <span class=\"score-indicator\" [class]=\"GetScoreClass(group.HighestScore)\">\n {{ (group.HighestScore * 100).toFixed(0) }}%\n </span>\n </div>\n <div class=\"card-body\">\n <div class=\"card-field\">\n <i class=\"fa-solid fa-fingerprint field-icon\"></i>\n <span class=\"field-value record-id\" [title]=\"group.RecordId\">{{ group.RecordId }}</span>\n </div>\n <div class=\"card-field\">\n <i class=\"fa-solid fa-layer-group field-icon\"></i>\n <span class=\"field-value\">{{ group.MatchCount }} match{{ group.MatchCount !== 1 ? 'es' : '' }}</span>\n </div>\n <div class=\"card-field\">\n <i class=\"fa-solid fa-calendar field-icon\"></i>\n <span class=\"field-value\">{{ FormatDate(group.MatchedAt) }}</span>\n </div>\n </div>\n </div>\n }\n @if (ApprovedGroups.length === 0) {\n <div class=\"column-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No approved items</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Rejected Column -->\n <div class=\"kanban-column\">\n <div class=\"column-header column-header-rejected\">\n <i class=\"fa-solid fa-ban\"></i>\n <span class=\"column-title\">Rejected</span>\n <span class=\"column-count\">{{ RejectedCount }}</span>\n </div>\n <div class=\"column-body\">\n @for (group of RejectedGroups; track group.DetailId) {\n <div class=\"kanban-card\">\n <div class=\"card-header\">\n <span class=\"entity-badge\">{{ group.EntityName }}</span>\n <span class=\"score-indicator\" [class]=\"GetScoreClass(group.HighestScore)\">\n {{ (group.HighestScore * 100).toFixed(0) }}%\n </span>\n </div>\n <div class=\"card-body\">\n <div class=\"card-field\">\n <i class=\"fa-solid fa-fingerprint field-icon\"></i>\n <span class=\"field-value record-id\" [title]=\"group.RecordId\">{{ group.RecordId }}</span>\n </div>\n <div class=\"card-field\">\n <i class=\"fa-solid fa-layer-group field-icon\"></i>\n <span class=\"field-value\">{{ group.MatchCount }} match{{ group.MatchCount !== 1 ? 'es' : '' }}</span>\n </div>\n <div class=\"card-field\">\n <i class=\"fa-solid fa-calendar field-icon\"></i>\n <span class=\"field-value\">{{ FormatDate(group.MatchedAt) }}</span>\n </div>\n </div>\n </div>\n }\n @if (RejectedGroups.length === 0) {\n <div class=\"column-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No rejected items</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Saving overlay -->\n @if (IsSaving) {\n <div class=\"saving-overlay\">\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n </div>\n }\n</div>\n"]}
@@ -0,0 +1,241 @@
1
+ /**
2
+ * @fileoverview Vector Management Resource Component
3
+ *
4
+ * Dashboard resource for managing vector databases and entity vectorization.
5
+ * Displays KPI cards (total vectors, entities synced, last sync, avg embedding time),
6
+ * an entity sync table, and sidebar panels for DB health, embedding model info,
7
+ * and storage usage.
8
+ */
9
+ import { OnDestroy, AfterViewInit } from '@angular/core';
10
+ import { ResourceData } from '@memberjunction/core-entities';
11
+ import { MJVectorDatabaseEntity } from '@memberjunction/core-entities';
12
+ import { BaseResourceComponent } from '@memberjunction/ng-shared';
13
+ import { KPICardData } from '../widgets/kpi-card.component';
14
+ import * as i0 from "@angular/core";
15
+ /** Flattened row for the entity sync table */
16
+ interface EntitySyncRow {
17
+ EntityDocumentID: string;
18
+ EntityName: string;
19
+ DocumentName: string;
20
+ VectorCount: number;
21
+ LastSynced: Date | null;
22
+ Status: 'Synced' | 'Syncing' | 'Error' | 'Pending';
23
+ /** Percent complete during active sync (0-100) */
24
+ PercentComplete: number;
25
+ /** Pipeline run ID for tracking active subscription */
26
+ PipelineRunID?: string;
27
+ }
28
+ /** Sidebar embedding model summary */
29
+ interface EmbeddingModelInfo {
30
+ Name: string;
31
+ Dimensions: number | null;
32
+ }
33
+ /** Result from AI document suggestion */
34
+ interface DocumentSuggestionResult {
35
+ template: string;
36
+ selectedFields: string[];
37
+ selectedRelationships: {
38
+ name: string;
39
+ fields: string[];
40
+ }[];
41
+ potentialMatchThreshold: number;
42
+ absoluteMatchThreshold: number;
43
+ reasoning: string;
44
+ }
45
+ export declare class VectorManagementResourceComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {
46
+ private cdr;
47
+ private destroy$;
48
+ /** View mode: 'index' = Option A (shared index as hero, entity docs as children),
49
+ * 'operations' = Option C (operations monitoring with real-time sync status) */
50
+ ViewMode: 'index' | 'operations';
51
+ /** Whether this component is embedded inside the Knowledge Hub shell */
52
+ EmbeddedMode: boolean;
53
+ /** Toggle between view modes */
54
+ ToggleViewMode(): void;
55
+ IsLoading: boolean;
56
+ KPICards: KPICardData[];
57
+ SyncRows: EntitySyncRow[];
58
+ SyncingIds: Set<string>;
59
+ VectorDBName: string;
60
+ VectorDBStatus: 'Healthy' | 'Degraded' | 'Offline';
61
+ EmbeddingModel: EmbeddingModelInfo;
62
+ StorageUsagePercent: number;
63
+ TotalVectors: number;
64
+ ShowEditPanel: boolean;
65
+ IsEditSaving: boolean;
66
+ IsEditDeleting: boolean;
67
+ EditDocID: string;
68
+ EditDocName: string;
69
+ EditDocEntityName: string;
70
+ EditDocVectorDBID: string;
71
+ EditDocAIModelID: string;
72
+ EditDocVectorIndexID: string;
73
+ EditDocStatus: string;
74
+ /** Open the edit panel for an entity document */
75
+ OpenEditPanel(entityDocumentId: string): void;
76
+ CloseEditPanel(): void;
77
+ SaveEditedDocument(): Promise<void>;
78
+ DeleteEntityDocument(): Promise<void>;
79
+ ShowSuggestDialog: boolean;
80
+ IsSuggesting: boolean;
81
+ SuggestEntityName: string;
82
+ SuggestUseCase: string;
83
+ SuggestionResult: DocumentSuggestionResult | null;
84
+ SaveDocumentName: string;
85
+ SuggestionError: string;
86
+ IsSavingDocument: boolean;
87
+ EditableTemplate: string;
88
+ /** Prerequisites check — are vector DB and embedding model configured? */
89
+ HasVectorDB: boolean;
90
+ HasEmbeddingModel: boolean;
91
+ get PrerequisitesMet(): boolean;
92
+ /** Available embedding models for selection in save form */
93
+ AvailableEmbeddingModels: {
94
+ ID: string;
95
+ Name: string;
96
+ }[];
97
+ /** Selected embedding model ID for the new entity document */
98
+ SelectedEmbeddingModelID: string;
99
+ /** Selected vector database ID for the new entity document */
100
+ SelectedVectorDBID: string;
101
+ /** Available vector indexes for selection */
102
+ AvailableVectorIndexes: {
103
+ ID: string;
104
+ Name: string;
105
+ VectorDatabaseID: string;
106
+ EmbeddingModelID: string;
107
+ }[];
108
+ /** Selected vector index ID — if user picks an existing one */
109
+ SelectedVectorIndexID: string;
110
+ /** Indexes filtered by the currently selected vector DB (for create/edit forms) */
111
+ get FilteredIndexesForSelectedDB(): {
112
+ ID: string;
113
+ Name: string;
114
+ VectorDatabaseID: string;
115
+ EmbeddingModelID: string;
116
+ }[];
117
+ /** Indexes filtered by the edit panel's selected vector DB */
118
+ get EditFilteredIndexes(): {
119
+ ID: string;
120
+ Name: string;
121
+ VectorDatabaseID: string;
122
+ EmbeddingModelID: string;
123
+ }[];
124
+ /** Grouped entity list for the suggestion panel — schemas as groups, entities as items */
125
+ EntityGroups: {
126
+ SchemaName: string;
127
+ Entities: {
128
+ Name: string;
129
+ ID: string;
130
+ }[];
131
+ }[];
132
+ /** Filtered entity groups based on search input */
133
+ FilteredEntityGroups: {
134
+ SchemaName: string;
135
+ Entities: {
136
+ Name: string;
137
+ ID: string;
138
+ }[];
139
+ }[];
140
+ /** Search text for filtering entities */
141
+ EntitySearchText: string;
142
+ /** Whether the entity picker dropdown is open */
143
+ ShowEntityPicker: boolean;
144
+ private entityDocuments;
145
+ protected vectorDatabases: MJVectorDatabaseEntity[];
146
+ private vectorIndexes;
147
+ private recordDocuments;
148
+ private aiModels;
149
+ ngAfterViewInit(): Promise<void>;
150
+ ngOnDestroy(): void;
151
+ GetResourceDisplayName(_data: ResourceData): Promise<string>;
152
+ GetResourceIconClass(_data: ResourceData): Promise<string>;
153
+ /** Reload all dashboard data */
154
+ LoadData(): Promise<void>;
155
+ /** Trigger vectorization for a specific entity document via GraphQL (fire-and-forget with progress subscription) */
156
+ SyncEntity(entityDocumentId: string): Promise<void>;
157
+ /** Subscribe to PipelineProgress for a specific pipeline run */
158
+ private subscribeToPipelineProgress;
159
+ /**
160
+ * Add an ID to SyncingIds, creating a new Set reference so Angular
161
+ * change detection picks up the mutation in template bindings.
162
+ */
163
+ private addSyncingId;
164
+ /**
165
+ * Remove an ID from SyncingIds, creating a new Set reference so Angular
166
+ * change detection picks up the mutation in template bindings.
167
+ */
168
+ private removeSyncingId;
169
+ /** Opens the AI suggestion dialog */
170
+ OpenSuggestDialog(): void;
171
+ /** Select an entity from the grouped picker */
172
+ SelectEntity(entityName: string): void;
173
+ /** Filter entities by search text */
174
+ FilterEntities(): void;
175
+ /** Toggle entity picker visibility */
176
+ ToggleEntityPicker(): void;
177
+ /** Handle template edits from code editor */
178
+ OnTemplateChange(newValue: string): void;
179
+ /** Closes the suggestion dialog */
180
+ CloseSuggestDialog(): void;
181
+ /** Clears the current suggestion to try again */
182
+ ClearSuggestion(): void;
183
+ /**
184
+ * Runs the AI suggestion by calling the server-side "Entity Document Suggestion"
185
+ * AI prompt via GraphQL. The LLM analyzes the entity schema and generates
186
+ * natural language Nunjucks templates optimized for embedding quality.
187
+ */
188
+ RunSuggestion(): Promise<void>;
189
+ /** Saves the current suggestion as an Entity Document record */
190
+ SaveAsEntityDocument(): Promise<void>;
191
+ /** Returns the CSS class for a given sync status badge */
192
+ GetStatusClass(status: string): string;
193
+ /** Returns the icon class for a given sync status */
194
+ GetStatusIcon(status: string): string;
195
+ /** Format a Date value for display */
196
+ FormatDate(date: Date | null): string;
197
+ /** Format the storage gauge label */
198
+ get StorageLabel(): string;
199
+ /** CSS class for the DB health indicator dot */
200
+ get DBHealthClass(): string;
201
+ private fetchAllData;
202
+ private buildSyncRows;
203
+ private computeLastSynced;
204
+ private computeSyncStatus;
205
+ private buildKPICards;
206
+ private buildSidebarData;
207
+ private buildVectorDBHealth;
208
+ private buildEmbeddingModelInfo;
209
+ private buildStorageUsage;
210
+ /** Check if vector DB and embedding model are configured, populate selection lists */
211
+ private checkPrerequisites;
212
+ /** Find the best embedding model from loaded AI models */
213
+ private findEmbeddingModel;
214
+ /**
215
+ * Populate required foreign key fields on an Entity Document before saving.
216
+ * Throws if prerequisites are not met.
217
+ */
218
+ private populateEntityDocumentFKs;
219
+ /** Create a Template + TemplateContent record for the entity document */
220
+ private createTemplateForDocument;
221
+ /** Build grouped entity list from metadata, grouped by SchemaName */
222
+ private loadEntityGroups;
223
+ private updateRowStatus;
224
+ private updateRowProgress;
225
+ /** Refresh a single sync row's vector count and status from the DB */
226
+ private refreshSyncRow;
227
+ /**
228
+ * Calls the "Entity Document Suggestion" AI prompt via GraphQL to generate
229
+ * a natural language template optimized for vector embeddings.
230
+ */
231
+ private callSuggestionPrompt;
232
+ /** Find the Entity Document Suggestion prompt from AIEngineBase */
233
+ private findSuggestionPrompt;
234
+ /** Build the data payload for the suggestion prompt */
235
+ private buildPromptData;
236
+ static ɵfac: i0.ɵɵFactoryDeclaration<VectorManagementResourceComponent, never>;
237
+ static ɵcmp: i0.ɵɵComponentDeclaration<VectorManagementResourceComponent, "app-vector-management-resource", never, { "EmbeddedMode": { "alias": "EmbeddedMode"; "required": false; }; }, {}, never, never, false, never>;
238
+ }
239
+ export declare function LoadVectorManagementResource(): void;
240
+ export {};
241
+ //# sourceMappingURL=vector-management-resource.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-management-resource.component.d.ts","sourceRoot":"","sources":["../../../../src/AI/components/vectors/vector-management-resource.component.ts"],"names":[],"mappings":"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"}