diff options
Diffstat (limited to 'module/web/static')
| -rw-r--r-- | module/web/static/css/default/settings.less | 5 | ||||
| -rw-r--r-- | module/web/static/js/models/ConfigHolder.js | 10 | ||||
| -rw-r--r-- | module/web/static/js/models/ConfigItem.js | 4 | ||||
| -rw-r--r-- | module/web/static/js/views/configSectionView.js | 75 | ||||
| -rw-r--r-- | module/web/static/js/views/input/inputView.js | 4 | ||||
| -rw-r--r-- | module/web/static/js/views/input/textInput.js | 2 | ||||
| -rw-r--r-- | module/web/static/js/views/settingsView.js | 40 | 
7 files changed, 118 insertions, 22 deletions
| diff --git a/module/web/static/css/default/settings.less b/module/web/static/css/default/settings.less index d7012f17a..2501e2d0d 100644 --- a/module/web/static/css/default/settings.less +++ b/module/web/static/css/default/settings.less @@ -34,6 +34,7 @@  .setting-box {
    border: 10px solid @blueDark;
    box-shadow: 0 0 5px @dark; //  .gradient(bottom, @yellowLightest, @light);
 +  overflow: hidden;
    .page-header {
      margin: 0;
 @@ -43,6 +44,10 @@        margin-top: 5px;
      }
 +    .popover {
 +      font-size: medium;
 +    }
 +
    }
  // Bit wider control labels
 diff --git a/module/web/static/js/models/ConfigHolder.js b/module/web/static/js/models/ConfigHolder.js index 8beb31fb8..abd1b9f0a 100644 --- a/module/web/static/js/models/ConfigHolder.js +++ b/module/web/static/js/models/ConfigHolder.js @@ -39,6 +39,16 @@ define(['jquery', 'backbone', 'underscore', 'app', './ConfigItem'],              isLoaded: function() {                  return this.has('items') || this.has('long_description'); +            }, + +            // check if any of the items has changes +            hasChanges: function() { +                var items = this.get('items'); +                if (!items) return false; +                return _.reduce(items, function(a, b) { +                    return a || b.isChanged(); +                }, false);              } +          });      });
\ No newline at end of file diff --git a/module/web/static/js/models/ConfigItem.js b/module/web/static/js/models/ConfigItem.js index f55bb2b9e..636c28851 100644 --- a/module/web/static/js/models/ConfigItem.js +++ b/module/web/static/js/models/ConfigItem.js @@ -17,6 +17,10 @@ define(['jquery', 'backbone', 'underscore', 'app', 'utils/apitypes'],              // Model Constructor              initialize: function() { +            }, + +            isChanged: function() { +                return this.get('inputView') && this.get('inputView').getVal() !== this.get('value');              }          });      });
\ No newline at end of file diff --git a/module/web/static/js/views/configSectionView.js b/module/web/static/js/views/configSectionView.js new file mode 100644 index 000000000..0bbe61653 --- /dev/null +++ b/module/web/static/js/views/configSectionView.js @@ -0,0 +1,75 @@ +define(['jquery', 'underscore', 'backbone', 'app', './input/inputLoader'], +    function($, _, Backbone, App, load_input) { + +        // Renders settings over view page +        return Backbone.View.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' +                // TODO cancel +            }, + +            initialize: function() { +            }, + +            // TODO: correct cleanup after building up so many views and models +            render: function() { +                if (!this.rendered) { +                    this.$el.html(this.template(this.model.toJSON())); + +                    // TODO: only render one time, rest of the attributes set manually + +                    // 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("todo"); +                        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; +            }, + +            submit: function() { + +            } + +        }); +    });
\ 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 index 56087c516..ed78d2d30 100644 --- a/module/web/static/js/views/input/inputView.js +++ b/module/web/static/js/views/input/inputView.js @@ -22,15 +22,15 @@ define(['jquery', 'backbone', 'underscore'], function($, Backbone, _) {          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 } +//                    delay: { show: 500, hide: 100 }                  });              } diff --git a/module/web/static/js/views/input/textInput.js b/module/web/static/js/views/input/textInput.js index 36cdf9f06..3a6631a0b 100644 --- a/module/web/static/js/views/input/textInput.js +++ b/module/web/static/js/views/input/textInput.js @@ -5,7 +5,7 @@ define(['jquery', 'backbone', 'underscore', './inputView'], function($, Backbone          // TODO          tagName: 'input',          events: { -            'keypress': 'onChange', +            'keyup': 'onChange',              'focus': 'showTooltip',              'focusout': 'hideTooltip'          }, diff --git a/module/web/static/js/views/settingsView.js b/module/web/static/js/views/settingsView.js index 00c4b3739..5350f5a94 100644 --- a/module/web/static/js/views/settingsView.js +++ b/module/web/static/js/views/settingsView.js @@ -1,13 +1,11 @@ -define(['jquery', 'underscore', 'backbone', 'app', './input/inputLoader', 'models/ConfigHolder'], -    function($, _, Backbone, App, load_input, ConfigHolder) { +define(['jquery', 'underscore', 'backbone', 'app', 'models/ConfigHolder', './configSectionView'], +    function($, _, Backbone, App, ConfigHolder, configSectionView) {          // Renders settings over view page          return Backbone.View.extend({              el: "#content",              templateMenu: _.compile($("#template-menu").html()), -            templateConfig: _.compile($("#template-config").html()), -            templateConfigItem: _.compile($("#template-config-item").html()),              events: {                  'click .settings-menu li > a': 'change_section' @@ -23,9 +21,12 @@ define(['jquery', 'underscore', 'backbone', 'app', './input/inputLoader', 'model              config: null,              isLoading: false, +              initialize: function() {                  this.menu = this.$('.settings-menu'); -                this.content = this.$('#settings-form'); +                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"); @@ -80,21 +81,22 @@ define(['jquery', 'underscore', 'backbone', 'app', './input/inputLoader', 'model              },              show: function() { -                // TODO: better refactor in separate views -                this.content.html(this.templateConfig(this.config.toJSON())); -                var container = this.content.find('.control-content'); -                var items = this.config.get('items'); -                var self = this; -                _.each(items, function(item) { -                    var el = $('<div>').html(self.templateConfigItem(item.toJSON())); -                    var inputView = load_input("todo"); -                    el.find('.controls').append( -                        new inputView(item.get('input'), item.get('value'), -                            item.get('default_value'), item.get('description')).render().el); -                    container.append(el); +                // TODO: better cleaning of old views +                var oldHeight = this.content.height(); +                this.content.empty(); +                this.content.css('display', 'block'); +                // 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                  }); - -                this.content.fadeIn();              },              failure: function() { | 
