Label edit functionality added
Build LinkLog Development Image / development-image (push) Successful in 10s
Build LinkLog Development Image / development-image (push) Successful in 10s
This commit is contained in:
@@ -57,21 +57,85 @@ function renderLabels(labels) {
|
||||
adminLabelList.replaceChildren(...labels.map((label) => {
|
||||
const row = document.createElement('div');
|
||||
row.className = 'plugin-row';
|
||||
|
||||
const text = document.createElement('span');
|
||||
text.textContent = `${label.name}${label.creator ? ` (${label.creator})` : ' (default)'}`;
|
||||
const button = document.createElement('button');
|
||||
button.type = 'button';
|
||||
button.className = 'danger-button';
|
||||
button.textContent = 'Delete';
|
||||
button.addEventListener('click', async () => {
|
||||
|
||||
const actions = document.createElement('div');
|
||||
actions.style.display = 'flex';
|
||||
actions.style.gap = '8px';
|
||||
|
||||
const editButton = document.createElement('button');
|
||||
editButton.type = 'button';
|
||||
editButton.textContent = 'Edit';
|
||||
editButton.addEventListener('click', () => {
|
||||
showAdminInlineLabelEdit(row, label);
|
||||
});
|
||||
|
||||
const deleteButton = document.createElement('button');
|
||||
deleteButton.type = 'button';
|
||||
deleteButton.className = 'danger-button';
|
||||
deleteButton.textContent = 'Delete';
|
||||
deleteButton.addEventListener('click', async () => {
|
||||
if (!confirm(`Are you sure you want to delete "${label.name}"?`)) return;
|
||||
const response = await fetch(`/api/admin/labels/${label.id}`, {method: 'DELETE', headers: authHeaders()});
|
||||
if (response.ok) loadLabels();
|
||||
});
|
||||
row.append(text, button);
|
||||
|
||||
actions.append(editButton, deleteButton);
|
||||
row.append(text, actions);
|
||||
return row;
|
||||
}));
|
||||
}
|
||||
|
||||
function showAdminInlineLabelEdit(rowContainer, label) {
|
||||
rowContainer.replaceChildren();
|
||||
|
||||
const editForm = document.createElement('form');
|
||||
editForm.style.display = 'flex';
|
||||
editForm.style.gap = '8px';
|
||||
editForm.style.width = '100%';
|
||||
editForm.style.alignItems = 'center';
|
||||
|
||||
const input = document.createElement('input');
|
||||
input.type = 'text';
|
||||
input.value = label.name;
|
||||
input.required = true;
|
||||
input.style.flex = '1';
|
||||
|
||||
const saveButton = document.createElement('button');
|
||||
saveButton.type = 'submit';
|
||||
saveButton.textContent = 'Save';
|
||||
|
||||
const cancelButton = document.createElement('button');
|
||||
cancelButton.type = 'button';
|
||||
cancelButton.textContent = 'Cancel';
|
||||
cancelButton.addEventListener('click', () => {
|
||||
loadLabels();
|
||||
});
|
||||
|
||||
editForm.append(input, saveButton, cancelButton);
|
||||
|
||||
editForm.addEventListener('submit', async (e) => {
|
||||
e.preventDefault();
|
||||
const newName = input.value.trim();
|
||||
if (!newName) return;
|
||||
const response = await fetch(`/api/admin/labels/${label.id}`, {
|
||||
method: 'PUT',
|
||||
headers: authHeaders(true),
|
||||
body: JSON.stringify({ name: newName }),
|
||||
});
|
||||
if (response.ok) {
|
||||
loadLabels();
|
||||
} else {
|
||||
alert(await responseError(response, 'Could not update label'));
|
||||
}
|
||||
});
|
||||
|
||||
rowContainer.appendChild(editForm);
|
||||
input.focus();
|
||||
}
|
||||
|
||||
async function loadLabels() {
|
||||
const response = await fetch('/api/admin/labels', {headers: authHeaders()});
|
||||
if (!response.ok) throw new Error('Could not load labels');
|
||||
|
||||
Reference in New Issue
Block a user