Hello community,

here is the log from the commit of package hawk2 for openSUSE:Factory checked 
in at 2016-03-26 15:24:52
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/hawk2 (Old)
 and      /work/SRC/openSUSE:Factory/.hawk2.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "hawk2"

Changes:
--------
--- /work/SRC/openSUSE:Factory/hawk2/hawk2.changes      2016-03-17 
16:49:29.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.hawk2.new/hawk2.changes 2016-03-26 
15:24:55.000000000 +0100
@@ -1,0 +2,20 @@
+Mon Mar 21 08:18:40 UTC 2016 - kgronl...@suse.com
+
+- Update to version 2.0.0+git.1458543074.dc9aa66:
+  + UI: Updated EventControl (bsc#970280)
+  + History: Show timezone for report dates
+  + History: Fix tab memory between transitions
+
+-------------------------------------------------------------------
+Fri Mar 18 12:21:08 UTC 2016 - kgronl...@suse.com
+
+- Update to version 2.0.0+git.1458303640.7745849:
+  + UI: Use EventControl in history explorer (bsc#970280)
+  + Wizard: Fix broken file system category by dehumanizing category names for 
ids
+  + Wizard: Allow more actions without requiring admin access
+  + Simulator: Ignore error RC from crm_simulate if nothing is written to 
stderr
+  + Wizard: Nicer category icons
+  + Reports: Less verbose version string
+  + Deflate assets in production
+
+-------------------------------------------------------------------

Old:
----
  hawk2-2.0.0+git.1457531142.ac2dc9f.tar.bz2

New:
----
  hawk2-2.0.0+git.1458543074.dc9aa66.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ hawk2.spec ++++++
--- /var/tmp/diff_new_pack.lbHr8H/_old  2016-03-26 15:24:56.000000000 +0100
+++ /var/tmp/diff_new_pack.lbHr8H/_new  2016-03-26 15:24:56.000000000 +0100
@@ -35,7 +35,7 @@
 Summary:        HA Web Konsole
 License:        GPL-2.0
 Group:          %{pkg_group}
-Version:        2.0.0+git.1457531142.ac2dc9f
+Version:        2.0.0+git.1458543074.dc9aa66
 Release:        0
 Url:            http://www.clusterlabs.org/wiki/Hawk
 Source:         %{name}-%{version}.tar.bz2
@@ -100,7 +100,7 @@
 BuildRequires:  rubygem(%{rb_default_ruby_abi}:thor) >= 0.19
 BuildRequires:  rubygem(%{rb_default_ruby_abi}:tilt:1.4)
 BuildRequires:  rubygem(%{rb_default_ruby_abi}:uglifier)
-BuildRequires:  rubygem(%{rb_default_ruby_abi}:web-console:2) >= 2.1
+BuildRequires:  rubygem(%{rb_default_ruby_abi}:web-console) >= 2.1
 
 %if 0%{?bundle_gems}
 %else

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.lbHr8H/_old  2016-03-26 15:24:56.000000000 +0100
+++ /var/tmp/diff_new_pack.lbHr8H/_new  2016-03-26 15:24:56.000000000 +0100
@@ -1,4 +1,4 @@
 <servicedata>
 <service name="tar_scm">
             <param name="url">git://github.com/ClusterLabs/hawk.git</param>
-          <param 
name="changesrevision">ac2dc9f0c0507c688a2b5732cad7bbd1e5f33c85</param></service></servicedata>
\ No newline at end of file
+          <param 
name="changesrevision">dc9aa660b415aeff726ac9f3dcac441c8fdc7281</param></service></servicedata>
\ No newline at end of file

++++++ hawk2-2.0.0+git.1457531142.ac2dc9f.tar.bz2 -> 
hawk2-2.0.0+git.1458543074.dc9aa66.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hawk2-2.0.0+git.1457531142.ac2dc9f/.travis.yml 
new/hawk2-2.0.0+git.1458543074.dc9aa66/.travis.yml
--- old/hawk2-2.0.0+git.1457531142.ac2dc9f/.travis.yml  2016-03-09 
14:47:38.000000000 +0100
+++ new/hawk2-2.0.0+git.1458543074.dc9aa66/.travis.yml  2016-03-21 
09:18:34.000000000 +0100
@@ -8,11 +8,14 @@
     - rails-3_2
 
 rvm:
-  - "2.1.8"
   - "2.2.4"
   - "2.3.0"
 
 gemfile: hawk/Gemfile
 script: sh -c 'cd hawk && bin/rake brakeman:run test'
 notifications:
-  irc: "chat.freenode.net#clusterlabs-dev"
+  irc:
+    channels:
+      - "chat.freenode.net#clusterlabs-dev"
+    on_success: never
+    on_failure: change
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/Gemfile 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/Gemfile
--- old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/Gemfile 2016-03-09 
14:47:38.000000000 +0100
+++ new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/Gemfile 2016-03-21 
09:18:34.000000000 +0100
@@ -30,7 +30,7 @@
 gem "kramdown", ">= 1.3.3"
 
 group :development do
-  gem "web-console", "~> 2.1"
+  gem "web-console", ">= 2.1"
   gem "spring", "~> 1.3"
   gem "ruby_parser", "~> 3.6"
   gem "uglifier"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/assets/javascripts/module/basics.js
 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/assets/javascripts/module/basics.js
--- 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/assets/javascripts/module/basics.js
 2016-03-09 14:47:38.000000000 +0100
+++ 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/assets/javascripts/module/basics.js
 2016-03-21 09:18:34.000000000 +0100
@@ -28,6 +28,15 @@
     $('.nav-wrapper').toggleClass('active')
   });
 
+  $.urlParam = function(name){
+         var results = new RegExp('[\?&]' + name + 
'=([^&#]*)').exec(window.location.href);
+    if (results && results.length >= 1) {
+           return results[1];
+    } else {
+      return undefined;
+    }
+  };
+
   $.growl(
     false,
     {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/assets/javascripts/module/reports.js
 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/assets/javascripts/module/reports.js
--- 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/assets/javascripts/module/reports.js
        2016-03-09 14:47:38.000000000 +0100
+++ 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/assets/javascripts/module/reports.js
        2016-03-21 09:18:34.000000000 +0100
@@ -2,7 +2,7 @@
 // See COPYING for license.
 
 $(function() {
-  var time_format_string = 'YYYY-MM-DD H:mm';
+  var time_format_string = 'YYYY-MM-DD HH:mm Z';
   var REFRESH_INTERVAL = 5000;
   var running_timeout = null;
 
@@ -396,29 +396,78 @@
       });
   });
 
