parent
7f5136120d
commit
c090b3efa1
@ -1,236 +0,0 @@
|
||||
'use strict';
|
||||
define(
|
||||
[
|
||||
'Commands/CommandController',
|
||||
'Commands/CommandCollection',
|
||||
'Shared/Messenger',
|
||||
'jQuery/jquery.spin'
|
||||
], function (CommandController, CommandCollection, Messenger) {
|
||||
|
||||
var actioneer = Marionette.AppRouter.extend({
|
||||
|
||||
initialize: function () {
|
||||
this.trackedCommands =
|
||||
[
|
||||
];
|
||||
CommandCollection.fetch();
|
||||
this.listenTo(CommandCollection, 'sync', this._handleCommands);
|
||||
},
|
||||
|
||||
|
||||
bindToCommand: function (options) {
|
||||
|
||||
var self = this;
|
||||
options.idleIcon = this._getIconClass(options.element);
|
||||
|
||||
var existingCommand = CommandCollection.findCommand(options.command);
|
||||
|
||||
if (existingCommand) {
|
||||
this._bindToCommandModel.call(this, existingCommand, options);
|
||||
}
|
||||
|
||||
this.listenTo(CommandCollection, 'add sync', function (model) {
|
||||
if (model.isSameCommand(options.command)) {
|
||||
self._bindToCommandModel.call(self, model, options);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_bindToCommandModel: function bindToCommand(model, options) {
|
||||
|
||||
if (!model.isActive()) {
|
||||
options.element.stopSpin();
|
||||
return;
|
||||
}
|
||||
|
||||
this.listenTo(model, 'change:state', function (model) {
|
||||
if (!model.isActive()) {
|
||||
options.element.stopSpin();
|
||||
}
|
||||
});
|
||||
|
||||
options.element.startSpin();
|
||||
},
|
||||
|
||||
ExecuteCommand: function (options) {
|
||||
options.iconClass = this._getIconClass(options.element);
|
||||
|
||||
if (options.button) {
|
||||
options.button.addClass('disable');
|
||||
}
|
||||
|
||||
this._setSpinnerOnElement(options);
|
||||
|
||||
var promise = CommandController.Execute(options.command, options.properties);
|
||||
this._showStartMessage(options, promise);
|
||||
},
|
||||
|
||||
SaveModel: function (options) {
|
||||
options.iconClass = this._getIconClass(options.element);
|
||||
|
||||
this._showStartMessage(options);
|
||||
this._setSpinnerOnElement(options);
|
||||
|
||||
var model = options.model ? options.model : options.context.model;
|
||||
|
||||
var promise = model.save();
|
||||
this._handlePromise(promise, options);
|
||||
},
|
||||
|
||||
_handlePromise: function (promise, options) {
|
||||
var self = this;
|
||||
|
||||
promise.done(function () {
|
||||
self._onSuccess(options);
|
||||
});
|
||||
|
||||
promise.fail(function (ajaxOptions) {
|
||||
if (ajaxOptions.readyState === 0 || ajaxOptions.status === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
self._onError(options);
|
||||
});
|
||||
|
||||
promise.always(function () {
|
||||
self._onComplete(options);
|
||||
});
|
||||
},
|
||||
|
||||
_handleCommands: function () {
|
||||
var self = this;
|
||||
|
||||
_.each(this.trackedCommands, function (trackedCommand) {
|
||||
if (trackedCommand.completed === true) {
|
||||
return;
|
||||
}
|
||||
|
||||
var options = trackedCommand.options;
|
||||
var command = CommandCollection.find({ 'id': trackedCommand.id });
|
||||
|
||||
if (!command) {
|
||||
trackedCommand.completed = true;
|
||||
|
||||
self._onError(options, trackedCommand.id);
|
||||
self._onComplete(options);
|
||||
return;
|
||||
}
|
||||
|
||||
if (command.get('state') === 'completed') {
|
||||
trackedCommand.completed = true;
|
||||
|
||||
self._onSuccess(options, command.get('id'));
|
||||
self._onComplete(options);
|
||||
return;
|
||||
}
|
||||
|
||||
if (command.get('state') === 'failed') {
|
||||
trackedCommand.completed = true;
|
||||
|
||||
self._onError(options, command.get('id'));
|
||||
self._onComplete(options);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_getIconClass: function (element) {
|
||||
if (!element) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return element.find('i').attr('class').match(/(?:^|\s)icon\-.+?(?:$|\s)/)[0];
|
||||
},
|
||||
|
||||
_setSpinnerOnElement: function (options) {
|
||||
if (!options.element) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (options.leaveIcon) {
|
||||
options.element.addClass('icon-spin');
|
||||
}
|
||||
|
||||
else {
|
||||
options.element.removeClass(options.iconClass);
|
||||
options.element.addClass('icon-nd-spinner');
|
||||
}
|
||||
},
|
||||
|
||||
_onSuccess: function (options, id) {
|
||||
if (options.successMessage) {
|
||||
Messenger.show({
|
||||
id : id,
|
||||
message: options.successMessage,
|
||||
type : 'success'
|
||||
});
|
||||
}
|
||||
|
||||
if (options.onSuccess) {
|
||||
options.onSuccess.call(options.context);
|
||||
}
|
||||
},
|
||||
|
||||
_onError: function (options, id) {
|
||||
if (options.errorMessage) {
|
||||
Messenger.show({
|
||||
id : id,
|
||||
message: options.errorMessage,
|
||||
type : 'error'
|
||||
});
|
||||
}
|
||||
|
||||
if (options.onError) {
|
||||
options.onError.call(options.context);
|
||||
}
|
||||
},
|
||||
|
||||
_onComplete: function (options) {
|
||||
if (options.button) {
|
||||
options.button.removeClass('disable');
|
||||
}
|
||||
|
||||
if (options.element) {
|
||||
if (options.leaveIcon) {
|
||||
options.element.removeClass('icon-spin');
|
||||
}
|
||||
|
||||
else {
|
||||
options.element.addClass(options.iconClass);
|
||||
options.element.removeClass('icon-nd-spinner');
|
||||
options.element.removeClass('icon-spin');
|
||||
}
|
||||
}
|
||||
|
||||
if (options.always) {
|
||||
options.always.call(options.context);
|
||||
}
|
||||
},
|
||||
|
||||
_showStartMessage: function (options, promise) {
|
||||
var self = this;
|
||||
|
||||
if (!promise) {
|
||||
if (options.startMessage) {
|
||||
Messenger.show({
|
||||
message: options.startMessage
|
||||
});
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
promise.done(function (data) {
|
||||
self.trackedCommands.push({ id: data.id, options: options });
|
||||
|
||||
if (options.startMessage) {
|
||||
Messenger.show({
|
||||
id : data.id,
|
||||
message: options.startMessage
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return new actioneer();
|
||||
});
|
Loading…
Reference in new issue