@memberjunction/ng-dashboards 5.29.0 → 5.30.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 (90) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  2. package/dist/AI/components/agents/agent-configuration.component.js +11 -9
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  5. package/dist/AI/components/agents/agent-editor.component.js +21 -19
  6. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +154 -154
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  9. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  10. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +8 -0
  11. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  12. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +1 -1
  13. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  14. package/dist/AI/components/vectors/vector-management-resource.component.js +2 -2
  15. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  16. package/dist/APIKeys/api-applications-panel.component.d.ts +1 -1
  17. package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
  18. package/dist/APIKeys/api-applications-panel.component.js +15 -2
  19. package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
  20. package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
  21. package/dist/APIKeys/api-key-edit-panel.component.js +17 -5
  22. package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
  23. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  24. package/dist/Credentials/components/credentials-list-resource.component.js +56 -71
  25. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  26. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +0 -8
  27. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  28. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +73 -74
  29. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  30. package/dist/DashboardBrowser/dashboard-share-adapter.d.ts +25 -0
  31. package/dist/DashboardBrowser/dashboard-share-adapter.d.ts.map +1 -0
  32. package/dist/DashboardBrowser/dashboard-share-adapter.js +99 -0
  33. package/dist/DashboardBrowser/dashboard-share-adapter.js.map +1 -0
  34. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +21 -104
  35. package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
  36. package/dist/DashboardBrowser/dashboard-share-dialog.component.js +48 -530
  37. package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
  38. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +5 -0
  39. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  40. package/dist/DataExplorer/data-explorer-dashboard.component.js +17 -0
  41. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  42. package/dist/Integration/components/connections/connections.component.d.ts +18 -1
  43. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
  44. package/dist/Integration/components/connections/connections.component.js +251 -199
  45. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  46. package/dist/Integration/services/integration-data.service.d.ts +7 -2
  47. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  48. package/dist/Integration/services/integration-data.service.js +10 -2
  49. package/dist/Integration/services/integration-data.service.js.map +1 -1
  50. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +144 -144
  51. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  52. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  53. package/dist/Lists/components/lists-operations-resource.component.js +12 -14
  54. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  55. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  56. package/dist/MCP/mcp-dashboard.component.js +28 -57
  57. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  58. package/dist/Permissions/audit-log-resource.component.d.ts +38 -0
  59. package/dist/Permissions/audit-log-resource.component.d.ts.map +1 -0
  60. package/dist/Permissions/audit-log-resource.component.js +380 -0
  61. package/dist/Permissions/audit-log-resource.component.js.map +1 -0
  62. package/dist/Permissions/permissions-shared.d.ts +51 -0
  63. package/dist/Permissions/permissions-shared.d.ts.map +1 -0
  64. package/dist/Permissions/permissions-shared.js +91 -0
  65. package/dist/Permissions/permissions-shared.js.map +1 -0
  66. package/dist/Permissions/resource-access-resource.component.d.ts +45 -0
  67. package/dist/Permissions/resource-access-resource.component.d.ts.map +1 -0
  68. package/dist/Permissions/resource-access-resource.component.js +342 -0
  69. package/dist/Permissions/resource-access-resource.component.js.map +1 -0
  70. package/dist/Permissions/user-access-resource.component.d.ts +39 -0
  71. package/dist/Permissions/user-access-resource.component.d.ts.map +1 -0
  72. package/dist/Permissions/user-access-resource.component.js +346 -0
  73. package/dist/Permissions/user-access-resource.component.js.map +1 -0
  74. package/dist/component-studio-dashboards.module.d.ts +1 -0
  75. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  76. package/dist/component-studio-dashboards.module.js +7 -0
  77. package/dist/component-studio-dashboards.module.js.map +1 -1
  78. package/dist/core-dashboards.module.d.ts +24 -20
  79. package/dist/core-dashboards.module.d.ts.map +1 -1
  80. package/dist/core-dashboards.module.js +26 -1
  81. package/dist/core-dashboards.module.js.map +1 -1
  82. package/dist/public-api.d.ts +4 -1
  83. package/dist/public-api.d.ts.map +1 -1
  84. package/dist/public-api.js +4 -0
  85. package/dist/public-api.js.map +1 -1
  86. package/dist/shared/pipes/highlight-search.pipe.d.ts +1 -1
  87. package/dist/shared/pipes/highlight-search.pipe.d.ts.map +1 -1
  88. package/dist/shared/pipes/highlight-search.pipe.js +14 -4
  89. package/dist/shared/pipes/highlight-search.pipe.js.map +1 -1
  90. package/package.json +51 -50