-  $('#reports #report-show').each(function() {
-    var report_id = $(this).data('report');
-    $(this).find('#cancel-report-loading').on('click', function(e) {
-      location.href = Routes.reports_path();
+  function afterDisplay(self) {
+    var data = $('#reports #transition-data');
+    var report = data.data('report');
+    var transitions = $.parseJSON(data.text());
+
+    $.each(transitions, function(i, item) {
+      item.index = i;
     });
-    $.ajax({
-      url: Routes.display_report_path({id: report_id}),
-      dataType: "html",
-      success: function(data) {
-        $('#reports #report-show').html(data);
-      }
+
+    var last_popover_element = null;
+
+    $('#reports #eventcontrol').EventControl({
+      data: transitions,
+      onhover: function(item, element, event, inout) {
+        if (inout == 'in') {
+          element.data('title', item.basename);
+          element.data('content', 
moment(item.timestamp).format(time_format_string));
+
+          if (last_popover_element != element) {
+            if (last_popover_element != null) {
+              last_popover_element.popover('destroy');
+            }
+            element.popover({
+              placement: 'top',
+              container: 'body'
+            });
+            last_popover_element = element;
+          }
+          element.popover('show');
+        } else {
+          element.popover('hide');
+        }
+      },
+      oncreate: function(item, element) {
+        if (parseInt($.urlParam('transition')) == item.index + 1) {
+          element.css('color', '#94FB23');
+        } else if (item.basename.indexOf('error') > -1) {
+          element.addClass('text-danger');
+        } else if (item.basename.indexOf('warn') > -1) {
+          element.addClass('text-warning');
+        } else if (item.basename.indexOf('input') > -1) {
+          element.addClass('text-info');
+        }
+      },
+      onclick: function(item, element, event) {
+        Cookies.set("hawk-eventcontrol", {report: report, state: 
this.save_state()});
+        var hash = location.hash;
+        if (!hash) {
+          hash = '';
+        }
+        location.href = Routes.display_report_path(report, {transition: 
item.index + 1}) + hash;
+      },
     });
-  });
 
-  $('#reports #report-display').each(function() {
-    $(this).find('.dropdown-toggle').dropdown();
+    $('#reports #middle .panel-heading .btn').each(function(index, link) {
+          var a = $(link)
+          a.attr('href', a.attr('href').split('#')[0] + location.hash);
+    });
+
+    var state = Cookies.getJSON('hawk-eventcontrol');
+    if (state && "report" in state && "state" in state && state.report == 
report) {
+      $('#reports #eventcontrol').EventControl(state.state);
+    }
+
+    self.find('.dropdown-toggle').dropdown();
 
-    $(this).find('.remote a[data-toggle="tab"]')
+    self.find('.remote a[data-toggle="tab"]')
       .on('show.bs.tab', function(e) {
         var hash = this.hash;
         var target = $(e.target);
 
-        $('#reports #middle .iterator a').each(function(index, link) {
+        $('#reports #middle .panel-heading .btn').each(function(index, link) {
           var $link = $(link)
 
           $link.attr(
@@ -455,7 +504,7 @@
         });
       });
 
-    $(this).find('.remote li.active 
a[data-toggle="tab"]').each(function(index, link) {
+    self.find('.remote li.active a[data-toggle="tab"]').each(function(index, 
link) {
       var hash = this.hash;
       var target = $(link);
 
@@ -496,5 +545,24 @@
         }
       });
     });
+  }
+
+  $('#reports #report-show').each(function() {
+    var report_id = $(this).data('report');
+    $(this).find('#cancel-report-loading').on('click', function(e) {
+      location.href = Routes.reports_path();
+    });
+    $.ajax({
+      url: Routes.display_report_path({id: report_id}),
+      dataType: "html",
+      success: function(data) {
+        $('#reports #report-show').replaceWith(data);
+        afterDisplay($('#reports #report-display'));
+      }
+    });
+  });
+
+  $('#reports #report-display').each(function() {
+    afterDisplay($(this));
   });
 });
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/assets/stylesheets/application/_content.scss
 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/assets/stylesheets/application/_content.scss
--- 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/assets/stylesheets/application/_content.scss
        2016-03-09 14:47:38.000000000 +0100
+++ 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/assets/stylesheets/application/_content.scss
        2016-03-21 09:18:34.000000000 +0100
@@ -138,3 +138,7 @@
     }
   }
 }
+
+.breather {
+    margin-top: 10px;
+}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/controllers/reports_controller.rb
 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/controllers/reports_controller.rb
--- 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/controllers/reports_controller.rb
   2016-03-09 14:47:38.000000000 +0100
+++ 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/controllers/reports_controller.rb
   2016-03-21 09:18:34.000000000 +0100
@@ -377,7 +377,7 @@
     if t.nil?
       ''
     else
-      t.strftime('%F %R')
+      t.strftime('%F %R %Z')
     end
   end
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/controllers/simulator_controller.rb
 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/controllers/simulator_controller.rb
--- 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/controllers/simulator_controller.rb
 2016-03-09 14:47:38.000000000 +0100
+++ 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/controllers/simulator_controller.rb
 2016-03-21 09:18:34.000000000 +0100
@@ -58,7 +58,11 @@
                 "-G", "#{Rails.root}/tmp/sim.graph",
                 "-D", "#{Rails.root}/tmp/sim.dot",
                 *injections)
-    if status != 0
+    # FIXME: Return value of crm_simulate is
+    # completely unpredictable and nonsensical,
+    # so only presume it's an error if there's
+    # actually output on stderr.
+    if status != 0 && !err.blank?
       render json: { error: err }, status: 500
       return
     end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/helpers/wizard_helper.rb 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/helpers/wizard_helper.rb
--- old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/helpers/wizard_helper.rb    
2016-03-09 14:47:38.000000000 +0100
+++ new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/helpers/wizard_helper.rb    
2016-03-21 09:18:34.000000000 +0100
@@ -49,12 +49,18 @@
     case wizard
     when "database"
       "database"
-    when "filesystem"
+    when "file system"
       "hdd-o"
+    when "nfs"
+      "globe"
     when "server"
       "server"
-    else
+    when "stonith"
+      "plug"
+    when "wizard"
       "list"
+    else
+      "magic"
     end
   end
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/models/report.rb 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/models/report.rb
--- old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/models/report.rb    
2016-03-09 14:47:38.000000000 +0100
+++ new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/models/report.rb    
2016-03-21 09:18:34.000000000 +0100
@@ -60,9 +60,8 @@
           next unless File.exist?(path)
           v = peinput_version path
           if v && v != pcmk_version
-            version = _("PE Input created by different Pacemaker version 
(%{version})") % { version: v }
-          elsif v != pcmk_version
-            version = _("Pacemaker version not present in PE Input")
+          # version = _("PE Input created by different Pacemaker version 
(%{version})") % { version: v }
+            version = v
           else
             version = nil
           end
@@ -123,6 +122,7 @@
 
   def tags(hb_report, path)
     out, _err, _status = transition_cmd hb_report, "transition tags #{path}"
+    return [] if out == "No tags.\n"
     out.split
   end
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/models/wizard.rb 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/models/wizard.rb
--- old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/models/wizard.rb    
2016-03-09 14:47:38.000000000 +0100
+++ new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/models/wizard.rb    
2016-03-21 09:18:34.000000000 +0100
@@ -72,8 +72,9 @@
       return false if action['name'] == 'cib'
       if action['name'] == 'crm'
         t = (action['text'] || '').split.first || ''
-        return false if ['configure', 'resource'].any? { |c| c == t }
+        return false if ['configure', 'resource', 'cib'].any? { |c| c == t }
       end
+      return false if action['name'] == 'call' && action['sudo'].nil?
       true
     end
   end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/views/reports/display.html.haml 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/views/reports/display.html.haml
--- 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/views/reports/display.html.haml 
    2016-03-09 14:47:38.000000000 +0100
+++ 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/views/reports/display.html.haml 
    2016-03-21 09:18:34.000000000 +0100
@@ -53,41 +53,17 @@
     .row
       .panel.panel-default
         .panel-heading
-          %ul.nav.nav-pills.nav-justified.iterator
-            %li{ role: "presentation", class: current_transition == 
first_transition ? "disabled" : nil }
-              = link_to _("Previous"), url_for(transition: prev_transition)
-
-            - window_transition.each do |transition|
-              %li{ role: "presentation", class: current_transition == 
transition ? "active" : nil }
-                - if transition == "begin"
-                  .dropdown
-                    %button#dropdownBegin.btn.dropdown-toggle{type: :button, 
data: { toggle: "dropdown" }, aria: { haspopup: true, expanded: true } }
-                      .text-center
-                        %strong
-                          = '... <span class="caret"></span>'.html_safe
-                    %ul#collapsed.dropdown-menu{ aria: { labelledby: 
"dropdownBegin" } }
-                      - prev_transitions.each do |n|
-                        %li= link_to n, url_for(transition: n), title: 
transition_tooltip(n), data: { toggle: :tooltip }
-                      %li.divider{role: :separator}
-                      - lt = first_transition
-                      %li.text-center= link_to icon_tag('fast-backward'), 
url_for(transition: lt), title: transition_tooltip(lt), data: { toggle: 
:tooltip }
-                - elsif transition == "end"
-                  .dropdown
-                    %button#dropdownEnd.btn.dropdown-toggle{type: :button, 
data: { toggle: "dropdown" }, aria: { haspopup: true, expanded: true } }
-                      .text-center
-                        %strong
-                          = '... <span class="caret"></span>'.html_safe
-                    %ul#collapsed.dropdown-menu{ aria: { labelledby: 
"dropdownEnd" } }
-                      - next_transitions.each do |n|
-                        %li= link_to n, url_for(transition: n), title: 
transition_tooltip(n), data: { toggle: :tooltip }
-                      %li.divider{role: :separator}
-                      - lt = last_transition
-                      %li.text-center= link_to icon_tag('fast-forward'), 
url_for(transition: lt), title: transition_tooltip(lt), data: { toggle: 
:tooltip }
-                - else
-                  = link_to transition, url_for(transition: transition), 
title: transition_tooltip(transition), data: { toggle: :tooltip }
-
-            %li{ role: "presentation", class: current_transition == 
last_transition ? "disabled" : nil }
-              = link_to _("Next"), url_for(transition: next_transition)
+          #eventcontrol.eventcontrol
+          .row.clearfix.breather
+            .col-md-4
+              .pull-left
+                = link_to icon_tag("step-backward"), url_for(transition: 
prev_transition), class: 'btn btn-xs btn-primary'
+            .col-md-4.col-md-offset-4
+              .pull-right
+                = link_to icon_tag("step-forward"), url_for(transition: 
next_transition), class: 'btn btn-xs btn-primary'
+          %script#transition-data{type: "application/json", data: { report: 
@report.id, current: current_transition } }
+            :plain
+              #{@transitions.to_json}
         - unless @transition.nil?
           .panel-body
             %dl.dl-horizontal
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/views/wizards/index.html.haml 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/views/wizards/index.html.haml
--- 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/app/views/wizards/index.html.haml   
    2016-03-09 14:47:38.000000000 +0100
