feat: Implement edit server modal in ServerManager for improved server management
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 15m3s

This commit is contained in:
2025-07-10 08:41:32 +07:00
parent 86f6304382
commit 2aac641cd3
+74 -19
View File
@@ -47,6 +47,9 @@ function ServerManager() {
const editInputRef = useRef(null); const editInputRef = useRef(null);
const pageSize = 10; const pageSize = 10;
const [editModalOpen, setEditModalOpen] = useState(false);
const [editModalServer, setEditModalServer] = useState(null);
useEffect(() => { useEffect(() => {
fetchServers(); fetchServers();
}, []); }, []);
@@ -76,16 +79,23 @@ function ServerManager() {
}; };
const handleEdit = (server) => { const handleEdit = (server) => {
setEditingServer(server.ip); setEditModalServer({ ...server });
setEditingValues({ ...server }); setEditModalOpen(true);
}; };
const handleSaveEdit = (serverIp) => { const handleEditModalChange = (updatedServer) => {
const updatedServers = servers.map(s => setEditModalServer(updatedServer);
s.ip === serverIp ? { ...s, ...editingValues } : s };
);
setServers(updatedServers); const handleEditModalSave = () => {
setEditingServer(null); setServers(servers.map(s => s.ip === editModalServer.ip ? { ...editModalServer } : s));
setEditModalOpen(false);
setEditModalServer(null);
};
const handleEditModalClose = () => {
setEditModalOpen(false);
setEditModalServer(null);
}; };
const handleCancelEdit = () => { const handleCancelEdit = () => {
@@ -476,17 +486,8 @@ function ServerManager() {
<td>{server.provider}</td> <td>{server.provider}</td>
<td><span className="badge bg-green-lt text-green">{server.tunnel}</span></td> <td><span className="badge bg-green-lt text-green">{server.tunnel}</span></td>
<td className="text-end"> <td className="text-end">
{editingServer === server.ip ? ( <button className="btn btn-outline-primary btn-icon me-1" onClick={() => handleEdit(server)}><IconEdit size={18} /></button>
<> <button className="btn btn-outline-danger btn-icon" onClick={() => confirmDelete(server)}><IconTrash size={18} /></button>
<button className="btn btn-success btn-icon me-1" onClick={() => handleSaveEdit(server.ip)}><IconCheck size={18} /></button>
<button className="btn btn-secondary btn-icon" onClick={handleCancelEdit}><IconX size={18} /></button>
</>
) : (
<>
<button className="btn btn-outline-primary btn-icon me-1" onClick={() => handleEdit(server)}><IconEdit size={18} /></button>
<button className="btn btn-outline-danger btn-icon" onClick={() => confirmDelete(server)}><IconTrash size={18} /></button>
</>
)}
</td> </td>
</tr> </tr>
))} ))}
@@ -540,8 +541,62 @@ function ServerManager() {
</div> </div>
</div> </div>
)} )}
{/* Edit Server Modal */}
<EditServerModal
show={editModalOpen}
server={editModalServer}
onChange={handleEditModalChange}
onSave={handleEditModalSave}
onClose={handleEditModalClose}
/>
</> </>
); );
} }
// Модальное окно для редактирования сервера
function EditServerModal({ show, server, onChange, onSave, onClose }) {
if (!show || !server) return null;
return (
<div className="modal fade show" style={{display: 'block'}} tabIndex="-1">
<div className="modal-dialog">
<div className="modal-content">
<div className="modal-header">
<h5 className="modal-title">Редактировать сервер</h5>
<button type="button" className="btn-close" onClick={onClose}></button>
</div>
<div className="modal-body">
<form onSubmit={e => { e.preventDefault(); onSave(); }}>
<div className="mb-3">
<label className="form-label">IP адрес</label>
<input type="text" className="form-control" value={server.ip} onChange={e => onChange({ ...server, ip: e.target.value })} />
</div>
<div className="mb-3">
<label className="form-label">DNS имя</label>
<input type="text" className="form-control" value={server.dns} onChange={e => onChange({ ...server, dns: e.target.value })} />
</div>
<div className="mb-3">
<label className="form-label">Страна</label>
<input type="text" className="form-control" value={server.country} onChange={e => onChange({ ...server, country: e.target.value })} />
</div>
<div className="mb-3">
<label className="form-label">Провайдер</label>
<input type="text" className="form-control" value={server.provider} onChange={e => onChange({ ...server, provider: e.target.value })} />
</div>
<div className="mb-3">
<label className="form-label">Тип туннеля</label>
<input type="text" className="form-control" value={server.tunnel} onChange={e => onChange({ ...server, tunnel: e.target.value })} />
</div>
</form>
</div>
<div className="modal-footer">
<button type="button" className="btn btn-secondary" onClick={onClose}>Отмена</button>
<button type="button" className="btn btn-primary" onClick={onSave}>Сохранить</button>
</div>
</div>
</div>
</div>
);
}
export default ServerManager; export default ServerManager;