fix: обязательная фотография в форме отправки; модалка редактирования шире и в две колонки; поддержка .jfif в прикреплении

This commit is contained in:
dev
2026-09-12 17:19:53 +03:00
parent 854f2d4650
commit b263a735ac
2 changed files with 31 additions and 35 deletions
+9 -19
View File
@@ -36,46 +36,36 @@
</div> </div>
<div class="modal-overlay" id="editModal"> <div class="modal-overlay" id="editModal">
<div class="edit-modal" style="max-width:480px"> <div class="edit-modal" style="max-width:720px">
<h3>Редактирование записи</h3> <h3>Редактирование записи</h3>
<form id="editForm" class="settings-stack" style="gap:12px"> <form id="editForm" class="link-fields" style="gap:12px">
<div class="settings-row"> <div class="settings-field">
<div class="settings-field" style="flex:1">
<label>Фамилия и имя <span style="color:#ef4444">*</span></label> <label>Фамилия и имя <span style="color:#ef4444">*</span></label>
<input type="text" id="editName" class="settings-input" list="studentEditList" required autocomplete="off"> <input type="text" id="editName" class="settings-input" list="studentEditList" required autocomplete="off">
<datalist id="studentEditList"></datalist> <datalist id="studentEditList"></datalist>
</div> </div>
</div> <div class="settings-field">
<div class="settings-row">
<div class="settings-field" style="flex:1">
<label>Группа <span style="color:#ef4444">*</span></label> <label>Группа <span style="color:#ef4444">*</span></label>
<select id="editGroup" class="settings-input" required></select> <select id="editGroup" class="settings-input" required></select>
</div> </div>
</div> <div class="settings-field full">
<div class="settings-row">
<div class="settings-field" style="flex:1">
<label>Что делала(а) <span style="color:#ef4444">*</span> <label>Что делала(а) <span style="color:#ef4444">*</span>
<button type="button" id="aiCorrectBtn" class="ai-btn" title="Исправить ошибки ИИ">✨</button> <button type="button" id="aiCorrectBtn" class="ai-btn" title="Исправить ошибки ИИ">✨</button>
</label> </label>
<textarea id="editDesc" class="settings-input" required></textarea> <textarea id="editDesc" class="settings-input" required></textarea>
<div id="editAiStatus" class="ai-status" style="display:none"></div> <div id="editAiStatus" class="ai-status" style="display:none"></div>
</div> </div>
</div> <div class="settings-field">
<div class="settings-row">
<div class="settings-field" style="flex:1">
<label>Фотография</label> <label>Фотография</label>
<input type="file" id="editPhoto" accept=".jpg,.jpeg,.png,.gif,.webp,.bmp,.avif,.ico,.heic,.heif,.jfif"> <input type="file" id="editPhoto" accept=".jpg,.jpeg,.png,.gif,.webp,.bmp,.avif,.ico,.heic,.heif,.jfif">
<div class="files-preview" id="editPhotoPreview"></div> <div class="files-preview" id="editPhotoPreview"></div>
</div> </div>
</div> <div class="settings-field">
<div class="settings-row">
<div class="settings-field" style="flex:1">
<label>Прикрепить файлы</label> <label>Прикрепить файлы</label>
<input type="file" id="editFiles" multiple accept=".pdf,.doc,.docx,.txt,.md,.html,.htm,.zip,.rar,.7z,.jpg,.jpeg,.png,.gif,.webp"> <input type="file" id="editFiles" multiple accept=".pdf,.doc,.docx,.txt,.md,.html,.htm,.zip,.rar,.7z,.jpg,.jpeg,.png,.gif,.webp,.bmp,.avif,.ico,.heic,.heif,.jfif">
<div class="files-preview" id="editFilesPreview"></div> <div class="files-preview" id="editFilesPreview"></div>
</div> </div>
</div> <div class="card-foot full" style="justify-content:flex-end;gap:8px">
<div class="card-foot" style="justify-content:flex-end;gap:8px">
<button type="button" class="btn-primary ghost" id="editCancelBtn">Отмена</button> <button type="button" class="btn-primary ghost" id="editCancelBtn">Отмена</button>
<button type="submit" class="btn-primary">Сохранить</button> <button type="submit" class="btn-primary">Сохранить</button>
</div> </div>
+7 -1
View File
@@ -146,12 +146,18 @@ function capture() {
form.addEventListener('submit', async (e) => { form.addEventListener('submit', async (e) => {
e.preventDefault(); e.preventDefault();
if (!capturedBlob) {
toast.textContent = 'Сначала сделайте фотографию';
toast.classList.add('show', 'error');
setTimeout(() => toast.classList.remove('show', 'error'), 3200);
return;
}
const btn = document.getElementById('submitBtn'); const btn = document.getElementById('submitBtn');
btn.disabled = true; btn.disabled = true;
btn.textContent = 'Отправка...'; btn.textContent = 'Отправка...';
const fd = new FormData(); const fd = new FormData();
if (capturedBlob) fd.append('photo', capturedBlob, 'photo.jpg'); fd.append('photo', capturedBlob, 'photo.jpg');
selectedFiles.forEach(f => fd.append('files', f, f.name)); selectedFiles.forEach(f => fd.append('files', f, f.name));
fd.append('student_name', studentName || document.getElementById('nameInput').value); fd.append('student_name', studentName || document.getElementById('nameInput').value);
fd.append('group_id', groupInput.value); fd.append('group_id', groupInput.value);