+++ 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/app/views/wizards/index.html.haml   
    2016-03-21 09:18:34.000000000 +0100
@@ -7,7 +7,7 @@
     %ul.nav.nav-pills.nav-stacked.nav-bighelp.nav-topspace{ data: { 
help_target: "#rightbar > .rightbar_help > *" } }
       - wizard_categories(@wizards).each do |category|
         %li.toggable.btn.btn-default.btn-lg
-          %span{ href: "##{category}", data: { toggle: "collapse", parent: 
".nav-bighelp" } }
+          %span{ href: "##{category.dehumanize}", data: { toggle: "collapse", 
parent: ".nav-bighelp" } }
             .pull-right
               = icon_tag "chevron-down"
 
@@ -16,7 +16,7 @@
             - else
               = icon_text wizard_icon(category), category.titleize
 
-          %ul.nav.nav-pills.nav-stacked.collapse{ id: category }
+          %ul.nav.nav-pills.nav-stacked.collapse{ id: category.dehumanize }
             - @wizards.sort_by(&:name).each do |wizard|
               - next unless wizard.category.eql?(category)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/config/environments/production.rb 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/config/environments/production.rb
--- 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/config/environments/production.rb   
    2016-03-09 14:47:38.000000000 +0100
+++ 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/config/environments/production.rb   
    2016-03-21 09:18:34.000000000 +0100
