96 lines
3.0 KiB
JavaScript
96 lines
3.0 KiB
JavaScript
import { state } from './state.js';
|
|
import { setStatus, showToast } from './ui.js';
|
|
import { renderGrid, showEmptyGrid } from './grid.js';
|
|
import * as history from './history.js';
|
|
|
|
const deleteModal = document.getElementById('delete-modal');
|
|
const deleteFileList = document.getElementById('delete-file-list');
|
|
const deleteCancelBtn = document.getElementById('delete-cancel');
|
|
const deleteConfirmBtn = document.getElementById('delete-confirm');
|
|
const btnRename = document.getElementById('btn-rename');
|
|
|
|
let _pendingFiles = null;
|
|
|
|
deleteCancelBtn.addEventListener('click', () => {
|
|
deleteModal.style.display = 'none';
|
|
_pendingFiles = null;
|
|
});
|
|
|
|
deleteConfirmBtn.addEventListener('click', async () => {
|
|
if (!_pendingFiles) return;
|
|
const files = _pendingFiles;
|
|
_pendingFiles = null;
|
|
deleteModal.style.display = 'none';
|
|
await _doDelete(files);
|
|
});
|
|
|
|
export function deleteSelected() {
|
|
if (!state.selectedIdxs.size) return;
|
|
const filesToDelete = [...state.selectedIdxs].sort((a, b) => a - b)
|
|
.map(i => state.files[i]).filter(Boolean);
|
|
if (!filesToDelete.length) return;
|
|
deleteFileList.replaceChildren(...filesToDelete.map(f => {
|
|
const li = document.createElement('li');
|
|
li.textContent = f.name;
|
|
return li;
|
|
}));
|
|
_pendingFiles = filesToDelete;
|
|
deleteModal.style.display = 'flex';
|
|
}
|
|
|
|
export function init(gridEl) {
|
|
gridEl.addEventListener('click', (e) => {
|
|
const btn = e.target.closest('.card-delete');
|
|
if (!btn) return;
|
|
|
|
const card = btn.closest('.card');
|
|
if (!card) return;
|
|
const idx = parseInt(card.dataset.idx);
|
|
|
|
let filesToDelete;
|
|
if (state.selectedIdxs.size > 0 && state.selectedIdxs.has(idx)) {
|
|
filesToDelete = [...state.selectedIdxs].sort((a, b) => a - b)
|
|
.map(i => state.files[i]).filter(Boolean);
|
|
} else {
|
|
filesToDelete = [state.files[idx]].filter(Boolean);
|
|
}
|
|
|
|
if (!filesToDelete.length) return;
|
|
|
|
deleteFileList.replaceChildren(...filesToDelete.map(f => {
|
|
const li = document.createElement('li');
|
|
li.textContent = f.name;
|
|
return li;
|
|
}));
|
|
_pendingFiles = filesToDelete;
|
|
deleteModal.style.display = 'flex';
|
|
});
|
|
}
|
|
|
|
async function _doDelete(files) {
|
|
const result = await window.api.stageDeleteFiles(files.map(f => f.path));
|
|
|
|
if (result.errors.length) {
|
|
alert('일부 오류:\n' + result.errors.join('\n'));
|
|
}
|
|
|
|
const stagedSet = new Set(result.staged.map(s => s.originalPath));
|
|
for (let i = state.files.length - 1; i >= 0; i--) {
|
|
if (stagedSet.has(state.files[i].path)) state.files.splice(i, 1);
|
|
}
|
|
state.selectedIdxs.clear();
|
|
|
|
history.pushDelete([...state.files], result.staged);
|
|
|
|
const n = result.staged.length;
|
|
if (!state.files.length) {
|
|
showEmptyGrid();
|
|
btnRename.disabled = true;
|
|
setStatus('이미지 파일 없음', false);
|
|
} else {
|
|
renderGrid();
|
|
setStatus(`${n}개 파일 삭제됨`, true);
|
|
}
|
|
if (n > 0) showToast(`${n}개 파일 삭제됨`, '#8b1a1a', '#ffd0d0');
|
|
}
|