summaryrefslogtreecommitdiffstats
path: root/module/web/static/js/views
diff options
context:
space:
mode:
Diffstat (limited to 'module/web/static/js/views')
-rw-r--r--module/web/static/js/views/abstract/itemView.js46
-rw-r--r--module/web/static/js/views/abstract/modalView.js124
-rw-r--r--module/web/static/js/views/accounts/accountListView.js46
-rw-r--r--module/web/static/js/views/accounts/accountModal.js69
-rw-r--r--module/web/static/js/views/accounts/accountView.js24
-rw-r--r--module/web/static/js/views/dashboard/dashboardView.js164
-rw-r--r--module/web/static/js/views/dashboard/fileView.js101
-rw-r--r--module/web/static/js/views/dashboard/filterView.js133
-rw-r--r--module/web/static/js/views/dashboard/packageView.js74
-rw-r--r--module/web/static/js/views/dashboard/selectionView.js150
-rw-r--r--module/web/static/js/views/headerView.js232
-rw-r--r--module/web/static/js/views/input/inputLoader.js7
-rw-r--r--module/web/static/js/views/input/inputView.js85
-rw-r--r--module/web/static/js/views/input/textInput.js35
-rw-r--r--module/web/static/js/views/linkGrabberModal.js48
-rw-r--r--module/web/static/js/views/notificationView.js80
-rw-r--r--module/web/static/js/views/progressView.js31
-rw-r--r--module/web/static/js/views/queryModal.js68
-rw-r--r--module/web/static/js/views/settings/configSectionView.js97
-rw-r--r--module/web/static/js/views/settings/pluginChooserModal.js65
-rw-r--r--module/web/static/js/views/settings/settingsView.js170
21 files changed, 0 insertions, 1849 deletions
diff --git a/module/web/static/js/views/abstract/itemView.js b/module/web/static/js/views/abstract/itemView.js
deleted file mode 100644
index 394044ec4..000000000
--- a/module/web/static/js/views/abstract/itemView.js
+++ /dev/null
@@ -1,46 +0,0 @@
-define(['jquery', 'backbone', 'underscore'], function($, Backbone, _) {
-
- // A view that is meant for temporary displaying
- // All events must be unbound in onDestroy
- return Backbone.View.extend({
-
- tagName: 'li',
- destroy: function() {
- this.undelegateEvents();
- this.unbind();
- if (this.onDestroy) {
- this.onDestroy();
- }
- this.$el.removeData().unbind();
- this.remove();
- },
-
- hide: function() {
- this.$el.slideUp();
- },
-
- show: function() {
- this.$el.slideDown();
- },
-
- unrender: function() {
- var self = this;
- this.$el.slideUp(function() {
- self.destroy();
- });
- },
-
- deleteItem: function(e) {
- if (e)
- e.stopPropagation();
- this.model.destroy();
- },
-
- restart: function(e) {
- if(e)
- e.stopPropagation();
- this.model.restart();
- }
-
- });
-}); \ No newline at end of file
diff --git a/module/web/static/js/views/abstract/modalView.js b/module/web/static/js/views/abstract/modalView.js
deleted file mode 100644
index 170681f06..000000000
--- a/module/web/static/js/views/abstract/modalView.js
+++ /dev/null
@@ -1,124 +0,0 @@
-define(['jquery', 'backbone', 'underscore', 'omniwindow'], function($, Backbone, _) {
-
- return Backbone.View.extend({
-
- events: {
- 'click .btn-confirm': 'confirm',
- 'click .btn-close': 'hide',
- 'click .close': 'hide'
- },
-
- template: null,
- dialog: null,
-
- onHideDestroy: false,
- confirmCallback: null,
-
- initialize: function(template, confirm) {
- this.confirmCallback = confirm;
- var self = this;
- if (this.template === null) {
- if (template) {
- this.template = template;
- // When template was provided this is a temporary dialog
- this.onHideDestroy = true;
- }
- else
- require(['text!tpl/default/modal.html'], function(template) {
- self.template = template;
- });
- }
-
- },
-
- // TODO: whole modal stuff is not very elegant
- render: function() {
- this.$el.html(this.template(this.renderContent()));
- this.onRender();
-
- if (this.dialog === null) {
- this.$el.addClass('modal hide');
- this.$el.css({opacity: 0, scale: 0.7});
-
- var self = this;
- $("body").append(this.el);
- this.dialog = this.$el.omniWindow({
- overlay: {
- selector: '#modal-overlay',
- hideClass: 'hide',
- animations: {
- hide: function(subjects, internalCallback) {
- subjects.overlay.transition({opacity: 'hide', delay: 100}, 300, function() {
- internalCallback(subjects);
- self.onHide();
- if (self.onHideDestroy)
- self.destroy();
- });
- },
- show: function(subjects, internalCallback) {
- subjects.overlay.fadeIn(300);
- internalCallback(subjects);
- }}},
- modal: {
- hideClass: 'hide',
- animations: {
- hide: function(subjects, internalCallback) {
- subjects.modal.transition({opacity: 'hide', scale: 0.7}, 300);
- internalCallback(subjects);
- },
-
- show: function(subjects, internalCallback) {
- subjects.modal.transition({opacity: 'show', scale: 1, delay: 100}, 300, function() {
- internalCallback(subjects);
- });
- }}
- }});
- }
-
- return this;
- },
-
- onRender: function() {
-
- },
-
- renderContent: function() {
- return {};
- },
-
- show: function() {
- if (this.dialog === null)
- this.render();
-
- this.dialog.trigger('show');
-
- this.onShow();
- },
-
- onShow: function() {
-
- },
-
- hide: function() {
- this.dialog.trigger('hide');
- },
-
- onHide: function() {
-
- },
-
- confirm: function() {
- if (this.confirmCallback)
- this.confirmCallback.apply();
-
- this.hide();
- },
-
- destroy: function() {
- this.$el.remove();
- this.dialog = null;
- this.remove();
- }
-
- });
-}); \ No newline at end of file
diff --git a/module/web/static/js/views/accounts/accountListView.js b/module/web/static/js/views/accounts/accountListView.js
deleted file mode 100644
index 68dffaa98..000000000
--- a/module/web/static/js/views/accounts/accountListView.js
+++ /dev/null
@@ -1,46 +0,0 @@
-define(['jquery', 'underscore', 'backbone', 'app', 'collections/AccountList', './accountView'],
- function($, _, Backbone, App, AccountList, accountView) {
-
- // Renders settings over view page
- return Backbone.View.extend({
-
- el: "body",
-
- events: {
- 'click .btn-add': 'addAccount'
- },
-
- content: null,
- accounts: null,
- modal: null,
-
- initialize: function() {
- this.content = this.$('#account-content');
- this.accounts = new AccountList();
- this.refresh();
- },
-
- refresh: function() {
- this.accounts.fetch({success: _.bind(this.render, this)});
- },
-
- render: function() {
- var self = this;
- App.vent.trigger('accounts:destroyContent');
- // TODO trs cant' be animated
- this.accounts.each(function(account) {
- self.content.appendWithHeight(new accountView({model: account}).render().el);
- });
- },
-
- addAccount: function() {
- var self = this;
- _.requireOnce(['views/accounts/accountModal'], function(Modal) {
- if (self.modal === null)
- self.modal = new Modal();
-
- self.modal.show();
- });
- }
- });
- }); \ No newline at end of file
diff --git a/module/web/static/js/views/accounts/accountModal.js b/module/web/static/js/views/accounts/accountModal.js
deleted file mode 100644
index 755ffd510..000000000
--- a/module/web/static/js/views/accounts/accountModal.js
+++ /dev/null
@@ -1,69 +0,0 @@
-define(['jquery', 'underscore', 'app', 'views/abstract/modalView', 'text!tpl/default/accountDialog.html', 'select2'],
- function($, _, App, modalView, template) {
- return modalView.extend({
-
- events: {
- 'click .btn-add': 'add'
- },
- template: _.compile(template),
- plugins: null,
- select: null,
-
- initialize: function() {
- // Inherit parent events
- this.events = _.extend({}, modalView.prototype.events, this.events);
- var self = this;
- $.ajax(App.apiRequest('getAccountTypes', null, {success: function(data) {
- self.plugins = _.sortBy(data, function(item) {
- return item;
- });
- self.render();
- }}));
- },
-
- onRender: function() {
- // TODO: could be a seperate input type if needed on multiple pages
- if (this.plugins)
- this.select = this.$('#pluginSelect').select2({
- escapeMarkup: function(m) {
- return m;
- },
- formatResult: this.format,
- formatSelection: this.format,
- data: {results: this.plugins, text: function(item) {
- return item;
- }},
- id: function(item) {
- return item;
- }
- });
- },
-
- onShow: function() {
- },
-
- onHide: function() {
- },
-
- format: function(data) {
- return '<img class="logo-select" src="icons/' + data + '"> ' + data;
- },
-
- add: function(e) {
- e.stopPropagation();
- if (this.select) {
- var plugin = this.select.val(),
- login = this.$('#login').val(),
- password = this.$('#password').val(),
- self = this;
-
- $.ajax(App.apiRequest('updateAccount', {
- plugin: plugin, login: login, password: password
- }, { success: function() {
- App.accountView.refresh();
- self.hide();
- }}));
- }
- }
- });
- }); \ No newline at end of file
diff --git a/module/web/static/js/views/accounts/accountView.js b/module/web/static/js/views/accounts/accountView.js
deleted file mode 100644
index 7c3d492c3..000000000
--- a/module/web/static/js/views/accounts/accountView.js
+++ /dev/null
@@ -1,24 +0,0 @@
-define(['jquery', 'underscore', 'backbone', 'app', '../abstract/itemView'],
- function($, _, Backbone, App, itemView) {
-
- // Renders settings over view page
- return itemView.extend({
-
- tagName: "tr",
- template: _.compile($('#template-account').html()),
-
- events: {
- 'click .btn-danger': 'deleteItem'
- },
-
- initialize: function() {
- this.listenTo(this.model, 'remove', this.unrender);
- this.listenTo(App.vent, 'accounts:destroyContent', this.destroy);
- },
-
- render: function() {
- this.$el.html(this.template(this.model.toJSON()));
- return this;
- }
- });
- }); \ No newline at end of file
diff --git a/module/web/static/js/views/dashboard/dashboardView.js b/module/web/static/js/views/dashboard/dashboardView.js
deleted file mode 100644
index c888214df..000000000
--- a/module/web/static/js/views/dashboard/dashboardView.js
+++ /dev/null
@@ -1,164 +0,0 @@
-define(['jquery', 'backbone', 'underscore', 'app', 'models/TreeCollection',
- './packageView', './fileView', './selectionView', './filterView', 'select2'],
- function($, Backbone, _, App, TreeCollection, packageView, fileView, selectionView, filterView) {
-
- // Renders whole dashboard
- return Backbone.View.extend({
-
- el: '#content',
- active: $('.breadcrumb .active'),
-
- events: {
- },
-
- // <ul> holding the packages
- packageUL: null,
- // <ul> displaying the files
- fileUL: null,
- // Package tree
- tree: null,
- // Current open files
- files: null,
- // True when loading animation is running
- isLoading: false,
-
- initialize: function() {
- var self = this;
- this.tree = new TreeCollection();
-
- var view = new selectionView();
- view = new filterView();
-
- // When package is added we reload the data
- App.vent.on('package:added', function() {
- console.log('Package tree caught, package:added event');
- self.tree.fetch();
- });
-
- App.vent.on('file:updated', _.bind(this.fileUpdated, this));
-
- // TODO: file:added
- // TODO: package:deleted
- // TODO: package:updated
- },
-
- init: function() {
- var self = this;
- // TODO: put in separated function
- // TODO: order of elements?
- // Init the tree and callback for package added
- this.tree.fetch({success: function() {
- self.render();
- self.tree.get('packages').on('add', function(pack) {
- console.log('Package ' + pack.get('pid') + ' added to tree');
- self.appendPackage(pack, 0, true);
- self.openPackage(pack);
- });
- }});
-
- this.$('.input').select2({tags: ["a", "b", "sdf"]});
- },
-
- render: function() {
- console.log('Render package list');
- var packs = this.tree.get('packages');
- this.files = this.tree.get('files');
-
- this.packageUL = this.$('.package-list');
- packs.each(_.bind(this.appendPackage, this));
-
- this.fileUL = this.$('.file-list');
- if (this.files.length === 0) {
- // no files are displayed
- this.files = null;
- // Open the first package
- if (packs.length >= 1)
- this.openPackage(packs.at(0));
- }
- else
- this.files.each(_.bind(this.appendFile, this));
-
- return this;
- },
-
- // TODO sorting ?!
- // Append a package to the list, index, animate it
- appendPackage: function(pack, i, animation) {
- var el = new packageView({model: pack}).render().el;
- this.packageUL.appendWithAnimation(el, animation);
- },
-
- appendFile: function(file, i, animation) {
- var el = new fileView({model: file}).render().el;
- this.fileUL.appendWithAnimation(el, animation);
- },
-
- // Show content of the packages on main view
- openPackage: function(pack) {
- var self = this;
-
- // load animation only when something is shown and its different from current package
- if (this.files && this.files !== pack.get('files'))
- self.loading();
-
- pack.fetch({silent: true, success: function() {
- console.log('Package ' + pack.get('pid') + ' loaded');
- self.active.text(pack.get('name'));
- self.contentReady(pack.get('files'));
- }, failure: function() {
- self.failure();
- }});
-
- },
-
- contentReady: function(files) {
- var old_files = this.files;
- this.files = files;
- App.vent.trigger('dashboard:contentReady');
-
- // show the files when no loading animation is running and not already open
- if (!this.isLoading && old_files !== files)
- this.show();
- },
-
- // Do load animation, remove the old stuff
- loading: function() {
- this.isLoading = true;
- this.files = null;
- var self = this;
- this.fileUL.fadeOut({complete: function() {
- // All file views should vanish
- App.vent.trigger('dashboard:destroyContent');
-
- // Loading was faster than animation
- if (self.files)
- self.show();
-
- self.isLoading = false;
- }});
- },
-
- failure: function() {
- // TODO
- },
-
- show: function() {
- // fileUL has to be resetted before
- this.files.each(_.bind(this.appendFile, this));
- //TODO: show placeholder when nothing is displayed (filtered content empty)
- this.fileUL.fadeIn();
- App.vent.trigger('dashboard:updated');
- },
-
- // Refresh the file if it is currently shown
- fileUpdated: function(data) {
- // this works with ids and object
- var file = this.files.get(data);
- if (file)
- if (_.isObject(data)) // update directly
- file.set(data);
- else // fetch from server
- file.fetch();
- }
- });
- }); \ No newline at end of file
diff --git a/module/web/static/js/views/dashboard/fileView.js b/module/web/static/js/views/dashboard/fileView.js
deleted file mode 100644
index 5d687a111..000000000
--- a/module/web/static/js/views/dashboard/fileView.js
+++ /dev/null
@@ -1,101 +0,0 @@
-define(['jquery', 'backbone', 'underscore', 'app', 'utils/apitypes', 'views/abstract/itemView', 'helpers/formatTime'],
- function($, Backbone, _, App, Api, ItemView, formatTime) {
-
- // Renders single file item
- return ItemView.extend({
-
- tagName: 'li',
- className: 'file-view row-fluid',
- template: _.compile($("#template-file").html()),
- events: {
- 'click .checkbox': 'select',
- 'click .btn-delete': 'deleteItem',
- 'click .btn-restart': 'restart'
- },
-
- initialize: function() {
- this.listenTo(this.model, 'change', this.render);
- // This will be triggered manually and changed before with silent=true
- this.listenTo(this.model, 'change:visible', this.visibility_changed);
- this.listenTo(this.model, 'change:progress', this.progress_changed);
- this.listenTo(this.model, 'remove', this.unrender);
- this.listenTo(App.vent, 'dashboard:destroyContent', this.destroy);
- },
-
- onDestroy: function() {
- },
-
- render: function() {
- var data = this.model.toJSON();
- if (data.download) {
- var status = data.download.status;
- if (status === Api.DownloadStatus.Offline || status === Api.DownloadStatus.TempOffline)
- data.offline = true;
- else if (status === Api.DownloadStatus.Online)
- data.online = true;
- else if (status === Api.DownloadStatus.Waiting)
- data.waiting = true;
- else if (status === Api.DownloadStatus.Downloading)
- data.downloading = true;
- else if (this.model.isFailed())
- data.failed = true;
- else if (this.model.isFinished())
- data.finished = true;
- }
-
- this.$el.html(this.template(data));
- if (this.model.get('selected'))
- this.$el.addClass('ui-selected');
- else
- this.$el.removeClass('ui-selected');
-
- if (this.model.get('visible'))
- this.$el.show();
- else
- this.$el.hide();
-
- return this;
- },
-
- select: function(e) {
- e.preventDefault();
- var checked = this.$el.hasClass('ui-selected');
- // toggle class immediately, so no re-render needed
- this.model.set('selected', !checked, {silent: true});
- this.$el.toggleClass('ui-selected');
- App.vent.trigger('file:selection');
- },
-
- visibility_changed: function(visible) {
- // TODO: improve animation, height is not available when element was not visible
- if (visible)
- this.$el.slideOut(true);
- else {
- this.$el.calculateHeight(true);
- this.$el.slideIn(true);
- }
- },
-
- progress_changed: function() {
- if (!this.model.isDownload())
- return;
-
- if (this.model.get('download').status === Api.DownloadStatus.Downloading) {
- var bar = this.$('.progress .bar');
- if (!bar) { // ensure that the dl bar is rendered
- this.render();
- bar = this.$('.progress .bar');
- }
-
- bar.width(this.model.get('progress') + '%');
- bar.html('&nbsp;&nbsp;' + formatTime(this.model.get('eta')));
- } else if (this.model.get('download').status === Api.DownloadStatus.Waiting) {
- this.$('.second').html(
- "<i class='iconf-time'></i>&nbsp;" + formatTime(this.model.get('eta')));
-
- } else // Every else state can be renderred normally
- this.render();
-
- }
- });
- }); \ No newline at end of file
diff --git a/module/web/static/js/views/dashboard/filterView.js b/module/web/static/js/views/dashboard/filterView.js
deleted file mode 100644
index 14968f2cc..000000000
--- a/module/web/static/js/views/dashboard/filterView.js
+++ /dev/null
@@ -1,133 +0,0 @@
-define(['jquery', 'backbone', 'underscore', 'app', 'utils/apitypes', 'models/Package'],
- function($, Backbone, _, App, Api, Package) {
-
- // Modified version of type ahead show, nearly the same without absolute positioning
- function show() {
- this.$menu
- .insertAfter(this.$element)
- .show();
-
- this.shown = true;
- return this;
- }
-
- // Renders the actionbar for the dashboard, handles everything related to filtering displayed files
- return Backbone.View.extend({
- el: 'ul.actionbar',
-
- events: {
- 'click .filter-type': 'filter_type',
- 'click .filter-state': 'switch_filter',
- 'submit .form-search': 'search'
- },
-
- state: null,
- stateMenu: null,
-
- initialize: function() {
-
- // use our modified method
- $.fn.typeahead.Constructor.prototype.show = show;
- this.$('.search-query').typeahead({
- minLength: 2,
- source: this.getSuggestions
- });
-
- this.stateMenu = this.$('.dropdown-toggle .state');
- this.state = Api.DownloadState.All;
-
- // Apply the filter before the content is shown
- App.vent.on('dashboard:contentReady', _.bind(this.apply_filter, this));
- },
-
- render: function() {
- return this;
- },
-
- // TODO: app level api request
-
- search: function(e) {
- e.stopPropagation();
- var input = this.$('.search-query');
- var query = input.val();
- input.val('');
-
- var pack = new Package();
- // Overwrite fetch method to use a search
- // TODO: quite hackish, could be improved to filter packages
- // or show performed search
- pack.fetch = function(options) {
- pack.search(query, options);
- };
-
- App.dashboard.openPackage(pack);
- },
-
- getSuggestions: function(query, callback) {
- $.ajax('/api/searchSuggestions', {
- method: 'POST',
- data: {pattern: JSON.stringify(query)},
- success: function(data) {
- callback(data);
- }
- });
- },
-
- switch_filter: function(e) {
- e.stopPropagation();
- var element = $(e.target);
- var state = parseInt(element.data('state'), 10);
- var menu = this.stateMenu.parent().parent();
- menu.removeClass('open');
-
- if (state === Api.DownloadState.Finished) {
- menu.removeClass().addClass('dropdown finished');
- } else if (state === Api.DownloadState.Unfinished) {
- menu.removeClass().addClass('dropdown active');
- } else if (state === Api.DownloadState.Failed) {
- menu.removeClass().addClass('dropdown failed');
- } else {
- menu.removeClass().addClass('dropdown');
- }
-
- this.state = state;
- this.stateMenu.text(element.text());
- this.apply_filter();
- },
-
- // Applies the filtering to current open files
- apply_filter: function() {
- if (!App.dashboard.files)
- return;
-
- var self = this;
- App.dashboard.files.map(function(file) {
- var visible = file.get('visible');
- if (visible !== self.is_visible(file)) {
- file.set('visible', !visible, {silent: true});
- file.trigger('change:visible', !visible);
- }
- });
-
- App.vent.trigger('dashboard:filtered');
- },
-
- // determine if a file should be visible
- // TODO: non download files
- is_visible: function(file) {
- if (this.state === Api.DownloadState.Finished)
- return file.isFinished();
- else if (this.state === Api.DownloadState.Unfinished)
- return file.isUnfinished();
- else if (this.state === Api.DownloadState.Failed)
- return file.isFailed();
-
- return true;
- },
-
- filter_type: function(e) {
-
- }
-
- });
- }); \ No newline at end of file
diff --git a/module/web/static/js/views/dashboard/packageView.js b/module/web/static/js/views/dashboard/packageView.js
deleted file mode 100644
index 547c1470d..000000000
--- a/module/web/static/js/views/dashboard/packageView.js
+++ /dev/null
@@ -1,74 +0,0 @@
-define(['jquery', 'app', 'views/abstract/itemView', 'underscore'],
- function($, App, itemView, _) {
-
- // Renders a single package item
- return itemView.extend({
-
- tagName: 'li',
- className: 'package-view',
- template: _.compile($("#template-package").html()),
- events: {
- 'click .package-name, .btn-open': 'open',
- 'click .iconf-refresh': 'restart',
- 'click .select': 'select',
- 'click .btn-delete': 'deleteItem'
- },
-
- // Ul for child packages (unused)
- ul: null,
- // Currently unused
- expanded: false,
-
- initialize: function() {
- this.listenTo(this.model, 'filter:added', this.hide);
- this.listenTo(this.model, 'filter:removed', this.show);
- this.listenTo(this.model, 'change', this.render);
- this.listenTo(this.model, 'remove', this.unrender);
-
- // Clear drop down menu
- var self = this;
- this.$el.on('mouseleave', function() {
- self.$('.dropdown-menu').parent().removeClass('open');
- });
- },
-
- onDestroy: function() {
- },
-
- // Render everything, optional only the fileViews
- render: function() {
- this.$el.html(this.template(this.model.toJSON()));
- this.$el.initTooltips();
-
- return this;
- },
-
- unrender: function() {
- itemView.prototype.unrender.apply(this);
-
- // TODO: display other package
- App.vent.trigger('dashboard:loading', null);
- },
-
-
- // TODO
- // Toggle expanding of packages
- expand: function(e) {
- e.preventDefault();
- },
-
- open: function(e) {
- e.preventDefault();
- App.dashboard.openPackage(this.model);
- },
-
- select: function(e) {
- e.preventDefault();
- var checked = this.$('.select').hasClass('iconf-check');
- // toggle class immediately, so no re-render needed
- this.model.set('selected', !checked, {silent: true});
- this.$('.select').toggleClass('iconf-check').toggleClass('iconf-check-empty');
- App.vent.trigger('package:selection');
- }
- });
- }); \ No newline at end of file
diff --git a/module/web/static/js/views/dashboard/selectionView.js b/module/web/static/js/views/dashboard/selectionView.js
deleted file mode 100644
index 546cda847..000000000
--- a/module/web/static/js/views/dashboard/selectionView.js
+++ /dev/null
@@ -1,150 +0,0 @@
-define(['jquery', 'backbone', 'underscore', 'app'],
- function($, Backbone, _, App) {
-
- // Renders context actions for selection packages and files
- return Backbone.View.extend({
- el: '#selection-area',
- template: _.compile($("#template-select").html()),
-
- events: {
- 'click .iconf-check': 'deselect',
- 'click .iconf-pause': 'pause',
- 'click .iconf-trash': 'trash',
- 'click .iconf-refresh': 'restart'
- },
-
- // Element of the action bar
- actionBar: null,
- // number of currently selected elements
- current: 0,
-
- initialize: function() {
- this.$el.calculateHeight().height(0);
-
- var render = _.bind(this.render, this);
-
- App.vent.on('dashboard:updated', render);
- App.vent.on('dashboard:filtered', render);
- App.vent.on('package:selection', render);
- App.vent.on('file:selection', render);
-
- this.actionBar = $('.actionbar .btn-check');
- this.actionBar.parent().click(_.bind(this.select_toggle, this));
-
- // API events, maybe better to rely on internal ones?
- App.vent.on('package:deleted', render);
- App.vent.on('file:deleted', render);
- },
-
- get_files: function(all) {
- var files = [];
- if (App.dashboard.files)
- if (all)
- files = App.dashboard.files.where({visible: true});
- else
- files = App.dashboard.files.where({selected: true, visible: true});
-
- return files;
- },
-
- get_packs: function() {
- return App.dashboard.tree.get('packages').where({selected: true});
- },
-
- render: function() {
- var files = this.get_files().length;
- var packs = this.get_packs().length;
-
- if (files + packs > 0) {
- this.$el.html(this.template({files: files, packs: packs}));
- this.$el.initTooltips('bottom');
- }
-
- if (files + packs > 0 && this.current === 0)
- this.$el.slideOut();
- else if (files + packs === 0 && this.current > 0)
- this.$el.slideIn();
-
- if (files > 0) {
- this.actionBar.addClass('iconf-check').removeClass('iconf-check-empty');
- App.dashboard.packageUL.addClass('ui-files-selected');
- }
- else {
- this.actionBar.addClass('iconf-check-empty').removeClass('iconf-check');
- App.dashboard.packageUL.removeClass('ui-files-selected');
- }
-
- this.current = files + packs;
- },
-
- // Deselects all items
- deselect: function() {
- this.get_files().map(function(file) {
- file.set('selected', false);
- });
-
- this.get_packs().map(function(pack) {
- pack.set('selected', false);
- });
-
- this.render();
- },
-
- pause: function() {
- alert("Not implemented yet");
- this.deselect();
- },
-
- trash: function() {
- _.confirm('default/confirmDialog.html', function() {
-
- var pids = [];
- // TODO: delete many at once
- this.get_packs().map(function(pack) {
- pids.push(pack.get('pid'));
- pack.destroy();
- });
-
- // get only the fids of non deleted packages
- var fids = _.filter(this.get_files(),function(file) {
- return !_.contains(pids, file.get('package'));
- }).map(function(file) {
- file.destroyLocal();
- return file.get('fid');
- });
-
- if (fids.length > 0)
- $.ajax(App.apiRequest('deleteFiles', {fids: fids}));
-
- this.deselect();
- }, this);
- },
-
- restart: function() {
- this.get_files().map(function(file) {
- file.restart();
- });
- this.get_packs().map(function(pack) {
- pack.restart();
- });
-
- this.deselect();
- },
-
- // Select or deselect all visible files
- select_toggle: function() {
- var files = this.get_files();
- if (files.length === 0) {
- this.get_files(true).map(function(file) {
- file.set('selected', true);
- });
-
- } else
- files.map(function(file) {
- file.set('selected', false);
- });
-
- this.render();
- }
- });
- }); \ No newline at end of file
diff --git a/module/web/static/js/views/headerView.js b/module/web/static/js/views/headerView.js
deleted file mode 100644
index db704a3db..000000000
--- a/module/web/static/js/views/headerView.js
+++ /dev/null
@@ -1,232 +0,0 @@
-define(['jquery', 'underscore', 'backbone', 'app', 'models/ServerStatus', 'collections/ProgressList',
- 'views/progressView', 'views/notificationView', 'helpers/formatSize', 'flot'],
- function($, _, Backbone, App, ServerStatus, ProgressList, ProgressView, notificationView, formatSize) {
- // Renders the header with all information
- return Backbone.View.extend({
-
- el: 'header',
-
- events: {
- 'click .iconf-list': 'toggle_taskList',
- 'click .popover .close': 'toggle_taskList',
- 'click .btn-grabber': 'open_grabber'
- },
-
- // todo: maybe combine these
- templateStatus: _.compile($('#template-header-status').html()),
- templateHeader: _.compile($('#template-header').html()),
-
- // html elements
- grabber: null,
- header: null,
- progress: null,
- speedgraph: null,
-
- // models and data
- ws: null,
- status: null,
- progressList: null,
- speeds: null,
-
- // sub view
- notificationView: null,
-
- // save if last progress was empty
- wasEmpty: false,
-
- initialize: function() {
- var self = this;
- this.notificationView = new notificationView();
-
- this.status = new ServerStatus();
- this.listenTo(this.status, 'change', this.render);
-
- this.progress = this.$('.progress-list');
- this.progressList = new ProgressList();
- this.listenTo(this.progressList, 'add', function(model) {
- self.progress.appendWithAnimation(new ProgressView({model: model}).render().el);
- });
-
- // TODO: button to start stop refresh
- var ws = App.openWebSocket('/async');
- ws.onopen = function() {
- ws.send(JSON.stringify('start'));
- };
- // TODO compare with polling
- ws.onmessage = _.bind(this.onData, this);
- ws.onerror = function(error) {
- console.log(error);
- alert("WebSocket error" + error);
- };
-
- this.ws = ws;
-
- this.initGraph();
- },
-
- initGraph: function() {
- var totalPoints = 120;
- var data = [];
-
- // init with empty data
- while (data.length < totalPoints)
- data.push([data.length, 0]);
-
- this.speeds = data;
- this.speedgraph = $.plot(this.$el.find("#speedgraph"), [this.speeds], {
- series: {
- lines: { show: true, lineWidth: 2 },
- shadowSize: 0,
- color: "#fee247"
- },
- xaxis: { ticks: [] },
- yaxis: { ticks: [], min: 1, autoscaleMargin: 0.1, tickFormatter: function(data) {
- return formatSize(data * 1024);
- }, position: "right" },
- grid: {
- show: true,
-// borderColor: "#757575",
- borderColor: "white",
- borderWidth: 1,
- labelMargin: 0,
- axisMargin: 0,
- minBorderMargin: 0
- }
- });
-
- },
-
- render: function() {
- // TODO: what should be displayed in the header
- // queue/processing size?
-
- var status = this.status.toJSON();
- status.maxspeed = _.max(this.speeds, function(speed) {
- return speed[1];
- })[1] * 1024;
- this.$('.status-block').html(
- this.templateStatus(status)
- );
-
- var data = {tasks: 0, downloads: 0, speed: 0, single: false};
- this.progressList.each(function(progress) {
- if (progress.isDownload()) {
- data.downloads += 1;
- data.speed += progress.get('download').speed;
- } else
- data.tasks++;
- });
-
- // Show progress of one task
- if (data.tasks + data.downloads === 1) {
- var progress = this.progressList.at(0);
- data.single = true;
- data.eta = progress.get('eta');
- data.percent = progress.getPercent();
- data.name = progress.get('name');
- data.statusmsg = progress.get('statusmsg');
- }
- // TODO: better progressbar rendering
-
- data.etaqueue = status.eta;
- data.linksqueue = status.linksqueue;
- data.sizequeue = status.sizequeue;
-
- this.$('#progress-info').html(
- this.templateHeader(data)
- );
- return this;
- },
-
- toggle_taskList: function() {
- this.$('.popover').animate({opacity: 'toggle'});
- },
-
- open_grabber: function() {
- var self = this;
- _.requireOnce(['views/linkGrabberModal'], function(modalView) {
- if (self.grabber === null)
- self.grabber = new modalView();
-
- self.grabber.show();
- });
- },
-
- onData: function(evt) {
- var data = JSON.parse(evt.data);
- if (data === null) return;
-
- if (data['@class'] === "ServerStatus") {
- // TODO: load interaction when none available
- this.status.set(data);
-
- // There tasks at the server, but not in queue: so fetch them
- // or there are tasks in our queue but not on the server
- if (this.status.get('notifications') && !this.notificationView.tasks.hasTaskWaiting() ||
- !this.status.get('notifications') && this.notificationView.tasks.hasTaskWaiting())
- this.notificationView.tasks.fetch();
-
- this.speeds = this.speeds.slice(1);
- this.speeds.push([this.speeds[this.speeds.length - 1][0] + 1, Math.floor(data.speed / 1024)]);
-
- // TODO: if everything is 0 rerender is not needed
- this.speedgraph.setData([this.speeds]);
- // adjust the axis
- this.speedgraph.setupGrid();
- this.speedgraph.draw();
-
- }
- else if (_.isArray(data))
- this.onProgressUpdate(data);
- else if (data['@class'] === 'EventInfo')
- this.onEvent(data.eventname, data.event_args);
- else
- console.log('Unknown Async input', data);
-
- },
-
- onProgressUpdate: function(progress) {
- // generate a unique id
- _.each(progress, function(prog) {
- if (prog.download)
- prog.pid = prog.download.fid;
- else
- prog.pid = prog.plugin + prog.name;
- });
-
- this.progressList.update(progress);
- // update currently open files with progress
- this.progressList.each(function(prog) {
- if (prog.isDownload() && App.dashboard.files) {
- var file = App.dashboard.files.get(prog.get('download').fid);
- if (file) {
- file.set({
- progress: prog.getPercent(),
- eta: prog.get('eta'),
- }, {silent: true});
-
- file.trigger('change:progress');
- }
- }
- });
-
- if (progress.length === 0) {
- // only render one time when last was not empty already
- if (!this.wasEmpty) {
- this.render();
- this.wasEmpty = true;
- }
- } else {
- this.wasEmpty = false;
- this.render();
- }
- },
-
- onEvent: function(event, args) {
- args.unshift(event);
- console.log('Core send event', args);
- App.vent.trigger.apply(App.vent, args);
- }
-
- });
- }); \ No newline at end of file
diff --git a/module/web/static/js/views/input/inputLoader.js b/module/web/static/js/views/input/inputLoader.js
deleted file mode 100644
index 5ccf07695..000000000
--- a/module/web/static/js/views/input/inputLoader.js
+++ /dev/null
@@ -1,7 +0,0 @@
-define(['./textInput'], function(textInput) {
-
- // selects appropriate input element
- return function(input, value, default_value, description) {
- return textInput;
- };
-}); \ No newline at end of file
diff --git a/module/web/static/js/views/input/inputView.js b/module/web/static/js/views/input/inputView.js
deleted file mode 100644
index ed78d2d30..000000000
--- a/module/web/static/js/views/input/inputView.js
+++ /dev/null
@@ -1,85 +0,0 @@
-define(['jquery', 'backbone', 'underscore'], function($, Backbone, _) {
-
- // Renders input elements
- return Backbone.View.extend({
-
- tagName: 'input',
-
- model: null,
- value: null,
- default_value: null,
- description: null,
-
- // enables tooltips
- tooltip: true,
-
- initialize: function(model, value, default_value, description) {
- this.model = model;
- this.value = value;
- this.default_value = default_value;
- this.description = description;
- },
-
- render: function() {
- this.renderInput();
- // data for tooltips
- if (this.description && this.tooltip) {
- this.$el.data('content', this.description);
- // TODO: render default value in popup?
-// this.$el.data('title', "TODO: title");
- this.$el.popover({
- placement: 'right',
- trigger: 'hover',
-// delay: { show: 500, hide: 100 }
- });
- }
-
- return this;
- },
-
- renderInput: function() {
- // Overwrite this
- },
-
- showTooltip: function() {
- if (this.description && this.tooltip)
- this.$el.popover('show');
- },
-
- hideTooltip: function() {
- if (this.description && this.tooltip)
- this.$el.popover('hide');
- },
-
- destroy: function() {
- this.undelegateEvents();
- this.unbind();
- if (this.onDestroy) {
- this.onDestroy();
- }
- this.$el.removeData().unbind();
- this.remove();
- },
-
- // focus the input element
- focus: function() {
- this.$el.focus();
- },
-
- // Clear the input
- clear: function() {
-
- },
-
- // retrieve value of the input
- getVal: function() {
- return this.value;
- },
-
- // the child class must call this when the value changed
- setVal: function(value) {
- this.value = value;
- this.trigger('change', value);
- }
- });
-}); \ No newline at end of file
diff --git a/module/web/static/js/views/input/textInput.js b/module/web/static/js/views/input/textInput.js
deleted file mode 100644
index 3a6631a0b..000000000
--- a/module/web/static/js/views/input/textInput.js
+++ /dev/null
@@ -1,35 +0,0 @@
-define(['jquery', 'backbone', 'underscore', './inputView'], function($, Backbone, _, inputView) {
-
- return inputView.extend({
-
- // TODO
- tagName: 'input',
- events: {
- 'keyup': 'onChange',
- 'focus': 'showTooltip',
- 'focusout': 'hideTooltip'
- },
-
- renderInput: function() {
- this.$el.attr('type', 'text');
- this.$el.attr('name', 'textInput');
-
- if (this.default_value)
- this.$el.attr('placeholder', this.default_value);
-
- if (this.value)
- this.$el.val(this.value);
-
- return this;
- },
-
- clear: function() {
- this.$el.val('');
- },
-
- onChange: function(e) {
- this.setVal(this.$el.val());
- }
-
- });
-}); \ No newline at end of file
diff --git a/module/web/static/js/views/linkGrabberModal.js b/module/web/static/js/views/linkGrabberModal.js
deleted file mode 100644
index e2b6e985d..000000000
--- a/module/web/static/js/views/linkGrabberModal.js
+++ /dev/null
@@ -1,48 +0,0 @@
-define(['jquery', 'underscore', 'app', 'views/abstract/modalView', 'text!tpl/default/linkgrabber.html'],
- function($, _, App, modalView, template) {
- // Modal dialog for package adding - triggers package:added when package was added
- return modalView.extend({
-
- events: {
- 'click .btn-success': 'addPackage',
- 'keypress #inputPackageName': 'addOnEnter'
- },
-
- template: _.compile(template),
-
- initialize: function() {
- // Inherit parent events
- this.events = _.extend({}, modalView.prototype.events, this.events);
- },
-
- addOnEnter: function(e) {
- if (e.keyCode != 13) return;
- this.addPackage(e);
- },
-
- addPackage: function(e) {
- var self = this;
- var options = App.apiRequest('addPackage',
- {
- name: $('#inputPackageName').val(),
- // TODO: better parsing / tokenization
- links: $('#inputLinks').val().split("\n")
- },
- {
- success: function() {
- App.vent.trigger('package:added');
- self.hide();
- }
- });
-
- $.ajax(options);
- $('#inputPackageName').val('');
- $('#inputLinks').val('');
- },
-
- onShow: function() {
- this.$('#inputPackageName').focus();
- }
-
- });
- }); \ No newline at end of file
diff --git a/module/web/static/js/views/notificationView.js b/module/web/static/js/views/notificationView.js
deleted file mode 100644
index afb542eed..000000000
--- a/module/web/static/js/views/notificationView.js
+++ /dev/null
@@ -1,80 +0,0 @@
-define(['jquery', 'backbone', 'underscore', 'app', 'collections/InteractionList'],
- function($, Backbone, _, App, InteractionList, queryModal) {
-
- // Renders context actions for selection packages and files
- return Backbone.View.extend({
- el: '#notification-area',
- template: _.compile($("#template-notification").html()),
-
- events: {
- 'click .btn-query': 'openQuery',
- 'click .btn-notification': 'openNotifications'
- },
-
- tasks: null,
- // area is slided out
- visible: false,
- // the dialog
- modal: null,
-
- initialize: function() {
- this.tasks = new InteractionList();
-
- this.$el.calculateHeight().height(0);
-
- App.vent.on('interaction:added', _.bind(this.onAdd, this));
- App.vent.on('interaction:deleted', _.bind(this.onDelete, this));
-
- var render = _.bind(this.render, this);
- this.listenTo(this.tasks, 'add', render);
- this.listenTo(this.tasks, 'remove', render);
-
- },
-
- onAdd: function(task) {
- this.tasks.add(task);
- },
-
- onDelete: function(task) {
- this.tasks.remove(task);
- },
-
- render: function() {
-
- // only render when it will be visible
- if (this.tasks.length > 0)
- this.$el.html(this.template(this.tasks.toJSON()));
-
- if (this.tasks.length > 0 && !this.visible) {
- this.$el.slideOut();
- this.visible = true;
- }
- else if (this.tasks.length === 0 && this.visible) {
- this.$el.slideIn();
- this.visible = false;
- }
-
- return this;
- },
-
- openQuery: function() {
- var self = this;
-
- _.requireOnce(['views/queryModal'], function(modalView) {
- if (self.modal === null) {
- self.modal = new modalView();
- self.modal.parent = self;
- }
-
- self.modal.model = self.tasks.at(0);
- self.modal.render();
- self.modal.show();
- });
-
- },
-
- openNotifications: function() {
-
- }
- });
- }); \ No newline at end of file
diff --git a/module/web/static/js/views/progressView.js b/module/web/static/js/views/progressView.js
deleted file mode 100644
index 3c2908000..000000000
--- a/module/web/static/js/views/progressView.js
+++ /dev/null
@@ -1,31 +0,0 @@
-define(['jquery', 'backbone', 'underscore', 'app', 'utils/apitypes', 'views/abstract/itemView'],
- function($, Backbone, _, App, Api, ItemView) {
-
- // Renders single file item
- return ItemView.extend({
-
- idAttribute: 'pid',
- tagName: 'li',
- template: _.compile($("#template-header-progress").html()),
- events: {
- },
-
- initialize: function() {
- this.listenTo(this.model, 'change', this.render);
- this.listenTo(this.model, 'remove', this.unrender);
- },
-
- onDestroy: function() {
- },
-
- render: function() {
- // TODO: icon
- // TODO: other states
- // TODO: non download progress
- // TODO: better progressbar rendering
- this.$el.css('background-image', 'url(icons/sdf)');
- this.$el.html(this.template(this.model.toJSON()));
- return this;
- }
- });
- }); \ No newline at end of file
diff --git a/module/web/static/js/views/queryModal.js b/module/web/static/js/views/queryModal.js
deleted file mode 100644
index 5477334a0..000000000
--- a/module/web/static/js/views/queryModal.js
+++ /dev/null
@@ -1,68 +0,0 @@
-define(['jquery', 'underscore', 'app', 'views/abstract/modalView', './input/inputLoader', 'text!tpl/default/queryDialog.html'],
- function($, _, App, modalView, load_input, template) {
- return modalView.extend({
-
- // TODO: submit on enter reloads the page sometimes
- events: {
- 'click .btn-success': 'submit',
- 'submit form': 'submit'
- },
- template: _.compile(template),
-
- // the notificationView
- parent: null,
-
- model: null,
- input: null,
-
- initialize: function() {
- // Inherit parent events
- this.events = _.extend({}, modalView.prototype.events, this.events);
- },
-
- renderContent: function() {
- var data = {
- title: this.model.get('title'),
- plugin: this.model.get('plugin'),
- description: this.model.get('description')
- };
-
- var input = this.model.get('input').data;
- if (this.model.isCaptcha()) {
- data.captcha = input[0];
- data.type = input[1];
- }
- return data;
- },
-
- onRender: function() {
- // instantiate the input
- var input = this.model.get('input');
- var inputView = load_input(input);
- this.input = new inputView(input);
- // only renders after wards
- this.$('#inputField').append(this.input.render().el);
- },
-
- submit: function(e) {
- e.stopPropagation();
- // TODO: load next task
-
- this.model.set('result', this.input.getVal());
- var self = this;
- this.model.save({success: function() {
- self.hide();
- }});
-
- this.input.clear();
- },
-
- onShow: function() {
- this.input.focus();
- },
-
- onHide: function() {
- this.input.destroy();
- }
- });
- }); \ No newline at end of file
diff --git a/module/web/static/js/views/settings/configSectionView.js b/module/web/static/js/views/settings/configSectionView.js
deleted file mode 100644
index 14ce4a0b9..000000000
--- a/module/web/static/js/views/settings/configSectionView.js
+++ /dev/null
@@ -1,97 +0,0 @@
-define(['jquery', 'underscore', 'backbone', 'app', '../abstract/itemView', '../input/inputLoader'],
- function($, _, Backbone, App, itemView, load_input) {
-
- // Renders settings over view page
- return itemView.extend({
-
- tagName: 'div',
-
- template: _.compile($("#template-config").html()),
- templateItem: _.compile($("#template-config-item").html()),
-
- // Will only render one time with further attribute updates
- rendered: false,
-
- events: {
- 'click .btn-primary': 'submit',
- 'click .btn-reset': 'reset'
- },
-
- initialize: function() {
- this.listenTo(this.model, 'destroy', this.destroy);
- },
-
- render: function() {
- if (!this.rendered) {
- this.$el.html(this.template(this.model.toJSON()));
-
- // initialize the popover
- this.$('.page-header a').popover({
- placement: 'left',
-// trigger: 'hover'
- });
-
- var container = this.$('.control-content');
- var self = this;
- _.each(this.model.get('items'), function(item) {
- var el = $('<div>').html(self.templateItem(item.toJSON()));
- var inputView = load_input(item.get('input'));
- var input = new inputView(item.get('input'), item.get('value'),
- item.get('default_value'), item.get('description')).render();
- item.set('inputView', input);
-
- self.listenTo(input, 'change', _.bind(self.render, self));
- el.find('.controls').append(input.el);
- container.append(el);
- });
- this.rendered = true;
- }
- // Enable button if something is changed
- if (this.model.hasChanges())
- this.$('.btn-primary').removeClass('disabled');
- else
- this.$('.btn-primary').addClass('disabled');
-
- // Mark all inputs that are modified
- _.each(this.model.get('items'), function(item) {
- var input = item.get('inputView');
- var el = input.$el.parent().parent();
- if (item.isChanged())
- el.addClass('info');
- else
- el.removeClass('info');
- });
-
- return this;
- },
-
- onDestroy: function(){
- // TODO: correct cleanup after building up so many views and models
- },
-
- submit: function(e) {
- e.stopPropagation();
- // TODO: success / failure popups
- var self = this;
- this.model.save({success: function(){
- self.render();
- App.settingsView.refresh();
- }});
-
- },
-
- reset: function(e) {
- e.stopPropagation();
- // restore the original value
- _.each(this.model.get('items'), function(item) {
- if (item.has('inputView')) {
- var input = item.get('inputView');
- input.setVal(item.get('value'));
- input.render();
- }
- });
- this.render();
- }
-
- });
- }); \ No newline at end of file
diff --git a/module/web/static/js/views/settings/pluginChooserModal.js b/module/web/static/js/views/settings/pluginChooserModal.js
deleted file mode 100644
index 65c412d9c..000000000
--- a/module/web/static/js/views/settings/pluginChooserModal.js
+++ /dev/null
@@ -1,65 +0,0 @@
-define(['jquery', 'underscore', 'app', 'views/abstract/modalView', 'text!tpl/default/pluginChooserDialog.html', 'select2'],
- function($, _, App, modalView, template) {
- return modalView.extend({
-
- events: {
- 'click .btn-add': 'add'
- },
- template: _.compile(template),
- plugins: null,
- select: null,
-
- initialize: function() {
- // Inherit parent events
- this.events = _.extend({}, modalView.prototype.events, this.events);
- var self = this;
- $.ajax(App.apiRequest('getAvailablePlugins', null, {success: function(data) {
- self.plugins = _.sortBy(data, function(item){return item.name;});
- self.render();
- }}));
- },
-
- onRender: function() {
- // TODO: could be a seperate input type if needed on multiple pages
- if (this.plugins)
- this.select = this.$('#pluginSelect').select2({
- escapeMarkup: function(m) {
- return m;
- },
- formatResult: this.format,
- formatSelection: this.formatSelection,
- data: {results: this.plugins, text: function(item) {
- return item.label;
- }},
- id: function(item) {
- return item.name;
- }
- });
- },
-
- onShow: function() {
- },
-
- onHide: function() {
- },
-
- format: function(data) {
- var s = '<div class="plugin-select" style="background-image: url(icons/' + data.name + '">' + data.label;
- s += "<br><span>" + data.description + "<span></div>";
- return s;
- },
-
- formatSelection: function(data) {
- return '<img class="logo-select" src="icons/' + data.name + '"> ' + data.label;
- },
-
- add: function(e) {
- e.stopPropagation();
- if (this.select) {
- var plugin = this.select.val();
- App.settingsView.openConfig(plugin);
- this.hide();
- }
- }
- });
- }); \ No newline at end of file
diff --git a/module/web/static/js/views/settings/settingsView.js b/module/web/static/js/views/settings/settingsView.js
deleted file mode 100644
index d6f874c47..000000000
--- a/module/web/static/js/views/settings/settingsView.js
+++ /dev/null
@@ -1,170 +0,0 @@
-define(['jquery', 'underscore', 'backbone', 'app', 'models/ConfigHolder', './configSectionView'],
- function($, _, Backbone, App, ConfigHolder, configSectionView) {
-
- // Renders settings over view page
- return Backbone.View.extend({
-
- el: "body",
- templateMenu: _.compile($("#template-menu").html()),
-
- events: {
- 'click .settings-menu li > a': 'change_section',
- 'click .btn-add': 'choosePlugin',
- 'click .iconf-remove': 'deleteConfig'
- },
-
- menu: null,
- selected: null,
- content: null,
- modal: null,
-
- coreConfig: null, // It seems collections are not needed
- pluginConfig: null,
-
- // currently open configHolder
- config: null,
- lastConfig: null,
- isLoading: false,
-
- initialize: function() {
- this.menu = this.$('.settings-menu');
- this.content = this.$('.setting-box > form');
- // set a height with css so animations will work
- this.content.height(this.content.height());
- this.refresh();
-
- console.log("Settings initialized");
- },
-
- refresh: function() {
- var self = this;
- $.ajax(App.apiRequest("getCoreConfig", null, {success: function(data) {
- self.coreConfig = data;
- self.render();
- }}));
- $.ajax(App.apiRequest("getPluginConfig", null, {success: function(data) {
- self.pluginConfig = data;
- self.render();
- }}));
- },
-
- render: function() {
- var plugins = [],
- addons = [];
-
- // separate addons and default plugins
- // addons have an activated state
- _.each(this.pluginConfig, function(item) {
- if (item.activated === null)
- plugins.push(item);
- else
- addons.push(item);
- });
-
- this.menu.html(this.templateMenu({
- core: this.coreConfig,
- plugin: plugins,
- addon: addons
- }));
-
- // mark the selected element
- this.$('li[data-name="' + this.selected + '"]').addClass("active");
- },
-
- openConfig: function(name) {
- // Do nothing when this config is already open
- if (this.config && this.config.get('name') === name)
- return;
-
- this.lastConfig = this.config;
- this.config = new ConfigHolder({name: name});
- this.loading();
-
- var self = this;
- this.config.fetch({success: function() {
- if (!self.isLoading)
- self.show();
-
- }, failure: _.bind(this.failure, this)});
-
- },
-
- loading: function() {
- this.isLoading = true;
- var self = this;
- this.content.fadeOut({complete: function() {
- if (self.config.isLoaded())
- self.show();
-
- self.isLoading = false;
- }});
-
- },
-
- show: function() {
- // TODO animations are bit sloppy
- this.content.css('display', 'block');
- var oldHeight = this.content.height();
-
- // this will destroy the old view
- if (this.lastConfig)
- this.lastConfig.trigger('destroy');
- else
- this.content.empty();
-
- // reset the height
- this.content.css('height', '');
- // append the new element
- this.content.append(new configSectionView({model: this.config}).render().el);
- // get the new height
- var height = this.content.height();
- // set the old height again
- this.content.height(oldHeight);
- this.content.animate({
- opacity: 'show',
- height: height
- });
- },
-
- failure: function() {
- // TODO
- this.config = null;
- },
-
- change_section: function(e) {
- // TODO check for changes
- // TODO move this into render?
-
- var el = $(e.target).closest('li');
-
- this.selected = el.data("name");
- this.openConfig(this.selected);
-
- this.menu.find("li.active").removeClass("active");
- el.addClass("active");
- e.preventDefault();
- },
-
- choosePlugin: function(e) {
- var self = this;
- _.requireOnce(['views/settings/pluginChooserModal'], function(Modal) {
- if (self.modal === null)
- self.modal = new Modal();
-
- self.modal.show();
- });
- },
-
- deleteConfig: function(e) {
- e.stopPropagation();
- var el = $(e.target).parent().parent();
- var name = el.data("name");
- var self = this;
- $.ajax(App.apiRequest("deleteConfig", {plugin: name}, { success: function() {
- self.refresh();
- }}));
-
- }
-
- });
- }); \ No newline at end of file