From e9473f7a49dd4c0b300071702a9dae2da3848f15 Mon Sep 17 00:00:00 2001 From: hossein taromi Date: Mon, 28 Jul 2025 13:22:15 +0330 Subject: [PATCH] fix: resolve roles management issues - Fix missing icon imports in RoleDetailPage (Edit, Calendar, FileText) - Fix role title display in roles list (change from role.name to role.title) - Fix role data fetching with proper API response structure - Add RoleResponse interface for better API handling - Improve error handling in getRole function --- src/pages/roles/core/_models.ts | 4 ++ src/pages/roles/core/_requests.ts | 26 ++++++++++-- .../roles/role-detail/RoleDetailPage.tsx | 12 +++--- src/pages/roles/role-form/RoleFormPage.tsx | 42 +++++++++---------- src/pages/roles/roles-list/RolesListPage.tsx | 33 ++++++++------- 5 files changed, 72 insertions(+), 45 deletions(-) diff --git a/src/pages/roles/core/_models.ts b/src/pages/roles/core/_models.ts index c353455..6cca602 100644 --- a/src/pages/roles/core/_models.ts +++ b/src/pages/roles/core/_models.ts @@ -11,6 +11,10 @@ export interface UpdateRoleRequest { description: string; } +export interface RoleResponse { + role: Role; +} + export interface RoleWithPermissions extends Role { permissions: Permission[]; } diff --git a/src/pages/roles/core/_requests.ts b/src/pages/roles/core/_requests.ts index b990afb..c1918bd 100644 --- a/src/pages/roles/core/_requests.ts +++ b/src/pages/roles/core/_requests.ts @@ -10,6 +10,7 @@ import { Role, Permission } from "@/types/auth"; import { CreateRoleRequest, UpdateRoleRequest, + RoleResponse, DeleteRoleResponse, AssignPermissionResponse, } from "./_models"; @@ -42,10 +43,27 @@ export const getRoles = async () => { }; export const getRole = async (id: string) => { - const response = await httpGetRequest( - APIUrlGenerator(API_ROUTES.GET_ROLE(id)) - ); - return response.data; + try { + const response = await httpGetRequest( + APIUrlGenerator(API_ROUTES.GET_ROLE(id)) + ); + console.log("Role API Response:", response); + + // Try nested structure first (like categories) + if (response.data && response.data.role) { + return response.data.role; + } + + // Fallback to direct structure if nested doesn't exist + if (response.data) { + return response.data as unknown as Role; + } + + throw new Error("No role data found in response"); + } catch (error) { + console.error("Error fetching role:", error); + throw error; + } }; export const createRole = async (roleData: CreateRoleRequest) => { diff --git a/src/pages/roles/role-detail/RoleDetailPage.tsx b/src/pages/roles/role-detail/RoleDetailPage.tsx index 8a6f74f..6822884 100644 --- a/src/pages/roles/role-detail/RoleDetailPage.tsx +++ b/src/pages/roles/role-detail/RoleDetailPage.tsx @@ -1,8 +1,10 @@ -import { useNavigate, useParams } from "react-router-dom"; -import { useRole } from "../core/_hooks"; -import { Button } from "@/components/ui/Button"; -import { LoadingSpinner } from "@/components/ui/LoadingSpinner"; -import { ArrowRight, Edit, Users, Calendar, FileText } from "lucide-react"; +import { useParams, useNavigate } from 'react-router-dom'; +import { ArrowRight, Shield, Users, Key, Edit, Calendar, FileText } from 'lucide-react'; +import { Button } from '../../../components/ui/Button'; +import { LoadingSpinner } from '../../../components/ui/LoadingSpinner'; +import { useRole } from '../core/_hooks'; +import { PermissionWrapper } from '../../../components/common/PermissionWrapper'; +import { PageContainer, PageTitle, SectionTitle, SectionSubtitle, BodyText } from '../../../components/ui/Typography'; const RoleDetailPage = () => { const navigate = useNavigate(); diff --git a/src/pages/roles/role-form/RoleFormPage.tsx b/src/pages/roles/role-form/RoleFormPage.tsx index 891c8d3..f14496d 100644 --- a/src/pages/roles/role-form/RoleFormPage.tsx +++ b/src/pages/roles/role-form/RoleFormPage.tsx @@ -1,14 +1,15 @@ -import { useEffect } from "react"; -import { useNavigate, useParams } from "react-router-dom"; -import { useForm } from "react-hook-form"; -import { yupResolver } from "@hookform/resolvers/yup"; -import * as yup from "yup"; -import { useRole, useCreateRole, useUpdateRole } from "../core/_hooks"; +import React, { useEffect } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { useForm } from 'react-hook-form'; +import { yupResolver } from '@hookform/resolvers/yup'; +import * as yup from 'yup'; +import { useRole, useCreateRole, useUpdateRole } from '../core/_hooks'; +import { RoleFormData } from '../core/_models'; import { Button } from "@/components/ui/Button"; import { Input } from "@/components/ui/Input"; import { LoadingSpinner } from "@/components/ui/LoadingSpinner"; -import { RoleFormData } from "../core/_models"; -import { ArrowRight } from "lucide-react"; +import { ArrowRight, Shield } from "lucide-react"; +import { FormHeader, PageContainer, Label } from '../../../components/ui/Typography'; const roleSchema = yup.object({ title: yup @@ -75,9 +76,10 @@ const RoleFormPage = () => { const isLoading = creating || updating; return ( -
-
-
+ + navigate('/roles')} @@ -86,11 +88,8 @@ const RoleFormPage = () => { بازگشت -

- {isEdit ? 'ویرایش نقش' : 'ایجاد نقش جدید'} -

-
-
+ } + />
@@ -104,14 +103,15 @@ const RoleFormPage = () => { />
-