diff --git a/UI/Commands/CommandController.js b/UI/Commands/CommandController.js
new file mode 100644
index 000000000..0bd4763d3
--- /dev/null
+++ b/UI/Commands/CommandController.js
@@ -0,0 +1,11 @@
+"use strict";
+define(['app'], function () {
+
+ NzbDrone.Commands.Execute = function (name) {
+ return $.ajax({
+ type: 'POST',
+ url : NzbDrone.Constants.ApiRoot + '/command',
+ data: JSON.stringify({command: name})
+ });
+ };
+});
\ No newline at end of file
diff --git a/UI/Series/Index/SeriesIndexLayout.js b/UI/Series/Index/SeriesIndexLayout.js
index 4519e93e1..7f0c19700 100644
--- a/UI/Series/Index/SeriesIndexLayout.js
+++ b/UI/Series/Index/SeriesIndexLayout.js
@@ -147,14 +147,25 @@ define([
route: 'series/add'
},
{
- title : 'RSS Sync',
- icon : 'icon-rss',
- command: 'rsssync'
+ title : 'RSS Sync',
+ icon : 'icon-rss',
+ command : 'rsssync',
+ successMessage: 'RSS Sync Completed',
+ errorMessage : 'RSS Sync Failed!'
},
{
- title : 'Update Library',
- icon : 'icon-refresh',
- command: 'updatelibrary'
+ title : 'Update Library',
+ icon : 'icon-refresh',
+ command : 'updatelibrary',
+ successMessage: 'Library was updated!',
+ errorMessage : 'Library update failed!'
+ },
+ {
+ title : 'Test Action',
+ icon : 'icon-asterisk',
+ command : 'test',
+ successMessage: 'Test Completed',
+ errorMessage : 'Test Failed!'
}
]
};
diff --git a/UI/Shared/Messenger.js b/UI/Shared/Messenger.js
new file mode 100644
index 000000000..d53399f1e
--- /dev/null
+++ b/UI/Shared/Messenger.js
@@ -0,0 +1,27 @@
+"use strict";
+define(['app'], function () {
+ NzbDrone.Shared.Messenger = {
+ show: function (options) {
+
+ if (!options.type) {
+ options.type = 'info';
+ }
+
+ if (!options.hideAfter) {
+ switch (options.type) {
+ case 'info':
+ options.hideAfter = 5;
+ break;
+ case 'error':
+ options.hideAfter = 0;
+ }
+ }
+
+ return window.Messenger().post({
+ message : options.message,
+ type : options.type,
+ showCloseButton: true,
+ hideAfter : options.hideAfter
+ });
+ }};
+});
diff --git a/UI/Shared/Toolbar/Button/ButtonView.js b/UI/Shared/Toolbar/Button/ButtonView.js
index 0683d4709..a3fc6095a 100644
--- a/UI/Shared/Toolbar/Button/ButtonView.js
+++ b/UI/Shared/Toolbar/Button/ButtonView.js
@@ -1,5 +1,5 @@
"use strict";
-define(['app', 'Config'], function () {
+define(['app', 'Config', 'Commands/CommandController', 'Shared/Messenger'], function () {
NzbDrone.Shared.Toolbar.ButtonView = Backbone.Marionette.ItemView.extend({
template : 'Shared/Toolbar/ButtonTemplate',
@@ -9,9 +9,14 @@ define(['app', 'Config'], function () {
'click': 'onClick'
},
+ ui: {
+ icon: '.x-icon'
+ },
+
initialize: function () {
this.storageKey = this.model.get('menuKey') + ':' + this.model.get('key');
+ this.idle = true;
},
onRender: function () {
@@ -22,16 +27,45 @@ define(['app', 'Config'], function () {
},
onClick: function () {
- this.invokeRoute();
- this.invokeCallback();
- this.invokeCommand();
+ if (this.idle) {
+ this.invokeCallback();
+ this.invokeRoute();
+ this.invokeCommand();
+ }
},
invokeCommand: function () {
var command = this.model.get('command');
if (command) {
- window.alert(command);
+ this.idle = false;
+ this.$el.addClass('disabled');
+ this.ui.icon.addClass('icon-spinner icon-spin');
+
+ var self = this;
+ var commandPromise = NzbDrone.Commands.Execute(command);
+ commandPromise.done(function () {
+ if (self.model.get('successMessage')) {
+ NzbDrone.Shared.Messenger.show({
+ message: self.model.get('successMessage')
+ });
+ }
+ });
+
+ commandPromise.fail(function () {
+ if (self.model.get('errorMessage')) {
+ NzbDrone.Shared.Messenger.show({
+ message: self.model.get('errorMessage'),
+ type : 'error'
+ });
+ }
+ });
+
+ commandPromise.always(function () {
+ self.$el.removeClass('disabled');
+ self.ui.icon.removeClass('icon-spinner icon-spin');
+ self.idle = true;
+ });
}
},
diff --git a/UI/Shared/Toolbar/ButtonTemplate.html b/UI/Shared/Toolbar/ButtonTemplate.html
index d49aaa9d4..428c15470 100644
--- a/UI/Shared/Toolbar/ButtonTemplate.html
+++ b/UI/Shared/Toolbar/ButtonTemplate.html
@@ -1 +1 @@
- {{title}}
+ {{title}}
diff --git a/UI/app.js b/UI/app.js
index 66ae7a77c..20d55e1bc 100644
--- a/UI/app.js
+++ b/UI/app.js
@@ -30,32 +30,49 @@ define('app', function () {
window.NzbDrone = new Backbone.Marionette.Application();
window.NzbDrone.Config = {};
- window.NzbDrone.Series = {};
- window.NzbDrone.Series.Index = {};
- window.NzbDrone.Series.Index.Table = {};
- window.NzbDrone.Series.Index.List = {};
- window.NzbDrone.Series.Index.Posters = {};
- window.NzbDrone.Series.Edit = {};
- window.NzbDrone.Series.Delete = {};
- window.NzbDrone.Series.Details = {};
- window.NzbDrone.AddSeries = {};
- window.NzbDrone.AddSeries.New = {};
- window.NzbDrone.AddSeries.Existing = {};
- window.NzbDrone.AddSeries.RootFolders = {};
+
+ window.NzbDrone.Series = {
+ Index : {
+ Table : {},
+ List : {},
+ Posters: {}
+
+ },
+ Edit : {},
+ Delete : {},
+ Details: {}
+ };
+
+ window.NzbDrone.AddSeries = {
+ New : {},
+ Existing : {},
+ RootFolders: {}
+ };
+
+
window.NzbDrone.Quality = {};
- window.NzbDrone.Shared = {};
- window.NzbDrone.Shared.Toolbar = {};
+
+ window.NzbDrone.Commands = {};
+
+ window.NzbDrone.Shared = {
+ Toolbar : {},
+ Messenger: {}
+ };
window.NzbDrone.Calendar = {};
- window.NzbDrone.Settings = {};
- window.NzbDrone.Settings.Naming = {};
- window.NzbDrone.Settings.Quality = {};
- window.NzbDrone.Settings.Quality.Size = {};
- window.NzbDrone.Settings.Quality.Profile = {};
- window.NzbDrone.Settings.Indexers = {};
- window.NzbDrone.Settings.DownloadClient = {};
- window.NzbDrone.Settings.Notifications = {};
- window.NzbDrone.Settings.System = {};
- window.NzbDrone.Settings.Misc = {};
+
+ window.NzbDrone.Settings = {
+ Naming : {},
+ Quality : {
+ Size : {},
+ Profile: {}
+ },
+ Indexers : {},
+ DownloadClient: {},
+ Notifications : {},
+ System : {},
+ Misc : {}
+ };
+
window.NzbDrone.Missing = {};
window.NzbDrone.History = {};