Release 1.2: bulk upload, S3/SFTP/FTP, SMTP, password reset, user groups, git deploy

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-06 22:38:37 +03:00
parent db2cef41bb
commit c1aac7ecac
33 changed files with 1649 additions and 150 deletions
+25 -10
View File
@@ -8,6 +8,8 @@ document.addEventListener("DOMContentLoaded", () => {
if (!dropzone || !photoInput) return;
const maxFiles = parseInt(photoInput.dataset.max || "100", 10);
dropzone.addEventListener("click", (e) => {
if (e.target.closest("button")) return;
photoInput.click();
@@ -28,30 +30,43 @@ document.addEventListener("DOMContentLoaded", () => {
});
dropzone.addEventListener("drop", (e) => {
const files = e.dataTransfer.files;
if (files.length > 0) {
photoInput.files = files;
showPreview(files[0]);
}
e.preventDefault();
assignFiles(e.dataTransfer.files);
});
photoInput.addEventListener("change", () => {
if (photoInput.files.length > 0) {
showPreview(photoInput.files[0]);
showPreview(photoInput.files);
}
});
function showPreview(file) {
if (!file.type.startsWith("image/")) return;
function assignFiles(fileList) {
const dt = new DataTransfer();
const limit = Math.min(fileList.length, maxFiles);
for (let i = 0; i < limit; i++) {
if (fileList[i].type.startsWith("image/")) {
dt.items.add(fileList[i]);
}
}
photoInput.files = dt.files;
showPreview(photoInput.files);
}
function showPreview(files) {
if (!files || files.length === 0) return;
const first = files[0];
const reader = new FileReader();
reader.onload = (e) => {
previewImg.src = e.target.result;
previewName.textContent = file.name;
previewName.textContent =
files.length === 1
? first.name
: `${files.length} файлов (первый: ${first.name})`;
preview.hidden = false;
submitBtn.disabled = false;
};
reader.readAsDataURL(file);
reader.readAsDataURL(first);
}
document.querySelectorAll(".copy-btn").forEach((btn) => {