63 lines
2.0 KiB
JavaScript
63 lines
2.0 KiB
JavaScript
import { addFiles, onFilesChange } from './on_files_change.js';
|
|
import { onFolderChange } from './on_folder_change.js';
|
|
import { findNode, flattenFiles, render } from './render.js';
|
|
|
|
function removeFileMeta(state, node) {
|
|
if (node.kind === 'file') {
|
|
state.fileKeys.delete(`${node.path}\u0000${node.file.size}`);
|
|
return;
|
|
}
|
|
node.children.forEach((child) => removeFileMeta(state, child));
|
|
}
|
|
|
|
function removeNode(state, id) {
|
|
const found = findNode(state.nodes, id);
|
|
if (!found) return;
|
|
removeFileMeta(state, found.node);
|
|
found.nodes.splice(found.nodes.indexOf(found.node), 1);
|
|
}
|
|
|
|
export function initUploadTable(cfg) {
|
|
const elements = {
|
|
fileInputEl: cfg.fileInputEl,
|
|
folderInputEl: cfg.folderInputEl,
|
|
tableBodyEl: cfg.tableBodyEl,
|
|
countEl: cfg.countEl,
|
|
};
|
|
const state = { nodes: [], fileKeys: new Set(), busy: false };
|
|
elements.fileInputEl.addEventListener('change', onFilesChange(state, cfg, elements));
|
|
elements.folderInputEl.addEventListener('change', onFolderChange(state, cfg, elements));
|
|
elements.tableBodyEl.addEventListener('click', (event) => {
|
|
const toggle = event.target.closest('[data-toggle]');
|
|
if (toggle) {
|
|
const found = findNode(state.nodes, toggle.dataset.toggle);
|
|
if (found) found.node.expanded = !found.node.expanded;
|
|
render(state, elements);
|
|
return;
|
|
}
|
|
const remove = event.target.closest('[data-remove]');
|
|
if (remove) {
|
|
removeNode(state, remove.dataset.remove);
|
|
render(state, elements);
|
|
}
|
|
});
|
|
|
|
const api = {
|
|
pickFiles: () => elements.fileInputEl.click(),
|
|
pickFolder: () => elements.folderInputEl.click(),
|
|
addFiles: (files) => addFiles(state, cfg, files, elements),
|
|
getFiles: () => flattenFiles(state.nodes),
|
|
remove: (id) => {
|
|
removeNode(state, id);
|
|
render(state, elements);
|
|
},
|
|
render: () => render(state, elements),
|
|
clear: () => {
|
|
state.nodes = [];
|
|
state.fileKeys.clear();
|
|
render(state, elements);
|
|
},
|
|
};
|
|
api.render();
|
|
return api;
|
|
} |