From c4e3211baa3bfec81cc0efec4467660180e42ba7 Mon Sep 17 00:00:00 2001 From: Fringg Date: Wed, 25 Feb 2026 03:17:12 +0300 Subject: [PATCH] fix: add missing onError handlers on RBAC mutations - deleteMutation onError in AdminRoles and AdminPolicies - revokeMutation onError in AdminRoleAssign - handleExport error handling in AdminAuditLog - add missing i18n keys: deleteFailed, revokeFailed, exportError --- src/locales/en.json | 10 +++++++--- src/locales/fa.json | 10 +++++++--- src/locales/ru.json | 10 +++++++--- src/locales/zh.json | 10 +++++++--- src/pages/AdminAuditLog.tsx | 31 ++++++++++++++++++++----------- src/pages/AdminPolicies.tsx | 4 ++++ src/pages/AdminRoleAssign.tsx | 4 ++++ src/pages/AdminRoles.tsx | 4 ++++ 8 files changed, 60 insertions(+), 23 deletions(-) diff --git a/src/locales/en.json b/src/locales/en.json index a8038d5..a88e3d6 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -2990,7 +2990,8 @@ "loadFailed": "Failed to load roles", "createFailed": "Failed to create role", "updateFailed": "Failed to update role", - "nameRequired": "Role name is required" + "nameRequired": "Role name is required", + "deleteFailed": "Failed to delete role" } }, "roleAssign": { @@ -3041,7 +3042,8 @@ "errors": { "userRequired": "Please select a user", "roleRequired": "Please select a role", - "assignFailed": "Failed to assign role" + "assignFailed": "Failed to assign role", + "revokeFailed": "Failed to revoke role" } }, "policies": { @@ -3117,7 +3119,8 @@ "updateFailed": "Failed to update policy", "nameRequired": "Policy name is required", "resourceRequired": "Please select a resource", - "actionsRequired": "Please select at least one action" + "actionsRequired": "Please select at least one action", + "deleteFailed": "Failed to delete policy" } }, "auditLog": { @@ -3125,6 +3128,7 @@ "subtitle": "Review system activity and access history", "back": "Back", "exportCsv": "Export CSV", + "exportError": "Failed to export", "exporting": "Exporting...", "refresh": "Refresh", "unknownUser": "Unknown user", diff --git a/src/locales/fa.json b/src/locales/fa.json index a053a05..42f86c5 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -2850,7 +2850,8 @@ "loadFailed": "بارگذاری نقش‌ها ناموفق بود", "createFailed": "ایجاد نقش ناموفق بود", "updateFailed": "به‌روزرسانی نقش ناموفق بود", - "nameRequired": "نام نقش الزامی است" + "nameRequired": "نام نقش الزامی است", + "deleteFailed": "حذف نقش ناموفق بود" } }, "roleAssign": { @@ -2900,7 +2901,8 @@ "errors": { "userRequired": "لطفاً یک کاربر انتخاب کنید", "roleRequired": "لطفاً یک نقش انتخاب کنید", - "assignFailed": "تخصیص نقش ناموفق بود" + "assignFailed": "تخصیص نقش ناموفق بود", + "revokeFailed": "لغو نقش ناموفق بود" } }, "policies": { @@ -2975,7 +2977,8 @@ "updateFailed": "به‌روزرسانی سیاست ناموفق بود", "nameRequired": "نام سیاست الزامی است", "resourceRequired": "لطفاً یک منبع انتخاب کنید", - "actionsRequired": "لطفاً حداقل یک عملیات انتخاب کنید" + "actionsRequired": "لطفاً حداقل یک عملیات انتخاب کنید", + "deleteFailed": "حذف سیاست ناموفق بود" } }, "auditLog": { @@ -2983,6 +2986,7 @@ "subtitle": "بررسی فعالیت سیستم و تاریخچه دسترسی", "back": "بازگشت", "exportCsv": "خروجی CSV", + "exportError": "خطا در خروجی", "exporting": "در حال خروجی...", "refresh": "بازخوانی", "unknownUser": "کاربر ناشناخته", diff --git a/src/locales/ru.json b/src/locales/ru.json index f2b690f..54cf9a8 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -3545,7 +3545,8 @@ "loadFailed": "Не удалось загрузить роли", "createFailed": "Не удалось создать роль", "updateFailed": "Не удалось обновить роль", - "nameRequired": "Укажите название роли" + "nameRequired": "Укажите название роли", + "deleteFailed": "Не удалось удалить роль" } }, "roleAssign": { @@ -3597,7 +3598,8 @@ "errors": { "userRequired": "Выберите пользователя", "roleRequired": "Выберите роль", - "assignFailed": "Не удалось назначить роль" + "assignFailed": "Не удалось назначить роль", + "revokeFailed": "Не удалось отозвать роль" } }, "policies": { @@ -3674,7 +3676,8 @@ "updateFailed": "Не удалось обновить политику", "nameRequired": "Укажите название политики", "resourceRequired": "Выберите ресурс", - "actionsRequired": "Выберите хотя бы одно действие" + "actionsRequired": "Выберите хотя бы одно действие", + "deleteFailed": "Не удалось удалить политику" } }, "auditLog": { @@ -3682,6 +3685,7 @@ "subtitle": "Просмотр активности системы и истории доступа", "back": "Назад", "exportCsv": "Экспорт CSV", + "exportError": "Ошибка экспорта", "exporting": "Экспорт...", "refresh": "Обновить", "unknownUser": "Неизвестный пользователь", diff --git a/src/locales/zh.json b/src/locales/zh.json index 3e20bbd..5d2bb4e 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -2876,7 +2876,8 @@ "loadFailed": "加载角色失败", "createFailed": "创建角色失败", "updateFailed": "更新角色失败", - "nameRequired": "请输入角色名称" + "nameRequired": "请输入角色名称", + "deleteFailed": "删除角色失败" } }, "roleAssign": { @@ -2926,7 +2927,8 @@ "errors": { "userRequired": "请选择用户", "roleRequired": "请选择角色", - "assignFailed": "角色分配失败" + "assignFailed": "角色分配失败", + "revokeFailed": "角色撤销失败" } }, "policies": { @@ -3001,7 +3003,8 @@ "updateFailed": "更新策略失败", "nameRequired": "请输入策略名称", "resourceRequired": "请选择资源", - "actionsRequired": "请至少选择一个操作" + "actionsRequired": "请至少选择一个操作", + "deleteFailed": "删除策略失败" } }, "auditLog": { @@ -3009,6 +3012,7 @@ "subtitle": "查看系统活动和访问历史", "back": "返回", "exportCsv": "导出CSV", + "exportError": "导出失败", "exporting": "导出中...", "refresh": "刷新", "unknownUser": "未知用户", diff --git a/src/pages/AdminAuditLog.tsx b/src/pages/AdminAuditLog.tsx index cdea696..c77149f 100644 --- a/src/pages/AdminAuditLog.tsx +++ b/src/pages/AdminAuditLog.tsx @@ -381,6 +381,7 @@ export default function AdminAuditLog() { const [expandedIds, setExpandedIds] = useState>(new Set()); const [autoRefresh, setAutoRefresh] = useState(false); const [exporting, setExporting] = useState(false); + const [exportError, setExportError] = useState(null); // Auto-refresh interval ref const intervalRef = useRef | null>(null); @@ -479,10 +480,12 @@ export default function AdminAuditLog() { a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); + } catch { + setExportError(t('admin.auditLog.exportError')); } finally { setExporting(false); } - }, [appliedFilters]); + }, [appliedFilters, t]); const handlePageSizeChange = useCallback((newSize: number) => { setPageSize(newSize); @@ -552,16 +555,22 @@ export default function AdminAuditLog() { {/* Export */} - +
+ {exportError &&

{exportError}

} + +
diff --git a/src/pages/AdminPolicies.tsx b/src/pages/AdminPolicies.tsx index e2dbef6..3e11a37 100644 --- a/src/pages/AdminPolicies.tsx +++ b/src/pages/AdminPolicies.tsx @@ -379,6 +379,10 @@ export default function AdminPolicies() { queryClient.invalidateQueries({ queryKey: ['admin-policies'] }); setDeleteConfirm(null); }, + onError: () => { + setDeleteConfirm(null); + setFormError(t('admin.policies.errors.deleteFailed')); + }, }); // Derived data diff --git a/src/pages/AdminRoleAssign.tsx b/src/pages/AdminRoleAssign.tsx index 537979e..46f4a72 100644 --- a/src/pages/AdminRoleAssign.tsx +++ b/src/pages/AdminRoleAssign.tsx @@ -330,6 +330,10 @@ export default function AdminRoleAssign() { queryClient.invalidateQueries({ queryKey: ['admin-roles'] }); setRevokeConfirm(null); }, + onError: () => { + setRevokeConfirm(null); + setFormError(t('admin.roleAssign.errors.revokeFailed')); + }, }); // Handlers diff --git a/src/pages/AdminRoles.tsx b/src/pages/AdminRoles.tsx index 66ce6e9..4543cdd 100644 --- a/src/pages/AdminRoles.tsx +++ b/src/pages/AdminRoles.tsx @@ -350,6 +350,10 @@ export default function AdminRoles() { queryClient.invalidateQueries({ queryKey: ['admin-roles'] }); setDeleteConfirm(null); }, + onError: () => { + setDeleteConfirm(null); + setFormError(t('admin.roles.errors.deleteFailed')); + }, }); // Handlers