@@ -26,6 +26,8 @@
   # config.active_record.migration_error = :page_load
   # config.active_record.dump_schema_after_migration = false
 
+  config.middleware.insert_before ActionDispatch::Static, Rack::Deflater
+
   config.cache_store = :memory_store
 
   config.assets.debug = false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/config/initializers/inflections.rb 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/config/initializers/inflections.rb
--- 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/config/initializers/inflections.rb  
    2016-03-09 14:47:38.000000000 +0100
+++ 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/config/initializers/inflections.rb  
    2016-03-21 09:18:34.000000000 +0100
@@ -14,4 +14,21 @@
   inflect.acronym "OCFS2"
   inflect.acronym "cLVM"
   inflect.acronym "CIDR"
+  inflect.acronym "SBD"
+  inflect.acronym "QA"
+end
+
+module ActiveSupport::Inflector
+  # does the opposite of humanize ... mostly.
+  # Basically does a space-substituting .underscore
+  def dehumanize(the_string)
+    result = the_string.to_s.dup
+    result.downcase.gsub(/ +/,'_')
+  end
+end
+
+class String
+  def dehumanize
+    ActiveSupport::Inflector.dehumanize(self)
+  end
 end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/vendor/assets/javascripts/jquery/mousewheel.js
 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/vendor/assets/javascripts/jquery/mousewheel.js
--- 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/vendor/assets/javascripts/jquery/mousewheel.js
  1970-01-01 01:00:00.000000000 +0100
+++ 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/vendor/assets/javascripts/jquery/mousewheel.js
  2016-03-21 09:18:34.000000000 +0100
@@ -0,0 +1,221 @@
+/*!
+ * jQuery Mousewheel 3.1.13
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ */
+
+(function (factory) {
+    if ( typeof define === 'function' && define.amd ) {
+        // AMD. Register as an anonymous module.
+        define(['jquery'], factory);
+    } else if (typeof exports === 'object') {
+        // Node/CommonJS style for Browserify
+        module.exports = factory;
+    } else {
+        // Browser globals
+        factory(jQuery);
+    }
+}(function ($) {
+
+    var toFix  = ['wheel', 'mousewheel', 'DOMMouseScroll', 
'MozMousePixelScroll'],
+        toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?
+                    ['wheel'] : ['mousewheel', 'DomMouseScroll', 
'MozMousePixelScroll'],
+        slice  = Array.prototype.slice,
+        nullLowestDeltaTimeout, lowestDelta;
+
+    if ( $.event.fixHooks ) {
+        for ( var i = toFix.length; i; ) {
+            $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;
+        }
+    }
+
+    var special = $.event.special.mousewheel = {
+        version: '3.1.12',
+
+        setup: function() {
+            if ( this.addEventListener ) {
+                for ( var i = toBind.length; i; ) {
+                    this.addEventListener( toBind[--i], handler, false );
+                }
+            } else {
+                this.onmousewheel = handler;
+            }
+            // Store the line height and page height for this particular 
element
+            $.data(this, 'mousewheel-line-height', 
special.getLineHeight(this));
+            $.data(this, 'mousewheel-page-height', 
special.getPageHeight(this));
+        },
+
+        teardown: function() {
+            if ( this.removeEventListener ) {
+                for ( var i = toBind.length; i; ) {
+                    this.removeEventListener( toBind[--i], handler, false );
+                }
+            } else {
+                this.onmousewheel = null;
+            }
+            // Clean up the data we added to the element
+            $.removeData(this, 'mousewheel-line-height');
+            $.removeData(this, 'mousewheel-page-height');
+        },
+
+        getLineHeight: function(elem) {
+            var $elem = $(elem),
+                $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 
'parent']();
+            if (!$parent.length) {
+                $parent = $('body');
+            }
+            return parseInt($parent.css('fontSize'), 10) || 
parseInt($elem.css('fontSize'), 10) || 16;
+        },
+
+        getPageHeight: function(elem) {
+            return $(elem).height();
+        },
+
+        settings: {
+            adjustOldDeltas: true, // see shouldAdjustOldDeltas() below
+            normalizeOffset: true  // calls getBoundingClientRect for each 
event
+        }
+    };
+
+    $.fn.extend({
+        mousewheel: function(fn) {
+            return fn ? this.bind('mousewheel', fn) : 
this.trigger('mousewheel');
+        },
+
+        unmousewheel: function(fn) {
+            return this.unbind('mousewheel', fn);
+        }
+    });
+
+
+    function handler(event) {
+        var orgEvent   = event || window.event,
+            args       = slice.call(arguments, 1),
+            delta      = 0,
+            deltaX     = 0,
+            deltaY     = 0,
+            absDelta   = 0,
+            offsetX    = 0,
+            offsetY    = 0;
+        event = $.event.fix(orgEvent);
+        event.type = 'mousewheel';
+
+        // Old school scrollwheel delta
+        if ( 'detail'      in orgEvent ) { deltaY = orgEvent.detail * -1;      
}
+        if ( 'wheelDelta'  in orgEvent ) { deltaY = orgEvent.wheelDelta;       
}
+        if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY;      
}
+        if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; 
}
+
+        // Firefox < 17 horizontal scrolling related to DOMMouseScroll event
+        if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS 
) {
+            deltaX = deltaY * -1;
+            deltaY = 0;
+        }
+
+        // Set delta to be deltaY or deltaX if deltaY is 0 for backwards 
compatabilitiy
+        delta = deltaY === 0 ? deltaX : deltaY;
+
+        // New school wheel delta (wheel event)
+        if ( 'deltaY' in orgEvent ) {
+            deltaY = orgEvent.deltaY * -1;
+            delta  = deltaY;
+        }
+        if ( 'deltaX' in orgEvent ) {
+            deltaX = orgEvent.deltaX;
+            if ( deltaY === 0 ) { delta  = deltaX * -1; }
+        }
+
+        // No change actually happened, no reason to go any further
+        if ( deltaY === 0 && deltaX === 0 ) { return; }
+
+        // Need to convert lines and pages to pixels if we aren't already in 
pixels
+        // There are three delta modes:
+        //   * deltaMode 0 is by pixels, nothing to do
+        //   * deltaMode 1 is by lines
+        //   * deltaMode 2 is by pages
+        if ( orgEvent.deltaMode === 1 ) {
+            var lineHeight = $.data(this, 'mousewheel-line-height');
+            delta  *= lineHeight;
+            deltaY *= lineHeight;
+            deltaX *= lineHeight;
+        } else if ( orgEvent.deltaMode === 2 ) {
+            var pageHeight = $.data(this, 'mousewheel-page-height');
+            delta  *= pageHeight;
+            deltaY *= pageHeight;
+            deltaX *= pageHeight;
+        }
+
+        // Store lowest absolute delta to normalize the delta values
+        absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );
+
+        if ( !lowestDelta || absDelta < lowestDelta ) {
+            lowestDelta = absDelta;
+
+            // Adjust older deltas if necessary
+            if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
+                lowestDelta /= 40;
+            }
+        }
+
+        // Adjust older deltas if necessary
+        if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
+            // Divide all the things by 40!
+            delta  /= 40;
+            deltaX /= 40;
+            deltaY /= 40;
+        }
+
+        // Get a whole, normalized value for the deltas
+        delta  = Math[ delta  >= 1 ? 'floor' : 'ceil' ](delta  / lowestDelta);
+        deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);
+        deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);
+
+        // Normalise offsetX and offsetY properties
+        if ( special.settings.normalizeOffset && this.getBoundingClientRect ) {
+            var boundingRect = this.getBoundingClientRect();
+            offsetX = event.clientX - boundingRect.left;
+            offsetY = event.clientY - boundingRect.top;
+        }
+
+        // Add information to the event object
+        event.deltaX = deltaX;
+        event.deltaY = deltaY;
+        event.deltaFactor = lowestDelta;
+        event.offsetX = offsetX;
+        event.offsetY = offsetY;
+        // Go ahead and set deltaMode to 0 since we converted to pixels
+        // Although this is a little odd since we overwrite the deltaX/Y
+        // properties with normalized deltas.
+        event.deltaMode = 0;
+
+        // Add event and delta to the front of the arguments
+        args.unshift(event, delta, deltaX, deltaY);
+
+        // Clearout lowestDelta after sometime to better
+        // handle multiple device types that give different
+        // a different lowestDelta
+        // Ex: trackpad = 3 and mouse wheel = 120
+        if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }
+        nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);
+
+        return ($.event.dispatch || $.event.handle).apply(this, args);
+    }
+
+    function nullLowestDelta() {
+        lowestDelta = null;
+    }
+
+    function shouldAdjustOldDeltas(orgEvent, absDelta) {
+        // If this is an older event and the delta is divisable by 120,
+        // then we are assuming that the browser is treating this as an
+        // older mouse wheel event and that we should divide the deltas
+        // by 40 to try and get a more usable deltaFactor.
+        // Side note, this actually impacts the reported scroll distance
+        // in older browsers and can cause scrolling to be slower than native.
+        // Turn this off by setting 
$.event.special.mousewheel.settings.adjustOldDeltas to false.
+        return special.settings.adjustOldDeltas && orgEvent.type === 
'mousewheel' && absDelta % 120 === 0;
+    }
+
+}));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/vendor/assets/javascripts/misc/eventcontrol.js
 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/vendor/assets/javascripts/misc/eventcontrol.js
