mirror of
https://github.com/rr-/szurubooru.git
synced 2025-07-17 08:26:24 +00:00
client/tags: add setting default tag category
This commit is contained in:
@ -42,7 +42,11 @@ class TagsController {
|
||||
(ctx, next) => { this._listTagsRoute(ctx, next); });
|
||||
}
|
||||
|
||||
_saveTagCategories(addedCategories, changedCategories, removedCategories) {
|
||||
_saveTagCategories(
|
||||
addedCategories,
|
||||
changedCategories,
|
||||
removedCategories,
|
||||
defaultCategory) {
|
||||
let promises = [];
|
||||
for (let category of addedCategories) {
|
||||
promises.push(api.post('/tag-categories/', category));
|
||||
@ -54,14 +58,25 @@ class TagsController {
|
||||
for (let name of removedCategories) {
|
||||
promises.push(api.delete('/tag-category/' + name));
|
||||
}
|
||||
Promise.all(promises).then(
|
||||
() => {
|
||||
events.notify(events.TagsChange);
|
||||
events.notify(events.Success, 'Changes saved.');
|
||||
},
|
||||
response => {
|
||||
events.notify(events.Error, response.description);
|
||||
});
|
||||
Promise.all(promises)
|
||||
.then(
|
||||
() => {
|
||||
if (!defaultCategory) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
return api.put(
|
||||
'/tag-category/' + defaultCategory + '/default');
|
||||
}, response => {
|
||||
return Promise.reject(response);
|
||||
})
|
||||
.then(
|
||||
() => {
|
||||
events.notify(events.TagsChange);
|
||||
events.notify(events.Success, 'Changes saved.');
|
||||
},
|
||||
response => {
|
||||
events.notify(events.Error, response.description);
|
||||
});
|
||||
}
|
||||
|
||||
_loadTagRoute(ctx, next) {
|
||||
@ -165,6 +180,7 @@ class TagsController {
|
||||
canEditColor: api.hasPrivilege('tagCategories:edit:color'),
|
||||
canDelete: api.hasPrivilege('tagCategories:delete'),
|
||||
canCreate: api.hasPrivilege('tagCategories:create'),
|
||||
canSetDefault: api.hasPrivilege('tagCategories:setDefault'),
|
||||
saveChanges: (...args) => {
|
||||
return this._saveTagCategories(...args);
|
||||
},
|
||||
|
@ -8,7 +8,41 @@ class TagListHeaderView {
|
||||
this._template = views.getTemplate('tag-categories');
|
||||
}
|
||||
|
||||
_saveButtonClickHandler(e, ctx, target) {
|
||||
render(ctx) {
|
||||
const target = document.getElementById('content-holder');
|
||||
const source = this._template(ctx);
|
||||
|
||||
const form = source.querySelector('form');
|
||||
const newRowTemplate = source.querySelector('.add-template');
|
||||
const tableBody = source.querySelector('tbody');
|
||||
const addLink = source.querySelector('a.add');
|
||||
const saveButton = source.querySelector('button.save');
|
||||
|
||||
newRowTemplate.parentNode.removeChild(newRowTemplate);
|
||||
views.decorateValidator(form);
|
||||
|
||||
for (let row of tableBody.querySelectorAll('tr')) {
|
||||
this._addRowHandlers(row);
|
||||
}
|
||||
|
||||
if (addLink) {
|
||||
addLink.addEventListener('click', e => {
|
||||
e.preventDefault();
|
||||
let newRow = newRowTemplate.cloneNode(true);
|
||||
tableBody.appendChild(newRow);
|
||||
this._addRowHandlers(row);
|
||||
});
|
||||
}
|
||||
|
||||
form.addEventListener('submit', e => {
|
||||
this._evtSaveButtonClick(e, ctx, target);
|
||||
});
|
||||
|
||||
views.listenToMessages(source);
|
||||
views.showView(target, source);
|
||||
}
|
||||
|
||||
_evtSaveButtonClick(e, ctx, target) {
|
||||
e.preventDefault();
|
||||
|
||||
views.clearMessages(target);
|
||||
@ -20,6 +54,7 @@ class TagListHeaderView {
|
||||
existingCategories[category.name] = category;
|
||||
}
|
||||
|
||||
let defaultCategory = null;
|
||||
let addedCategories = [];
|
||||
let removedCategories = [];
|
||||
let changedCategories = [];
|
||||
@ -31,6 +66,9 @@ class TagListHeaderView {
|
||||
name: row.querySelector('.name input').value,
|
||||
color: row.querySelector('.color input').value,
|
||||
};
|
||||
if (row.classList.contains('default')) {
|
||||
defaultCategory = category.name;
|
||||
}
|
||||
if (!name) {
|
||||
if (category.name) {
|
||||
addedCategories.push(category);
|
||||
@ -50,11 +88,14 @@ class TagListHeaderView {
|
||||
}
|
||||
}
|
||||
ctx.saveChanges(
|
||||
addedCategories, changedCategories, removedCategories);
|
||||
addedCategories,
|
||||
changedCategories,
|
||||
removedCategories,
|
||||
defaultCategory);
|
||||
});
|
||||
}
|
||||
|
||||
_removeButtonClickHandler(e, row, link) {
|
||||
_evtRemoveButtonClick(e, row, link) {
|
||||
e.preventDefault();
|
||||
if (link.classList.contains('inactive')) {
|
||||
return;
|
||||
@ -62,47 +103,27 @@ class TagListHeaderView {
|
||||
row.parentNode.removeChild(row);
|
||||
}
|
||||
|
||||
_addRemoveButtonClickHandler(row) {
|
||||
const link = row.querySelector('a.remove');
|
||||
if (!link) {
|
||||
return;
|
||||
_evtSetDefaultButtonClick(e, row) {
|
||||
e.preventDefault();
|
||||
const oldRowNode = row.parentNode.querySelector('tr.default');
|
||||
if (oldRowNode) {
|
||||
oldRowNode.classList.remove('default');
|
||||
}
|
||||
link.addEventListener(
|
||||
'click', e => this._removeButtonClickHandler(e, row, link));
|
||||
row.classList.add('default');
|
||||
}
|
||||
|
||||
render(ctx) {
|
||||
const target = document.getElementById('content-holder');
|
||||
const source = this._template(ctx);
|
||||
|
||||
const form = source.querySelector('form');
|
||||
const newRowTemplate = source.querySelector('.add-template');
|
||||
const tableBody = source.querySelector('tbody');
|
||||
const addLink = source.querySelector('a.add');
|
||||
const saveButton = source.querySelector('button.save');
|
||||
|
||||
newRowTemplate.parentNode.removeChild(newRowTemplate);
|
||||
views.decorateValidator(form);
|
||||
|
||||
for (let row of tableBody.querySelectorAll('tr')) {
|
||||
this._addRemoveButtonClickHandler(row);
|
||||
_addRowHandlers(row) {
|
||||
const removeLink = row.querySelector('.remove a');
|
||||
if (removeLink) {
|
||||
removeLink.addEventListener(
|
||||
'click', e => this._evtRemoveButtonClick(e, row, removeLink));
|
||||
}
|
||||
|
||||
if (addLink) {
|
||||
addLink.addEventListener('click', e => {
|
||||
e.preventDefault();
|
||||
let newRow = newRowTemplate.cloneNode(true);
|
||||
tableBody.appendChild(newRow);
|
||||
this._addRemoveButtonClickHandler(newRow);
|
||||
});
|
||||
const defaultLink = row.querySelector('.set-default a');
|
||||
if (defaultLink) {
|
||||
defaultLink.addEventListener(
|
||||
'click', e => this._evtSetDefaultButtonClick(e, row));
|
||||
}
|
||||
|
||||
form.addEventListener('submit', e => {
|
||||
this._saveButtonClickHandler(e, ctx, target);
|
||||
});
|
||||
|
||||
views.listenToMessages(source);
|
||||
views.showView(target, source);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user