59 lines
1.8 KiB
JavaScript
59 lines
1.8 KiB
JavaScript
import BootstrapModal from './base.js';
|
|
import tpl_prompt from "./templates/prompt.js";
|
|
import { getOpenPromise } from '@converse/openpromise';
|
|
|
|
|
|
const Confirm = BootstrapModal.extend({
|
|
id: 'confirm-modal',
|
|
events: {
|
|
'submit .confirm': 'onConfimation'
|
|
},
|
|
|
|
initialize () {
|
|
this.confirmation = getOpenPromise();
|
|
BootstrapModal.prototype.initialize.apply(this, arguments);
|
|
this.listenTo(this.model, 'change', this.render)
|
|
this.el.addEventListener('closed.bs.modal', () => this.confirmation.reject(), false);
|
|
},
|
|
|
|
toHTML () {
|
|
return tpl_prompt(this.model.toJSON());
|
|
},
|
|
|
|
afterRender () {
|
|
if (!this.close_handler_registered) {
|
|
this.el.addEventListener('closed.bs.modal', () => {
|
|
if (!this.confirmation.isResolved) {
|
|
this.confirmation.reject()
|
|
}
|
|
}, false);
|
|
this.close_handler_registered = true;
|
|
}
|
|
},
|
|
|
|
onConfimation (ev) {
|
|
ev.preventDefault();
|
|
const form_data = new FormData(ev.target);
|
|
const fields = (this.model.get('fields') || [])
|
|
.map(field => {
|
|
const value = form_data.get(field.name).trim();
|
|
field.value = value;
|
|
if (field.challenge) {
|
|
field.challenge_failed = (value !== field.challenge);
|
|
}
|
|
return field;
|
|
});
|
|
|
|
if (fields.filter(c => c.challenge_failed).length) {
|
|
this.model.set('fields', fields);
|
|
// Setting an array doesn't trigger a change event
|
|
this.model.trigger('change');
|
|
return;
|
|
}
|
|
this.confirmation.resolve(fields);
|
|
this.modal.hide();
|
|
}
|
|
});
|
|
|
|
export default Confirm;
|