14 KiB
✨ Улучшения ConfirmDiffModal
Что было сделано
1. Улучшен внешний вид модального окна
Было:
┌─────────────────────────────┐
│ Подтвердить сохранение │
├─────────────────────────────┤
│ [5] [2] [3] │
│ Добавл. Удалено Изменено │
├─────────────────────────────┤
│ [Отмена] [Сохранить] │
└─────────────────────────────┘
Стало:
┌────────────────────────────────────────┐
│ Подтвердить массовое изменение [×] │
├────────────────────────────────────────┤
│ ⚠️ Внимание! Массовое изменение данных │
│ Вы собираетесь изменить 15 записей │
├────────────────────────────────────────┤
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ ✅ │ │ ❌ │ │ 🔄 │ │
│ │ 5 │ │ 2 │ │ 3 │ │
│ │Добав.│ │Удал. │ │Измен.│ │
│ └──────┘ └──────┘ └──────┘ │
├────────────────────────────────────────┤
│ ▼ Добавлено (5) │
│ + example.com │
│ + test.org │
│ ... │
├────────────────────────────────────────┤
│ [Отмена] [Сохранить 15 изменений] │
└────────────────────────────────────────┘
2. Добавлен детальный diff
Что показывается:
- ✅ Добавленные записи (зелёный цвет, иконка +)
- ❌ Удалённые записи (красный цвет, иконка -)
- 🔄 Изменённые записи (синий цвет, иконка ~)
Preview:
- Показывает первые 5 элементов каждого типа
- Если больше 5 - показывает "... и ещё N записей"
- Аккордеон для разворачивания деталей
Формат отображения:
+ example.com (добавлено)
- old-site.com (удалено)
~ updated-site.net (изменено)
3. Умное подтверждение (Smart Confirmation)
Правило:
- ≤ 10 изменений → сохраняет СРАЗУ (без модалки)
- > 10 изменений → показывает МОДАЛКУ с подтверждением
Почему 10?
- Мелкие правки (1-10 записей) - быстрая работа
- Массовые изменения (>10) - требуют внимания и подтверждения
- Баланс между скоростью и безопасностью
Порог можно изменить:
// В DomainsNewManager.jsx, IPRangesManager.jsx, ASNsNewManager.jsx
if (totalChanges > 10) { // Измените 10 на нужное значение
setConfirmSaveOpen(true);
} else {
performSave();
}
4. Использование modal-backdrop show
Как в HistoryModal:
<>
<div className="modal-backdrop show" onClick={handleBackdropClick} />
<div className="modal show d-block">
{/* content */}
</div>
</>
Преимущества:
- ✅ Единообразный стиль во всём приложении
- ✅ Затемнение фона
- ✅ Клик вне модалки закрывает окно
- ✅ ESC закрывает окно
Изменённые файлы
1. frontend/src/components/ConfirmDiffModal.jsx
- ✅ Полностью переработан UI
- ✅ Добавлен детальный diff с preview
- ✅ Аккордеон для разворачивания списков
- ✅ Иконки для типов изменений
- ✅ Alert о массовом изменении
- ✅ Карточки со статистикой
- ✅ modal-lg для большего размера
- ✅ modal-dialog-scrollable для прокрутки
2. frontend/src/DomainsNewManager.jsx
- ✅ Умное подтверждение (>10 изменений)
- ✅ Автоматическое сохранение для мелких правок
3. frontend/src/IPRangesManager.jsx
- ✅ Умное подтверждение (>10 изменений)
- ✅ Автоматическое сохранение для мелких правок
4. frontend/src/ASNsNewManager.jsx
- ✅ Умное подтверждение (>10 изменений)
- ✅ Автоматическое сохранение для мелких правок
Примеры использования
Пример 1: Малое изменение (≤10)
Пользователь добавляет 3 домена → Клик "Сохранить"
↓
Сохраняется СРАЗУ (без модалки)
↓
Toast: "✅ Данные сохранены"
Пример 2: Массовое изменение (>10)
Пользователь импортирует 50 доменов → Клик "Сохранить"
↓
Открывается модалка с preview
↓
┌─────────────────────────────────┐
│ ⚠️ Массовое изменение! │
│ Вы собираетесь изменить 50 записей │
│ │
│ ▼ Добавлено (48) │
│ + domain1.com │
│ + domain2.com │
│ ... │
│ │
│ ▼ Удалено (2) │
│ - old.com │
│ ... │
│ │
│ [Отмена] [Сохранить 50 изменений] │
└─────────────────────────────────┘
↓
Пользователь проверяет
↓
Клик "Сохранить"
↓
Toast: "✅ Данные сохранены"
Преимущества
До улучшений:
- ❌ Всегда показывалась модалка (раздражает при мелких правках)
- ❌ Показывались только цифры (не видно ЧТО именно)
- ❌ Маленькое окно (modal-sm)
- ❌ Нет деталей изменений
После улучшений:
- ✅ Умное подтверждение (малые - сразу, большие - модалка)
- ✅ Детальный diff с preview (видно ЧТО изменилось)
- ✅ Большое окно (modal-lg) с прокруткой
- ✅ Аккордеон для детального просмотра
- ✅ Иконки и цветовое кодирование
- ✅ Предупреждение о массовых изменениях
- ✅ Единообразный backdrop как в HistoryModal
Настройки
Изменить порог подтверждения
По умолчанию: 10 изменений
Чтобы изменить порог, отредактируйте в 3 файлах:
DomainsNewManager.jsxIPRangesManager.jsxASNsNewManager.jsx
// Найти:
if (totalChanges > 10) {
// Изменить на (например, 20):
if (totalChanges > 20) {
Изменить количество preview элементов
По умолчанию: 5 элементов
В ConfirmDiffModal.jsx:
// Найти:
const maxPreview = 5;
// Изменить на (например, 10):
const maxPreview = 10;
Отключить умное подтверждение
Чтобы всегда показывать модалку:
// Заменить:
if (totalChanges > 10) {
setConfirmSaveOpen(true);
} else {
performSave();
}
// На:
setConfirmSaveOpen(true);
Чтобы никогда не показывать модалку:
// Заменить:
if (totalChanges > 10) {
setConfirmSaveOpen(true);
} else {
performSave();
}
// На:
performSave();
Тестирование
Тест 1: Малое изменение
- Откройте страницу доменов
- Добавьте 3-5 доменов
- Нажмите "Сохранить" (Ctrl+S)
- Ожидается: Сохраняется сразу, без модалки
- Результат: ✅ Toast "Данные сохранены"
Тест 2: Массовое изменение
- Откройте страницу доменов
- Нажмите "Импорт"
- Вставьте 50+ доменов
- Нажмите "Сохранить"
- Ожидается: Открывается модалка с preview
- Результат: ✅ Видна детальная статистика
- Разверните аккордеон "Добавлено"
- Ожидается: Список первых 5 доменов + "... и ещё N"
- Нажмите "Сохранить N изменений"
- Результат: ✅ Данные сохранены
Тест 3: Backdrop
- Откройте модалку (>10 изменений)
- Кликните на затемнённую область вокруг модалки
- Ожидается: Модалка закрывается
- Откройте снова
- Нажмите ESC
- Ожидается: Модалка закрывается
Визуальные улучшения
Цветовая схема
- 🟢 Зелёный - добавленные записи (border-success, text-success)
- 🔴 Красный - удалённые записи (border-danger, text-danger)
- 🔵 Синий - изменённые записи (border-info, text-info)
- 🟡 Жёлтый - предупреждение (alert-warning)
Иконки
- ➕
IconPlus- добавлено - ➖
IconMinus- удалено - ✏️
IconEdit- изменено
Размеры
- До: modal-sm (маленькое окно)
- После: modal-lg (большое окно)
- Scrollable: modal-dialog-scrollable (с прокруткой)
FAQ
Q: Почему именно 10 изменений как порог?
A: Это баланс между скоростью (малые правки) и безопасностью (массовые изменения). Можно настроить.
Q: Можно ли полностью убрать модалку?
A: Да, замените if (totalChanges > 10) на performSave() сразу.
Q: Почему показывается только 5 элементов в preview?
A: Чтобы не перегружать UI. При 1000 изменениях неудобно смотреть все. Можно изменить maxPreview.
Q: Можно ли добавить настройку в UI?
A: Да! Добавьте checkbox в SettingsModal:
<label>
<input type="checkbox" checked={skipConfirm} onChange={(e) => setSkipConfirm(e.target.checked)} />
Не спрашивать подтверждение при сохранении
</label>
Q: Что если нужно видеть ВСЕ изменения?
A: Увеличьте maxPreview или используйте кнопку "Preview" для просмотра полного diff.
Статус
✅ Готово и протестировано
- ✅ Нет ошибок линтера
- ✅ Работает во всех 3 компонентах
- ✅ modal-backdrop show как в HistoryModal
- ✅ Детальный diff с preview
- ✅ Умное подтверждение (>10)
- ✅ Аккордеон для детального просмотра
- ✅ Цветовое кодирование
- ✅ Responsive дизайн
Что дальше?
Возможные будущие улучшения:
- Добавить фильтрацию в preview (показывать только добавленные/удалённые)
- Добавить поиск в списках изменений
- Добавить copy-to-clipboard для списков
- Добавить настройку порога в UI (SettingsModal)
- Добавить экспорт diff в файл
- Добавить diff для changed элементов (было → стало)
Нужно что-то из этого? Скажи, реализую! 😊