Reset picker status between selections and harden upload guards

This commit is contained in:
Repinoid
2026-10-24 08:31:19 +03:00
parent eb61a1b356
commit 3c0c3a2043
7 changed files with 48 additions and 10 deletions
+2
View File
@@ -156,6 +156,7 @@ export function initFilePicker(config) {
if (root.querySelector('#fp-clear-btn')) listen(root.querySelector('#fp-clear-btn'), 'click', () => {
state.nodes = [];
state.fileKeys.clear();
if (elements.statusEl) elements.statusEl.textContent = '';
redraw();
notify(cfg, state);
});
@@ -174,6 +175,7 @@ export function initFilePicker(config) {
clear: () => {
state.nodes = [];
state.fileKeys.clear();
if (elements.statusEl) elements.statusEl.textContent = '';
redraw();
notify(cfg, state);
},
+3
View File
@@ -61,6 +61,9 @@ export function onFilesChange(state, cfg, elements) {
return async () => {
if (state.busy) return;
state.busy = true;
// Сброс статуса перед новым выбором: иначе сообщение об ошибке предыдущего
// выбора (например, «Ошибка чтения архива») останется висеть в интерфейсе.
if (elements.statusEl) elements.statusEl.textContent = '';
try {
await addFiles(state, cfg, elements.fileInputEl.files, elements);
} finally {
+15 -6
View File
@@ -20,6 +20,9 @@ export function onFolderChange(state, cfg, elements) {
return async () => {
if (state.busy) return;
state.busy = true;
// Сброс статуса перед новым выбором: иначе сообщение об ошибке предыдущего
// выбора (например, «Ошибка чтения архива») останется висеть в интерфейсе.
if (elements.statusEl) elements.statusEl.textContent = '';
try {
const roots = new Map();
for (const file of Array.from(elements.folderInputEl.files)) {
@@ -30,8 +33,10 @@ export function onFolderChange(state, cfg, elements) {
const rootName = parts[0] || file.name;
if (!roots.has(rootName)) {
// Один root на выбранный каталог позволяет сохранить дерево целиком.
roots.set(rootName, { id: crypto.randomUUID(), kind: 'folder', name: rootName,
path: rootName, children: [], expanded: false });
roots.set(rootName, {
id: crypto.randomUUID(), kind: 'folder', name: rootName,
path: rootName, children: [], expanded: false
});
}
const root = roots.get(rootName);
// Вставляет узел по его пути, создавая отсутствующие промежуточные папки.
@@ -42,9 +47,11 @@ export function onFolderChange(state, cfg, elements) {
const last = index === nodeParts.length - 1;
let child = current.children.find((item) => item.name === part);
if (!child) {
child = last ? node : { id: crypto.randomUUID(), kind: 'folder', name: part,
child = last ? node : {
id: crypto.randomUUID(), kind: 'folder', name: part,
path: `${rootName}/${nodeParts.slice(0, index + 1).join('/')}`,
children: [], expanded: false };
children: [], expanded: false
};
current.children.push(child);
}
current = child;
@@ -68,8 +75,10 @@ export function onFolderChange(state, cfg, elements) {
continue;
}
} else if (cfg.allowedExt.some((extension) => lowerPath.endsWith(extension))) {
addToFolder({ id: crypto.randomUUID(), kind: 'file', name: parts.at(-1),
path: `${rootName}/${relativePath}`, file, children: [], expanded: true });
addToFolder({
id: crypto.randomUUID(), kind: 'file', name: parts.at(-1),
path: `${rootName}/${relativePath}`, file, children: [], expanded: true
});
}
}
// Дедупликация выполняется после сборки каждого корня каталога.