Files
photo-renamer/src/renderer/delete.js
T

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');
}