progress bars
This commit is contained in:
130
server/server.ts
130
server/server.ts
@@ -427,6 +427,47 @@ router.get('/', async (req, res) => {
|
|||||||
alert('Произошла ошибка: ' + error.message);
|
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;
|
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 {
|
.model-details {
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
}
|
}
|
||||||
@@ -1007,6 +1094,9 @@ router.get('/', async (req, res) => {
|
|||||||
<p class="model-count">${count} документов</p>
|
<p class="model-count">${count} документов</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="model-details">
|
<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">
|
<div class="model-fields">
|
||||||
<h4>Поля:</h4>
|
<h4>Поля:</h4>
|
||||||
<ul class="fields-list">
|
<ul class="fields-list">
|
||||||
@@ -1016,6 +1106,9 @@ router.get('/', async (req, res) => {
|
|||||||
}).join('')}
|
}).join('')}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="model-actions">
|
||||||
|
<button class="model-button model-button-danger clear-model-btn" data-model="${name}">Очистить коллекцию</button>
|
||||||
|
</div>
|
||||||
</div>
|
</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
|
export default router
|
||||||
|
|||||||
Reference in New Issue
Block a user