@atlashub/smartstack 3.21.0 → 3.24.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 (280) hide show
  1. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js → AgentSkillsPage-BWQSCYl-.js} +2 -2
  2. package/dist/chunks/{AgentSkillsPage-7si3Ng8e.js.map → AgentSkillsPage-BWQSCYl-.js.map} +1 -1
  3. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js → AgentSkillsPage-IQcMnBaD.js} +2 -2
  4. package/dist/chunks/{AgentSkillsPage-D0cD1QdM.js.map → AgentSkillsPage-IQcMnBaD.js.map} +1 -1
  5. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js → AgentWorkloadPage-DqrjkvWL.js} +2 -2
  6. package/dist/chunks/{AgentWorkloadPage-H_7ze33H.js.map → AgentWorkloadPage-DqrjkvWL.js.map} +1 -1
  7. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js → AgentWorkloadPage-w-HiyFYP.js} +2 -2
  8. package/dist/chunks/{AgentWorkloadPage-D4d86cdV.js.map → AgentWorkloadPage-w-HiyFYP.js.map} +1 -1
  9. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js → ApiCatalogDetailPage-D3L8Yf4G.js} +3 -3
  10. package/dist/chunks/{ApiCatalogDetailPage-2ktkRrCb.js.map → ApiCatalogDetailPage-D3L8Yf4G.js.map} +1 -1
  11. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js → ApiCatalogDetailPage-MPT3Kz6H.js} +2 -2
  12. package/dist/chunks/{ApiCatalogDetailPage-BQ53xuwD.js.map → ApiCatalogDetailPage-MPT3Kz6H.js.map} +1 -1
  13. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js → ApiCatalogPage-D4Hg3uiS.js} +2 -2
  14. package/dist/chunks/{ApiCatalogPage-BEqTDJz8.js.map → ApiCatalogPage-D4Hg3uiS.js.map} +1 -1
  15. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js → ApiCatalogPage-DRg5Cz0r.js} +2 -2
  16. package/dist/chunks/{ApiCatalogPage-BBkWSLI8.js.map → ApiCatalogPage-DRg5Cz0r.js.map} +1 -1
  17. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js → ApplicationDetailPage-Caizuyn2.js} +2 -2
  18. package/dist/chunks/{ApplicationDetailPage-BYJ2YMPq.js.map → ApplicationDetailPage-Caizuyn2.js.map} +1 -1
  19. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js → ApplicationDetailPage-CuCW6aMB.js} +4 -4
  20. package/dist/chunks/{ApplicationDetailPage-D8-bf1as.js.map → ApplicationDetailPage-CuCW6aMB.js.map} +1 -1
  21. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js → ApplicationsDashboardPage-B2MW8-Kc.js} +2 -2
  22. package/dist/chunks/{ApplicationsDashboardPage-BBlLms2r.js.map → ApplicationsDashboardPage-B2MW8-Kc.js.map} +1 -1
  23. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js → ApplicationsDashboardPage-BDIjFIYZ.js} +3 -3
  24. package/dist/chunks/{ApplicationsDashboardPage-DTWZxJJM.js.map → ApplicationsDashboardPage-BDIjFIYZ.js.map} +1 -1
  25. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js → ApplicationsGridPage-DV-FihKj.js} +2 -2
  26. package/dist/chunks/{ApplicationsGridPage-BQaMsK1K.js.map → ApplicationsGridPage-DV-FihKj.js.map} +1 -1
  27. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js → ApplicationsGridPage-DXsTfXPI.js} +2 -2
  28. package/dist/chunks/{ApplicationsGridPage-DbVcvezt.js.map → ApplicationsGridPage-DXsTfXPI.js.map} +1 -1
  29. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js → ApplicationsListPage--CGkyBuJ.js} +2 -2
  30. package/dist/chunks/{ApplicationsListPage-DYKM2Yeo.js.map → ApplicationsListPage--CGkyBuJ.js.map} +1 -1
  31. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js → ApplicationsListPage-JUX823bh.js} +2 -2
  32. package/dist/chunks/{ApplicationsListPage-C91v2rZt.js.map → ApplicationsListPage-JUX823bh.js.map} +1 -1
  33. package/dist/chunks/{ApplicationsPage-BCbgotIx.js → ApplicationsPage-6zgFye6w.js} +2 -2
  34. package/dist/chunks/{ApplicationsPage-BCbgotIx.js.map → ApplicationsPage-6zgFye6w.js.map} +1 -1
  35. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js → ApplicationsPage-CQPuuiO6.js} +4 -4
  36. package/dist/chunks/{ApplicationsPage-CW3-Hjlu.js.map → ApplicationsPage-CQPuuiO6.js.map} +1 -1
  37. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js → AssignmentRulesPage-CFffeEbo.js} +2 -2
  38. package/dist/chunks/{AssignmentRulesPage-D8vfGDBN.js.map → AssignmentRulesPage-CFffeEbo.js.map} +1 -1
  39. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js → AssignmentRulesPage-D78UeUId.js} +2 -2
  40. package/dist/chunks/{AssignmentRulesPage-CxktlEMB.js.map → AssignmentRulesPage-D78UeUId.js.map} +1 -1
  41. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js → AssignmentsPage-Cww2ifZF.js} +2 -2
  42. package/dist/chunks/{AssignmentsPage-DmfBYQAD.js.map → AssignmentsPage-Cww2ifZF.js.map} +1 -1
  43. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js → AssignmentsPage-DE_QS2LO.js} +2 -2
  44. package/dist/chunks/{AssignmentsPage-sRCCBmRc.js.map → AssignmentsPage-DE_QS2LO.js.map} +1 -1
  45. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js → AuthCallbackPage-CA2nO6DG.js} +2 -2
  46. package/dist/chunks/{AuthCallbackPage-C7XiZxKb.js.map → AuthCallbackPage-CA2nO6DG.js.map} +1 -1
  47. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js → AuthCallbackPage-CDUAoX-N.js} +2 -2
  48. package/dist/chunks/{AuthCallbackPage-BCe_bwJM.js.map → AuthCallbackPage-CDUAoX-N.js.map} +1 -1
  49. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js → ConfirmEmailPage-BqsILAYH.js} +2 -2
  50. package/dist/chunks/{ConfirmEmailPage-BUfGSqxF.js.map → ConfirmEmailPage-BqsILAYH.js.map} +1 -1
  51. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js → ConfirmEmailPage-INeHCuMB.js} +2 -2
  52. package/dist/chunks/{ConfirmEmailPage-Buj4x-rx.js.map → ConfirmEmailPage-INeHCuMB.js.map} +1 -1
  53. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js → CreateSupportTicketPage-BWeuV2aU.js} +2 -2
  54. package/dist/chunks/{CreateSupportTicketPage-CKDX_HQm.js.map → CreateSupportTicketPage-BWeuV2aU.js.map} +1 -1
  55. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js → CreateSupportTicketPage-OBwF4v7b.js} +2 -2
  56. package/dist/chunks/{CreateSupportTicketPage-0LgY-_pu.js.map → CreateSupportTicketPage-OBwF4v7b.js.map} +1 -1
  57. package/dist/chunks/{DashboardPage-CUZ80NGV.js → DashboardPage-CKHqWrdS.js} +3 -3
  58. package/dist/chunks/{DashboardPage-CUZ80NGV.js.map → DashboardPage-CKHqWrdS.js.map} +1 -1
  59. package/dist/chunks/{DashboardPage-CaNOAstg.js → DashboardPage-COmc9b__.js} +3 -3
  60. package/dist/chunks/{DashboardPage-CaNOAstg.js.map → DashboardPage-COmc9b__.js.map} +1 -1
  61. package/dist/chunks/{DashboardPage-B48_rQFi.js → DashboardPage-CfKZHiSj.js} +2 -2
  62. package/dist/chunks/{DashboardPage-B48_rQFi.js.map → DashboardPage-CfKZHiSj.js.map} +1 -1
  63. package/dist/chunks/{DashboardPage-CUZV1J9t.js → DashboardPage-CwEZZ3jx.js} +2 -2
  64. package/dist/chunks/{DashboardPage-CUZV1J9t.js.map → DashboardPage-CwEZZ3jx.js.map} +1 -1
  65. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js → EscalationConfigPage--7lgZ0kJ.js} +2 -2
  66. package/dist/chunks/{EscalationConfigPage-CdzAbnGy.js.map → EscalationConfigPage--7lgZ0kJ.js.map} +1 -1
  67. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js → EscalationConfigPage-DPyiBcqV.js} +2 -2
  68. package/dist/chunks/{EscalationConfigPage-CYGIl_e6.js.map → EscalationConfigPage-DPyiBcqV.js.map} +1 -1
  69. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js → ForceChangePasswordPage-BE-6umub.js} +2 -2
  70. package/dist/chunks/{ForceChangePasswordPage-lRpkwcX7.js.map → ForceChangePasswordPage-BE-6umub.js.map} +1 -1
  71. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js → ForceChangePasswordPage-CnsYoWmV.js} +2 -2
  72. package/dist/chunks/{ForceChangePasswordPage-CvmYAV3r.js.map → ForceChangePasswordPage-CnsYoWmV.js.map} +1 -1
  73. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js → ForgotPasswordPage-CSq4DnFF.js} +2 -2
  74. package/dist/chunks/{ForgotPasswordPage-0u49E4Pw.js.map → ForgotPasswordPage-CSq4DnFF.js.map} +1 -1
  75. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js → ForgotPasswordPage-DZLVolAC.js} +2 -2
  76. package/dist/chunks/{ForgotPasswordPage-CxQUqKOm.js.map → ForgotPasswordPage-DZLVolAC.js.map} +1 -1
  77. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js → GroupDetailPage-Bf9Wb_2j.js} +5 -5
  78. package/dist/chunks/{GroupDetailPage-DFBvVO1S.js.map → GroupDetailPage-Bf9Wb_2j.js.map} +1 -1
  79. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js → GroupDetailPage-R-hf3rJ7.js} +2 -2
  80. package/dist/chunks/{GroupDetailPage-B2FkKrGG.js.map → GroupDetailPage-R-hf3rJ7.js.map} +1 -1
  81. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js → MyAccessRequestsPage-BIisvWM6.js} +2 -2
  82. package/dist/chunks/{MyAccessRequestsPage-C9IX4c0K.js.map → MyAccessRequestsPage-BIisvWM6.js.map} +1 -1
  83. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js → MyAccessRequestsPage-BLSV7Tbx.js} +2 -2
  84. package/dist/chunks/{MyAccessRequestsPage-D6pVULNM.js.map → MyAccessRequestsPage-BLSV7Tbx.js.map} +1 -1
  85. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js → MyTenantsPage-D-7k9CP1.js} +3 -3
  86. package/dist/chunks/{MyTenantsPage-BEcYYdGR.js.map → MyTenantsPage-D-7k9CP1.js.map} +1 -1
  87. package/dist/chunks/{MyTenantsPage-D9f85zjF.js → MyTenantsPage-DqGW6aDt.js} +2 -2
  88. package/dist/chunks/{MyTenantsPage-D9f85zjF.js.map → MyTenantsPage-DqGW6aDt.js.map} +1 -1
  89. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js → MyTicketsPage--DgDsnZA.js} +2 -2
  90. package/dist/chunks/{MyTicketsPage-DJR8h6y1.js.map → MyTicketsPage--DgDsnZA.js.map} +1 -1
  91. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js → MyTicketsPage-CqJ3Aqob.js} +2 -2
  92. package/dist/chunks/{MyTicketsPage-DiOUExKJ.js.map → MyTicketsPage-CqJ3Aqob.js.map} +1 -1
  93. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js → NavigationAppsPage-Bebis_RT.js} +2 -2
  94. package/dist/chunks/{NavigationAppsPage-CeHbxfZw.js.map → NavigationAppsPage-Bebis_RT.js.map} +1 -1
  95. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js → NavigationAppsPage-THNPOAjv.js} +2 -2
  96. package/dist/chunks/{NavigationAppsPage-If7tmCFY.js.map → NavigationAppsPage-THNPOAjv.js.map} +1 -1
  97. package/dist/chunks/{NotificationsPage-C29Lln5o.js → NotificationsPage-CAbNW_Cn.js} +2 -2
  98. package/dist/chunks/{NotificationsPage-C29Lln5o.js.map → NotificationsPage-CAbNW_Cn.js.map} +1 -1
  99. package/dist/chunks/{NotificationsPage-BiaLRb0s.js → NotificationsPage-DxwizUhL.js} +2 -2
  100. package/dist/chunks/{NotificationsPage-BiaLRb0s.js.map → NotificationsPage-DxwizUhL.js.map} +1 -1
  101. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js → OnboardingWizardPage-C6HlbJ3K.js} +2 -2
  102. package/dist/chunks/{OnboardingWizardPage-DQrBKNBq.js.map → OnboardingWizardPage-C6HlbJ3K.js.map} +1 -1
  103. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js → OnboardingWizardPage-CyC2zONO.js} +2 -2
  104. package/dist/chunks/{OnboardingWizardPage-BQah4cI8.js.map → OnboardingWizardPage-CyC2zONO.js.map} +1 -1
  105. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js → PermissionDetailPage-BDHiNgky.js} +2 -2
  106. package/dist/chunks/{PermissionDetailPage-Ckjdjvf9.js.map → PermissionDetailPage-BDHiNgky.js.map} +1 -1
  107. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js → PermissionDetailPage-C5K17ydY.js} +2 -2
  108. package/dist/chunks/{PermissionDetailPage-Dh8v7mGj.js.map → PermissionDetailPage-C5K17ydY.js.map} +1 -1
  109. package/dist/chunks/{PermissionsPage-l0PnY-EE.js → PermissionsPage-COI5LJPo.js} +2 -2
  110. package/dist/chunks/{PermissionsPage-l0PnY-EE.js.map → PermissionsPage-COI5LJPo.js.map} +1 -1
  111. package/dist/chunks/{PermissionsPage-DLy9U3P3.js → PermissionsPage-CkOwH2_d.js} +2 -2
  112. package/dist/chunks/{PermissionsPage-DLy9U3P3.js.map → PermissionsPage-CkOwH2_d.js.map} +1 -1
  113. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js → PortalDashboardPage-CoEC4CmC.js} +2 -2
  114. package/dist/chunks/{PortalDashboardPage-DFBx38-x.js.map → PortalDashboardPage-CoEC4CmC.js.map} +1 -1
  115. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js → PortalDashboardPage-DrYymEf-.js} +2 -2
  116. package/dist/chunks/{PortalDashboardPage-rQYhrX0q.js.map → PortalDashboardPage-DrYymEf-.js.map} +1 -1
  117. package/dist/chunks/{PreferencesPage-BBu8yZQB.js → PreferencesPage-CJRaU3ba.js} +2 -2
  118. package/dist/chunks/{PreferencesPage-BBu8yZQB.js.map → PreferencesPage-CJRaU3ba.js.map} +1 -1
  119. package/dist/chunks/{PreferencesPage-B81MsNV1.js → PreferencesPage-Cqr9mAab.js} +2 -2
  120. package/dist/chunks/{PreferencesPage-B81MsNV1.js.map → PreferencesPage-Cqr9mAab.js.map} +1 -1
  121. package/dist/chunks/{ProfilePage-DDrl10zj.js → ProfilePage-BZVpg6-l.js} +2 -2
  122. package/dist/chunks/{ProfilePage-DDrl10zj.js.map → ProfilePage-BZVpg6-l.js.map} +1 -1
  123. package/dist/chunks/{ProfilePage-DPoXwdnc.js → ProfilePage-Cu_FITeL.js} +2 -2
  124. package/dist/chunks/{ProfilePage-DPoXwdnc.js.map → ProfilePage-Cu_FITeL.js.map} +1 -1
  125. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js → ReferencesManagementPage-DUlVk9Ps.js} +3 -3
  126. package/dist/chunks/{ReferencesManagementPage-eFsKjIEK.js.map → ReferencesManagementPage-DUlVk9Ps.js.map} +1 -1
  127. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js → ReferencesManagementPage-ZCuYtqd7.js} +2 -2
  128. package/dist/chunks/{ReferencesManagementPage-DhVsuElE.js.map → ReferencesManagementPage-ZCuYtqd7.js.map} +1 -1
  129. package/dist/chunks/{RegisterPage-CiQib3-6.js → RegisterPage-C4xmVwh9.js} +2 -2
  130. package/dist/chunks/{RegisterPage-CiQib3-6.js.map → RegisterPage-C4xmVwh9.js.map} +1 -1
  131. package/dist/chunks/{RegisterPage-bXCcJD88.js → RegisterPage-DGyzoIHT.js} +2 -2
  132. package/dist/chunks/{RegisterPage-bXCcJD88.js.map → RegisterPage-DGyzoIHT.js.map} +1 -1
  133. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js → ResetPasswordPage-DqDD6VPR.js} +2 -2
  134. package/dist/chunks/{ResetPasswordPage-Dqiahhnj.js.map → ResetPasswordPage-DqDD6VPR.js.map} +1 -1
  135. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js → ResetPasswordPage-Glu-aeqv.js} +2 -2
  136. package/dist/chunks/{ResetPasswordPage-CubPG3yv.js.map → ResetPasswordPage-Glu-aeqv.js.map} +1 -1
  137. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js → ResolutionModal-CxjANAOP.js} +2 -2
  138. package/dist/chunks/{ResolutionModal-Bg7XZmR1.js.map → ResolutionModal-CxjANAOP.js.map} +1 -1
  139. package/dist/chunks/{ResolutionModal-DqRk_T0n.js → ResolutionModal-Duat18qV.js} +2 -2
  140. package/dist/chunks/{ResolutionModal-DqRk_T0n.js.map → ResolutionModal-Duat18qV.js.map} +1 -1
  141. package/dist/chunks/{RoleDetailPage-Blau6_4c.js → RoleDetailPage-BQffUSnt.js} +3 -3
  142. package/dist/chunks/{RoleDetailPage-Blau6_4c.js.map → RoleDetailPage-BQffUSnt.js.map} +1 -1
  143. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js → RoleDetailPage-JTm5lD1_.js} +2 -2
  144. package/dist/chunks/{RoleDetailPage-CiRVxxIP.js.map → RoleDetailPage-JTm5lD1_.js.map} +1 -1
  145. package/dist/chunks/{RolesPage-Pm-RN3lP.js → RolesPage-B9rRzciI.js} +2 -2
  146. package/dist/chunks/{RolesPage-Pm-RN3lP.js.map → RolesPage-B9rRzciI.js.map} +1 -1
  147. package/dist/chunks/{RolesPage-Cb8joqdJ.js → RolesPage-BN8_zMOC.js} +2 -2
  148. package/dist/chunks/{RolesPage-Cb8joqdJ.js.map → RolesPage-BN8_zMOC.js.map} +1 -1
  149. package/dist/chunks/{SlaConfigPage-B86McKM6.js → SlaConfigPage-B7kZNig4.js} +2 -2
  150. package/dist/chunks/{SlaConfigPage-B86McKM6.js.map → SlaConfigPage-B7kZNig4.js.map} +1 -1
  151. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js → SlaConfigPage-okvZfA_K.js} +2 -2
  152. package/dist/chunks/{SlaConfigPage-BY7gvYU6.js.map → SlaConfigPage-okvZfA_K.js.map} +1 -1
  153. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js → SupportPermissionsPage-DGAPqJbl.js} +2 -2
  154. package/dist/chunks/{SupportPermissionsPage-BYxcLMSd.js.map → SupportPermissionsPage-DGAPqJbl.js.map} +1 -1
  155. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js → SupportPermissionsPage-Dg_wLOme.js} +2 -2
  156. package/dist/chunks/{SupportPermissionsPage-MXqXNJIZ.js.map → SupportPermissionsPage-Dg_wLOme.js.map} +1 -1
  157. package/dist/chunks/{TemplatesPage-BDguJ401.js → TemplatesPage-DT9fhlAU.js} +2 -2
  158. package/dist/chunks/{TemplatesPage-BDguJ401.js.map → TemplatesPage-DT9fhlAU.js.map} +1 -1
  159. package/dist/chunks/{TemplatesPage-DdnGgioU.js → TemplatesPage-DiEk538p.js} +2 -2
  160. package/dist/chunks/{TemplatesPage-DdnGgioU.js.map → TemplatesPage-DiEk538p.js.map} +1 -1
  161. package/dist/chunks/{TenantCard-ffwWsgFQ.js → TenantCard-BbSYk9_Z.js} +2 -2
  162. package/dist/chunks/{TenantCard-ffwWsgFQ.js.map → TenantCard-BbSYk9_Z.js.map} +1 -1
  163. package/dist/chunks/{TenantCard-CUjb6og9.js → TenantCard-CEkiKxcZ.js} +2 -2
  164. package/dist/chunks/{TenantCard-CUjb6og9.js.map → TenantCard-CEkiKxcZ.js.map} +1 -1
  165. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js → TenantScopeSelector-BWfYxvEa.js} +2 -2
  166. package/dist/chunks/{TenantScopeSelector-Dz7i1I43.js.map → TenantScopeSelector-BWfYxvEa.js.map} +1 -1
  167. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js → TenantScopeSelector-D-BKgQPV.js} +2 -2
  168. package/dist/chunks/{TenantScopeSelector-Cym_Zyps.js.map → TenantScopeSelector-D-BKgQPV.js.map} +1 -1
  169. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js → TicketDetailPage-C1mNS9Up.js} +2 -2
  170. package/dist/chunks/{TicketDetailPage-GOh9GX7E.js.map → TicketDetailPage-C1mNS9Up.js.map} +1 -1
  171. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js → TicketDetailPage-ieVDRh42.js} +2 -2
  172. package/dist/chunks/{TicketDetailPage-Du8WMyqf.js.map → TicketDetailPage-ieVDRh42.js.map} +1 -1
  173. package/dist/chunks/{TicketsPage-Bqd6moQy.js → TicketsPage-CnuWsnIW.js} +2 -2
  174. package/dist/chunks/{TicketsPage-Bqd6moQy.js.map → TicketsPage-CnuWsnIW.js.map} +1 -1
  175. package/dist/chunks/{TicketsPage-WdU4Bb7M.js → TicketsPage-jjyY15_D.js} +2 -2
  176. package/dist/chunks/{TicketsPage-WdU4Bb7M.js.map → TicketsPage-jjyY15_D.js.map} +1 -1
  177. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js → UserCreateTicketPage-B8Tvf-ag.js} +2 -2
  178. package/dist/chunks/{UserCreateTicketPage-Cm1emgwR.js.map → UserCreateTicketPage-B8Tvf-ag.js.map} +1 -1
  179. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js → UserCreateTicketPage-DnOsDlfO.js} +2 -2
  180. package/dist/chunks/{UserCreateTicketPage-BPw-5Y_D.js.map → UserCreateTicketPage-DnOsDlfO.js.map} +1 -1
  181. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js → UserDashboardPage-BrtkJ-NB.js} +2 -2
  182. package/dist/chunks/{UserDashboardPage-BP5WeXPS.js.map → UserDashboardPage-BrtkJ-NB.js.map} +1 -1
  183. package/dist/chunks/{UserDashboardPage-B53C8fUq.js → UserDashboardPage-KLB5CQP5.js} +2 -2
  184. package/dist/chunks/{UserDashboardPage-B53C8fUq.js.map → UserDashboardPage-KLB5CQP5.js.map} +1 -1
  185. package/dist/chunks/{UserDetailPage-B110bmGX.js → UserDetailPage-U7smBQoF.js} +5 -5
  186. package/dist/chunks/{UserDetailPage-B110bmGX.js.map → UserDetailPage-U7smBQoF.js.map} +1 -1
  187. package/dist/chunks/{UserDetailPage-CV2VCE46.js → UserDetailPage-_J6lcKAU.js} +2 -2
  188. package/dist/chunks/{UserDetailPage-CV2VCE46.js.map → UserDetailPage-_J6lcKAU.js.map} +1 -1
  189. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js → UserTicketDetailPage-CWoYQgH-.js} +2 -2
  190. package/dist/chunks/{UserTicketDetailPage-CCNJON1V.js.map → UserTicketDetailPage-CWoYQgH-.js.map} +1 -1
  191. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js → UserTicketDetailPage-DkufSlvZ.js} +2 -2
  192. package/dist/chunks/{UserTicketDetailPage-V0mLXrox.js.map → UserTicketDetailPage-DkufSlvZ.js.map} +1 -1
  193. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js → UsersGroupsPage-C38s2-Rq.js} +3 -3
  194. package/dist/chunks/{UsersGroupsPage-CmdaU-z-.js.map → UsersGroupsPage-C38s2-Rq.js.map} +1 -1
  195. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js → UsersGroupsPage-Dq3rAteo.js} +2 -2
  196. package/dist/chunks/{UsersGroupsPage-BgfAMgEP.js.map → UsersGroupsPage-Dq3rAteo.js.map} +1 -1
  197. package/dist/chunks/{UsersPage-Bg7033pp.js → UsersPage-B5C5KEUR.js} +2 -2
  198. package/dist/chunks/{UsersPage-Bg7033pp.js.map → UsersPage-B5C5KEUR.js.map} +1 -1
  199. package/dist/chunks/{UsersPage-TYAfwPY1.js → UsersPage-CXC9Hvq6.js} +2 -2
  200. package/dist/chunks/{UsersPage-TYAfwPY1.js.map → UsersPage-CXC9Hvq6.js.map} +1 -1
  201. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js → accessRequestsApi-B-4TJ5_U.js} +2 -2
  202. package/dist/chunks/{accessRequestsApi-DZeDvzwv.js.map → accessRequestsApi-B-4TJ5_U.js.map} +1 -1
  203. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js → accessRequestsApi-DZSfThpd.js} +2 -2
  204. package/dist/chunks/{accessRequestsApi-ZXFPCid2.js.map → accessRequestsApi-DZSfThpd.js.map} +1 -1
  205. package/dist/chunks/{aiApi-CsH8DXgs.js → aiApi-B20Teu2v.js} +2 -2
  206. package/dist/chunks/{aiApi-CsH8DXgs.js.map → aiApi-B20Teu2v.js.map} +1 -1
  207. package/dist/chunks/{aiApi-CVPzFTXa.js → aiApi-DMGz-RPM.js} +2 -2
  208. package/dist/chunks/{aiApi-CVPzFTXa.js.map → aiApi-DMGz-RPM.js.map} +1 -1
  209. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js → applicationAnalyticsApi-Bwa75Fzd.js} +2 -2
  210. package/dist/chunks/{applicationAnalyticsApi-B8AhFYLr.js.map → applicationAnalyticsApi-Bwa75Fzd.js.map} +1 -1
  211. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js → applicationAnalyticsApi-CLBqRPfN.js} +2 -2
  212. package/dist/chunks/{applicationAnalyticsApi-Ce_1qOk-.js.map → applicationAnalyticsApi-CLBqRPfN.js.map} +1 -1
  213. package/dist/chunks/{groupsApi-BgCk2fsp.js → groupsApi-QzXI-5xu.js} +2 -2
  214. package/dist/chunks/{groupsApi-BgCk2fsp.js.map → groupsApi-QzXI-5xu.js.map} +1 -1
  215. package/dist/chunks/{groupsApi-BIbG665N.js → groupsApi-hB9kSWEd.js} +2 -2
  216. package/dist/chunks/{groupsApi-BIbG665N.js.map → groupsApi-hB9kSWEd.js.map} +1 -1
  217. package/dist/chunks/{index-Cb3LotuT.js → index--NGcBYUu.js} +3 -3
  218. package/dist/chunks/{index-Cb3LotuT.js.map → index--NGcBYUu.js.map} +1 -1
  219. package/dist/chunks/{index-C33zcyF4.js → index--aPwOFjF.js} +2 -2
  220. package/dist/chunks/{index-C33zcyF4.js.map → index--aPwOFjF.js.map} +1 -1
  221. package/dist/chunks/{index-sMr9qND_.js → index-0VrOtwP0.js} +2 -2
  222. package/dist/chunks/{index-sMr9qND_.js.map → index-0VrOtwP0.js.map} +1 -1
  223. package/dist/chunks/{index-DDKetfKq.js → index-37U271aw.js} +2 -2
  224. package/dist/chunks/{index-DDKetfKq.js.map → index-37U271aw.js.map} +1 -1
  225. package/dist/chunks/{index-B9fS7ir6.js → index-B7qZTuQ-.js} +2 -2
  226. package/dist/chunks/{index-B9fS7ir6.js.map → index-B7qZTuQ-.js.map} +1 -1
  227. package/dist/chunks/{index-CdjBY7L8.js → index-Bedzmqr-.js} +2 -2
  228. package/dist/chunks/{index-CdjBY7L8.js.map → index-Bedzmqr-.js.map} +1 -1
  229. package/dist/chunks/{index-CHG_O1fS.js → index-Betxo5g5.js} +2 -2
  230. package/dist/chunks/{index-CHG_O1fS.js.map → index-Betxo5g5.js.map} +1 -1
  231. package/dist/chunks/{index-jiGu-H8x.js → index-BmaJz475.js} +2 -2
  232. package/dist/chunks/{index-jiGu-H8x.js.map → index-BmaJz475.js.map} +1 -1
  233. package/dist/chunks/{index-C53JoVNk.js → index-Buhqag3v.js} +2 -2
  234. package/dist/chunks/{index-C53JoVNk.js.map → index-Buhqag3v.js.map} +1 -1
  235. package/dist/chunks/{index-DO0Rw7hX.js → index-C3VxlfKq.js} +2 -2
  236. package/dist/chunks/{index-DO0Rw7hX.js.map → index-C3VxlfKq.js.map} +1 -1
  237. package/dist/chunks/{index-CSQ60fpG.js → index-CgpRo8Oe.js} +2 -2
  238. package/dist/chunks/{index-CSQ60fpG.js.map → index-CgpRo8Oe.js.map} +1 -1
  239. package/dist/chunks/{index-B-e-ELsf.js → index-DOY0w8Iu.js} +8 -8
  240. package/dist/chunks/{index-B-e-ELsf.js.map → index-DOY0w8Iu.js.map} +1 -1
  241. package/dist/chunks/{index-D2REDIRX.js → index-DwuvIOrQ.js} +2 -2
  242. package/dist/chunks/{index-D2REDIRX.js.map → index-DwuvIOrQ.js.map} +1 -1
  243. package/dist/chunks/{index-DCcl7Qof.js → index-DzedSLdI.js} +2 -2
  244. package/dist/chunks/{index-DCcl7Qof.js.map → index-DzedSLdI.js.map} +1 -1
  245. package/dist/chunks/{index-2wUhd9Lu.js → index-IgLVXPg8.js} +10 -10
  246. package/dist/chunks/index-IgLVXPg8.js.map +1 -0
  247. package/dist/chunks/{index-CwSaRXXg.js → index-lpIzhufD.js} +1916 -1900
  248. package/dist/chunks/index-lpIzhufD.js.map +1 -0
  249. package/dist/chunks/{index-Cuwn2q-f.js → index-mLUKwbGl.js} +4 -4
  250. package/dist/chunks/{index-Cuwn2q-f.js.map → index-mLUKwbGl.js.map} +1 -1
  251. package/dist/chunks/{index-B0mk2tNY.js → index-tO6MMIFB.js} +2 -2
  252. package/dist/chunks/{index-B0mk2tNY.js.map → index-tO6MMIFB.js.map} +1 -1
  253. package/dist/chunks/{tenantIconMap-BpNANQ5s.js → tenantIconMap-BQD9byc8.js} +2 -2
  254. package/dist/chunks/{tenantIconMap-BpNANQ5s.js.map → tenantIconMap-BQD9byc8.js.map} +1 -1
  255. package/dist/chunks/{tenantIconMap-DtdUgvJO.js → tenantIconMap-CTMuSt18.js} +2 -2
  256. package/dist/chunks/{tenantIconMap-DtdUgvJO.js.map → tenantIconMap-CTMuSt18.js.map} +1 -1
  257. package/dist/chunks/{ticketingApi-Bu4rKwLl.js → ticketingApi-BNIdox5t.js} +2 -2
  258. package/dist/chunks/{ticketingApi-Bu4rKwLl.js.map → ticketingApi-BNIdox5t.js.map} +1 -1
  259. package/dist/chunks/{ticketingApi-r4Avm9iS.js → ticketingApi-J0vC_t7r.js} +2 -2
  260. package/dist/chunks/{ticketingApi-r4Avm9iS.js.map → ticketingApi-J0vC_t7r.js.map} +1 -1
  261. package/dist/chunks/{useAccessRequests-B9bF4swg.js → useAccessRequests-DCNNLnxk.js} +3 -3
  262. package/dist/chunks/{useAccessRequests-B9bF4swg.js.map → useAccessRequests-DCNNLnxk.js.map} +1 -1
  263. package/dist/chunks/{useAccessRequests-JyPUX3Om.js → useAccessRequests-DT7X4FAK.js} +2 -2
  264. package/dist/chunks/{useAccessRequests-JyPUX3Om.js.map → useAccessRequests-DT7X4FAK.js.map} +1 -1
  265. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js → useUserAccessRequests-BYbmG4c7.js} +2 -2
  266. package/dist/chunks/{useUserAccessRequests-DjPQenC2.js.map → useUserAccessRequests-BYbmG4c7.js.map} +1 -1
  267. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js → useUserAccessRequests-CylKxRN6.js} +2 -2
  268. package/dist/chunks/{useUserAccessRequests-BB6FHW14.js.map → useUserAccessRequests-CylKxRN6.js.map} +1 -1
  269. package/dist/hooks/useCollapsibleState.d.ts +5 -2
  270. package/dist/hooks/useCollapsibleState.d.ts.map +1 -1
  271. package/dist/i18n/config.d.ts +1 -0
  272. package/dist/i18n/config.d.ts.map +1 -1
  273. package/dist/main.d.ts +0 -1
  274. package/dist/main.d.ts.map +1 -1
  275. package/dist/smartstack.cjs +1 -1
  276. package/dist/smartstack.js +1 -1
  277. package/dist/utils/permissions.d.ts.map +1 -1
  278. package/package.json +1 -1
  279. package/dist/chunks/index-2wUhd9Lu.js.map +0 -1
  280. package/dist/chunks/index-CwSaRXXg.js.map +0 -1
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),N=require("react"),G=require("react-i18next"),V=require("react-router-dom"),A=require("./index-2wUhd9Lu.js"),r=require("lucide-react"),E={blue:"bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]",green:"bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]",yellow:"bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]",red:"bg-[var(--error-bg)] text-[var(--error-text)] border-[var(--error-border)]",neutral:"bg-[var(--bg-secondary)] text-[var(--text-primary)] border-[var(--border-color)]"};function F(s){return s.status==="NoLicense"||s.isReadOnlyMode?"red":s.isInGracePeriod||s.isInTrial&&s.trialDaysRemaining<=7||s.status==="Active"&&s.daysUntilExpiration<=30?"yellow":s.status==="Active"?"green":"red"}function B(s){if(s.isPerpetual)return"green";const t=s.isInTrial?s.trialDaysRemaining:s.daysUntilExpiration;return t<=15?"red":t<=30?"yellow":"green"}function M(s){return s?new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"long",day:"numeric"}):"-"}function O(s,t){const a=F(s),n=s.isInTrial?s.trialDaysRemaining:s.daysUntilExpiration,i=B(s);return[{label:t("license.info.edition","Edition"),value:t(`license.edition.${s.edition.toLowerCase()}`,s.edition),icon:r.Shield,color:"blue"},{label:t("license.info.status","Status"),value:s.isInGracePeriod?t("license.page.gracePeriod","Grace Period"):t(`license.status.${s.status.toLowerCase()}`,s.status),icon:s.isReadOnlyMode?r.AlertTriangle:r.CheckCircle,color:a},{label:t("license.page.daysRemaining","Days remaining"),value:s.isPerpetual?"∞":n.toString(),icon:s.isPerpetual?r.Infinity:r.Clock,color:i},{label:t("license.page.maxUsers","Max Users"),value:s.limits.users>0?s.limits.users.toString():t("license.page.unlimited","Unlimited"),icon:r.Users,color:"blue"}]}function q({showTrialSuccess:s,isInGracePeriod:t,validationResult:a,gracePeriodDays:n,onTrialSuccessClose:i,onValidationResultClear:l,t:d}){return e.jsxs(e.Fragment,{children:[s&&e.jsxs("div",{className:"flex items-center gap-3 p-4 bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg animate-in fade-in slide-in-from-top",children:[e.jsx(r.CheckCircle,{className:"w-5 h-5 text-green-600 dark:text-green-400 flex-shrink-0"}),e.jsx("div",{className:"flex-1",children:e.jsx("p",{className:"text-sm font-medium text-green-900 dark:text-green-300",children:d("license.trial.successBanner","Your 30-day trial is activated!")})}),e.jsx("button",{onClick:i,className:"text-green-600 dark:text-green-400 hover:text-green-700 dark:hover:text-green-300",children:e.jsx(r.X,{className:"w-4 h-4"})})]}),t&&e.jsxs("div",{className:"flex items-center gap-3 p-4 bg-amber-50 dark:bg-amber-900/20 border border-amber-200 dark:border-amber-800 rounded-lg",children:[e.jsx(r.AlertTriangle,{className:"w-5 h-5 text-amber-600 dark:text-amber-400 flex-shrink-0"}),e.jsx("div",{className:"flex-1",children:e.jsx("p",{className:"text-sm font-medium text-amber-900 dark:text-amber-300",children:d("license.page.gracePeriodBanner","Your license has expired. You are in a {{days}}-day grace period. Renew to avoid service interruption.",{days:n})})})]}),a&&e.jsxs("div",{className:`flex items-center gap-3 p-4 rounded-lg border ${a.type==="success"?"bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800":a.type==="revoked"?"bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800":"bg-amber-50 dark:bg-amber-900/20 border-amber-200 dark:border-amber-800"}`,children:[a.type==="success"?e.jsx(r.CheckCircle,{className:"w-5 h-5 text-green-600 dark:text-green-400 flex-shrink-0"}):e.jsx(r.AlertTriangle,{className:`w-5 h-5 flex-shrink-0 ${a.type==="revoked"?"text-red-600 dark:text-red-400":"text-amber-600 dark:text-amber-400"}`}),e.jsx("p",{className:`text-sm font-medium flex-1 ${a.type==="success"?"text-green-900 dark:text-green-300":a.type==="revoked"?"text-red-900 dark:text-red-300":"text-amber-900 dark:text-amber-300"}`,children:a.message}),e.jsx("button",{onClick:l,className:a.type==="success"?"text-green-600 dark:text-green-400 hover:text-green-700 dark:hover:text-green-300":a.type==="revoked"?"text-red-600 dark:text-red-400 hover:text-red-700 dark:hover:text-red-300":"text-amber-600 dark:text-amber-400 hover:text-amber-700 dark:hover:text-amber-400",children:e.jsx(r.X,{className:"w-4 h-4"})})]})]})}function K({hasAllFeatures:s,enabledFeatures:t,availableFeatures:a,t:n}){return!a||a.length===0?e.jsx("p",{className:"text-[var(--text-secondary)] text-sm italic",children:n("license.page.noFeatures","No features enabled")}):e.jsxs(e.Fragment,{children:[s&&e.jsxs("div",{className:"flex items-center gap-2 p-3 mb-4 bg-[var(--success-bg)] text-[var(--success-text)] rounded-lg border border-[var(--success-border)]",children:[e.jsx(r.CheckCircle,{className:"w-5 h-5"}),e.jsx("span",{className:"font-medium",children:n("license.page.allFeatures","All features enabled")})]}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-6",children:a.map(({group:i,features:l})=>e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-semibold text-[var(--text-secondary)] uppercase tracking-wider mb-3",children:n(`license.group.${i}`,i)}),e.jsx("div",{className:"space-y-2",children:l.map(d=>{const m=s||t.some(c=>c.toLowerCase()===d.toLowerCase());return e.jsxs("div",{className:`flex items-center gap-2 px-3 py-2 rounded-lg border ${m?"bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]":"bg-[var(--bg-secondary)] text-[var(--text-secondary)] border-[var(--border-color)] opacity-60"}`,children:[m?e.jsx(r.Unlock,{className:"w-4 h-4 flex-shrink-0"}):e.jsx(r.Lock,{className:"w-4 h-4 flex-shrink-0"}),e.jsx("span",{className:"text-sm font-medium",children:n(`license.module.${d}`,d)})]},d)})})]},i))}),!s&&t.length===0&&e.jsx("p",{className:"text-[var(--text-secondary)] text-sm italic mt-3",children:n("license.page.noFeatures","No features enabled")})]})}function Y(s,t){const[a,n]=N.useState(!1),[i,l]=N.useState(null),d=N.useCallback(async()=>{n(!0),l(null);try{const c=await A.api.post("/api/administration/license/validate-server");c.revoked?(l({type:"revoked",message:t("license.validationRevoked","The license has been revoked by the server.")}),await s()):c.valid?(l({type:"success",message:t("license.validationSuccess","License is valid")}),await s()):l({type:"error",message:c.error||t("license.validationError","Unable to validate the license with the server.")})}catch{l({type:"error",message:t("license.validationError","Unable to validate the license with the server.")})}finally{n(!1),setTimeout(()=>l(null),5e3)}},[t,s]),m=N.useCallback(()=>l(null),[]);return{isValidating:a,validationResult:i,handleValidate:d,clearValidationResult:m}}function W(){const{t:s}=G.useTranslation("admin"),{license:t,usage:a,isLoading:n,error:i,refreshLicense:l}=A.useLicense(),[d,m]=N.useState(!1),[c,x]=V.useSearchParams(),[b,u]=N.useState(!1),{isValidating:p,validationResult:k,handleValidate:h,clearValidationResult:$}=Y(l,s);if(N.useEffect(()=>{l()},[l]),N.useEffect(()=>{if(c.get("trial")==="success"){u(!0);const o=setTimeout(()=>{u(!1),c.delete("trial"),x(c,{replace:!0})},5e3);return()=>clearTimeout(o)}},[c,x]),n)return e.jsx("div",{className:"flex items-center justify-center h-64",children:e.jsx(r.Loader2,{className:"w-8 h-8 animate-spin text-[var(--text-secondary)]"})});if(i||!t)return e.jsx("div",{className:"p-6",children:e.jsxs("div",{className:"card p-6 text-center",children:[e.jsx(r.AlertTriangle,{className:"w-12 h-12 mx-auto mb-4 text-[var(--warning-text)]"}),e.jsx("h2",{className:"text-lg font-semibold mb-2",children:s("license.page.errorTitle","Unable to load license")}),e.jsx("p",{className:"text-[var(--text-secondary)] mb-4",children:i||s("license.page.errorDesc","License information is not available.")}),e.jsx("button",{onClick:()=>l(),className:"btn-primary px-4 py-2",children:s("common.retry","Retry")})]})});const S=A.hasAllLicenseFeatures(t.enabledFeatures),w=O(t,s);return e.jsxs("div",{className:"p-6 space-y-6",children:[e.jsx(q,{showTrialSuccess:b,isInGracePeriod:t.isInGracePeriod,validationResult:k,gracePeriodDays:t.gracePeriodDays,onTrialSuccessClose:()=>u(!1),onValidationResultClear:$,t:s}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-[var(--text-primary)]",children:s("license.page.title","License Management")}),e.jsx("p",{className:"text-[var(--text-secondary)] mt-1",children:s("license.page.subtitle","View and manage your platform license")})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(A.LicenseStatusBadge,{showDetails:!0}),e.jsxs("button",{onClick:h,disabled:p,className:"btn-secondary px-4 py-2 flex items-center gap-2",children:[p?e.jsx(r.Loader2,{className:"w-4 h-4 animate-spin"}):e.jsx(r.ShieldCheck,{className:"w-4 h-4"}),p?s("license.validating","Validating..."):s("license.validate","Validate")]}),e.jsxs("button",{onClick:()=>m(!0),className:"btn-primary px-4 py-2 flex items-center gap-2",children:[e.jsx(r.Key,{className:"w-4 h-4"}),s("license.activate","Activate")]})]})]}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:w.map(o=>e.jsxs("div",{className:`card p-4 border ${E[o.color]}`,children:[e.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.jsx(o.icon,{className:"w-5 h-5 opacity-80"}),e.jsx("span",{className:"text-sm opacity-80",children:o.label})]}),e.jsx("div",{className:"text-2xl font-bold",children:o.value})]},o.label))}),e.jsxs("div",{className:"card p-6",children:[e.jsxs("h2",{className:"text-lg font-semibold mb-4 flex items-center gap-2",children:[e.jsx(r.Zap,{className:"w-5 h-5"}),s("license.info.limits","Limits")]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[e.jsx(D,{icon:r.Users,label:s("license.page.usersLimit","Users"),max:t.limits.users,current:a?.activeUsers??0,margin:10,t:s}),e.jsx(D,{icon:r.Building,label:s("license.page.tenantsLimit","Tenants (B2B)"),max:t.limits.tenants,current:a?.activeTenants??0,margin:2,t:s})]}),(()=>{const o=["users","tenants","max_instances","max_users"],C=Object.entries(t.limits.custom??{}).filter(([L])=>!o.includes(L));return C.length===0?null:e.jsxs("div",{className:"mt-4 pt-4 border-t border-[var(--border-color)]",children:[e.jsx("h3",{className:"text-sm font-medium text-[var(--text-secondary)] mb-3",children:s("license.page.customLimits","Custom Limits")}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-3",children:C.map(([L,P])=>e.jsxs("div",{className:"flex justify-between items-center py-1.5 px-3 bg-[var(--bg-secondary)] rounded-lg",children:[e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:L}),e.jsx("span",{className:"text-sm font-medium",children:P})]},L))})]})})()]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6",children:[e.jsxs("div",{className:"card p-6",children:[e.jsxs("h2",{className:"text-lg font-semibold mb-4 flex items-center gap-2",children:[e.jsx(r.Calendar,{className:"w-5 h-5"}),s("license.page.details","License Details")]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(g,{label:s("license.info.productId","Product"),value:t.productId}),e.jsx(g,{label:s("license.info.company","Company"),value:t.companyName||"-"}),e.jsx(g,{label:s("license.info.edition","Edition"),value:s(`license.edition.${t.edition.toLowerCase()}`,t.edition)}),e.jsx(g,{label:s("license.info.status","Status"),value:s(`license.status.${t.status.toLowerCase()}`,t.status)}),e.jsx(g,{label:s("license.info.activatedAt","Activated At"),value:M(t.activatedAt)}),e.jsx(g,{label:s("license.info.expiresAt","Expires At"),value:t.isPerpetual?s("license.page.never","Never (Perpetual)"):M(t.expiresAt)})]})]}),e.jsxs("div",{className:"card p-6",children:[e.jsxs("h2",{className:"text-lg font-semibold mb-4 flex items-center gap-2",children:[e.jsx(r.Server,{className:"w-5 h-5"}),s("license.page.subscription","Subscription")]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(g,{label:s("license.page.licenseType","License Type"),value:t.isPerpetual?s("license.page.perpetual","Perpetual"):t.isInTrial?s("license.edition.trial","Trial"):s("license.page.subscription","Subscription")}),e.jsx(g,{label:s("license.page.maxUsers","Max Users"),value:t.limits.users>0?t.limits.users.toString():s("license.page.unlimited","Unlimited")}),e.jsx(g,{label:s("license.page.gracePeriodDays","Grace Period"),value:t.gracePeriodDays>0?s("license.page.gracePeriodValue","{{days}} days",{days:t.gracePeriodDays}):s("license.page.noGracePeriod","None")}),e.jsx(g,{label:s("license.page.renewalDate","Renewal Date"),value:M(t.renewalDate)}),e.jsx(g,{label:s("license.page.mode","Mode"),value:t.isReadOnlyMode?s("license.page.readOnly","Read-only"):t.isInTrial?s("license.edition.trial","Trial"):s("license.page.licensed","Licensed")}),t.isInGracePeriod&&e.jsx(g,{label:s("license.page.gracePeriodStatus","Grace Period Status"),value:s("license.page.inGracePeriod","Active"),highlight:"yellow"})]})]}),e.jsxs("div",{className:"card p-6",children:[e.jsxs("h2",{className:"text-lg font-semibold mb-4 flex items-center gap-2",children:[e.jsx(r.Monitor,{className:"w-5 h-5"}),s("license.page.machineInfo","Machine")]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"py-2 border-b border-[var(--border-color)] last:border-b-0",children:[e.jsx("div",{className:"flex justify-between items-center mb-1",children:e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:s("license.page.machineName","Machine Name")})}),e.jsx("span",{className:"text-xs font-mono text-[var(--text-primary)] break-all",children:t.machineName||"-"})]}),e.jsxs("div",{className:"py-2 border-b border-[var(--border-color)] last:border-b-0",children:[e.jsx("div",{className:"flex justify-between items-center mb-1",children:e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:s("license.page.instanceId","Instance ID")})}),e.jsx("span",{className:"text-xs font-mono text-[var(--text-primary)] break-all",children:t.instanceId||"-"})]}),e.jsxs("div",{className:"py-2 border-b border-[var(--border-color)] last:border-b-0",children:[e.jsx("div",{className:"flex justify-between items-center mb-1",children:e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:s("license.page.licenseId","License ID")})}),e.jsx("span",{className:"text-xs font-mono text-[var(--text-primary)] break-all",children:t.licenseServerId||"-"})]})]})]})]}),e.jsxs("div",{className:"card p-6",children:[e.jsxs("h2",{className:"text-lg font-semibold mb-4 flex items-center gap-2",children:[e.jsx(r.Layers,{className:"w-5 h-5"}),s("license.info.features","Features")]}),e.jsx(K,{hasAllFeatures:S,enabledFeatures:t.enabledFeatures,availableFeatures:t.availableFeatures,t:s})]}),e.jsx(A.LicenseActivationDialog,{open:d,onOpenChange:m})]})}function g({label:s,value:t,highlight:a}){const n=a==="yellow"?"text-amber-600 dark:text-amber-400 font-semibold":a==="red"?"text-red-600 dark:text-red-400 font-semibold":a==="green"?"text-green-600 dark:text-green-400 font-semibold":"text-[var(--text-primary)]";return e.jsxs("div",{className:"flex justify-between items-center py-2 border-b border-[var(--border-color)] last:border-b-0",children:[e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:s}),e.jsx("span",{className:`text-sm font-medium ${n}`,children:t})]})}function X(s,t){return s?"text-red-500":t?"text-amber-500":"text-blue-500"}function Z(s,t){return s?"text-red-500":t?"text-amber-500":"text-[var(--text-primary)]"}function D({icon:s,label:t,max:a,current:n,margin:i=0,t:l}){const d=a<=0,m=a-i,c=a,x=140,b=12,u=(x-b)/2,p=x/2,k=135,h=270,$=c>0?Math.min(1,n/c):0,S=c>0?m/c:1,w=i>0&&n>m&&n<=c,o=n>c;let C="#3b82f6";o?C="#ef4444":w&&(C="#f59e0b");const L="rgba(245, 158, 11, 0.25)",P=f=>{const j=f*Math.PI/180;return{x:p+u*Math.cos(j),y:p+u*Math.sin(j)}},T=f=>{if(f<=0)return"";const j=k+f,y=P(k),v=P(j),I=f>180?1:0;return`M ${y.x} ${y.y} A ${u} ${u} 0 ${I} 1 ${v.x} ${v.y}`},U=c>0?Math.round(n/m*100):0;return d?e.jsxs("div",{className:"flex flex-col items-center gap-3 py-4",children:[e.jsxs("div",{className:"relative",style:{width:x,height:x},children:[e.jsxs("svg",{width:x,height:x,children:[e.jsx("path",{d:T(h),fill:"none",stroke:"var(--bg-tertiary)",strokeWidth:b,strokeLinecap:"round"}),e.jsx("path",{d:T(h),fill:"none",stroke:"#22c55e",strokeWidth:b,strokeLinecap:"round",opacity:.5})]}),e.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center",children:[e.jsx(s,{className:"w-6 h-6 text-green-500 mb-1"}),e.jsx("span",{className:"text-lg font-bold text-green-500",children:"∞"})]})]}),e.jsx("span",{className:"text-sm font-medium text-[var(--text-primary)]",children:t}),e.jsx("span",{className:"text-xs text-[var(--text-secondary)]",children:l("license.page.unlimited","Unlimited")})]}):e.jsxs("div",{className:"flex flex-col items-center gap-3 py-4",children:[e.jsxs("div",{className:"relative",style:{width:x,height:x},children:[e.jsxs("svg",{width:x,height:x,children:[e.jsx("path",{d:T(h),fill:"none",stroke:"var(--bg-tertiary)",strokeWidth:b,strokeLinecap:"round"}),i>0&&(()=>{const f=h*(1-S),j=k+h*S,y=P(j),v=P(k+h),I=f>180?1:0,R=`M ${y.x} ${y.y} A ${u} ${u} 0 ${I} 1 ${v.x} ${v.y}`;return e.jsx("path",{d:R,fill:"none",stroke:L,strokeWidth:b,strokeLinecap:"round"})})(),e.jsx("path",{d:T(h*$),fill:"none",stroke:C,strokeWidth:b,strokeLinecap:"round",style:{transition:"stroke 0.3s, d 0.3s"}}),i>0&&(()=>{const f=k+h*S,j=u-b/2-2,y=u+b/2+2,v=f*Math.PI/180;return e.jsx("line",{x1:p+j*Math.cos(v),y1:p+j*Math.sin(v),x2:p+y*Math.cos(v),y2:p+y*Math.sin(v),stroke:"var(--text-secondary)",strokeWidth:2,strokeLinecap:"round"})})()]}),e.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center",children:[e.jsx(s,{className:`w-5 h-5 mb-0.5 ${X(o,w)}`}),e.jsxs("span",{className:`text-2xl font-bold ${Z(o,w)}`,children:[U,"%"]}),e.jsxs("span",{className:"text-xs text-[var(--text-secondary)]",children:[n," / ",m]})]})]}),e.jsx("span",{className:"text-sm font-medium text-[var(--text-primary)]",children:t}),i>0&&e.jsxs("span",{className:`text-xs ${w||o?"text-amber-600 dark:text-amber-400":"text-[var(--text-secondary)]"}`,children:["+",i," ",l("license.page.tolerance","tolerance")]})]})}exports.LicenseManagementPage=W;
2
- //# sourceMappingURL=index-D2REDIRX.js.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),N=require("react"),G=require("react-i18next"),V=require("react-router-dom"),A=require("./index-IgLVXPg8.js"),r=require("lucide-react"),E={blue:"bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]",green:"bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]",yellow:"bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]",red:"bg-[var(--error-bg)] text-[var(--error-text)] border-[var(--error-border)]",neutral:"bg-[var(--bg-secondary)] text-[var(--text-primary)] border-[var(--border-color)]"};function F(s){return s.status==="NoLicense"||s.isReadOnlyMode?"red":s.isInGracePeriod||s.isInTrial&&s.trialDaysRemaining<=7||s.status==="Active"&&s.daysUntilExpiration<=30?"yellow":s.status==="Active"?"green":"red"}function B(s){if(s.isPerpetual)return"green";const t=s.isInTrial?s.trialDaysRemaining:s.daysUntilExpiration;return t<=15?"red":t<=30?"yellow":"green"}function M(s){return s?new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"long",day:"numeric"}):"-"}function O(s,t){const a=F(s),n=s.isInTrial?s.trialDaysRemaining:s.daysUntilExpiration,i=B(s);return[{label:t("license.info.edition","Edition"),value:t(`license.edition.${s.edition.toLowerCase()}`,s.edition),icon:r.Shield,color:"blue"},{label:t("license.info.status","Status"),value:s.isInGracePeriod?t("license.page.gracePeriod","Grace Period"):t(`license.status.${s.status.toLowerCase()}`,s.status),icon:s.isReadOnlyMode?r.AlertTriangle:r.CheckCircle,color:a},{label:t("license.page.daysRemaining","Days remaining"),value:s.isPerpetual?"∞":n.toString(),icon:s.isPerpetual?r.Infinity:r.Clock,color:i},{label:t("license.page.maxUsers","Max Users"),value:s.limits.users>0?s.limits.users.toString():t("license.page.unlimited","Unlimited"),icon:r.Users,color:"blue"}]}function q({showTrialSuccess:s,isInGracePeriod:t,validationResult:a,gracePeriodDays:n,onTrialSuccessClose:i,onValidationResultClear:l,t:d}){return e.jsxs(e.Fragment,{children:[s&&e.jsxs("div",{className:"flex items-center gap-3 p-4 bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg animate-in fade-in slide-in-from-top",children:[e.jsx(r.CheckCircle,{className:"w-5 h-5 text-green-600 dark:text-green-400 flex-shrink-0"}),e.jsx("div",{className:"flex-1",children:e.jsx("p",{className:"text-sm font-medium text-green-900 dark:text-green-300",children:d("license.trial.successBanner","Your 30-day trial is activated!")})}),e.jsx("button",{onClick:i,className:"text-green-600 dark:text-green-400 hover:text-green-700 dark:hover:text-green-300",children:e.jsx(r.X,{className:"w-4 h-4"})})]}),t&&e.jsxs("div",{className:"flex items-center gap-3 p-4 bg-amber-50 dark:bg-amber-900/20 border border-amber-200 dark:border-amber-800 rounded-lg",children:[e.jsx(r.AlertTriangle,{className:"w-5 h-5 text-amber-600 dark:text-amber-400 flex-shrink-0"}),e.jsx("div",{className:"flex-1",children:e.jsx("p",{className:"text-sm font-medium text-amber-900 dark:text-amber-300",children:d("license.page.gracePeriodBanner","Your license has expired. You are in a {{days}}-day grace period. Renew to avoid service interruption.",{days:n})})})]}),a&&e.jsxs("div",{className:`flex items-center gap-3 p-4 rounded-lg border ${a.type==="success"?"bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800":a.type==="revoked"?"bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800":"bg-amber-50 dark:bg-amber-900/20 border-amber-200 dark:border-amber-800"}`,children:[a.type==="success"?e.jsx(r.CheckCircle,{className:"w-5 h-5 text-green-600 dark:text-green-400 flex-shrink-0"}):e.jsx(r.AlertTriangle,{className:`w-5 h-5 flex-shrink-0 ${a.type==="revoked"?"text-red-600 dark:text-red-400":"text-amber-600 dark:text-amber-400"}`}),e.jsx("p",{className:`text-sm font-medium flex-1 ${a.type==="success"?"text-green-900 dark:text-green-300":a.type==="revoked"?"text-red-900 dark:text-red-300":"text-amber-900 dark:text-amber-300"}`,children:a.message}),e.jsx("button",{onClick:l,className:a.type==="success"?"text-green-600 dark:text-green-400 hover:text-green-700 dark:hover:text-green-300":a.type==="revoked"?"text-red-600 dark:text-red-400 hover:text-red-700 dark:hover:text-red-300":"text-amber-600 dark:text-amber-400 hover:text-amber-700 dark:hover:text-amber-400",children:e.jsx(r.X,{className:"w-4 h-4"})})]})]})}function K({hasAllFeatures:s,enabledFeatures:t,availableFeatures:a,t:n}){return!a||a.length===0?e.jsx("p",{className:"text-[var(--text-secondary)] text-sm italic",children:n("license.page.noFeatures","No features enabled")}):e.jsxs(e.Fragment,{children:[s&&e.jsxs("div",{className:"flex items-center gap-2 p-3 mb-4 bg-[var(--success-bg)] text-[var(--success-text)] rounded-lg border border-[var(--success-border)]",children:[e.jsx(r.CheckCircle,{className:"w-5 h-5"}),e.jsx("span",{className:"font-medium",children:n("license.page.allFeatures","All features enabled")})]}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-6",children:a.map(({group:i,features:l})=>e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-semibold text-[var(--text-secondary)] uppercase tracking-wider mb-3",children:n(`license.group.${i}`,i)}),e.jsx("div",{className:"space-y-2",children:l.map(d=>{const m=s||t.some(c=>c.toLowerCase()===d.toLowerCase());return e.jsxs("div",{className:`flex items-center gap-2 px-3 py-2 rounded-lg border ${m?"bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]":"bg-[var(--bg-secondary)] text-[var(--text-secondary)] border-[var(--border-color)] opacity-60"}`,children:[m?e.jsx(r.Unlock,{className:"w-4 h-4 flex-shrink-0"}):e.jsx(r.Lock,{className:"w-4 h-4 flex-shrink-0"}),e.jsx("span",{className:"text-sm font-medium",children:n(`license.module.${d}`,d)})]},d)})})]},i))}),!s&&t.length===0&&e.jsx("p",{className:"text-[var(--text-secondary)] text-sm italic mt-3",children:n("license.page.noFeatures","No features enabled")})]})}function Y(s,t){const[a,n]=N.useState(!1),[i,l]=N.useState(null),d=N.useCallback(async()=>{n(!0),l(null);try{const c=await A.api.post("/api/administration/license/validate-server");c.revoked?(l({type:"revoked",message:t("license.validationRevoked","The license has been revoked by the server.")}),await s()):c.valid?(l({type:"success",message:t("license.validationSuccess","License is valid")}),await s()):l({type:"error",message:c.error||t("license.validationError","Unable to validate the license with the server.")})}catch{l({type:"error",message:t("license.validationError","Unable to validate the license with the server.")})}finally{n(!1),setTimeout(()=>l(null),5e3)}},[t,s]),m=N.useCallback(()=>l(null),[]);return{isValidating:a,validationResult:i,handleValidate:d,clearValidationResult:m}}function W(){const{t:s}=G.useTranslation("admin"),{license:t,usage:a,isLoading:n,error:i,refreshLicense:l}=A.useLicense(),[d,m]=N.useState(!1),[c,x]=V.useSearchParams(),[b,u]=N.useState(!1),{isValidating:p,validationResult:k,handleValidate:h,clearValidationResult:$}=Y(l,s);if(N.useEffect(()=>{l()},[l]),N.useEffect(()=>{if(c.get("trial")==="success"){u(!0);const o=setTimeout(()=>{u(!1),c.delete("trial"),x(c,{replace:!0})},5e3);return()=>clearTimeout(o)}},[c,x]),n)return e.jsx("div",{className:"flex items-center justify-center h-64",children:e.jsx(r.Loader2,{className:"w-8 h-8 animate-spin text-[var(--text-secondary)]"})});if(i||!t)return e.jsx("div",{className:"p-6",children:e.jsxs("div",{className:"card p-6 text-center",children:[e.jsx(r.AlertTriangle,{className:"w-12 h-12 mx-auto mb-4 text-[var(--warning-text)]"}),e.jsx("h2",{className:"text-lg font-semibold mb-2",children:s("license.page.errorTitle","Unable to load license")}),e.jsx("p",{className:"text-[var(--text-secondary)] mb-4",children:i||s("license.page.errorDesc","License information is not available.")}),e.jsx("button",{onClick:()=>l(),className:"btn-primary px-4 py-2",children:s("common.retry","Retry")})]})});const S=A.hasAllLicenseFeatures(t.enabledFeatures),w=O(t,s);return e.jsxs("div",{className:"p-6 space-y-6",children:[e.jsx(q,{showTrialSuccess:b,isInGracePeriod:t.isInGracePeriod,validationResult:k,gracePeriodDays:t.gracePeriodDays,onTrialSuccessClose:()=>u(!1),onValidationResultClear:$,t:s}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-[var(--text-primary)]",children:s("license.page.title","License Management")}),e.jsx("p",{className:"text-[var(--text-secondary)] mt-1",children:s("license.page.subtitle","View and manage your platform license")})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(A.LicenseStatusBadge,{showDetails:!0}),e.jsxs("button",{onClick:h,disabled:p,className:"btn-secondary px-4 py-2 flex items-center gap-2",children:[p?e.jsx(r.Loader2,{className:"w-4 h-4 animate-spin"}):e.jsx(r.ShieldCheck,{className:"w-4 h-4"}),p?s("license.validating","Validating..."):s("license.validate","Validate")]}),e.jsxs("button",{onClick:()=>m(!0),className:"btn-primary px-4 py-2 flex items-center gap-2",children:[e.jsx(r.Key,{className:"w-4 h-4"}),s("license.activate","Activate")]})]})]}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:w.map(o=>e.jsxs("div",{className:`card p-4 border ${E[o.color]}`,children:[e.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.jsx(o.icon,{className:"w-5 h-5 opacity-80"}),e.jsx("span",{className:"text-sm opacity-80",children:o.label})]}),e.jsx("div",{className:"text-2xl font-bold",children:o.value})]},o.label))}),e.jsxs("div",{className:"card p-6",children:[e.jsxs("h2",{className:"text-lg font-semibold mb-4 flex items-center gap-2",children:[e.jsx(r.Zap,{className:"w-5 h-5"}),s("license.info.limits","Limits")]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[e.jsx(D,{icon:r.Users,label:s("license.page.usersLimit","Users"),max:t.limits.users,current:a?.activeUsers??0,margin:10,t:s}),e.jsx(D,{icon:r.Building,label:s("license.page.tenantsLimit","Tenants (B2B)"),max:t.limits.tenants,current:a?.activeTenants??0,margin:2,t:s})]}),(()=>{const o=["users","tenants","max_instances","max_users"],C=Object.entries(t.limits.custom??{}).filter(([L])=>!o.includes(L));return C.length===0?null:e.jsxs("div",{className:"mt-4 pt-4 border-t border-[var(--border-color)]",children:[e.jsx("h3",{className:"text-sm font-medium text-[var(--text-secondary)] mb-3",children:s("license.page.customLimits","Custom Limits")}),e.jsx("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-3",children:C.map(([L,P])=>e.jsxs("div",{className:"flex justify-between items-center py-1.5 px-3 bg-[var(--bg-secondary)] rounded-lg",children:[e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:L}),e.jsx("span",{className:"text-sm font-medium",children:P})]},L))})]})})()]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6",children:[e.jsxs("div",{className:"card p-6",children:[e.jsxs("h2",{className:"text-lg font-semibold mb-4 flex items-center gap-2",children:[e.jsx(r.Calendar,{className:"w-5 h-5"}),s("license.page.details","License Details")]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(g,{label:s("license.info.productId","Product"),value:t.productId}),e.jsx(g,{label:s("license.info.company","Company"),value:t.companyName||"-"}),e.jsx(g,{label:s("license.info.edition","Edition"),value:s(`license.edition.${t.edition.toLowerCase()}`,t.edition)}),e.jsx(g,{label:s("license.info.status","Status"),value:s(`license.status.${t.status.toLowerCase()}`,t.status)}),e.jsx(g,{label:s("license.info.activatedAt","Activated At"),value:M(t.activatedAt)}),e.jsx(g,{label:s("license.info.expiresAt","Expires At"),value:t.isPerpetual?s("license.page.never","Never (Perpetual)"):M(t.expiresAt)})]})]}),e.jsxs("div",{className:"card p-6",children:[e.jsxs("h2",{className:"text-lg font-semibold mb-4 flex items-center gap-2",children:[e.jsx(r.Server,{className:"w-5 h-5"}),s("license.page.subscription","Subscription")]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(g,{label:s("license.page.licenseType","License Type"),value:t.isPerpetual?s("license.page.perpetual","Perpetual"):t.isInTrial?s("license.edition.trial","Trial"):s("license.page.subscription","Subscription")}),e.jsx(g,{label:s("license.page.maxUsers","Max Users"),value:t.limits.users>0?t.limits.users.toString():s("license.page.unlimited","Unlimited")}),e.jsx(g,{label:s("license.page.gracePeriodDays","Grace Period"),value:t.gracePeriodDays>0?s("license.page.gracePeriodValue","{{days}} days",{days:t.gracePeriodDays}):s("license.page.noGracePeriod","None")}),e.jsx(g,{label:s("license.page.renewalDate","Renewal Date"),value:M(t.renewalDate)}),e.jsx(g,{label:s("license.page.mode","Mode"),value:t.isReadOnlyMode?s("license.page.readOnly","Read-only"):t.isInTrial?s("license.edition.trial","Trial"):s("license.page.licensed","Licensed")}),t.isInGracePeriod&&e.jsx(g,{label:s("license.page.gracePeriodStatus","Grace Period Status"),value:s("license.page.inGracePeriod","Active"),highlight:"yellow"})]})]}),e.jsxs("div",{className:"card p-6",children:[e.jsxs("h2",{className:"text-lg font-semibold mb-4 flex items-center gap-2",children:[e.jsx(r.Monitor,{className:"w-5 h-5"}),s("license.page.machineInfo","Machine")]}),e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"py-2 border-b border-[var(--border-color)] last:border-b-0",children:[e.jsx("div",{className:"flex justify-between items-center mb-1",children:e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:s("license.page.machineName","Machine Name")})}),e.jsx("span",{className:"text-xs font-mono text-[var(--text-primary)] break-all",children:t.machineName||"-"})]}),e.jsxs("div",{className:"py-2 border-b border-[var(--border-color)] last:border-b-0",children:[e.jsx("div",{className:"flex justify-between items-center mb-1",children:e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:s("license.page.instanceId","Instance ID")})}),e.jsx("span",{className:"text-xs font-mono text-[var(--text-primary)] break-all",children:t.instanceId||"-"})]}),e.jsxs("div",{className:"py-2 border-b border-[var(--border-color)] last:border-b-0",children:[e.jsx("div",{className:"flex justify-between items-center mb-1",children:e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:s("license.page.licenseId","License ID")})}),e.jsx("span",{className:"text-xs font-mono text-[var(--text-primary)] break-all",children:t.licenseServerId||"-"})]})]})]})]}),e.jsxs("div",{className:"card p-6",children:[e.jsxs("h2",{className:"text-lg font-semibold mb-4 flex items-center gap-2",children:[e.jsx(r.Layers,{className:"w-5 h-5"}),s("license.info.features","Features")]}),e.jsx(K,{hasAllFeatures:S,enabledFeatures:t.enabledFeatures,availableFeatures:t.availableFeatures,t:s})]}),e.jsx(A.LicenseActivationDialog,{open:d,onOpenChange:m})]})}function g({label:s,value:t,highlight:a}){const n=a==="yellow"?"text-amber-600 dark:text-amber-400 font-semibold":a==="red"?"text-red-600 dark:text-red-400 font-semibold":a==="green"?"text-green-600 dark:text-green-400 font-semibold":"text-[var(--text-primary)]";return e.jsxs("div",{className:"flex justify-between items-center py-2 border-b border-[var(--border-color)] last:border-b-0",children:[e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:s}),e.jsx("span",{className:`text-sm font-medium ${n}`,children:t})]})}function X(s,t){return s?"text-red-500":t?"text-amber-500":"text-blue-500"}function Z(s,t){return s?"text-red-500":t?"text-amber-500":"text-[var(--text-primary)]"}function D({icon:s,label:t,max:a,current:n,margin:i=0,t:l}){const d=a<=0,m=a-i,c=a,x=140,b=12,u=(x-b)/2,p=x/2,k=135,h=270,$=c>0?Math.min(1,n/c):0,S=c>0?m/c:1,w=i>0&&n>m&&n<=c,o=n>c;let C="#3b82f6";o?C="#ef4444":w&&(C="#f59e0b");const L="rgba(245, 158, 11, 0.25)",P=f=>{const j=f*Math.PI/180;return{x:p+u*Math.cos(j),y:p+u*Math.sin(j)}},T=f=>{if(f<=0)return"";const j=k+f,y=P(k),v=P(j),I=f>180?1:0;return`M ${y.x} ${y.y} A ${u} ${u} 0 ${I} 1 ${v.x} ${v.y}`},U=c>0?Math.round(n/m*100):0;return d?e.jsxs("div",{className:"flex flex-col items-center gap-3 py-4",children:[e.jsxs("div",{className:"relative",style:{width:x,height:x},children:[e.jsxs("svg",{width:x,height:x,children:[e.jsx("path",{d:T(h),fill:"none",stroke:"var(--bg-tertiary)",strokeWidth:b,strokeLinecap:"round"}),e.jsx("path",{d:T(h),fill:"none",stroke:"#22c55e",strokeWidth:b,strokeLinecap:"round",opacity:.5})]}),e.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center",children:[e.jsx(s,{className:"w-6 h-6 text-green-500 mb-1"}),e.jsx("span",{className:"text-lg font-bold text-green-500",children:"∞"})]})]}),e.jsx("span",{className:"text-sm font-medium text-[var(--text-primary)]",children:t}),e.jsx("span",{className:"text-xs text-[var(--text-secondary)]",children:l("license.page.unlimited","Unlimited")})]}):e.jsxs("div",{className:"flex flex-col items-center gap-3 py-4",children:[e.jsxs("div",{className:"relative",style:{width:x,height:x},children:[e.jsxs("svg",{width:x,height:x,children:[e.jsx("path",{d:T(h),fill:"none",stroke:"var(--bg-tertiary)",strokeWidth:b,strokeLinecap:"round"}),i>0&&(()=>{const f=h*(1-S),j=k+h*S,y=P(j),v=P(k+h),I=f>180?1:0,R=`M ${y.x} ${y.y} A ${u} ${u} 0 ${I} 1 ${v.x} ${v.y}`;return e.jsx("path",{d:R,fill:"none",stroke:L,strokeWidth:b,strokeLinecap:"round"})})(),e.jsx("path",{d:T(h*$),fill:"none",stroke:C,strokeWidth:b,strokeLinecap:"round",style:{transition:"stroke 0.3s, d 0.3s"}}),i>0&&(()=>{const f=k+h*S,j=u-b/2-2,y=u+b/2+2,v=f*Math.PI/180;return e.jsx("line",{x1:p+j*Math.cos(v),y1:p+j*Math.sin(v),x2:p+y*Math.cos(v),y2:p+y*Math.sin(v),stroke:"var(--text-secondary)",strokeWidth:2,strokeLinecap:"round"})})()]}),e.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center",children:[e.jsx(s,{className:`w-5 h-5 mb-0.5 ${X(o,w)}`}),e.jsxs("span",{className:`text-2xl font-bold ${Z(o,w)}`,children:[U,"%"]}),e.jsxs("span",{className:"text-xs text-[var(--text-secondary)]",children:[n," / ",m]})]})]}),e.jsx("span",{className:"text-sm font-medium text-[var(--text-primary)]",children:t}),i>0&&e.jsxs("span",{className:`text-xs ${w||o?"text-amber-600 dark:text-amber-400":"text-[var(--text-secondary)]"}`,children:["+",i," ",l("license.page.tolerance","tolerance")]})]})}exports.LicenseManagementPage=W;
2
+ //# sourceMappingURL=index-DwuvIOrQ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-D2REDIRX.js","sources":["../../src/pages/platform/administration/configuration/license/LicenseManagementPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { TFunction } from 'i18next';\r\nimport { useSearchParams } from 'react-router-dom';\r\nimport { useLicense } from '@/contexts/LicenseContext';\r\nimport { api } from '@/services/api/apiClient';\r\nimport { hasAllLicenseFeatures } from '@/utils/licenseUtils';\r\nimport { LicenseStatusBadge } from '@/components/license/LicenseStatusBadge';\r\nimport { LicenseActivationDialog } from '@/components/license/LicenseActivationDialog';\r\nimport type { LicenseFeatureGroup } from '@/contexts/LicenseContext';\r\nimport {\r\n Shield, Calendar, Key, Layers, Users, Building, Zap, Server,\r\n CheckCircle, Clock, AlertTriangle, Loader2, X, Infinity,\r\n Lock, Unlock, ShieldCheck, Monitor\r\n} from 'lucide-react';\r\n\r\nconst colorClasses = {\r\n blue: 'bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]',\r\n green: 'bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]',\r\n yellow: 'bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]',\r\n red: 'bg-[var(--error-bg)] text-[var(--error-text)] border-[var(--error-border)]',\r\n neutral: 'bg-[var(--bg-secondary)] text-[var(--text-primary)] border-[var(--border-color)]',\r\n};\r\n\r\nfunction getStatusColor(license: { isReadOnlyMode: boolean; isInTrial: boolean; trialDaysRemaining: number; status: string; daysUntilExpiration: number; isInGracePeriod: boolean }) {\r\n if (license.status === 'NoLicense') return 'red' as const;\r\n if (license.isReadOnlyMode) return 'red' as const;\r\n if (license.isInGracePeriod) return 'yellow' as const;\r\n if (license.isInTrial && license.trialDaysRemaining <= 7) return 'yellow' as const;\r\n if (license.status === 'Active' && license.daysUntilExpiration <= 30) return 'yellow' as const;\r\n if (license.status === 'Active') return 'green' as const;\r\n return 'red' as const;\r\n}\r\n\r\nfunction getLicenseDaysColor(license: { isPerpetual: boolean; isInTrial: boolean; trialDaysRemaining: number; daysUntilExpiration: number }): 'red' | 'yellow' | 'green' {\r\n if (license.isPerpetual) return 'green';\r\n const daysRemaining = license.isInTrial ? license.trialDaysRemaining : license.daysUntilExpiration;\r\n if (daysRemaining <= 15) return 'red';\r\n if (daysRemaining <= 30) return 'yellow';\r\n return 'green';\r\n}\r\n\r\nfunction formatDate(dateStr: string | null): string {\r\n if (!dateStr) return '-';\r\n return new Date(dateStr).toLocaleDateString(undefined, {\r\n year: 'numeric',\r\n month: 'long',\r\n day: 'numeric',\r\n });\r\n}\r\n\r\nfunction buildKpiCards(license: any, t: (key: string, fallback: string, opts?: Record<string, unknown>) => string) {\r\n const statusColor = getStatusColor(license);\r\n const daysRemaining = license.isInTrial ? license.trialDaysRemaining : license.daysUntilExpiration;\r\n const daysColor = getLicenseDaysColor(license);\r\n\r\n return [\r\n {\r\n label: t('license.info.edition', 'Edition'),\r\n value: t(`license.edition.${license.edition.toLowerCase()}`, license.edition),\r\n icon: Shield,\r\n color: 'blue' as const,\r\n },\r\n {\r\n label: t('license.info.status', 'Status'),\r\n value: license.isInGracePeriod\r\n ? t('license.page.gracePeriod', 'Grace Period')\r\n : t(`license.status.${license.status.toLowerCase()}`, license.status),\r\n icon: license.isReadOnlyMode ? AlertTriangle : CheckCircle,\r\n color: statusColor,\r\n },\r\n {\r\n label: t('license.page.daysRemaining', 'Days remaining'),\r\n value: license.isPerpetual ? '\\u221E' : daysRemaining.toString(),\r\n icon: license.isPerpetual ? Infinity : Clock,\r\n color: daysColor,\r\n },\r\n {\r\n label: t('license.page.maxUsers', 'Max Users'),\r\n value: license.limits.users > 0 ? license.limits.users.toString() : t('license.page.unlimited', 'Unlimited'),\r\n icon: Users,\r\n color: 'blue' as const,\r\n },\r\n ];\r\n}\r\n\r\n// Sub-component: Status Banners\r\ninterface StatusBannersProps {\r\n readonly showTrialSuccess: boolean;\r\n readonly isInGracePeriod: boolean;\r\n readonly validationResult: { type: 'success' | 'revoked' | 'error'; message: string } | null;\r\n readonly gracePeriodDays: number;\r\n readonly onTrialSuccessClose: () => void;\r\n readonly onValidationResultClear: () => void;\r\n readonly t: TFunction;\r\n}\r\n\r\nfunction StatusBanners({\r\n showTrialSuccess, isInGracePeriod, validationResult, gracePeriodDays,\r\n onTrialSuccessClose, onValidationResultClear, t\r\n}: StatusBannersProps) {\r\n return (\r\n <>\r\n {showTrialSuccess && (\r\n <div className=\"flex items-center gap-3 p-4 bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg animate-in fade-in slide-in-from-top\">\r\n <CheckCircle className=\"w-5 h-5 text-green-600 dark:text-green-400 flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm font-medium text-green-900 dark:text-green-300\">\r\n {t('license.trial.successBanner', 'Your 30-day trial is activated!')}\r\n </p>\r\n </div>\r\n <button\r\n onClick={onTrialSuccessClose}\r\n className=\"text-green-600 dark:text-green-400 hover:text-green-700 dark:hover:text-green-300\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n )}\r\n\r\n {isInGracePeriod && (\r\n <div className=\"flex items-center gap-3 p-4 bg-amber-50 dark:bg-amber-900/20 border border-amber-200 dark:border-amber-800 rounded-lg\">\r\n <AlertTriangle className=\"w-5 h-5 text-amber-600 dark:text-amber-400 flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm font-medium text-amber-900 dark:text-amber-300\">\r\n {t('license.page.gracePeriodBanner', 'Your license has expired. You are in a {{days}}-day grace period. Renew to avoid service interruption.', { days: gracePeriodDays })}\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {validationResult && (\r\n <div className={`flex items-center gap-3 p-4 rounded-lg border ${\r\n validationResult.type === 'success'\r\n ? 'bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800'\r\n : validationResult.type === 'revoked'\r\n ? 'bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800'\r\n : 'bg-amber-50 dark:bg-amber-900/20 border-amber-200 dark:border-amber-800'\r\n }`}>\r\n {validationResult.type === 'success'\r\n ? <CheckCircle className=\"w-5 h-5 text-green-600 dark:text-green-400 flex-shrink-0\" />\r\n : <AlertTriangle className={`w-5 h-5 flex-shrink-0 ${\r\n validationResult.type === 'revoked'\r\n ? 'text-red-600 dark:text-red-400'\r\n : 'text-amber-600 dark:text-amber-400'\r\n }`} />\r\n }\r\n <p className={`text-sm font-medium flex-1 ${\r\n validationResult.type === 'success'\r\n ? 'text-green-900 dark:text-green-300'\r\n : validationResult.type === 'revoked'\r\n ? 'text-red-900 dark:text-red-300'\r\n : 'text-amber-900 dark:text-amber-300'\r\n }`}>\r\n {validationResult.message}\r\n </p>\r\n <button\r\n onClick={onValidationResultClear}\r\n className={\r\n validationResult.type === 'success'\r\n ? 'text-green-600 dark:text-green-400 hover:text-green-700 dark:hover:text-green-300'\r\n : validationResult.type === 'revoked'\r\n ? 'text-red-600 dark:text-red-400 hover:text-red-700 dark:hover:text-red-300'\r\n : 'text-amber-600 dark:text-amber-400 hover:text-amber-700 dark:hover:text-amber-400'\r\n }\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n )}\r\n </>\r\n );\r\n}\r\n\r\n// Sub-component: Features Grid\r\ninterface FeaturesGridProps {\r\n readonly hasAllFeatures: boolean;\r\n readonly enabledFeatures: string[];\r\n readonly availableFeatures?: LicenseFeatureGroup[];\r\n readonly t: TFunction;\r\n}\r\n\r\nfunction FeaturesGrid({ hasAllFeatures, enabledFeatures, availableFeatures, t }: FeaturesGridProps) {\r\n if (!availableFeatures || availableFeatures.length === 0) {\r\n return (\r\n <p className=\"text-[var(--text-secondary)] text-sm italic\">\r\n {t('license.page.noFeatures', 'No features enabled')}\r\n </p>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {hasAllFeatures && (\r\n <div className=\"flex items-center gap-2 p-3 mb-4 bg-[var(--success-bg)] text-[var(--success-text)] rounded-lg border border-[var(--success-border)]\">\r\n <CheckCircle className=\"w-5 h-5\" />\r\n <span className=\"font-medium\">{t('license.page.allFeatures', 'All features enabled')}</span>\r\n </div>\r\n )}\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\r\n {availableFeatures.map(({ group, features }) => (\r\n <div key={group}>\r\n <h3 className=\"text-sm font-semibold text-[var(--text-secondary)] uppercase tracking-wider mb-3\">\r\n {t(`license.group.${group}`, group)}\r\n </h3>\r\n <div className=\"space-y-2\">\r\n {features.map((code) => {\r\n const enabled = hasAllFeatures || enabledFeatures.some(\r\n f => f.toLowerCase() === code.toLowerCase()\r\n );\r\n return (\r\n <div\r\n key={code}\r\n className={`flex items-center gap-2 px-3 py-2 rounded-lg border ${\r\n enabled\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)] border-[var(--border-color)] opacity-60'\r\n }`}\r\n >\r\n {enabled\r\n ? <Unlock className=\"w-4 h-4 flex-shrink-0\" />\r\n : <Lock className=\"w-4 h-4 flex-shrink-0\" />\r\n }\r\n <span className=\"text-sm font-medium\">{t(`license.module.${code}`, code)}</span>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n {!hasAllFeatures && enabledFeatures.length === 0 && (\r\n <p className=\"text-[var(--text-secondary)] text-sm italic mt-3\">\r\n {t('license.page.noFeatures', 'No features enabled')}\r\n </p>\r\n )}\r\n </>\r\n );\r\n}\r\n\r\nfunction useValidateLicense(refreshLicense: () => Promise<void>, t: (key: string, fallback: string, opts?: Record<string, unknown>) => string) {\r\n const [isValidating, setIsValidating] = useState(false);\r\n const [validationResult, setValidationResult] = useState<{ type: 'success' | 'revoked' | 'error'; message: string } | null>(null);\r\n\r\n const handleValidate = useCallback(async () => {\r\n setIsValidating(true);\r\n setValidationResult(null);\r\n try {\r\n const result = await api.post<{ valid: boolean; revoked: boolean; error?: string }>(\r\n '/api/administration/license/validate-server'\r\n );\r\n if (result.revoked) {\r\n setValidationResult({ type: 'revoked', message: t('license.validationRevoked', 'The license has been revoked by the server.') });\r\n await refreshLicense();\r\n } else if (result.valid) {\r\n setValidationResult({ type: 'success', message: t('license.validationSuccess', 'License is valid') });\r\n await refreshLicense();\r\n } else {\r\n setValidationResult({ type: 'error', message: result.error || t('license.validationError', 'Unable to validate the license with the server.') });\r\n }\r\n } catch {\r\n setValidationResult({ type: 'error', message: t('license.validationError', 'Unable to validate the license with the server.') });\r\n } finally {\r\n setIsValidating(false);\r\n setTimeout(() => setValidationResult(null), 5000);\r\n }\r\n }, [t, refreshLicense]);\r\n\r\n const clearValidationResult = useCallback(() => setValidationResult(null), []);\r\n\r\n return { isValidating, validationResult, handleValidate, clearValidationResult };\r\n}\r\n\r\nexport function LicenseManagementPage(): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const { license, usage, isLoading, error, refreshLicense } = useLicense();\r\n const [showActivation, setShowActivation] = useState(false);\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const [showTrialSuccess, setShowTrialSuccess] = useState(false);\r\n const { isValidating, validationResult, handleValidate, clearValidationResult } = useValidateLicense(refreshLicense, t);\r\n\r\n // Refresh license data when the page is displayed (e.g. after creating a tenant)\r\n useEffect(() => {\r\n refreshLicense();\r\n }, [refreshLicense]);\r\n\r\n useEffect(() => {\r\n if (searchParams.get('trial') === 'success') {\r\n setShowTrialSuccess(true);\r\n const timer = setTimeout(() => {\r\n setShowTrialSuccess(false);\r\n searchParams.delete('trial');\r\n setSearchParams(searchParams, { replace: true });\r\n }, 5000);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [searchParams, setSearchParams]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--text-secondary)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !license) {\r\n return (\r\n <div className=\"p-6\">\r\n <div className=\"card p-6 text-center\">\r\n <AlertTriangle className=\"w-12 h-12 mx-auto mb-4 text-[var(--warning-text)]\" />\r\n <h2 className=\"text-lg font-semibold mb-2\">{t('license.page.errorTitle', 'Unable to load license')}</h2>\r\n <p className=\"text-[var(--text-secondary)] mb-4\">{error || t('license.page.errorDesc', 'License information is not available.')}</p>\r\n <button\r\n onClick={() => refreshLicense()}\r\n className=\"btn-primary px-4 py-2\"\r\n >\r\n {t('common.retry', 'Retry')}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n const hasAllFeatures = hasAllLicenseFeatures(license.enabledFeatures);\r\n const kpiCards = buildKpiCards(license, t);\r\n\r\n return (\r\n <div className=\"p-6 space-y-6\">\r\n <StatusBanners\r\n showTrialSuccess={showTrialSuccess}\r\n isInGracePeriod={license.isInGracePeriod}\r\n validationResult={validationResult}\r\n gracePeriodDays={license.gracePeriodDays}\r\n onTrialSuccessClose={() => setShowTrialSuccess(false)}\r\n onValidationResultClear={clearValidationResult}\r\n t={t}\r\n />\r\n\r\n {/* Banners handled by StatusBanners component above */}\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('license.page.title', 'License Management')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('license.page.subtitle', 'View and manage your platform license')}\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n <LicenseStatusBadge showDetails />\r\n <button\r\n onClick={handleValidate}\r\n disabled={isValidating}\r\n className=\"btn-secondary px-4 py-2 flex items-center gap-2\"\r\n >\r\n {isValidating\r\n ? <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n : <ShieldCheck className=\"w-4 h-4\" />\r\n }\r\n {isValidating\r\n ? t('license.validating', 'Validating...')\r\n : t('license.validate', 'Validate')}\r\n </button>\r\n <button\r\n onClick={() => setShowActivation(true)}\r\n className=\"btn-primary px-4 py-2 flex items-center gap-2\"\r\n >\r\n <Key className=\"w-4 h-4\" />\r\n {t('license.activate', 'Activate')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* KPI Cards */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n {kpiCards.map((card) => (\r\n <div key={card.label} className={`card p-4 border ${colorClasses[card.color]}`}>\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <card.icon className=\"w-5 h-5 opacity-80\" />\r\n <span className=\"text-sm opacity-80\">{card.label}</span>\r\n </div>\r\n <div className=\"text-2xl font-bold\">{card.value}</div>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Limits Section */}\r\n <div className=\"card p-6\">\r\n <h2 className=\"text-lg font-semibold mb-4 flex items-center gap-2\">\r\n <Zap className=\"w-5 h-5\" />\r\n {t('license.info.limits', 'Limits')}\r\n </h2>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n <CircularGauge\r\n icon={Users}\r\n label={t('license.page.usersLimit', 'Users')}\r\n max={license.limits.users}\r\n current={usage?.activeUsers ?? 0}\r\n margin={10}\r\n t={t}\r\n />\r\n <CircularGauge\r\n icon={Building}\r\n label={t('license.page.tenantsLimit', 'Tenants (B2B)')}\r\n max={license.limits.tenants}\r\n current={usage?.activeTenants ?? 0}\r\n margin={2}\r\n t={t}\r\n />\r\n </div>\r\n {/* Custom limits from JWT */}\r\n {(() => {\r\n const standardKeys = ['users', 'tenants', 'max_instances', 'max_users'];\r\n const customEntries = Object.entries(license.limits.custom ?? {}).filter(\r\n ([key]) => !standardKeys.includes(key)\r\n );\r\n if (customEntries.length === 0) return null;\r\n return (\r\n <div className=\"mt-4 pt-4 border-t border-[var(--border-color)]\">\r\n <h3 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3\">\r\n {t('license.page.customLimits', 'Custom Limits')}\r\n </h3>\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-3\">\r\n {customEntries.map(([key, value]) => (\r\n <div key={key} className=\"flex justify-between items-center py-1.5 px-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{key}</span>\r\n <span className=\"text-sm font-medium\">{value}</span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n })()}\r\n </div>\r\n\r\n {/* Details + Subscription + Machine Section */}\r\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\r\n {/* License Details */}\r\n <div className=\"card p-6\">\r\n <h2 className=\"text-lg font-semibold mb-4 flex items-center gap-2\">\r\n <Calendar className=\"w-5 h-5\" />\r\n {t('license.page.details', 'License Details')}\r\n </h2>\r\n <div className=\"space-y-3\">\r\n <DetailRow label={t('license.info.productId', 'Product')} value={license.productId} />\r\n <DetailRow label={t('license.info.company', 'Company')} value={license.companyName || '-'} />\r\n <DetailRow\r\n label={t('license.info.edition', 'Edition')}\r\n value={t(`license.edition.${license.edition.toLowerCase()}`, license.edition)}\r\n />\r\n <DetailRow\r\n label={t('license.info.status', 'Status')}\r\n value={t(`license.status.${license.status.toLowerCase()}`, license.status)}\r\n />\r\n <DetailRow\r\n label={t('license.info.activatedAt', 'Activated At')}\r\n value={formatDate(license.activatedAt)}\r\n />\r\n <DetailRow\r\n label={t('license.info.expiresAt', 'Expires At')}\r\n value={license.isPerpetual\r\n ? t('license.page.never', 'Never (Perpetual)')\r\n : formatDate(license.expiresAt)}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Subscription Info */}\r\n <div className=\"card p-6\">\r\n <h2 className=\"text-lg font-semibold mb-4 flex items-center gap-2\">\r\n <Server className=\"w-5 h-5\" />\r\n {t('license.page.subscription', 'Subscription')}\r\n </h2>\r\n <div className=\"space-y-3\">\r\n <DetailRow\r\n label={t('license.page.licenseType', 'License Type')}\r\n value={license.isPerpetual\r\n ? t('license.page.perpetual', 'Perpetual')\r\n : license.isInTrial\r\n ? t('license.edition.trial', 'Trial')\r\n : t('license.page.subscription', 'Subscription')}\r\n />\r\n <DetailRow\r\n label={t('license.page.maxUsers', 'Max Users')}\r\n value={license.limits.users > 0 ? license.limits.users.toString() : t('license.page.unlimited', 'Unlimited')}\r\n />\r\n <DetailRow\r\n label={t('license.page.gracePeriodDays', 'Grace Period')}\r\n value={license.gracePeriodDays > 0\r\n ? t('license.page.gracePeriodValue', '{{days}} days', { days: license.gracePeriodDays })\r\n : t('license.page.noGracePeriod', 'None')}\r\n />\r\n <DetailRow\r\n label={t('license.page.renewalDate', 'Renewal Date')}\r\n value={formatDate(license.renewalDate)}\r\n />\r\n <DetailRow\r\n label={t('license.page.mode', 'Mode')}\r\n value={license.isReadOnlyMode\r\n ? t('license.page.readOnly', 'Read-only')\r\n : license.isInTrial\r\n ? t('license.edition.trial', 'Trial')\r\n : t('license.page.licensed', 'Licensed')}\r\n />\r\n {license.isInGracePeriod && (\r\n <DetailRow\r\n label={t('license.page.gracePeriodStatus', 'Grace Period Status')}\r\n value={t('license.page.inGracePeriod', 'Active')}\r\n highlight=\"yellow\"\r\n />\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Machine Info */}\r\n <div className=\"card p-6\">\r\n <h2 className=\"text-lg font-semibold mb-4 flex items-center gap-2\">\r\n <Monitor className=\"w-5 h-5\" />\r\n {t('license.page.machineInfo', 'Machine')}\r\n </h2>\r\n <div className=\"space-y-3\">\r\n <div className=\"py-2 border-b border-[var(--border-color)] last:border-b-0\">\r\n <div className=\"flex justify-between items-center mb-1\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{t('license.page.machineName', 'Machine Name')}</span>\r\n </div>\r\n <span className=\"text-xs font-mono text-[var(--text-primary)] break-all\">\r\n {license.machineName || '-'}\r\n </span>\r\n </div>\r\n <div className=\"py-2 border-b border-[var(--border-color)] last:border-b-0\">\r\n <div className=\"flex justify-between items-center mb-1\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{t('license.page.instanceId', 'Instance ID')}</span>\r\n </div>\r\n <span className=\"text-xs font-mono text-[var(--text-primary)] break-all\">\r\n {license.instanceId || '-'}\r\n </span>\r\n </div>\r\n <div className=\"py-2 border-b border-[var(--border-color)] last:border-b-0\">\r\n <div className=\"flex justify-between items-center mb-1\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{t('license.page.licenseId', 'License ID')}</span>\r\n </div>\r\n <span className=\"text-xs font-mono text-[var(--text-primary)] break-all\">\r\n {license.licenseServerId || '-'}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"card p-6\">\r\n <h2 className=\"text-lg font-semibold mb-4 flex items-center gap-2\">\r\n <Layers className=\"w-5 h-5\" />\r\n {t('license.info.features', 'Features')}\r\n </h2>\r\n <FeaturesGrid\r\n hasAllFeatures={hasAllFeatures}\r\n enabledFeatures={license.enabledFeatures}\r\n availableFeatures={license.availableFeatures}\r\n t={t}\r\n />\r\n </div>\r\n\r\n <LicenseActivationDialog open={showActivation} onOpenChange={setShowActivation} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction DetailRow({ label, value, highlight }: { label: string; value: string; highlight?: 'yellow' | 'red' | 'green' }) {\r\n const highlightClass = highlight === 'yellow'\r\n ? 'text-amber-600 dark:text-amber-400 font-semibold'\r\n : highlight === 'red'\r\n ? 'text-red-600 dark:text-red-400 font-semibold'\r\n : highlight === 'green'\r\n ? 'text-green-600 dark:text-green-400 font-semibold'\r\n : 'text-[var(--text-primary)]';\r\n\r\n return (\r\n <div className=\"flex justify-between items-center py-2 border-b border-[var(--border-color)] last:border-b-0\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{label}</span>\r\n <span className={`text-sm font-medium ${highlightClass}`}>{value}</span>\r\n </div>\r\n );\r\n}\r\n\r\nfunction getGaugeIconColor(exceededEffective: boolean, inToleranceZone: boolean): string {\r\n if (exceededEffective) return 'text-red-500';\r\n if (inToleranceZone) return 'text-amber-500';\r\n return 'text-blue-500';\r\n}\r\n\r\nfunction getGaugeTextColor(exceededEffective: boolean, inToleranceZone: boolean): string {\r\n if (exceededEffective) return 'text-red-500';\r\n if (inToleranceZone) return 'text-amber-500';\r\n return 'text-[var(--text-primary)]';\r\n}\r\n\r\nfunction CircularGauge({ icon: Icon, label, max, current, margin = 0, t }: {\r\n icon: typeof Users;\r\n label: string;\r\n max: number;\r\n current: number;\r\n margin?: number;\r\n t: (key: string, fallback: string, opts?: Record<string, unknown>) => string;\r\n}) {\r\n const unlimited = max <= 0;\r\n const licensedLimit = max - margin;\r\n const total = max;\r\n\r\n // SVG arc parameters\r\n const size = 140;\r\n const strokeWidth = 12;\r\n const radius = (size - strokeWidth) / 2;\r\n const center = size / 2;\r\n // Arc spans 270 degrees (from 135° to 405°)\r\n const startAngle = 135;\r\n const totalArc = 270;\r\n\r\n // Percentages\r\n const usagePercent = total > 0 ? Math.min(1, current / total) : 0;\r\n const licensedPercent = total > 0 ? licensedLimit / total : 1;\r\n\r\n // Zone detection\r\n const inToleranceZone = margin > 0 && current > licensedLimit && current <= total;\r\n const exceededEffective = current > total;\r\n\r\n // Colors\r\n let usageColor = '#3b82f6'; // blue-500\r\n if (exceededEffective) usageColor = '#ef4444'; // red-500\r\n else if (inToleranceZone) usageColor = '#f59e0b'; // amber-500\r\n\r\n const toleranceTrackColor = 'rgba(245, 158, 11, 0.25)'; // amber with opacity\r\n\r\n // Helper to compute SVG arc endpoint\r\n const polarToCartesian = (angleDeg: number) => {\r\n const rad = (angleDeg * Math.PI) / 180;\r\n return {\r\n x: center + radius * Math.cos(rad),\r\n y: center + radius * Math.sin(rad),\r\n };\r\n };\r\n\r\n // Build an arc path from startAngle spanning `sweep` degrees\r\n const describeArc = (sweep: number) => {\r\n if (sweep <= 0) return '';\r\n const endAngle = startAngle + sweep;\r\n const start = polarToCartesian(startAngle);\r\n const end = polarToCartesian(endAngle);\r\n const largeArc = sweep > 180 ? 1 : 0;\r\n return `M ${start.x} ${start.y} A ${radius} ${radius} 0 ${largeArc} 1 ${end.x} ${end.y}`;\r\n };\r\n\r\n // Percentage display\r\n const displayPercent = total > 0 ? Math.round((current / licensedLimit) * 100) : 0;\r\n\r\n if (unlimited) {\r\n return (\r\n <div className=\"flex flex-col items-center gap-3 py-4\">\r\n <div className=\"relative\" style={{ width: size, height: size }}>\r\n <svg width={size} height={size}>\r\n {/* Background track */}\r\n <path\r\n d={describeArc(totalArc)}\r\n fill=\"none\"\r\n stroke=\"var(--bg-tertiary)\"\r\n strokeWidth={strokeWidth}\r\n strokeLinecap=\"round\"\r\n />\r\n {/* Full green arc for unlimited */}\r\n <path\r\n d={describeArc(totalArc)}\r\n fill=\"none\"\r\n stroke=\"#22c55e\"\r\n strokeWidth={strokeWidth}\r\n strokeLinecap=\"round\"\r\n opacity={0.5}\r\n />\r\n </svg>\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center\">\r\n <Icon className=\"w-6 h-6 text-green-500 mb-1\" />\r\n <span className=\"text-lg font-bold text-green-500\">&infin;</span>\r\n </div>\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{label}</span>\r\n <span className=\"text-xs text-[var(--text-secondary)]\">{t('license.page.unlimited', 'Unlimited')}</span>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"flex flex-col items-center gap-3 py-4\">\r\n <div className=\"relative\" style={{ width: size, height: size }}>\r\n <svg width={size} height={size}>\r\n {/* Background track */}\r\n <path\r\n d={describeArc(totalArc)}\r\n fill=\"none\"\r\n stroke=\"var(--bg-tertiary)\"\r\n strokeWidth={strokeWidth}\r\n strokeLinecap=\"round\"\r\n />\r\n {/* Tolerance zone: arc from licensed limit to effective limit */}\r\n {margin > 0 && (() => {\r\n const toleranceSweep = totalArc * (1 - licensedPercent);\r\n const toleranceStartAngle = startAngle + totalArc * licensedPercent;\r\n const tStart = polarToCartesian(toleranceStartAngle);\r\n const tEnd = polarToCartesian(startAngle + totalArc);\r\n const largeArc = toleranceSweep > 180 ? 1 : 0;\r\n const tolerancePath = `M ${tStart.x} ${tStart.y} A ${radius} ${radius} 0 ${largeArc} 1 ${tEnd.x} ${tEnd.y}`;\r\n return (\r\n <path\r\n d={tolerancePath}\r\n fill=\"none\"\r\n stroke={toleranceTrackColor}\r\n strokeWidth={strokeWidth}\r\n strokeLinecap=\"round\"\r\n />\r\n );\r\n })()}\r\n {/* Usage arc */}\r\n <path\r\n d={describeArc(totalArc * usagePercent)}\r\n fill=\"none\"\r\n stroke={usageColor}\r\n strokeWidth={strokeWidth}\r\n strokeLinecap=\"round\"\r\n style={{ transition: 'stroke 0.3s, d 0.3s' }}\r\n />\r\n {/* Licensed limit tick mark */}\r\n {margin > 0 && (() => {\r\n const tickAngle = startAngle + totalArc * licensedPercent;\r\n const innerR = radius - strokeWidth / 2 - 2;\r\n const outerR = radius + strokeWidth / 2 + 2;\r\n const rad = (tickAngle * Math.PI) / 180;\r\n return (\r\n <line\r\n x1={center + innerR * Math.cos(rad)}\r\n y1={center + innerR * Math.sin(rad)}\r\n x2={center + outerR * Math.cos(rad)}\r\n y2={center + outerR * Math.sin(rad)}\r\n stroke=\"var(--text-secondary)\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n />\r\n );\r\n })()}\r\n </svg>\r\n {/* Center content */}\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center\">\r\n <Icon className={`w-5 h-5 mb-0.5 ${getGaugeIconColor(exceededEffective, inToleranceZone)}`} />\r\n <span className={`text-2xl font-bold ${getGaugeTextColor(exceededEffective, inToleranceZone)}`}>\r\n {displayPercent}%\r\n </span>\r\n <span className=\"text-xs text-[var(--text-secondary)]\">\r\n {current} / {licensedLimit}\r\n </span>\r\n </div>\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{label}</span>\r\n {margin > 0 && (\r\n <span className={`text-xs ${inToleranceZone || exceededEffective ? 'text-amber-600 dark:text-amber-400' : 'text-[var(--text-secondary)]'}`}>\r\n +{margin} {t('license.page.tolerance', 'tolerance')}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["colorClasses","getStatusColor","license","getLicenseDaysColor","daysRemaining","formatDate","dateStr","buildKpiCards","statusColor","daysColor","Shield","AlertTriangle","CheckCircle","Infinity","Clock","Users","StatusBanners","showTrialSuccess","isInGracePeriod","validationResult","gracePeriodDays","onTrialSuccessClose","onValidationResultClear","t","jsxs","Fragment","jsx","X","FeaturesGrid","hasAllFeatures","enabledFeatures","availableFeatures","group","features","code","enabled","f","Unlock","Lock","useValidateLicense","refreshLicense","isValidating","setIsValidating","useState","setValidationResult","handleValidate","useCallback","result","api","clearValidationResult","LicenseManagementPage","useTranslation","usage","isLoading","error","useLicense","showActivation","setShowActivation","searchParams","setSearchParams","useSearchParams","setShowTrialSuccess","useEffect","timer","Loader2","hasAllLicenseFeatures","kpiCards","LicenseStatusBadge","ShieldCheck","Key","card","Zap","CircularGauge","Building","standardKeys","customEntries","key","value","Calendar","DetailRow","Server","Monitor","Layers","LicenseActivationDialog","label","highlight","highlightClass","getGaugeIconColor","exceededEffective","inToleranceZone","getGaugeTextColor","Icon","max","current","margin","unlimited","licensedLimit","total","size","strokeWidth","radius","center","startAngle","totalArc","usagePercent","licensedPercent","usageColor","toleranceTrackColor","polarToCartesian","angleDeg","rad","describeArc","sweep","endAngle","start","end","largeArc","displayPercent","toleranceSweep","toleranceStartAngle","tStart","tEnd","tolerancePath","tickAngle","innerR","outerR"],"mappings":"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"}
1
+ {"version":3,"file":"index-DwuvIOrQ.js","sources":["../../src/pages/platform/administration/configuration/license/LicenseManagementPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport type { TFunction } from 'i18next';\r\nimport { useSearchParams } from 'react-router-dom';\r\nimport { useLicense } from '@/contexts/LicenseContext';\r\nimport { api } from '@/services/api/apiClient';\r\nimport { hasAllLicenseFeatures } from '@/utils/licenseUtils';\r\nimport { LicenseStatusBadge } from '@/components/license/LicenseStatusBadge';\r\nimport { LicenseActivationDialog } from '@/components/license/LicenseActivationDialog';\r\nimport type { LicenseFeatureGroup } from '@/contexts/LicenseContext';\r\nimport {\r\n Shield, Calendar, Key, Layers, Users, Building, Zap, Server,\r\n CheckCircle, Clock, AlertTriangle, Loader2, X, Infinity,\r\n Lock, Unlock, ShieldCheck, Monitor\r\n} from 'lucide-react';\r\n\r\nconst colorClasses = {\r\n blue: 'bg-[var(--info-bg)] text-[var(--info-text)] border-[var(--info-border)]',\r\n green: 'bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]',\r\n yellow: 'bg-[var(--warning-bg)] text-[var(--warning-text)] border-[var(--warning-border)]',\r\n red: 'bg-[var(--error-bg)] text-[var(--error-text)] border-[var(--error-border)]',\r\n neutral: 'bg-[var(--bg-secondary)] text-[var(--text-primary)] border-[var(--border-color)]',\r\n};\r\n\r\nfunction getStatusColor(license: { isReadOnlyMode: boolean; isInTrial: boolean; trialDaysRemaining: number; status: string; daysUntilExpiration: number; isInGracePeriod: boolean }) {\r\n if (license.status === 'NoLicense') return 'red' as const;\r\n if (license.isReadOnlyMode) return 'red' as const;\r\n if (license.isInGracePeriod) return 'yellow' as const;\r\n if (license.isInTrial && license.trialDaysRemaining <= 7) return 'yellow' as const;\r\n if (license.status === 'Active' && license.daysUntilExpiration <= 30) return 'yellow' as const;\r\n if (license.status === 'Active') return 'green' as const;\r\n return 'red' as const;\r\n}\r\n\r\nfunction getLicenseDaysColor(license: { isPerpetual: boolean; isInTrial: boolean; trialDaysRemaining: number; daysUntilExpiration: number }): 'red' | 'yellow' | 'green' {\r\n if (license.isPerpetual) return 'green';\r\n const daysRemaining = license.isInTrial ? license.trialDaysRemaining : license.daysUntilExpiration;\r\n if (daysRemaining <= 15) return 'red';\r\n if (daysRemaining <= 30) return 'yellow';\r\n return 'green';\r\n}\r\n\r\nfunction formatDate(dateStr: string | null): string {\r\n if (!dateStr) return '-';\r\n return new Date(dateStr).toLocaleDateString(undefined, {\r\n year: 'numeric',\r\n month: 'long',\r\n day: 'numeric',\r\n });\r\n}\r\n\r\nfunction buildKpiCards(license: any, t: (key: string, fallback: string, opts?: Record<string, unknown>) => string) {\r\n const statusColor = getStatusColor(license);\r\n const daysRemaining = license.isInTrial ? license.trialDaysRemaining : license.daysUntilExpiration;\r\n const daysColor = getLicenseDaysColor(license);\r\n\r\n return [\r\n {\r\n label: t('license.info.edition', 'Edition'),\r\n value: t(`license.edition.${license.edition.toLowerCase()}`, license.edition),\r\n icon: Shield,\r\n color: 'blue' as const,\r\n },\r\n {\r\n label: t('license.info.status', 'Status'),\r\n value: license.isInGracePeriod\r\n ? t('license.page.gracePeriod', 'Grace Period')\r\n : t(`license.status.${license.status.toLowerCase()}`, license.status),\r\n icon: license.isReadOnlyMode ? AlertTriangle : CheckCircle,\r\n color: statusColor,\r\n },\r\n {\r\n label: t('license.page.daysRemaining', 'Days remaining'),\r\n value: license.isPerpetual ? '\\u221E' : daysRemaining.toString(),\r\n icon: license.isPerpetual ? Infinity : Clock,\r\n color: daysColor,\r\n },\r\n {\r\n label: t('license.page.maxUsers', 'Max Users'),\r\n value: license.limits.users > 0 ? license.limits.users.toString() : t('license.page.unlimited', 'Unlimited'),\r\n icon: Users,\r\n color: 'blue' as const,\r\n },\r\n ];\r\n}\r\n\r\n// Sub-component: Status Banners\r\ninterface StatusBannersProps {\r\n readonly showTrialSuccess: boolean;\r\n readonly isInGracePeriod: boolean;\r\n readonly validationResult: { type: 'success' | 'revoked' | 'error'; message: string } | null;\r\n readonly gracePeriodDays: number;\r\n readonly onTrialSuccessClose: () => void;\r\n readonly onValidationResultClear: () => void;\r\n readonly t: TFunction;\r\n}\r\n\r\nfunction StatusBanners({\r\n showTrialSuccess, isInGracePeriod, validationResult, gracePeriodDays,\r\n onTrialSuccessClose, onValidationResultClear, t\r\n}: StatusBannersProps) {\r\n return (\r\n <>\r\n {showTrialSuccess && (\r\n <div className=\"flex items-center gap-3 p-4 bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg animate-in fade-in slide-in-from-top\">\r\n <CheckCircle className=\"w-5 h-5 text-green-600 dark:text-green-400 flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm font-medium text-green-900 dark:text-green-300\">\r\n {t('license.trial.successBanner', 'Your 30-day trial is activated!')}\r\n </p>\r\n </div>\r\n <button\r\n onClick={onTrialSuccessClose}\r\n className=\"text-green-600 dark:text-green-400 hover:text-green-700 dark:hover:text-green-300\"\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n )}\r\n\r\n {isInGracePeriod && (\r\n <div className=\"flex items-center gap-3 p-4 bg-amber-50 dark:bg-amber-900/20 border border-amber-200 dark:border-amber-800 rounded-lg\">\r\n <AlertTriangle className=\"w-5 h-5 text-amber-600 dark:text-amber-400 flex-shrink-0\" />\r\n <div className=\"flex-1\">\r\n <p className=\"text-sm font-medium text-amber-900 dark:text-amber-300\">\r\n {t('license.page.gracePeriodBanner', 'Your license has expired. You are in a {{days}}-day grace period. Renew to avoid service interruption.', { days: gracePeriodDays })}\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {validationResult && (\r\n <div className={`flex items-center gap-3 p-4 rounded-lg border ${\r\n validationResult.type === 'success'\r\n ? 'bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800'\r\n : validationResult.type === 'revoked'\r\n ? 'bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800'\r\n : 'bg-amber-50 dark:bg-amber-900/20 border-amber-200 dark:border-amber-800'\r\n }`}>\r\n {validationResult.type === 'success'\r\n ? <CheckCircle className=\"w-5 h-5 text-green-600 dark:text-green-400 flex-shrink-0\" />\r\n : <AlertTriangle className={`w-5 h-5 flex-shrink-0 ${\r\n validationResult.type === 'revoked'\r\n ? 'text-red-600 dark:text-red-400'\r\n : 'text-amber-600 dark:text-amber-400'\r\n }`} />\r\n }\r\n <p className={`text-sm font-medium flex-1 ${\r\n validationResult.type === 'success'\r\n ? 'text-green-900 dark:text-green-300'\r\n : validationResult.type === 'revoked'\r\n ? 'text-red-900 dark:text-red-300'\r\n : 'text-amber-900 dark:text-amber-300'\r\n }`}>\r\n {validationResult.message}\r\n </p>\r\n <button\r\n onClick={onValidationResultClear}\r\n className={\r\n validationResult.type === 'success'\r\n ? 'text-green-600 dark:text-green-400 hover:text-green-700 dark:hover:text-green-300'\r\n : validationResult.type === 'revoked'\r\n ? 'text-red-600 dark:text-red-400 hover:text-red-700 dark:hover:text-red-300'\r\n : 'text-amber-600 dark:text-amber-400 hover:text-amber-700 dark:hover:text-amber-400'\r\n }\r\n >\r\n <X className=\"w-4 h-4\" />\r\n </button>\r\n </div>\r\n )}\r\n </>\r\n );\r\n}\r\n\r\n// Sub-component: Features Grid\r\ninterface FeaturesGridProps {\r\n readonly hasAllFeatures: boolean;\r\n readonly enabledFeatures: string[];\r\n readonly availableFeatures?: LicenseFeatureGroup[];\r\n readonly t: TFunction;\r\n}\r\n\r\nfunction FeaturesGrid({ hasAllFeatures, enabledFeatures, availableFeatures, t }: FeaturesGridProps) {\r\n if (!availableFeatures || availableFeatures.length === 0) {\r\n return (\r\n <p className=\"text-[var(--text-secondary)] text-sm italic\">\r\n {t('license.page.noFeatures', 'No features enabled')}\r\n </p>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n {hasAllFeatures && (\r\n <div className=\"flex items-center gap-2 p-3 mb-4 bg-[var(--success-bg)] text-[var(--success-text)] rounded-lg border border-[var(--success-border)]\">\r\n <CheckCircle className=\"w-5 h-5\" />\r\n <span className=\"font-medium\">{t('license.page.allFeatures', 'All features enabled')}</span>\r\n </div>\r\n )}\r\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\r\n {availableFeatures.map(({ group, features }) => (\r\n <div key={group}>\r\n <h3 className=\"text-sm font-semibold text-[var(--text-secondary)] uppercase tracking-wider mb-3\">\r\n {t(`license.group.${group}`, group)}\r\n </h3>\r\n <div className=\"space-y-2\">\r\n {features.map((code) => {\r\n const enabled = hasAllFeatures || enabledFeatures.some(\r\n f => f.toLowerCase() === code.toLowerCase()\r\n );\r\n return (\r\n <div\r\n key={code}\r\n className={`flex items-center gap-2 px-3 py-2 rounded-lg border ${\r\n enabled\r\n ? 'bg-[var(--success-bg)] text-[var(--success-text)] border-[var(--success-border)]'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-secondary)] border-[var(--border-color)] opacity-60'\r\n }`}\r\n >\r\n {enabled\r\n ? <Unlock className=\"w-4 h-4 flex-shrink-0\" />\r\n : <Lock className=\"w-4 h-4 flex-shrink-0\" />\r\n }\r\n <span className=\"text-sm font-medium\">{t(`license.module.${code}`, code)}</span>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n {!hasAllFeatures && enabledFeatures.length === 0 && (\r\n <p className=\"text-[var(--text-secondary)] text-sm italic mt-3\">\r\n {t('license.page.noFeatures', 'No features enabled')}\r\n </p>\r\n )}\r\n </>\r\n );\r\n}\r\n\r\nfunction useValidateLicense(refreshLicense: () => Promise<void>, t: (key: string, fallback: string, opts?: Record<string, unknown>) => string) {\r\n const [isValidating, setIsValidating] = useState(false);\r\n const [validationResult, setValidationResult] = useState<{ type: 'success' | 'revoked' | 'error'; message: string } | null>(null);\r\n\r\n const handleValidate = useCallback(async () => {\r\n setIsValidating(true);\r\n setValidationResult(null);\r\n try {\r\n const result = await api.post<{ valid: boolean; revoked: boolean; error?: string }>(\r\n '/api/administration/license/validate-server'\r\n );\r\n if (result.revoked) {\r\n setValidationResult({ type: 'revoked', message: t('license.validationRevoked', 'The license has been revoked by the server.') });\r\n await refreshLicense();\r\n } else if (result.valid) {\r\n setValidationResult({ type: 'success', message: t('license.validationSuccess', 'License is valid') });\r\n await refreshLicense();\r\n } else {\r\n setValidationResult({ type: 'error', message: result.error || t('license.validationError', 'Unable to validate the license with the server.') });\r\n }\r\n } catch {\r\n setValidationResult({ type: 'error', message: t('license.validationError', 'Unable to validate the license with the server.') });\r\n } finally {\r\n setIsValidating(false);\r\n setTimeout(() => setValidationResult(null), 5000);\r\n }\r\n }, [t, refreshLicense]);\r\n\r\n const clearValidationResult = useCallback(() => setValidationResult(null), []);\r\n\r\n return { isValidating, validationResult, handleValidate, clearValidationResult };\r\n}\r\n\r\nexport function LicenseManagementPage(): ReactElement | null {\r\n const { t } = useTranslation('admin');\r\n const { license, usage, isLoading, error, refreshLicense } = useLicense();\r\n const [showActivation, setShowActivation] = useState(false);\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const [showTrialSuccess, setShowTrialSuccess] = useState(false);\r\n const { isValidating, validationResult, handleValidate, clearValidationResult } = useValidateLicense(refreshLicense, t);\r\n\r\n // Refresh license data when the page is displayed (e.g. after creating a tenant)\r\n useEffect(() => {\r\n refreshLicense();\r\n }, [refreshLicense]);\r\n\r\n useEffect(() => {\r\n if (searchParams.get('trial') === 'success') {\r\n setShowTrialSuccess(true);\r\n const timer = setTimeout(() => {\r\n setShowTrialSuccess(false);\r\n searchParams.delete('trial');\r\n setSearchParams(searchParams, { replace: true });\r\n }, 5000);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [searchParams, setSearchParams]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex items-center justify-center h-64\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--text-secondary)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (error || !license) {\r\n return (\r\n <div className=\"p-6\">\r\n <div className=\"card p-6 text-center\">\r\n <AlertTriangle className=\"w-12 h-12 mx-auto mb-4 text-[var(--warning-text)]\" />\r\n <h2 className=\"text-lg font-semibold mb-2\">{t('license.page.errorTitle', 'Unable to load license')}</h2>\r\n <p className=\"text-[var(--text-secondary)] mb-4\">{error || t('license.page.errorDesc', 'License information is not available.')}</p>\r\n <button\r\n onClick={() => refreshLicense()}\r\n className=\"btn-primary px-4 py-2\"\r\n >\r\n {t('common.retry', 'Retry')}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n const hasAllFeatures = hasAllLicenseFeatures(license.enabledFeatures);\r\n const kpiCards = buildKpiCards(license, t);\r\n\r\n return (\r\n <div className=\"p-6 space-y-6\">\r\n <StatusBanners\r\n showTrialSuccess={showTrialSuccess}\r\n isInGracePeriod={license.isInGracePeriod}\r\n validationResult={validationResult}\r\n gracePeriodDays={license.gracePeriodDays}\r\n onTrialSuccessClose={() => setShowTrialSuccess(false)}\r\n onValidationResultClear={clearValidationResult}\r\n t={t}\r\n />\r\n\r\n {/* Banners handled by StatusBanners component above */}\r\n\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div>\r\n <h1 className=\"text-2xl font-bold text-[var(--text-primary)]\">\r\n {t('license.page.title', 'License Management')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('license.page.subtitle', 'View and manage your platform license')}\r\n </p>\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n <LicenseStatusBadge showDetails />\r\n <button\r\n onClick={handleValidate}\r\n disabled={isValidating}\r\n className=\"btn-secondary px-4 py-2 flex items-center gap-2\"\r\n >\r\n {isValidating\r\n ? <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n : <ShieldCheck className=\"w-4 h-4\" />\r\n }\r\n {isValidating\r\n ? t('license.validating', 'Validating...')\r\n : t('license.validate', 'Validate')}\r\n </button>\r\n <button\r\n onClick={() => setShowActivation(true)}\r\n className=\"btn-primary px-4 py-2 flex items-center gap-2\"\r\n >\r\n <Key className=\"w-4 h-4\" />\r\n {t('license.activate', 'Activate')}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* KPI Cards */}\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\r\n {kpiCards.map((card) => (\r\n <div key={card.label} className={`card p-4 border ${colorClasses[card.color]}`}>\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <card.icon className=\"w-5 h-5 opacity-80\" />\r\n <span className=\"text-sm opacity-80\">{card.label}</span>\r\n </div>\r\n <div className=\"text-2xl font-bold\">{card.value}</div>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n {/* Limits Section */}\r\n <div className=\"card p-6\">\r\n <h2 className=\"text-lg font-semibold mb-4 flex items-center gap-2\">\r\n <Zap className=\"w-5 h-5\" />\r\n {t('license.info.limits', 'Limits')}\r\n </h2>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\r\n <CircularGauge\r\n icon={Users}\r\n label={t('license.page.usersLimit', 'Users')}\r\n max={license.limits.users}\r\n current={usage?.activeUsers ?? 0}\r\n margin={10}\r\n t={t}\r\n />\r\n <CircularGauge\r\n icon={Building}\r\n label={t('license.page.tenantsLimit', 'Tenants (B2B)')}\r\n max={license.limits.tenants}\r\n current={usage?.activeTenants ?? 0}\r\n margin={2}\r\n t={t}\r\n />\r\n </div>\r\n {/* Custom limits from JWT */}\r\n {(() => {\r\n const standardKeys = ['users', 'tenants', 'max_instances', 'max_users'];\r\n const customEntries = Object.entries(license.limits.custom ?? {}).filter(\r\n ([key]) => !standardKeys.includes(key)\r\n );\r\n if (customEntries.length === 0) return null;\r\n return (\r\n <div className=\"mt-4 pt-4 border-t border-[var(--border-color)]\">\r\n <h3 className=\"text-sm font-medium text-[var(--text-secondary)] mb-3\">\r\n {t('license.page.customLimits', 'Custom Limits')}\r\n </h3>\r\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-3\">\r\n {customEntries.map(([key, value]) => (\r\n <div key={key} className=\"flex justify-between items-center py-1.5 px-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{key}</span>\r\n <span className=\"text-sm font-medium\">{value}</span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n })()}\r\n </div>\r\n\r\n {/* Details + Subscription + Machine Section */}\r\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\r\n {/* License Details */}\r\n <div className=\"card p-6\">\r\n <h2 className=\"text-lg font-semibold mb-4 flex items-center gap-2\">\r\n <Calendar className=\"w-5 h-5\" />\r\n {t('license.page.details', 'License Details')}\r\n </h2>\r\n <div className=\"space-y-3\">\r\n <DetailRow label={t('license.info.productId', 'Product')} value={license.productId} />\r\n <DetailRow label={t('license.info.company', 'Company')} value={license.companyName || '-'} />\r\n <DetailRow\r\n label={t('license.info.edition', 'Edition')}\r\n value={t(`license.edition.${license.edition.toLowerCase()}`, license.edition)}\r\n />\r\n <DetailRow\r\n label={t('license.info.status', 'Status')}\r\n value={t(`license.status.${license.status.toLowerCase()}`, license.status)}\r\n />\r\n <DetailRow\r\n label={t('license.info.activatedAt', 'Activated At')}\r\n value={formatDate(license.activatedAt)}\r\n />\r\n <DetailRow\r\n label={t('license.info.expiresAt', 'Expires At')}\r\n value={license.isPerpetual\r\n ? t('license.page.never', 'Never (Perpetual)')\r\n : formatDate(license.expiresAt)}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Subscription Info */}\r\n <div className=\"card p-6\">\r\n <h2 className=\"text-lg font-semibold mb-4 flex items-center gap-2\">\r\n <Server className=\"w-5 h-5\" />\r\n {t('license.page.subscription', 'Subscription')}\r\n </h2>\r\n <div className=\"space-y-3\">\r\n <DetailRow\r\n label={t('license.page.licenseType', 'License Type')}\r\n value={license.isPerpetual\r\n ? t('license.page.perpetual', 'Perpetual')\r\n : license.isInTrial\r\n ? t('license.edition.trial', 'Trial')\r\n : t('license.page.subscription', 'Subscription')}\r\n />\r\n <DetailRow\r\n label={t('license.page.maxUsers', 'Max Users')}\r\n value={license.limits.users > 0 ? license.limits.users.toString() : t('license.page.unlimited', 'Unlimited')}\r\n />\r\n <DetailRow\r\n label={t('license.page.gracePeriodDays', 'Grace Period')}\r\n value={license.gracePeriodDays > 0\r\n ? t('license.page.gracePeriodValue', '{{days}} days', { days: license.gracePeriodDays })\r\n : t('license.page.noGracePeriod', 'None')}\r\n />\r\n <DetailRow\r\n label={t('license.page.renewalDate', 'Renewal Date')}\r\n value={formatDate(license.renewalDate)}\r\n />\r\n <DetailRow\r\n label={t('license.page.mode', 'Mode')}\r\n value={license.isReadOnlyMode\r\n ? t('license.page.readOnly', 'Read-only')\r\n : license.isInTrial\r\n ? t('license.edition.trial', 'Trial')\r\n : t('license.page.licensed', 'Licensed')}\r\n />\r\n {license.isInGracePeriod && (\r\n <DetailRow\r\n label={t('license.page.gracePeriodStatus', 'Grace Period Status')}\r\n value={t('license.page.inGracePeriod', 'Active')}\r\n highlight=\"yellow\"\r\n />\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Machine Info */}\r\n <div className=\"card p-6\">\r\n <h2 className=\"text-lg font-semibold mb-4 flex items-center gap-2\">\r\n <Monitor className=\"w-5 h-5\" />\r\n {t('license.page.machineInfo', 'Machine')}\r\n </h2>\r\n <div className=\"space-y-3\">\r\n <div className=\"py-2 border-b border-[var(--border-color)] last:border-b-0\">\r\n <div className=\"flex justify-between items-center mb-1\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{t('license.page.machineName', 'Machine Name')}</span>\r\n </div>\r\n <span className=\"text-xs font-mono text-[var(--text-primary)] break-all\">\r\n {license.machineName || '-'}\r\n </span>\r\n </div>\r\n <div className=\"py-2 border-b border-[var(--border-color)] last:border-b-0\">\r\n <div className=\"flex justify-between items-center mb-1\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{t('license.page.instanceId', 'Instance ID')}</span>\r\n </div>\r\n <span className=\"text-xs font-mono text-[var(--text-primary)] break-all\">\r\n {license.instanceId || '-'}\r\n </span>\r\n </div>\r\n <div className=\"py-2 border-b border-[var(--border-color)] last:border-b-0\">\r\n <div className=\"flex justify-between items-center mb-1\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{t('license.page.licenseId', 'License ID')}</span>\r\n </div>\r\n <span className=\"text-xs font-mono text-[var(--text-primary)] break-all\">\r\n {license.licenseServerId || '-'}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"card p-6\">\r\n <h2 className=\"text-lg font-semibold mb-4 flex items-center gap-2\">\r\n <Layers className=\"w-5 h-5\" />\r\n {t('license.info.features', 'Features')}\r\n </h2>\r\n <FeaturesGrid\r\n hasAllFeatures={hasAllFeatures}\r\n enabledFeatures={license.enabledFeatures}\r\n availableFeatures={license.availableFeatures}\r\n t={t}\r\n />\r\n </div>\r\n\r\n <LicenseActivationDialog open={showActivation} onOpenChange={setShowActivation} />\r\n </div>\r\n );\r\n}\r\n\r\nfunction DetailRow({ label, value, highlight }: { label: string; value: string; highlight?: 'yellow' | 'red' | 'green' }) {\r\n const highlightClass = highlight === 'yellow'\r\n ? 'text-amber-600 dark:text-amber-400 font-semibold'\r\n : highlight === 'red'\r\n ? 'text-red-600 dark:text-red-400 font-semibold'\r\n : highlight === 'green'\r\n ? 'text-green-600 dark:text-green-400 font-semibold'\r\n : 'text-[var(--text-primary)]';\r\n\r\n return (\r\n <div className=\"flex justify-between items-center py-2 border-b border-[var(--border-color)] last:border-b-0\">\r\n <span className=\"text-sm text-[var(--text-secondary)]\">{label}</span>\r\n <span className={`text-sm font-medium ${highlightClass}`}>{value}</span>\r\n </div>\r\n );\r\n}\r\n\r\nfunction getGaugeIconColor(exceededEffective: boolean, inToleranceZone: boolean): string {\r\n if (exceededEffective) return 'text-red-500';\r\n if (inToleranceZone) return 'text-amber-500';\r\n return 'text-blue-500';\r\n}\r\n\r\nfunction getGaugeTextColor(exceededEffective: boolean, inToleranceZone: boolean): string {\r\n if (exceededEffective) return 'text-red-500';\r\n if (inToleranceZone) return 'text-amber-500';\r\n return 'text-[var(--text-primary)]';\r\n}\r\n\r\nfunction CircularGauge({ icon: Icon, label, max, current, margin = 0, t }: {\r\n icon: typeof Users;\r\n label: string;\r\n max: number;\r\n current: number;\r\n margin?: number;\r\n t: (key: string, fallback: string, opts?: Record<string, unknown>) => string;\r\n}) {\r\n const unlimited = max <= 0;\r\n const licensedLimit = max - margin;\r\n const total = max;\r\n\r\n // SVG arc parameters\r\n const size = 140;\r\n const strokeWidth = 12;\r\n const radius = (size - strokeWidth) / 2;\r\n const center = size / 2;\r\n // Arc spans 270 degrees (from 135° to 405°)\r\n const startAngle = 135;\r\n const totalArc = 270;\r\n\r\n // Percentages\r\n const usagePercent = total > 0 ? Math.min(1, current / total) : 0;\r\n const licensedPercent = total > 0 ? licensedLimit / total : 1;\r\n\r\n // Zone detection\r\n const inToleranceZone = margin > 0 && current > licensedLimit && current <= total;\r\n const exceededEffective = current > total;\r\n\r\n // Colors\r\n let usageColor = '#3b82f6'; // blue-500\r\n if (exceededEffective) usageColor = '#ef4444'; // red-500\r\n else if (inToleranceZone) usageColor = '#f59e0b'; // amber-500\r\n\r\n const toleranceTrackColor = 'rgba(245, 158, 11, 0.25)'; // amber with opacity\r\n\r\n // Helper to compute SVG arc endpoint\r\n const polarToCartesian = (angleDeg: number) => {\r\n const rad = (angleDeg * Math.PI) / 180;\r\n return {\r\n x: center + radius * Math.cos(rad),\r\n y: center + radius * Math.sin(rad),\r\n };\r\n };\r\n\r\n // Build an arc path from startAngle spanning `sweep` degrees\r\n const describeArc = (sweep: number) => {\r\n if (sweep <= 0) return '';\r\n const endAngle = startAngle + sweep;\r\n const start = polarToCartesian(startAngle);\r\n const end = polarToCartesian(endAngle);\r\n const largeArc = sweep > 180 ? 1 : 0;\r\n return `M ${start.x} ${start.y} A ${radius} ${radius} 0 ${largeArc} 1 ${end.x} ${end.y}`;\r\n };\r\n\r\n // Percentage display\r\n const displayPercent = total > 0 ? Math.round((current / licensedLimit) * 100) : 0;\r\n\r\n if (unlimited) {\r\n return (\r\n <div className=\"flex flex-col items-center gap-3 py-4\">\r\n <div className=\"relative\" style={{ width: size, height: size }}>\r\n <svg width={size} height={size}>\r\n {/* Background track */}\r\n <path\r\n d={describeArc(totalArc)}\r\n fill=\"none\"\r\n stroke=\"var(--bg-tertiary)\"\r\n strokeWidth={strokeWidth}\r\n strokeLinecap=\"round\"\r\n />\r\n {/* Full green arc for unlimited */}\r\n <path\r\n d={describeArc(totalArc)}\r\n fill=\"none\"\r\n stroke=\"#22c55e\"\r\n strokeWidth={strokeWidth}\r\n strokeLinecap=\"round\"\r\n opacity={0.5}\r\n />\r\n </svg>\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center\">\r\n <Icon className=\"w-6 h-6 text-green-500 mb-1\" />\r\n <span className=\"text-lg font-bold text-green-500\">&infin;</span>\r\n </div>\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{label}</span>\r\n <span className=\"text-xs text-[var(--text-secondary)]\">{t('license.page.unlimited', 'Unlimited')}</span>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"flex flex-col items-center gap-3 py-4\">\r\n <div className=\"relative\" style={{ width: size, height: size }}>\r\n <svg width={size} height={size}>\r\n {/* Background track */}\r\n <path\r\n d={describeArc(totalArc)}\r\n fill=\"none\"\r\n stroke=\"var(--bg-tertiary)\"\r\n strokeWidth={strokeWidth}\r\n strokeLinecap=\"round\"\r\n />\r\n {/* Tolerance zone: arc from licensed limit to effective limit */}\r\n {margin > 0 && (() => {\r\n const toleranceSweep = totalArc * (1 - licensedPercent);\r\n const toleranceStartAngle = startAngle + totalArc * licensedPercent;\r\n const tStart = polarToCartesian(toleranceStartAngle);\r\n const tEnd = polarToCartesian(startAngle + totalArc);\r\n const largeArc = toleranceSweep > 180 ? 1 : 0;\r\n const tolerancePath = `M ${tStart.x} ${tStart.y} A ${radius} ${radius} 0 ${largeArc} 1 ${tEnd.x} ${tEnd.y}`;\r\n return (\r\n <path\r\n d={tolerancePath}\r\n fill=\"none\"\r\n stroke={toleranceTrackColor}\r\n strokeWidth={strokeWidth}\r\n strokeLinecap=\"round\"\r\n />\r\n );\r\n })()}\r\n {/* Usage arc */}\r\n <path\r\n d={describeArc(totalArc * usagePercent)}\r\n fill=\"none\"\r\n stroke={usageColor}\r\n strokeWidth={strokeWidth}\r\n strokeLinecap=\"round\"\r\n style={{ transition: 'stroke 0.3s, d 0.3s' }}\r\n />\r\n {/* Licensed limit tick mark */}\r\n {margin > 0 && (() => {\r\n const tickAngle = startAngle + totalArc * licensedPercent;\r\n const innerR = radius - strokeWidth / 2 - 2;\r\n const outerR = radius + strokeWidth / 2 + 2;\r\n const rad = (tickAngle * Math.PI) / 180;\r\n return (\r\n <line\r\n x1={center + innerR * Math.cos(rad)}\r\n y1={center + innerR * Math.sin(rad)}\r\n x2={center + outerR * Math.cos(rad)}\r\n y2={center + outerR * Math.sin(rad)}\r\n stroke=\"var(--text-secondary)\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n />\r\n );\r\n })()}\r\n </svg>\r\n {/* Center content */}\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center\">\r\n <Icon className={`w-5 h-5 mb-0.5 ${getGaugeIconColor(exceededEffective, inToleranceZone)}`} />\r\n <span className={`text-2xl font-bold ${getGaugeTextColor(exceededEffective, inToleranceZone)}`}>\r\n {displayPercent}%\r\n </span>\r\n <span className=\"text-xs text-[var(--text-secondary)]\">\r\n {current} / {licensedLimit}\r\n </span>\r\n </div>\r\n </div>\r\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">{label}</span>\r\n {margin > 0 && (\r\n <span className={`text-xs ${inToleranceZone || exceededEffective ? 'text-amber-600 dark:text-amber-400' : 'text-[var(--text-secondary)]'}`}>\r\n +{margin} {t('license.page.tolerance', 'tolerance')}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"names":["colorClasses","getStatusColor","license","getLicenseDaysColor","daysRemaining","formatDate","dateStr","buildKpiCards","statusColor","daysColor","Shield","AlertTriangle","CheckCircle","Infinity","Clock","Users","StatusBanners","showTrialSuccess","isInGracePeriod","validationResult","gracePeriodDays","onTrialSuccessClose","onValidationResultClear","t","jsxs","Fragment","jsx","X","FeaturesGrid","hasAllFeatures","enabledFeatures","availableFeatures","group","features","code","enabled","f","Unlock","Lock","useValidateLicense","refreshLicense","isValidating","setIsValidating","useState","setValidationResult","handleValidate","useCallback","result","api","clearValidationResult","LicenseManagementPage","useTranslation","usage","isLoading","error","useLicense","showActivation","setShowActivation","searchParams","setSearchParams","useSearchParams","setShowTrialSuccess","useEffect","timer","Loader2","hasAllLicenseFeatures","kpiCards","LicenseStatusBadge","ShieldCheck","Key","card","Zap","CircularGauge","Building","standardKeys","customEntries","key","value","Calendar","DetailRow","Server","Monitor","Layers","LicenseActivationDialog","label","highlight","highlightClass","getGaugeIconColor","exceededEffective","inToleranceZone","getGaugeTextColor","Icon","max","current","margin","unlimited","licensedLimit","total","size","strokeWidth","radius","center","startAngle","totalArc","usagePercent","licensedPercent","usageColor","toleranceTrackColor","polarToCartesian","angleDeg","rad","describeArc","sweep","endAngle","start","end","largeArc","displayPercent","toleranceSweep","toleranceStartAngle","tStart","tEnd","tolerancePath","tickAngle","innerR","outerR"],"mappings":"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"}