progress bars

This commit is contained in:
Primakov Alexandr Alexandrovich
2025-05-08 18:36:13 +03:00
parent 2d0b97be44
commit bde6ab4c7a

View File

@@ -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) => {
<p class="model-count">${count} документов</p>
</div>
<div class="model-details">
<div class="progress-bar-container">
<div class="progress-bar" style="width: ${Math.min((count / 1000) * 100, 100)}%"></div>
</div>
<div class="model-fields">
<h4>Поля:</h4>
<ul class="fields-list">
@@ -1016,6 +1106,9 @@ router.get('/', async (req, res) => {
}).join('')}
</ul>
</div>
<div class="model-actions">
<button class="model-button model-button-danger clear-model-btn" data-model="${name}">Очистить коллекцию</button>
</div>
</div>
</div>
`;
@@ -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