diff --git a/server/server.ts b/server/server.ts index 8c94b68..801959b 100644 --- a/server/server.ts +++ b/server/server.ts @@ -427,6 +427,47 @@ router.get('/', async (req, res) => { alert('Произошла ошибка: ' + error.message); } }); + + // Обработчик кнопок очистки коллекций + document.querySelectorAll('.clear-model-btn').forEach(button => { + button.addEventListener('click', async function() { + const modelName = this.getAttribute('data-model'); + if (!modelName) return; + + if (!confirm(\`Вы уверены, что хотите очистить коллекцию \${modelName}?\`)) { + return; + } + + try { + const response = await fetch('' + getUrl('/clear-collection'), { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ modelName }) + }); + + if (!response.ok) { + throw new Error('Ошибка при очистке коллекции'); + } + + const data = await response.json(); + + // Показываем сообщение об успехе + successAction.textContent = 'Коллекция ' + data.model + ' очищена. Удалено ' + data.deletedCount + ' записей'; + successAction.style.display = 'block'; + + // Перезагружаем страницу через 2 секунды + setTimeout(() => { + window.location.reload(); + }, 2000); + + } catch (error) { + console.error('Ошибка:', error); + alert('Произошла ошибка: ' + error.message); + } + }); + }); }); `; @@ -792,6 +833,52 @@ router.get('/', async (req, res) => { font-weight: 500; } + .progress-bar-container { + width: 100%; + background-color: #f0f0f0; + border-radius: 10px; + margin: 10px 0; + overflow: hidden; + } + + .progress-bar { + height: 10px; + background: linear-gradient(90deg, var(--primary-color), #5c6bc0); + border-radius: 10px; + transition: width 0.5s ease; + } + + .model-actions { + display: flex; + justify-content: flex-end; + margin-top: 10px; + } + + .model-button { + background-color: var(--primary-color); + color: white; + border: none; + padding: 5px 10px; + border-radius: var(--border-radius); + cursor: pointer; + font-size: 0.8rem; + font-weight: 500; + transition: var(--transition); + } + + .model-button:hover { + background-color: #303f9f; + box-shadow: var(--shadow); + } + + .model-button-danger { + background-color: #f44336; + } + + .model-button-danger:hover { + background-color: #d32f2f; + } + .model-details { padding: 15px; } @@ -1007,6 +1094,9 @@ router.get('/', async (req, res) => {

${count} документов

+
+
+

Поля:

+
+ +
`; @@ -1078,4 +1171,41 @@ router.post('/clear-old-errors', async (req, res) => { } }); +// Эндпоинт для очистки отдельной коллекции +router.post('/clear-collection', async (req, res) => { + try { + const { modelName } = req.body; + + if (!modelName) { + return res.status(400).json({ + success: false, + error: 'Имя модели не указано' + }); + } + + // Проверяем, существует ли такая модель + if (!mongoose.modelNames().includes(modelName)) { + return res.status(404).json({ + success: false, + error: 'Модель не найдена' + }); + } + + const model = mongoose.model(modelName); + const result = await model.deleteMany({}); + + res.json({ + success: true, + deletedCount: result.deletedCount || 0, + model: modelName + }); + } catch (error) { + console.error(`Ошибка при очистке коллекции:`, error); + res.status(500).json({ + success: false, + error: 'Ошибка при очистке коллекции' + }); + } +}); + export default router