@atlashub/smartstack 3.30.0 → 3.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AgentSkillsPage-CVq3qZoe.js → AgentSkillsPage-CDMhqrhE.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-CVq3qZoe.js.map → AgentSkillsPage-CDMhqrhE.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-DJb49NMA.js → AgentSkillsPage-DcvOMm5k.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-DJb49NMA.js.map → AgentSkillsPage-DcvOMm5k.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-D_nk3gKj.js → AgentWorkloadPage-DYBPNzjQ.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-D_nk3gKj.js.map → AgentWorkloadPage-DYBPNzjQ.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-oHEi-sFh.js → AgentWorkloadPage-YpJSDaWc.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-oHEi-sFh.js.map → AgentWorkloadPage-YpJSDaWc.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-Cr0q2HnB.js → ApiCatalogDetailPage-9r1axtCg.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-Cr0q2HnB.js.map → ApiCatalogDetailPage-9r1axtCg.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-DX8buBkV.js → ApiCatalogDetailPage-TjCQ8_A8.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-DX8buBkV.js.map → ApiCatalogDetailPage-TjCQ8_A8.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-DqboIzZE.js → ApiCatalogPage-COxazTnz.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-DqboIzZE.js.map → ApiCatalogPage-COxazTnz.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-DN7sazvI.js → ApiCatalogPage-QRysH0pT.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-DN7sazvI.js.map → ApiCatalogPage-QRysH0pT.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-CCNjr64K.js → ApplicationDetailPage-Dbx01Ikm.js} +4 -4
- package/dist/chunks/{ApplicationDetailPage-CCNjr64K.js.map → ApplicationDetailPage-Dbx01Ikm.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage--9YwwS5A.js → ApplicationDetailPage-jSHy3MPz.js} +2 -2
- package/dist/chunks/{ApplicationDetailPage--9YwwS5A.js.map → ApplicationDetailPage-jSHy3MPz.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-Bs-Xgca4.js → ApplicationsDashboardPage-CclKc0wI.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-Bs-Xgca4.js.map → ApplicationsDashboardPage-CclKc0wI.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-BSsHN3Yj.js → ApplicationsDashboardPage-CxWmOc1x.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-BSsHN3Yj.js.map → ApplicationsDashboardPage-CxWmOc1x.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-s1WEzOXS.js → ApplicationsGridPage-BJXWXwyI.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-s1WEzOXS.js.map → ApplicationsGridPage-BJXWXwyI.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-DDysNWJ5.js → ApplicationsGridPage-D2l8cM3o.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-DDysNWJ5.js.map → ApplicationsGridPage-D2l8cM3o.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-B3CSMiV0.js → ApplicationsListPage-CMosl3my.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-B3CSMiV0.js.map → ApplicationsListPage-CMosl3my.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-B6ZCecIl.js → ApplicationsListPage-Dc6NGQ61.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-B6ZCecIl.js.map → ApplicationsListPage-Dc6NGQ61.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-BBaiBM--.js → ApplicationsPage-DH7tpMlF.js} +2 -2
- package/dist/chunks/{ApplicationsPage-BBaiBM--.js.map → ApplicationsPage-DH7tpMlF.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-ztPwoAGt.js → ApplicationsPage-DI-iMqoJ.js} +4 -4
- package/dist/chunks/{ApplicationsPage-ztPwoAGt.js.map → ApplicationsPage-DI-iMqoJ.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-DFSVFFXr.js → AssignmentRulesPage-B5UbujbZ.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-DFSVFFXr.js.map → AssignmentRulesPage-B5UbujbZ.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-CK4L4rBO.js → AssignmentRulesPage-E79QBSLb.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-CK4L4rBO.js.map → AssignmentRulesPage-E79QBSLb.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-JCLpyg94.js → AssignmentsPage-CDFaL1gT.js} +2 -2
- package/dist/chunks/{AssignmentsPage-JCLpyg94.js.map → AssignmentsPage-CDFaL1gT.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-Bp7oQD7Q.js → AssignmentsPage-CPeKJjyK.js} +2 -2
- package/dist/chunks/{AssignmentsPage-Bp7oQD7Q.js.map → AssignmentsPage-CPeKJjyK.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-Bl9xlJ3h.js → AuthCallbackPage-BZ3Ocos5.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-Bl9xlJ3h.js.map → AuthCallbackPage-BZ3Ocos5.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-CzMHz4jy.js → AuthCallbackPage-Bml48QpH.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-CzMHz4jy.js.map → AuthCallbackPage-Bml48QpH.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-M7mJgXvn.js → ConfirmEmailPage-DP1XPaKK.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-M7mJgXvn.js.map → ConfirmEmailPage-DP1XPaKK.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-D_8T1vqV.js → ConfirmEmailPage-DyzslZ06.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-D_8T1vqV.js.map → ConfirmEmailPage-DyzslZ06.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-BNEGavlu.js → CreateSupportTicketPage-Bz2KrMik.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-BNEGavlu.js.map → CreateSupportTicketPage-Bz2KrMik.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-C2X2mfds.js → CreateSupportTicketPage-hKjKM0Bh.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-C2X2mfds.js.map → CreateSupportTicketPage-hKjKM0Bh.js.map} +1 -1
- package/dist/chunks/{DashboardPage-4oy2YqvT.js → DashboardPage-B4nAd8Tj.js} +2 -2
- package/dist/chunks/{DashboardPage-4oy2YqvT.js.map → DashboardPage-B4nAd8Tj.js.map} +1 -1
- package/dist/chunks/{DashboardPage-D5MRMxEV.js → DashboardPage-C9qgPBS-.js} +3 -3
- package/dist/chunks/{DashboardPage-D5MRMxEV.js.map → DashboardPage-C9qgPBS-.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CO-8B8EI.js → DashboardPage-CjbNGMo1.js} +3 -3
- package/dist/chunks/{DashboardPage-CO-8B8EI.js.map → DashboardPage-CjbNGMo1.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CPArUG-S.js → DashboardPage-rN7IFlTR.js} +2 -2
- package/dist/chunks/{DashboardPage-CPArUG-S.js.map → DashboardPage-rN7IFlTR.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-DnjLFXnL.js → EscalationConfigPage-CGv2L62M.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-DnjLFXnL.js.map → EscalationConfigPage-CGv2L62M.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-CwdnfJbJ.js → EscalationConfigPage-DpYDmsgw.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-CwdnfJbJ.js.map → EscalationConfigPage-DpYDmsgw.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-ZEIfyqwE.js → ForceChangePasswordPage-CLI_fpF4.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-ZEIfyqwE.js.map → ForceChangePasswordPage-CLI_fpF4.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-sh-3h_H9.js → ForceChangePasswordPage-Db6sOrZN.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-sh-3h_H9.js.map → ForceChangePasswordPage-Db6sOrZN.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-B4M6-xeM.js → ForgotPasswordPage-BhMz2B6A.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-B4M6-xeM.js.map → ForgotPasswordPage-BhMz2B6A.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-MIu-U7p0.js → ForgotPasswordPage-D06arMXO.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-MIu-U7p0.js.map → ForgotPasswordPage-D06arMXO.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-4XK3Bs_r.js → GroupDetailPage-BCM8KBCd.js} +5 -5
- package/dist/chunks/{GroupDetailPage-4XK3Bs_r.js.map → GroupDetailPage-BCM8KBCd.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-C-kvtd2T.js → GroupDetailPage-CGMV3bWt.js} +2 -2
- package/dist/chunks/{GroupDetailPage-C-kvtd2T.js.map → GroupDetailPage-CGMV3bWt.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-CP41FzHi.js → MyAccessRequestsPage-BBrwEomx.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-CP41FzHi.js.map → MyAccessRequestsPage-BBrwEomx.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-DzrXTrVi.js → MyAccessRequestsPage-CrlWe3gd.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-DzrXTrVi.js.map → MyAccessRequestsPage-CrlWe3gd.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-V_SwYio2.js → MyTenantsPage-BOV34_rJ.js} +3 -3
- package/dist/chunks/{MyTenantsPage-V_SwYio2.js.map → MyTenantsPage-BOV34_rJ.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-CZRkMbh8.js → MyTenantsPage-CK4-klmd.js} +2 -2
- package/dist/chunks/{MyTenantsPage-CZRkMbh8.js.map → MyTenantsPage-CK4-klmd.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DnvAIeyr.js → MyTicketsPage-CFZ1G4dG.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DnvAIeyr.js.map → MyTicketsPage-CFZ1G4dG.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-DOUhaLal.js → MyTicketsPage-DuhpwhZx.js} +2 -2
- package/dist/chunks/{MyTicketsPage-DOUhaLal.js.map → MyTicketsPage-DuhpwhZx.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-DfTa4jCG.js → NavigationAppsPage-BnNQRfBP.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-DfTa4jCG.js.map → NavigationAppsPage-BnNQRfBP.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-DXvpLsbt.js → NavigationAppsPage-DdJxEoTZ.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-DXvpLsbt.js.map → NavigationAppsPage-DdJxEoTZ.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-I1yCk7tk.js → NotificationsPage-BllOlagk.js} +2 -2
- package/dist/chunks/{NotificationsPage-I1yCk7tk.js.map → NotificationsPage-BllOlagk.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-D76MdAs-.js → NotificationsPage-D1T_ozHl.js} +2 -2
- package/dist/chunks/{NotificationsPage-D76MdAs-.js.map → NotificationsPage-D1T_ozHl.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-BRUzcl1A.js → OnboardingWizardPage-CioLaCYz.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-BRUzcl1A.js.map → OnboardingWizardPage-CioLaCYz.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-DtWUPCh3.js → OnboardingWizardPage-CrAQt7qL.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-DtWUPCh3.js.map → OnboardingWizardPage-CrAQt7qL.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-CUNKbl7t.js → PermissionDetailPage-BIG78-1-.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-CUNKbl7t.js.map → PermissionDetailPage-BIG78-1-.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-DJJGbXoX.js → PermissionDetailPage-CvPqugYu.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-DJJGbXoX.js.map → PermissionDetailPage-CvPqugYu.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-B8wmawPV.js → PermissionsPage-CDSuc8vw.js} +2 -2
- package/dist/chunks/{PermissionsPage-B8wmawPV.js.map → PermissionsPage-CDSuc8vw.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-Dbjcctuh.js → PermissionsPage-XaOrGrPZ.js} +2 -2
- package/dist/chunks/{PermissionsPage-Dbjcctuh.js.map → PermissionsPage-XaOrGrPZ.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-BeNfBZmb.js → PortalDashboardPage-BsWVXkMe.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-BeNfBZmb.js.map → PortalDashboardPage-BsWVXkMe.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-zii0ll57.js → PortalDashboardPage-oSD7oQhJ.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-zii0ll57.js.map → PortalDashboardPage-oSD7oQhJ.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-BCpuIGzv.js → PreferencesPage-DD0_XWdT.js} +2 -2
- package/dist/chunks/{PreferencesPage-BCpuIGzv.js.map → PreferencesPage-DD0_XWdT.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-BmvrBaAD.js → PreferencesPage-ca2BOdoH.js} +2 -2
- package/dist/chunks/{PreferencesPage-BmvrBaAD.js.map → PreferencesPage-ca2BOdoH.js.map} +1 -1
- package/dist/chunks/{ProfilePage-mf5wI0-n.js → ProfilePage-Bex_JN5N.js} +2 -2
- package/dist/chunks/{ProfilePage-mf5wI0-n.js.map → ProfilePage-Bex_JN5N.js.map} +1 -1
- package/dist/chunks/{ProfilePage-eowQd59_.js → ProfilePage-C8tUIOnb.js} +2 -2
- package/dist/chunks/{ProfilePage-eowQd59_.js.map → ProfilePage-C8tUIOnb.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-CLsaUNqA.js → ReferencesManagementPage-B-FXS2ln.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-CLsaUNqA.js.map → ReferencesManagementPage-B-FXS2ln.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-8UPgkVE8.js → ReferencesManagementPage-C8KZprkI.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-8UPgkVE8.js.map → ReferencesManagementPage-C8KZprkI.js.map} +1 -1
- package/dist/chunks/{RegisterPage-CNyHSbqs.js → RegisterPage-BYt__zKJ.js} +2 -2
- package/dist/chunks/{RegisterPage-CNyHSbqs.js.map → RegisterPage-BYt__zKJ.js.map} +1 -1
- package/dist/chunks/{RegisterPage-57X-ILDb.js → RegisterPage-MWcVu-LY.js} +2 -2
- package/dist/chunks/{RegisterPage-57X-ILDb.js.map → RegisterPage-MWcVu-LY.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-CyV8l-Zo.js → ResetPasswordPage-DaJiMj5Z.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-CyV8l-Zo.js.map → ResetPasswordPage-DaJiMj5Z.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-JW8-mh_k.js → ResetPasswordPage-rCLUIj_T.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-JW8-mh_k.js.map → ResetPasswordPage-rCLUIj_T.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-CjwE73NX.js → ResolutionModal-DeuPnLWg.js} +2 -2
- package/dist/chunks/{ResolutionModal-CjwE73NX.js.map → ResolutionModal-DeuPnLWg.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-wddG59kg.js → ResolutionModal-j7Rp6apG.js} +2 -2
- package/dist/chunks/{ResolutionModal-wddG59kg.js.map → ResolutionModal-j7Rp6apG.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-CrioVHFI.js → RoleDetailPage-CLtZWX17.js} +3 -3
- package/dist/chunks/{RoleDetailPage-CrioVHFI.js.map → RoleDetailPage-CLtZWX17.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-TUOGR1ow.js → RoleDetailPage-TGyGmLMM.js} +2 -2
- package/dist/chunks/{RoleDetailPage-TUOGR1ow.js.map → RoleDetailPage-TGyGmLMM.js.map} +1 -1
- package/dist/chunks/{RolesPage-sJBWaNff.js → RolesPage-C0c5G9e7.js} +2 -2
- package/dist/chunks/{RolesPage-sJBWaNff.js.map → RolesPage-C0c5G9e7.js.map} +1 -1
- package/dist/chunks/{RolesPage-CAcols3D.js → RolesPage-Dm03fBBf.js} +2 -2
- package/dist/chunks/{RolesPage-CAcols3D.js.map → RolesPage-Dm03fBBf.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-BPGRloOS.js → SlaConfigPage-B4WDzEKi.js} +2 -2
- package/dist/chunks/{SlaConfigPage-BPGRloOS.js.map → SlaConfigPage-B4WDzEKi.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-D5TRn7Ir.js → SlaConfigPage-Cwo9NwxH.js} +2 -2
- package/dist/chunks/{SlaConfigPage-D5TRn7Ir.js.map → SlaConfigPage-Cwo9NwxH.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-UXmYLrIq.js → SupportPermissionsPage-CL12dFy-.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-UXmYLrIq.js.map → SupportPermissionsPage-CL12dFy-.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-Dc2bWTzG.js → SupportPermissionsPage-CneIhl30.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-Dc2bWTzG.js.map → SupportPermissionsPage-CneIhl30.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-nTY85sNA.js → TemplatesPage-DStKmwHT.js} +2 -2
- package/dist/chunks/{TemplatesPage-nTY85sNA.js.map → TemplatesPage-DStKmwHT.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-dmPlqqiD.js → TemplatesPage-X4Rrhs9p.js} +2 -2
- package/dist/chunks/{TemplatesPage-dmPlqqiD.js.map → TemplatesPage-X4Rrhs9p.js.map} +1 -1
- package/dist/chunks/{TenantCard-BhT-31ls.js → TenantCard-BUBYWtvR.js} +2 -2
- package/dist/chunks/{TenantCard-BhT-31ls.js.map → TenantCard-BUBYWtvR.js.map} +1 -1
- package/dist/chunks/{TenantCard-BUXfstRZ.js → TenantCard-CAgiB-NG.js} +2 -2
- package/dist/chunks/{TenantCard-BUXfstRZ.js.map → TenantCard-CAgiB-NG.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-3_mzBLNI.js → TenantScopeSelector-B9vtpIZx.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-3_mzBLNI.js.map → TenantScopeSelector-B9vtpIZx.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-B-SRDR2R.js → TenantScopeSelector-BAoah-mL.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-B-SRDR2R.js.map → TenantScopeSelector-BAoah-mL.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-xN3wPnFL.js → TicketDetailPage-BFcP4X8s.js} +2 -2
- package/dist/chunks/{TicketDetailPage-xN3wPnFL.js.map → TicketDetailPage-BFcP4X8s.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-B4cR3rOC.js → TicketDetailPage-D_Npnt4A.js} +2 -2
- package/dist/chunks/{TicketDetailPage-B4cR3rOC.js.map → TicketDetailPage-D_Npnt4A.js.map} +1 -1
- package/dist/chunks/{TicketsPage-Dwi2xpMI.js → TicketsPage-DBP9kalU.js} +2 -2
- package/dist/chunks/{TicketsPage-Dwi2xpMI.js.map → TicketsPage-DBP9kalU.js.map} +1 -1
- package/dist/chunks/{TicketsPage-CkHgXSxU.js → TicketsPage-p21DLhUb.js} +2 -2
- package/dist/chunks/{TicketsPage-CkHgXSxU.js.map → TicketsPage-p21DLhUb.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-D2a3EOey.js → UserCreateTicketPage-DOwShnG8.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-D2a3EOey.js.map → UserCreateTicketPage-DOwShnG8.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-bcbSLglE.js → UserCreateTicketPage-lvlvp2u6.js} +2 -2
- package/dist/chunks/{UserCreateTicketPage-bcbSLglE.js.map → UserCreateTicketPage-lvlvp2u6.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-ZMsx8LWw.js → UserDashboardPage-C_tm7Pld.js} +2 -2
- package/dist/chunks/{UserDashboardPage-ZMsx8LWw.js.map → UserDashboardPage-C_tm7Pld.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-DwnDRNoW.js → UserDashboardPage-Dp6q6FEW.js} +2 -2
- package/dist/chunks/{UserDashboardPage-DwnDRNoW.js.map → UserDashboardPage-Dp6q6FEW.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-CZyV-zsg.js → UserDetailPage-6grZ6gmV.js} +5 -5
- package/dist/chunks/{UserDetailPage-CZyV-zsg.js.map → UserDetailPage-6grZ6gmV.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-BRFowOFL.js → UserDetailPage-DXLxO7LF.js} +2 -2
- package/dist/chunks/{UserDetailPage-BRFowOFL.js.map → UserDetailPage-DXLxO7LF.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-BstGk_BP.js → UserTicketDetailPage-Ch9IfCPo.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-BstGk_BP.js.map → UserTicketDetailPage-Ch9IfCPo.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-DzB_pELt.js → UserTicketDetailPage-a4II5VEE.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-DzB_pELt.js.map → UserTicketDetailPage-a4II5VEE.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-BygTv_kK.js → UsersGroupsPage-B7Er0V4l.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-BygTv_kK.js.map → UsersGroupsPage-B7Er0V4l.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-DTmhzttW.js → UsersGroupsPage-BeAv4QfV.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-DTmhzttW.js.map → UsersGroupsPage-BeAv4QfV.js.map} +1 -1
- package/dist/chunks/{UsersPage-DcwLyMAX.js → UsersPage-0M1FLqOe.js} +2 -2
- package/dist/chunks/{UsersPage-DcwLyMAX.js.map → UsersPage-0M1FLqOe.js.map} +1 -1
- package/dist/chunks/{UsersPage-TIqSHgHj.js → UsersPage-ZR9r9vvf.js} +2 -2
- package/dist/chunks/{UsersPage-TIqSHgHj.js.map → UsersPage-ZR9r9vvf.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-3FjMFbpa.js → accessRequestsApi-BJH8EE1K.js} +2 -2
- package/dist/chunks/{accessRequestsApi-3FjMFbpa.js.map → accessRequestsApi-BJH8EE1K.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-B6dsJzvH.js → accessRequestsApi-CBpF5d54.js} +2 -2
- package/dist/chunks/{accessRequestsApi-B6dsJzvH.js.map → accessRequestsApi-CBpF5d54.js.map} +1 -1
- package/dist/chunks/{aiApi-9G4wG_mT.js → aiApi-CkkWAvNB.js} +2 -2
- package/dist/chunks/{aiApi-9G4wG_mT.js.map → aiApi-CkkWAvNB.js.map} +1 -1
- package/dist/chunks/{aiApi-DXOdsoxr.js → aiApi-Dl7a2lWz.js} +2 -2
- package/dist/chunks/{aiApi-DXOdsoxr.js.map → aiApi-Dl7a2lWz.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-DhOd6idI.js → applicationAnalyticsApi-BwcSE_H1.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-DhOd6idI.js.map → applicationAnalyticsApi-BwcSE_H1.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-D0DEp9Y-.js → applicationAnalyticsApi-DKMmDvWk.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-D0DEp9Y-.js.map → applicationAnalyticsApi-DKMmDvWk.js.map} +1 -1
- package/dist/chunks/{groupsApi-Db8G2lLs.js → groupsApi-BzDV3_Jc.js} +2 -2
- package/dist/chunks/{groupsApi-Db8G2lLs.js.map → groupsApi-BzDV3_Jc.js.map} +1 -1
- package/dist/chunks/{groupsApi-lbxNsHFv.js → groupsApi-CQ4vFMdP.js} +2 -2
- package/dist/chunks/{groupsApi-lbxNsHFv.js.map → groupsApi-CQ4vFMdP.js.map} +1 -1
- package/dist/chunks/{index-DEtq-xUL.js → index-BBmMbSZV.js} +8 -8
- package/dist/chunks/{index-DEtq-xUL.js.map → index-BBmMbSZV.js.map} +1 -1
- package/dist/chunks/{index-D0HS542b.js → index-BLlESTfA.js} +2 -2
- package/dist/chunks/{index-D0HS542b.js.map → index-BLlESTfA.js.map} +1 -1
- package/dist/chunks/{index-DUS-tunb.js → index-BPMjxWVx.js} +2 -2
- package/dist/chunks/{index-DUS-tunb.js.map → index-BPMjxWVx.js.map} +1 -1
- package/dist/chunks/{index-TiWOcC0g.js → index-CEbwdURd.js} +2 -2
- package/dist/chunks/{index-TiWOcC0g.js.map → index-CEbwdURd.js.map} +1 -1
- package/dist/chunks/{index-DF93KQFR.js → index-CUZygY5Q.js} +2 -2
- package/dist/chunks/{index-DF93KQFR.js.map → index-CUZygY5Q.js.map} +1 -1
- package/dist/chunks/{index-BI2dc1FS.js → index-Ci1SqFiY.js} +2 -2
- package/dist/chunks/{index-BI2dc1FS.js.map → index-Ci1SqFiY.js.map} +1 -1
- package/dist/chunks/{index-CTGSmYvs.js → index-Cib93xtp.js} +2 -2
- package/dist/chunks/{index-CTGSmYvs.js.map → index-Cib93xtp.js.map} +1 -1
- package/dist/chunks/{index-DqbVFB1H.js → index-CoHIgn5H.js} +2 -2
- package/dist/chunks/{index-DqbVFB1H.js.map → index-CoHIgn5H.js.map} +1 -1
- package/dist/chunks/{index-CN2WRyg1.js → index-CpY95_ro.js} +294 -292
- package/dist/chunks/{index-CN2WRyg1.js.map → index-CpY95_ro.js.map} +1 -1
- package/dist/chunks/{index-DjC1u2hI.js → index-D-2xSu5W.js} +3 -3
- package/dist/chunks/{index-DjC1u2hI.js.map → index-D-2xSu5W.js.map} +1 -1
- package/dist/chunks/{index-Bn8HzILk.js → index-D18t9DhC.js} +4 -4
- package/dist/chunks/{index-Bn8HzILk.js.map → index-D18t9DhC.js.map} +1 -1
- package/dist/chunks/{index-cAikSVW0.js → index-DK5czlkn.js} +9 -9
- package/dist/chunks/{index-cAikSVW0.js.map → index-DK5czlkn.js.map} +1 -1
- package/dist/chunks/{index-DLekpNSE.js → index-DQd324n7.js} +2 -2
- package/dist/chunks/{index-DLekpNSE.js.map → index-DQd324n7.js.map} +1 -1
- package/dist/chunks/{index-CgtbaFf5.js → index-Dbq-x5H9.js} +2 -2
- package/dist/chunks/{index-CgtbaFf5.js.map → index-Dbq-x5H9.js.map} +1 -1
- package/dist/chunks/{index-xhRXN1Jq.js → index-Det9dEaQ.js} +2 -2
- package/dist/chunks/{index-xhRXN1Jq.js.map → index-Det9dEaQ.js.map} +1 -1
- package/dist/chunks/{index-HsAOBno4.js → index-bgT9XOKZ.js} +2 -2
- package/dist/chunks/{index-HsAOBno4.js.map → index-bgT9XOKZ.js.map} +1 -1
- package/dist/chunks/{index-CUICSveU.js → index-h7ZrwrQg.js} +2 -2
- package/dist/chunks/{index-CUICSveU.js.map → index-h7ZrwrQg.js.map} +1 -1
- package/dist/chunks/{index-DwqLhQ8S.js → index-k4USDz2P.js} +2 -2
- package/dist/chunks/{index-DwqLhQ8S.js.map → index-k4USDz2P.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-CHeS7oLt.js → tenantIconMap-7ihIWxAh.js} +2 -2
- package/dist/chunks/{tenantIconMap-CHeS7oLt.js.map → tenantIconMap-7ihIWxAh.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-__FKj6CN.js → tenantIconMap-Dk6K-UTE.js} +2 -2
- package/dist/chunks/{tenantIconMap-__FKj6CN.js.map → tenantIconMap-Dk6K-UTE.js.map} +1 -1
- package/dist/chunks/{ticketingApi-DF4RwD_6.js → ticketingApi-BCMKkzlv.js} +2 -2
- package/dist/chunks/{ticketingApi-DF4RwD_6.js.map → ticketingApi-BCMKkzlv.js.map} +1 -1
- package/dist/chunks/{ticketingApi-Cj239hYB.js → ticketingApi-Dwn7pl5z.js} +2 -2
- package/dist/chunks/{ticketingApi-Cj239hYB.js.map → ticketingApi-Dwn7pl5z.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-CFam8zFR.js → useAccessRequests-Du7CvowE.js} +3 -3
- package/dist/chunks/{useAccessRequests-CFam8zFR.js.map → useAccessRequests-Du7CvowE.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-CViOUwyF.js → useAccessRequests-gJ7yhWyi.js} +2 -2
- package/dist/chunks/{useAccessRequests-CViOUwyF.js.map → useAccessRequests-gJ7yhWyi.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-CslSQeBJ.js → useUserAccessRequests-5wWea2Jg.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-CslSQeBJ.js.map → useUserAccessRequests-5wWea2Jg.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-B-Cs6NX1.js → useUserAccessRequests-Bk_v8egy.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-B-Cs6NX1.js.map → useUserAccessRequests-Bk_v8egy.js.map} +1 -1
- package/dist/components/routing/ProtectedRoute.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-DF93KQFR.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\">∞</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-CUZygY5Q.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\">∞</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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"}
|
|
@@ -3,7 +3,7 @@ import { useState as u, useCallback as W, useEffect as z, useMemo as Se } from "
|
|
|
3
3
|
import { useNavigate as ee, useParams as we, useSearchParams as Fe, Link as me } from "react-router-dom";
|
|
4
4
|
import { useTranslation as R } from "react-i18next";
|
|
5
5
|
import { Plus as Z, Mail as H, Search as _e, Filter as Ve, Loader2 as U, Languages as ce, Eye as X, Edit2 as Ae, Trash2 as K, ArrowLeft as ie, Save as de, Settings as le, Edit as ve, Pause as pe, Play as ue, AlertTriangle as be, CheckCircle as ge, FileText as $e, Code as je, ChevronUp as Ne, ChevronDown as ke, Check as ye, Copy as Ke, Undo as Ye, Redo as Ge, Heading1 as Qe, Heading2 as Ze, Heading3 as Xe, Bold as et, Italic as tt, Underline as at, Strikethrough as rt, AlignLeft as st, AlignCenter as it, AlignRight as lt, List as nt, ListOrdered as he, Quote as ot, Minus as ct, Link as dt, X as Le, Image as mt, Palette as pt, Highlighter as ut, Columns as vt, Maximize2 as ht, Minimize2 as xt, MessageSquare as De, Workflow as re, Zap as se, Info as Ee, Lock as Pe, Webhook as Be, GitBranch as Ue, Clock as Je, History as bt } from "lucide-react";
|
|
6
|
-
import { i as V, a as Oe, B as q, C as ze, V as We, P as He, p as Re, E as gt, F as qe } from "./index-
|
|
6
|
+
import { i as V, a as Oe, B as q, C as ze, V as We, P as He, p as Re, E as gt, F as qe } from "./index-CpY95_ro.js";
|
|
7
7
|
import { useEditor as ft, EditorContent as yt } from "@tiptap/react";
|
|
8
8
|
import wt from "@tiptap/starter-kit";
|
|
9
9
|
import Nt from "@tiptap/extension-link";
|
|
@@ -4263,4 +4263,4 @@ export {
|
|
|
4263
4263
|
ba as WorkflowsListPage,
|
|
4264
4264
|
ga as WorkflowsTriggersPage
|
|
4265
4265
|
};
|
|
4266
|
-
//# sourceMappingURL=index-
|
|
4266
|
+
//# sourceMappingURL=index-Ci1SqFiY.js.map
|