diff --git a/frontend/components/user/UsersDrawer.jsx b/frontend/components/user/UsersDrawer.jsx
new file mode 100644
index 0000000..81d0210
--- /dev/null
+++ b/frontend/components/user/UsersDrawer.jsx
@@ -0,0 +1,52 @@
+import React from 'react';
+import { Drawer, Form, Input, Radio, Button } from 'antd';
+
+const UsersDrawer = ({ drawerVisible, setDrawerVisible, form, onFinish, selectedRole, setSelectedRole }) => (
+ setDrawerVisible(false)}
+ visible={drawerVisible}
+ >
+
+
+
+
+
+
+
+ setSelectedRole(e.target.value)}>
+ Empleado
+ Administrador
+
+
+
+
+
+
+
+);
+
+export default UsersDrawer;
\ No newline at end of file
diff --git a/frontend/components/user/UsersHeader.jsx b/frontend/components/user/UsersHeader.jsx
new file mode 100644
index 0000000..0f4010a
--- /dev/null
+++ b/frontend/components/user/UsersHeader.jsx
@@ -0,0 +1,13 @@
+import React from 'react';
+import { Layout } from 'antd';
+import TopMenu from '../../src/pages/dashboard/TopMenu.jsx';
+
+const { Header } = Layout;
+
+const UsersHeader = () => (
+
+);
+
+export default UsersHeader;
\ No newline at end of file
diff --git a/frontend/components/user/UsersLayout.jsx b/frontend/components/user/UsersLayout.jsx
new file mode 100644
index 0000000..1884654
--- /dev/null
+++ b/frontend/components/user/UsersLayout.jsx
@@ -0,0 +1,16 @@
+import React from 'react';
+import { Layout } from 'antd';
+import LeftMenu from '../../src/pages/dashboard/LeftMenu.jsx';
+
+const UsersLayout = ({ children }) => (
+
+
+
+
+
+ {children}
+
+
+);
+
+export default UsersLayout;
\ No newline at end of file
diff --git a/frontend/components/user/UsersTable.jsx b/frontend/components/user/UsersTable.jsx
new file mode 100644
index 0000000..d916ed4
--- /dev/null
+++ b/frontend/components/user/UsersTable.jsx
@@ -0,0 +1,74 @@
+import React from 'react';
+import { Table, Tag, Button, Space, Switch } from 'antd';
+import { DeleteOutlined, SyncOutlined } from '@ant-design/icons';
+
+const UsersTable = ({ users, handleUpdate, handleDelete, handleSwitchChange, getRandomColor }) => {
+ const columns = [
+ {
+ title: 'ID',
+ dataIndex: 'id',
+ key: 'id',
+ },
+ {
+ title: 'Nombre',
+ dataIndex: 'name',
+ key: 'name',
+ },
+ {
+ title: 'Email',
+ dataIndex: 'email',
+ key: 'email',
+ render: (email) => (
+ {email}
+ ),
+ },
+ {
+ title: 'Rol',
+ dataIndex: 'role',
+ key: 'role',
+ render: (role) => (
+ {role}
+ ),
+ },
+ {
+ title: 'Estado',
+ dataIndex: 'active',
+ key: 'active',
+ render: (active, record) => (
+ handleSwitchChange(record.id, checked)}
+ style={{ backgroundColor: active ? 'green' : 'red', transition: 'background-color 0.3s' }}
+ />
+ ),
+ },
+ {
+ title: 'Acción',
+ key: 'action',
+ render: (_, record) => (
+
+ } onClick={() => handleUpdate(record)}>Editar
+ } onClick={() => handleDelete(record.id)}>Eliminar
+
+ ),
+ },
+ ];
+
+ return (
+ `${range[0]}-${range[1]} de ${total} filas`,
+ }}
+ />
+ );
+};
+
+export default UsersTable;
\ No newline at end of file
diff --git a/frontend/src/pages/users/Users.jsx b/frontend/src/pages/users/Users.jsx
index d3787ad..193b734 100644
--- a/frontend/src/pages/users/Users.jsx
+++ b/frontend/src/pages/users/Users.jsx
@@ -1,253 +1,152 @@
import { useEffect, useState } from 'react';
-import { Layout, Table, Tag, Typography, Button, Space, Modal, Form, Input, Switch, Drawer, Radio, message } from 'antd';
-import { DeleteOutlined, SyncOutlined } from '@ant-design/icons';
+import { Layout, Typography, Modal, Form, message } from 'antd';
-import TopMenu from '../dashboard/TopMenu.jsx';
-import LeftMenu from '../dashboard/LeftMenu.jsx';
+import UsersTable from '../../../components/user/UsersTable';
+import UsersDrawer from '../../../components/user/UsersDrawer';
+import UsersHeader from '../../../components/user/UsersHeader';
+import UsersLayout from '../../../components/user/UsersLayout';
import '../../css/DashboardMenu.css';
import '../../css/User.css';
-const { Header } = Layout;
const { confirm } = Modal;
const Users = () => {
- const [users, setUsers] = useState([]);
- const [drawerVisible, setDrawerVisible] = useState(false);
- const [selectedUser, setSelectedUser] = useState(null);
- const [selectedRole, setSelectedRole] = useState(null);
- const [form] = Form.useForm();
+ const [users, setUsers] = useState([]);
+ const [drawerVisible, setDrawerVisible] = useState(false);
+ const [selectedUser, setSelectedUser] = useState(null);
+ const [selectedRole, setSelectedRole] = useState(null);
+ const [form] = Form.useForm();
- useEffect(() => {
- fetchUsers();
- }, []);
+ useEffect(() => {
+ fetchUsers();
+ }, []);
- const fetchUsers = async () => {
- try {
- const response = await fetch(`${import.meta.env.VITE_APP_API_URL}/user`);
- if (response.ok) {
- const data = await response.json();
- setUsers(data.data);
- } else {
- console.error('Error getting users');
- }
- } catch (error) {
- console.error(error);
- }
- };
-
- const getRandomColor = () => {
- const colors = ['blue', 'red', 'yellow', 'green', 'purple'];
- return colors[Math.floor(Math.random() * colors.length)];
- };
+ const fetchUsers = async () => {
+ try {
+ const response = await fetch(`${import.meta.env.VITE_APP_API_URL}/user`);
+ if (response.ok) {
+ const data = await response.json();
+ setUsers(data.data);
+ } else {
+ console.error('Error getting users');
+ }
+ } catch (error) {
+ console.error(error);
+ }
+ };
- const handleDelete = (id) => {
- confirm({
- title: '¿Estás seguro de eliminar este usuario?',
- content: 'Esta acción no se puede deshacer.',
- okText: 'Eliminar',
- okType: 'danger',
- cancelText: 'Cancelar',
- onOk() {
- fetch(`${import.meta.env.VITE_APP_API_URL}/user/${id}`, {
- method: 'DELETE',
- })
- .then(response => {
- if (response.ok) {
- fetchUsers();
- message.success('Usuario eliminado exitosamente.');
- } else {
- console.error('Error to delete contact');
- }
- })
- .catch(error => {
- console.error('Error processing request:', error);
- });
- },
- onCancel() {
- console.log('Canceled');
- },
- });
- };
+ const getRandomColor = () => {
+ const colors = ['blue', 'red', 'yellow', 'green', 'purple'];
+ return colors[Math.floor(Math.random() * colors.length)];
+ };
- const handleUpdate = (user) => {
- setSelectedUser(user);
- form.setFieldsValue({
- name: user.name,
- email: user.email,
- role: user.role,
- active: user.active
- });
- setSelectedRole(user.role);
- setDrawerVisible(true);
- };
-
- const onFinish = async (values) => {
- try {
- const response = await fetch(`${import.meta.env.VITE_APP_API_URL}/user/${selectedUser.id}`, {
- method: 'PUT',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify(values),
- });
+ const handleDelete = (id) => {
+ confirm({
+ title: '¿Estás seguro de eliminar este usuario?',
+ content: 'Esta acción no se puede deshacer.',
+ okText: 'Eliminar',
+ okType: 'danger',
+ cancelText: 'Cancelar',
+ onOk() {
+ fetch(`${import.meta.env.VITE_APP_API_URL}/user/${id}`, {
+ method: 'DELETE',
+ })
+ .then(response => {
if (response.ok) {
- await fetchUsers();
- setDrawerVisible(false);
- message.success('Usuario editado exitosamente.');
+ fetchUsers();
+ message.success('Usuario eliminado exitosamente.');
} else {
- console.error('Error updating user');
+ console.error('Error to delete contact');
}
- } catch (error) {
+ })
+ .catch(error => {
console.error('Error processing request:', error);
- }
- };
+ });
+ },
+ onCancel() {
+ console.log('Canceled');
+ },
+ });
+ };
- const handleSwitchChange = async (userId, checked) => {
- try {
- const response = await fetch(`${import.meta.env.VITE_APP_API_URL}/user/${userId}`, {
- method: 'PUT',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({ active: checked }),
- });
- if (!response.ok) {
- console.error('Error updating user');
- } else {
- await fetchUsers();
- }
- } catch (error) {
- console.error('Error processing request:', error);
- }
- };
+ const handleUpdate = (user) => {
+ setSelectedUser(user);
+ form.setFieldsValue({
+ name: user.name,
+ email: user.email,
+ role: user.role,
+ active: user.active
+ });
+ setSelectedRole(user.role);
+ setDrawerVisible(true);
+ };
- const columns = [
- {
- title: 'ID',
- dataIndex: 'id',
- key: 'id',
- },
- {
- title: 'Nombre',
- dataIndex: 'name',
- key: 'name',
- },
- {
- title: 'Email',
- dataIndex: 'email',
- key: 'email',
- render: (email) => (
- {email}
- ),
+ const onFinish = async (values) => {
+ try {
+ const response = await fetch(`${import.meta.env.VITE_APP_API_URL}/user/${selectedUser.id}`, {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
},
- {
- title: 'Rol',
- dataIndex: 'role',
- key: 'role',
- render: (role) => (
- {role}
- ),
- },
- {
- title: 'Estado',
- dataIndex: 'active',
- key: 'active',
- render: (active, record) => (
- handleSwitchChange(record.id, checked)}
- style={{ backgroundColor: active ? 'green' : 'red', transition: 'background-color 0.3s' }}
- />
- ),
- },
- {
- title: 'Acción',
- key: 'action',
- render: (_, record) => (
-
- } onClick={() => handleUpdate(record)}>Editar
- } onClick={() => handleDelete(record.id)}>Eliminar
-
- ),
+ body: JSON.stringify(values),
+ });
+ if (response.ok) {
+ await fetchUsers();
+ setDrawerVisible(false);
+ message.success('Usuario editado exitosamente.');
+ } else {
+ console.error('Error updating user');
+ }
+ } catch (error) {
+ console.error('Error processing request:', error);
+ }
+ };
+
+ const handleSwitchChange = async (userId, checked) => {
+ try {
+ const response = await fetch(`${import.meta.env.VITE_APP_API_URL}/user/${userId}`, {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
},
- ];
+ body: JSON.stringify({ active: checked }),
+ });
+ if (!response.ok) {
+ console.error('Error updating user');
+ } else {
+ await fetchUsers();
+ }
+ } catch (error) {
+ console.error('Error processing request:', error);
+ }
+ };
- return (
-
-
-
-
-
-
-
-
- Usuarios
-
-