Ghost/ghost/admin/app/components/modal-members-label-form.js
Kevin Ansfield 909bd60db3 Fixed errors when enter key is pressed in modals
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
2021-06-18 10:12:46 +01:00

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'});
}
}
})
});