diff --git a/src/pages/DeviceManagement.tsx b/src/pages/DeviceManagement.tsx index 805ec64..310b8c1 100644 --- a/src/pages/DeviceManagement.tsx +++ b/src/pages/DeviceManagement.tsx @@ -37,6 +37,7 @@ export default function DeviceManagement() { const [showModal, setShowModal] = useState(false); const [editingId, setEditingId] = useState(null); const [activeDevice, setActiveDevice] = useState(null); + const [selectedRows, setSelectedRows] = useState([]); const [loading, setLoading] = useState(false); const emptyDevice: Omit = { @@ -70,6 +71,7 @@ export default function DeviceManagement() { const data: ApiResponse = await response.json(); setDevices(data.records); setActiveDevice(null); + setSelectedRows([]); } catch (error) { console.error("Error loading devices:", error); const mockData: Device[] = [ @@ -115,6 +117,7 @@ export default function DeviceManagement() { }, ]; setDevices(mockData); + setSelectedRows([]); } finally { setLoading(false); } @@ -152,12 +155,17 @@ export default function DeviceManagement() { }; const handleDelete = () => { - if (!activeDevice) return; + if (selectedRows.length === 0) return; - if (confirm("¿Deseas eliminar este dispositivo?")) { + const message = selectedRows.length === 1 + ? "¿Deseas eliminar este dispositivo?" + : `¿Deseas eliminar ${selectedRows.length} dispositivos?`; + + if (confirm(message)) { setDevices((prev) => - prev.filter((device) => device.id !== activeDevice.id) + prev.filter((device) => !selectedRows.some(selected => selected.id === device.id)) ); + setSelectedRows([]); setActiveDevice(null); } }; @@ -203,20 +211,25 @@ export default function DeviceManagement() { )} {area.name} {expanded && - area.children?.map(child => renderTree(child, level + 1))} + area.children?.map((child) => renderTree(child, level + 1))} ); }; - const filteredOperators: Operator[] = - selectedArea?.operators.filter(op => { - const q = search.toLowerCase(); - return ( - op.loginName.toLowerCase().includes(q) || - op.userName.toLowerCase().includes(q) || - op.cellPhone.toLowerCase().includes(q) - ); - }) || []; - /* ================= UI ================= */ return (
@@ -225,7 +217,7 @@ export default function OperatorManagement() {

Organizational Structure

- {areas.map(a => renderTree(a))} + {areas.map((a) => renderTree(a))}
{/* MAIN */} @@ -246,56 +238,50 @@ export default function OperatorManagement() {
- {/* ADD */} - + {/* ADD */} + - {/* EDIT */} - + > + Edit + - {/* DELETE */} - - - {/* REFRESH */} - -
- + > + Delete + + {/* REFRESH */} + + {/* SEARCH */} @@ -303,107 +289,100 @@ export default function OperatorManagement() { className="bg-white rounded-lg shadow px-4 py-2 text-sm" placeholder="Search operator..." value={search} - onChange={e => setSearch(e.target.value)} + onChange={(e) => setSearch(e.target.value)} /> - ( - - {rowData.isSuperAdmin ? "Yes" : "No"} - - ), - }, - { - title: "Status", - field: "isDisabled", - render: rowData => ( - - {rowData.isDisabled ? "Off" : "Active"} - - ), - }, - { title: "User", field: "userName" }, - { title: "Phone", field: "cellPhone" }, - { title: "Created", field: "createdAt", type: "date" }, - ]} - data={filtered} - onRowClick={(event, rowData) => { - setActiveOperator(rowData as Operator); - }} - actions={[ - { - icon: () => , - tooltip: "Add Operator", - isFreeAction: true, - onClick: () => { - setForm(emptyOperator); - setEditingId(null); - setShowModal(true); - }, - }, - { - icon: () => , - tooltip: "Edit Operator", - onClick: (event, rowData) => { - setActiveOperator(rowData as Operator); - setEditingId((rowData as Operator).id); - setForm({ ...(rowData as Operator) }); - setShowModal(true); - }, - }, - { - icon: () => , - tooltip: "Delete Operator", - onClick: (event, rowData) => { - setActiveOperator(rowData as Operator); - handleDelete(); - }, - }, - ]} - options={{ - actionsColumnIndex: -1, - search: false, - paging: true, - sorting: true, - headerStyle: { - textAlign: "center", - fontWeight: 600, - }, - cellStyle: { - textAlign: "center", - }, - maxBodyHeight: "400px", - tableLayout: "fixed", - rowStyle: rowData => ({ - backgroundColor: - activeOperator?.id === (rowData as Operator).id - ? "#EEF2FF" - : "#FFFFFF", - }), - }} -/> - - - + ( + + {rowData.isSuperAdmin ? "Yes" : "No"} + + ), + }, + { + title: "Status", + field: "isDisabled", + render: (rowData) => ( + + {rowData.isDisabled ? "Off" : "Active"} + + ), + }, + { title: "User", field: "userName" }, + { title: "Phone", field: "cellPhone" }, + { title: "Created", field: "createdAt", type: "date" }, + ]} + data={filtered} + onRowClick={(_event, rowData) => { + setActiveOperator(rowData as Operator); + }} + actions={[ + { + icon: () => , + tooltip: "Add Operator", + isFreeAction: true, + onClick: () => { + setForm(emptyOperator); + setEditingId(null); + setShowModal(true); + }, + }, + { + icon: () => , + tooltip: "Edit Operator", + onClick: (_event, rowData) => { + setActiveOperator(rowData as Operator); + setEditingId((rowData as Operator).id); + setForm({ ...(rowData as Operator) }); + setShowModal(true); + }, + }, + { + icon: () => , + tooltip: "Delete Operator", + onClick: (_event, rowData) => { + setActiveOperator(rowData as Operator); + handleDelete(); + }, + }, + ]} + options={{ + actionsColumnIndex: -1, + search: false, + paging: true, + sorting: true, + headerStyle: { + textAlign: "center", + fontWeight: 600, + }, + maxBodyHeight: "400px", + tableLayout: "fixed", + rowStyle: (rowData) => ({ + backgroundColor: + activeOperator?.id === (rowData as Operator).id + ? "#EEF2FF" + : "#FFFFFF", + }), + }} + /> {/* MODAL */} @@ -418,9 +397,7 @@ export default function OperatorManagement() { className="w-full border px-3 py-2 rounded" placeholder="Login Name" value={form.loginName} - onChange={e => - setForm({ ...form, loginName: e.target.value }) - } + onChange={(e) => setForm({ ...form, loginName: e.target.value })} />