@@ -1 +1 @@
1
- {"version":3,"file":"api-key-edit-panel.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-key-edit-panel.component.ts","../../src/APIKeys/api-key-edit-panel.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAa,MAAM,EAAiB,MAAM,eAAe,CAAC;AAC/G,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAuB,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AACpG,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;;;;;;;;ICFvF,8BAAiD;IAAlB,yLAAS,cAAO,KAAC;IAAC,iBAAM;;;IAqBrD,gCAAuD;;;IAMrD,+BAA6B;IAC3B,wBAAwC;IACxC,YACF;IAAA,iBAAM;;;IADJ,eACF;IADE,sDACF;;;IAGA,+BAA2B;IACzB,wBAA8C;IAC9C,YACF;IAAA,iBAAM;;;IADJ,eACF;IADE,oDACF;;;IAcI,gCAAgC;IAAA,iBAAC;IAAA,iBAAO;;;;IA8ClC,kCACyB;IAAvB,4NAAS,mBAAY,KAAC;IACtB,wBAAoF;IACpF,YACF;IAAA,iBAAS;;;IAFa,cAA8B;IAAC,AAA/B,8CAA8B,8BAA6B;IAC/E,cACF;IADE,qEACF;;;;IAwBE,kCACiC;IAA/B,mPAAyB,IAAI,KAAC;IAC9B,uBAAiC;IACjC,+BACF;IAAA,iBAAS;;;IAUP,iCAAyD;;IAA7C,gCAAkB;;;IAG9B,4BAAM;IACJ,wBAAgC;IAChC,8BACF;IAAA,iBAAO;;;;IAVX,AADF,+BAA0B,iBAGE;IAAxB,4NAAS,oBAAa,KAAC;IACvB,+IAAgB;IAGhB,qIAAiB;IAOrB,AADE,iBAAS,EACL;;;IAZF,cAAqB;IAArB,0CAAqB;IAErB,cAEC;IAFD,0CAEC;IACD,cAKC;IALD,2CAKC;;;;IAWD,AADF,+BAA4B,cACD;IACvB,wBAAgD;IAE9C,AADF,2BAAK,aACK;IAAA,mCAAmB;IAAA,iBAAS;IACpC,yBAAG;IAAA,mGAAmF;IAE1F,AADE,AADwF,iBAAI,EACtF,EACF;IACN,kCAAmD;IAAxB,0OAAS,oBAAa,KAAC;IAChD,wBAA+B;IAC/B,6BACF;IACF,AADE,iBAAS,EACL;;;IAsBE,iCAAyD;;IAA7C,gCAAkB;;;IAG9B,4BAAM;IACJ,wBAA+B;IAC/B,4BACF;IAAA,iBAAO;;;;IAxBb,AADF,+BAA4B,cACG;IAC3B,wBAA4C;IAE1C,AADF,2BAAK,aACK;IAAA,wCAAwB;IAAA,iBAAS;IACzC,yBAAG;IAAA,uHAAuG;IAE9G,AADE,AAD4G,iBAAI,EAC1G,EACF;IAEJ,AADF,+BAA2B,YAClB;IAAA,sBAAK;IAAA,6BAAM;IAAA,uBAAM;IAAA,iBAAO;IAAC,6BAAW;IAAA,iBAAQ;IACnD,kCACyB;IADD,iXAA+B;IAEzD,AAFE,iBACyB,EACrB;IAEJ,AADF,gCAA6B,kBACe;IAAzB,2OAAS,qBAAc,KAAC;IAAC,uBAAM;IAAA,iBAAS;IACzD,mCAE4B;IAA1B,2OAAS,sBAAe,KAAC;IACzB,+JAAkB;IAGlB,qJAAmB;IAQzB,AADE,AADE,iBAAS,EACL,EACF;;;IAnBsB,gBAA+B;IAA/B,wDAA+B;IAMrD,eAAyD;IAAzD,qFAAyD;IAEzD,cAEC;IAFD,6CAEC;IACD,cAKC;IALD,8CAKC;;;IA3CT,AADF,+BAAyB,SACnB;IAAA,2BAAW;IAAA,iBAAK;IACpB,yIAA0B;IAe1B,yIAAyB;IAgC3B,iBAAM;;;IA/CJ,eAcC;IAdD,oDAcC;IACD,cA+BC;IA/BD,mDA+BC;;;IAKH,+BAA4B;IAC1B,wBAA+B;IAE7B,AADF,2BAAK,aACK;IAAA,6CAA6B;IAAA,iBAAS;IAC9C,yBAAG;IAAA,+GAA+F;IAEtG,AADE,AADoG,iBAAI,EAClG,EACF;;;;IAjJF,AADF,AADF,AADF,AADF,+BAAuB,cACM,cACA,cACD,eACK;IAAA,wBAAQ;IAAA,iBAAO;IACxC,gCAAyB;IAAA,YAAe;IAE5C,AADE,AAD0C,iBAAO,EAC3C,EACF;IAGF,AADF,AADF,+BAAuB,cACE,gBACI;IAAA,wBAAO;IAAA,iBAAO;IACvC,iCAAyB;IAAA,aAAqC;IAChE,AADgE,iBAAO,EACjE;IAEJ,AADF,gCAAuB,gBACI;IAAA,2BAAU;IAAA,iBAAO;IAC1C,iCAAyB;IAAA,aAAwB;IACnD,AADmD,iBAAO,EACpD;IAEJ,AADF,gCAAuB,gBACI;IAAA,sBAAK;IAAA,iBAAO;IACrC,iCAAyB;IAAA,aAAe;IAC1C,AAD0C,iBAAO,EAC3C;IAEJ,AADF,gCAAuB,gBACI;IAAA,0BAAS;IAAA,iBAAO;IACzC,iCAAiE;IAC/D,aACF;IAGN,AADE,AADE,AADE,iBAAO,EACH,EACF,EACF;IAIF,AADF,AADF,gCAA0B,eACI,UACtB;IAAA,kCAAiB;IAAA,iBAAK;IAC1B,8HAAkC;IAOpC,iBAAM;IAEJ,AADF,gCAAwB,aACf;IAAA,sBAAK;IAAA,iBAAQ;IACpB,kCAC4B;IADO,oUAAuB;IAE5D,AAFE,iBAC4B,EACxB;IAEJ,AADF,gCAAwB,aACf;IAAA,4BAAW;IAAA,iBAAQ;IAC1B,qCAEa;IAF+B,mVAA6B;IAG3E,AADe,iBAAW,EACpB;IAEJ,AADF,gCAAwB,aACf;IAAA,2BAAU;IAAA,iBAAQ;IAEvB,AADF,gCAA8B,yBAKE;IAJf,oVAA2B;IAK1C,iBAAgB;IAChB,8HAAkC;IAQtC,AADE,iBAAM,EACF;IACN,2HAAiB;IAiBnB,iBAAM;IAEN,2HAAkC;IAqDlC,2HAAmC;IASrC,iBAAM;;;IAlJ2B,eAAe;IAAf,wCAAe;IAMf,eAAqC;IAArC,qEAAqC;IAIrC,eAAwB;IAAxB,iDAAwB;IAIxB,eAAe;IAAf,wCAAe;IAIf,eAAuC;IAAvC,uDAAuC;IAC9D,cACF;IADE,iHACF;IAQF,eAMC;IAND,6DAMC;IAIkC,eAAuB;IAAvB,gDAAuB;IACxD,4CAAuB;IAImB,eAA6B;IAA7B,sDAA6B;IAEvE,AADA,4CAAuB,WACb;IAKK,eAA2B;IAA3B,oDAA2B;IAExC,AADA,4CAAuB,4BACH;IAItB,cAMC;IAND,oEAMC;IAGL,cAgBC;IAhBD,4CAgBC;IAGH,cAmDC;IAnDD,6DAmDC;IAED,cAQC;IARD,8DAQC;;;IAeO,iCAAyD;;IAA7C,gCAAkB;;;IAG9B,4BAAM;IACJ,wBAAgC;IAChC,8BACF;IAAA,iBAAO;;;;IAVX,kCAE+B;IAA7B,4NAAS,yBAAkB,KAAC;IAC5B,8IAAgB;IAGhB,oIAAiB;IAMnB,iBAAS;;;IAXP,0CAAqB;IAErB,cAEC;IAFD,0CAEC;IACD,cAKC;IALD,2CAKC;;;IAML,+BAA+B;IAC7B,wBAAgD;IAE9C,AADF,2BAAK,aACK;IAAA,gDAAgC;IAAA,iBAAS;IACjD,yBAAG;IAAA,kKAAkJ;IAEzJ,AADE,AADuJ,iBAAI,EACrJ,EACF;;;IAGN,iCAAuD;;;;IAgB3C,iCAEG;IADD,iNAAS,wBAAwB,KAAC;IAElC,iCAE2C;IAAzC,oSAAU,sCAA2B,KAAC;IAFxC,iBAE2C;IAC3C,4BAAM;IAAA,mBAAG;IACX,AADW,iBAAO,EACV;;;IAHJ,cAAgC;IAAhC,kDAAgC;;;IAqB5B,gCAAyB;IACvB,YACF;IAAA,iBAAO;;;IADL,cACF;IADE,2DACF;;;;IATJ,AADF,AADF,+BAAwB,gBACK,gBAIM;IAF7B,sWAA2B;IAE3B,wPAAU,sBAAe,KAAC;IAH5B,iBAG+B;IAE7B,AADF,+BAAwB,eACG;IAAA,YAAmB;IAAA,iBAAO;IACnD,mKAA8B;IAOpC,AADE,AADE,iBAAM,EACA,EACJ;;;;IAZA,eAA2B;IAA3B,iDAA2B;IAC3B,6DAAwC;IAGf,eAAmB;IAAnB,yCAAmB;IAC5C,cAIC;IAJD,qDAIC;;;IAdX,+BAA6B;IAC3B,+KAiBC;IACH,iBAAM;;;IAlBJ,cAiBC;IAjBD,kCAiBC;;;;IA1CL,AADF,+BAA4B,cACsC;IAAnC,8PAAS,mCAAwB,KAAC;IAC7D,+BAA2B;IACzB,oBAA8D;IAC9D,gCAA4B;IAAA,YAAiB;IAAA,iBAAO;IACpD,gCAA6B;IAC3B,YACF;IACF,AADE,iBAAO,EACH;IACN,+BAA4B;IAC1B,+IAAkC;IAUlC,yBAC8C;IAElD,AADE,iBAAM,EACF;IACN,+IAAyB;IAsB3B,iBAAM;;;;IA3CG,eAAuB;IAAvB,gCAAuB;IAAC,2CAA8B;IAC7B,eAAiB;IAAjB,uCAAiB;IAE3C,eACF;IADE,uGACF;IAGA,eASC;IATD,4DASC;IAC+B,cAA4C;IAC5E,AADgC,yDAA4C,wCACnC;IAG7C,cAqBC;IArBD,iDAqBC;;;IA/CP,+BAA8B;IAC5B,4JAgDC;IACH,iBAAM;;;IAjDJ,cAgDC;IAhDD,qCAgDC;;;IAjFD,AADF,AADF,AADF,+BAAoC,cACP,cACA,eACG;IAAA,YAAgD;IAC5E,AAD4E,iBAAO,EAC7E;IACN,4HAAqD;IAevD,iBAAM;IAEN,yHAAuF;IASvF,gIAAuB;IAGvB,yHAAwB;IAqD1B,iBAAM;;;IApF0B,eAAgD;IAAhD,kFAAgD;IAE5E,cAcC;IAdD,sFAcC;IAGH,cAQC;IARD,+HAQC;IACD,cAEC;IAFD,iDAEC;IACD,cAoDC;IApDD,kDAoDC;;;IAOC,iCAAsD;;;IA4B5C,AADF,gCAAsB,eACG;IAAA,YAAqC;IAAA,iBAAO;IAEjE,AADF,gCAA2B,gBACE;IAAA,YAAc;IAAA,iBAAO;IAChD,YACF;IAAA,iBAAO;IACP,iCAAoE;IAClE,YACF;IAAA,iBAAO;IACP,iCAA2B;IAAA,aAAsB;IACnD,AADmD,iBAAO,EACpD;;;;IATmB,eAAqC;IAArC,kEAAqC;IAE/B,eAAc;IAAd,oCAAc;IACzC,cACF;IADE,iDACF;IACyB,cAA0C;IAA1C,mEAA0C;IACjE,cACF;IADE,mDACF;IAC2B,eAAsB;IAAtB,qDAAsB;;;IAfnD,AADF,AADF,+BAAwB,cACE,eACC;IAAA,oBAAI;IAAA,iBAAO;IAClC,gCAA2B;IAAA,wBAAQ;IAAA,iBAAO;IAC1C,iCAAyB;IAAA,sBAAM;IAAA,iBAAO;IACtC,iCAA2B;IAAA,wBAAQ;IACrC,AADqC,iBAAO,EACtC;IACN,6KAYC;IACH,iBAAM;;;IAbJ,gBAYC;IAZD,+BAYC;;;IAIH,+BAAyB;IACvB,yBAAsC;IACtC,4BAAM;IAAA,iCAAiB;IAAA,iBAAO;IAC9B,yBAAG;IAAA,mFAAmE;IACxE,AADwE,iBAAI,EACtE;;;IAzCN,AADF,AADF,+BAA2B,cACA,cACA;IACrB,wBAAsC;IACtC,+BAAwB;IAAA,YAAoB;IAAA,iBAAM;IAClD,+BAAwB;IAAA,8BAAc;IACxC,AADwC,iBAAM,EACxC;IACN,+BAAuB;IACrB,wBAAiC;IACjC,gCAAwB;IACtB,aACF;IAAA,iBAAM;IACN,gCAAwB;IAAA,0BAAS;IAErC,AADE,AADmC,iBAAM,EACnC,EACF;IACN,0IAA4B;IAuB5B,yIAA8B;IAOhC,iBAAM;;;IAzCwB,eAAoB;IAApB,6CAAoB;IAM1C,eACF;IADE,iIACF;IAIJ,eAsBC;IAtBD,uDAsBC;IACD,cAMC;IAND,yDAMC;;;IAjDP,+BAAmC;IACjC,gIAAqB;IAGrB,0HAAsB;IAgDxB,iBAAM;;;IAnDJ,cAEC;IAFD,+CAEC;IACD,cA+CC;IA/CD,gDA+CC;;;;IA7UP,0GAAsB;IAMtB,0GAAoB;IAQlB,AADF,+BAA2B,iBAES;IAAhC,gNAAqB,SAAS,KAAC;IAC/B,wBAAuC;IACvC,yBACF;IAAA,iBAAS;IACT,kCACiC;IAA/B,gNAAqB,QAAQ,KAAC;IAC9B,wBAAyC;IACzC,6BACA;IAAA,2GAAuB;IAGzB,iBAAS;IACT,mCACgC;IAA9B,iNAAqB,OAAO,KAAC;IAC7B,yBAAsC;IACtC,wBACF;IACF,AADE,iBAAS,EACL;IACN,gCAA8B;IAE5B,8GAA+B;IA2J/B,4GAA8B;IA2F9B,4GAA6B;IAuD/B,iBAAM;IAGJ,AADF,gCAA6B,kBACQ;IAAlB,8LAAS,cAAO,KAAC;IAAC,sBAAK;IAC1C,AAD0C,iBAAS,EAC7C;;;IApVN,gDAKC;IACD,cAKC;IALD,8CAKC;IAG8B,eAAwC;IAAxC,wDAAwC;IAKxC,eAAuC;IAAvC,uDAAuC;IAIlE,eAEC;IAFD,iDAEC;IAE0B,cAAsC;IAAtC,sDAAsC;IAQnE,eAyJC;IAzJD,0DAyJC;IAED,cAyFC;IAzFD,yDAyFC;IAED,cAsDC;IAtDD,wDAsDC;;AD3UP;;GAEG;AAOH,MAAM,OAAO,wBAAwB;IACxB,OAAO,GAAG,KAAK,CAAC;IAChB,KAAK,GAAkB,IAAI,CAAC;IAC3B,aAAa,GAAG,IAAI,YAAY,EAAW,CAAC;IAC5C,OAAO,GAAG,IAAI,YAAY,EAAkB,CAAC;IAC7C,OAAO,GAAG,IAAI,YAAY,EAAkB,CAAC;IAC7C,MAAM,GAAG,IAAI,YAAY,EAAQ,CAAC;IAEpC,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;IAE5B,cAAc;IACP,MAAM,GAA0B,IAAI,CAAC;IACrC,SAAS,GAAG,IAAI,CAAC;IACjB,QAAQ,GAAG,KAAK,CAAC;IACjB,UAAU,GAAG,KAAK,CAAC;IAE1B,YAAY;IACL,SAAS,GAAG,KAAK,CAAC;IAClB,SAAS,GAAG,EAAE,CAAC;IACf,eAAe,GAAG,EAAE,CAAC;IACrB,aAAa,GAAgB,IAAI,CAAC;IAEzC,SAAS;IACF,eAAe,GAAoB,EAAE,CAAC;IACtC,eAAe,GAAG,IAAI,CAAC;IACvB,eAAe,GAAG,KAAK,CAAC;IAE/B,aAAa;IACN,SAAS,GAAmB,EAAE,CAAC;IAC/B,aAAa,GAAG,IAAI,CAAC;IAE5B,OAAO;IACA,SAAS,GAAmC,SAAS,CAAC;IAE7D,sBAAsB;IACf,iBAAiB,GAAG,KAAK,CAAC;IAC1B,iBAAiB,GAAG,EAAE,CAAC;IAE9B,WAAW;IACJ,cAAc,GAAG,EAAE,CAAC;IACpB,YAAY,GAAG,EAAE,CAAC;IAEzB,kEAAkE;IACjD,eAAe,GAAG;QAC/B,IAAI,EAAE,sBAAsB;QAC5B,KAAK,EAAE,sBAAsB;KAChC,CAAC;IAEF,KAAK,CAAC,WAAW,CAAC,OAAsB;QACpC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACzB,CAAC;IACL,CAAC;IAED;;OAEG;IAEI,WAAW;QACd,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrD,IAAI,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,OAAO;QACjB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,eAAe,CAAiB,cAAc,CAAC,CAAC;YAC1E,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAM,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;gBAClB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC;gBAC3B,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;gBAC7C,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,SAAS,CAAC;gBAEnC,oCAAoC;gBACpC,MAAM,OAAO,CAAC,GAAG,CAAC;oBACd,IAAI,CAAC,UAAU,EAAE;oBACjB,IAAI,CAAC,aAAa,EAAE;iBACvB,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC/C,IAAI,CAAC,YAAY,GAAG,gCAAgC,CAAC;QACzD,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAC3B,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU;QACpB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC;YAExC,0DAA0D;YAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;YAC9B,MAAM,oBAAoB,GAAG,MAAM,EAAE,CAAC,OAAO,CAAsB;gBAC/D,UAAU,EAAE,oBAAoB;gBAChC,WAAW,EAAE,aAAa,IAAI,CAAC,KAAK,GAAG;gBACvC,UAAU,EAAE,eAAe;aAC9B,CAAC,CAAC;YAEH,IAAI,oBAAoB,CAAC,OAAO,EAAE,CAAC;gBAC/B,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC5B,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CACrD,CAAC;gBAEF,4CAA4C;gBAC5C,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA2C,CAAC;gBAC7E,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;oBAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;wBAClB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;wBAC9C,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE;4BAClC,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI;4BAChD,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK;yBACtD,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC;gBAED,MAAM,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAC;gBAEnD,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;oBAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC;oBAC3C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC7B,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;oBAClC,CAAC;oBACD,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAClD,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC;wBAC5B,KAAK;wBACL,QAAQ,EAAE,UAAU;wBACpB,kBAAkB,EAAE,UAAU;qBACjC,CAAC,CAAC;gBACP,CAAC;gBAED,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;oBAC5E,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC;oBACnE,OAAO;wBACH,IAAI;wBACJ,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACvE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;wBACtC,WAAW,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;qBAClE,CAAC;gBACN,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACpD,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QACjC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa;QACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAyB;gBACpD,UAAU,EAAE,wBAAwB;gBACpC,WAAW,EAAE,aAAa,IAAI,CAAC,KAAK,GAAG;gBACvC,OAAO,EAAE,qBAAqB;gBAC9B,OAAO,EAAE,GAAG;gBACZ,UAAU,EAAE,eAAe;aAC9B,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACxC,SAAS,EAAE,GAAG,CAAC,cAAc;oBAC7B,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,UAAU;oBACpC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,KAAK;oBAC3B,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,GAAG;oBACjC,YAAY,EAAE,GAAG,CAAC,cAAc,IAAI,CAAC;oBACrC,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,SAAS;iBACxC,CAAC,CAAC,CAAC;YACR,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC/B,CAAC;IACL,CAAC;IAED;;OAEG;IACK,UAAU;QACd,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,UAAU;QACb,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,cAAc;YACd,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAO,CAAC,KAAK,CAAC;YACpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,MAAO,CAAC,WAAW,IAAI,EAAE,CAAC;YACtD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAO,CAAC,SAAS,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;IACrC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,WAAW;QACpB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAEvB,IAAI,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;YAC9D,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,MAAM,EAAE,CAAC;gBACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,IAAI,CAAC,cAAc,GAAG,8BAA8B,CAAC;gBACrD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC/B,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,YAAY,GAAG,wBAAwB,CAAC;YACjD,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC,YAAY,GAAG,gCAAgC,CAAC;QACzD,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC1B,CAAC;IACL,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,gBAAgB;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAEvB,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAElE,gCAAgC;YAChC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,kBAAkB,CAAC,CAAC;YAE5E,4BAA4B;YAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,eAAe,CAAsB,oBAAoB,CAAC,CAAC;gBAC1F,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACrB,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACtB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YACnC,CAAC;YAED,2BAA2B;YAC3B,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC1B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAsB;oBACjD,UAAU,EAAE,oBAAoB;oBAChC,WAAW,EAAE,aAAa,IAAI,CAAC,MAAM,CAAC,EAAE,kBAAkB,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG;oBAC1E,UAAU,EAAE,eAAe;iBAC9B,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9C,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;gBACrC,CAAC;gBACD,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;YACpC,CAAC;YAED,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,IAAI,CAAC,cAAc,GAAG,kCAAkC,CAAC;YACzD,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,IAAI,CAAC,YAAY,GAAG,8BAA8B,CAAC;QACvD,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC1B,CAAC;IACL,CAAC;IAED;;OAEG;IACI,aAAa;QAChB,6CAA6C;QAC7C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1C,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAChG,CAAC;QAED,wBAAwB;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAC;IACpF,CAAC;IAED;;OAEG;IACI,cAAc,CAAC,QAAuB;QACzC,QAAQ,CAAC,QAAQ,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC3C,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,QAAuB;QAC5C,kDAAkD;QAClD,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC;QACvC,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC;QAEhC,kCAAkC;QAClC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7B,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACI,WAAW;QACd,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACI,YAAY;QACf,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,aAAa;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,iBAAiB,KAAK,QAAQ;YAAE,OAAO;QAEhE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAEvB,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAA+B,CAAC;YAC1D,MAAM,gBAAgB,GAAG,IAAI,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YAE/D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAEnE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,2CAA2C;gBAC3C,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC/B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;gBAC/B,IAAI,CAAC,cAAc,GAAG,0BAA0B,CAAC;gBACjD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,KAAK,IAAI,sBAAsB,CAAC;YAC/D,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC5C,IAAI,CAAC,YAAY,GAAG,kCAAkC,CAAC;QAC3D,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC5B,CAAC;IACL,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,IAAiB;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO,OAAO,CAAC;QAC1B,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;YAC9C,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,MAAM;YACb,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;SACpB,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,kBAAkB,CAAC,IAAU;QAChC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC;QAEzC,IAAI,OAAO,GAAG,CAAC;YAAE,OAAO,UAAU,CAAC;QACnC,IAAI,OAAO,GAAG,EAAE;YAAE,OAAO,GAAG,OAAO,OAAO,CAAC;QAC3C,IAAI,KAAK,GAAG,EAAE;YAAE,OAAO,GAAG,KAAK,OAAO,CAAC;QACvC,IAAI,IAAI,GAAG,CAAC;YAAE,OAAO,GAAG,IAAI,OAAO,CAAC;QAEpC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAC/C,CAAC;IAED;;OAEG;IACI,cAAc,CAAC,UAAkB;QACpC,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG;YAAE,OAAO,gBAAgB,CAAC;QACnE,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG;YAAE,OAAO,gBAAgB,CAAC;QACnE,IAAI,UAAU,IAAI,GAAG;YAAE,OAAO,cAAc,CAAC;QAC7C,OAAO,EAAE,CAAC;IACd,CAAC;IAED;;OAEG;IACI,qBAAqB;QACxB,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAC5C,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACI,gBAAgB,CAAC,QAAuB;QAC3C,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;IAC1D,CAAC;IAED;;OAEG;IACI,UAAU;QACb,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;QAC5B,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzC,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;OAEG;IACI,KAAK;QACR,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;kHA5cQ,wBAAwB;6DAAxB,wBAAwB;YAAxB,+GAAA,iBAAa,0BAAW;;YCxCrC,0FAAe;YAQX,AADF,AAFF,8BAAmD,aAEpB,aACC;YAC1B,uBAA+B;YAC/B,4BAAM;YAAA,+BAAe;YAAA,iBAAO;YAC5B,+BACiD;YAC/C,YACF;YACF,AADE,iBAAO,EACH;YACN,iCAAqE;YAAtC,qGAAS,WAAO,IAAC;YAC9C,wBAAiC;YAErC,AADE,iBAAS,EACL;YAEN,mGAAiB;YAIjB,oFAA4B;YAwV9B,iBAAM;;YAjXN,sCAEC;YAG2B,cAAsB;YAAtB,mCAAsB;YAMnB,eAA4C;YACnE,AADuB,sFAA4C,0EACrB;YAC9C,cACF;YADE,8EACF;YAOJ,eAEC;YAFD,yCAEC;YAED,cAuVC;YAvVD,wDAuVC;;;iFDxUU,wBAAwB;cANpC,SAAS;6BACI,KAAK,YACL,uBAAuB;;kBAKhC,KAAK;;kBACL,KAAK;;kBACL,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBAmDN,YAAY;mBAAC,yBAAyB;;kFAzD9B,wBAAwB","sourcesContent":["import { Component, EventEmitter, HostListener, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJAPIKeyEntity, MJAPIScopeEntity, MJAPIKeyScopeEntity, MJAPIKeyUsageLogEntity } from '@memberjunction/core-entities';\nimport { GraphQLDataProvider, GraphQLEncryptionClient } from '@memberjunction/graphql-dataprovider';\nimport { APIKeysEngineBase, parseAPIScopeUIConfig } from '@memberjunction/api-keys-base';\n/** Scope with selection state */\ninterface ScopeItem {\n scope: MJAPIScopeEntity;\n selected: boolean;\n originallySelected: boolean;\n}\n\n/** Grouped scopes by category */\ninterface ScopeCategory {\n name: string;\n icon: string;\n color: string;\n scopes: ScopeItem[];\n expanded: boolean;\n allSelected: boolean;\n}\n\n/** Usage log display item */\ninterface UsageLogItem {\n timestamp: Date;\n endpoint: string;\n method: string;\n statusCode: number;\n responseTime: number;\n ipAddress: string;\n}\n\n/**\n * Panel for viewing and editing existing API keys\n */\n@Component({\n standalone: false,\n selector: 'mj-api-key-edit-panel',\n templateUrl: './api-key-edit-panel.component.html',\n styleUrls: ['./api-key-edit-panel.component.css']\n})\nexport class APIKeyEditPanelComponent implements OnChanges {\n @Input() Visible = false;\n @Input() KeyId: string | null = null;\n @Output() VisibleChange = new EventEmitter<boolean>();\n @Output() Updated = new EventEmitter<MJAPIKeyEntity>();\n @Output() Revoked = new EventEmitter<MJAPIKeyEntity>();\n @Output() Closed = new EventEmitter<void>();\n\n private md = new Metadata();\n\n // Current key\n public APIKey: MJAPIKeyEntity | null = null;\n public IsLoading = true;\n public IsSaving = false;\n public IsRevoking = false;\n\n // Edit mode\n public IsEditing = false;\n public EditLabel = '';\n public EditDescription = '';\n public EditExpiresAt: Date | null = null;\n\n // Scopes\n public ScopeCategories: ScopeCategory[] = [];\n public IsLoadingScopes = true;\n public HasScopeChanges = false;\n\n // Usage logs\n public UsageLogs: UsageLogItem[] = [];\n public IsLoadingLogs = true;\n\n // Tabs\n public ActiveTab: 'details' | 'scopes' | 'usage' = 'details';\n\n // Revoke confirmation\n public ShowRevokeConfirm = false;\n public RevokeConfirmText = '';\n\n // Messages\n public SuccessMessage = '';\n public ErrorMessage = '';\n\n // Default UI config for categories without explicit configuration\n private readonly defaultUIConfig = {\n icon: 'fa-solid fa-ellipsis',\n color: 'var(--mj-text-muted)'\n };\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (changes['KeyId'] && this.KeyId) {\n await this.loadKey();\n }\n }\n\n /**\n * Handle escape key to close panel\n */\n @HostListener('document:keydown.escape')\n public onEscapeKey(): void {\n if (this.Visible && !this.IsSaving && !this.IsRevoking) {\n this.close();\n }\n }\n\n /**\n * Load the API key and related data\n */\n private async loadKey(): Promise<void> {\n this.IsLoading = true;\n this.resetState();\n\n try {\n const key = await this.md.GetEntityObject<MJAPIKeyEntity>('MJ: API Keys');\n if (await key.Load(this.KeyId!)) {\n this.APIKey = key;\n this.EditLabel = key.Label;\n this.EditDescription = key.Description || '';\n this.EditExpiresAt = key.ExpiresAt;\n\n // Load scopes and usage in parallel\n await Promise.all([\n this.loadScopes(),\n this.loadUsageLogs()\n ]);\n }\n } catch (error) {\n console.error('Error loading API key:', error);\n this.ErrorMessage = 'Failed to load API key details';\n } finally {\n this.IsLoading = false;\n }\n }\n\n /**\n * Load all scopes and mark assigned ones\n */\n private async loadScopes(): Promise<void> {\n this.IsLoadingScopes = true;\n try {\n const rv = new RunView();\n const base = APIKeysEngineBase.Instance;\n\n // Get all scopes from cache, load assigned scopes from DB\n const allScopes = base.Scopes;\n const assignedScopesResult = await rv.RunView<MJAPIKeyScopeEntity>({\n EntityName: 'MJ: API Key Scopes',\n ExtraFilter: `APIKeyID='${this.KeyId}'`,\n ResultType: 'entity_object'\n });\n\n if (assignedScopesResult.Success) {\n const assignedScopeIds = new Set(\n assignedScopesResult.Results.map(ks => ks.ScopeID)\n );\n\n // Build category UI config from root scopes\n const categoryUIConfigs = new Map<string, { icon: string; color: string }>();\n for (const scope of allScopes) {\n if (!scope.ParentID) {\n const uiConfig = parseAPIScopeUIConfig(scope);\n categoryUIConfigs.set(scope.Category, {\n icon: uiConfig.icon || this.defaultUIConfig.icon,\n color: uiConfig.color || this.defaultUIConfig.color\n });\n }\n }\n\n const categoryMap = new Map<string, ScopeItem[]>();\n\n for (const scope of allScopes) {\n const category = scope.Category || 'Other';\n if (!categoryMap.has(category)) {\n categoryMap.set(category, []);\n }\n const isSelected = assignedScopeIds.has(scope.ID);\n categoryMap.get(category)!.push({\n scope,\n selected: isSelected,\n originallySelected: isSelected\n });\n }\n\n this.ScopeCategories = Array.from(categoryMap.entries()).map(([name, scopes]) => {\n const config = categoryUIConfigs.get(name) || this.defaultUIConfig;\n return {\n name,\n icon: config.icon,\n color: config.color,\n scopes: scopes.sort((a, b) => a.scope.Name.localeCompare(b.scope.Name)),\n expanded: scopes.some(s => s.selected),\n allSelected: scopes.length > 0 && scopes.every(s => s.selected)\n };\n }).sort((a, b) => a.name.localeCompare(b.name));\n }\n } catch (error) {\n console.error('Error loading scopes:', error);\n } finally {\n this.IsLoadingScopes = false;\n }\n }\n\n /**\n * Load usage logs for this key\n */\n private async loadUsageLogs(): Promise<void> {\n this.IsLoadingLogs = true;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJAPIKeyUsageLogEntity>({\n EntityName: 'MJ: API Key Usage Logs',\n ExtraFilter: `APIKeyID='${this.KeyId}'`,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.UsageLogs = result.Results.map(log => ({\n timestamp: log.__mj_CreatedAt,\n endpoint: log.Endpoint || '/unknown',\n method: log.Method || 'GET',\n statusCode: log.StatusCode || 200,\n responseTime: log.ResponseTimeMs || 0,\n ipAddress: log.IPAddress || 'Unknown'\n }));\n }\n } catch (error) {\n console.error('Error loading usage logs:', error);\n } finally {\n this.IsLoadingLogs = false;\n }\n }\n\n /**\n * Reset component state\n */\n private resetState(): void {\n this.IsEditing = false;\n this.ShowRevokeConfirm = false;\n this.RevokeConfirmText = '';\n this.SuccessMessage = '';\n this.ErrorMessage = '';\n this.HasScopeChanges = false;\n this.ActiveTab = 'details';\n }\n\n /**\n * Toggle edit mode\n */\n public toggleEdit(): void {\n if (this.IsEditing) {\n // Cancel edit\n this.EditLabel = this.APIKey!.Label;\n this.EditDescription = this.APIKey!.Description || '';\n this.EditExpiresAt = this.APIKey!.ExpiresAt;\n }\n this.IsEditing = !this.IsEditing;\n }\n\n /**\n * Save changes to the key\n */\n public async saveChanges(): Promise<void> {\n if (!this.APIKey) return;\n\n this.IsSaving = true;\n this.ErrorMessage = '';\n\n try {\n this.APIKey.Label = this.EditLabel.trim();\n this.APIKey.Description = this.EditDescription.trim() || null;\n this.APIKey.ExpiresAt = this.EditExpiresAt;\n\n const result = await this.APIKey.Save();\n if (result) {\n this.IsEditing = false;\n this.SuccessMessage = 'API key updated successfully';\n this.Updated.emit(this.APIKey);\n setTimeout(() => this.SuccessMessage = '', 3000);\n } else {\n this.ErrorMessage = 'Failed to save changes';\n }\n } catch (error) {\n console.error('Error saving key:', error);\n this.ErrorMessage = 'An error occurred while saving';\n } finally {\n this.IsSaving = false;\n }\n }\n\n /**\n * Save scope changes\n */\n public async saveScopeChanges(): Promise<void> {\n if (!this.APIKey) return;\n\n this.IsSaving = true;\n this.ErrorMessage = '';\n\n try {\n const allScopes = this.ScopeCategories.flatMap(cat => cat.scopes);\n\n // Find scopes to add and remove\n const toAdd = allScopes.filter(s => s.selected && !s.originallySelected);\n const toRemove = allScopes.filter(s => !s.selected && s.originallySelected);\n\n // Add new scope assignments\n for (const item of toAdd) {\n const keyScope = await this.md.GetEntityObject<MJAPIKeyScopeEntity>('MJ: API Key Scopes');\n keyScope.NewRecord();\n keyScope.APIKeyID = this.APIKey.ID;\n keyScope.ScopeID = item.scope.ID;\n await keyScope.Save();\n item.originallySelected = true;\n }\n\n // Remove scope assignments\n const rv = new RunView();\n for (const item of toRemove) {\n const result = await rv.RunView<MJAPIKeyScopeEntity>({\n EntityName: 'MJ: API Key Scopes',\n ExtraFilter: `APIKeyID='${this.APIKey.ID}' AND ScopeID='${item.scope.ID}'`,\n ResultType: 'entity_object'\n });\n if (result.Success && result.Results.length > 0) {\n await result.Results[0].Delete();\n }\n item.originallySelected = false;\n }\n\n this.HasScopeChanges = false;\n this.SuccessMessage = 'Permissions updated successfully';\n setTimeout(() => this.SuccessMessage = '', 3000);\n } catch (error) {\n console.error('Error saving scopes:', error);\n this.ErrorMessage = 'Failed to update permissions';\n } finally {\n this.IsSaving = false;\n }\n }\n\n /**\n * Check for scope changes and update category allSelected states\n */\n public onScopeChange(): void {\n // Update allSelected state for each category\n for (const category of this.ScopeCategories) {\n category.allSelected = category.scopes.length > 0 && category.scopes.every(s => s.selected);\n }\n\n // Track overall changes\n const allScopes = this.ScopeCategories.flatMap(cat => cat.scopes);\n this.HasScopeChanges = allScopes.some(s => s.selected !== s.originallySelected);\n }\n\n /**\n * Toggle category expansion\n */\n public toggleCategory(category: ScopeCategory): void {\n category.expanded = !category.expanded;\n }\n\n /**\n * Toggle all scopes in a category on/off\n */\n public toggleCategoryAll(category: ScopeCategory): void {\n // Toggle to opposite of current allSelected state\n const newState = !category.allSelected;\n category.allSelected = newState;\n\n // Apply to all scopes in category\n for (const item of category.scopes) {\n item.selected = newState;\n }\n\n // Update change tracking\n this.onScopeChange();\n }\n\n /**\n * Start revoke flow\n */\n public startRevoke(): void {\n this.ShowRevokeConfirm = true;\n this.RevokeConfirmText = '';\n }\n\n /**\n * Cancel revoke\n */\n public cancelRevoke(): void {\n this.ShowRevokeConfirm = false;\n this.RevokeConfirmText = '';\n }\n\n /**\n * Confirm and execute revoke using GraphQL client\n */\n public async confirmRevoke(): Promise<void> {\n if (!this.APIKey || this.RevokeConfirmText !== 'REVOKE') return;\n\n this.IsRevoking = true;\n this.ErrorMessage = '';\n\n try {\n const provider = Metadata.Provider as GraphQLDataProvider;\n const encryptionClient = new GraphQLEncryptionClient(provider);\n\n const result = await encryptionClient.RevokeAPIKey(this.APIKey.ID);\n\n if (result.Success) {\n // Update local state to reflect the change\n this.APIKey.Status = 'Revoked';\n this.ShowRevokeConfirm = false;\n this.SuccessMessage = 'API key has been revoked';\n this.Revoked.emit(this.APIKey);\n } else {\n this.ErrorMessage = result.Error || 'Failed to revoke key';\n }\n } catch (error) {\n console.error('Error revoking key:', error);\n this.ErrorMessage = 'An error occurred while revoking';\n } finally {\n this.IsRevoking = false;\n }\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date | null): string {\n if (!date) return 'Never';\n return new Date(date).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit'\n });\n }\n\n /**\n * Format relative time\n */\n public formatRelativeTime(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - new Date(date).getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return 'Just now';\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n if (days < 7) return `${days}d ago`;\n\n return new Date(date).toLocaleDateString();\n }\n\n /**\n * Get status class for HTTP status code\n */\n public getStatusClass(statusCode: number): string {\n if (statusCode >= 200 && statusCode < 300) return 'status-success';\n if (statusCode >= 400 && statusCode < 500) return 'status-warning';\n if (statusCode >= 500) return 'status-error';\n return '';\n }\n\n /**\n * Get assigned scope count\n */\n public getAssignedScopeCount(): number {\n return this.ScopeCategories.reduce((sum, cat) =>\n sum + cat.scopes.filter(s => s.selected).length, 0);\n }\n\n /**\n * Get selected scope count for a category (for template use)\n */\n public getSelectedCount(category: ScopeCategory): number {\n return category.scopes.filter(s => s.selected).length;\n }\n\n /**\n * Get minimum date for expiration (tomorrow)\n */\n public getMinDate(): Date {\n const tomorrow = new Date();\n tomorrow.setDate(tomorrow.getDate() + 1);\n return tomorrow;\n }\n\n /**\n * Close the panel\n */\n public close(): void {\n this.Visible = false;\n this.VisibleChange.emit(false);\n this.Closed.emit();\n }\n}\n","<!-- Slide-out Backdrop -->\n@if (Visible) {\n <div class=\"slideout-backdrop\" (click)=\"close()\"></div>\n}\n\n<!-- Slide-out Panel -->\n<div class=\"slideout-panel\" [class.open]=\"Visible\">\n <!-- Header -->\n <div class=\"slideout-header\">\n <div class=\"slideout-title\">\n <i class=\"fa-solid fa-key\"></i>\n <span>API Key Details</span>\n <span class=\"key-status\" [class.active]=\"APIKey?.Status === 'Active'\"\n [class.revoked]=\"APIKey?.Status === 'Revoked'\">\n {{APIKey?.Status}}\n </span>\n </div>\n <button class=\"slideout-close\" (click)=\"close()\" title=\"Close (Esc)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n @if (IsLoading) {\n <mj-loading text=\"Loading key details...\"></mj-loading>\n }\n\n @if (!IsLoading && APIKey) {\n <!-- Success/Error Messages -->\n @if (SuccessMessage) {\n <div class=\"message success\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{SuccessMessage}}\n </div>\n }\n @if (ErrorMessage) {\n <div class=\"message error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ErrorMessage}}\n </div>\n }\n <!-- Tabs -->\n <div class=\"slideout-tabs\">\n <button class=\"slideout-tab\" [class.active]=\"ActiveTab === 'details'\"\n (click)=\"ActiveTab = 'details'\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Details\n </button>\n <button class=\"slideout-tab\" [class.active]=\"ActiveTab === 'scopes'\"\n (click)=\"ActiveTab = 'scopes'\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n Permissions\n @if (HasScopeChanges) {\n <span class=\"tab-badge unsaved\">!</span>\n }\n </button>\n <button class=\"slideout-tab\" [class.active]=\"ActiveTab === 'usage'\"\n (click)=\"ActiveTab = 'usage'\">\n <i class=\"fa-solid fa-chart-line\"></i>\n Usage\n </button>\n </div>\n <div class=\"slideout-content\">\n <!-- Details Tab -->\n @if (ActiveTab === 'details') {\n <div class=\"tab-panel\">\n <div class=\"key-info-card\">\n <div class=\"info-header\">\n <div class=\"info-row\">\n <span class=\"info-label\">Key Hash</span>\n <code class=\"hash-value\">{{APIKey.Hash}}</code>\n </div>\n </div>\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <span class=\"info-label\">Created</span>\n <span class=\"info-value\">{{formatDate(APIKey.__mj_CreatedAt)}}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Created By</span>\n <span class=\"info-value\">{{APIKey.CreatedByUser}}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Owner</span>\n <span class=\"info-value\">{{APIKey.User}}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Last Used</span>\n <span class=\"info-value\" [class.never-used]=\"!APIKey.LastUsedAt\">\n {{APIKey.LastUsedAt ? formatDate(APIKey.LastUsedAt) : 'Never'}}\n </span>\n </div>\n </div>\n </div>\n <!-- Editable Fields -->\n <div class=\"edit-section\">\n <div class=\"section-header\">\n <h4>Key Configuration</h4>\n @if (APIKey.Status === 'Active') {\n <button class=\"edit-toggle\"\n (click)=\"toggleEdit()\">\n <i class=\"fa-solid\" [class.fa-pencil]=\"!IsEditing\" [class.fa-times]=\"IsEditing\"></i>\n {{IsEditing ? 'Cancel' : 'Edit'}}\n </button>\n }\n </div>\n <div class=\"form-field\">\n <label>Label</label>\n <input class=\"mj-input form-input\" [(ngModel)]=\"EditLabel\"\n [disabled]=\"!IsEditing\" />\n </div>\n <div class=\"form-field\">\n <label>Description</label>\n <textarea class=\"mj-textarea form-textarea\" [(ngModel)]=\"EditDescription\"\n [disabled]=\"!IsEditing\"\n [rows]=\"3\"></textarea>\n </div>\n <div class=\"form-field\">\n <label>Expiration</label>\n <div class=\"expiration-field\">\n <mj-datepicker [(ngModel)]=\"EditExpiresAt\"\n [Disabled]=\"!IsEditing\"\n [Min]=\"getMinDate()\"\n Format=\"MMM d, yyyy\"\n Placeholder=\"Never expires\">\n </mj-datepicker>\n @if (IsEditing && EditExpiresAt) {\n <button class=\"clear-btn\"\n (click)=\"EditExpiresAt = null\">\n <i class=\"fa-solid fa-times\"></i>\n Never expires\n </button>\n }\n </div>\n </div>\n @if (IsEditing) {\n <div class=\"edit-actions\">\n <button mjButton variant=\"primary\"\n [disabled]=\"IsSaving\"\n (click)=\"saveChanges()\">\n @if (IsSaving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n }\n @if (!IsSaving) {\n <span>\n <i class=\"fa-solid fa-save\"></i>\n Save Changes\n </span>\n }\n </button>\n </div>\n }\n </div>\n <!-- Revoke Section -->\n @if (APIKey.Status === 'Active') {\n <div class=\"danger-zone\">\n <h4>Danger Zone</h4>\n @if (!ShowRevokeConfirm) {\n <div class=\"revoke-section\">\n <div class=\"revoke-info\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <div>\n <strong>Revoke this API key</strong>\n <p>Once revoked, this key will immediately stop working. This action cannot be undone.</p>\n </div>\n </div>\n <button class=\"revoke-btn\" (click)=\"startRevoke()\">\n <i class=\"fa-solid fa-ban\"></i>\n Revoke Key\n </button>\n </div>\n }\n @if (ShowRevokeConfirm) {\n <div class=\"revoke-confirm\">\n <div class=\"confirm-warning\">\n <i class=\"fa-solid fa-skull-crossbones\"></i>\n <div>\n <strong>Are you absolutely sure?</strong>\n <p>This will permanently revoke the API key. Any applications using this key will immediately lose access.</p>\n </div>\n </div>\n <div class=\"confirm-input\">\n <label>Type <code>REVOKE</code> to confirm:</label>\n <input class=\"mj-input\" [(ngModel)]=\"RevokeConfirmText\"\n placeholder=\"REVOKE\" />\n </div>\n <div class=\"confirm-actions\">\n <button mjButton (click)=\"cancelRevoke()\">Cancel</button>\n <button class=\"confirm-revoke-btn\"\n [disabled]=\"RevokeConfirmText !== 'REVOKE' || IsRevoking\"\n (click)=\"confirmRevoke()\">\n @if (IsRevoking) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n }\n @if (!IsRevoking) {\n <span>\n <i class=\"fa-solid fa-ban\"></i>\n Revoke Key\n </span>\n }\n </button>\n </div>\n </div>\n }\n </div>\n }\n <!-- Revoked Notice -->\n @if (APIKey.Status === 'Revoked') {\n <div class=\"revoked-notice\">\n <i class=\"fa-solid fa-ban\"></i>\n <div>\n <strong>This API key has been revoked</strong>\n <p>It can no longer be used for authentication. Consider deleting this record if no longer needed.</p>\n </div>\n </div>\n }\n </div>\n }\n <!-- Scopes Tab -->\n @if (ActiveTab === 'scopes') {\n <div class=\"tab-panel scopes-panel\">\n <div class=\"scopes-header\">\n <div class=\"scopes-info\">\n <span class=\"scope-count\">{{getAssignedScopeCount()}} permissions assigned</span>\n </div>\n @if (HasScopeChanges && APIKey.Status === 'Active') {\n <button mjButton variant=\"primary\"\n [disabled]=\"IsSaving\"\n (click)=\"saveScopeChanges()\">\n @if (IsSaving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n }\n @if (!IsSaving) {\n <span>\n <i class=\"fa-solid fa-save\"></i>\n Save Changes\n </span>\n }\n </button>\n }\n </div>\n <!-- No Scopes Warning -->\n @if (!IsLoadingScopes && getAssignedScopeCount() === 0 && APIKey.Status === 'Active') {\n <div class=\"no-scopes-warning\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <div>\n <strong>Warning: No permissions assigned</strong>\n <p>This API key has no assigned scopes and cannot perform any operations. All API requests using this key will be rejected until scopes are assigned.</p>\n </div>\n </div>\n }\n @if (IsLoadingScopes) {\n <mj-loading text=\"Loading permissions...\"></mj-loading>\n }\n @if (!IsLoadingScopes) {\n <div class=\"scope-categories\">\n @for (category of ScopeCategories; track category) {\n <div class=\"scope-category\">\n <div class=\"category-header\" (click)=\"toggleCategory(category)\">\n <div class=\"category-left\">\n <i [class]=\"category.icon\" [style.color]=\"category.color\"></i>\n <span class=\"category-name\">{{category.name}}</span>\n <span class=\"category-count\">\n {{getSelectedCount(category)}}/{{category.scopes.length}}\n </span>\n </div>\n <div class=\"category-right\">\n @if (APIKey.Status === 'Active') {\n <label class=\"category-all-toggle\"\n (click)=\"$event.stopPropagation()\"\n >\n <input type=\"checkbox\" class=\"mj-checkbox\"\n [checked]=\"category.allSelected\"\n (change)=\"toggleCategoryAll(category)\" />\n <span>All</span>\n </label>\n }\n <i class=\"fa-solid expand-icon\" [class.fa-chevron-down]=\"!category.expanded\"\n [class.fa-chevron-up]=\"category.expanded\"></i>\n </div>\n </div>\n @if (category.expanded) {\n <div class=\"category-scopes\">\n @for (item of category.scopes; track item) {\n <div class=\"scope-item\">\n <label class=\"scope-label\">\n <input type=\"checkbox\" class=\"mj-checkbox\"\n [(ngModel)]=\"item.selected\"\n [disabled]=\"APIKey.Status === 'Revoked'\"\n (change)=\"onScopeChange()\" />\n <div class=\"scope-info\">\n <span class=\"scope-name\">{{item.scope.Name}}</span>\n @if (item.scope.Description) {\n <span class=\"scope-desc\">\n {{item.scope.Description}}\n </span>\n }\n </div>\n </label>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n <!-- Usage Tab -->\n @if (ActiveTab === 'usage') {\n <div class=\"tab-panel usage-panel\">\n @if (IsLoadingLogs) {\n <mj-loading text=\"Loading usage logs...\"></mj-loading>\n }\n @if (!IsLoadingLogs) {\n <div class=\"usage-content\">\n <div class=\"usage-stats\">\n <div class=\"stat-card\">\n <i class=\"fa-solid fa-chart-line\"></i>\n <div class=\"stat-value\">{{UsageLogs.length}}</div>\n <div class=\"stat-label\">Total Requests</div>\n </div>\n <div class=\"stat-card\">\n <i class=\"fa-solid fa-clock\"></i>\n <div class=\"stat-value\">\n {{UsageLogs.length > 0 ? formatRelativeTime(UsageLogs[0].timestamp) : 'Never'}}\n </div>\n <div class=\"stat-label\">Last Used</div>\n </div>\n </div>\n @if (UsageLogs.length > 0) {\n <div class=\"usage-logs\">\n <div class=\"log-header\">\n <span class=\"col-time\">Time</span>\n <span class=\"col-endpoint\">Endpoint</span>\n <span class=\"col-status\">Status</span>\n <span class=\"col-duration\">Duration</span>\n </div>\n @for (log of UsageLogs; track log) {\n <div class=\"log-item\">\n <span class=\"col-time\">{{formatRelativeTime(log.timestamp)}}</span>\n <span class=\"col-endpoint\">\n <span class=\"method-badge\">{{log.method}}</span>\n {{log.endpoint}}\n </span>\n <span class=\"col-status\" [ngClass]=\"getStatusClass(log.statusCode)\">\n {{log.statusCode}}\n </span>\n <span class=\"col-duration\">{{log.responseTime}}ms</span>\n </div>\n }\n </div>\n }\n @if (UsageLogs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-chart-area\"></i>\n <span>No usage logs yet</span>\n <p>Usage will be recorded when this API key is used for authentication</p>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n <!-- Footer -->\n <div class=\"slideout-footer\">\n <button mjButton (click)=\"close()\">Close</button>\n </div>\n }\n</div>\n"]}
1
+ {"version":3,"file":"api-key-edit-panel.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-key-edit-panel.component.ts","../../src/APIKeys/api-key-edit-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, HostListener, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJAPIKeyEntity, MJAPIScopeEntity, MJAPIKeyScopeEntity, MJAPIKeyUsageLogEntity } from '@memberjunction/core-entities';\nimport { GraphQLDataProvider, GraphQLEncryptionClient } from '@memberjunction/graphql-dataprovider';\nimport { APIKeysEngineBase, parseAPIScopeUIConfig } from '@memberjunction/api-keys-base';\n/** Scope with selection state */\ninterface ScopeItem {\n scope: MJAPIScopeEntity;\n selected: boolean;\n originallySelected: boolean;\n}\n\n/** Grouped scopes by category */\ninterface ScopeCategory {\n name: string;\n icon: string;\n color: string;\n scopes: ScopeItem[];\n expanded: boolean;\n allSelected: boolean;\n}\n\n/** Usage log display item */\ninterface UsageLogItem {\n timestamp: Date;\n endpoint: string;\n method: string;\n statusCode: number;\n responseTime: number;\n ipAddress: string;\n}\n\n/**\n * Panel for viewing and editing existing API keys\n */\n@Component({\n standalone: false,\n selector: 'mj-api-key-edit-panel',\n templateUrl: './api-key-edit-panel.component.html',\n styleUrls: ['./api-key-edit-panel.component.css']\n})\nexport class APIKeyEditPanelComponent implements OnChanges {\n @Input() Visible = false;\n @Input() KeyId: string | null = null;\n @Output() VisibleChange = new EventEmitter<boolean>();\n @Output() Updated = new EventEmitter<MJAPIKeyEntity>();\n @Output() Revoked = new EventEmitter<MJAPIKeyEntity>();\n @Output() Closed = new EventEmitter<void>();\n\n private md = new Metadata();\n\n // Current key\n public APIKey: MJAPIKeyEntity | null = null;\n public IsLoading = true;\n public IsSaving = false;\n public IsRevoking = false;\n\n // Edit mode\n public IsEditing = false;\n public EditLabel = '';\n public EditDescription = '';\n public EditExpiresAt: Date | null = null;\n\n // Scopes\n public ScopeCategories: ScopeCategory[] = [];\n public IsLoadingScopes = true;\n public HasScopeChanges = false;\n\n // Usage logs\n public UsageLogs: UsageLogItem[] = [];\n public IsLoadingLogs = true;\n\n // Tabs\n public ActiveTab: 'details' | 'scopes' | 'usage' = 'details';\n\n // Revoke confirmation\n public ShowRevokeConfirm = false;\n public RevokeConfirmText = '';\n\n // Messages\n public SuccessMessage = '';\n public ErrorMessage = '';\n\n // Default UI config for categories without explicit configuration\n private readonly defaultUIConfig = {\n icon: 'fa-solid fa-ellipsis',\n color: 'var(--mj-text-muted)'\n };\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (changes['KeyId'] && this.KeyId) {\n await this.loadKey();\n }\n }\n\n /**\n * Handle escape key to close panel\n */\n @HostListener('document:keydown.escape')\n public onEscapeKey(): void {\n if (this.Visible && !this.IsSaving && !this.IsRevoking) {\n this.close();\n }\n }\n\n /**\n * Load the API key and related data\n */\n private async loadKey(): Promise<void> {\n this.IsLoading = true;\n this.resetState();\n\n try {\n const key = await this.md.GetEntityObject<MJAPIKeyEntity>('MJ: API Keys');\n if (await key.Load(this.KeyId!)) {\n this.APIKey = key;\n this.EditLabel = key.Label;\n this.EditDescription = key.Description || '';\n this.EditExpiresAt = key.ExpiresAt;\n\n // Load scopes and usage in parallel\n await Promise.all([\n this.loadScopes(),\n this.loadUsageLogs()\n ]);\n }\n } catch (error) {\n console.error('Error loading API key:', error);\n this.ErrorMessage = 'Failed to load API key details';\n } finally {\n this.IsLoading = false;\n }\n }\n\n /**\n * Load all scopes and mark assigned ones\n */\n private async loadScopes(): Promise<void> {\n this.IsLoadingScopes = true;\n try {\n const rv = new RunView();\n const base = APIKeysEngineBase.Instance;\n\n // Get all scopes from cache, load assigned scopes from DB\n const allScopes = base.Scopes;\n const assignedScopesResult = await rv.RunView<MJAPIKeyScopeEntity>({\n EntityName: 'MJ: API Key Scopes',\n ExtraFilter: `APIKeyID='${this.KeyId}'`,\n ResultType: 'entity_object'\n });\n\n if (assignedScopesResult.Success) {\n const assignedScopeIds = new Set(\n assignedScopesResult.Results.map(ks => ks.ScopeID)\n );\n\n // Build category UI config from root scopes\n const categoryUIConfigs = new Map<string, { icon: string; color: string }>();\n for (const scope of allScopes) {\n if (!scope.ParentID) {\n const uiConfig = parseAPIScopeUIConfig(scope);\n categoryUIConfigs.set(scope.Category, {\n icon: uiConfig.icon || this.defaultUIConfig.icon,\n color: uiConfig.color || this.defaultUIConfig.color\n });\n }\n }\n\n const categoryMap = new Map<string, ScopeItem[]>();\n\n for (const scope of allScopes) {\n const category = scope.Category || 'Other';\n if (!categoryMap.has(category)) {\n categoryMap.set(category, []);\n }\n const isSelected = assignedScopeIds.has(scope.ID);\n categoryMap.get(category)!.push({\n scope,\n selected: isSelected,\n originallySelected: isSelected\n });\n }\n\n this.ScopeCategories = Array.from(categoryMap.entries()).map(([name, scopes]) => {\n const config = categoryUIConfigs.get(name) || this.defaultUIConfig;\n return {\n name,\n icon: config.icon,\n color: config.color,\n scopes: scopes.sort((a, b) => a.scope.Name.localeCompare(b.scope.Name)),\n expanded: scopes.some(s => s.selected),\n allSelected: scopes.length > 0 && scopes.every(s => s.selected)\n };\n }).sort((a, b) => a.name.localeCompare(b.name));\n }\n } catch (error) {\n console.error('Error loading scopes:', error);\n } finally {\n this.IsLoadingScopes = false;\n }\n }\n\n /**\n * Load usage logs for this key\n */\n private async loadUsageLogs(): Promise<void> {\n this.IsLoadingLogs = true;\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJAPIKeyUsageLogEntity>({\n EntityName: 'MJ: API Key Usage Logs',\n ExtraFilter: `APIKeyID='${this.KeyId}'`,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.UsageLogs = result.Results.map(log => ({\n timestamp: log.__mj_CreatedAt,\n endpoint: log.Endpoint || '/unknown',\n method: log.Method || 'GET',\n statusCode: log.StatusCode || 200,\n responseTime: log.ResponseTimeMs || 0,\n ipAddress: log.IPAddress || 'Unknown'\n }));\n }\n } catch (error) {\n console.error('Error loading usage logs:', error);\n } finally {\n this.IsLoadingLogs = false;\n }\n }\n\n /**\n * Reset component state\n */\n private resetState(): void {\n this.IsEditing = false;\n this.ShowRevokeConfirm = false;\n this.RevokeConfirmText = '';\n this.SuccessMessage = '';\n this.ErrorMessage = '';\n this.HasScopeChanges = false;\n this.ActiveTab = 'details';\n }\n\n /**\n * Toggle edit mode\n */\n public toggleEdit(): void {\n if (this.IsEditing) {\n // Cancel edit\n this.EditLabel = this.APIKey!.Label;\n this.EditDescription = this.APIKey!.Description || '';\n this.EditExpiresAt = this.APIKey!.ExpiresAt;\n }\n this.IsEditing = !this.IsEditing;\n }\n\n /**\n * Save changes to the key\n */\n public async saveChanges(): Promise<void> {\n if (!this.APIKey) return;\n\n this.IsSaving = true;\n this.ErrorMessage = '';\n\n try {\n this.APIKey.Label = this.EditLabel.trim();\n this.APIKey.Description = this.EditDescription.trim() || null;\n this.APIKey.ExpiresAt = this.EditExpiresAt;\n\n const result = await this.APIKey.Save();\n if (result) {\n this.IsEditing = false;\n this.SuccessMessage = 'API key updated successfully';\n this.Updated.emit(this.APIKey);\n setTimeout(() => this.SuccessMessage = '', 3000);\n } else {\n this.ErrorMessage = 'Failed to save changes';\n }\n } catch (error) {\n console.error('Error saving key:', error);\n this.ErrorMessage = 'An error occurred while saving';\n } finally {\n this.IsSaving = false;\n }\n }\n\n /**\n * Save scope changes\n */\n public async saveScopeChanges(): Promise<void> {\n if (!this.APIKey) return;\n\n this.IsSaving = true;\n this.ErrorMessage = '';\n\n try {\n const allScopes = this.ScopeCategories.flatMap(cat => cat.scopes);\n\n // Find scopes to add and remove\n const toAdd = allScopes.filter(s => s.selected && !s.originallySelected);\n const toRemove = allScopes.filter(s => !s.selected && s.originallySelected);\n\n if (toAdd.length === 0 && toRemove.length === 0) {\n this.HasScopeChanges = false;\n return;\n }\n\n const tg = await this.md.CreateTransactionGroup();\n const rv = new RunView();\n\n for (const item of toAdd) {\n const keyScope = await this.md.GetEntityObject<MJAPIKeyScopeEntity>('MJ: API Key Scopes');\n keyScope.NewRecord();\n keyScope.APIKeyID = this.APIKey.ID;\n keyScope.ScopeID = item.scope.ID;\n keyScope.TransactionGroup = tg;\n await keyScope.Save();\n }\n\n for (const item of toRemove) {\n const result = await rv.RunView<MJAPIKeyScopeEntity>({\n EntityName: 'MJ: API Key Scopes',\n ExtraFilter: `APIKeyID='${this.APIKey.ID}' AND ScopeID='${item.scope.ID}'`,\n ResultType: 'entity_object'\n });\n if (result.Success && result.Results.length > 0) {\n result.Results[0].TransactionGroup = tg;\n await result.Results[0].Delete();\n }\n }\n\n if (!await tg.Submit()) {\n this.ErrorMessage = 'Failed to update permissions — all changes have been rolled back';\n return;\n }\n\n // Commit succeeded — update client-side state to match\n for (const item of toAdd) item.originallySelected = true;\n for (const item of toRemove) item.originallySelected = false;\n\n this.HasScopeChanges = false;\n this.SuccessMessage = 'Permissions updated successfully';\n setTimeout(() => this.SuccessMessage = '', 3000);\n } catch (error) {\n console.error('Error saving scopes:', error);\n this.ErrorMessage = 'Failed to update permissions';\n } finally {\n this.IsSaving = false;\n }\n }\n\n /**\n * Check for scope changes and update category allSelected states\n */\n public onScopeChange(): void {\n // Update allSelected state for each category\n for (const category of this.ScopeCategories) {\n category.allSelected = category.scopes.length > 0 && category.scopes.every(s => s.selected);\n }\n\n // Track overall changes\n const allScopes = this.ScopeCategories.flatMap(cat => cat.scopes);\n this.HasScopeChanges = allScopes.some(s => s.selected !== s.originallySelected);\n }\n\n /**\n * Toggle category expansion\n */\n public toggleCategory(category: ScopeCategory): void {\n category.expanded = !category.expanded;\n }\n\n /**\n * Toggle all scopes in a category on/off\n */\n public toggleCategoryAll(category: ScopeCategory): void {\n // Toggle to opposite of current allSelected state\n const newState = !category.allSelected;\n category.allSelected = newState;\n\n // Apply to all scopes in category\n for (const item of category.scopes) {\n item.selected = newState;\n }\n\n // Update change tracking\n this.onScopeChange();\n }\n\n /**\n * Start revoke flow\n */\n public startRevoke(): void {\n this.ShowRevokeConfirm = true;\n this.RevokeConfirmText = '';\n }\n\n /**\n * Cancel revoke\n */\n public cancelRevoke(): void {\n this.ShowRevokeConfirm = false;\n this.RevokeConfirmText = '';\n }\n\n /**\n * Confirm and execute revoke using GraphQL client\n */\n public async confirmRevoke(): Promise<void> {\n if (!this.APIKey || this.RevokeConfirmText !== 'REVOKE') return;\n\n this.IsRevoking = true;\n this.ErrorMessage = '';\n\n try {\n const provider = Metadata.Provider as GraphQLDataProvider;\n const encryptionClient = new GraphQLEncryptionClient(provider);\n\n const result = await encryptionClient.RevokeAPIKey(this.APIKey.ID);\n\n if (result.Success) {\n // Update local state to reflect the change\n this.APIKey.Status = 'Revoked';\n this.ShowRevokeConfirm = false;\n this.SuccessMessage = 'API key has been revoked';\n this.Revoked.emit(this.APIKey);\n } else {\n this.ErrorMessage = result.Error || 'Failed to revoke key';\n }\n } catch (error) {\n console.error('Error revoking key:', error);\n this.ErrorMessage = 'An error occurred while revoking';\n } finally {\n this.IsRevoking = false;\n }\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date | null): string {\n if (!date) return 'Never';\n return new Date(date).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit'\n });\n }\n\n /**\n * Format relative time\n */\n public formatRelativeTime(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - new Date(date).getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return 'Just now';\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n if (days < 7) return `${days}d ago`;\n\n return new Date(date).toLocaleDateString();\n }\n\n /**\n * Get status class for HTTP status code\n */\n public getStatusClass(statusCode: number): string {\n if (statusCode >= 200 && statusCode < 300) return 'status-success';\n if (statusCode >= 400 && statusCode < 500) return 'status-warning';\n if (statusCode >= 500) return 'status-error';\n return '';\n }\n\n /**\n * Get assigned scope count\n */\n public getAssignedScopeCount(): number {\n return this.ScopeCategories.reduce((sum, cat) =>\n sum + cat.scopes.filter(s => s.selected).length, 0);\n }\n\n /**\n * Get selected scope count for a category (for template use)\n */\n public getSelectedCount(category: ScopeCategory): number {\n return category.scopes.filter(s => s.selected).length;\n }\n\n /**\n * Get minimum date for expiration (tomorrow)\n */\n public getMinDate(): Date {\n const tomorrow = new Date();\n tomorrow.setDate(tomorrow.getDate() + 1);\n return tomorrow;\n }\n\n /**\n * Close the panel\n */\n public close(): void {\n this.Visible = false;\n this.VisibleChange.emit(false);\n this.Closed.emit();\n }\n}\n","<!-- Slide-out Backdrop -->\n@if (Visible) {\n <div class=\"slideout-backdrop\" (click)=\"close()\"></div>\n}\n\n<!-- Slide-out Panel -->\n<div class=\"slideout-panel\" [class.open]=\"Visible\">\n <!-- Header -->\n <div class=\"slideout-header\">\n <div class=\"slideout-title\">\n <i class=\"fa-solid fa-key\"></i>\n <span>API Key Details</span>\n <span class=\"key-status\" [class.active]=\"APIKey?.Status === 'Active'\"\n [class.revoked]=\"APIKey?.Status === 'Revoked'\">\n {{APIKey?.Status}}\n </span>\n </div>\n <button class=\"slideout-close\" (click)=\"close()\" title=\"Close (Esc)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n @if (IsLoading) {\n <mj-loading text=\"Loading key details...\"></mj-loading>\n }\n\n @if (!IsLoading && APIKey) {\n <!-- Success/Error Messages -->\n @if (SuccessMessage) {\n <div class=\"message success\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{SuccessMessage}}\n </div>\n }\n @if (ErrorMessage) {\n <div class=\"message error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ErrorMessage}}\n </div>\n }\n <!-- Tabs -->\n <div class=\"slideout-tabs\">\n <button class=\"slideout-tab\" [class.active]=\"ActiveTab === 'details'\"\n (click)=\"ActiveTab = 'details'\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Details\n </button>\n <button class=\"slideout-tab\" [class.active]=\"ActiveTab === 'scopes'\"\n (click)=\"ActiveTab = 'scopes'\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n Permissions\n @if (HasScopeChanges) {\n <span class=\"tab-badge unsaved\">!</span>\n }\n </button>\n <button class=\"slideout-tab\" [class.active]=\"ActiveTab === 'usage'\"\n (click)=\"ActiveTab = 'usage'\">\n <i class=\"fa-solid fa-chart-line\"></i>\n Usage\n </button>\n </div>\n <div class=\"slideout-content\">\n <!-- Details Tab -->\n @if (ActiveTab === 'details') {\n <div class=\"tab-panel\">\n <div class=\"key-info-card\">\n <div class=\"info-header\">\n <div class=\"info-row\">\n <span class=\"info-label\">Key Hash</span>\n <code class=\"hash-value\">{{APIKey.Hash}}</code>\n </div>\n </div>\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <span class=\"info-label\">Created</span>\n <span class=\"info-value\">{{formatDate(APIKey.__mj_CreatedAt)}}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Created By</span>\n <span class=\"info-value\">{{APIKey.CreatedByUser}}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Owner</span>\n <span class=\"info-value\">{{APIKey.User}}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Last Used</span>\n <span class=\"info-value\" [class.never-used]=\"!APIKey.LastUsedAt\">\n {{APIKey.LastUsedAt ? formatDate(APIKey.LastUsedAt) : 'Never'}}\n </span>\n </div>\n </div>\n </div>\n <!-- Editable Fields -->\n <div class=\"edit-section\">\n <div class=\"section-header\">\n <h4>Key Configuration</h4>\n @if (APIKey.Status === 'Active') {\n <button class=\"edit-toggle\"\n (click)=\"toggleEdit()\">\n <i class=\"fa-solid\" [class.fa-pencil]=\"!IsEditing\" [class.fa-times]=\"IsEditing\"></i>\n {{IsEditing ? 'Cancel' : 'Edit'}}\n </button>\n }\n </div>\n <div class=\"form-field\">\n <label>Label</label>\n <input class=\"mj-input form-input\" [(ngModel)]=\"EditLabel\"\n [disabled]=\"!IsEditing\" />\n </div>\n <div class=\"form-field\">\n <label>Description</label>\n <textarea class=\"mj-textarea form-textarea\" [(ngModel)]=\"EditDescription\"\n [disabled]=\"!IsEditing\"\n [rows]=\"3\"></textarea>\n </div>\n <div class=\"form-field\">\n <label>Expiration</label>\n <div class=\"expiration-field\">\n <mj-datepicker [(ngModel)]=\"EditExpiresAt\"\n [Disabled]=\"!IsEditing\"\n [Min]=\"getMinDate()\"\n Format=\"MMM d, yyyy\"\n Placeholder=\"Never expires\">\n </mj-datepicker>\n @if (IsEditing && EditExpiresAt) {\n <button class=\"clear-btn\"\n (click)=\"EditExpiresAt = null\">\n <i class=\"fa-solid fa-times\"></i>\n Never expires\n </button>\n }\n </div>\n </div>\n @if (IsEditing) {\n <div class=\"edit-actions\">\n <button mjButton variant=\"primary\"\n [disabled]=\"IsSaving\"\n (click)=\"saveChanges()\">\n @if (IsSaving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n }\n @if (!IsSaving) {\n <span>\n <i class=\"fa-solid fa-save\"></i>\n Save Changes\n </span>\n }\n </button>\n </div>\n }\n </div>\n <!-- Revoke Section -->\n @if (APIKey.Status === 'Active') {\n <div class=\"danger-zone\">\n <h4>Danger Zone</h4>\n @if (!ShowRevokeConfirm) {\n <div class=\"revoke-section\">\n <div class=\"revoke-info\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <div>\n <strong>Revoke this API key</strong>\n <p>Once revoked, this key will immediately stop working. This action cannot be undone.</p>\n </div>\n </div>\n <button class=\"revoke-btn\" (click)=\"startRevoke()\">\n <i class=\"fa-solid fa-ban\"></i>\n Revoke Key\n </button>\n </div>\n }\n @if (ShowRevokeConfirm) {\n <div class=\"revoke-confirm\">\n <div class=\"confirm-warning\">\n <i class=\"fa-solid fa-skull-crossbones\"></i>\n <div>\n <strong>Are you absolutely sure?</strong>\n <p>This will permanently revoke the API key. Any applications using this key will immediately lose access.</p>\n </div>\n </div>\n <div class=\"confirm-input\">\n <label>Type <code>REVOKE</code> to confirm:</label>\n <input class=\"mj-input\" [(ngModel)]=\"RevokeConfirmText\"\n placeholder=\"REVOKE\" />\n </div>\n <div class=\"confirm-actions\">\n <button mjButton (click)=\"cancelRevoke()\">Cancel</button>\n <button class=\"confirm-revoke-btn\"\n [disabled]=\"RevokeConfirmText !== 'REVOKE' || IsRevoking\"\n (click)=\"confirmRevoke()\">\n @if (IsRevoking) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n }\n @if (!IsRevoking) {\n <span>\n <i class=\"fa-solid fa-ban\"></i>\n Revoke Key\n </span>\n }\n </button>\n </div>\n </div>\n }\n </div>\n }\n <!-- Revoked Notice -->\n @if (APIKey.Status === 'Revoked') {\n <div class=\"revoked-notice\">\n <i class=\"fa-solid fa-ban\"></i>\n <div>\n <strong>This API key has been revoked</strong>\n <p>It can no longer be used for authentication. Consider deleting this record if no longer needed.</p>\n </div>\n </div>\n }\n </div>\n }\n <!-- Scopes Tab -->\n @if (ActiveTab === 'scopes') {\n <div class=\"tab-panel scopes-panel\">\n <div class=\"scopes-header\">\n <div class=\"scopes-info\">\n <span class=\"scope-count\">{{getAssignedScopeCount()}} permissions assigned</span>\n </div>\n @if (HasScopeChanges && APIKey.Status === 'Active') {\n <button mjButton variant=\"primary\"\n [disabled]=\"IsSaving\"\n (click)=\"saveScopeChanges()\">\n @if (IsSaving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n }\n @if (!IsSaving) {\n <span>\n <i class=\"fa-solid fa-save\"></i>\n Save Changes\n </span>\n }\n </button>\n }\n </div>\n <!-- No Scopes Warning -->\n @if (!IsLoadingScopes && getAssignedScopeCount() === 0 && APIKey.Status === 'Active') {\n <div class=\"no-scopes-warning\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <div>\n <strong>Warning: No permissions assigned</strong>\n <p>This API key has no assigned scopes and cannot perform any operations. All API requests using this key will be rejected until scopes are assigned.</p>\n </div>\n </div>\n }\n @if (IsLoadingScopes) {\n <mj-loading text=\"Loading permissions...\"></mj-loading>\n }\n @if (!IsLoadingScopes) {\n <div class=\"scope-categories\">\n @for (category of ScopeCategories; track category) {\n <div class=\"scope-category\">\n <div class=\"category-header\" (click)=\"toggleCategory(category)\">\n <div class=\"category-left\">\n <i [class]=\"category.icon\" [style.color]=\"category.color\"></i>\n <span class=\"category-name\">{{category.name}}</span>\n <span class=\"category-count\">\n {{getSelectedCount(category)}}/{{category.scopes.length}}\n </span>\n </div>\n <div class=\"category-right\">\n @if (APIKey.Status === 'Active') {\n <label class=\"category-all-toggle\"\n (click)=\"$event.stopPropagation()\"\n >\n <input type=\"checkbox\" class=\"mj-checkbox\"\n [checked]=\"category.allSelected\"\n (change)=\"toggleCategoryAll(category)\" />\n <span>All</span>\n </label>\n }\n <i class=\"fa-solid expand-icon\" [class.fa-chevron-down]=\"!category.expanded\"\n [class.fa-chevron-up]=\"category.expanded\"></i>\n </div>\n </div>\n @if (category.expanded) {\n <div class=\"category-scopes\">\n @for (item of category.scopes; track item) {\n <div class=\"scope-item\">\n <label class=\"scope-label\">\n <input type=\"checkbox\" class=\"mj-checkbox\"\n [(ngModel)]=\"item.selected\"\n [disabled]=\"APIKey.Status === 'Revoked'\"\n (change)=\"onScopeChange()\" />\n <div class=\"scope-info\">\n <span class=\"scope-name\">{{item.scope.Name}}</span>\n @if (item.scope.Description) {\n <span class=\"scope-desc\">\n {{item.scope.Description}}\n </span>\n }\n </div>\n </label>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n <!-- Usage Tab -->\n @if (ActiveTab === 'usage') {\n <div class=\"tab-panel usage-panel\">\n @if (IsLoadingLogs) {\n <mj-loading text=\"Loading usage logs...\"></mj-loading>\n }\n @if (!IsLoadingLogs) {\n <div class=\"usage-content\">\n <div class=\"usage-stats\">\n <div class=\"stat-card\">\n <i class=\"fa-solid fa-chart-line\"></i>\n <div class=\"stat-value\">{{UsageLogs.length}}</div>\n <div class=\"stat-label\">Total Requests</div>\n </div>\n <div class=\"stat-card\">\n <i class=\"fa-solid fa-clock\"></i>\n <div class=\"stat-value\">\n {{UsageLogs.length > 0 ? formatRelativeTime(UsageLogs[0].timestamp) : 'Never'}}\n </div>\n <div class=\"stat-label\">Last Used</div>\n </div>\n </div>\n @if (UsageLogs.length > 0) {\n <div class=\"usage-logs\">\n <div class=\"log-header\">\n <span class=\"col-time\">Time</span>\n <span class=\"col-endpoint\">Endpoint</span>\n <span class=\"col-status\">Status</span>\n <span class=\"col-duration\">Duration</span>\n </div>\n @for (log of UsageLogs; track log) {\n <div class=\"log-item\">\n <span class=\"col-time\">{{formatRelativeTime(log.timestamp)}}</span>\n <span class=\"col-endpoint\">\n <span class=\"method-badge\">{{log.method}}</span>\n {{log.endpoint}}\n </span>\n <span class=\"col-status\" [ngClass]=\"getStatusClass(log.statusCode)\">\n {{log.statusCode}}\n </span>\n <span class=\"col-duration\">{{log.responseTime}}ms</span>\n </div>\n }\n </div>\n }\n @if (UsageLogs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-chart-area\"></i>\n <span>No usage logs yet</span>\n <p>Usage will be recorded when this API key is used for authentication</p>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n <!-- Footer -->\n <div class=\"slideout-footer\">\n <button mjButton (click)=\"close()\">Close</button>\n </div>\n }\n</div>\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"credentials-list-resource.component.d.ts","sourceRoot":"","sources":["../../../src/Credentials/components/credentials-list-resource.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credentials-list-resource.component.d.ts","sourceRoot":"","sources":["../../../src/Credentials/components/credentials-list-resource.component.ts"],"names":[],"mappings":"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"}
@@ -906,33 +906,25 @@ let CredentialsListResourceComponent = class CredentialsListResourceComponent ex
906
906
  const confirmed = confirm(`Are you sure you want to delete ${count} credential(s)? This action cannot be undone.`);
907
907
  if (!confirmed)
908
908
  return;
909
- let successCount = 0;
910
- let failCount = 0;
911
- for (const credId of this.selectedCredentials) {
912
- const credential = this.credentials.find(c => UUIDsEqual(c.ID, credId));
913
- if (credential) {
914
- try {
915
- const success = await credential.Delete();
916
- if (success) {
917
- successCount++;
918
- this.credentials = this.credentials.filter(c => !UUIDsEqual(c.ID, credId));
919
- }
920
- else {
921
- failCount++;
922
- }
923
- }
924
- catch {
925
- failCount++;
926
- }
927
- }
909
+ const toDelete = Array.from(this.selectedCredentials)
910
+ .map(id => this.credentials.find(c => UUIDsEqual(c.ID, id)))
911
+ .filter((c) => c != null);
912
+ if (toDelete.length === 0)
913
+ return;
914
+ const tg = await this._metadata.CreateTransactionGroup();
915
+ for (const credential of toDelete) {
916
+ credential.TransactionGroup = tg;
917
+ await credential.Delete();
928
918
  }
929
- this.selectedCredentials.clear();
930
- this.applyFilters();
931
- if (successCount > 0) {
932
- MJNotificationService.Instance.CreateSimpleNotification(`${successCount} credential(s) deleted${failCount > 0 ? `, ${failCount} failed` : ''}`, failCount > 0 ? 'warning' : 'success', 3000);
919
+ if (await tg.Submit()) {
920
+ const deletedIds = new Set(toDelete.map(c => c.ID));
921
+ this.credentials = this.credentials.filter(c => !deletedIds.has(c.ID));
922
+ this.selectedCredentials.clear();
923
+ this.applyFilters();
924
+ MJNotificationService.Instance.CreateSimpleNotification(`${toDelete.length} credential(s) deleted`, 'success', 3000);
933
925
  }
934
926
  else {
935
- MJNotificationService.Instance.CreateSimpleNotification('Failed to delete credentials', 'error', 3000);
927
+ MJNotificationService.Instance.CreateSimpleNotification('Failed to delete credentials — all changes have been rolled back', 'error', 3000);
936
928
  }
937
929
  }
938
930
  // === Filtering ===
@@ -1161,36 +1153,37 @@ let CredentialsListResourceComponent = class CredentialsListResourceComponent ex
1161
1153
  async bulkToggleActive(active) {
1162
1154
  if (!this.UserCanUpdate || this.selectedCredentials.size === 0)
1163
1155
  return;
1164
- let successCount = 0;
1165
- let failCount = 0;
1156
+ const toUpdate = [];
1166
1157
  for (const credId of this.selectedCredentials) {
1167
1158
  const credential = this.credentials.find(c => UUIDsEqual(c.ID, credId));
1168
1159
  if (credential && credential.IsActive !== active) {
1169
- try {
1170
- credential.IsActive = active;
1171
- const success = await credential.Save();
1172
- if (success) {
1173
- successCount++;
1174
- }
1175
- else {
1176
- credential.IsActive = !active;
1177
- failCount++;
1178
- }
1179
- }
1180
- catch {
1181
- credential.IsActive = !active;
1182
- failCount++;
1183
- }
1160
+ toUpdate.push(credential);
1184
1161
  }
1185
1162
  }
1186
- this.clearSelection();
1187
- this.applyFilters();
1188
1163
  const action = active ? 'activated' : 'deactivated';
1189
- if (successCount > 0) {
1190
- MJNotificationService.Instance.CreateSimpleNotification(`${successCount} credential(s) ${action}${failCount > 0 ? `, ${failCount} failed` : ''}`, failCount > 0 ? 'warning' : 'success', 3000);
1164
+ if (toUpdate.length === 0) {
1165
+ this.clearSelection();
1166
+ return;
1191
1167
  }
1192
- else if (failCount > 0) {
1193
- MJNotificationService.Instance.CreateSimpleNotification(`Failed to ${action.slice(0, -1)} credentials`, 'error', 3000);
1168
+ const tg = await this._metadata.CreateTransactionGroup();
1169
+ for (const credential of toUpdate) {
1170
+ credential.IsActive = active;
1171
+ credential.TransactionGroup = tg;
1172
+ await credential.Save();
1173
+ }
1174
+ if (await tg.Submit()) {
1175
+ this.clearSelection();
1176
+ this.applyFilters();
1177
+ MJNotificationService.Instance.CreateSimpleNotification(`${toUpdate.length} credential(s) ${action}`, 'success', 3000);
1178
+ }
1179
+ else {
1180
+ // Server rolled back — revert the client-side state to match
1181
+ for (const credential of toUpdate) {
1182
+ credential.IsActive = !active;
1183
+ }
1184
+ this.clearSelection();
1185
+ this.applyFilters();
1186
+ MJNotificationService.Instance.CreateSimpleNotification(`Failed to ${action.slice(0, -1)} credentials — all changes have been rolled back`, 'error', 3000);
1194
1187
  }
1195
1188
  }
1196
1189
  async bulkDelete() {
@@ -1200,33 +1193,25 @@ let CredentialsListResourceComponent = class CredentialsListResourceComponent ex
1200
1193
  const confirmed = confirm(`Are you sure you want to delete ${count} credential(s)? This action cannot be undone.`);
1201
1194
  if (!confirmed)
1202
1195
  return;
1203
- let successCount = 0;
1204
- let failCount = 0;
1205
- for (const credId of this.selectedCredentials) {
1206
- const credential = this.credentials.find(c => UUIDsEqual(c.ID, credId));
1207
- if (credential) {
1208
- try {
1209
- const success = await credential.Delete();
1210
- if (success) {
1211
- successCount++;
1212
- this.credentials = this.credentials.filter(c => !UUIDsEqual(c.ID, credId));
1213
- }
1214
- else {
1215
- failCount++;
1216
- }
1217
- }
1218
- catch {
1219
- failCount++;
1220
- }
1221
- }
1196
+ const toDelete = Array.from(this.selectedCredentials)
1197
+ .map(id => this.credentials.find(c => UUIDsEqual(c.ID, id)))
1198
+ .filter((c) => c != null);
1199
+ if (toDelete.length === 0)
1200
+ return;
1201
+ const tg = await this._metadata.CreateTransactionGroup();
1202
+ for (const credential of toDelete) {
1203
+ credential.TransactionGroup = tg;
1204
+ await credential.Delete();
1222
1205
  }
1223
- this.clearSelection();
1224
- this.applyFilters();
1225
- if (successCount > 0) {
1226
- MJNotificationService.Instance.CreateSimpleNotification(`${successCount} credential(s) deleted${failCount > 0 ? `, ${failCount} failed` : ''}`, failCount > 0 ? 'warning' : 'success', 3000);
1206
+ if (await tg.Submit()) {
1207
+ const deletedIds = new Set(toDelete.map(c => c.ID));
1208
+ this.credentials = this.credentials.filter(c => !deletedIds.has(c.ID));
1209
+ this.clearSelection();
1210
+ this.applyFilters();
1211
+ MJNotificationService.Instance.CreateSimpleNotification(`${toDelete.length} credential(s) deleted`, 'success', 3000);
1227
1212
  }
1228
1213
  else {
1229
- MJNotificationService.Instance.CreateSimpleNotification('Failed to delete credentials', 'error', 3000);
1214
+ MJNotificationService.Instance.CreateSimpleNotification('Failed to delete credentials — all changes have been rolled back', 'error', 3000);
1230
1215
  }
1231
1216
  }
1232
1217
  static ɵfac = function CredentialsListResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CredentialsListResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };