--- /dev/null
+define(function(require) {
+
+ /* globals gettext */
+ 'use strict';
+
+ var _ = require('libs/underscore'),
+ Backbone = require('libs/backbone'),
+ dialogTemplate = require('libs/text!./dialog.html'),
+ fieldTemplates = {};
+ fieldTemplates.checkbox = require('libs/text!./templates/checkbox.html');
+ fieldTemplates.select = require('libs/text!./templates/select.html');
+ fieldTemplates.textarea = require('libs/text!./templates/textarea.html');
+ fieldTemplates.input = require('libs/text!./templates/input.html');
+
+
+
+ var DialogView = Backbone.View.extend({
+ template: _.template(dialogTemplate),
+ events: {
+ 'click .execute-btn': 'onExecute',
+ 'click .cancel-btn': 'onCancel',
+ 'click .close': 'close'
+ },
+ initialize: function() {
+ _.bindAll(this);
+ this.actionsDisabled = false;
+ },
+ show: function() {
+ this.setElement(this.template(_.extend({
+ executeButtonText: gettext('Submit'),
+ cancelButtonText: gettext('Cancel')
+ }, this.options)));
+
+ var body = this.$('.modal-body');
+ (this.options.fields || []).forEach(function(field) {
+ var template = fieldTemplates[field.type];
+ if(!template) {
+ throw new Error('Field type {type} not recognized.'.replace('{type}', field.type));
+ }
+ body.append(
+ _.template(template)(_.extend({description: ''}, field))
+ );
+ });
+
+ if(this.options.text) {
+ body.append('<p>' + this.options.text + '</p>');
+ }
+
+ this.$el.modal({backdrop: 'static'});
+ this.$el.modal('show');
+ this.$('textarea').focus();
+ },
+ onExecute: function(e) {
+ e.preventDefault();
+ var view = this,
+ formData = {};
+
+ (this.options.fields || []).forEach(function(field) {
+ var widget = view.$('[name=' + field.name +']');
+ formData[field.name] = widget.val();
+ });
+
+ this.trigger('execute', {
+ formData: formData,
+ success: function() { view.actionsDisabled = false; view.close(); },
+ error: function() { view.actionsDisabled = false; view.close(); },
+ });
+ },
+ onCancel: function() {
+ this.trigger('cancel');
+ this.close();
+ },
+ close: function(e) {
+ if(e) {
+ e.preventDefault();
+ }
+ if(!this.actionsDisabled) {
+ this.$el.modal('hide');
+ this.$el.remove();
+ }
+ this.trigger('close');
+ },
+ toggleButtons: function(toggle) {
+ this.$('.btn, button').toggleClass('disabled', !toggle);
+ this.$('textarea').attr('disabled', !toggle);
+ this.actionsDisabled = !toggle;
+ }
+ });
+
+ return {
+ create: function(config) {
+ return new DialogView(config);
+ }
+ };
+
+});
\ No newline at end of file