Show Files create validation inline
This commit is contained in:
parent
e333be9b9c
commit
06ffbf9a6e
|
|
@ -376,10 +376,14 @@
|
||||||
containerEl.appendChild(listContainer);
|
containerEl.appendChild(listContainer);
|
||||||
|
|
||||||
var createPanel = el('div', { className: 'files-panel', style: { display: 'none' } });
|
var createPanel = el('div', { className: 'files-panel', style: { display: 'none' } });
|
||||||
|
var createField = el('div', { className: 'files-field-stack' });
|
||||||
var createInput = el('input', { className: 'files-create-input', 'data-files-create-input': '' });
|
var createInput = el('input', { className: 'files-create-input', 'data-files-create-input': '' });
|
||||||
|
var createError = el('div', { className: 'files-panel-error', 'data-files-create-error': '', role: 'alert' });
|
||||||
var createConfirm = el('button', { className: 'files-toolbar-btn', 'data-files-create-confirm': '' }, ['Create']);
|
var createConfirm = el('button', { className: 'files-toolbar-btn', 'data-files-create-confirm': '' }, ['Create']);
|
||||||
var createCancel = el('button', { className: 'files-toolbar-btn' }, ['Cancel']);
|
var createCancel = el('button', { className: 'files-toolbar-btn' }, ['Cancel']);
|
||||||
createPanel.appendChild(createInput);
|
createField.appendChild(createInput);
|
||||||
|
createField.appendChild(createError);
|
||||||
|
createPanel.appendChild(createField);
|
||||||
createPanel.appendChild(createConfirm);
|
createPanel.appendChild(createConfirm);
|
||||||
createPanel.appendChild(createCancel);
|
createPanel.appendChild(createCancel);
|
||||||
containerEl.appendChild(createPanel);
|
containerEl.appendChild(createPanel);
|
||||||
|
|
@ -785,18 +789,37 @@
|
||||||
createMode = mode;
|
createMode = mode;
|
||||||
createInput.value = '';
|
createInput.value = '';
|
||||||
createInput.placeholder = mode === 'folder' ? 'Folder name' : (mode === 'markdown' ? 'Markdown file name' : 'Text file name');
|
createInput.placeholder = mode === 'folder' ? 'Folder name' : (mode === 'markdown' ? 'Markdown file name' : 'Text file name');
|
||||||
|
setCreateError('');
|
||||||
createPanel.style.display = 'flex';
|
createPanel.style.display = 'flex';
|
||||||
createInput.focus();
|
createInput.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setCreateError(message) {
|
||||||
|
createError.textContent = message || '';
|
||||||
|
createError.style.display = message ? 'block' : 'none';
|
||||||
|
createInput.setAttribute('aria-invalid', message ? 'true' : 'false');
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateCreateName(name) {
|
||||||
|
if (!name) return 'Name is required';
|
||||||
|
if (/[\\/:*?"<>|\x00-\x1f]/.test(name)) return 'Invalid characters in name';
|
||||||
|
if (name === '.' || name === '..' || name[0] === ' ' || name[name.length - 1] === ' ' || name[name.length - 1] === '.') return 'Invalid name';
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
function cancelCreate() {
|
function cancelCreate() {
|
||||||
createMode = '';
|
createMode = '';
|
||||||
|
setCreateError('');
|
||||||
createPanel.style.display = 'none';
|
createPanel.style.display = 'none';
|
||||||
}
|
}
|
||||||
|
|
||||||
function confirmCreate() {
|
function confirmCreate() {
|
||||||
var name = createInput.value.trim();
|
var name = createInput.value.trim();
|
||||||
if (!name) return;
|
var validationError = validateCreateName(name);
|
||||||
|
if (validationError) {
|
||||||
|
setCreateError(validationError);
|
||||||
|
return;
|
||||||
|
}
|
||||||
var mode = createMode;
|
var mode = createMode;
|
||||||
if (createMode === 'markdown' && !/\.(md|markdown)$/i.test(name)) name += '.md';
|
if (createMode === 'markdown' && !/\.(md|markdown)$/i.test(name)) name += '.md';
|
||||||
if (createMode === 'text' && !/\.[^/.]+$/.test(name)) name += '.txt';
|
if (createMode === 'text' && !/\.[^/.]+$/.test(name)) name += '.txt';
|
||||||
|
|
@ -812,8 +835,7 @@
|
||||||
api.workbench.openResource({ kind: 'vault-file', path: full, mode: 'edit', extension: ext ? '.' + ext : '', context: { sourcePluginId: 'verstak.files', sourceView: 'files' } }).catch(function () {});
|
api.workbench.openResource({ kind: 'vault-file', path: full, mode: 'edit', extension: ext ? '.' + ext : '', context: { sourcePluginId: 'verstak.files', sourceView: 'files' } }).catch(function () {});
|
||||||
}
|
}
|
||||||
}).catch(function (err) {
|
}).catch(function (err) {
|
||||||
createInput.value = '';
|
setCreateError('Error: ' + ((err && err.message) ? err.message : String(err)));
|
||||||
createInput.placeholder = 'Error: ' + ((err && err.message) ? err.message : String(err));
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -918,6 +940,7 @@
|
||||||
createCancel.addEventListener('click', cancelCreate);
|
createCancel.addEventListener('click', cancelCreate);
|
||||||
renameConfirm.addEventListener('click', confirmRename);
|
renameConfirm.addEventListener('click', confirmRename);
|
||||||
renameCancel.addEventListener('click', cancelRename);
|
renameCancel.addEventListener('click', cancelRename);
|
||||||
|
createInput.addEventListener('input', function () { setCreateError(''); });
|
||||||
createInput.addEventListener('keydown', function (event) { if (event.key === 'Enter') confirmCreate(); if (event.key === 'Escape') cancelCreate(); });
|
createInput.addEventListener('keydown', function (event) { if (event.key === 'Enter') confirmCreate(); if (event.key === 'Escape') cancelCreate(); });
|
||||||
renameInput.addEventListener('input', function () { setRenameError(''); });
|
renameInput.addEventListener('input', function () { setRenameError(''); });
|
||||||
renameInput.addEventListener('keydown', function (event) { if (event.key === 'Enter') confirmRename(); if (event.key === 'Escape') cancelRename(); });
|
renameInput.addEventListener('keydown', function (event) { if (event.key === 'Enter') confirmRename(); if (event.key === 'Escape') cancelRename(); });
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue