mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-21 18:01:36 +03:00
909bd60db3
no issue - enter key when a modal is displayed will always trigger the `confirm` action, if it's not provided then the base modal will throw a `You must override the "confirm" action ...` error
89 lines
2.7 KiB
JavaScript
89 lines
2.7 KiB
JavaScript
import ModalComponent from 'ghost-admin/components/modal-base';
|
|
import {computed} from '@ember/object';
|
|
import {resetQueryParams} from 'ghost-admin/helpers/reset-query-params';
|
|
import {inject as service} from '@ember/service';
|
|
import {task} from 'ember-concurrency';
|
|
|
|
export default ModalComponent.extend({
|
|
router: service(),
|
|
notifications: service(),
|
|
model: null,
|
|
showDeleteLabelModal: false,
|
|
|
|
confirm() {},
|
|
label: computed.and('model', 'model.label'),
|
|
|
|
willDestroyElement() {
|
|
this._super(...arguments);
|
|
this.label.errors.clear();
|
|
this.label.rollbackAttributes();
|
|
},
|
|
|
|
actions: {
|
|
toggleDeleteLabelModal() {
|
|
this.label.rollbackAttributes();
|
|
this.set('showDeleteLabelModal', true);
|
|
},
|
|
|
|
validate(property) {
|
|
return this.label.validate({property});
|
|
},
|
|
|
|
confirm() {
|
|
return this.saveTask.perform();
|
|
}
|
|
},
|
|
|
|
saveTask: task(function* () {
|
|
let label = this.model && this.model.label;
|
|
let availableLabels = (this.model && this.model.labels) || [];
|
|
if (!label) {
|
|
return false;
|
|
}
|
|
try {
|
|
yield label.validate();
|
|
|
|
let duplicateLabel = availableLabels.find((existingLabel) => {
|
|
return existingLabel.name.trim().toLowerCase() === label.name.trim().toLowerCase()
|
|
&& existingLabel.slug !== label.slug;
|
|
});
|
|
|
|
if (duplicateLabel) {
|
|
label.errors.add('name', 'A label with the same name already exists');
|
|
label.hasValidated.pushObject('name');
|
|
// label.invalidate();
|
|
|
|
return false;
|
|
}
|
|
|
|
let savedLabel = yield label.save();
|
|
this.notifications.showNotification('Label saved'.htmlSafe());
|
|
this.send('closeModal');
|
|
return savedLabel;
|
|
} catch (error) {
|
|
if (error) {
|
|
this.notifications.showAPIError(error, {key: 'label.save'});
|
|
}
|
|
}
|
|
}),
|
|
|
|
deleteLabel: task(function * () {
|
|
let label = this.model && this.model.label;
|
|
if (!label) {
|
|
return false;
|
|
}
|
|
try {
|
|
yield label.destroyRecord();
|
|
let routeName = this.router.currentRouteName;
|
|
this.notifications.showNotification('Label deleted'.htmlSafe());
|
|
this.send('closeModal');
|
|
this.router.transitionTo(routeName, {queryParams: resetQueryParams(routeName)});
|
|
} catch (error) {
|
|
if (error) {
|
|
return this.notifications.showAPIError(error, {key: 'label.delete'});
|
|
}
|
|
}
|
|
})
|
|
|
|
});
|