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 pageSize = 10;
const [editModalOpen, setEditModalOpen] = useState(false);
const [editModalServer, setEditModalServer] = useState(null);
useEffect(() => {
fetchServers();
}, []);
@@ -76,16 +79,23 @@ function ServerManager() {
};
const handleEdit = (server) => {
setEditingServer(server.ip);
setEditingValues({ ...server });
setEditModalServer({ ...server });
setEditModalOpen(true);
};
const handleSaveEdit = (serverIp) => {
const updatedServers = servers.map(s =>
s.ip === serverIp ? { ...s, ...editingValues } : s
);
setServers(updatedServers);
setEditingServer(null);
const handleEditModalChange = (updatedServer) => {
setEditModalServer(updatedServer);
};
const handleEditModalSave = () => {
setServers(servers.map(s => s.ip === editModalServer.ip ? { ...editModalServer } : s));
setEditModalOpen(false);
setEditModalServer(null);
};
const handleEditModalClose = () => {
setEditModalOpen(false);
setEditModalServer(null);
};
const handleCancelEdit = () => {
@@ -476,17 +486,8 @@ function ServerManager() {
<td>{server.provider}</td>
<td><span className="badge bg-green-lt text-green">{server.tunnel}</span></td>
<td className="text-end">
{editingServer === server.ip ? (
<>
<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>
</>
)}
<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>
</tr>
))}
@@ -540,8 +541,62 @@ function ServerManager() {
</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;