Add feedback system functionality
- Implement feedback management system in admin interface - Add feedback processing and AI-based features - Update user interface with new feedback components - Modify server-side API endpoints for feedback handling - Enhance worker.js for background feedback processing - Update deployment configuration for feedback components Co-authored-by: openhands <openhands@all-hands.dev>
This commit is contained in:
@@ -0,0 +1,145 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Обратная связь — WhatIDo</title>
|
||||
<link rel="stylesheet" href="admin.css">
|
||||
<style>
|
||||
.feedback-list { display:flex; flex-direction:column; gap:10px; }
|
||||
.feedback-item { background:var(--panel); border:1px solid var(--border); border-radius:10px; padding:10px 12px; display:grid; grid-template-columns:120px 140px 160px 100px 140px 1fr 160px; gap:10px; align-items:center; }
|
||||
.feedback-item .col { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
||||
.feedback-item .text { color:var(--text-secondary); font-size:13px; }
|
||||
.feedback-item .actions { display:flex; gap:6px; flex-wrap:wrap; }
|
||||
.card-stack { flex-direction: column; align-items: stretch; }
|
||||
.card-stack .filters { margin-bottom: 0; }
|
||||
.feedback-item .btn-xs.sent-on { background:var(--accent); color:#fff; }
|
||||
@media (max-width: 1100px) {
|
||||
.feedback-item { grid-template-columns:120px 140px 160px 100px 140px 1fr; }
|
||||
.feedback-item .actions { grid-column:1/-1; justify-content:flex-end; }
|
||||
}
|
||||
.shorts-list { display:flex; flex-direction:column; gap:6px; width:100%; max-height:220px; overflow:auto; padding:2px 0; }
|
||||
.shorts-list .item { display:flex; gap:8px; align-items:flex-start; }
|
||||
.shorts-list .item label { flex:1; font-size:13px; line-height:1.3; color:var(--text); cursor:pointer; }
|
||||
</style>
|
||||
</head>
|
||||
<body data-page="feedback">
|
||||
<div class="app">
|
||||
<aside class="sidebar" id="sidebar"></aside>
|
||||
<main class="main">
|
||||
<header class="page-head">
|
||||
<div>
|
||||
<h2>Обратная связь</h2>
|
||||
<div class="page-sub">Отзывы тьютора по итогам занятий</div>
|
||||
</div>
|
||||
<button class="btn-primary" id="addFeedbackBtn"><span data-lucide="plus"></span> Добавить отзыв</button>
|
||||
</header>
|
||||
<section class="card card-stack">
|
||||
<div class="filters">
|
||||
<div><label>Поиск</label><input type="text" id="fbSearch" class="search-input" placeholder="Поиск по ФИО, теме, тексту…"></div>
|
||||
<div><label>Группа</label><select id="fbGroupFilter"><option value="">Все группы</option></select></div>
|
||||
<div><label>Статус</label><select id="fbStatusFilter">
|
||||
<option value="">Все статусы</option>
|
||||
<option value="sent">Отправлено</option>
|
||||
<option value="none">Без ИИ</option>
|
||||
<option value="pending">Ожидает</option>
|
||||
<option value="processing">В обработке</option>
|
||||
<option value="done">Готово</option>
|
||||
<option value="error">Ошибка</option>
|
||||
<option value="skipped">Пропущен</option>
|
||||
</select></div>
|
||||
<div><label>С</label><input type="date" id="fbDateFrom"></div>
|
||||
<div><label>По</label><input type="date" id="fbDateTo"></div>
|
||||
<div><label> </label>
|
||||
<label class="toggle" style="align-items:center">
|
||||
<input type="checkbox" id="fbDeletedToggle">
|
||||
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
||||
<span class="toggle-text">Показать удалённые</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-wrap">
|
||||
<div class="feedback-list" id="feedbackList"></div>
|
||||
</div>
|
||||
<div class="card-foot">
|
||||
<div id="feedbackState" class="muted"></div>
|
||||
<div id="pager"></div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<div class="modal-overlay" id="feedbackModal">
|
||||
<div class="edit-modal" style="max-width:680px">
|
||||
<h3 id="fbModalTitle">Добавить отзыв</h3>
|
||||
<form id="fbForm" class="settings-stack" autocomplete="off">
|
||||
<input type="hidden" id="fbId">
|
||||
<div class="settings-stack-grid">
|
||||
<div class="settings-field">
|
||||
<label>Дата занятия <span style="color:#ef4444">*</span></label>
|
||||
<input type="date" id="fbDate" class="settings-input" required>
|
||||
</div>
|
||||
<div class="settings-field">
|
||||
<label>Группа <span style="color:#ef4444">*</span></label>
|
||||
<select id="fbGroup" class="settings-input" required></select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="settings-stack-grid">
|
||||
<div class="settings-field">
|
||||
<label>Фамилия/Имя резидента <span style="color:#ef4444">*</span></label>
|
||||
<input type="text" id="fbResident" class="settings-input" required maxlength="200" placeholder="Иванов Иван" list="fbResidentList" autocomplete="off">
|
||||
<datalist id="fbResidentList"></datalist>
|
||||
</div>
|
||||
<div class="settings-field">
|
||||
<label>Тема занятия</label>
|
||||
<input type="text" id="fbTopic" class="settings-input" maxlength="500" placeholder="Тема занятия" list="fbTopicList" autocomplete="off">
|
||||
<datalist id="fbTopicList"></datalist>
|
||||
</div>
|
||||
</div>
|
||||
<div class="settings-field">
|
||||
<label>Текст отзыва</label>
|
||||
<textarea id="fbText" class="settings-input" rows="5" maxlength="5000" placeholder="Текст отзыва (может быть сгенерирован ИИ)"></textarea>
|
||||
<div class="hint"><span id="fbTextHint">0 / 5000</span></div>
|
||||
</div>
|
||||
<div class="settings-stack-grid" style="align-items:start">
|
||||
<label class="toggle" style="align-items:center">
|
||||
<input type="checkbox" id="fbAiCheck" checked>
|
||||
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
||||
<span class="toggle-text"><b>Сгенерировать отзыв ИИ</b><small>Будет отправлено в очередь</small></span>
|
||||
</label>
|
||||
<div class="settings-field">
|
||||
<label>Модель ИИ</label>
|
||||
<select id="fbModel" class="settings-input"></select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="settings-field">
|
||||
<label class="toggle" style="align-items:center">
|
||||
<input type="checkbox" id="fbPastCheck">
|
||||
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
||||
<span class="toggle-text">Добавить в промпт прошлый отзыв</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="settings-field" id="fbPastReviewWrap" style="display:none">
|
||||
<label>Прошлый отзыв</label>
|
||||
<textarea id="fbPastReview" class="settings-input" rows="3" maxlength="2000"></textarea>
|
||||
</div>
|
||||
<div class="settings-field" id="fbShortsWrap" style="display:none">
|
||||
<label>Выберите короткие сообщения для обратной связи (отмечены все)</label>
|
||||
<div class="shorts-list" id="fbShortsList"></div>
|
||||
<div class="hint">Эти сообщения будут переданы в промпт как контекст</div>
|
||||
</div>
|
||||
<div class="ai-status" id="fbAiStatus" hidden></div>
|
||||
<div class="card-foot" style="justify-content:flex-end;gap:8px">
|
||||
<button type="button" class="btn-primary ghost" id="fbCancel">Отмена</button>
|
||||
<button type="submit" class="btn-primary" id="fbSubmit">Отправить в очередь</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="vendor/lucide.min.js"></script>
|
||||
<script src="js/datetime.js"></script>
|
||||
<script src="admin.js"></script>
|
||||
<script src="js/feedback.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user