комментарии на инструментах

This commit is contained in:
2025-12-20 23:22:51 +03:00
parent d7bfdb69a6
commit 83ecf65abf
11 changed files with 336 additions and 65 deletions
Binary file not shown.
Binary file not shown.
+18
View File
@@ -82,6 +82,24 @@ async def toolkit_request(
return response
@router.post("/comment", summary="Добавление комментария")
async def add_comment(reqData: dict = Depends(requestDict)):
logger.info(f"Добавление комментария")
response = {"status": "error"}
try:
logger.info(f"Добавление комментария")
logger.info(reqData.get("body"))
toolkitId = int(reqData.get("body").get("toolkitId"))
comment = reqData.get("body").get("commentText")
userId = int(reqData.get("body").get("userId"))
result = await ToolkitHandler.addComment(toolkitId, userId, comment)
response = handleResult(result, response)
except Exception as e:
logger.error(e)
finally:
return response
@router.post("/fill_prepare", summary="Подготовка заполнения ящика")
async def fill_toolbox():
logger.info(f"Подготовка заполнения ящика")
+147
View File
@@ -3823,6 +3823,7 @@ async function getToolkitStocks(toolkitId) {
return resp.data;
}
// Функция показа модального окна с деталями инструмента
// Функция показа модального окна с деталями инструмента
async function showToolkitDetailsModal(toolkitId) {
const modalId = 'toolkitDetailsModal';
@@ -3920,6 +3921,36 @@ async function showToolkitDetailsModal(toolkitId) {
let toolkitStocksData = null;
let isStocksLoading = false;
// Форматирование даты комментария
let commentDateInfo = '';
if (toolkitData.comment_at) {
const commentDate = new Date(toolkitData.comment_at);
commentDateInfo = `
<div class="text-muted small">
<i class="bi bi-clock me-1"></i>
Последнее изменение: ${commentDate.toLocaleDateString('ru-RU')} ${commentDate.toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit' })}
</div>
`;
} else {
commentDateInfo = `
<div class="text-muted small">
<i class="bi bi-info-circle me-1"></i>
Комментарии еще не оставляли
</div>
`;
}
// Информация о пользователе, оставившем комментарий
let commentUserInfo = '';
if (toolkitData.comment_user_data && toolkitData.comment_user_data.username) {
commentUserInfo = `
<div class="text-muted small">
<i class="bi bi-person me-1"></i>
Автор: ${toolkitData.comment_user_data.username}
</div>
`;
}
modal.innerHTML = `
<div class="modal-dialog modal-lg">
<div class="modal-content">
@@ -3993,6 +4024,27 @@ async function showToolkitDetailsModal(toolkitId) {
` : ''}
</div>
</div>
<!-- Секция комментариев -->
<div class="border-top pt-3 mt-3">
<h6><i class="bi bi-chat-left-text me-1"></i>Комментарий</h6>
<div class="mb-2">
${commentDateInfo}
${commentUserInfo}
</div>
<div class="mb-2">
<textarea class="form-control" id="toolkitComment" rows="3"
placeholder="Введите комментарий...">${toolkitData.comment_text || ''}</textarea>
</div>
<div class="d-flex justify-content-between align-items-center">
<div class="form-text">
Комментарий будет сохранен для этого инструмента
</div>
<button type="button" class="btn btn-primary btn-sm" id="saveCommentBtn" disabled>
<i class="bi bi-save me-1"></i>Сохранить
</button>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
@@ -4100,6 +4152,101 @@ async function showToolkitDetailsModal(toolkitId) {
const bsModal = new bootstrap.Modal(modal);
bsModal.show();
// Элементы для работы с комментарием
const commentTextarea = modal.querySelector('#toolkitComment');
const saveCommentBtn = modal.querySelector('#saveCommentBtn');
const originalComment = toolkitData.comment_text || '';
// Проверка изменения комментария
const checkCommentChanged = () => {
const currentComment = commentTextarea.value.trim();
const isChanged = currentComment !== originalComment;
saveCommentBtn.disabled = !isChanged || currentComment === '';
};
// Слушатель изменений в текстовом поле
commentTextarea.addEventListener('input', checkCommentChanged);
// Обработчик сохранения комментария
saveCommentBtn.addEventListener('click', async () => {
const commentText = commentTextarea.value.trim();
if (!commentText) {
showInfo('Комментарий не может быть пустым', 'warning');
return;
}
try {
// Блокируем кнопку на время отправки
saveCommentBtn.disabled = true;
saveCommentBtn.innerHTML = '<span class="spinner-border spinner-border-sm me-1" role="status" aria-hidden="true"></span>Сохранение...';
// Отправляем комментарий на сервер
const response = await apiRequest('/toolkit/comment', {
toolkitId: toolkitData.id,
userId: userData.id,
commentText: commentText
}, 'POST');
if (response.status === 'ok') {
// Обновляем информацию о комментарии без перезагрузки страницы
const now = new Date();
// Обновляем информацию о дате
const dateInfoDiv = modal.querySelector('.border-top .text-muted.small:first-child');
if (dateInfoDiv) {
dateInfoDiv.innerHTML = `
<i class="bi bi-clock me-1"></i>
Последнее изменение: ${now.toLocaleDateString('ru-RU')} ${now.toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit' })}
`;
}
// Обновляем информацию о пользователе
const userInfoDiv = modal.querySelector('.border-top .text-muted.small:nth-child(2)');
if (userInfoDiv) {
userInfoDiv.innerHTML = `
<i class="bi bi-person me-1"></i>
Автор: ${userData.username || 'Текущий пользователь'}
`;
} else if (userData.username) {
// Если элемента с информацией о пользователе не было, создаем его
const commentInfoDiv = modal.querySelector('.border-top .mb-2');
if (commentInfoDiv) {
const newUserInfo = document.createElement('div');
newUserInfo.className = 'text-muted small';
newUserInfo.innerHTML = `
<i class="bi bi-person me-1"></i>
Автор: ${userData.username}
`;
commentInfoDiv.appendChild(newUserInfo);
}
}
// Обновляем оригинальный комментарий для дальнейших проверок
toolkitData.comment_text = commentText;
toolkitData.comment_at = now.toISOString();
toolkitData.comment_user_data = { username: userData.username };
// Показываем успешное сообщение
showInfo('Комментарий успешно сохранен', 'success');
// Кнопка становится неактивной, так как изменения сохранены
saveCommentBtn.innerHTML = '<i class="bi bi-save me-1"></i>Сохранено';
setTimeout(() => {
saveCommentBtn.innerHTML = '<i class="bi bi-save me-1"></i>Сохранить';
checkCommentChanged();
}, 1500);
} else {
throw new Error(response.message || 'Ошибка сохранения комментария');
}
} catch (error) {
console.error('Ошибка при сохранении комментария:', error);
showInfo(error.message || 'Произошла ошибка при сохранении комментария', 'danger');
saveCommentBtn.disabled = false;
saveCommentBtn.innerHTML = '<i class="bi bi-save me-1"></i>Сохранить';
}
});
// Функция для загрузки данных об остатках
const loadToolkitStocks = async () => {
if (isStocksLoading) return;