@atlashub/smartstack 3.28.0 → 3.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AgentSkillsPage-ChykpPZx.js → AgentSkillsPage-CVq3qZoe.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-ChykpPZx.js.map → AgentSkillsPage-CVq3qZoe.js.map} +1 -1
- package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js → AgentSkillsPage-DJb49NMA.js} +2 -2
- package/dist/chunks/{AgentSkillsPage-ABpqnnyK.js.map → AgentSkillsPage-DJb49NMA.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js → AgentWorkloadPage-D_nk3gKj.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-BltzNlXI.js.map → AgentWorkloadPage-D_nk3gKj.js.map} +1 -1
- package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js → AgentWorkloadPage-oHEi-sFh.js} +2 -2
- package/dist/chunks/{AgentWorkloadPage-BI5QWJyQ.js.map → AgentWorkloadPage-oHEi-sFh.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js → ApiCatalogDetailPage-Cr0q2HnB.js} +3 -3
- package/dist/chunks/{ApiCatalogDetailPage-BaheZKBq.js.map → ApiCatalogDetailPage-Cr0q2HnB.js.map} +1 -1
- package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js → ApiCatalogDetailPage-DX8buBkV.js} +2 -2
- package/dist/chunks/{ApiCatalogDetailPage-CsRxlHwO.js.map → ApiCatalogDetailPage-DX8buBkV.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js → ApiCatalogPage-DN7sazvI.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-CqmmHpQ4.js.map → ApiCatalogPage-DN7sazvI.js.map} +1 -1
- package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js → ApiCatalogPage-DqboIzZE.js} +2 -2
- package/dist/chunks/{ApiCatalogPage-B0yIz8-U.js.map → ApiCatalogPage-DqboIzZE.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js → ApplicationDetailPage--9YwwS5A.js} +2 -2
- package/dist/chunks/{ApplicationDetailPage-CngD5JSN.js.map → ApplicationDetailPage--9YwwS5A.js.map} +1 -1
- package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js → ApplicationDetailPage-CCNjr64K.js} +4 -4
- package/dist/chunks/{ApplicationDetailPage-CdT6KNd7.js.map → ApplicationDetailPage-CCNjr64K.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js → ApplicationsDashboardPage-BSsHN3Yj.js} +2 -2
- package/dist/chunks/{ApplicationsDashboardPage-DHmnjk2O.js.map → ApplicationsDashboardPage-BSsHN3Yj.js.map} +1 -1
- package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js → ApplicationsDashboardPage-Bs-Xgca4.js} +3 -3
- package/dist/chunks/{ApplicationsDashboardPage-1V4iQ6eY.js.map → ApplicationsDashboardPage-Bs-Xgca4.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js → ApplicationsGridPage-DDysNWJ5.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-Bo3NDnBF.js.map → ApplicationsGridPage-DDysNWJ5.js.map} +1 -1
- package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js → ApplicationsGridPage-s1WEzOXS.js} +2 -2
- package/dist/chunks/{ApplicationsGridPage-CiMJFlB_.js.map → ApplicationsGridPage-s1WEzOXS.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-L2_S23aN.js → ApplicationsListPage-B3CSMiV0.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-L2_S23aN.js.map → ApplicationsListPage-B3CSMiV0.js.map} +1 -1
- package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js → ApplicationsListPage-B6ZCecIl.js} +2 -2
- package/dist/chunks/{ApplicationsListPage-De8jQ1Cm.js.map → ApplicationsListPage-B6ZCecIl.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js → ApplicationsPage-BBaiBM--.js} +2 -2
- package/dist/chunks/{ApplicationsPage-DBq7_Sm8.js.map → ApplicationsPage-BBaiBM--.js.map} +1 -1
- package/dist/chunks/{ApplicationsPage-CiNI-b0R.js → ApplicationsPage-ztPwoAGt.js} +4 -4
- package/dist/chunks/{ApplicationsPage-CiNI-b0R.js.map → ApplicationsPage-ztPwoAGt.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js → AssignmentRulesPage-CK4L4rBO.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-DFsO4ZES.js.map → AssignmentRulesPage-CK4L4rBO.js.map} +1 -1
- package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js → AssignmentRulesPage-DFSVFFXr.js} +2 -2
- package/dist/chunks/{AssignmentRulesPage-C8rfUsMB.js.map → AssignmentRulesPage-DFSVFFXr.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-78C_EBsw.js → AssignmentsPage-Bp7oQD7Q.js} +2 -2
- package/dist/chunks/{AssignmentsPage-78C_EBsw.js.map → AssignmentsPage-Bp7oQD7Q.js.map} +1 -1
- package/dist/chunks/{AssignmentsPage-COCikISI.js → AssignmentsPage-JCLpyg94.js} +2 -2
- package/dist/chunks/{AssignmentsPage-COCikISI.js.map → AssignmentsPage-JCLpyg94.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js → AuthCallbackPage-Bl9xlJ3h.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-DqT6ueVi.js.map → AuthCallbackPage-Bl9xlJ3h.js.map} +1 -1
- package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js → AuthCallbackPage-CzMHz4jy.js} +2 -2
- package/dist/chunks/{AuthCallbackPage-BF4bkTnR.js.map → AuthCallbackPage-CzMHz4jy.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js → ConfirmEmailPage-D_8T1vqV.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-Bh_K5qJn.js.map → ConfirmEmailPage-D_8T1vqV.js.map} +1 -1
- package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js → ConfirmEmailPage-M7mJgXvn.js} +2 -2
- package/dist/chunks/{ConfirmEmailPage-DJy4idrf.js.map → ConfirmEmailPage-M7mJgXvn.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js → CreateSupportTicketPage-BNEGavlu.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-pL7jbG9o.js.map → CreateSupportTicketPage-BNEGavlu.js.map} +1 -1
- package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js → CreateSupportTicketPage-C2X2mfds.js} +2 -2
- package/dist/chunks/{CreateSupportTicketPage-AVTwXbJd.js.map → CreateSupportTicketPage-C2X2mfds.js.map} +1 -1
- package/dist/chunks/{DashboardPage-DdQlTLw0.js → DashboardPage-4oy2YqvT.js} +2 -2
- package/dist/chunks/{DashboardPage-DdQlTLw0.js.map → DashboardPage-4oy2YqvT.js.map} +1 -1
- package/dist/chunks/{DashboardPage-C55mIiB6.js → DashboardPage-CO-8B8EI.js} +3 -3
- package/dist/chunks/{DashboardPage-C55mIiB6.js.map → DashboardPage-CO-8B8EI.js.map} +1 -1
- package/dist/chunks/{DashboardPage-CcCnUl7s.js → DashboardPage-CPArUG-S.js} +2 -2
- package/dist/chunks/{DashboardPage-CcCnUl7s.js.map → DashboardPage-CPArUG-S.js.map} +1 -1
- package/dist/chunks/{DashboardPage-DOitDfGV.js → DashboardPage-D5MRMxEV.js} +3 -3
- package/dist/chunks/{DashboardPage-DOitDfGV.js.map → DashboardPage-D5MRMxEV.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-DNnZftCH.js → EscalationConfigPage-CwdnfJbJ.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-DNnZftCH.js.map → EscalationConfigPage-CwdnfJbJ.js.map} +1 -1
- package/dist/chunks/{EscalationConfigPage-DRr55328.js → EscalationConfigPage-DnjLFXnL.js} +2 -2
- package/dist/chunks/{EscalationConfigPage-DRr55328.js.map → EscalationConfigPage-DnjLFXnL.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js → ForceChangePasswordPage-ZEIfyqwE.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-1SCOPIqK.js.map → ForceChangePasswordPage-ZEIfyqwE.js.map} +1 -1
- package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js → ForceChangePasswordPage-sh-3h_H9.js} +2 -2
- package/dist/chunks/{ForceChangePasswordPage-DBeG_HRO.js.map → ForceChangePasswordPage-sh-3h_H9.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js → ForgotPasswordPage-B4M6-xeM.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-Dlb6wKfC.js.map → ForgotPasswordPage-B4M6-xeM.js.map} +1 -1
- package/dist/chunks/{ForgotPasswordPage-DffYfXva.js → ForgotPasswordPage-MIu-U7p0.js} +2 -2
- package/dist/chunks/{ForgotPasswordPage-DffYfXva.js.map → ForgotPasswordPage-MIu-U7p0.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-C9nRbeHI.js → GroupDetailPage-4XK3Bs_r.js} +5 -5
- package/dist/chunks/{GroupDetailPage-C9nRbeHI.js.map → GroupDetailPage-4XK3Bs_r.js.map} +1 -1
- package/dist/chunks/{GroupDetailPage-CPPUWzXf.js → GroupDetailPage-C-kvtd2T.js} +2 -2
- package/dist/chunks/{GroupDetailPage-CPPUWzXf.js.map → GroupDetailPage-C-kvtd2T.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js → MyAccessRequestsPage-CP41FzHi.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-BAX0xwJX.js.map → MyAccessRequestsPage-CP41FzHi.js.map} +1 -1
- package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js → MyAccessRequestsPage-DzrXTrVi.js} +2 -2
- package/dist/chunks/{MyAccessRequestsPage-BMY1V631.js.map → MyAccessRequestsPage-DzrXTrVi.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js → MyTenantsPage-CZRkMbh8.js} +2 -2
- package/dist/chunks/{MyTenantsPage-Bbn4HxN2.js.map → MyTenantsPage-CZRkMbh8.js.map} +1 -1
- package/dist/chunks/{MyTenantsPage-BHtp67SD.js → MyTenantsPage-V_SwYio2.js} +3 -3
- package/dist/chunks/{MyTenantsPage-BHtp67SD.js.map → MyTenantsPage-V_SwYio2.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-BvZeiTXu.js → MyTicketsPage-DOUhaLal.js} +2 -2
- package/dist/chunks/{MyTicketsPage-BvZeiTXu.js.map → MyTicketsPage-DOUhaLal.js.map} +1 -1
- package/dist/chunks/{MyTicketsPage-D9IGVofj.js → MyTicketsPage-DnvAIeyr.js} +2 -2
- package/dist/chunks/{MyTicketsPage-D9IGVofj.js.map → MyTicketsPage-DnvAIeyr.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js → NavigationAppsPage-DXvpLsbt.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-DiPBCsAF.js.map → NavigationAppsPage-DXvpLsbt.js.map} +1 -1
- package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js → NavigationAppsPage-DfTa4jCG.js} +2 -2
- package/dist/chunks/{NavigationAppsPage-ChtMK1yt.js.map → NavigationAppsPage-DfTa4jCG.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BxCiGzHk.js → NotificationsPage-D76MdAs-.js} +2 -2
- package/dist/chunks/{NotificationsPage-BxCiGzHk.js.map → NotificationsPage-D76MdAs-.js.map} +1 -1
- package/dist/chunks/{NotificationsPage-BCnL9oPb.js → NotificationsPage-I1yCk7tk.js} +2 -2
- package/dist/chunks/{NotificationsPage-BCnL9oPb.js.map → NotificationsPage-I1yCk7tk.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js → OnboardingWizardPage-BRUzcl1A.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-CV_cxq7k.js.map → OnboardingWizardPage-BRUzcl1A.js.map} +1 -1
- package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js → OnboardingWizardPage-DtWUPCh3.js} +2 -2
- package/dist/chunks/{OnboardingWizardPage-Du-tQ2ag.js.map → OnboardingWizardPage-DtWUPCh3.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js → PermissionDetailPage-CUNKbl7t.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-C1iuWv0G.js.map → PermissionDetailPage-CUNKbl7t.js.map} +1 -1
- package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js → PermissionDetailPage-DJJGbXoX.js} +2 -2
- package/dist/chunks/{PermissionDetailPage-Ds4Jt1os.js.map → PermissionDetailPage-DJJGbXoX.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-BGI2nxCn.js → PermissionsPage-B8wmawPV.js} +2 -2
- package/dist/chunks/{PermissionsPage-BGI2nxCn.js.map → PermissionsPage-B8wmawPV.js.map} +1 -1
- package/dist/chunks/{PermissionsPage-sauv7ct1.js → PermissionsPage-Dbjcctuh.js} +2 -2
- package/dist/chunks/{PermissionsPage-sauv7ct1.js.map → PermissionsPage-Dbjcctuh.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-CQWEcghD.js → PortalDashboardPage-BeNfBZmb.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-CQWEcghD.js.map → PortalDashboardPage-BeNfBZmb.js.map} +1 -1
- package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js → PortalDashboardPage-zii0ll57.js} +2 -2
- package/dist/chunks/{PortalDashboardPage-2kCbJw9w.js.map → PortalDashboardPage-zii0ll57.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-Bu4gaDRb.js → PreferencesPage-BCpuIGzv.js} +2 -2
- package/dist/chunks/{PreferencesPage-Bu4gaDRb.js.map → PreferencesPage-BCpuIGzv.js.map} +1 -1
- package/dist/chunks/{PreferencesPage-Dbg0bEYD.js → PreferencesPage-BmvrBaAD.js} +2 -2
- package/dist/chunks/{PreferencesPage-Dbg0bEYD.js.map → PreferencesPage-BmvrBaAD.js.map} +1 -1
- package/dist/chunks/{ProfilePage-C5QS7tsh.js → ProfilePage-eowQd59_.js} +2 -2
- package/dist/chunks/{ProfilePage-C5QS7tsh.js.map → ProfilePage-eowQd59_.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DfiBhOUt.js → ProfilePage-mf5wI0-n.js} +2 -2
- package/dist/chunks/{ProfilePage-DfiBhOUt.js.map → ProfilePage-mf5wI0-n.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js → ReferencesManagementPage-8UPgkVE8.js} +3 -3
- package/dist/chunks/{ReferencesManagementPage-Bs0mapj8.js.map → ReferencesManagementPage-8UPgkVE8.js.map} +1 -1
- package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js → ReferencesManagementPage-CLsaUNqA.js} +2 -2
- package/dist/chunks/{ReferencesManagementPage-C0RgHbJb.js.map → ReferencesManagementPage-CLsaUNqA.js.map} +1 -1
- package/dist/chunks/{RegisterPage-DS1chV_A.js → RegisterPage-57X-ILDb.js} +2 -2
- package/dist/chunks/{RegisterPage-DS1chV_A.js.map → RegisterPage-57X-ILDb.js.map} +1 -1
- package/dist/chunks/{RegisterPage-DoeIiJt0.js → RegisterPage-CNyHSbqs.js} +2 -2
- package/dist/chunks/{RegisterPage-DoeIiJt0.js.map → RegisterPage-CNyHSbqs.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js → ResetPasswordPage-CyV8l-Zo.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-3KEk3zj5.js.map → ResetPasswordPage-CyV8l-Zo.js.map} +1 -1
- package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js → ResetPasswordPage-JW8-mh_k.js} +2 -2
- package/dist/chunks/{ResetPasswordPage-C_VQSFB5.js.map → ResetPasswordPage-JW8-mh_k.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-S6URD--N.js → ResolutionModal-CjwE73NX.js} +2 -2
- package/dist/chunks/{ResolutionModal-S6URD--N.js.map → ResolutionModal-CjwE73NX.js.map} +1 -1
- package/dist/chunks/{ResolutionModal-BzI1x79r.js → ResolutionModal-wddG59kg.js} +2 -2
- package/dist/chunks/{ResolutionModal-BzI1x79r.js.map → ResolutionModal-wddG59kg.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-SXK9cq_3.js → RoleDetailPage-CrioVHFI.js} +3 -3
- package/dist/chunks/{RoleDetailPage-SXK9cq_3.js.map → RoleDetailPage-CrioVHFI.js.map} +1 -1
- package/dist/chunks/{RoleDetailPage-DvEEWPKr.js → RoleDetailPage-TUOGR1ow.js} +2 -2
- package/dist/chunks/{RoleDetailPage-DvEEWPKr.js.map → RoleDetailPage-TUOGR1ow.js.map} +1 -1
- package/dist/chunks/{RolesPage-B75lCugt.js → RolesPage-CAcols3D.js} +2 -2
- package/dist/chunks/{RolesPage-B75lCugt.js.map → RolesPage-CAcols3D.js.map} +1 -1
- package/dist/chunks/{RolesPage-C5gYJxAl.js → RolesPage-sJBWaNff.js} +2 -2
- package/dist/chunks/{RolesPage-C5gYJxAl.js.map → RolesPage-sJBWaNff.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-BqXHATb6.js → SlaConfigPage-BPGRloOS.js} +2 -2
- package/dist/chunks/{SlaConfigPage-BqXHATb6.js.map → SlaConfigPage-BPGRloOS.js.map} +1 -1
- package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js → SlaConfigPage-D5TRn7Ir.js} +2 -2
- package/dist/chunks/{SlaConfigPage-DZ4P1FFW.js.map → SlaConfigPage-D5TRn7Ir.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js → SupportPermissionsPage-Dc2bWTzG.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-B4xy_pCQ.js.map → SupportPermissionsPage-Dc2bWTzG.js.map} +1 -1
- package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js → SupportPermissionsPage-UXmYLrIq.js} +2 -2
- package/dist/chunks/{SupportPermissionsPage-DW7KJjYK.js.map → SupportPermissionsPage-UXmYLrIq.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-DZa0PQTE.js → TemplatesPage-dmPlqqiD.js} +2 -2
- package/dist/chunks/{TemplatesPage-DZa0PQTE.js.map → TemplatesPage-dmPlqqiD.js.map} +1 -1
- package/dist/chunks/{TemplatesPage-m5-sLJ7F.js → TemplatesPage-nTY85sNA.js} +2 -2
- package/dist/chunks/{TemplatesPage-m5-sLJ7F.js.map → TemplatesPage-nTY85sNA.js.map} +1 -1
- package/dist/chunks/{TenantCard-BJQi7Oew.js → TenantCard-BUXfstRZ.js} +2 -2
- package/dist/chunks/{TenantCard-BJQi7Oew.js.map → TenantCard-BUXfstRZ.js.map} +1 -1
- package/dist/chunks/{TenantCard-CqfifMrM.js → TenantCard-BhT-31ls.js} +2 -2
- package/dist/chunks/{TenantCard-CqfifMrM.js.map → TenantCard-BhT-31ls.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js → TenantScopeSelector-3_mzBLNI.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-CdiYJvuH.js.map → TenantScopeSelector-3_mzBLNI.js.map} +1 -1
- package/dist/chunks/{TenantScopeSelector-Cl5DD318.js → TenantScopeSelector-B-SRDR2R.js} +2 -2
- package/dist/chunks/{TenantScopeSelector-Cl5DD318.js.map → TenantScopeSelector-B-SRDR2R.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-BOC9rHu3.js → TicketDetailPage-B4cR3rOC.js} +2 -2
- package/dist/chunks/{TicketDetailPage-BOC9rHu3.js.map → TicketDetailPage-B4cR3rOC.js.map} +1 -1
- package/dist/chunks/{TicketDetailPage-C1UuMxD8.js → TicketDetailPage-xN3wPnFL.js} +2 -2
- package/dist/chunks/{TicketDetailPage-C1UuMxD8.js.map → TicketDetailPage-xN3wPnFL.js.map} +1 -1
- package/dist/chunks/{TicketsPage-BCgHZA-m.js → TicketsPage-CkHgXSxU.js} +2 -2
- package/dist/chunks/{TicketsPage-BCgHZA-m.js.map → TicketsPage-CkHgXSxU.js.map} +1 -1
- package/dist/chunks/{TicketsPage-BjaN4Baq.js → TicketsPage-Dwi2xpMI.js} +2 -2
- package/dist/chunks/{TicketsPage-BjaN4Baq.js.map → TicketsPage-Dwi2xpMI.js.map} +1 -1
- package/dist/chunks/{UserCreateTicketPage-ChQL1mVY.js → UserCreateTicketPage-D2a3EOey.js} +3 -3
- package/dist/chunks/UserCreateTicketPage-D2a3EOey.js.map +1 -0
- package/dist/chunks/{UserCreateTicketPage-DkjsHeV7.js → UserCreateTicketPage-bcbSLglE.js} +48 -48
- package/dist/chunks/UserCreateTicketPage-bcbSLglE.js.map +1 -0
- package/dist/chunks/{UserDashboardPage-BMYrtF3o.js → UserDashboardPage-DwnDRNoW.js} +2 -2
- package/dist/chunks/{UserDashboardPage-BMYrtF3o.js.map → UserDashboardPage-DwnDRNoW.js.map} +1 -1
- package/dist/chunks/{UserDashboardPage-81-3GJAQ.js → UserDashboardPage-ZMsx8LWw.js} +2 -2
- package/dist/chunks/{UserDashboardPage-81-3GJAQ.js.map → UserDashboardPage-ZMsx8LWw.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-BMW8jAWG.js → UserDetailPage-BRFowOFL.js} +2 -2
- package/dist/chunks/{UserDetailPage-BMW8jAWG.js.map → UserDetailPage-BRFowOFL.js.map} +1 -1
- package/dist/chunks/{UserDetailPage-D6oCH2eS.js → UserDetailPage-CZyV-zsg.js} +5 -5
- package/dist/chunks/{UserDetailPage-D6oCH2eS.js.map → UserDetailPage-CZyV-zsg.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js → UserTicketDetailPage-BstGk_BP.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-ZH2BDWBt.js.map → UserTicketDetailPage-BstGk_BP.js.map} +1 -1
- package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js → UserTicketDetailPage-DzB_pELt.js} +2 -2
- package/dist/chunks/{UserTicketDetailPage-Z_myXXJ0.js.map → UserTicketDetailPage-DzB_pELt.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js → UsersGroupsPage-BygTv_kK.js} +3 -3
- package/dist/chunks/{UsersGroupsPage-B8Ka6uRa.js.map → UsersGroupsPage-BygTv_kK.js.map} +1 -1
- package/dist/chunks/{UsersGroupsPage-xJmGib8b.js → UsersGroupsPage-DTmhzttW.js} +2 -2
- package/dist/chunks/{UsersGroupsPage-xJmGib8b.js.map → UsersGroupsPage-DTmhzttW.js.map} +1 -1
- package/dist/chunks/{UsersPage-CQ38akZ_.js → UsersPage-DcwLyMAX.js} +2 -2
- package/dist/chunks/{UsersPage-CQ38akZ_.js.map → UsersPage-DcwLyMAX.js.map} +1 -1
- package/dist/chunks/{UsersPage-Bd2-vl39.js → UsersPage-TIqSHgHj.js} +2 -2
- package/dist/chunks/{UsersPage-Bd2-vl39.js.map → UsersPage-TIqSHgHj.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-DguOx0q0.js → accessRequestsApi-3FjMFbpa.js} +2 -2
- package/dist/chunks/{accessRequestsApi-DguOx0q0.js.map → accessRequestsApi-3FjMFbpa.js.map} +1 -1
- package/dist/chunks/{accessRequestsApi-COtWo9kC.js → accessRequestsApi-B6dsJzvH.js} +2 -2
- package/dist/chunks/{accessRequestsApi-COtWo9kC.js.map → accessRequestsApi-B6dsJzvH.js.map} +1 -1
- package/dist/chunks/{aiApi-CITiWGYX.js → aiApi-9G4wG_mT.js} +2 -2
- package/dist/chunks/{aiApi-CITiWGYX.js.map → aiApi-9G4wG_mT.js.map} +1 -1
- package/dist/chunks/{aiApi-BmZsud6O.js → aiApi-DXOdsoxr.js} +2 -2
- package/dist/chunks/{aiApi-BmZsud6O.js.map → aiApi-DXOdsoxr.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js → applicationAnalyticsApi-D0DEp9Y-.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-BYoEJzSN.js.map → applicationAnalyticsApi-D0DEp9Y-.js.map} +1 -1
- package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js → applicationAnalyticsApi-DhOd6idI.js} +2 -2
- package/dist/chunks/{applicationAnalyticsApi-D62lc6z4.js.map → applicationAnalyticsApi-DhOd6idI.js.map} +1 -1
- package/dist/chunks/auth-Ca2Rn6on.js +2 -0
- package/dist/chunks/auth-Ca2Rn6on.js.map +1 -0
- package/dist/chunks/auth-ClNTDOqm.js +18 -0
- package/dist/chunks/auth-ClNTDOqm.js.map +1 -0
- package/dist/chunks/auth-DECnMZjF.js +18 -0
- package/dist/chunks/auth-DECnMZjF.js.map +1 -0
- package/dist/chunks/auth-DPvxdqy4.js +18 -0
- package/dist/chunks/auth-DPvxdqy4.js.map +1 -0
- package/dist/chunks/auth-HzvnTaOm.js +2 -0
- package/dist/chunks/auth-HzvnTaOm.js.map +1 -0
- package/dist/chunks/auth-M6aNTKCH.js +2 -0
- package/dist/chunks/auth-M6aNTKCH.js.map +1 -0
- package/dist/chunks/auth-UHnAu6_e.js +2 -0
- package/dist/chunks/auth-UHnAu6_e.js.map +1 -0
- package/dist/chunks/auth-YrujJY7m.js +18 -0
- package/dist/chunks/auth-YrujJY7m.js.map +1 -0
- package/dist/chunks/{groupsApi-3CR-_g5b.js → groupsApi-Db8G2lLs.js} +2 -2
- package/dist/chunks/{groupsApi-3CR-_g5b.js.map → groupsApi-Db8G2lLs.js.map} +1 -1
- package/dist/chunks/{groupsApi-BUyBgf_N.js → groupsApi-lbxNsHFv.js} +2 -2
- package/dist/chunks/{groupsApi-BUyBgf_N.js.map → groupsApi-lbxNsHFv.js.map} +1 -1
- package/dist/chunks/{index-IJR_91Yt.js → index-BI2dc1FS.js} +2 -2
- package/dist/chunks/{index-IJR_91Yt.js.map → index-BI2dc1FS.js.map} +1 -1
- package/dist/chunks/{index-DIQ6Jmmq.js → index-Bn8HzILk.js} +4 -4
- package/dist/chunks/{index-DIQ6Jmmq.js.map → index-Bn8HzILk.js.map} +1 -1
- package/dist/chunks/{index-DA5VyW0k.js → index-CN2WRyg1.js} +2249 -2264
- package/dist/chunks/index-CN2WRyg1.js.map +1 -0
- package/dist/chunks/{index-Br2wsGE8.js → index-CTGSmYvs.js} +2 -2
- package/dist/chunks/{index-Br2wsGE8.js.map → index-CTGSmYvs.js.map} +1 -1
- package/dist/chunks/index-CUICSveU.js +2 -0
- package/dist/chunks/index-CUICSveU.js.map +1 -0
- package/dist/chunks/{index-S-X8qFYW.js → index-CgtbaFf5.js} +2 -2
- package/dist/chunks/{index-S-X8qFYW.js.map → index-CgtbaFf5.js.map} +1 -1
- package/dist/chunks/{index-_g82N2nb.js → index-D0HS542b.js} +2 -2
- package/dist/chunks/{index-_g82N2nb.js.map → index-D0HS542b.js.map} +1 -1
- package/dist/chunks/{index-BIqcvvbh.js → index-DEtq-xUL.js} +9 -8
- package/dist/chunks/index-DEtq-xUL.js.map +1 -0
- package/dist/chunks/{index-BOKR3bw6.js → index-DF93KQFR.js} +2 -2
- package/dist/chunks/{index-BOKR3bw6.js.map → index-DF93KQFR.js.map} +1 -1
- package/dist/chunks/{index-CxgEV-rT.js → index-DLekpNSE.js} +2 -2
- package/dist/chunks/{index-CxgEV-rT.js.map → index-DLekpNSE.js.map} +1 -1
- package/dist/chunks/{index-DEOBhXS_.js → index-DUS-tunb.js} +2 -2
- package/dist/chunks/{index-DEOBhXS_.js.map → index-DUS-tunb.js.map} +1 -1
- package/dist/chunks/{index-BMsjMCv9.js → index-DjC1u2hI.js} +3 -3
- package/dist/chunks/{index-BMsjMCv9.js.map → index-DjC1u2hI.js.map} +1 -1
- package/dist/chunks/{index-BxHVPJ-j.js → index-DqbVFB1H.js} +2 -2
- package/dist/chunks/{index-BxHVPJ-j.js.map → index-DqbVFB1H.js.map} +1 -1
- package/dist/chunks/{index-Djy4eIbB.js → index-DwqLhQ8S.js} +2 -2
- package/dist/chunks/{index-Djy4eIbB.js.map → index-DwqLhQ8S.js.map} +1 -1
- package/dist/chunks/{index-C1w97Ejz.js → index-HsAOBno4.js} +2 -2
- package/dist/chunks/{index-C1w97Ejz.js.map → index-HsAOBno4.js.map} +1 -1
- package/dist/chunks/{index-Czk12A3G.js → index-TiWOcC0g.js} +2 -2
- package/dist/chunks/{index-Czk12A3G.js.map → index-TiWOcC0g.js.map} +1 -1
- package/dist/chunks/{index-vXiLh35n.js → index-cAikSVW0.js} +13 -13
- package/dist/chunks/index-cAikSVW0.js.map +1 -0
- package/dist/chunks/{index-CNxx56kE.js → index-xhRXN1Jq.js} +2 -2
- package/dist/chunks/{index-CNxx56kE.js.map → index-xhRXN1Jq.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-COKA97Ug.js → tenantIconMap-CHeS7oLt.js} +2 -2
- package/dist/chunks/{tenantIconMap-COKA97Ug.js.map → tenantIconMap-CHeS7oLt.js.map} +1 -1
- package/dist/chunks/{tenantIconMap-BuSQUUyZ.js → tenantIconMap-__FKj6CN.js} +2 -2
- package/dist/chunks/{tenantIconMap-BuSQUUyZ.js.map → tenantIconMap-__FKj6CN.js.map} +1 -1
- package/dist/chunks/{ticketingApi-DbREwHez.js → ticketingApi-Cj239hYB.js} +2 -2
- package/dist/chunks/{ticketingApi-DbREwHez.js.map → ticketingApi-Cj239hYB.js.map} +1 -1
- package/dist/chunks/{ticketingApi-C6EbupqP.js → ticketingApi-DF4RwD_6.js} +2 -2
- package/dist/chunks/{ticketingApi-C6EbupqP.js.map → ticketingApi-DF4RwD_6.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-vucIb3_w.js → useAccessRequests-CFam8zFR.js} +3 -3
- package/dist/chunks/{useAccessRequests-vucIb3_w.js.map → useAccessRequests-CFam8zFR.js.map} +1 -1
- package/dist/chunks/{useAccessRequests-C0dY6y-4.js → useAccessRequests-CViOUwyF.js} +2 -2
- package/dist/chunks/{useAccessRequests-C0dY6y-4.js.map → useAccessRequests-CViOUwyF.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js → useUserAccessRequests-B-Cs6NX1.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-BBcw1Rk9.js.map → useUserAccessRequests-B-Cs6NX1.js.map} +1 -1
- package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js → useUserAccessRequests-CslSQeBJ.js} +2 -2
- package/dist/chunks/{useUserAccessRequests-Cj0nkesW.js.map → useUserAccessRequests-CslSQeBJ.js.map} +1 -1
- package/dist/contexts/AuthContext.d.ts.map +1 -1
- package/dist/pages/LoginPage.d.ts.map +1 -1
- package/dist/pages/platform/administration/tenants/TenantDetailPage.d.ts.map +1 -1
- package/dist/pages/platform/support/UserCreateTicketPage.d.ts.map +1 -1
- package/dist/services/api/apiClient.d.ts.map +1 -1
- package/dist/services/support/ticketDraftService.d.ts.map +1 -1
- package/dist/smartstack.cjs +1 -1
- package/dist/smartstack.js +6 -6
- package/dist/utils/permissions.generated.d.ts +288 -0
- package/dist/utils/permissions.generated.d.ts.map +1 -0
- package/dist/utils/uuid.d.ts +6 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/package.json +1 -1
- package/dist/chunks/UserCreateTicketPage-ChQL1mVY.js.map +0 -1
- package/dist/chunks/UserCreateTicketPage-DkjsHeV7.js.map +0 -1
- package/dist/chunks/auth-B-hELPDB.js +0 -2
- package/dist/chunks/auth-B-hELPDB.js.map +0 -1
- package/dist/chunks/auth-BYaMuq7D.js +0 -16
- package/dist/chunks/auth-BYaMuq7D.js.map +0 -1
- package/dist/chunks/auth-C5zpZ9k7.js +0 -2
- package/dist/chunks/auth-C5zpZ9k7.js.map +0 -1
- package/dist/chunks/auth-CDpRMVv1.js +0 -16
- package/dist/chunks/auth-CDpRMVv1.js.map +0 -1
- package/dist/chunks/auth-CyPkCta2.js +0 -2
- package/dist/chunks/auth-CyPkCta2.js.map +0 -1
- package/dist/chunks/auth-DL47kvnl.js +0 -2
- package/dist/chunks/auth-DL47kvnl.js.map +0 -1
- package/dist/chunks/auth-Diiv90i1.js +0 -16
- package/dist/chunks/auth-Diiv90i1.js.map +0 -1
- package/dist/chunks/auth-rog9MvUr.js +0 -16
- package/dist/chunks/auth-rog9MvUr.js.map +0 -1
- package/dist/chunks/index-BIqcvvbh.js.map +0 -1
- package/dist/chunks/index-DA5VyW0k.js.map +0 -1
- package/dist/chunks/index-Dht6EQW1.js +0 -2
- package/dist/chunks/index-Dht6EQW1.js.map +0 -1
- package/dist/chunks/index-vXiLh35n.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),N=require("react"),K=require("react-i18next"),L=require("react-router-dom"),T=require("./index-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),N=require("react"),K=require("react-i18next"),L=require("react-router-dom"),T=require("./index-cAikSVW0.js"),n=require("lucide-react"),V=[{id:"general",labelKey:"settings.tabs.general",icon:n.Settings,route:"/administration/configuration/settings/general"},{id:"file-upload",labelKey:"settings.tabs.fileUpload",icon:n.Upload,route:"/administration/configuration/settings/file-upload"},{id:"legal-file",labelKey:"settings.tabs.legalFile",icon:n.FileText,route:"/administration/configuration/settings/legal-file"}];function M(){const{t}=K.useTranslation("admin"),w=L.useNavigate(),y=L.useLocation(),[x,h]=N.useState([]),[m,u]=N.useState(!0),g=N.useCallback(async()=>{try{u(!0);const v=await T.adminApi.settings.getAll();h(v)}catch(v){console.error("Failed to load settings:",v)}finally{u(!1)}},[]);N.useEffect(()=>{g()},[g]);const k=()=>{const v=y.pathname;return V.find(p=>v.includes(p.id))?.id||"general"},S=v=>{const b=V.find(p=>p.id===v);b&&w(b.route)};return m?e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx(n.Loader2,{className:"w-8 h-8 animate-spin text-[var(--color-accent-600)]"})}):e.jsxs("div",{className:"space-y-6",children:[e.jsx(T.Breadcrumb,{items:[{label:t("header.title"),href:"/administration"},{label:t("settings.title","Settings")}]}),e.jsx("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:t("settings.title")}),e.jsx("p",{className:"text-[var(--text-secondary)] mt-1",children:t("settings.subtitle")})]})}),e.jsx("div",{className:"border-b border-[var(--border-color)]",children:e.jsx("nav",{className:"-mb-px flex space-x-8","aria-label":"Tabs",children:V.map(v=>{const b=v.icon,p=k()===v.id;return e.jsxs("button",{onClick:()=>S(v.id),className:`
|
|
2
2
|
group inline-flex items-center py-4 px-1 border-b-2 font-medium text-sm transition-colors
|
|
3
3
|
${p?"border-[var(--color-accent-500)] text-[var(--color-accent-600)]":"border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]"}
|
|
4
4
|
`,children:[e.jsx(b,{className:`mr-2 h-5 w-5 ${p?"text-[var(--color-accent-500)]":"text-[var(--text-tertiary)] group-hover:text-[var(--text-secondary)]"}`}),t(v.labelKey)]},v.id)})})}),e.jsx(L.Outlet,{context:{settings:x,refreshSettings:g}})]})}function U(){const{settings:t,refreshSettings:w}=L.useOutletContext(),[y,x]=N.useState({}),[h,m]=N.useState(null),[u,g]=N.useState(null),[k,S]=N.useState([]),[v,b]=N.useState(!1),p=(o,c,i)=>{x(f=>({...f,[`${o}.${c}`]:i}))},D=o=>{const c=`${o.category}.${o.key}`;return y[c]!==void 0&&y[c]!==o.value},C=o=>{const c=`${o.category}.${o.key}`;return y[c]??o.value},$=o=>`${o.category}.${o.key}`;return{settings:t,editedValues:y,saving:h,historyModal:u,history:k,loadingHistory:v,handleValueChange:p,hasChanges:D,getDisplayValue:C,getEditKey:$,handleSave:async o=>{const c=$(o),i=y[c];if(!(i===void 0||i===o.value))try{m(c),await T.adminApi.settings.update(o.category,o.key,i),x(f=>{const A={...f};return delete A[c],A}),await w()}catch(f){console.error("Failed to save setting:",f)}finally{m(null)}},handleReset:async o=>{const c=$(o);try{m(c),await T.adminApi.settings.reset(o.category,o.key),x(i=>{const f={...i};return delete f[c],f}),await w()}catch(i){console.error("Failed to reset setting:",i)}finally{m(null)}},openHistory:async(o,c)=>{g({category:o,key:c}),b(!0);try{const i=await T.adminApi.settings.getHistory(o,c);S(i)}catch(i){console.error("Failed to load history:",i)}finally{b(!1)}},closeHistory:()=>g(null)}}function R({category:t,settingKey:w,history:y,loading:x,onClose:h}){const{t:m}=K.useTranslation("admin");return e.jsx("div",{className:"fixed inset-0 z-50 overflow-y-auto",children:e.jsxs("div",{className:"flex items-center justify-center min-h-screen px-4",children:[e.jsx("button",{type:"button",className:"fixed inset-0 bg-black/50",onClick:h,"aria-label":"Close modal"}),e.jsxs("div",{className:"relative rounded-[var(--radius-card)] bg-[var(--bg-card)] shadow-xl max-w-2xl w-full p-6",children:[e.jsx("h3",{className:"text-lg font-semibold text-[var(--text-primary)] mb-4",children:m("settings.historyTitle",{key:`${t}.${w}`})}),x&&e.jsx("div",{className:"flex justify-center py-8",children:e.jsx(n.Loader2,{className:"w-8 h-8 animate-spin text-[var(--color-accent-600)]"})}),!x&&y.length===0&&e.jsx("p",{className:"text-center py-8 text-[var(--text-secondary)]",children:m("settings.noHistory")}),!x&&y.length>0&&e.jsx("div",{className:"space-y-3 max-h-96 overflow-y-auto",children:y.map(u=>e.jsxs("div",{className:"p-3 bg-[var(--bg-secondary)] rounded-lg",children:[e.jsxs("div",{className:"flex justify-between text-sm",children:[e.jsx("span",{className:"text-[var(--text-secondary)]",children:u.changedByUserName||m("settings.system")}),e.jsx("span",{className:"text-[var(--text-tertiary)]",children:new Date(u.changedAt).toLocaleString()})]}),e.jsxs("div",{className:"mt-2 text-sm",children:[e.jsx("span",{className:"text-[var(--error-text)] line-through",children:u.oldValue}),e.jsx("span",{className:"mx-2 text-[var(--text-tertiary)]",children:"→"}),e.jsx("span",{className:"text-[var(--success-text)]",children:u.newValue})]})]},u.id))}),e.jsx("div",{className:"mt-6 flex justify-end",children:e.jsx("button",{onClick:h,className:"px-4 py-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors",children:m("common.cancel")})})]})]})})}function I(){const{t}=K.useTranslation("admin"),{settings:w,saving:y,historyModal:x,history:h,loadingHistory:m,handleValueChange:u,hasChanges:g,getDisplayValue:k,getEditKey:S,handleSave:v,handleReset:b,openHistory:p,closeHistory:D}=U(),C=w.filter(s=>s.category==="Session"),$=w.filter(s=>s.category==="General"),E=s=>s==="Database"?"bg-[var(--color-accent-500)]/10 text-[var(--color-accent-600)]":s==="AppSettings"?"bg-purple-500/10 text-purple-600 dark:text-purple-400":"bg-[var(--bg-secondary)] text-[var(--text-tertiary)]",F=(s,o,c)=>s.valueType==="Bool"?e.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:o==="true",onChange:i=>u(s.category,s.key,i.target.checked?"true":"false"),disabled:!s.isEditable||c,className:"sr-only peer"}),e.jsx("div",{className:"w-11 h-6 bg-[var(--bg-tertiary)] peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-[var(--color-accent-500)]/30 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-[var(--border-color)] after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-[var(--color-accent-600)] peer-disabled:opacity-50 peer-disabled:cursor-not-allowed"})]}):s.valueType==="Int"||s.valueType==="Decimal"?e.jsx("input",{type:"number",value:o,onChange:i=>u(s.category,s.key,i.target.value),disabled:!s.isEditable||c,className:"w-24 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]"}):e.jsx("input",{type:s.isSensitive?"password":"text",value:s.isSensitive?"********":o,onChange:i=>u(s.category,s.key,i.target.value),disabled:!s.isEditable||c||s.isSensitive,className:"w-48 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]"}),a=s=>{const o=S(s),c=y===o,i=g(s),f=k(s);return e.jsxs("div",{className:"flex items-center justify-between py-4 border-b border-[var(--border-color)] last:border-0",children:[e.jsxs("div",{className:"flex-1 min-w-0 pr-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-medium text-[var(--text-primary)]",children:t(`settings.keys.${s.category}.${s.key}`,s.key)}),!s.isEditable&&e.jsx("span",{className:"px-2 py-0.5 text-xs bg-[var(--bg-secondary)] text-[var(--text-tertiary)] rounded",children:t("settings.readonly")}),e.jsx("span",{className:`px-2 py-0.5 text-xs rounded ${E(s.source)}`,children:s.source})]}),s.description&&e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:t(`settings.descriptions.${s.category}.${s.key}`,s.description)}),s.modifiedAt&&e.jsxs("p",{className:"text-xs text-[var(--text-tertiary)] mt-1 flex items-center gap-1",children:[e.jsx(n.Clock,{className:"w-3 h-3"}),t("settings.modifiedBy",{user:s.modifiedByUserName,date:new Date(s.modifiedAt).toLocaleString()})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[F(s,f,c),s.isEditable&&s.source==="Database"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:()=>v(s),disabled:!i||c,className:"p-2 text-[var(--color-accent-600)] hover:bg-[var(--color-accent-500)]/10 rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors",title:t("common.save"),children:c?e.jsx(n.Loader2,{className:"w-4 h-4 animate-spin"}):e.jsx(n.Save,{className:"w-4 h-4"})}),e.jsx("button",{onClick:()=>b(s),disabled:s.value===s.defaultValue||c,className:"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors",title:t("settings.resetToDefault"),children:e.jsx(n.RotateCcw,{className:"w-4 h-4"})}),e.jsx("button",{onClick:()=>p(s.category,s.key),className:"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors",title:t("settings.viewHistory"),children:e.jsx(n.History,{className:"w-4 h-4"})})]})]})]},o)};return e.jsxs("div",{className:"space-y-6",children:[C.length>0&&e.jsxs("div",{className:"rounded-[var(--radius-card)] border border-[var(--border-color)] bg-[var(--bg-card)] overflow-hidden shadow-sm",children:[e.jsx("div",{className:"px-6 py-4 bg-gradient-to-r from-[var(--color-accent-500)]/10 to-[var(--color-accent-600)]/5 border-b border-[var(--border-color)]",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"p-2 rounded-lg bg-[var(--color-accent-500)]/20",children:e.jsx(n.Clock,{className:"w-5 h-5 text-[var(--color-accent-600)]"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold text-[var(--text-primary)]",children:t("settings.sections.session")}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:t("settings.sections.sessionDescription")})]})]})}),e.jsx("div",{className:"px-6 py-2",children:C.map(a)})]}),$.length>0&&e.jsxs("div",{className:"rounded-[var(--radius-card)] border border-[var(--border-color)] bg-[var(--bg-card)] overflow-hidden shadow-sm",children:[e.jsx("div",{className:"px-6 py-4 bg-gradient-to-r from-[var(--color-accent-500)]/10 to-[var(--color-accent-600)]/5 border-b border-[var(--border-color)]",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"p-2 rounded-lg bg-[var(--color-accent-500)]/20",children:e.jsx(n.Settings,{className:"w-5 h-5 text-[var(--color-accent-600)]"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold text-[var(--text-primary)]",children:t("settings.sections.general")}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:t("settings.sections.generalDescription")})]})]})}),e.jsx("div",{className:"px-6 py-2",children:$.map(a)})]}),C.length===0&&$.length===0&&e.jsx("div",{className:"text-center py-12 text-[var(--text-secondary)]",children:t("settings.noSettings")}),x&&e.jsx(R,{category:x.category,settingKey:x.key,history:h,loading:m,onClose:D})]})}function q(){const{t}=K.useTranslation("admin"),{settings:w,saving:y,historyModal:x,history:h,loadingHistory:m,handleValueChange:u,hasChanges:g,getDisplayValue:k,getEditKey:S,handleSave:v,handleReset:b,openHistory:p,closeHistory:D}=U(),C=w.filter(a=>a.category==="FileUpload"),$=a=>{try{return JSON.parse(a)}catch{return[]}},E=(a,s,o)=>a.valueType==="Int"?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"number",value:s,onChange:c=>u(a.category,a.key,c.target.value),disabled:!a.isEditable||o,className:"w-24 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]"}),a.key==="MaxFileSizeMB"&&e.jsx("span",{className:"text-sm text-[var(--text-secondary)]",children:"MB"})]}):e.jsx("input",{type:a.isSensitive?"password":"text",value:a.isSensitive?"********":s,onChange:c=>u(a.category,a.key,c.target.value),disabled:!a.isEditable||o||a.isSensitive,className:"w-48 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]"}),F=a=>{const s=S(a),o=y===s,c=g(a),i=k(a);if(a.valueType==="Json"&&a.key==="AllowedExtensions"){const f=$(i);return e.jsxs("div",{className:"py-4 border-b border-[var(--border-color)] last:border-0",children:[e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-medium text-[var(--text-primary)]",children:t(`settings.keys.${a.category}.${a.key}`,a.key)}),!a.isEditable&&e.jsx("span",{className:"px-2 py-0.5 text-xs bg-[var(--bg-secondary)] text-[var(--text-tertiary)] rounded",children:t("settings.readonly")}),e.jsx("span",{className:"px-2 py-0.5 text-xs bg-[var(--color-accent-500)]/10 text-[var(--color-accent-600)] rounded",children:a.source})]}),a.description&&e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:t(`settings.descriptions.${a.category}.${a.key}`,a.description)})]}),a.isEditable&&a.source==="Database"&&e.jsx("button",{onClick:()=>p(a.category,a.key),className:"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors",title:t("settings.viewHistory"),children:e.jsx(n.History,{className:"w-4 h-4"})})]}),e.jsx("div",{className:"flex flex-wrap gap-2",children:f.map(A=>e.jsx("span",{className:"px-3 py-1 bg-[var(--bg-secondary)] text-[var(--text-secondary)] rounded-full text-sm",children:A},A))})]},s)}return e.jsxs("div",{className:"flex items-center justify-between py-4 border-b border-[var(--border-color)] last:border-0",children:[e.jsxs("div",{className:"flex-1 min-w-0 pr-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-medium text-[var(--text-primary)]",children:t(`settings.keys.${a.category}.${a.key}`,a.key)}),!a.isEditable&&e.jsx("span",{className:"px-2 py-0.5 text-xs bg-[var(--bg-secondary)] text-[var(--text-tertiary)] rounded",children:t("settings.readonly")}),e.jsx("span",{className:`px-2 py-0.5 text-xs rounded ${a.source==="Database"?"bg-[var(--color-accent-500)]/10 text-[var(--color-accent-600)]":a.source==="AppSettings"?"bg-purple-500/10 text-purple-600 dark:text-purple-400":"bg-[var(--bg-secondary)] text-[var(--text-tertiary)]"}`,children:a.source})]}),a.description&&e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:t(`settings.descriptions.${a.category}.${a.key}`,a.description)}),a.modifiedAt&&e.jsxs("p",{className:"text-xs text-[var(--text-tertiary)] mt-1 flex items-center gap-1",children:[e.jsx(n.Clock,{className:"w-3 h-3"}),t("settings.modifiedBy",{user:a.modifiedByUserName,date:new Date(a.modifiedAt).toLocaleString()})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[E(a,i,o),a.isEditable&&a.source==="Database"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:()=>v(a),disabled:!c||o,className:"p-2 text-[var(--color-accent-600)] hover:bg-[var(--color-accent-500)]/10 rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors",title:t("common.save"),children:o?e.jsx(n.Loader2,{className:"w-4 h-4 animate-spin"}):e.jsx(n.Save,{className:"w-4 h-4"})}),e.jsx("button",{onClick:()=>b(a),disabled:a.value===a.defaultValue||o,className:"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors",title:t("settings.resetToDefault"),children:e.jsx(n.RotateCcw,{className:"w-4 h-4"})}),e.jsx("button",{onClick:()=>p(a.category,a.key),className:"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors",title:t("settings.viewHistory"),children:e.jsx(n.History,{className:"w-4 h-4"})})]})]})]},s)};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"rounded-[var(--radius-card)] border border-[var(--border-color)] bg-[var(--bg-card)] overflow-hidden shadow-sm",children:[e.jsx("div",{className:"px-6 py-4 bg-gradient-to-r from-[var(--color-accent-500)]/10 to-[var(--color-accent-600)]/5 border-b border-[var(--border-color)]",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"p-2 rounded-lg bg-[var(--color-accent-500)]/20",children:e.jsx(n.Upload,{className:"w-5 h-5 text-[var(--color-accent-600)]"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold text-[var(--text-primary)]",children:t("settings.sections.fileUpload")}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:t("settings.sections.fileUploadDescription")})]})]})}),e.jsx("div",{className:"px-6 py-2",children:C.length>0?C.map(F):e.jsx("div",{className:"text-center py-8 text-[var(--text-secondary)]",children:t("settings.noSettings")})})]}),x&&e.jsx(R,{category:x.category,settingKey:x.key,history:h,loading:m,onClose:D})]})}function P(){const{t}=K.useTranslation("admin"),{settings:w,refreshSettings:y}=L.useOutletContext(),[x,h]=N.useState({}),[m,u]=N.useState(null),[g,k]=N.useState(null),[S,v]=N.useState([]),[b,p]=N.useState(!1),D=w.filter(r=>r.category==="LegalFile"),C=(r,l,d)=>{h(j=>({...j,[`${r}.${l}`]:d}))},$=r=>{const l=`${r.category}.${r.key}`;return x[l]!==void 0&&x[l]!==r.value},E=r=>{const l=`${r.category}.${r.key}`;return x[l]??r.value},F=async r=>{const l=`${r.category}.${r.key}`,d=x[l];if(!(d===void 0||d===r.value))try{u(l),await T.adminApi.settings.update(r.category,r.key,d),h(j=>{const H={...j};return delete H[l],H}),await y()}catch(j){console.error("Failed to save setting:",j)}finally{u(null)}},a=async r=>{const l=`${r.category}.${r.key}`;try{u(l),await T.adminApi.settings.reset(r.category,r.key),h(d=>{const j={...d};return delete j[l],j}),await y()}catch(d){console.error("Failed to reset setting:",d)}finally{u(null)}},s=async(r,l)=>{k({category:r,key:l}),p(!0);try{const d=await T.adminApi.settings.getHistory(r,l);v(d)}catch(d){console.error("Failed to load history:",d)}finally{p(!1)}},o=r=>{const l=Math.floor(r/365),d=r%365;return d===0?`${l} ${t("settings.years")}`:`${l} ${t("settings.years")} ${d} ${t("settings.days")}`},c=r=>!r.isEditable&&(r.key==="RetentionDays"||r.key==="EnableWorm"),i=(r,l,d,j)=>r.valueType==="Bool"?e.jsxs("label",{className:"relative inline-flex cursor-pointer",children:[e.jsx("span",{className:"sr-only",children:r.key}),e.jsx("input",{type:"checkbox",checked:l==="true",onChange:H=>j(r.category,r.key,H.target.checked?"true":"false"),disabled:!r.isEditable||d,className:"sr-only peer","aria-label":r.key}),e.jsx("div",{className:"w-11 h-6 bg-[var(--bg-tertiary)] peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-[var(--color-accent-500)]/30 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-[var(--border-color)] after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-[var(--color-accent-600)] peer-disabled:opacity-50 peer-disabled:cursor-not-allowed"})]}):r.valueType==="Int"?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"number",value:l,onChange:H=>j(r.category,r.key,H.target.value),disabled:!r.isEditable||d,className:"w-24 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]"}),(r.key==="RetentionDays"||r.key==="ArchiveAfterDays")&&e.jsxs("span",{className:"text-sm text-[var(--text-secondary)]",children:["(",o(parseInt(l)||0),")"]})]}):e.jsx("input",{type:r.isSensitive?"password":"text",value:r.isSensitive?"********":l,onChange:H=>j(r.category,r.key,H.target.value),disabled:!r.isEditable||d||r.isSensitive,className:"w-48 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]"}),f=r=>r==="Database"?"bg-[var(--color-accent-500)]/10 text-[var(--color-accent-600)]":r==="AppSettings"?"bg-purple-500/10 text-purple-600 dark:text-purple-400":"bg-[var(--bg-secondary)] text-[var(--text-tertiary)]",A=r=>{const l=`${r.category}.${r.key}`,d=m===l,j=$(r),H=E(r),B=c(r);return e.jsxs("div",{className:`flex items-center justify-between py-4 border-b border-[var(--border-color)] last:border-0 ${B?"bg-[var(--warning-bg)] -mx-6 px-6":""}`,children:[e.jsxs("div",{className:"flex-1 min-w-0 pr-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-medium text-[var(--text-primary)]",children:t(`settings.keys.${r.category}.${r.key}`,r.key)}),B&&e.jsxs("span",{className:"px-2 py-0.5 text-xs bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)] rounded flex items-center gap-1",children:[e.jsx(n.Shield,{className:"w-3 h-3"}),t("settings.legallyProtected")]}),!r.isEditable&&!B&&e.jsx("span",{className:"px-2 py-0.5 text-xs bg-[var(--bg-secondary)] text-[var(--text-tertiary)] rounded",children:t("settings.readonly")}),e.jsx("span",{className:`px-2 py-0.5 text-xs rounded ${f(r.source)}`,children:r.source})]}),r.description&&e.jsx("p",{className:"text-sm text-[var(--text-secondary)] mt-1",children:t(`settings.descriptions.${r.category}.${r.key}`,r.description)}),r.modifiedAt&&e.jsxs("p",{className:"text-xs text-[var(--text-tertiary)] mt-1 flex items-center gap-1",children:[e.jsx(n.Clock,{className:"w-3 h-3"}),t("settings.modifiedBy",{user:r.modifiedByUserName,date:new Date(r.modifiedAt).toLocaleString()})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[i(r,H,d,C),r.isEditable&&r.source==="Database"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:()=>F(r),disabled:!j||d,className:"p-2 text-[var(--color-accent-600)] hover:bg-[var(--color-accent-500)]/10 rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors",title:t("common.save"),children:d?e.jsx(n.Loader2,{className:"w-4 h-4 animate-spin"}):e.jsx(n.Save,{className:"w-4 h-4"})}),e.jsx("button",{onClick:()=>a(r),disabled:r.value===r.defaultValue||d,className:"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors",title:t("settings.resetToDefault"),children:e.jsx(n.RotateCcw,{className:"w-4 h-4"})}),e.jsx("button",{onClick:()=>s(r.category,r.key),className:"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors",title:t("settings.viewHistory"),children:e.jsx(n.History,{className:"w-4 h-4"})})]})]})]},l)};return e.jsxs("div",{className:"space-y-6",children:[e.jsx("div",{className:"bg-[var(--warning-bg)] border border-[var(--warning-border)] rounded-[var(--radius-card)] p-4",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(n.AlertTriangle,{className:"w-5 h-5 text-[var(--warning-text)] flex-shrink-0 mt-0.5"}),e.jsxs("div",{children:[e.jsx("h4",{className:"font-medium text-[var(--warning-text)]",children:t("settings.legalWarningTitle")}),e.jsx("p",{className:"text-sm text-[var(--warning-text)] opacity-90 mt-1",children:t("settings.legalWarningDescription")})]})]})}),e.jsxs("div",{className:"rounded-[var(--radius-card)] border border-[var(--border-color)] bg-[var(--bg-card)] overflow-hidden shadow-sm",children:[e.jsx("div",{className:"px-6 py-4 bg-gradient-to-r from-amber-500/10 to-amber-600/5 border-b border-[var(--border-color)]",children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"p-2 rounded-lg bg-amber-500/20",children:e.jsx(n.FileText,{className:"w-5 h-5 text-amber-600"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-lg font-semibold text-[var(--text-primary)]",children:t("settings.sections.legalFile")}),e.jsx("p",{className:"text-sm text-[var(--text-secondary)]",children:t("settings.sections.legalFileDescription")})]})]})}),e.jsx("div",{className:"px-6 py-2",children:D.length>0?D.map(A):e.jsx("div",{className:"text-center py-8 text-[var(--text-secondary)]",children:t("settings.noSettings")})})]}),g&&e.jsx("div",{className:"fixed inset-0 z-50 overflow-y-auto",children:e.jsxs("div",{className:"flex items-center justify-center min-h-screen px-4",children:[e.jsx("button",{type:"button",className:"fixed inset-0 bg-black/50",onClick:()=>k(null),"aria-label":"Close modal"}),e.jsxs("div",{className:"relative rounded-[var(--radius-card)] bg-[var(--bg-card)] shadow-xl max-w-2xl w-full p-6",children:[e.jsx("h3",{className:"text-lg font-semibold text-[var(--text-primary)] mb-4",children:t("settings.historyTitle",{key:`${g.category}.${g.key}`})}),b&&e.jsx("div",{className:"flex justify-center py-8",children:e.jsx(n.Loader2,{className:"w-8 h-8 animate-spin text-[var(--color-accent-600)]"})}),!b&&S.length===0&&e.jsx("p",{className:"text-center py-8 text-[var(--text-secondary)]",children:t("settings.noHistory")}),!b&&S.length>0&&e.jsx("div",{className:"space-y-3 max-h-96 overflow-y-auto",children:S.map(r=>e.jsxs("div",{className:"p-3 bg-[var(--bg-secondary)] rounded-lg",children:[e.jsxs("div",{className:"flex justify-between text-sm",children:[e.jsx("span",{className:"text-[var(--text-secondary)]",children:r.changedByUserName||t("settings.system")}),e.jsx("span",{className:"text-[var(--text-tertiary)]",children:new Date(r.changedAt).toLocaleString()})]}),e.jsxs("div",{className:"mt-2 text-sm",children:[e.jsx("span",{className:"text-[var(--error-text)] line-through",children:r.oldValue}),e.jsx("span",{className:"mx-2 text-[var(--text-tertiary)]",children:"→"}),e.jsx("span",{className:"text-[var(--success-text)]",children:r.newValue})]})]},r.id))}),e.jsx("div",{className:"mt-6 flex justify-end",children:e.jsx("button",{onClick:()=>k(null),className:"px-4 py-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors",children:t("common.cancel")})})]})]})})]})}exports.FileUploadSettingsSection=q;exports.GeneralSettingsSection=I;exports.LegalFileSettingsSection=P;exports.SettingsPage=M;
|
|
5
|
-
//# sourceMappingURL=index-
|
|
5
|
+
//# sourceMappingURL=index-HsAOBno4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-C1w97Ejz.js","sources":["../../src/pages/platform/administration/configuration/settings/SettingsPage.tsx","../../src/hooks/useSettingsSection.ts","../../src/components/platform/administration/settings/SettingsHistoryModal.tsx","../../src/pages/platform/administration/configuration/settings/GeneralSettingsSection.tsx","../../src/pages/platform/administration/configuration/settings/FileUploadSettingsSection.tsx","../../src/pages/platform/administration/configuration/settings/LegalFileSettingsSection.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate, useLocation, Outlet } from 'react-router-dom';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { Settings, Upload, FileText, Loader2 } from 'lucide-react';\r\nimport { adminApi, type SettingViewModel } from '@/services/api/adminApi';\r\n\r\ninterface TabConfig {\r\n id: string;\r\n labelKey: string;\r\n icon: React.ElementType;\r\n route: string;\r\n}\r\n\r\nconst TABS: TabConfig[] = [\r\n { id: 'general', labelKey: 'settings.tabs.general', icon: Settings, route: '/administration/configuration/settings/general' },\r\n { id: 'file-upload', labelKey: 'settings.tabs.fileUpload', icon: Upload, route: '/administration/configuration/settings/file-upload' },\r\n { id: 'legal-file', labelKey: 'settings.tabs.legalFile', icon: FileText, route: '/administration/configuration/settings/legal-file' }\r\n];\r\n\r\nexport function SettingsPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n const [settings, setSettings] = useState<SettingViewModel[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n\r\n const loadSettings = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await adminApi.settings.getAll();\r\n setSettings(result);\r\n } catch (err) {\r\n console.error('Failed to load settings:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadSettings();\r\n }, [loadSettings]);\r\n\r\n const getCurrentTab = () => {\r\n const path = location.pathname;\r\n const tab = TABS.find(t => path.includes(t.id));\r\n return tab?.id || 'general';\r\n };\r\n\r\n const handleTabChange = (tabId: string) => {\r\n const tab = TABS.find(t => t.id === tabId);\r\n if (tab) {\r\n navigate(tab.route);\r\n }\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('settings.title', 'Settings') }\r\n ]}\r\n />\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('settings.title')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('settings.subtitle')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {/* Tabs */}\r\n <div className=\"border-b border-[var(--border-color)]\">\r\n <nav className=\"-mb-px flex space-x-8\" aria-label=\"Tabs\">\r\n {TABS.map((tab) => {\r\n const Icon = tab.icon;\r\n const isActive = getCurrentTab() === tab.id;\r\n return (\r\n <button\r\n key={tab.id}\r\n onClick={() => handleTabChange(tab.id)}\r\n className={`\r\n group inline-flex items-center py-4 px-1 border-b-2 font-medium text-sm transition-colors\r\n ${isActive\r\n ? 'border-[var(--color-accent-500)] text-[var(--color-accent-600)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]'\r\n }\r\n `}\r\n >\r\n <Icon className={`mr-2 h-5 w-5 ${isActive ? 'text-[var(--color-accent-500)]' : 'text-[var(--text-tertiary)] group-hover:text-[var(--text-secondary)]'}`} />\r\n {t(tab.labelKey)}\r\n </button>\r\n );\r\n })}\r\n </nav>\r\n </div>\r\n\r\n {/* Content */}\r\n <Outlet context={{ settings, refreshSettings: loadSettings }} />\r\n </div>\r\n );\r\n}\r\n\r\nexport default SettingsPage;\r\n","import { useState } from 'react';\r\nimport { useOutletContext } from 'react-router-dom';\r\nimport { adminApi, type SettingViewModel, type SettingHistoryDto } from '@/services/api/adminApi';\r\n\r\ninterface SettingsContext {\r\n settings: SettingViewModel[];\r\n refreshSettings: () => Promise<void>;\r\n}\r\n\r\nexport function useSettingsSection(): {\n settings: SettingViewModel[];\n editedValues: Record<string, string>;\n saving: string | null;\n historyModal: { category: string; key: string } | null;\n history: SettingHistoryDto[];\n loadingHistory: boolean;\n handleValueChange: (category: string, key: string, value: string) => void;\n hasChanges: (setting: SettingViewModel) => boolean;\n getDisplayValue: (setting: SettingViewModel) => string;\n getEditKey: (setting: SettingViewModel) => string;\n handleSave: (setting: SettingViewModel) => Promise<void>;\n handleReset: (setting: SettingViewModel) => Promise<void>;\n openHistory: (category: string, key: string) => Promise<void>;\n closeHistory: () => void;\n} {\r\n const { settings, refreshSettings } = useOutletContext<SettingsContext>();\r\n const [editedValues, setEditedValues] = useState<Record<string, string>>({});\r\n const [saving, setSaving] = useState<string | null>(null);\r\n const [historyModal, setHistoryModal] = useState<{ category: string; key: string } | null>(null);\r\n const [history, setHistory] = useState<SettingHistoryDto[]>([]);\r\n const [loadingHistory, setLoadingHistory] = useState(false);\r\n\r\n const handleValueChange = (category: string, key: string, value: string) => {\r\n setEditedValues(prev => ({\r\n ...prev,\r\n [`${category}.${key}`]: value\r\n }));\r\n };\r\n\r\n const hasChanges = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n return editedValues[editKey] !== undefined && editedValues[editKey] !== setting.value;\r\n };\r\n\r\n const getDisplayValue = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n return editedValues[editKey] ?? setting.value;\r\n };\r\n\r\n const getEditKey = (setting: SettingViewModel) => `${setting.category}.${setting.key}`;\r\n\r\n const handleSave = async (setting: SettingViewModel) => {\r\n const editKey = getEditKey(setting);\r\n const newValue = editedValues[editKey];\r\n if (newValue === undefined || newValue === setting.value) return;\r\n\r\n try {\r\n setSaving(editKey);\r\n await adminApi.settings.update(setting.category, setting.key, newValue);\r\n setEditedValues(prev => {\r\n const next = { ...prev };\r\n delete next[editKey];\r\n return next;\r\n });\r\n await refreshSettings();\r\n } catch (err) {\r\n console.error('Failed to save setting:', err);\r\n } finally {\r\n setSaving(null);\r\n }\r\n };\r\n\r\n const handleReset = async (setting: SettingViewModel) => {\r\n const editKey = getEditKey(setting);\r\n try {\r\n setSaving(editKey);\r\n await adminApi.settings.reset(setting.category, setting.key);\r\n setEditedValues(prev => {\r\n const next = { ...prev };\r\n delete next[editKey];\r\n return next;\r\n });\r\n await refreshSettings();\r\n } catch (err) {\r\n console.error('Failed to reset setting:', err);\r\n } finally {\r\n setSaving(null);\r\n }\r\n };\r\n\r\n const openHistory = async (category: string, key: string) => {\r\n setHistoryModal({ category, key });\r\n setLoadingHistory(true);\r\n try {\r\n const result = await adminApi.settings.getHistory(category, key);\r\n setHistory(result);\r\n } catch (err) {\r\n console.error('Failed to load history:', err);\r\n } finally {\r\n setLoadingHistory(false);\r\n }\r\n };\r\n\r\n const closeHistory = () => setHistoryModal(null);\r\n\r\n return {\r\n settings,\r\n editedValues,\r\n saving,\r\n historyModal,\r\n history,\r\n loadingHistory,\r\n handleValueChange,\r\n hasChanges,\r\n getDisplayValue,\r\n getEditKey,\r\n handleSave,\r\n handleReset,\r\n openHistory,\r\n closeHistory,\r\n };\r\n}\r\n\r\nexport type { SettingsContext };\r\n","import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Loader2 } from 'lucide-react';\r\nimport type { SettingHistoryDto } from '@/services/api/adminApi';\r\n\r\ninterface SettingsHistoryModalProps {\r\n readonly category: string;\r\n readonly settingKey: string;\r\n readonly history: SettingHistoryDto[];\r\n readonly loading: boolean;\r\n readonly onClose: () => void;\r\n}\r\n\r\nexport function SettingsHistoryModal({ category, settingKey, history, loading, onClose }: SettingsHistoryModalProps): ReactElement {\r\n const { t } = useTranslation('admin');\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50 overflow-y-auto\">\r\n <div className=\"flex items-center justify-center min-h-screen px-4\">\r\n <button type=\"button\" className=\"fixed inset-0 bg-black/50\" onClick={onClose} aria-label=\"Close modal\" />\r\n <div className=\"relative rounded-[var(--radius-card)] bg-[var(--bg-card)] shadow-xl max-w-2xl w-full p-6\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4\">\r\n {t('settings.historyTitle', { key: `${category}.${settingKey}` })}\r\n </h3>\r\n\r\n {loading && (\r\n <div className=\"flex justify-center py-8\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-600)]\" />\r\n </div>\r\n )}\r\n {!loading && history.length === 0 && (\r\n <p className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('settings.noHistory')}\r\n </p>\r\n )}\r\n {!loading && history.length > 0 && (\r\n <div className=\"space-y-3 max-h-96 overflow-y-auto\">\r\n {history.map((entry) => (\r\n <div key={entry.id} className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex justify-between text-sm\">\r\n <span className=\"text-[var(--text-secondary)]\">\r\n {entry.changedByUserName || t('settings.system')}\r\n </span>\r\n <span className=\"text-[var(--text-tertiary)]\">\r\n {new Date(entry.changedAt).toLocaleString()}\r\n </span>\r\n </div>\r\n <div className=\"mt-2 text-sm\">\r\n <span className=\"text-[var(--error-text)] line-through\">{entry.oldValue}</span>\r\n <span className=\"mx-2 text-[var(--text-tertiary)]\">→</span>\r\n <span className=\"text-[var(--success-text)]\">{entry.newValue}</span>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <div className=\"mt-6 flex justify-end\">\r\n <button\r\n onClick={onClose}\r\n className=\"px-4 py-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport { Save, RotateCcw, Loader2, Clock, History, Settings as SettingsIcon } from 'lucide-react';\r\nimport type { SettingViewModel } from '@/services/api/adminApi';\r\nimport { useSettingsSection } from '@/hooks/useSettingsSection';\r\nimport { SettingsHistoryModal } from '@/components/platform/administration/settings/SettingsHistoryModal';\r\n\r\nexport function GeneralSettingsSection(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const {\r\n settings,\r\n saving,\r\n historyModal,\r\n history,\r\n loadingHistory,\r\n handleValueChange,\r\n hasChanges,\r\n getDisplayValue,\r\n getEditKey,\r\n handleSave,\r\n handleReset,\r\n openHistory,\r\n closeHistory,\r\n } = useSettingsSection();\r\n\r\n // Filter settings for Session and General categories\r\n const sessionSettings = settings.filter(s => s.category === 'Session');\r\n const generalSettings = settings.filter(s => s.category === 'General');\r\n\r\n const getSourceBadgeClass = (source: string): string => {\r\n if (source === 'Database') {\r\n return 'bg-[var(--color-accent-500)]/10 text-[var(--color-accent-600)]';\r\n }\r\n if (source === 'AppSettings') {\r\n return 'bg-purple-500/10 text-purple-600 dark:text-purple-400';\r\n }\r\n return 'bg-[var(--bg-secondary)] text-[var(--text-tertiary)]';\r\n };\r\n\r\n const getSettingInput = (setting: SettingViewModel, displayValue: string, isEditing: boolean): React.ReactNode => {\r\n if (setting.valueType === 'Bool') {\r\n return (\r\n <label className=\"relative inline-flex items-center cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n checked={displayValue === 'true'}\r\n onChange={(e) => handleValueChange(setting.category, setting.key, e.target.checked ? 'true' : 'false')}\r\n disabled={!setting.isEditable || isEditing}\r\n className=\"sr-only peer\"\r\n />\r\n <div className=\"w-11 h-6 bg-[var(--bg-tertiary)] peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-[var(--color-accent-500)]/30 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-[var(--border-color)] after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-[var(--color-accent-600)] peer-disabled:opacity-50 peer-disabled:cursor-not-allowed\"></div>\r\n </label>\r\n );\r\n }\r\n if (setting.valueType === 'Int' || setting.valueType === 'Decimal') {\r\n return (\r\n <input\r\n type=\"number\"\r\n value={displayValue}\r\n onChange={(e) => handleValueChange(setting.category, setting.key, e.target.value)}\r\n disabled={!setting.isEditable || isEditing}\r\n className=\"w-24 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]\"\r\n />\r\n );\r\n }\r\n return (\r\n <input\r\n type={setting.isSensitive ? 'password' : 'text'}\r\n value={setting.isSensitive ? '********' : displayValue}\r\n onChange={(e) => handleValueChange(setting.category, setting.key, e.target.value)}\r\n disabled={!setting.isEditable || isEditing || setting.isSensitive}\r\n className=\"w-48 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]\"\r\n />\r\n );\r\n };\r\n\r\n const renderSetting = (setting: SettingViewModel) => {\r\n const editKey = getEditKey(setting);\r\n const isEditing = saving === editKey;\r\n const changed = hasChanges(setting);\r\n const displayValue = getDisplayValue(setting);\r\n\r\n return (\r\n <div\r\n key={editKey}\r\n className=\"flex items-center justify-between py-4 border-b border-[var(--border-color)] last:border-0\"\r\n >\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`settings.keys.${setting.category}.${setting.key}`, setting.key)}\r\n </span>\r\n {!setting.isEditable && (\r\n <span className=\"px-2 py-0.5 text-xs bg-[var(--bg-secondary)] text-[var(--text-tertiary)] rounded\">\r\n {t('settings.readonly')}\r\n </span>\r\n )}\r\n <span className={`px-2 py-0.5 text-xs rounded ${getSourceBadgeClass(setting.source)}`}>\r\n {setting.source}\r\n </span>\r\n </div>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`settings.descriptions.${setting.category}.${setting.key}`, setting.description)}\r\n </p>\r\n )}\r\n {setting.modifiedAt && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1 flex items-center gap-1\">\r\n <Clock className=\"w-3 h-3\" />\r\n {t('settings.modifiedBy', { user: setting.modifiedByUserName, date: new Date(setting.modifiedAt).toLocaleString() })}\r\n </p>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {getSettingInput(setting, displayValue, isEditing)}\r\n\r\n {setting.isEditable && setting.source === 'Database' && (\r\n <>\r\n <button\r\n onClick={() => handleSave(setting)}\r\n disabled={!changed || isEditing}\r\n className=\"p-2 text-[var(--color-accent-600)] hover:bg-[var(--color-accent-500)]/10 rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n title={t('common.save')}\r\n >\r\n {isEditing ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n </button>\r\n <button\r\n onClick={() => handleReset(setting)}\r\n disabled={setting.value === setting.defaultValue || isEditing}\r\n className=\"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n title={t('settings.resetToDefault')}\r\n >\r\n <RotateCcw className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => openHistory(setting.category, setting.key)}\r\n className=\"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors\"\r\n title={t('settings.viewHistory')}\r\n >\r\n <History className=\"w-4 h-4\" />\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Session Settings */}\r\n {sessionSettings.length > 0 && (\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] bg-[var(--bg-card)] overflow-hidden shadow-sm\">\r\n <div className=\"px-6 py-4 bg-gradient-to-r from-[var(--color-accent-500)]/10 to-[var(--color-accent-600)]/5 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-[var(--color-accent-500)]/20\">\r\n <Clock className=\"w-5 h-5 text-[var(--color-accent-600)]\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('settings.sections.session')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('settings.sections.sessionDescription')}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {sessionSettings.map(renderSetting)}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* General Settings */}\r\n {generalSettings.length > 0 && (\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] bg-[var(--bg-card)] overflow-hidden shadow-sm\">\r\n <div className=\"px-6 py-4 bg-gradient-to-r from-[var(--color-accent-500)]/10 to-[var(--color-accent-600)]/5 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-[var(--color-accent-500)]/20\">\r\n <SettingsIcon className=\"w-5 h-5 text-[var(--color-accent-600)]\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('settings.sections.general')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('settings.sections.generalDescription')}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {generalSettings.map(renderSetting)}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {sessionSettings.length === 0 && generalSettings.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('settings.noSettings')}\r\n </div>\r\n )}\r\n\r\n {historyModal && (\r\n <SettingsHistoryModal\r\n category={historyModal.category}\r\n settingKey={historyModal.key}\r\n history={history}\r\n loading={loadingHistory}\r\n onClose={closeHistory}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default GeneralSettingsSection;\r\n","import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport { Save, RotateCcw, Loader2, Upload, History, Clock } from 'lucide-react';\r\nimport type { SettingViewModel } from '@/services/api/adminApi';\r\nimport { useSettingsSection } from '@/hooks/useSettingsSection';\r\nimport { SettingsHistoryModal } from '@/components/platform/administration/settings/SettingsHistoryModal';\r\n\r\nexport function FileUploadSettingsSection(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const {\r\n settings,\r\n saving,\r\n historyModal,\r\n history,\r\n loadingHistory,\r\n handleValueChange,\r\n hasChanges,\r\n getDisplayValue,\r\n getEditKey,\r\n handleSave,\r\n handleReset,\r\n openHistory,\r\n closeHistory,\r\n } = useSettingsSection();\r\n\r\n // Filter settings for FileUpload category\r\n const fileUploadSettings = settings.filter(s => s.category === 'FileUpload');\r\n\r\n // Parse JSON extensions for display\r\n const parseExtensions = (value: string): string[] => {\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return [];\r\n }\r\n };\r\n\r\n const renderSettingInput = (setting: SettingViewModel, displayValue: string, isEditing: boolean) => {\r\n if (setting.valueType === 'Int') {\r\n return (\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"number\"\r\n value={displayValue}\r\n onChange={(e) => handleValueChange(setting.category, setting.key, e.target.value)}\r\n disabled={!setting.isEditable || isEditing}\r\n className=\"w-24 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]\"\r\n />\r\n {setting.key === 'MaxFileSizeMB' && (\r\n <span className=\"text-sm text-[var(--text-secondary)]\">MB</span>\r\n )}\r\n </div>\r\n );\r\n }\r\n return (\r\n <input\r\n type={setting.isSensitive ? 'password' : 'text'}\r\n value={setting.isSensitive ? '********' : displayValue}\r\n onChange={(e) => handleValueChange(setting.category, setting.key, e.target.value)}\r\n disabled={!setting.isEditable || isEditing || setting.isSensitive}\r\n className=\"w-48 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]\"\r\n />\r\n );\r\n };\r\n\r\n const renderSetting = (setting: SettingViewModel) => {\r\n const editKey = getEditKey(setting);\r\n const isEditing = saving === editKey;\r\n const changed = hasChanges(setting);\r\n const displayValue = getDisplayValue(setting);\r\n\r\n // Special rendering for JSON arrays (extensions)\r\n if (setting.valueType === 'Json' && setting.key === 'AllowedExtensions') {\r\n const extensions = parseExtensions(displayValue);\r\n return (\r\n <div key={editKey} className=\"py-4 border-b border-[var(--border-color)] last:border-0\">\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <div>\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`settings.keys.${setting.category}.${setting.key}`, setting.key)}\r\n </span>\r\n {!setting.isEditable && (\r\n <span className=\"px-2 py-0.5 text-xs bg-[var(--bg-secondary)] text-[var(--text-tertiary)] rounded\">\r\n {t('settings.readonly')}\r\n </span>\r\n )}\r\n <span className=\"px-2 py-0.5 text-xs bg-[var(--color-accent-500)]/10 text-[var(--color-accent-600)] rounded\">\r\n {setting.source}\r\n </span>\r\n </div>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`settings.descriptions.${setting.category}.${setting.key}`, setting.description)}\r\n </p>\r\n )}\r\n </div>\r\n {setting.isEditable && setting.source === 'Database' && (\r\n <button\r\n onClick={() => openHistory(setting.category, setting.key)}\r\n className=\"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors\"\r\n title={t('settings.viewHistory')}\r\n >\r\n <History className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {extensions.map((ext) => (\r\n <span\r\n key={ext}\r\n className=\"px-3 py-1 bg-[var(--bg-secondary)] text-[var(--text-secondary)] rounded-full text-sm\"\r\n >\r\n {ext}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n key={editKey}\r\n className=\"flex items-center justify-between py-4 border-b border-[var(--border-color)] last:border-0\"\r\n >\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`settings.keys.${setting.category}.${setting.key}`, setting.key)}\r\n </span>\r\n {!setting.isEditable && (\r\n <span className=\"px-2 py-0.5 text-xs bg-[var(--bg-secondary)] text-[var(--text-tertiary)] rounded\">\r\n {t('settings.readonly')}\r\n </span>\r\n )}\r\n <span className={`px-2 py-0.5 text-xs rounded ${\r\n setting.source === 'Database'\r\n ? 'bg-[var(--color-accent-500)]/10 text-[var(--color-accent-600)]'\r\n : setting.source === 'AppSettings'\r\n ? 'bg-purple-500/10 text-purple-600 dark:text-purple-400'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-tertiary)]'\r\n }`}>\r\n {setting.source}\r\n </span>\r\n </div>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`settings.descriptions.${setting.category}.${setting.key}`, setting.description)}\r\n </p>\r\n )}\r\n {setting.modifiedAt && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1 flex items-center gap-1\">\r\n <Clock className=\"w-3 h-3\" />\r\n {t('settings.modifiedBy', { user: setting.modifiedByUserName, date: new Date(setting.modifiedAt).toLocaleString() })}\r\n </p>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {renderSettingInput(setting, displayValue, isEditing)}\r\n\r\n {setting.isEditable && setting.source === 'Database' && (\r\n <>\r\n <button\r\n onClick={() => handleSave(setting)}\r\n disabled={!changed || isEditing}\r\n className=\"p-2 text-[var(--color-accent-600)] hover:bg-[var(--color-accent-500)]/10 rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n title={t('common.save')}\r\n >\r\n {isEditing ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n </button>\r\n <button\r\n onClick={() => handleReset(setting)}\r\n disabled={setting.value === setting.defaultValue || isEditing}\r\n className=\"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n title={t('settings.resetToDefault')}\r\n >\r\n <RotateCcw className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => openHistory(setting.category, setting.key)}\r\n className=\"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors\"\r\n title={t('settings.viewHistory')}\r\n >\r\n <History className=\"w-4 h-4\" />\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] bg-[var(--bg-card)] overflow-hidden shadow-sm\">\r\n <div className=\"px-6 py-4 bg-gradient-to-r from-[var(--color-accent-500)]/10 to-[var(--color-accent-600)]/5 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-[var(--color-accent-500)]/20\">\r\n <Upload className=\"w-5 h-5 text-[var(--color-accent-600)]\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('settings.sections.fileUpload')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('settings.sections.fileUploadDescription')}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {fileUploadSettings.length > 0 ? (\r\n fileUploadSettings.map(renderSetting)\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('settings.noSettings')}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {historyModal && (\r\n <SettingsHistoryModal\r\n category={historyModal.category}\r\n settingKey={historyModal.key}\r\n history={history}\r\n loading={loadingHistory}\r\n onClose={closeHistory}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default FileUploadSettingsSection;\r\n","import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOutletContext } from 'react-router-dom';\r\nimport { Save, RotateCcw, Loader2, FileText, History, Clock, AlertTriangle, Shield } from 'lucide-react';\r\nimport { adminApi, type SettingViewModel, type SettingHistoryDto } from '@/services/api/adminApi';\r\n\r\ninterface SettingsContext {\r\n settings: SettingViewModel[];\r\n refreshSettings: () => Promise<void>;\r\n}\r\n\r\nexport function LegalFileSettingsSection(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const { settings, refreshSettings } = useOutletContext<SettingsContext>();\r\n const [editedValues, setEditedValues] = useState<Record<string, string>>({});\r\n const [saving, setSaving] = useState<string | null>(null);\r\n const [historyModal, setHistoryModal] = useState<{ category: string; key: string } | null>(null);\r\n const [history, setHistory] = useState<SettingHistoryDto[]>([]);\r\n const [loadingHistory, setLoadingHistory] = useState(false);\r\n\r\n // Filter settings for LegalFile category\r\n const legalFileSettings = settings.filter(s => s.category === 'LegalFile');\r\n\r\n const handleValueChange = (category: string, key: string, value: string) => {\r\n setEditedValues(prev => ({\r\n ...prev,\r\n [`${category}.${key}`]: value\r\n }));\r\n };\r\n\r\n const hasChanges = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n return editedValues[editKey] !== undefined && editedValues[editKey] !== setting.value;\r\n };\r\n\r\n const getDisplayValue = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n return editedValues[editKey] ?? setting.value;\r\n };\r\n\r\n const handleSave = async (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n const newValue = editedValues[editKey];\r\n if (newValue === undefined || newValue === setting.value) return;\r\n\r\n try {\r\n setSaving(editKey);\r\n await adminApi.settings.update(setting.category, setting.key, newValue);\r\n setEditedValues(prev => {\r\n const next = { ...prev };\r\n delete next[editKey];\r\n return next;\r\n });\r\n await refreshSettings();\r\n } catch (err) {\r\n console.error('Failed to save setting:', err);\r\n } finally {\r\n setSaving(null);\r\n }\r\n };\r\n\r\n const handleReset = async (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n try {\r\n setSaving(editKey);\r\n await adminApi.settings.reset(setting.category, setting.key);\r\n setEditedValues(prev => {\r\n const next = { ...prev };\r\n delete next[editKey];\r\n return next;\r\n });\r\n await refreshSettings();\r\n } catch (err) {\r\n console.error('Failed to reset setting:', err);\r\n } finally {\r\n setSaving(null);\r\n }\r\n };\r\n\r\n const openHistory = async (category: string, key: string) => {\r\n setHistoryModal({ category, key });\r\n setLoadingHistory(true);\r\n try {\r\n const result = await adminApi.settings.getHistory(category, key);\r\n setHistory(result);\r\n } catch (err) {\r\n console.error('Failed to load history:', err);\r\n } finally {\r\n setLoadingHistory(false);\r\n }\r\n };\r\n\r\n // Convert days to years for display\r\n const daysToYears = (days: number): string => {\r\n const years = Math.floor(days / 365);\r\n const remainingDays = days % 365;\r\n if (remainingDays === 0) {\r\n return `${years} ${t('settings.years')}`;\r\n }\r\n return `${years} ${t('settings.years')} ${remainingDays} ${t('settings.days')}`;\r\n };\r\n\r\n const getLegallyProtected = (setting: SettingViewModel): boolean => {\r\n return !setting.isEditable && (setting.key === 'RetentionDays' || setting.key === 'EnableWorm');\r\n };\r\n\r\n const renderSettingInput = (setting: SettingViewModel, displayValue: string, isEditing: boolean, handleValueChange: (category: string, key: string, value: string) => void) => {\r\n if (setting.valueType === 'Bool') {\r\n return (\r\n <label className=\"relative inline-flex cursor-pointer\">\r\n <span className=\"sr-only\">{setting.key}</span>\r\n <input\r\n type=\"checkbox\"\r\n checked={displayValue === 'true'}\r\n onChange={(e) => handleValueChange(setting.category, setting.key, e.target.checked ? 'true' : 'false')}\r\n disabled={!setting.isEditable || isEditing}\r\n className=\"sr-only peer\"\r\n aria-label={setting.key}\r\n />\r\n <div className=\"w-11 h-6 bg-[var(--bg-tertiary)] peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-[var(--color-accent-500)]/30 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-[var(--border-color)] after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-[var(--color-accent-600)] peer-disabled:opacity-50 peer-disabled:cursor-not-allowed\"></div>\r\n </label>\r\n );\r\n }\r\n if (setting.valueType === 'Int') {\r\n return (\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"number\"\r\n value={displayValue}\r\n onChange={(e) => handleValueChange(setting.category, setting.key, e.target.value)}\r\n disabled={!setting.isEditable || isEditing}\r\n className=\"w-24 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]\"\r\n />\r\n {(setting.key === 'RetentionDays' || setting.key === 'ArchiveAfterDays') && (\r\n <span className=\"text-sm text-[var(--text-secondary)]\">\r\n ({daysToYears(parseInt(displayValue) || 0)})\r\n </span>\r\n )}\r\n </div>\r\n );\r\n }\r\n return (\r\n <input\r\n type={setting.isSensitive ? 'password' : 'text'}\r\n value={setting.isSensitive ? '********' : displayValue}\r\n onChange={(e) => handleValueChange(setting.category, setting.key, e.target.value)}\r\n disabled={!setting.isEditable || isEditing || setting.isSensitive}\r\n className=\"w-48 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]\"\r\n />\r\n );\r\n };\r\n\r\n const getSourceBadgeClass = (source: string): string => {\r\n if (source === 'Database') return 'bg-[var(--color-accent-500)]/10 text-[var(--color-accent-600)]';\r\n if (source === 'AppSettings') return 'bg-purple-500/10 text-purple-600 dark:text-purple-400';\r\n return 'bg-[var(--bg-secondary)] text-[var(--text-tertiary)]';\r\n };\r\n\r\n const renderSetting = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n const isEditing = saving === editKey;\r\n const changed = hasChanges(setting);\r\n const displayValue = getDisplayValue(setting);\r\n const isLegallyProtected = getLegallyProtected(setting);\r\n\r\n return (\r\n <div\r\n key={editKey}\r\n className={`flex items-center justify-between py-4 border-b border-[var(--border-color)] last:border-0 ${\r\n isLegallyProtected ? 'bg-[var(--warning-bg)] -mx-6 px-6' : ''\r\n }`}\r\n >\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`settings.keys.${setting.category}.${setting.key}`, setting.key)}\r\n </span>\r\n {isLegallyProtected && (\r\n <span className=\"px-2 py-0.5 text-xs bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)] rounded flex items-center gap-1\">\r\n <Shield className=\"w-3 h-3\" />\r\n {t('settings.legallyProtected')}\r\n </span>\r\n )}\r\n {!setting.isEditable && !isLegallyProtected && (\r\n <span className=\"px-2 py-0.5 text-xs bg-[var(--bg-secondary)] text-[var(--text-tertiary)] rounded\">\r\n {t('settings.readonly')}\r\n </span>\r\n )}\r\n <span className={`px-2 py-0.5 text-xs rounded ${getSourceBadgeClass(setting.source)}`}>\r\n {setting.source}\r\n </span>\r\n </div>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`settings.descriptions.${setting.category}.${setting.key}`, setting.description)}\r\n </p>\r\n )}\r\n {setting.modifiedAt && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1 flex items-center gap-1\">\r\n <Clock className=\"w-3 h-3\" />\r\n {t('settings.modifiedBy', { user: setting.modifiedByUserName, date: new Date(setting.modifiedAt).toLocaleString() })}\r\n </p>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {renderSettingInput(setting, displayValue, isEditing, handleValueChange)}\r\n\r\n {setting.isEditable && setting.source === 'Database' && (\r\n <>\r\n <button\r\n onClick={() => handleSave(setting)}\r\n disabled={!changed || isEditing}\r\n className=\"p-2 text-[var(--color-accent-600)] hover:bg-[var(--color-accent-500)]/10 rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n title={t('common.save')}\r\n >\r\n {isEditing ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n </button>\r\n <button\r\n onClick={() => handleReset(setting)}\r\n disabled={setting.value === setting.defaultValue || isEditing}\r\n className=\"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n title={t('settings.resetToDefault')}\r\n >\r\n <RotateCcw className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => openHistory(setting.category, setting.key)}\r\n className=\"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors\"\r\n title={t('settings.viewHistory')}\r\n >\r\n <History className=\"w-4 h-4\" />\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Legal Warning Banner */}\r\n <div className=\"bg-[var(--warning-bg)] border border-[var(--warning-border)] rounded-[var(--radius-card)] p-4\">\r\n <div className=\"flex items-start gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-[var(--warning-text)] flex-shrink-0 mt-0.5\" />\r\n <div>\r\n <h4 className=\"font-medium text-[var(--warning-text)]\">\r\n {t('settings.legalWarningTitle')}\r\n </h4>\r\n <p className=\"text-sm text-[var(--warning-text)] opacity-90 mt-1\">\r\n {t('settings.legalWarningDescription')}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] bg-[var(--bg-card)] overflow-hidden shadow-sm\">\r\n <div className=\"px-6 py-4 bg-gradient-to-r from-amber-500/10 to-amber-600/5 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-amber-500/20\">\r\n <FileText className=\"w-5 h-5 text-amber-600\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('settings.sections.legalFile')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('settings.sections.legalFileDescription')}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {legalFileSettings.length > 0 ? (\r\n legalFileSettings.map(renderSetting)\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('settings.noSettings')}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* History Modal */}\r\n {historyModal && (\r\n <div className=\"fixed inset-0 z-50 overflow-y-auto\">\r\n <div className=\"flex items-center justify-center min-h-screen px-4\">\r\n <button type=\"button\" className=\"fixed inset-0 bg-black/50\" onClick={() => setHistoryModal(null)} aria-label=\"Close modal\" />\r\n <div className=\"relative rounded-[var(--radius-card)] bg-[var(--bg-card)] shadow-xl max-w-2xl w-full p-6\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4\">\r\n {t('settings.historyTitle', { key: `${historyModal.category}.${historyModal.key}` })}\r\n </h3>\r\n\r\n {loadingHistory && (\r\n <div className=\"flex justify-center py-8\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-600)]\" />\r\n </div>\r\n )}\r\n {!loadingHistory && history.length === 0 && (\r\n <p className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('settings.noHistory')}\r\n </p>\r\n )}\r\n {!loadingHistory && history.length > 0 && (\r\n <div className=\"space-y-3 max-h-96 overflow-y-auto\">\r\n {history.map((entry) => (\r\n <div key={entry.id} className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex justify-between text-sm\">\r\n <span className=\"text-[var(--text-secondary)]\">\r\n {entry.changedByUserName || t('settings.system')}\r\n </span>\r\n <span className=\"text-[var(--text-tertiary)]\">\r\n {new Date(entry.changedAt).toLocaleString()}\r\n </span>\r\n </div>\r\n <div className=\"mt-2 text-sm\">\r\n <span className=\"text-[var(--error-text)] line-through\">{entry.oldValue}</span>\r\n <span className=\"mx-2 text-[var(--text-tertiary)]\">→</span>\r\n <span className=\"text-[var(--success-text)]\">{entry.newValue}</span>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <div className=\"mt-6 flex justify-end\">\r\n <button\r\n onClick={() => setHistoryModal(null)}\r\n className=\"px-4 py-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default LegalFileSettingsSection;\r\n"],"names":["TABS","Settings","Upload","FileText","SettingsPage","useTranslation","navigate","useNavigate","location","useLocation","settings","setSettings","useState","loading","setLoading","loadSettings","useCallback","result","adminApi","err","useEffect","getCurrentTab","path","t","handleTabChange","tabId","tab","jsx","Loader2","jsxs","Breadcrumb","Icon","isActive","Outlet","useSettingsSection","refreshSettings","useOutletContext","editedValues","setEditedValues","saving","setSaving","historyModal","setHistoryModal","history","setHistory","loadingHistory","setLoadingHistory","handleValueChange","category","key","value","prev","hasChanges","setting","editKey","getDisplayValue","getEditKey","newValue","next","SettingsHistoryModal","settingKey","onClose","entry","GeneralSettingsSection","handleSave","handleReset","openHistory","closeHistory","sessionSettings","generalSettings","getSourceBadgeClass","source","getSettingInput","displayValue","isEditing","e","renderSetting","changed","Clock","Fragment","Save","RotateCcw","History","SettingsIcon","FileUploadSettingsSection","fileUploadSettings","s","parseExtensions","renderSettingInput","extensions","ext","LegalFileSettingsSection","legalFileSettings","daysToYears","days","years","remainingDays","getLegallyProtected","isLegallyProtected","Shield","AlertTriangle"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-HsAOBno4.js","sources":["../../src/pages/platform/administration/configuration/settings/SettingsPage.tsx","../../src/hooks/useSettingsSection.ts","../../src/components/platform/administration/settings/SettingsHistoryModal.tsx","../../src/pages/platform/administration/configuration/settings/GeneralSettingsSection.tsx","../../src/pages/platform/administration/configuration/settings/FileUploadSettingsSection.tsx","../../src/pages/platform/administration/configuration/settings/LegalFileSettingsSection.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useNavigate, useLocation, Outlet } from 'react-router-dom';\r\nimport { Breadcrumb } from '@/components/ui/Breadcrumb';\r\nimport { Settings, Upload, FileText, Loader2 } from 'lucide-react';\r\nimport { adminApi, type SettingViewModel } from '@/services/api/adminApi';\r\n\r\ninterface TabConfig {\r\n id: string;\r\n labelKey: string;\r\n icon: React.ElementType;\r\n route: string;\r\n}\r\n\r\nconst TABS: TabConfig[] = [\r\n { id: 'general', labelKey: 'settings.tabs.general', icon: Settings, route: '/administration/configuration/settings/general' },\r\n { id: 'file-upload', labelKey: 'settings.tabs.fileUpload', icon: Upload, route: '/administration/configuration/settings/file-upload' },\r\n { id: 'legal-file', labelKey: 'settings.tabs.legalFile', icon: FileText, route: '/administration/configuration/settings/legal-file' }\r\n];\r\n\r\nexport function SettingsPage(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n const [settings, setSettings] = useState<SettingViewModel[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n\r\n const loadSettings = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const result = await adminApi.settings.getAll();\r\n setSettings(result);\r\n } catch (err) {\r\n console.error('Failed to load settings:', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadSettings();\r\n }, [loadSettings]);\r\n\r\n const getCurrentTab = () => {\r\n const path = location.pathname;\r\n const tab = TABS.find(t => path.includes(t.id));\r\n return tab?.id || 'general';\r\n };\r\n\r\n const handleTabChange = (tabId: string) => {\r\n const tab = TABS.find(t => t.id === tabId);\r\n if (tab) {\r\n navigate(tab.route);\r\n }\r\n };\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"flex items-center justify-center min-h-[400px]\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-600)]\" />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <Breadcrumb\r\n items={[\r\n { label: t('header.title'), href: '/administration' },\r\n { label: t('settings.title', 'Settings') }\r\n ]}\r\n />\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('settings.title')}\r\n </h1>\r\n <p className=\"text-[var(--text-secondary)] mt-1\">\r\n {t('settings.subtitle')}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {/* Tabs */}\r\n <div className=\"border-b border-[var(--border-color)]\">\r\n <nav className=\"-mb-px flex space-x-8\" aria-label=\"Tabs\">\r\n {TABS.map((tab) => {\r\n const Icon = tab.icon;\r\n const isActive = getCurrentTab() === tab.id;\r\n return (\r\n <button\r\n key={tab.id}\r\n onClick={() => handleTabChange(tab.id)}\r\n className={`\r\n group inline-flex items-center py-4 px-1 border-b-2 font-medium text-sm transition-colors\r\n ${isActive\r\n ? 'border-[var(--color-accent-500)] text-[var(--color-accent-600)]'\r\n : 'border-transparent text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--border-color)]'\r\n }\r\n `}\r\n >\r\n <Icon className={`mr-2 h-5 w-5 ${isActive ? 'text-[var(--color-accent-500)]' : 'text-[var(--text-tertiary)] group-hover:text-[var(--text-secondary)]'}`} />\r\n {t(tab.labelKey)}\r\n </button>\r\n );\r\n })}\r\n </nav>\r\n </div>\r\n\r\n {/* Content */}\r\n <Outlet context={{ settings, refreshSettings: loadSettings }} />\r\n </div>\r\n );\r\n}\r\n\r\nexport default SettingsPage;\r\n","import { useState } from 'react';\r\nimport { useOutletContext } from 'react-router-dom';\r\nimport { adminApi, type SettingViewModel, type SettingHistoryDto } from '@/services/api/adminApi';\r\n\r\ninterface SettingsContext {\r\n settings: SettingViewModel[];\r\n refreshSettings: () => Promise<void>;\r\n}\r\n\r\nexport function useSettingsSection(): {\n settings: SettingViewModel[];\n editedValues: Record<string, string>;\n saving: string | null;\n historyModal: { category: string; key: string } | null;\n history: SettingHistoryDto[];\n loadingHistory: boolean;\n handleValueChange: (category: string, key: string, value: string) => void;\n hasChanges: (setting: SettingViewModel) => boolean;\n getDisplayValue: (setting: SettingViewModel) => string;\n getEditKey: (setting: SettingViewModel) => string;\n handleSave: (setting: SettingViewModel) => Promise<void>;\n handleReset: (setting: SettingViewModel) => Promise<void>;\n openHistory: (category: string, key: string) => Promise<void>;\n closeHistory: () => void;\n} {\r\n const { settings, refreshSettings } = useOutletContext<SettingsContext>();\r\n const [editedValues, setEditedValues] = useState<Record<string, string>>({});\r\n const [saving, setSaving] = useState<string | null>(null);\r\n const [historyModal, setHistoryModal] = useState<{ category: string; key: string } | null>(null);\r\n const [history, setHistory] = useState<SettingHistoryDto[]>([]);\r\n const [loadingHistory, setLoadingHistory] = useState(false);\r\n\r\n const handleValueChange = (category: string, key: string, value: string) => {\r\n setEditedValues(prev => ({\r\n ...prev,\r\n [`${category}.${key}`]: value\r\n }));\r\n };\r\n\r\n const hasChanges = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n return editedValues[editKey] !== undefined && editedValues[editKey] !== setting.value;\r\n };\r\n\r\n const getDisplayValue = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n return editedValues[editKey] ?? setting.value;\r\n };\r\n\r\n const getEditKey = (setting: SettingViewModel) => `${setting.category}.${setting.key}`;\r\n\r\n const handleSave = async (setting: SettingViewModel) => {\r\n const editKey = getEditKey(setting);\r\n const newValue = editedValues[editKey];\r\n if (newValue === undefined || newValue === setting.value) return;\r\n\r\n try {\r\n setSaving(editKey);\r\n await adminApi.settings.update(setting.category, setting.key, newValue);\r\n setEditedValues(prev => {\r\n const next = { ...prev };\r\n delete next[editKey];\r\n return next;\r\n });\r\n await refreshSettings();\r\n } catch (err) {\r\n console.error('Failed to save setting:', err);\r\n } finally {\r\n setSaving(null);\r\n }\r\n };\r\n\r\n const handleReset = async (setting: SettingViewModel) => {\r\n const editKey = getEditKey(setting);\r\n try {\r\n setSaving(editKey);\r\n await adminApi.settings.reset(setting.category, setting.key);\r\n setEditedValues(prev => {\r\n const next = { ...prev };\r\n delete next[editKey];\r\n return next;\r\n });\r\n await refreshSettings();\r\n } catch (err) {\r\n console.error('Failed to reset setting:', err);\r\n } finally {\r\n setSaving(null);\r\n }\r\n };\r\n\r\n const openHistory = async (category: string, key: string) => {\r\n setHistoryModal({ category, key });\r\n setLoadingHistory(true);\r\n try {\r\n const result = await adminApi.settings.getHistory(category, key);\r\n setHistory(result);\r\n } catch (err) {\r\n console.error('Failed to load history:', err);\r\n } finally {\r\n setLoadingHistory(false);\r\n }\r\n };\r\n\r\n const closeHistory = () => setHistoryModal(null);\r\n\r\n return {\r\n settings,\r\n editedValues,\r\n saving,\r\n historyModal,\r\n history,\r\n loadingHistory,\r\n handleValueChange,\r\n hasChanges,\r\n getDisplayValue,\r\n getEditKey,\r\n handleSave,\r\n handleReset,\r\n openHistory,\r\n closeHistory,\r\n };\r\n}\r\n\r\nexport type { SettingsContext };\r\n","import type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Loader2 } from 'lucide-react';\r\nimport type { SettingHistoryDto } from '@/services/api/adminApi';\r\n\r\ninterface SettingsHistoryModalProps {\r\n readonly category: string;\r\n readonly settingKey: string;\r\n readonly history: SettingHistoryDto[];\r\n readonly loading: boolean;\r\n readonly onClose: () => void;\r\n}\r\n\r\nexport function SettingsHistoryModal({ category, settingKey, history, loading, onClose }: SettingsHistoryModalProps): ReactElement {\r\n const { t } = useTranslation('admin');\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-50 overflow-y-auto\">\r\n <div className=\"flex items-center justify-center min-h-screen px-4\">\r\n <button type=\"button\" className=\"fixed inset-0 bg-black/50\" onClick={onClose} aria-label=\"Close modal\" />\r\n <div className=\"relative rounded-[var(--radius-card)] bg-[var(--bg-card)] shadow-xl max-w-2xl w-full p-6\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4\">\r\n {t('settings.historyTitle', { key: `${category}.${settingKey}` })}\r\n </h3>\r\n\r\n {loading && (\r\n <div className=\"flex justify-center py-8\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-600)]\" />\r\n </div>\r\n )}\r\n {!loading && history.length === 0 && (\r\n <p className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('settings.noHistory')}\r\n </p>\r\n )}\r\n {!loading && history.length > 0 && (\r\n <div className=\"space-y-3 max-h-96 overflow-y-auto\">\r\n {history.map((entry) => (\r\n <div key={entry.id} className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex justify-between text-sm\">\r\n <span className=\"text-[var(--text-secondary)]\">\r\n {entry.changedByUserName || t('settings.system')}\r\n </span>\r\n <span className=\"text-[var(--text-tertiary)]\">\r\n {new Date(entry.changedAt).toLocaleString()}\r\n </span>\r\n </div>\r\n <div className=\"mt-2 text-sm\">\r\n <span className=\"text-[var(--error-text)] line-through\">{entry.oldValue}</span>\r\n <span className=\"mx-2 text-[var(--text-tertiary)]\">→</span>\r\n <span className=\"text-[var(--success-text)]\">{entry.newValue}</span>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <div className=\"mt-6 flex justify-end\">\r\n <button\r\n onClick={onClose}\r\n className=\"px-4 py-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport { Save, RotateCcw, Loader2, Clock, History, Settings as SettingsIcon } from 'lucide-react';\r\nimport type { SettingViewModel } from '@/services/api/adminApi';\r\nimport { useSettingsSection } from '@/hooks/useSettingsSection';\r\nimport { SettingsHistoryModal } from '@/components/platform/administration/settings/SettingsHistoryModal';\r\n\r\nexport function GeneralSettingsSection(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const {\r\n settings,\r\n saving,\r\n historyModal,\r\n history,\r\n loadingHistory,\r\n handleValueChange,\r\n hasChanges,\r\n getDisplayValue,\r\n getEditKey,\r\n handleSave,\r\n handleReset,\r\n openHistory,\r\n closeHistory,\r\n } = useSettingsSection();\r\n\r\n // Filter settings for Session and General categories\r\n const sessionSettings = settings.filter(s => s.category === 'Session');\r\n const generalSettings = settings.filter(s => s.category === 'General');\r\n\r\n const getSourceBadgeClass = (source: string): string => {\r\n if (source === 'Database') {\r\n return 'bg-[var(--color-accent-500)]/10 text-[var(--color-accent-600)]';\r\n }\r\n if (source === 'AppSettings') {\r\n return 'bg-purple-500/10 text-purple-600 dark:text-purple-400';\r\n }\r\n return 'bg-[var(--bg-secondary)] text-[var(--text-tertiary)]';\r\n };\r\n\r\n const getSettingInput = (setting: SettingViewModel, displayValue: string, isEditing: boolean): React.ReactNode => {\r\n if (setting.valueType === 'Bool') {\r\n return (\r\n <label className=\"relative inline-flex items-center cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n checked={displayValue === 'true'}\r\n onChange={(e) => handleValueChange(setting.category, setting.key, e.target.checked ? 'true' : 'false')}\r\n disabled={!setting.isEditable || isEditing}\r\n className=\"sr-only peer\"\r\n />\r\n <div className=\"w-11 h-6 bg-[var(--bg-tertiary)] peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-[var(--color-accent-500)]/30 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-[var(--border-color)] after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-[var(--color-accent-600)] peer-disabled:opacity-50 peer-disabled:cursor-not-allowed\"></div>\r\n </label>\r\n );\r\n }\r\n if (setting.valueType === 'Int' || setting.valueType === 'Decimal') {\r\n return (\r\n <input\r\n type=\"number\"\r\n value={displayValue}\r\n onChange={(e) => handleValueChange(setting.category, setting.key, e.target.value)}\r\n disabled={!setting.isEditable || isEditing}\r\n className=\"w-24 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]\"\r\n />\r\n );\r\n }\r\n return (\r\n <input\r\n type={setting.isSensitive ? 'password' : 'text'}\r\n value={setting.isSensitive ? '********' : displayValue}\r\n onChange={(e) => handleValueChange(setting.category, setting.key, e.target.value)}\r\n disabled={!setting.isEditable || isEditing || setting.isSensitive}\r\n className=\"w-48 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]\"\r\n />\r\n );\r\n };\r\n\r\n const renderSetting = (setting: SettingViewModel) => {\r\n const editKey = getEditKey(setting);\r\n const isEditing = saving === editKey;\r\n const changed = hasChanges(setting);\r\n const displayValue = getDisplayValue(setting);\r\n\r\n return (\r\n <div\r\n key={editKey}\r\n className=\"flex items-center justify-between py-4 border-b border-[var(--border-color)] last:border-0\"\r\n >\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`settings.keys.${setting.category}.${setting.key}`, setting.key)}\r\n </span>\r\n {!setting.isEditable && (\r\n <span className=\"px-2 py-0.5 text-xs bg-[var(--bg-secondary)] text-[var(--text-tertiary)] rounded\">\r\n {t('settings.readonly')}\r\n </span>\r\n )}\r\n <span className={`px-2 py-0.5 text-xs rounded ${getSourceBadgeClass(setting.source)}`}>\r\n {setting.source}\r\n </span>\r\n </div>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`settings.descriptions.${setting.category}.${setting.key}`, setting.description)}\r\n </p>\r\n )}\r\n {setting.modifiedAt && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1 flex items-center gap-1\">\r\n <Clock className=\"w-3 h-3\" />\r\n {t('settings.modifiedBy', { user: setting.modifiedByUserName, date: new Date(setting.modifiedAt).toLocaleString() })}\r\n </p>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {getSettingInput(setting, displayValue, isEditing)}\r\n\r\n {setting.isEditable && setting.source === 'Database' && (\r\n <>\r\n <button\r\n onClick={() => handleSave(setting)}\r\n disabled={!changed || isEditing}\r\n className=\"p-2 text-[var(--color-accent-600)] hover:bg-[var(--color-accent-500)]/10 rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n title={t('common.save')}\r\n >\r\n {isEditing ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n </button>\r\n <button\r\n onClick={() => handleReset(setting)}\r\n disabled={setting.value === setting.defaultValue || isEditing}\r\n className=\"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n title={t('settings.resetToDefault')}\r\n >\r\n <RotateCcw className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => openHistory(setting.category, setting.key)}\r\n className=\"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors\"\r\n title={t('settings.viewHistory')}\r\n >\r\n <History className=\"w-4 h-4\" />\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Session Settings */}\r\n {sessionSettings.length > 0 && (\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] bg-[var(--bg-card)] overflow-hidden shadow-sm\">\r\n <div className=\"px-6 py-4 bg-gradient-to-r from-[var(--color-accent-500)]/10 to-[var(--color-accent-600)]/5 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-[var(--color-accent-500)]/20\">\r\n <Clock className=\"w-5 h-5 text-[var(--color-accent-600)]\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('settings.sections.session')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('settings.sections.sessionDescription')}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {sessionSettings.map(renderSetting)}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* General Settings */}\r\n {generalSettings.length > 0 && (\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] bg-[var(--bg-card)] overflow-hidden shadow-sm\">\r\n <div className=\"px-6 py-4 bg-gradient-to-r from-[var(--color-accent-500)]/10 to-[var(--color-accent-600)]/5 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-[var(--color-accent-500)]/20\">\r\n <SettingsIcon className=\"w-5 h-5 text-[var(--color-accent-600)]\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('settings.sections.general')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('settings.sections.generalDescription')}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {generalSettings.map(renderSetting)}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {sessionSettings.length === 0 && generalSettings.length === 0 && (\r\n <div className=\"text-center py-12 text-[var(--text-secondary)]\">\r\n {t('settings.noSettings')}\r\n </div>\r\n )}\r\n\r\n {historyModal && (\r\n <SettingsHistoryModal\r\n category={historyModal.category}\r\n settingKey={historyModal.key}\r\n history={history}\r\n loading={loadingHistory}\r\n onClose={closeHistory}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default GeneralSettingsSection;\r\n","import type { ReactElement } from 'react';\nimport { useTranslation } from 'react-i18next';\r\nimport { Save, RotateCcw, Loader2, Upload, History, Clock } from 'lucide-react';\r\nimport type { SettingViewModel } from '@/services/api/adminApi';\r\nimport { useSettingsSection } from '@/hooks/useSettingsSection';\r\nimport { SettingsHistoryModal } from '@/components/platform/administration/settings/SettingsHistoryModal';\r\n\r\nexport function FileUploadSettingsSection(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const {\r\n settings,\r\n saving,\r\n historyModal,\r\n history,\r\n loadingHistory,\r\n handleValueChange,\r\n hasChanges,\r\n getDisplayValue,\r\n getEditKey,\r\n handleSave,\r\n handleReset,\r\n openHistory,\r\n closeHistory,\r\n } = useSettingsSection();\r\n\r\n // Filter settings for FileUpload category\r\n const fileUploadSettings = settings.filter(s => s.category === 'FileUpload');\r\n\r\n // Parse JSON extensions for display\r\n const parseExtensions = (value: string): string[] => {\r\n try {\r\n return JSON.parse(value);\r\n } catch {\r\n return [];\r\n }\r\n };\r\n\r\n const renderSettingInput = (setting: SettingViewModel, displayValue: string, isEditing: boolean) => {\r\n if (setting.valueType === 'Int') {\r\n return (\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"number\"\r\n value={displayValue}\r\n onChange={(e) => handleValueChange(setting.category, setting.key, e.target.value)}\r\n disabled={!setting.isEditable || isEditing}\r\n className=\"w-24 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]\"\r\n />\r\n {setting.key === 'MaxFileSizeMB' && (\r\n <span className=\"text-sm text-[var(--text-secondary)]\">MB</span>\r\n )}\r\n </div>\r\n );\r\n }\r\n return (\r\n <input\r\n type={setting.isSensitive ? 'password' : 'text'}\r\n value={setting.isSensitive ? '********' : displayValue}\r\n onChange={(e) => handleValueChange(setting.category, setting.key, e.target.value)}\r\n disabled={!setting.isEditable || isEditing || setting.isSensitive}\r\n className=\"w-48 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]\"\r\n />\r\n );\r\n };\r\n\r\n const renderSetting = (setting: SettingViewModel) => {\r\n const editKey = getEditKey(setting);\r\n const isEditing = saving === editKey;\r\n const changed = hasChanges(setting);\r\n const displayValue = getDisplayValue(setting);\r\n\r\n // Special rendering for JSON arrays (extensions)\r\n if (setting.valueType === 'Json' && setting.key === 'AllowedExtensions') {\r\n const extensions = parseExtensions(displayValue);\r\n return (\r\n <div key={editKey} className=\"py-4 border-b border-[var(--border-color)] last:border-0\">\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <div>\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`settings.keys.${setting.category}.${setting.key}`, setting.key)}\r\n </span>\r\n {!setting.isEditable && (\r\n <span className=\"px-2 py-0.5 text-xs bg-[var(--bg-secondary)] text-[var(--text-tertiary)] rounded\">\r\n {t('settings.readonly')}\r\n </span>\r\n )}\r\n <span className=\"px-2 py-0.5 text-xs bg-[var(--color-accent-500)]/10 text-[var(--color-accent-600)] rounded\">\r\n {setting.source}\r\n </span>\r\n </div>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`settings.descriptions.${setting.category}.${setting.key}`, setting.description)}\r\n </p>\r\n )}\r\n </div>\r\n {setting.isEditable && setting.source === 'Database' && (\r\n <button\r\n onClick={() => openHistory(setting.category, setting.key)}\r\n className=\"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors\"\r\n title={t('settings.viewHistory')}\r\n >\r\n <History className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {extensions.map((ext) => (\r\n <span\r\n key={ext}\r\n className=\"px-3 py-1 bg-[var(--bg-secondary)] text-[var(--text-secondary)] rounded-full text-sm\"\r\n >\r\n {ext}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n key={editKey}\r\n className=\"flex items-center justify-between py-4 border-b border-[var(--border-color)] last:border-0\"\r\n >\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`settings.keys.${setting.category}.${setting.key}`, setting.key)}\r\n </span>\r\n {!setting.isEditable && (\r\n <span className=\"px-2 py-0.5 text-xs bg-[var(--bg-secondary)] text-[var(--text-tertiary)] rounded\">\r\n {t('settings.readonly')}\r\n </span>\r\n )}\r\n <span className={`px-2 py-0.5 text-xs rounded ${\r\n setting.source === 'Database'\r\n ? 'bg-[var(--color-accent-500)]/10 text-[var(--color-accent-600)]'\r\n : setting.source === 'AppSettings'\r\n ? 'bg-purple-500/10 text-purple-600 dark:text-purple-400'\r\n : 'bg-[var(--bg-secondary)] text-[var(--text-tertiary)]'\r\n }`}>\r\n {setting.source}\r\n </span>\r\n </div>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`settings.descriptions.${setting.category}.${setting.key}`, setting.description)}\r\n </p>\r\n )}\r\n {setting.modifiedAt && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1 flex items-center gap-1\">\r\n <Clock className=\"w-3 h-3\" />\r\n {t('settings.modifiedBy', { user: setting.modifiedByUserName, date: new Date(setting.modifiedAt).toLocaleString() })}\r\n </p>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {renderSettingInput(setting, displayValue, isEditing)}\r\n\r\n {setting.isEditable && setting.source === 'Database' && (\r\n <>\r\n <button\r\n onClick={() => handleSave(setting)}\r\n disabled={!changed || isEditing}\r\n className=\"p-2 text-[var(--color-accent-600)] hover:bg-[var(--color-accent-500)]/10 rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n title={t('common.save')}\r\n >\r\n {isEditing ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n </button>\r\n <button\r\n onClick={() => handleReset(setting)}\r\n disabled={setting.value === setting.defaultValue || isEditing}\r\n className=\"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n title={t('settings.resetToDefault')}\r\n >\r\n <RotateCcw className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => openHistory(setting.category, setting.key)}\r\n className=\"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors\"\r\n title={t('settings.viewHistory')}\r\n >\r\n <History className=\"w-4 h-4\" />\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] bg-[var(--bg-card)] overflow-hidden shadow-sm\">\r\n <div className=\"px-6 py-4 bg-gradient-to-r from-[var(--color-accent-500)]/10 to-[var(--color-accent-600)]/5 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-[var(--color-accent-500)]/20\">\r\n <Upload className=\"w-5 h-5 text-[var(--color-accent-600)]\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('settings.sections.fileUpload')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('settings.sections.fileUploadDescription')}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {fileUploadSettings.length > 0 ? (\r\n fileUploadSettings.map(renderSetting)\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('settings.noSettings')}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {historyModal && (\r\n <SettingsHistoryModal\r\n category={historyModal.category}\r\n settingKey={historyModal.key}\r\n history={history}\r\n loading={loadingHistory}\r\n onClose={closeHistory}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default FileUploadSettingsSection;\r\n","import { useState } from 'react';\r\nimport type { ReactElement } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useOutletContext } from 'react-router-dom';\r\nimport { Save, RotateCcw, Loader2, FileText, History, Clock, AlertTriangle, Shield } from 'lucide-react';\r\nimport { adminApi, type SettingViewModel, type SettingHistoryDto } from '@/services/api/adminApi';\r\n\r\ninterface SettingsContext {\r\n settings: SettingViewModel[];\r\n refreshSettings: () => Promise<void>;\r\n}\r\n\r\nexport function LegalFileSettingsSection(): ReactElement {\r\n const { t } = useTranslation('admin');\r\n const { settings, refreshSettings } = useOutletContext<SettingsContext>();\r\n const [editedValues, setEditedValues] = useState<Record<string, string>>({});\r\n const [saving, setSaving] = useState<string | null>(null);\r\n const [historyModal, setHistoryModal] = useState<{ category: string; key: string } | null>(null);\r\n const [history, setHistory] = useState<SettingHistoryDto[]>([]);\r\n const [loadingHistory, setLoadingHistory] = useState(false);\r\n\r\n // Filter settings for LegalFile category\r\n const legalFileSettings = settings.filter(s => s.category === 'LegalFile');\r\n\r\n const handleValueChange = (category: string, key: string, value: string) => {\r\n setEditedValues(prev => ({\r\n ...prev,\r\n [`${category}.${key}`]: value\r\n }));\r\n };\r\n\r\n const hasChanges = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n return editedValues[editKey] !== undefined && editedValues[editKey] !== setting.value;\r\n };\r\n\r\n const getDisplayValue = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n return editedValues[editKey] ?? setting.value;\r\n };\r\n\r\n const handleSave = async (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n const newValue = editedValues[editKey];\r\n if (newValue === undefined || newValue === setting.value) return;\r\n\r\n try {\r\n setSaving(editKey);\r\n await adminApi.settings.update(setting.category, setting.key, newValue);\r\n setEditedValues(prev => {\r\n const next = { ...prev };\r\n delete next[editKey];\r\n return next;\r\n });\r\n await refreshSettings();\r\n } catch (err) {\r\n console.error('Failed to save setting:', err);\r\n } finally {\r\n setSaving(null);\r\n }\r\n };\r\n\r\n const handleReset = async (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n try {\r\n setSaving(editKey);\r\n await adminApi.settings.reset(setting.category, setting.key);\r\n setEditedValues(prev => {\r\n const next = { ...prev };\r\n delete next[editKey];\r\n return next;\r\n });\r\n await refreshSettings();\r\n } catch (err) {\r\n console.error('Failed to reset setting:', err);\r\n } finally {\r\n setSaving(null);\r\n }\r\n };\r\n\r\n const openHistory = async (category: string, key: string) => {\r\n setHistoryModal({ category, key });\r\n setLoadingHistory(true);\r\n try {\r\n const result = await adminApi.settings.getHistory(category, key);\r\n setHistory(result);\r\n } catch (err) {\r\n console.error('Failed to load history:', err);\r\n } finally {\r\n setLoadingHistory(false);\r\n }\r\n };\r\n\r\n // Convert days to years for display\r\n const daysToYears = (days: number): string => {\r\n const years = Math.floor(days / 365);\r\n const remainingDays = days % 365;\r\n if (remainingDays === 0) {\r\n return `${years} ${t('settings.years')}`;\r\n }\r\n return `${years} ${t('settings.years')} ${remainingDays} ${t('settings.days')}`;\r\n };\r\n\r\n const getLegallyProtected = (setting: SettingViewModel): boolean => {\r\n return !setting.isEditable && (setting.key === 'RetentionDays' || setting.key === 'EnableWorm');\r\n };\r\n\r\n const renderSettingInput = (setting: SettingViewModel, displayValue: string, isEditing: boolean, handleValueChange: (category: string, key: string, value: string) => void) => {\r\n if (setting.valueType === 'Bool') {\r\n return (\r\n <label className=\"relative inline-flex cursor-pointer\">\r\n <span className=\"sr-only\">{setting.key}</span>\r\n <input\r\n type=\"checkbox\"\r\n checked={displayValue === 'true'}\r\n onChange={(e) => handleValueChange(setting.category, setting.key, e.target.checked ? 'true' : 'false')}\r\n disabled={!setting.isEditable || isEditing}\r\n className=\"sr-only peer\"\r\n aria-label={setting.key}\r\n />\r\n <div className=\"w-11 h-6 bg-[var(--bg-tertiary)] peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-[var(--color-accent-500)]/30 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-[var(--border-color)] after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-[var(--color-accent-600)] peer-disabled:opacity-50 peer-disabled:cursor-not-allowed\"></div>\r\n </label>\r\n );\r\n }\r\n if (setting.valueType === 'Int') {\r\n return (\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"number\"\r\n value={displayValue}\r\n onChange={(e) => handleValueChange(setting.category, setting.key, e.target.value)}\r\n disabled={!setting.isEditable || isEditing}\r\n className=\"w-24 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]\"\r\n />\r\n {(setting.key === 'RetentionDays' || setting.key === 'ArchiveAfterDays') && (\r\n <span className=\"text-sm text-[var(--text-secondary)]\">\r\n ({daysToYears(parseInt(displayValue) || 0)})\r\n </span>\r\n )}\r\n </div>\r\n );\r\n }\r\n return (\r\n <input\r\n type={setting.isSensitive ? 'password' : 'text'}\r\n value={setting.isSensitive ? '********' : displayValue}\r\n onChange={(e) => handleValueChange(setting.category, setting.key, e.target.value)}\r\n disabled={!setting.isEditable || isEditing || setting.isSensitive}\r\n className=\"w-48 px-3 py-2 border border-[var(--border-color)] rounded-[var(--radius-button)] bg-[var(--bg-card)] text-[var(--text-primary)] disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-[var(--color-accent-500)] focus:border-[var(--color-accent-500)]\"\r\n />\r\n );\r\n };\r\n\r\n const getSourceBadgeClass = (source: string): string => {\r\n if (source === 'Database') return 'bg-[var(--color-accent-500)]/10 text-[var(--color-accent-600)]';\r\n if (source === 'AppSettings') return 'bg-purple-500/10 text-purple-600 dark:text-purple-400';\r\n return 'bg-[var(--bg-secondary)] text-[var(--text-tertiary)]';\r\n };\r\n\r\n const renderSetting = (setting: SettingViewModel) => {\r\n const editKey = `${setting.category}.${setting.key}`;\r\n const isEditing = saving === editKey;\r\n const changed = hasChanges(setting);\r\n const displayValue = getDisplayValue(setting);\r\n const isLegallyProtected = getLegallyProtected(setting);\r\n\r\n return (\r\n <div\r\n key={editKey}\r\n className={`flex items-center justify-between py-4 border-b border-[var(--border-color)] last:border-0 ${\r\n isLegallyProtected ? 'bg-[var(--warning-bg)] -mx-6 px-6' : ''\r\n }`}\r\n >\r\n <div className=\"flex-1 min-w-0 pr-4\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"font-medium text-[var(--text-primary)]\">\r\n {t(`settings.keys.${setting.category}.${setting.key}`, setting.key)}\r\n </span>\r\n {isLegallyProtected && (\r\n <span className=\"px-2 py-0.5 text-xs bg-[var(--warning-bg)] text-[var(--warning-text)] border border-[var(--warning-border)] rounded flex items-center gap-1\">\r\n <Shield className=\"w-3 h-3\" />\r\n {t('settings.legallyProtected')}\r\n </span>\r\n )}\r\n {!setting.isEditable && !isLegallyProtected && (\r\n <span className=\"px-2 py-0.5 text-xs bg-[var(--bg-secondary)] text-[var(--text-tertiary)] rounded\">\r\n {t('settings.readonly')}\r\n </span>\r\n )}\r\n <span className={`px-2 py-0.5 text-xs rounded ${getSourceBadgeClass(setting.source)}`}>\r\n {setting.source}\r\n </span>\r\n </div>\r\n {setting.description && (\r\n <p className=\"text-sm text-[var(--text-secondary)] mt-1\">\r\n {t(`settings.descriptions.${setting.category}.${setting.key}`, setting.description)}\r\n </p>\r\n )}\r\n {setting.modifiedAt && (\r\n <p className=\"text-xs text-[var(--text-tertiary)] mt-1 flex items-center gap-1\">\r\n <Clock className=\"w-3 h-3\" />\r\n {t('settings.modifiedBy', { user: setting.modifiedByUserName, date: new Date(setting.modifiedAt).toLocaleString() })}\r\n </p>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n {renderSettingInput(setting, displayValue, isEditing, handleValueChange)}\r\n\r\n {setting.isEditable && setting.source === 'Database' && (\r\n <>\r\n <button\r\n onClick={() => handleSave(setting)}\r\n disabled={!changed || isEditing}\r\n className=\"p-2 text-[var(--color-accent-600)] hover:bg-[var(--color-accent-500)]/10 rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n title={t('common.save')}\r\n >\r\n {isEditing ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Save className=\"w-4 h-4\" />}\r\n </button>\r\n <button\r\n onClick={() => handleReset(setting)}\r\n disabled={setting.value === setting.defaultValue || isEditing}\r\n className=\"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n title={t('settings.resetToDefault')}\r\n >\r\n <RotateCcw className=\"w-4 h-4\" />\r\n </button>\r\n <button\r\n onClick={() => openHistory(setting.category, setting.key)}\r\n className=\"p-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors\"\r\n title={t('settings.viewHistory')}\r\n >\r\n <History className=\"w-4 h-4\" />\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div className=\"space-y-6\">\r\n {/* Legal Warning Banner */}\r\n <div className=\"bg-[var(--warning-bg)] border border-[var(--warning-border)] rounded-[var(--radius-card)] p-4\">\r\n <div className=\"flex items-start gap-3\">\r\n <AlertTriangle className=\"w-5 h-5 text-[var(--warning-text)] flex-shrink-0 mt-0.5\" />\r\n <div>\r\n <h4 className=\"font-medium text-[var(--warning-text)]\">\r\n {t('settings.legalWarningTitle')}\r\n </h4>\r\n <p className=\"text-sm text-[var(--warning-text)] opacity-90 mt-1\">\r\n {t('settings.legalWarningDescription')}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"rounded-[var(--radius-card)] border border-[var(--border-color)] bg-[var(--bg-card)] overflow-hidden shadow-sm\">\r\n <div className=\"px-6 py-4 bg-gradient-to-r from-amber-500/10 to-amber-600/5 border-b border-[var(--border-color)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2 rounded-lg bg-amber-500/20\">\r\n <FileText className=\"w-5 h-5 text-amber-600\" />\r\n </div>\r\n <div>\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)]\">\r\n {t('settings.sections.legalFile')}\r\n </h3>\r\n <p className=\"text-sm text-[var(--text-secondary)]\">\r\n {t('settings.sections.legalFileDescription')}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"px-6 py-2\">\r\n {legalFileSettings.length > 0 ? (\r\n legalFileSettings.map(renderSetting)\r\n ) : (\r\n <div className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('settings.noSettings')}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* History Modal */}\r\n {historyModal && (\r\n <div className=\"fixed inset-0 z-50 overflow-y-auto\">\r\n <div className=\"flex items-center justify-center min-h-screen px-4\">\r\n <button type=\"button\" className=\"fixed inset-0 bg-black/50\" onClick={() => setHistoryModal(null)} aria-label=\"Close modal\" />\r\n <div className=\"relative rounded-[var(--radius-card)] bg-[var(--bg-card)] shadow-xl max-w-2xl w-full p-6\">\r\n <h3 className=\"text-lg font-semibold text-[var(--text-primary)] mb-4\">\r\n {t('settings.historyTitle', { key: `${historyModal.category}.${historyModal.key}` })}\r\n </h3>\r\n\r\n {loadingHistory && (\r\n <div className=\"flex justify-center py-8\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-[var(--color-accent-600)]\" />\r\n </div>\r\n )}\r\n {!loadingHistory && history.length === 0 && (\r\n <p className=\"text-center py-8 text-[var(--text-secondary)]\">\r\n {t('settings.noHistory')}\r\n </p>\r\n )}\r\n {!loadingHistory && history.length > 0 && (\r\n <div className=\"space-y-3 max-h-96 overflow-y-auto\">\r\n {history.map((entry) => (\r\n <div key={entry.id} className=\"p-3 bg-[var(--bg-secondary)] rounded-lg\">\r\n <div className=\"flex justify-between text-sm\">\r\n <span className=\"text-[var(--text-secondary)]\">\r\n {entry.changedByUserName || t('settings.system')}\r\n </span>\r\n <span className=\"text-[var(--text-tertiary)]\">\r\n {new Date(entry.changedAt).toLocaleString()}\r\n </span>\r\n </div>\r\n <div className=\"mt-2 text-sm\">\r\n <span className=\"text-[var(--error-text)] line-through\">{entry.oldValue}</span>\r\n <span className=\"mx-2 text-[var(--text-tertiary)]\">→</span>\r\n <span className=\"text-[var(--success-text)]\">{entry.newValue}</span>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n <div className=\"mt-6 flex justify-end\">\r\n <button\r\n onClick={() => setHistoryModal(null)}\r\n className=\"px-4 py-2 text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] rounded-[var(--radius-button)] transition-colors\"\r\n >\r\n {t('common.cancel')}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default LegalFileSettingsSection;\r\n"],"names":["TABS","Settings","Upload","FileText","SettingsPage","useTranslation","navigate","useNavigate","location","useLocation","settings","setSettings","useState","loading","setLoading","loadSettings","useCallback","result","adminApi","err","useEffect","getCurrentTab","path","t","handleTabChange","tabId","tab","jsx","Loader2","jsxs","Breadcrumb","Icon","isActive","Outlet","useSettingsSection","refreshSettings","useOutletContext","editedValues","setEditedValues","saving","setSaving","historyModal","setHistoryModal","history","setHistory","loadingHistory","setLoadingHistory","handleValueChange","category","key","value","prev","hasChanges","setting","editKey","getDisplayValue","getEditKey","newValue","next","SettingsHistoryModal","settingKey","onClose","entry","GeneralSettingsSection","handleSave","handleReset","openHistory","closeHistory","sessionSettings","generalSettings","getSourceBadgeClass","source","getSettingInput","displayValue","isEditing","e","renderSetting","changed","Clock","Fragment","Save","RotateCcw","History","SettingsIcon","FileUploadSettingsSection","fileUploadSettings","s","parseExtensions","renderSettingInput","extensions","ext","LegalFileSettingsSection","legalFileSettings","daysToYears","days","years","remainingDays","getLegallyProtected","isLegallyProtected","Shield","AlertTriangle"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as o, Fragment as I } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as k, useCallback as q, useEffect as Q } from "react";
|
|
3
3
|
import { useTranslation as j } from "react-i18next";
|
|
4
4
|
import { useNavigate as X, useLocation as Z, Outlet as _, useOutletContext as z } from "react-router-dom";
|
|
5
|
-
import { k as K, B as ee } from "./index-
|
|
5
|
+
import { k as K, B as ee } from "./index-CN2WRyg1.js";
|
|
6
6
|
import { Loader2 as B, Settings as O, Upload as W, FileText as G, Clock as V, Save as R, RotateCcw as P, History as L, AlertTriangle as re, Shield as ae } from "lucide-react";
|
|
7
7
|
const M = [
|
|
8
8
|
{ id: "general", labelKey: "settings.tabs.general", icon: O, route: "/administration/configuration/settings/general" },
|
|
@@ -657,4 +657,4 @@ export {
|
|
|
657
657
|
me as LegalFileSettingsSection,
|
|
658
658
|
ie as SettingsPage
|
|
659
659
|
};
|
|
660
|
-
//# sourceMappingURL=index-
|
|
660
|
+
//# sourceMappingURL=index-TiWOcC0g.js.map
|