...
This commit is contained in:
@@ -35,43 +35,37 @@ class FileTreeActions {
|
||||
|
||||
'new-file': async function(path, isDir) {
|
||||
if (!isDir) return;
|
||||
|
||||
await this.showInputDialog('Enter filename:', 'new-file.md', async (filename) => {
|
||||
if (filename) {
|
||||
const fullPath = `${path}/${filename}`.replace(/\/+/g, '/');
|
||||
await this.webdavClient.put(fullPath, '# New File\n\n');
|
||||
await this.fileTree.load();
|
||||
showNotification(`Created ${filename}`, 'success');
|
||||
await this.editor.loadFile(fullPath);
|
||||
}
|
||||
});
|
||||
const filename = await this.showInputDialog('Enter filename:', 'new-file.md');
|
||||
if (filename) {
|
||||
const fullPath = `${path}/${filename}`.replace(/\/+/g, '/');
|
||||
await this.webdavClient.put(fullPath, '# New File\n\n');
|
||||
await this.fileTree.load();
|
||||
showNotification(`Created ${filename}`, 'success');
|
||||
await this.editor.loadFile(fullPath);
|
||||
}
|
||||
},
|
||||
|
||||
'new-folder': async function(path, isDir) {
|
||||
if (!isDir) return;
|
||||
|
||||
await this.showInputDialog('Enter folder name:', 'new-folder', async (foldername) => {
|
||||
if (foldername) {
|
||||
const fullPath = `${path}/${foldername}`.replace(/\/+/g, '/');
|
||||
await this.webdavClient.mkcol(fullPath);
|
||||
await this.fileTree.load();
|
||||
showNotification(`Created folder ${foldername}`, 'success');
|
||||
}
|
||||
});
|
||||
const foldername = await this.showInputDialog('Enter folder name:', 'new-folder');
|
||||
if (foldername) {
|
||||
const fullPath = `${path}/${foldername}`.replace(/\/+/g, '/');
|
||||
await this.webdavClient.mkcol(fullPath);
|
||||
await this.fileTree.load();
|
||||
showNotification(`Created folder ${foldername}`, 'success');
|
||||
}
|
||||
},
|
||||
|
||||
rename: async function(path, isDir) {
|
||||
const oldName = path.split('/').pop();
|
||||
await this.showInputDialog('Rename to:', oldName, async (newName) => {
|
||||
if (newName && newName !== oldName) {
|
||||
const parentPath = path.substring(0, path.lastIndexOf('/'));
|
||||
const newName = await this.showInputDialog('Rename to:', oldName);
|
||||
if (newName && newName !== oldName) {
|
||||
const parentPath = path.substring(0, path.lastIndexOf('/'));
|
||||
const newPath = parentPath ? `${parentPath}/${newName}` : newName;
|
||||
|
||||
await this.webdavClient.move(path, newPath);
|
||||
await this.fileTree.load();
|
||||
showNotification('Renamed', 'success');
|
||||
}
|
||||
});
|
||||
await this.webdavClient.move(path, newPath);
|
||||
await this.fileTree.load();
|
||||
showNotification('Renamed', 'success');
|
||||
}
|
||||
},
|
||||
|
||||
copy: async function(path, isDir) {
|
||||
@@ -146,49 +140,36 @@ class FileTreeActions {
|
||||
};
|
||||
|
||||
// Modern dialog implementations
|
||||
async showInputDialog(title, placeholder = '', onConfirm) {
|
||||
async showInputDialog(title, placeholder = '') {
|
||||
return new Promise((resolve) => {
|
||||
const dialog = this.createInputDialog(title, placeholder);
|
||||
const input = dialog.querySelector('input');
|
||||
const confirmBtn = dialog.querySelector('.btn-primary');
|
||||
const cancelBtn = dialog.querySelector('.btn-secondary');
|
||||
const closeBtn = dialog.querySelector('.btn-close');
|
||||
|
||||
const cleanup = () => {
|
||||
dialog.remove();
|
||||
const backdrop = document.querySelector('.modal-backdrop');
|
||||
if (backdrop) {
|
||||
backdrop.remove();
|
||||
}
|
||||
if (backdrop) backdrop.remove();
|
||||
document.body.classList.remove('modal-open');
|
||||
resolve();
|
||||
};
|
||||
|
||||
confirmBtn.onclick = async () => {
|
||||
await onConfirm(input.value.trim());
|
||||
confirmBtn.onclick = () => {
|
||||
resolve(input.value.trim());
|
||||
cleanup();
|
||||
};
|
||||
|
||||
cancelBtn.onclick = () => {
|
||||
dialog.addEventListener('hidden.bs.modal', () => {
|
||||
resolve(null);
|
||||
cleanup();
|
||||
};
|
||||
|
||||
closeBtn.onclick = () => {
|
||||
cleanup();
|
||||
};
|
||||
});
|
||||
|
||||
input.onkeypress = (e) => {
|
||||
if (e.key === 'Enter') {
|
||||
e.preventDefault();
|
||||
confirmBtn.click();
|
||||
}
|
||||
if (e.key === 'Escape') {
|
||||
cancelBtn.click();
|
||||
}
|
||||
if (e.key === 'Enter') confirmBtn.click();
|
||||
};
|
||||
|
||||
document.body.appendChild(dialog);
|
||||
document.body.classList.add('modal-open');
|
||||
const modal = new bootstrap.Modal(dialog);
|
||||
modal.show();
|
||||
input.focus();
|
||||
input.select();
|
||||
});
|
||||
@@ -198,32 +179,27 @@ class FileTreeActions {
|
||||
return new Promise((resolve) => {
|
||||
const dialog = this.createConfirmDialog(title, message);
|
||||
const confirmBtn = dialog.querySelector('.btn-danger');
|
||||
const cancelBtn = dialog.querySelector('.btn-secondary');
|
||||
const closeBtn = dialog.querySelector('.btn-close');
|
||||
|
||||
|
||||
const cleanup = () => {
|
||||
dialog.remove();
|
||||
document.querySelector('.modal-backdrop').remove();
|
||||
const backdrop = document.querySelector('.modal-backdrop');
|
||||
if (backdrop) backdrop.remove();
|
||||
document.body.classList.remove('modal-open');
|
||||
};
|
||||
|
||||
|
||||
confirmBtn.onclick = () => {
|
||||
resolve(true);
|
||||
cleanup();
|
||||
};
|
||||
|
||||
cancelBtn.onclick = () => {
|
||||
resolve(false);
|
||||
cleanup();
|
||||
};
|
||||
|
||||
closeBtn.onclick = () => {
|
||||
dialog.addEventListener('hidden.bs.modal', () => {
|
||||
resolve(false);
|
||||
cleanup();
|
||||
};
|
||||
|
||||
});
|
||||
|
||||
document.body.appendChild(dialog);
|
||||
document.body.classList.add('modal-open');
|
||||
const modal = new bootstrap.Modal(dialog);
|
||||
modal.show();
|
||||
confirmBtn.focus();
|
||||
});
|
||||
}
|
||||
@@ -242,13 +218,13 @@ class FileTreeActions {
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">${title}</h5>
|
||||
<button type="button" class="btn-close"></button>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<input type="text" class="form-control" value="${placeholder}" autofocus>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary">Cancel</button>
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
|
||||
<button type="button" class="btn btn-primary">OK</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -273,14 +249,14 @@ class FileTreeActions {
|
||||
<div class="modal-content">
|
||||
<div class="modal-header border-danger">
|
||||
<h5 class="modal-title text-danger">${title}</h5>
|
||||
<button type="button" class="btn-close"></button>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p>${message}</p>
|
||||
<p class="text-danger small">This action cannot be undone.</p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary">Cancel</button>
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
|
||||
<button type="button" class="btn btn-danger">Delete</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user