11import React from 'react' ;
2- import { Table , Button , Input , Space , Popconfirm , Typography , Card , Flex , Grid } from 'antd' ;
2+ import { Table , Button , Space , Popconfirm , Typography , Card , Flex , Grid , Tag , Tooltip } from 'antd' ;
33import type { TableProps } from 'antd' ;
4- import { PlusOutlined } from '@ant-design/icons' ;
4+ import { PlusOutlined , EditOutlined , DeleteOutlined , UserOutlined } from '@ant-design/icons' ;
55import { useUserManagement } from './hooks/useUserManagement' ;
66import { UserFormModal } from './formulariomodal/UserFormModal' ;
7- import { UserTableType , ROLES } from '../../../../types/admin/gestionuser/index' ;
7+ import { UserTableType , ROLES , isAdmin } from '../../../../types/admin/gestionuser/index' ;
88
9- const { Search } = Input ;
109const { Title } = Typography ;
1110
1211export const UserManagementView : React . FC = ( ) => {
@@ -17,7 +16,10 @@ export const UserManagementView: React.FC = () => {
1716 isModalVisible,
1817 editingUser,
1918 isSubmitting,
20- handleSearch,
19+ currentUser,
20+ canCreateUsers,
21+ canDeleteUsers,
22+ canEditAllUsers,
2123 handleDelete,
2224 showAddModal,
2325 showEditModal,
@@ -26,51 +28,127 @@ export const UserManagementView: React.FC = () => {
2628 } = useUserManagement ( ) ;
2729
2830 const columns : TableProps < UserTableType > [ 'columns' ] = [
29- { title : 'Nombre' , dataIndex : 'name' , key : 'name' , sorter : ( a , b ) => a . name . localeCompare ( b . name ) } ,
30- { title : 'Correo Electrónico' , dataIndex : 'email' , key : 'email' , responsive : [ 'sm' ] } ,
31+ {
32+ title : 'Nombre' ,
33+ dataIndex : 'name' ,
34+ key : 'name' ,
35+ sorter : ( a , b ) => a . name . localeCompare ( b . name ) ,
36+ render : ( name : string , record ) => (
37+ < Space >
38+ < span > { name } </ span >
39+ { currentUser ?. id === record . id && (
40+ < Tag icon = { < UserOutlined /> } color = "green" > Tú</ Tag >
41+ ) }
42+ </ Space >
43+ )
44+ } ,
45+ {
46+ title : 'Correo Electrónico' ,
47+ dataIndex : 'email' ,
48+ key : 'email' ,
49+ responsive : [ 'sm' ]
50+ } ,
3151 {
32- title : 'Rol' , dataIndex : 'role' , key : 'role' , responsive : [ 'md' ] ,
52+ title : 'Rol' ,
53+ dataIndex : 'role' ,
54+ key : 'role' ,
55+ responsive : [ 'md' ] ,
56+ render : ( role : string , record ) => (
57+ < Tag color = { record . roleId === 1 ? 'red' : 'blue' } >
58+ { role }
59+ </ Tag >
60+ ) ,
3361 filters : Object . values ( ROLES ) . map ( role => ( { text : role , value : role } ) ) ,
3462 onFilter : ( value , record ) => record . role . indexOf ( value as string ) === 0 ,
3563 } ,
3664 {
37- title : 'Acciones' , key : 'actions' , fixed : 'right' , width : 150 ,
38- render : ( _ , record ) => (
39- < Space size = "middle" >
40- < Button type = "link" onClick = { ( ) => showEditModal ( record ) } > Editar</ Button >
41- < Popconfirm
42- title = "¿Eliminar este usuario?"
43- onConfirm = { ( ) => handleDelete ( record . id ) }
44- okText = "Sí" cancelText = "No"
45- >
46- < Button type = "link" danger > Eliminar</ Button >
47- </ Popconfirm >
48- </ Space >
49- ) ,
65+ title : 'Acciones' ,
66+ key : 'actions' ,
67+ fixed : 'right' ,
68+ width : 150 ,
69+ render : ( _ , record ) => {
70+ const isCurrentUser = currentUser ?. id === record . id ;
71+ const canEdit = canEditAllUsers || isCurrentUser ;
72+ const canDelete = canDeleteUsers && ! isCurrentUser ; // REMOVIDO: && record.roleId !== 1
73+ // Ahora permite eliminar admins si no es self
74+
75+ return (
76+ < Space size = "small" >
77+ < Tooltip title = { canEdit ? "Editar usuario" : "Sin permisos para editar" } >
78+ < Button
79+ type = "link"
80+ icon = { < EditOutlined /> }
81+ onClick = { ( ) => showEditModal ( record ) }
82+ disabled = { ! canEdit }
83+ >
84+ Editar
85+ </ Button >
86+ </ Tooltip >
87+
88+ { canDelete && (
89+ < Tooltip title = "Eliminar usuario" >
90+ < Popconfirm
91+ title = "¿Eliminar este usuario?"
92+ description = "Esta acción no se puede deshacer"
93+ onConfirm = { ( ) => handleDelete ( record . id ) }
94+ okText = "Sí"
95+ cancelText = "No"
96+ okType = "danger"
97+ >
98+ < Button
99+ type = "link"
100+ danger
101+ icon = { < DeleteOutlined /> }
102+ >
103+ Eliminar
104+ </ Button >
105+ </ Popconfirm >
106+ </ Tooltip >
107+ ) }
108+ </ Space >
109+ ) ;
110+ } ,
50111 } ,
51112 ] ;
52113
53114 return (
54115 < Card >
55116 < Space direction = "vertical" size = "large" style = { { width : '100%' } } >
56- < Title level = { 2 } > Gestión de Usuarios</ Title >
57- < Flex vertical = { ! screens . md } justify = "space-between" align = "center" wrap = "wrap" gap = "middle" >
58- < Search
59- placeholder = "Buscar por nombre o correo"
60- onSearch = { handleSearch }
61- style = { { width : screens . sm ? 300 : '100%' } }
62- allowClear
63- />
64- < Button type = "primary" icon = { < PlusOutlined /> } onClick = { showAddModal } style = { { width : ! screens . md ? '100%' : 'auto' } } >
65- Agregar Usuario
66- </ Button >
117+ < Flex justify = "space-between" align = "center" >
118+ < Title level = { 2 } style = { { margin : 0 } } > Gestión de Usuarios</ Title >
119+ { currentUser && (
120+ < Tag color = { isAdmin ( currentUser . role ) ? 'red' : 'blue' } >
121+ { ROLES [ currentUser . role ] || 'Usuario' }
122+ </ Tag >
123+ ) }
67124 </ Flex >
125+
126+ < Flex vertical = { ! screens . md } justify = "flex-end" align = "center" wrap = "wrap" gap = "middle" >
127+ { canCreateUsers && (
128+ < Button
129+ type = "primary"
130+ icon = { < PlusOutlined /> }
131+ onClick = { showAddModal }
132+ style = { { width : ! screens . md ? '100%' : 'auto' } }
133+ >
134+ Agregar Usuario
135+ </ Button >
136+ ) }
137+ </ Flex >
138+
68139 < Table
69140 columns = { columns }
70141 dataSource = { filteredUsers }
71142 rowKey = "key"
72143 loading = { loading }
73- scroll = { { x : true } }
144+ scroll = { { x : 800 } }
145+ pagination = { {
146+ pageSize : 10 ,
147+ showSizeChanger : true ,
148+ showQuickJumper : true ,
149+ showTotal : ( total , range ) =>
150+ `${ range [ 0 ] } -${ range [ 1 ] } de ${ total } usuarios` ,
151+ } }
74152 />
75153 </ Space >
76154
@@ -80,6 +158,8 @@ export const UserManagementView: React.FC = () => {
80158 onFinish = { handleFormFinish }
81159 editingUser = { editingUser }
82160 isSubmitting = { isSubmitting }
161+ currentUserRole = { currentUser ?. role }
162+ isAdminUser = { canEditAllUsers }
83163 />
84164 </ Card >
85165 ) ;
0 commit comments