diff options
Diffstat (limited to 'module/web/static/js/views')
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(' ' + formatTime(this.model.get('eta'))); - } else if (this.model.get('download').status === Api.DownloadStatus.Waiting) { - this.$('.second').html( - "<i class='iconf-time'></i> " + 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 |