diff options
| author | historia <[not public]> | 2026-07-05 18:52:51 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-07-05 18:52:51 -0400 |
| commit | 6bd5365cc22f84c047c1585e3f54571af46f53e5 (patch) | |
| tree | 72df0934c72baa1e31817d7db999832c6efb115f /internal/admin/static/admin.js | |
| parent | 9b54188970c51070d86f4c87e909ea7836c86f07 (diff) | |
| download | thehouseoficarus-6bd5365cc22f84c047c1585e3f54571af46f53e5.tar.gz | |
feat: renameable directories and files in admin gui
Diffstat (limited to 'internal/admin/static/admin.js')
| -rw-r--r-- | internal/admin/static/admin.js | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/internal/admin/static/admin.js b/internal/admin/static/admin.js index f8e9d13..a6bb8b2 100644 --- a/internal/admin/static/admin.js +++ b/internal/admin/static/admin.js @@ -52,4 +52,69 @@ window.saveForm = function(url, data, msg) { }).catch(function(e) { notify('Save failed: '+e.message, 'error'); }); }; +window.entityRename = function(type, oldID, newID) { + return API.post('/api/' + type + '/rename', {id: oldID, new_id: newID}).then(function(r) { + notify('Renamed ' + oldID + ' to ' + newID, 'success'); + updateUndoBar(); + return r; + }); +}; + +window.renderRenameableHeader = function(label, id) { + var h = '<div class="rename-header">'; + h += '<h2 class="rename-header-text">' + esc(label) + ': ' + esc(id) + '</h2>'; + h += '<span class="rename-pencil" onclick="startHeaderRename(this,\'' + escAttr(id) + '\')" title="Rename">\u270E</span>'; + h += '<div class="rename-edit-row" style="display:none"></div>'; + h += '</div>'; + return h; +}; + +window.handleHeaderRename = function(oldID, newID) { + var type = window.editorType || ''; + if (!type) return; + entityRename(type, oldID, newID).then(function() { + window.currentID = newID; + var typeSingular = type.slice(0, -1) + 'ID'; + if (window[typeSingular] !== undefined) window[typeSingular] = newID; + if (window.loadList) window.loadList(); + if (window.loadItem) window.loadItem(newID); + }).catch(function(e) { notify('Rename failed: ' + e.message, 'error'); }); +}; + +window.startHeaderRename = function(pencilEl, oldID) { + var header = pencilEl.parentElement; + var textSpan = header.querySelector('.rename-header-text'); + var editRow = header.querySelector('.rename-edit-row'); + + textSpan.style.display = 'none'; + pencilEl.style.display = 'none'; + editRow.style.display = 'flex'; + editRow.innerHTML = '<input class="rename-input" value="' + escAttr(oldID) + '" maxlength="128">' + + '<button class="btn btn-sm rename-btn-confirm" title="Confirm">\u2713</button>' + + '<button class="btn btn-sm rename-btn-cancel" title="Cancel">\u2717</button>'; + + var input = editRow.querySelector('.rename-input'); + var confirmBtn = editRow.querySelector('.rename-btn-confirm'); + var cancelBtn = editRow.querySelector('.rename-btn-cancel'); + + input.focus(); + input.select(); + + function cancel() { + textSpan.style.display = ''; + pencilEl.style.display = ''; + editRow.style.display = 'none'; + } + + function confirm() { + var newID = input.value.trim(); + if (!newID || newID === oldID) { cancel(); return; } + if (window.handleHeaderRename) handleHeaderRename(oldID, newID); + } + + cancelBtn.onclick = cancel; + input.onkeydown = function(e) { if (e.key === 'Enter') confirm(); else if (e.key === 'Escape') cancel(); }; + confirmBtn.onclick = confirm; +}; + document.addEventListener('DOMContentLoaded', function() { updateUndoBar(); }); |
