feat(NetworkConfigManager, server): update IPSec password handling; return password ID in response and enhance modal behavior for better user experience
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m19s
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m19s
This commit is contained in:
@@ -137,7 +137,7 @@ async function createIpsecPassword(req, res) {
|
|||||||
// Сохраняем в S3
|
// Сохраняем в S3
|
||||||
const meta = await writeS3JsonObject(S3_KEY, passwords);
|
const meta = await writeS3JsonObject(S3_KEY, passwords);
|
||||||
|
|
||||||
// Возвращаем без расшифрованного пароля
|
// Возвращаем без расшифрованного пароля, но с ID
|
||||||
res.json({
|
res.json({
|
||||||
id: newPassword.id,
|
id: newPassword.id,
|
||||||
name: newPassword.name,
|
name: newPassword.name,
|
||||||
|
|||||||
@@ -885,13 +885,16 @@ function NetworkConfigManager() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
let savedPasswordId = null;
|
||||||
if (ipsecPasswordModalMode === 'add') {
|
if (ipsecPasswordModalMode === 'add') {
|
||||||
await api.post('/ipsec-passwords', {
|
const response = await api.post('/ipsec-passwords', {
|
||||||
name: editingIpsecPassword.name,
|
name: editingIpsecPassword.name,
|
||||||
password: editingIpsecPassword.password,
|
password: editingIpsecPassword.password,
|
||||||
description: editingIpsecPassword.description || ''
|
description: editingIpsecPassword.description || ''
|
||||||
});
|
});
|
||||||
notify.success('IPSec пароль создан');
|
notify.success('IPSec пароль создан');
|
||||||
|
// Получаем ID созданного пароля из ответа
|
||||||
|
savedPasswordId = response.data?.id || null;
|
||||||
} else {
|
} else {
|
||||||
await api.put(`/ipsec-passwords/${editingIpsecPassword.id}`, {
|
await api.put(`/ipsec-passwords/${editingIpsecPassword.id}`, {
|
||||||
name: editingIpsecPassword.name,
|
name: editingIpsecPassword.name,
|
||||||
@@ -899,10 +902,29 @@ function NetworkConfigManager() {
|
|||||||
description: editingIpsecPassword.description || ''
|
description: editingIpsecPassword.description || ''
|
||||||
});
|
});
|
||||||
notify.success('IPSec пароль обновлён');
|
notify.success('IPSec пароль обновлён');
|
||||||
|
savedPasswordId = editingIpsecPassword.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
await fetchIpsecPasswords();
|
await fetchIpsecPasswords();
|
||||||
|
|
||||||
|
// Закрываем модал создания/редактирования пароля
|
||||||
setIpsecPasswordModalOpen(false);
|
setIpsecPasswordModalOpen(false);
|
||||||
setEditingIpsecPassword(null);
|
setEditingIpsecPassword(null);
|
||||||
|
|
||||||
|
// Если модал списка паролей открыт, закрываем его
|
||||||
|
if (ipsecPasswordsListModalOpen) {
|
||||||
|
setIpsecPasswordsListModalOpen(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Если создан новый пароль и открыт шаблон интерфейса, автоматически выбираем его
|
||||||
|
if (savedPasswordId && interfaceTemplateModalOpen && templateType === 'IPSec') {
|
||||||
|
setTemplateIpsecPasswordId(savedPasswordId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Если создан новый пароль и открыт модал интерфейса с типом IPSec, автоматически выбираем его
|
||||||
|
if (savedPasswordId && interfaceModalOpen && editingInterface?.type === 'IPSec') {
|
||||||
|
setEditingInterface({ ...editingInterface, ipsecPasswordId: savedPasswordId });
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error saving IPSec password:', error);
|
console.error('Error saving IPSec password:', error);
|
||||||
notify.error('Не удалось сохранить пароль');
|
notify.error('Не удалось сохранить пароль');
|
||||||
@@ -3136,55 +3158,6 @@ function NetworkConfigManager() {
|
|||||||
)}
|
)}
|
||||||
</FormModal>
|
</FormModal>
|
||||||
|
|
||||||
{/* IPSec Password Modal */}
|
|
||||||
<FormModal
|
|
||||||
show={ipsecPasswordModalOpen}
|
|
||||||
onClose={() => {
|
|
||||||
setIpsecPasswordModalOpen(false);
|
|
||||||
setEditingIpsecPassword(null);
|
|
||||||
}}
|
|
||||||
onSubmit={handleSaveIpsecPassword}
|
|
||||||
title={ipsecPasswordModalMode === 'add' ? 'Добавить IPSec пароль' : 'Редактировать IPSec пароль'}
|
|
||||||
submitLabel={ipsecPasswordModalMode === 'add' ? 'Создать' : 'Сохранить'}
|
|
||||||
submitIcon={ipsecPasswordModalMode === 'add' ? IconPlus : IconEdit}
|
|
||||||
>
|
|
||||||
{editingIpsecPassword && (
|
|
||||||
<div className="row g-3">
|
|
||||||
<div className="col-12">
|
|
||||||
<FormField
|
|
||||||
label="Название"
|
|
||||||
name="name"
|
|
||||||
value={editingIpsecPassword.name}
|
|
||||||
onChange={(val) => setEditingIpsecPassword({ ...editingIpsecPassword, name: val })}
|
|
||||||
placeholder="Основной IPSec пароль"
|
|
||||||
required
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="col-12">
|
|
||||||
<FormField
|
|
||||||
label="Пароль"
|
|
||||||
name="password"
|
|
||||||
type="password"
|
|
||||||
value={editingIpsecPassword.password}
|
|
||||||
onChange={(val) => setEditingIpsecPassword({ ...editingIpsecPassword, password: val })}
|
|
||||||
placeholder="Введите пароль"
|
|
||||||
required
|
|
||||||
/>
|
|
||||||
<div className="form-text">Пароль будет зашифрован перед сохранением в S3</div>
|
|
||||||
</div>
|
|
||||||
<div className="col-12">
|
|
||||||
<FormField
|
|
||||||
label="Описание"
|
|
||||||
name="description"
|
|
||||||
value={editingIpsecPassword.description || ''}
|
|
||||||
onChange={(val) => setEditingIpsecPassword({ ...editingIpsecPassword, description: val })}
|
|
||||||
placeholder="Описание использования пароля"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</FormModal>
|
|
||||||
|
|
||||||
{/* IPSec Passwords List Modal */}
|
{/* IPSec Passwords List Modal */}
|
||||||
{ipsecPasswordsListModalOpen && (
|
{ipsecPasswordsListModalOpen && (
|
||||||
<div className="modal show d-block" style={{ backgroundColor: 'rgba(0,0,0,0.5)' }}>
|
<div className="modal show d-block" style={{ backgroundColor: 'rgba(0,0,0,0.5)' }}>
|
||||||
|
|||||||
Reference in New Issue
Block a user