--- 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/vendor/assets/javascripts/misc/eventcontrol.js
  1970-01-01 01:00:00.000000000 +0100
+++ 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/vendor/assets/javascripts/misc/eventcontrol.js
  2016-03-21 09:18:34.000000000 +0100
@@ -0,0 +1,455 @@
+// Copyright (c) 2016 Kristoffer Gronlund <kgronl...@suse.com>
+// See COPYING for license.
+
+(function($) {
+  function unit_in_timespan(h, min_time, timespan) {
+    var s = min_time - (min_time % h);
+    var e = min_time + timespan;
+    if (h > 15*60*1000) {
+      s -= 3600*1000;
+    }
+    var r = [s];
+    while (s < e) {
+      s += h;
+      if (s >= min_time && s <= e) {
+        r.push(s);
+      }
+    }
+    if (r.length > 20) {
+      r = r.slice(0, 20);
+    }
+    return r;
+  }
+
+  var MIN_SPAN = 10000;
+  var MAX_SPAN = 1000 * 3600 * 24 * 365 * 100;
+  var MAJSPANS = [4*365*24*3600*1000, 365*24*3600*1000, 120*24*3600*1000, 
42*24*3600*1000, 28*24*3600*1000, 21*24*3600*1000, 14*24*3600*1000, 
10*24*3600*1000];
+  var MAJUNITS = [365*24*3600*1000, 120*24*3600*1000, 31*24*3600*1000, 
21*24*3600*1000, 14*24*3600*1000, 7*24*3600*1000, 4*24*3600*1000, 
2*24*3600*1000];
+  var MINSPANS = [3*24*3600*1000, 2*24*3600*1000, 24*3600*1000, 12*3600*1000, 
6*3600*1000, 3*3600*1000,  3600*1000, 45*60*1000, 30*60*1000, 20*60*1000, 
10*60*1000, 5*60*1000, 3*60*1000, 60*1000, 45*1000, 20*1000, 12*1000, 0];
+  var MINUNITS = [  12*3600*1000,    6*3600*1000,  4*3600*1000,  3*3600*1000,  
 3600*1000,  30*60*1000, 15*60*1000,  5*60*1000,  4*60*1000,  3*60*1000,  
2*60*1000,   60*1000,   30*1000, 15*1000, 10*1000,  5*1000,  2*1000, 1000];
+
+  var EventControl = function(element, options) {
+    this.settings = $.extend({
+      onhover: function(item, element, event, inout) {},
+      onclick: function(item, element, event) {},
+      oncreate: function(item, element) {},
+      data: [],
+      hammertime: false,
+      items_height: 101,
+      markers_height: 31
+    }, options);
+
+    this.element = element;
+    this.width = element.width();
+
+    this.items_h = this.settings.items_height;
+    this.markers_h = this.settings.markers_height;
+    this._dragging = null;
+    this._drag_x = 0;
+
+    element.addClass('eventcontrol');
+    element.append(['<div class="ec-items ec-draggable" 
style="top:0px;height:', this.items_h, 'px;"></div>',
+                    '<div class="ec-markers ec-draggable" style="top:', 
(this.items_h + 1), 'px;height:', this.markers_h, 'px;">',
+                    '<div class="ec-ticks"></div>',
+                    '<div class="ec-labels"></div>',
+                    '</div>'
+                   ].join(''));
+
+    this.items = element.children('.ec-items');
+    this.markers = element.children('.ec-markers');
+    this.ticks = this.markers.children('.ec-ticks');
+    this.labels = this.markers.children('.ec-labels');
+    this.min_time = moment("2070-01-01");
+    this.max_time = moment("1970-01-01");
+    this.timespan = MAX_SPAN;
+    this.max_timespan = MAX_SPAN;
+    this.center_time = this.min_time.valueOf() + MAX_SPAN * 0.5;
+    this.init();
+    return this;
+  };
+
+  EventControl.prototype.init = function() {
+    var self = this;
+    var element = this.element;
+
+    function stop_dragging() {
+      element.children('.ec-draggable').removeClass('ec-dragging');
+      self._dragging = null;
+    }
+
+    function pan_with_delta(dragdelta, min_time, max_time) {
+      if (dragdelta > 0.9) {
+        dragdelta = 0.9;
+      } else if (dragdelta < -0.9) {
+        dragdelta = -0.9;
+      }
+      var time_offset = dragdelta * self.timespan;
+      var new_min_time = moment(min_time + time_offset);
+      var new_max_time = moment(max_time + time_offset);
+      if (!new_min_time.isSame(self.min_time) || 
new_max_time.isSame(self.max_time)) {
+        self.update_timespan(new_min_time, new_max_time);
+      }
+    }
+
+    if (self.settings.hammertime) {
+      self.mc = new Hammer.Manager(self.element.get()[0]);
+      self.mc.add(new Hammer.Pan());
+      // Tap recognizer with minimal 2 taps
+      self.mc.add( new Hammer.Tap({ event: 'doubletap', taps: 2 }) );
+      // Single tap recognizer
+      self.mc.add( new Hammer.Tap({ event: 'singletap' }) );
+      self.mc.get('doubletap').recognizeWith('singletap');
+      // we only want to trigger a tap, when we don't have detected a doubletap
+      self.mc.get('singletap').requireFailure('doubletap');
+
+      self.mc.on("panstart panleft panright singletap doubletap tap", 
function(e) {
+        if (e.type == "singletap") {
+          var tgt = $(e.target);
+          if (tgt.hasClass('ec-dot')) {
+            self.settings.onclick.call(self, tgt.data('event'), tgt, e);
+          }
+        } else if (e.type == "panstart") {
+          self._pan_min_time = self.min_time.valueOf();
+          self._pan_max_time = self.max_time.valueOf();
+        } else if (e.type == "panleft" || e.type == "panright") {
+          var deltapx = -e.deltaX;
+          var dragdelta = deltapx / self.width;
+
+          pan_with_delta(dragdelta, self._pan_min_time, self._pan_max_time);
+        } else if (e.type == "doubletap") {
+          var base = element.offset();
+          var dir = 1;
+          var offset = (e.center.x - base.left) / self.width;
+          self.zoom(dir, offset);
+        } else {
+          console.log("Unexpected hammer event", e.type);
+        }
+      });
+
+    } else {
+      element.on('click', function(e) {
+        var tgt = $(e.target);
+        if (tgt.hasClass('ec-dot')) {
+          self.settings.onclick.call(self, tgt.data('event'), tgt, e);
+        }
+      });
+
+      element.mousedown(function(e) {
+        if (e.which == 1) {
+          element.children('.ec-draggable').addClass('ec-dragging');
+          self._dragging = true;
+          self._drag_x = e.pageX;
+          self._drag_min_time = self.min_time.valueOf();
+          self._drag_max_time = self.max_time.valueOf();
+          return false;
+        }
+      });
+
+      $('body').mouseup(function(e) {
+        if (e.which == 1) {
+          stop_dragging();
+        }
+      });
+
+      $('body').on("dragend",function(){
+        stop_dragging();
+      });
+
+      $('body').mousemove(function(e) {
+        if (e.which == 1 && self._dragging) {
+          var deltapx = -(e.pageX - self._drag_x);
+          var dragdelta = deltapx / self.width;
+          pan_with_delta(dragdelta, self._drag_min_time, self._drag_max_time);
+        }
+      });
+    }
+
+    $(window).resize(function() {
+      if (!self._dirty) {
+        if (self.min_time && self.max_time) {
+          self._dirty = true;
+          window.setTimeout(function() {
+            var mit = self.min_time.clone();
+            var mat = self.max_time.clone();
+            self.update_timespan(mit, mat);
+          }, 400);
+        }
+      }
+    });
+
+    element.on('mousewheel', function(event) {
+      event.preventDefault();
+      var dir = event.deltaY;
+      var base = element.offset();
+      var offset = (event.pageX - base.left) / self.width;
+      self.zoom(dir, offset);
+    });
+
+    $.each(self.settings.data, function(i, item) {
+      self.items.append('<div class="ec-dot" 
style="left:0px;top:0px;"></div>');
+      var elem = self.items.children('.ec-dot:last-child');
+      elem.data('event', item);
+      item._starttime = moment(item.timestamp).valueOf();
+
+      self.settings.oncreate.call(self, item, elem);
+
+      elem.hover(function(event) {
+        self.settings.onhover.call(self, item, elem, event, 'in');
+      }, function(event) {
+        self.settings.onhover.call(self, item, elem, event, 'out');
+      });
+
+      var t = moment(item.timestamp);
+      if (t < self.min_time) {
+        self.min_time = t.clone();
+      }
+      if (t > self.max_time) {
+        self.max_time = t;
+      }
+    });
+
+    self.min_time.subtract(5, 's');
+    self.max_time.add(5, 's');
+    self.center_time = self.min_time.valueOf() + (self.max_time.valueOf() - 
self.min_time.valueOf()) * 0.5;
+
+    self.update_timespan(self.min_time.clone(), self.max_time.clone());
+  };
+
+  EventControl.prototype.save_state = function() {
+    return {min_time: this.min_time.valueOf(), max_time: 
this.max_time.valueOf()};
+  };
+
+  EventControl.prototype.load_state = function(state) {
+    this.update_timespan(state.min_time, state.max_time);
+  };
+
+  EventControl.prototype.zoom = function(dir, focus) {
+    if (focus === undefined) {
+      focus = 0.5;
+    }
+
+    var new_min_time = this.min_time.clone();
+    var new_max_time = this.max_time.clone();
+    var delta;
+
+    if (dir < 0) {
+      delta = this.timespan * 0.5;
+      new_min_time.subtract(delta * focus, 'ms');
+      new_max_time.add(delta * (1.0 - focus), 'ms');
+    } else {
+      delta = this.timespan * 0.25;
+      new_min_time.add(delta * focus, 'ms');
+      new_max_time.subtract(delta * (1.0 - focus), 'ms');
+    }
+
+    return this.update_timespan(new_min_time, new_max_time);
+  };
+
+  EventControl.prototype.update_timespan = function(new_min_time, 
new_max_time) {
+    var self = this;
+    var element = this.element;
+    var i = 0;
+
+    self._dirty = false;
+    self.width = element.width();
+
+    if (!moment.isMoment(new_min_time)) {
+      new_min_time = moment(new_min_time);
+    }
+    if (!moment.isMoment(new_max_time)) {
+      new_max_time = moment(new_max_time);
+    }
+
+    self.timespan = new_max_time.valueOf() - new_min_time.valueOf();
+    if (self.timespan < MIN_SPAN) {
+      var ct = self.min_time.valueOf() + (self.max_time.valueOf() - 
self.min_time.valueOf()) * 0.5;
+      new_min_time = moment(ct - MIN_SPAN*0.5);
+      new_max_time = moment(ct + MIN_SPAN*0.5);
+      self.timespan = new_max_time.valueOf() - new_min_time.valueOf();
+    }
+
+    if (self.max_timespan == MAX_SPAN) {
+      self.max_timespan = self.timespan * 2;
+    }
+
+    if (self.timespan > self.max_timespan) {
+      new_min_time = moment(self.center_time - self.max_timespan * 0.5);
+      new_max_time = moment(self.center_time + self.max_timespan * 0.5);
+      self.timespan = self.max_time.valueOf() - self.min_time.valueOf();
+    }
+    self.min_time = new_min_time;
+    self.max_time = new_max_time;
+
+    var min_time_ms = self.min_time.valueOf();
+    var major;
+    var minor;
+    var major_fmt = 'YYYY-MM-DD';
+    var minor_fmt = 'HH:mm';
+    var maj_unit = 24*3600*1000;
+    var min_unit = null;
+
+
+    if (self.timespan >= 6*24*3600*1000) {
+      min_unit = null;
+      if (self.timespan > 4*365*24*3600*1000) {
+        major_fmt = 'YYYY';
+      } else if (self.timespan > 120*24*3600*1000) {
+        major_fmt = 'YYYY-MM';
+      }
+      for (i = 0; i < MAJSPANS.length; i++) {
+        if (self.timespan > MAJSPANS[i]) {
+          maj_unit = MAJUNITS[i];
+          break;
+        }
+      }
+    } else {
+      for (i = 0; i < MINSPANS.length; i++) {
+        if (self.timespan > MINSPANS[i]) {
+          min_unit = MINUNITS[i];
+          break;
+        }
+      }
+      if (min_unit < 60*1000) {
+        minor_fmt = 'HH:mm:ss';
+      }
+    }
+
+    major = unit_in_timespan(maj_unit, min_time_ms, self.timespan);
+
+    var lastlblend = -1;
+    var existing_ticks = self.ticks.children('.ec-tick');
+    var existing_labels = self.labels.children('.ec-label,.ec-region-label');
+    var tick_idx = 0;
+    var label_idx = 0;
+
+    function addlabel(cls, l, t, lbl) {
+      if (l > lastlblend) {
+        if (label_idx < existing_labels.length) {
+          var label = $(existing_labels[label_idx]);
+          label.css('left', l).css('top', 
t).text(lbl).addClass(cls).removeClass((cls == 'ec-label') ? 'ec-region-label' 
: 'ec-label');
+          lastlblend = l + label.width();
+          label_idx += 1;
+        } else {
+          self.labels.append(['<div class="', cls, '" style="left:', l, 
'px;top:', t, 'px;">', lbl, '</div>'].join(""));
+          lastlblend = l + self.labels.children('.' + cls + 
':last-child').width();
+        }
+      }
+    }
+
+    function addtick(l, t, h) {
+      if (tick_idx < existing_ticks.length) {
+        var tick = $(existing_ticks[tick_idx]);
+        tick.css('left', l).css('top', t).css('height', h);
+        tick_idx += 1;
+      } else {
+        self.ticks.append(['<div class="ec-tick" style="left:', l, 'px;top:', 
t, 'px;height:', h, 'px;"></div>'].join(''));
+      }
+    }
+
+    var span = self.width / self.timespan;
+    var ts;
+    var xoffs;
+
+    if (min_unit !== null) {
+      minor = unit_in_timespan(min_unit, min_time_ms, self.timespan);
+
+      for (i = 0; i < minor.length; i++) {
+        ts = minor[i];
+        xoffs = span * (ts - min_time_ms);
+        addtick(xoffs, 1, self.items_h + 1 + self.markers_h);
+        addlabel('ec-label', xoffs + 1, self.items_h + 1, 
moment(ts).format(minor_fmt));
+      }
+    } else {
+      for (i = 0; i < major.length; i++) {
+        addtick(span * (major[i] - min_time_ms), 1, self.items_h * 0.5);
+      }
+    }
+
+    lastlblend = -1;
+    for (i = 0; i < major.length; i++) {
+      ts = major[i];
+      var l = span * (ts - min_time_ms);
+      if (l < 2) {
+        if (i + 1 < major.length) {
+          var next = span * (major[i + 1] - min_time_ms);
+          if (next > 60) {
+            l = 2;
+          }
+        } else {
+          l = 2;
+        }
+      }
+      addlabel('ec-region-label', l + 1, self.items_h + self.markers_h - 14, 
moment(ts).format(major_fmt));
+    }
+
+    for (i = tick_idx; i < existing_ticks.length; i++) {
+      $(existing_ticks[i]).remove();
+    }
+    for (i = label_idx; i < existing_labels.length; i++) {
+      $(existing_labels[i]).remove();
+    }
+
+    var item_offset = 2;
+    var item_slot_x = -100;
+    var item_slot_y = item_offset;
+    var item_w = 8;
+    var item_d = item_w + item_offset;
+    var items = self.items.children('.ec-dot');
+
+    span = (self.width - (item_offset * 2)) / self.timespan;
+
+    for (i = 0; i < items.length; i++) {
+      var elem = $(items[i]);
+      var item = elem.data('event');
+      var m = item._starttime;
+
+      var x = Math.floor(item_offset + span * (m - min_time_ms));
+      var xf = x % item_d;
+      x = x - xf;
+      var y = item_offset;
+      var pushed = false;
+      xoffs = item_slot_x;
+      if ((x + xf - item_slot_x) <= item_w) {
+        pushed = true;
+        x = xoffs;
+        y = item_slot_y + item_d;
+        if (y > self.items_h - item_offset) {
+          xoffs += item_d;
+          x = xoffs;
+          y = item_offset;
+        }
+      } else {
+        item_slot_y = item_offset;
+      }
+
+      if (!pushed) {
+        x += xf;
+      }
+
+      item_slot_x = x;
+      item_slot_y = y;
+
+      elem.css('left', x).css('top', y);
+    }
+  };
+
+  $.fn.EventControl = function(options) {
+    return this.each(function() {
+      var element = $(this);
+      var self = element.data('eventcontrol');
+      if (!self) {
+        self = new EventControl(element, options);
+        element.data('eventcontrol', self);
+      } else if (options === undefined) {
+        return self.save_state();
+      } else if (options == 'zoom-in') {
+        return self.zoom.apply(self, [1] + arguments.slice(1, 2));
+      } else if (options == 'zoom-out') {
+        return self.zoom.apply(self, [-1] + arguments.slice(1, 2));
+      } else {
+        self.load_state(options);
+      }
+      return self;
+    });
+  };
+}(jQuery));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/vendor/assets/javascripts/vendor.js 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/vendor/assets/javascripts/vendor.js
--- 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/vendor/assets/javascripts/vendor.js 
    2016-03-09 14:47:38.000000000 +0100
+++ 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/vendor/assets/javascripts/vendor.js 
    2016-03-21 09:18:34.000000000 +0100
@@ -9,11 +9,13 @@
 //= require jquery/jsviews
 //= require jquery/sortable
 //= require jquery/blockui
+//= require jquery/mousewheel
 //= require misc/moment
 //= require bootstrap-sprockets
 //= require bootstrap
 //= require font-awesome/font-awesome
 //= require misc/highlight
 //= require misc/js.cookie
+//= require misc/eventcontrol
 
 //= require js-routes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/vendor/assets/stylesheets/misc/_eventcontrol.scss
 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/vendor/assets/stylesheets/misc/_eventcontrol.scss
--- 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/vendor/assets/stylesheets/misc/_eventcontrol.scss
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/vendor/assets/stylesheets/misc/_eventcontrol.scss
       2016-03-21 09:18:34.000000000 +0100
@@ -0,0 +1,75 @@
+.eventcontrol {
+    /*background: #eee; */
+    color: #444;
+    background: #e3e3e3;
+    border-radius: 3px;
+    border: 1px solid #e0e0e0;
+    overflow: hidden;
+    position: relative;
+    width: 100%;
+}
+
+.eventcontrol .ec-items {
+    background: #fafafa;
+    /*border-radius: 3px;*/
+}
+
+.eventcontrol .ec-markers {
+    border-top: 1px solid #fff;
+}
+
+.eventcontrol .ec-dot {
+    position: absolute;
+    padding: 0;
+    width: 0px;
+    height: 0px;
+    border: 4px solid;
+    border-radius: 2px;
+    cursor:pointer;
+    background: #fff;
+    z-index: 1;
+}
+
+.eventcontrol .ec-markers .ec-ticks {
+}
+
+.eventcontrol .ec-markers .ec-ticks .ec-tick {
+    position: absolute;
+    width: 0px;
+    border-left: 1px solid #ececec;
+}
+
+.eventcontrol .ec-markers .ec-labels {
+}
+
+.eventcontrol .ec-label {
+    position: absolute;
+    padding: 0;
+    font-size: 12px;
+    text-align: left;
+    white-space: nowrap;
+    color: #777;
+}
+
+.eventcontrol .ec-region-label {
+    position: absolute;
+    padding: 0;
+    font-size: 10px;
+    font-weight: bold;
+    text-align: left;
+    white-space: nowrap;
+    color: #999;
+}
+
+.eventcontrol .ec-draggable {
+  cursor:hand;
+  cursor:grab;
+  cursor:-moz-grab;
+  cursor:-webkit-grab;
+}
+
+.eventcontrol .ec-dragging {
+  cursor:grabbing;
+  cursor:-moz-grabbing;
+  cursor:-webkit-grabbing;
+}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/vendor/assets/stylesheets/vendor.scss
 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/vendor/assets/stylesheets/vendor.scss
--- 
old/hawk2-2.0.0+git.1457531142.ac2dc9f/hawk/vendor/assets/stylesheets/vendor.scss
   2016-03-09 14:47:38.000000000 +0100
+++ 
new/hawk2-2.0.0+git.1458543074.dc9aa66/hawk/vendor/assets/stylesheets/vendor.scss
   2016-03-21 09:18:34.000000000 +0100
@@ -14,3 +14,4 @@
 @import "bootstrap";
 @import "font-awesome/font-awesome";
 @import "misc/highlight";
+@import "misc/eventcontrol";


Reply via email to