]> source.dussan.org Git - sonarqube.git/commitdiff
Grunt for development
authorStas Vilchik <vilchiks@gmail.com>
Tue, 18 Mar 2014 11:54:07 +0000 (17:54 +0600)
committerStas Vilchik <vilchiks@gmail.com>
Tue, 18 Mar 2014 11:54:31 +0000 (17:54 +0600)
165 files changed:
sonar-server/.gitignore
sonar-server/Gruntfile.coffee [new file with mode: 0644]
sonar-server/package.json
sonar-server/src/main/webapp/WEB-INF/app/views/layouts/_head.html.erb
sonar-server/src/main/webapp/coffee/coding-rules/app.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/coding-rules/layout.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/coding-rules/mockjax.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/coding-rules/router.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/coding-rules/views/actions-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-bulk-change-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-detail-quality-profile-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-detail-quality-profiles-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-detail-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-list-empty-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-list-item-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-list-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-quality-profile-activation-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/coding-rules/views/filter-bar-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/coding-rules/views/filters/inheritance-filter-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/coding-rules/views/filters/quality-profile-filter-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/coding-rules/views/header-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/app.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/collections/conditions.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/collections/quality-gates.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/layout.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/models/condition.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/models/quality-gate.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/router.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-actions-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-condition-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-conditions-empty-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-conditions-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-header-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-projects-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-edit-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-sidebar-list-empty-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-sidebar-list-item-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-sidebar-list-view.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/tests/common/inputsSpec.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/coffee/tests/translateSpec.coffee [new file with mode: 0644]
sonar-server/src/main/webapp/javascripts/coding-rules/app.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/coding-rules/app.js
sonar-server/src/main/webapp/javascripts/coding-rules/layout.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/coding-rules/layout.js
sonar-server/src/main/webapp/javascripts/coding-rules/mockjax.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/coding-rules/mockjax.js
sonar-server/src/main/webapp/javascripts/coding-rules/router.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/coding-rules/router.js
sonar-server/src/main/webapp/javascripts/coding-rules/views/actions-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/coding-rules/views/actions-view.js
sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-bulk-change-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-bulk-change-view.js
sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-detail-quality-profile-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-detail-quality-profile-view.js
sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-detail-quality-profiles-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-detail-quality-profiles-view.js
sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-detail-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-detail-view.js
sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-list-empty-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-list-empty-view.js
sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-list-item-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-list-item-view.js
sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-list-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-list-view.js
sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-quality-profile-activation-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/coding-rules/views/filter-bar-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/coding-rules/views/filter-bar-view.js
sonar-server/src/main/webapp/javascripts/coding-rules/views/filters/inheritance-filter-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/coding-rules/views/filters/inheritance-filter-view.js
sonar-server/src/main/webapp/javascripts/coding-rules/views/filters/quality-profile-filter-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/coding-rules/views/filters/quality-profile-filter-view.js
sonar-server/src/main/webapp/javascripts/coding-rules/views/header-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/coding-rules/views/header-view.js
sonar-server/src/main/webapp/javascripts/common/inputs.js
sonar-server/src/main/webapp/javascripts/navigator/filters/date-filter-view.js
sonar-server/src/main/webapp/javascripts/quality-gate/app.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/app.js
sonar-server/src/main/webapp/javascripts/quality-gate/collections/conditions.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/collections/conditions.js
sonar-server/src/main/webapp/javascripts/quality-gate/collections/quality-gates.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/collections/quality-gates.js
sonar-server/src/main/webapp/javascripts/quality-gate/layout.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/layout.js
sonar-server/src/main/webapp/javascripts/quality-gate/models/condition.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/models/condition.js
sonar-server/src/main/webapp/javascripts/quality-gate/models/quality-gate.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/models/quality-gate.js
sonar-server/src/main/webapp/javascripts/quality-gate/router.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/router.js
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-actions-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-actions-view.js
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-condition-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-condition-view.js
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-conditions-empty-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-conditions-empty-view.js
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-conditions-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-conditions-view.js
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-header-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-header-view.js
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-projects-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-projects-view.js
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-view.js
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-edit-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-edit-view.js
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-sidebar-list-empty-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-sidebar-list-empty-view.js
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-sidebar-list-item-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-sidebar-list-item-view.js
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-sidebar-list-view.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-sidebar-list-view.js
sonar-server/src/main/webapp/javascripts/tests/common/inputsSpec.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/tests/common/inputsSpec.js
sonar-server/src/main/webapp/javascripts/tests/translateSpec.coffee [deleted file]
sonar-server/src/main/webapp/javascripts/tests/translateSpec.js
sonar-server/src/main/webapp/less/coding-rules.less [new file with mode: 0644]
sonar-server/src/main/webapp/less/dashboard.less [new file with mode: 0644]
sonar-server/src/main/webapp/less/icons.less [new file with mode: 0644]
sonar-server/src/main/webapp/less/jquery-ui.less [new file with mode: 0644]
sonar-server/src/main/webapp/less/layout.less [new file with mode: 0644]
sonar-server/src/main/webapp/less/mixins.less [new file with mode: 0644]
sonar-server/src/main/webapp/less/navigator.less [new file with mode: 0644]
sonar-server/src/main/webapp/less/navigator/base.less [new file with mode: 0644]
sonar-server/src/main/webapp/less/navigator/config.less [new file with mode: 0644]
sonar-server/src/main/webapp/less/navigator/filters.less [new file with mode: 0644]
sonar-server/src/main/webapp/less/quality-gates.less [new file with mode: 0644]
sonar-server/src/main/webapp/less/select-list.less [new file with mode: 0644]
sonar-server/src/main/webapp/less/select2-sonar.less [new file with mode: 0644]
sonar-server/src/main/webapp/less/select2.less [new file with mode: 0755]
sonar-server/src/main/webapp/less/style.less [new file with mode: 0644]
sonar-server/src/main/webapp/less/ui.less [new file with mode: 0644]
sonar-server/src/main/webapp/less/variables.less [new file with mode: 0644]
sonar-server/src/main/webapp/less/yui-reset-font.less [new file with mode: 0644]
sonar-server/src/main/webapp/stylesheets/coding-rules.css [deleted file]
sonar-server/src/main/webapp/stylesheets/coding-rules.less [deleted file]
sonar-server/src/main/webapp/stylesheets/dashboard.css [deleted file]
sonar-server/src/main/webapp/stylesheets/icons.css [deleted file]
sonar-server/src/main/webapp/stylesheets/icons.less [deleted file]
sonar-server/src/main/webapp/stylesheets/jquery-ui.css [deleted file]
sonar-server/src/main/webapp/stylesheets/layout.css [deleted file]
sonar-server/src/main/webapp/stylesheets/mixins.css [deleted file]
sonar-server/src/main/webapp/stylesheets/mixins.less [deleted file]
sonar-server/src/main/webapp/stylesheets/navigator.css [deleted file]
sonar-server/src/main/webapp/stylesheets/navigator.less [deleted file]
sonar-server/src/main/webapp/stylesheets/navigator/base.css [deleted file]
sonar-server/src/main/webapp/stylesheets/navigator/base.less [deleted file]
sonar-server/src/main/webapp/stylesheets/navigator/config.css [deleted file]
sonar-server/src/main/webapp/stylesheets/navigator/config.less [deleted file]
sonar-server/src/main/webapp/stylesheets/navigator/filters.css [deleted file]
sonar-server/src/main/webapp/stylesheets/navigator/filters.less [deleted file]
sonar-server/src/main/webapp/stylesheets/quality-gates.css [deleted file]
sonar-server/src/main/webapp/stylesheets/quality-gates.less [deleted file]
sonar-server/src/main/webapp/stylesheets/select-list.css [deleted file]
sonar-server/src/main/webapp/stylesheets/select2-sonar.css [deleted file]
sonar-server/src/main/webapp/stylesheets/select2-sonar.less [deleted file]
sonar-server/src/main/webapp/stylesheets/select2.css [deleted file]
sonar-server/src/main/webapp/stylesheets/sonar-colorizer.less [new file with mode: 0644]
sonar-server/src/main/webapp/stylesheets/style.css [deleted file]
sonar-server/src/main/webapp/stylesheets/ui.css [deleted file]
sonar-server/src/main/webapp/stylesheets/ui.less [deleted file]
sonar-server/src/main/webapp/stylesheets/variables.css [deleted file]
sonar-server/src/main/webapp/stylesheets/variables.less [deleted file]
sonar-server/src/main/webapp/stylesheets/yui-reset-font.css [deleted file]
sonar-server/wro.xml

index becc87f32e49bf38b3109aaaa46ca24c7c86c942..649b00507a6fb19d9a317e31cd4ded33f26c35ee 100644 (file)
@@ -1,5 +1,15 @@
 # nodeJS dependencies
 node_modules/
 
+# generated css
+src/main/webapp/stylesheets/
+
+# generated js
+src/main/webapp/javascripts/coding-rules/
+src/main/webapp/javascripts/quality-gate/
+src/main/webapp/javascripts/tests/common/
+src/main/webapp/javascripts/tests/translateSpec.js
+
 # js build
 src/main/webapp/javascripts/build/
+
diff --git a/sonar-server/Gruntfile.coffee b/sonar-server/Gruntfile.coffee
new file mode 100644 (file)
index 0000000..a1f61dd
--- /dev/null
@@ -0,0 +1,55 @@
+module.exports = (grunt) ->
+  grunt.initConfig
+    pkg: grunt.file.readJSON('package.json')
+
+    less:
+      dev:
+        files:
+          '<%= pkg.assets %>stylesheets/sonar.css': [
+            '<%= pkg.assets %>less/yui-reset-font.less'
+            '<%= pkg.assets %>less/jquery-ui.less'
+            '<%= pkg.assets %>less/select2.less'
+            '<%= pkg.assets %>less/select2-sonar.less'
+            '<%= pkg.assets %>less/layout.less'
+            '<%= pkg.assets %>less/style.less'
+            '<%= pkg.assets %>less/icons.less'
+            '<%= pkg.assets %>less/ui.less'
+            '<%= pkg.assets %>less/sonar-colorizer.less'
+            '<%= pkg.assets %>less/dashboard.less'
+            '<%= pkg.assets %>less/select-list.less'
+            '<%= pkg.assets %>less/navigator.less'
+            '<%= pkg.assets %>less/*.less'
+          ]
+
+    coffee:
+      dev:
+        files: [
+          expand: true
+          cwd: '<%= pkg.assets %>coffee'
+          src: ['**/*.coffee']
+          dest: '<%= pkg.assets %>javascripts'
+          ext: '.js'
+        ]
+
+
+    watch:
+      options:
+        spawn: false
+
+      less:
+        files: '<%= pkg.assets %>less/**/*.less'
+        tasks: ['less:dev']
+
+      coffee:
+        files: '<%= pkg.assets %>coffee/**/*.coffee'
+        tasks: ['coffee:dev']
+
+
+  # Load grunt-contrib-* plugins
+  grunt.loadNpmTasks 'grunt-contrib-less'
+  grunt.loadNpmTasks 'grunt-contrib-coffee'
+  grunt.loadNpmTasks 'grunt-contrib-watch'
+
+
+  # Define tasks
+  grunt.registerTask 'default', ['less:dev', 'coffee:dev']
index 7b52fb4e0e0a71c9792421434bf9fe55de68fded..0d8b84211f653581b7862a82a14cc61228ce6b9b 100644 (file)
@@ -6,12 +6,19 @@
     "karma-jasmine": "*",
     "karma-phantomjs-launcher": "*",
     "karma-coverage": "*",
-    "karma-junit-reporter": "*"
+    "karma-junit-reporter": "*",
+    "grunt": "~0.4.2",
+    "grunt-contrib-less": "~0.10.0",
+    "grunt-contrib-coffee": "~0.10.1",
+    "grunt-contrib-handlebars": "~0.7.0",
+    "grunt-contrib-requirejs": "~0.4.3",
+    "grunt-contrib-watch": "~0.5.3"
   },
   "engines": {
     "node": "~0.8 || ~0.10"
   },
   "scripts": {
     "test": "./node_modules/.bin/karma start --single-run"
-  }
+  },
+  "assets": "src/main/webapp/"
 }
index 92221785ae68d2480198453573db49c1b05d0610..73203be42370a561639b6e8e2a6730ac781d0c35 100644 (file)
      end
   %>
   <title><%= title -%></title>
-  <% if ENV['RAILS_ENV'] == 'production'
-  %>
-    <%= stylesheet_link_tag 'sonar', :media => 'all' -%>
-    <%= yield :style -%>
+  <%= stylesheet_link_tag 'sonar', :media => 'all' -%>
+  <%= yield :style -%>
+
+  <% if ENV['RAILS_ENV'] == 'production' %>
     <%= javascript_include_tag 'sonar' -%>
   <% else %>
-    <%= stylesheet_link_tag 'yui-reset-font', :media => 'all' %>
-    <%= stylesheet_link_tag 'jquery-ui', :media => 'all' %>
-    <%= stylesheet_link_tag 'select2', :media => 'all' %>
-    <%= stylesheet_link_tag 'select2-sonar', :media => 'all' %>
-    <%= stylesheet_link_tag 'layout', :media => 'all' %>
-    <%= stylesheet_link_tag 'style', :media => 'all' %>
-    <%= stylesheet_link_tag 'icons', :media => 'all' %>
-    <%= stylesheet_link_tag 'ui', :media => 'all' %>
-    <%= stylesheet_link_tag 'sonar-colorizer', :media => 'all' %>
-    <%= stylesheet_link_tag 'dashboard', :media => 'all' %>
-    <%= stylesheet_link_tag 'select-list', :media => 'all' %>
-    <%= stylesheet_link_tag 'navigator', :media => 'all' %>
-    <%= stylesheet_link_tag 'quality-gates', :media => 'all' %>
-    <%= stylesheet_link_tag 'coding-rules', :media => 'all' %>
-    <%= yield :style -%>
     <%= javascript_include_tag 'third-party/jquery' %>
     <%= javascript_include_tag 'third-party/jquery-ui' %>
     <%= javascript_include_tag 'third-party/d3' %>
diff --git a/sonar-server/src/main/webapp/coffee/coding-rules/app.coffee b/sonar-server/src/main/webapp/coffee/coding-rules/app.coffee
new file mode 100644 (file)
index 0000000..e1ab2f3
--- /dev/null
@@ -0,0 +1,329 @@
+requirejs.config
+  baseUrl: "#{baseUrl}/javascripts"
+
+  paths:
+    'backbone': 'third-party/backbone'
+    'backbone.marionette': 'third-party/backbone.marionette'
+    'handlebars': 'third-party/handlebars'
+    'jquery.mockjax': 'third-party/jquery.mockjax'
+
+  shim:
+    'backbone.marionette':
+      deps: ['backbone']
+      exports: 'Marionette'
+    'backbone':
+      exports: 'Backbone'
+    'handlebars':
+      exports: 'Handlebars'
+
+
+requirejs [
+  'backbone', 'backbone.marionette',
+
+  'coding-rules/layout',
+  'coding-rules/router',
+
+  # views
+  'coding-rules/views/header-view',
+  'coding-rules/views/actions-view',
+  'coding-rules/views/filter-bar-view',
+  'coding-rules/views/coding-rules-list-view',
+  'coding-rules/views/coding-rules-bulk-change-view',
+  'coding-rules/views/coding-rules-quality-profile-activation-view',
+
+  # filters
+  'navigator/filters/base-filters',
+  'navigator/filters/choice-filters',
+  'navigator/filters/string-filters',
+  'navigator/filters/date-filter-view',
+  'coding-rules/views/filters/quality-profile-filter-view',
+  'coding-rules/views/filters/inheritance-filter-view',
+
+  'coding-rules/mockjax'
+], (
+  Backbone, Marionette,
+
+  CodingRulesLayout,
+  CodingRulesRouter,
+
+  # views
+  CodingRulesHeaderView,
+  CodingRulesActionsView,
+  CodingRulesFilterBarView,
+  CodingRulesListView,
+  CodingRulesBulkChangeView,
+  CodingRulesQualityProfileActivationView,
+
+  # filters
+  BaseFilters,
+  ChoiceFilters,
+  StringFilterView,
+  DateFilterView,
+  QualityProfileFilterView,
+  InheritanceFilterView
+) ->
+
+  # Create a generic error handler for ajax requests
+  jQuery.ajaxSetup
+    error: (jqXHR) ->
+      text = jqXHR.responseText
+      errorBox = jQuery('.modal-error')
+      if jqXHR.responseJSON?.errors?
+        text = _.pluck(jqXHR.responseJSON.errors, 'msg').join '. '
+      if errorBox.length > 0
+        errorBox.show().text text
+      else
+        alert text
+
+
+  # Add html class to mark the page as navigator page
+  jQuery('html').addClass('navigator-page coding-rules-page');
+
+
+  # Create an Application
+  App = new Marionette.Application
+
+
+  App.getQuery =  ->
+    @filterBarView.getQuery()
+
+
+  App.restoreSorting = ->
+
+
+
+  App.storeQuery = (query, sorting) ->
+    if sorting
+      _.extend query,
+        sort: sorting.sort
+        asc: '' + sorting.asc
+    queryString = _.map query, (v, k) -> "#{k}=#{encodeURIComponent(v)}"
+    @router.navigate queryString.join('|'), replace: true
+
+
+
+  App.fetchList = (firstPage) ->
+    query = @getQuery()
+    fetchQuery = _.extend { pageIndex: @pageIndex }, query
+
+    if @codingRules.sorting
+      _.extend fetchQuery,
+          sort: @codingRules.sorting.sort,
+          asc: @codingRules.sorting.asc
+
+    @storeQuery query, @codingRules.sorting
+
+    @layout.showSpinner 'resultsRegion'
+    jQuery.ajax
+      url: "#{baseUrl}/api/codingrules/search"
+      data: fetchQuery
+    .done (r) =>
+      if firstPage
+        @codingRules.reset r.codingrules
+      else
+        @codingRules.add r.codingrules
+      @codingRules.paging = r.paging
+      @codingRulesListView = new CodingRulesListView
+        app: @
+        collection: @codingRules
+      @layout.resultsRegion.show @codingRulesListView
+      @codingRulesListView.selectFirst()
+
+
+
+  App.fetchFirstPage = ->
+    @pageIndex = 1
+    App.fetchList true
+
+
+  App.fetchNextPage = ->
+    if @pageIndex < @codingRules.paging.pages
+      @pageIndex++
+      App.fetchList false
+
+
+  App.getActiveQualityProfile = ->
+    value = @activeInFilter.get('value')
+    if value? && value.length == 1 then value[0] else null
+
+
+  App.getInactiveQualityProfile = ->
+    value = @inactiveInFilter.get('value')
+    if value? && value.length == 1 then value[0] else null
+
+
+  # Construct layout
+  App.addInitializer ->
+    @layout = new CodingRulesLayout app: @
+    jQuery('body').append @layout.render().el
+
+
+  # Construct header
+  App.addInitializer ->
+    @codingRulesHeaderView = new CodingRulesHeaderView app: @
+    @layout.headerRegion.show @codingRulesHeaderView
+
+
+  # Define coding rules
+  App.addInitializer ->
+    @codingRules = new Backbone.Collection
+    @codingRules.sorting = sort: 'CREATION_DATE', asc: false
+
+
+  # Construct status bar
+  App.addInitializer ->
+    @codingRulesActionsView = new CodingRulesActionsView
+      app: @
+      collection: @codingRules
+    @layout.actionsRegion.show @codingRulesActionsView
+
+
+  # Construct bulk change view
+  App.addInitializer ->
+    @codingRulesBulkChangeView = new CodingRulesBulkChangeView app: @
+
+
+  # Construct quality profile activation view
+  App.addInitializer ->
+    @codingRulesQualityProfileActivationView = new CodingRulesQualityProfileActivationView app: @
+
+
+  # Define filters
+  App.addInitializer ->
+    @filters = new BaseFilters.Filters
+
+    @filters.add new BaseFilters.Filter
+      name: t 'coding_rules.filters.name'
+      property: 'name'
+      type: StringFilterView
+
+    @filters.add new BaseFilters.Filter
+      name: t 'coding_rules.filters.language'
+      property: 'languages'
+      type: ChoiceFilters.ChoiceFilterView
+      choices: @languages
+
+    @filters.add new BaseFilters.Filter
+      name: t 'coding_rules.filters.severity'
+      property: 'severities'
+      type: ChoiceFilters.ChoiceFilterView
+      choices:
+        'BLOCKER': t 'severity.BLOCKER'
+        'CRITICAL': t 'severity.CRITICAL'
+        'MAJOR': t 'severity.MAJOR'
+        'MINOR': t 'severity.MINOR'
+        'INFO': t 'severity.INFO'
+      choiceIcons:
+        'BLOCKER': 'severity-blocker'
+        'CRITICAL': 'severity-critical'
+        'MAJOR': 'severity-major'
+        'MINOR': 'severity-minor'
+        'INFO': 'severity-info'
+
+    @filters.add new BaseFilters.Filter
+      name: t 'coding_rules.filters.tag'
+      property: 'tags'
+      type: ChoiceFilters.ChoiceFilterView
+      choices: @tags
+
+    @activeInFilter = new BaseFilters.Filter
+      name: t 'coding_rules.filters.in_quality_profile'
+      property: 'in_quality_profile'
+      type: QualityProfileFilterView
+      multiple: false
+    @filters.add @activeInFilter
+
+
+    @filters.add new BaseFilters.Filter
+      name: t 'coding_rules.filters.key'
+      property: 'key'
+      type: StringFilterView
+      enabled: false
+      optional: true
+
+    @filters.add new BaseFilters.Filter
+      name: t 'coding_rules.filters.description'
+      property: 'description'
+      type: StringFilterView
+      enabled: false
+      optional: true
+
+    @filters.add new BaseFilters.Filter
+      name: t 'coding_rules.filters.repository'
+      property: 'repositories'
+      type: ChoiceFilters.ChoiceFilterView
+      enabled: false
+      optional: true
+      choices: @repositories
+
+    @filters.add new BaseFilters.Filter
+      name: t 'coding_rules.filters.status'
+      property: 'statuses'
+      type: ChoiceFilters.ChoiceFilterView
+      enabled: false
+      optional: true
+      choices: @statuses
+
+    @filters.add new BaseFilters.Filter
+      name: t 'coding_rules.filters.availableSince'
+      property: 'availableSince'
+      type: DateFilterView
+      enabled: false
+      optional: true
+
+    @inactiveInFilter = new BaseFilters.Filter
+      name: t 'coding_rules.filters.out_of_quality_profile'
+      property: 'out_of_quality_profile'
+      type: QualityProfileFilterView
+      multiple: false
+      enabled: false
+      optional: true
+    @filters.add @inactiveInFilter
+
+    @filters.add new BaseFilters.Filter
+      name: t 'coding_rules.filters.inheritance'
+      property: 'inheritance'
+      type: InheritanceFilterView
+      enabled: false
+      optional: true
+      multiple: false
+      qualityProfileFilter: @activeInFilter
+      choices:
+        'any': t 'coding_rules.filters.inheritance.any'
+        'not_inhertited': t 'coding_rules.filters.inheritance.not_inherited'
+        'inhertited': t 'coding_rules.filters.inheritance.inherited'
+        'overriden': t 'coding_rules.filters.inheritance.overriden'
+
+    @filterBarView = new CodingRulesFilterBarView
+      app: @
+      collection: @filters,
+      extra: sort: '', asc: false
+    @layout.filtersRegion.show @filterBarView
+
+
+  # Start router
+  App.addInitializer ->
+    @router = new CodingRulesRouter app: @
+    Backbone.history.start()
+
+
+  # Call app before start the application
+  appXHR = jQuery.ajax
+    url: "#{baseUrl}/api/codingrules/app"
+
+  jQuery.when(appXHR)
+  .done (r) ->
+      App.appState = new Backbone.Model
+      App.state = new Backbone.Model
+      App.qualityProfiles = r.qualityprofiles
+      App.languages = r.languages
+      App.repositories = r.repositories
+      App.statuses = r.statuses
+      App.tags = r.tags
+      window.messages = r.messages
+
+      # Remove the initial spinner
+      jQuery('#coding-rules-page-loader').remove()
+
+      # Start the application
+      App.start()
\ No newline at end of file
diff --git a/sonar-server/src/main/webapp/coffee/coding-rules/layout.coffee b/sonar-server/src/main/webapp/coffee/coding-rules/layout.coffee
new file mode 100644 (file)
index 0000000..0e3abd4
--- /dev/null
@@ -0,0 +1,28 @@
+define [
+  'backbone.marionette',
+  'common/handlebars-extensions'
+], (
+  Marionette
+) ->
+
+  class AppLayout extends Marionette.Layout
+    className: 'navigator coding-rules-navigator'
+    template: getTemplate '#coding-rules-layout'
+    spinner: '<i class="spinner"></i>'
+
+
+    regions:
+      headerRegion: '.navigator-header'
+      actionsRegion: '.navigator-actions'
+      resultsRegion: '.navigator-results'
+      detailsRegion: '.navigator-details'
+      filtersRegion: '.navigator-filters'
+
+
+    onRender: ->
+      # Adjust details region height
+      @$(@detailsRegion.el).css 'bottom', jQuery('#footer').outerHeight()
+
+
+    showSpinner: (region) ->
+      @$(@[region].el).html @spinner
diff --git a/sonar-server/src/main/webapp/coffee/coding-rules/mockjax.coffee b/sonar-server/src/main/webapp/coffee/coding-rules/mockjax.coffee
new file mode 100644 (file)
index 0000000..d052e6d
--- /dev/null
@@ -0,0 +1,280 @@
+define ['jquery.mockjax'], ->
+
+  jQuery.mockjaxSettings.contentType = 'text/json';
+  jQuery.mockjaxSettings.responseTime = 250;
+
+  # GET /api/codingrules/app
+  jQuery.mockjax
+    url: "#{baseUrl}/api/codingrules/app"
+    responseText: JSON.stringify
+      qualityprofiles: [
+        { key: 'sonarway', name: 'Sonar Way', parent: null },
+        { key: 'qualityprofile1', name: 'Quality Profile 1', parent: 'sonarway' },
+        { key: 'qualityprofile2', name: 'Quality Profile 2', parent: 'sonarway' },
+        { key: 'qualityprofile3', name: 'Quality Profile 3', parent: null },
+      ]
+      languages:
+        java: 'Java'
+        javascript: 'JavaScript'
+      repositories:
+        'checkstyle': 'Checkstyle'
+        'common-java': 'Common SonarQube'
+        'findbugs': 'FindBugs'
+        'pmd': 'PMD'
+        'pmd-unit-tests': 'PMD Unit Tests'
+        'squid': 'SonarQube'
+      statuses:
+        'BETA': 'Beta'
+        'DEPRECATED': 'Deprecated'
+        'READY': 'Ready'
+      tags:
+        'brain-overload': 'brain-overload'
+        'bug': 'bug'
+        'comment': 'comment'
+        'convention': 'convention'
+        'error-handling': 'error-handling'
+        'formatting': 'formatting'
+        'java8': 'java8'
+        'multithreading': 'multithreading'
+        'naming': 'naming'
+        'pitfall': 'pitfall'
+        'security': 'security'
+        'size': 'size'
+        'unused': 'unused'
+        'unused-code': 'unused-code'
+      messages:
+        'all': 'All'
+        'any': 'Any'
+        'apply': 'Apply'
+        'bulk_change': 'Bulk Change'
+        'cancel': 'Cancel'
+        'change': 'Change'
+        'delete': 'Delete'
+        'done': 'Done'
+        'edit': 'Edit'
+        'moreCriteria': '+ More Criteria'
+        'search_verb': 'Search'
+        'severity': 'Severity'
+        'update': 'Update'
+
+        'severity.BLOCKER': 'Blocker'
+        'severity.CRITICAL': 'Critical'
+        'severity.MAJOR': 'Major'
+        'severity.MINOR': 'Minor'
+        'severity.INFO': 'Info'
+
+        'coding_rules.activate': 'Activate'
+        'coding_rules.activate_quality_profile': 'Activate Quality Profile'
+        'coding_rules.add_note': 'Add Note'
+        'coding_rules.available_since': 'Available Since'
+        'coding_rules.bulk_change': 'Bulk Change'
+        'coding_rules.extend_description': 'Extend Description'
+        'coding_rules.deactivate_quality_profile': 'Deactivate'
+        'coding_rules.found': 'Found'
+        'coding_rules.inherits': 'Inherits'
+        'coding_rules.key': 'Key:'
+        'coding_rules.new_search': 'New Search'
+        'coding_rules.no_results': 'No Coding Rules'
+        'coding_rules.order': 'Order'
+        'coding_rules.ordered_by': 'Ordered By'
+        'coding_rules.original': 'Original:'
+        'coding_rules.page': 'Coding Rules'
+        'coding_rules.parameters': 'Parameters'
+        'coding_rules.parameters.default_value': 'Default Value:'
+        'coding_rules.quality_profiles': 'Quality Profiles'
+        'coding_rules.quality_profile': 'Quality Profile'
+        'coding_rules.repository': 'Repository:'
+        'coding_rules.revert_to_parent_definition': 'Revert to Parent Definition'
+        'coding_rules._rules': 'rule(s)'
+        'coding_rules.select_tag': 'Select Tag'
+
+        'coding_rules.filters.availableSince': 'Available Since'
+        'coding_rules.filters.description': 'Description'
+        'coding_rules.filters.in_quality_profile': 'In Quality Profile'
+        'coding_rules.filters.inheritance': 'Inheritance'
+        'coding_rules.filters.inheritance.inactive': 'Inheritance criteria is available when an inherited quality profile is selected'
+        'coding_rules.filters.inheritance.any': 'Any'
+        'coding_rules.filters.inheritance.not_inherited': 'Not Inherited'
+        'coding_rules.filters.inheritance.inherited': 'Inherited'
+        'coding_rules.filters.inheritance.overriden': 'Overriden'
+        'coding_rules.filters.key': 'Key'
+        'coding_rules.filters.language': 'Language'
+        'coding_rules.filters.name': 'Name'
+        'coding_rules.filters.out_of_quality_profile': 'Out of Quality Profile'
+        'coding_rules.filters.repository': 'Repository'
+        'coding_rules.filters.severity': 'Severity'
+        'coding_rules.filters.status': 'Status'
+        'coding_rules.filters.tag': 'Tag'
+
+        'coding_rules.sort.creation_date': 'Creation Date'
+        'coding_rules.sort.name': 'Name'
+
+
+  # GET /api/codingrules/search
+  jQuery.mockjax
+    url: "#{baseUrl}/api/codingrules/search"
+    responseText: JSON.stringify
+      codingrules: [
+        {
+          name: 'Array designators "[]" should be located after the type in method signatures'
+          language: 'Java'
+          severity: 'MAJOR'
+          status: 'DEPRECATED'
+        },
+        {
+          name: 'Avoid Array Loops'
+          language: 'Java'
+          severity: 'CRITICAL'
+          status: 'READY'
+        },
+        {
+          name: 'Bad practice - Abstract class defines covariant compareTo() method'
+          language: 'Java'
+          severity: 'MAJOR'
+          status: 'READY'
+        },
+        {
+          name: 'Correctness - Use of class without a hashCode() method in a hashed data structure'
+          language: 'Java'
+          severity: 'MINOR'
+          status: 'BETA'
+        },
+        {
+          name: 'Useless Operation On Immutable'
+          language: 'Java'
+          severity: 'MAJOR'
+          status: 'READY'
+        }
+      ]
+      paging:
+        total: 5
+        fTotal: '5'
+
+
+
+  # GET /api/codingrules/show
+  jQuery.mockjax
+    url: "#{baseUrl}/api/codingrules/show"
+    responseText: JSON.stringify
+      codingrule:
+        name: 'Array designators "[]" should be located after the type in method signatures'
+        language: 'Java'
+        tags: ['bug', 'comment', 'java8']
+        creationDate: '2013-10-15'
+        fCreationDate: 'Oct 15, 2013'
+        status: 'DEPRECATED'
+        repository: 'squid'
+        key: 'S1190'
+        parameters: [
+          { key: 'someParameter', type: 'INT', default: 4, description: 'Some parameter description' }
+          { key: 'boolParameter', type: 'BOOL', description: 'Bool parameter description' }
+        ]
+        description: '''
+            <p>
+            According to the Java Language Specification:
+            </p>
+
+            <pre>For compatibility with older versions of the Java SE platform,
+            the declaration of a method that returns an array is allowed to place (some or all of)
+            the empty bracket pairs that form the declaration of the array type after
+            the formal parameter list. This obsolescent syntax should not be used in new code.
+            </pre>
+
+            <p>The following code snippet illustrates this rule:</p>
+
+            <pre>public int getVector()[] { /* ... */ }    // Non-Compliant
+
+            public int[] getVector() { /* ... */ }    // Compliant
+
+            public int[] getMatrix()[] { /* ... */ }  // Non-Compliant
+
+            public int[][] getMatrix() { /* ... */ }  // Compliant
+            </pre>'''
+        extra: '''<p>This note is here <b>only for test purposes</b>.</p>'''
+        extraRaw: '''This note is here *only for test purposes*.'''
+
+        qualityProfiles: [
+          {
+            name: 'SonarWay'
+            key: 'sonarway'
+            severity: 'MINOR'
+            canDeactivate: true
+            canUpdate: true
+            parameters: [
+              { key: 'someParameter', value: 8 }
+            ]
+          },
+          {
+            name: 'Quality Profile 1'
+            key: 'qualityprofile1'
+            severity: 'MAJOR'
+            canDeactivate: false
+            canUpdate: false
+            parameters: [
+              { key: 'someParameter', value: 6 }
+            ]
+            inherits: 'sonarway'
+            note:
+              username: 'Admin Admin'
+              html: '''<p>This note is here <b>only for test purposes</b>.</p>'''
+              raw: '''This note is here *only for test purposes*.'''
+              fCreationDate: 'less than a minute'
+          }
+        ]
+
+
+
+  # POST /api/codingrules/extend_description
+  jQuery.mockjax
+    url: "#{baseUrl}/api/codingrules/extend_description"
+    responseText: JSON.stringify
+      extra: '''<p>This note is here <i>only for test purposes</i>.</p>'''
+      extraRaw: '''This note is here *only for test purposes*.'''
+
+
+  # POST /api/codingrules/bulk_change
+  jQuery.mockjax
+    url: "#{baseUrl}/api/codingrules/bulk_change"
+
+
+  # POST /api/codingrules/set_tags
+  jQuery.mockjax
+    url: "#{baseUrl}/api/codingrules/set_tags"
+
+
+  # POST /api/codingrules/activate
+  jQuery.mockjax
+    url: "#{baseUrl}/api/codingrules/activate"
+
+
+  # POST /api/codingrules/note
+  jQuery.mockjax
+    url: "#{baseUrl}/api/codingrules/note"
+    responseText: JSON.stringify
+      note:
+        username: 'Admin Admin'
+        html: '''<p>This note is here <b>only for test purposes</b>.</p>'''
+        raw: '''This note is here *only for test purposes*.'''
+        fCreationDate: 'less than a minute'
+
+
+  # GET /api/qualityprofiles/list
+  jQuery.mockjax
+    url: "#{baseUrl}/api/qualityprofiles/list"
+    responseText: JSON.stringify
+      more: false
+      results: [
+        { id: 'sonarway', text: 'Sonar Way', parent: null },
+        { id: 'qp1', text: 'Quality Profile 1', parent: 'sonarway' },
+        { id: 'qp2', text: 'Quality Profile 2', parent: 'sonarway' },
+        { id: 'qp3', text: 'Quality Profile 3', parent: null },
+      ]
+
+
+  # GET /api/qualityprofiles/show
+  jQuery.mockjax
+    url: "#{baseUrl}/api/qualityprofiles/show"
+    responseText: JSON.stringify
+      qualityprofile:
+        id: 'sonarway', text: 'Sonar Way', parent: null
+
diff --git a/sonar-server/src/main/webapp/coffee/coding-rules/router.coffee b/sonar-server/src/main/webapp/coffee/coding-rules/router.coffee
new file mode 100644 (file)
index 0000000..7d55132
--- /dev/null
@@ -0,0 +1,46 @@
+define [
+  'backbone',
+], (
+  Backbone,
+) ->
+
+  class AppRouter extends Backbone.Router
+
+    routes:
+      '': 'index'
+      ':query': 'index'
+
+
+    initialize: (options) ->
+      @app = options.app
+
+
+    parseQuery: (query, separator) ->
+      (query || '').split(separator || '|').map (t) ->
+        tokens = t.split('=')
+        key: tokens[0], value: decodeURIComponent(tokens[1])
+
+
+    emptyQuery: ->
+      @navigate '', trigger: true, replace: true
+
+
+    index: (query) ->
+      params = this.parseQuery(query)
+      idObj = _.findWhere(params, { key: 'id' })
+      if (idObj)
+        f = this.app.favoriteFilter
+        @app.canSave = false
+        f.set('id', idObj.value)
+        f.fetch
+          success: =>
+            params = _.extend({}, @parseQuery(f.get('query')), params)
+            @loadResults(params)
+      else
+        @loadResults(params)
+
+
+    loadResults: (params) ->
+      @app.filterBarView.restoreFromQuery(params)
+      @app.restoreSorting(params)
+      @app.fetchFirstPage()
diff --git a/sonar-server/src/main/webapp/coffee/coding-rules/views/actions-view.coffee b/sonar-server/src/main/webapp/coffee/coding-rules/views/actions-view.coffee
new file mode 100644 (file)
index 0000000..5371f70
--- /dev/null
@@ -0,0 +1,59 @@
+define [
+  'backbone.marionette',
+  'common/handlebars-extensions'
+], (
+  Marionette
+) ->
+
+  class CodingRulesStatusView extends Marionette.ItemView
+    template: getTemplate '#coding-rules-status-template'
+
+
+    collectionEvents:
+      'all': 'render'
+
+
+    ui:
+      orderChoices: '.navigator-actions-order-choices'
+
+
+    events:
+      'click .navigator-actions-order': 'toggleOrderChoices'
+      'click @ui.orderChoices': 'sort'
+      'click .navigator-actions-bulk': 'bulkChange'
+
+
+    onRender: ->
+      unless @collection.sorting.sortText
+        @collection.sorting.sortText = @$('[data-sort=' + @collection.sorting.sort + ']:first').text()
+        @render()
+
+
+    toggleOrderChoices: (e) ->
+      e.stopPropagation()
+      @ui.orderChoices.toggleClass 'open'
+      if @ui.orderChoices.is '.open'
+        jQuery('body').on 'click.coding_rules_actions', =>
+          @ui.orderChoices.removeClass 'open'
+
+
+    sort: (e) ->
+      e.stopPropagation()
+      @ui.orderChoices.removeClass 'open'
+      jQuery('body').off 'click.coding_rules_actions'
+      el = jQuery(e.target)
+      sort = el.data 'sort'
+      asc = el.data 'asc'
+      if sort != null && asc != null
+        @collection.sorting = sort: sort, sortText: el.text(), asc: asc
+        @options.app.fetchFirstPage()
+
+
+    bulkChange: ->
+      @options.app.codingRulesBulkChangeView.show()
+
+
+    serializeData: ->
+      _.extend super,
+        paging: @collection.paging
+        sorting: @collection.sorting
diff --git a/sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-bulk-change-view.coffee b/sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-bulk-change-view.coffee
new file mode 100644 (file)
index 0000000..cfb43fd
--- /dev/null
@@ -0,0 +1,110 @@
+define [
+  'backbone.marionette',
+  'common/handlebars-extensions'
+], (
+  Marionette
+) ->
+
+  class CodingRulesBulkChangeView extends Marionette.ItemView
+    className: 'modal'
+    template: getTemplate '#coding-rules-bulk-change-template'
+
+
+    events:
+      'submit form': 'onSubmit'
+      'click #coding-rules-cancel-bulk-change': 'hide'
+      'click label': 'enableAction'
+      'change select': 'enableAction'
+
+
+    onRender: ->
+      @$el.dialog
+        dialogClass: 'no-close',
+        width: '600px',
+        draggable: false,
+        autoOpen: false,
+        modal: true,
+        minHeight: 50,
+        resizable: false,
+        title: null
+
+      @$('#coding-rules-bulk-change-activate-on, #coding-rules-bulk-change-deactivate-on').select2
+        width: '250px'
+        minimumResultsForSearch: 1
+
+      format = (state) ->
+        return state.text unless state.id
+        "<i class='icon-severity-#{state.id.toLowerCase()}'></i> #{state.text}"
+      @$('#coding-rules-bulk-change-severity').select2
+        width: '250px'
+        minimumResultsForSearch: 999
+        formatResult: format
+        formatSelection: format
+        escapeMarkup: (m) -> m
+
+
+    show: ->
+      @render()
+      @$el.dialog 'open'
+
+
+    hide: ->
+      @$el.dialog 'close'
+
+
+    prepareQuery: ->
+      query = @options.app.getQuery()
+      activateIn = []
+      deactivateIn = []
+      severity = null
+      if @$('#coding-rules-bulk-change-activate-qp').is(':checked')
+        activateIn.push @options.app.getInactiveQualityProfile()
+      if @$('#coding-rules-bulk-change-activate').is(':checked')
+        activateIn.push @$('#coding-rules-bulk-change-activate-on').val()
+      if @$('#coding-rules-bulk-change-deactivate-qp').is(':checked')
+        deactivateIn.push @options.app.getActiveQualityProfile()
+      if @$('#coding-rules-bulk-change-deactivate').is(':checked')
+        deactivateIn.push @$('#coding-rules-bulk-change-deactivate-on').val()
+      if @$('#coding-rules-bulk-change-set-severity').is(':checked')
+        severity = @$('#coding-rules-bulk-change-severity').val()
+      actions = []
+      if activateIn.length > 0
+        actions.push 'bulk_activate'
+        _.extend query, bulk_activate_in: activateIn.join(',')
+      if deactivateIn.length > 0
+        actions.push 'bulk_deactivate'
+        _.extend query, bulk_deactivate_in: deactivateIn.join(',')
+      if severity
+        actions.push 'bulk_set_severity'
+        _.extend query, bulk_severity: severity
+      _.extend query, bulk_actions: actions
+
+    onSubmit: (e) ->
+      e.preventDefault()
+      jQuery.ajax
+        type: 'POST'
+        url: "#{baseUrl}/api/codingrules/bulk_change"
+        data: @prepareQuery()
+      .done =>
+        @options.app.fetchFirstPage()
+        @hide()
+
+
+
+    enableAction: (e) ->
+      jQuery(e.target).siblings('input[type=checkbox]').prop 'checked', true
+
+
+    serializeData: ->
+      paging: @options.app.codingRules.paging
+      qualityProfiles: @options.app.qualityProfiles
+
+      activeQualityProfile: @options.app.getActiveQualityProfile()
+      activeQualityProfileName: @options.app.activeInFilter.view.renderValue()
+      activateOnQualityProfiles: _.reject @options.app.qualityProfiles, (q) => q.key == @options.app.getInactiveQualityProfile()
+
+      inactiveQualityProfile: @options.app.getInactiveQualityProfile()
+      inactiveQualityProfileName: @options.app.inactiveInFilter.view.renderValue()
+      deactivateOnQualityProfiles: _.reject @options.app.qualityProfiles, (q) => q.key == @options.app.getActiveQualityProfile()
+
+      severities: ['BLOCKER', 'CRITICAL', 'MAJOR', 'MINOR', 'INFO']
diff --git a/sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-detail-quality-profile-view.coffee b/sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-detail-quality-profile-view.coffee
new file mode 100644 (file)
index 0000000..289c209
--- /dev/null
@@ -0,0 +1,98 @@
+define [
+  'backbone.marionette',
+  'common/handlebars-extensions'
+], (
+  Marionette
+) ->
+
+  class CodingRulesDetailQualityProfilesView extends Marionette.ItemView
+    className: 'coding-rules-detail-quality-profile'
+    template: getTemplate '#coding-rules-detail-quality-profile-template'
+
+
+    ui:
+      severitySelect: '.coding-rules-detail-quality-profile-severity'
+
+      note: '.coding-rules-detail-quality-profile-note'
+      noteForm: '.coding-rules-detail-quality-profile-note-form'
+      noteText: '.coding-rules-detail-quality-profile-note-text'
+      noteAdd: '.coding-rules-detail-quality-profile-note-add'
+      noteEdit: '.coding-rules-detail-quality-profile-note-edit'
+      noteDelete: '.coding-rules-detail-quality-profile-note-delete'
+      noteCancel: '.coding-rules-detail-quality-profile-note-cancel'
+      noteSubmit: '.coding-rules-detail-quality-profile-note-submit'
+
+
+    events:
+      'click @ui.noteAdd': 'editNote'
+      'click @ui.noteEdit': 'editNote'
+      'click @ui.noteDelete': 'deleteNote'
+      'click @ui.noteCancel': 'cancelNote'
+      'click @ui.noteSubmit': 'submitNote'
+
+
+    editNote: ->
+      @ui.note.hide()
+      @ui.noteForm.show()
+      @ui.noteText.focus()
+
+
+    deleteNote: ->
+      @ui.noteText.val ''
+      @submitNote().done =>
+        @model.unset 'note'
+        @render()
+
+
+    cancelNote: ->
+      @ui.note.show()
+      @ui.noteForm.hide()
+
+
+    submitNote: ->
+      @ui.note.html '<i class="spinner"></i>'
+      @ui.noteForm.html '<i class="spinner"></i>'
+      jQuery.ajax
+        type: 'POST'
+        url: "#{baseUrl}/api/codingrules/note"
+        dataType: 'json'
+        data: text: @ui.noteText.val()
+      .done (r) =>
+        @model.set 'note', r.note
+        @render()
+
+
+    onRender: ->
+      @ui.noteForm.hide()
+
+      format = (state) ->
+        return state.text unless state.id
+        "<i class='icon-severity-#{state.id.toLowerCase()}'></i> #{state.text}"
+
+      @ui.severitySelect.val @model.get 'severity'
+      @ui.severitySelect.select2
+        width: '200px'
+        minimumResultsForSearch: 999
+        formatResult: format
+        formatSelection: format
+        escapeMarkup: (m) -> m
+
+
+    getParent: ->
+      return null unless @model.get 'inherits'
+      @options.qualityProfiles.findWhere(key: @model.get('inherits')).toJSON()
+
+
+    enhanceParameters: ->
+      parent = @getParent()
+      parameters = @model.get 'parameters'
+      return parameters unless parent
+      parameters.map (p) ->
+        _.extend p, original: _.findWhere(parent.parameters, key: p.key).value
+
+
+    serializeData: ->
+      _.extend super,
+        parent: @getParent()
+        parameters: @enhanceParameters()
+        severities: ['BLOCKER', 'CRITICAL', 'MAJOR', 'MINOR', 'INFO']
\ No newline at end of file
diff --git a/sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-detail-quality-profiles-view.coffee b/sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-detail-quality-profiles-view.coffee
new file mode 100644 (file)
index 0000000..0b6f7ec
--- /dev/null
@@ -0,0 +1,13 @@
+define [
+  'backbone.marionette'
+  'coding-rules/views/coding-rules-detail-quality-profile-view'
+], (
+  Marionette,
+  CodingRulesDetailQualityProfileView
+) ->
+
+  class CodingRulesDetailQualityProfilesView extends Marionette.CollectionView
+    itemView: CodingRulesDetailQualityProfileView
+
+    itemViewOptions: ->
+      qualityProfiles: @collection
\ No newline at end of file
diff --git a/sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-detail-view.coffee b/sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-detail-view.coffee
new file mode 100644 (file)
index 0000000..01e4cca
--- /dev/null
@@ -0,0 +1,111 @@
+define [
+  'backbone',
+  'backbone.marionette',
+  'coding-rules/views/coding-rules-detail-quality-profiles-view'
+  'common/handlebars-extensions'
+], (
+  Backbone,
+  Marionette,
+  CodingRulesDetailQualityProfilesView
+) ->
+
+  class CodingRulesDetailView extends Marionette.Layout
+    template: getTemplate '#coding-rules-detail-template'
+
+
+    regions:
+      qualityProfilesRegion: '#coding-rules-detail-quality-profiles'
+
+
+    ui:
+      tagsChange: '.coding-rules-detail-tags-change'
+      tagInput: '.coding-rules-detail-tag-input'
+      tagsEdit: '.coding-rules-detail-tag-edit'
+      tagsEditDone: '.coding-rules-detail-tag-edit-done'
+      tagsList: '.coding-rules-detail-tag-list'
+
+      descriptionExtra: '#coding-rules-detail-description-extra'
+      extendDescriptionLink: '#coding-rules-detail-extend-description'
+      extendDescriptionForm: '#coding-rules-detail-extend-description-form'
+      extendDescriptionSubmit: '#coding-rules-detail-extend-description-submit'
+      extendDescriptionText: '#coding-rules-detail-extend-description-text'
+      extendDescriptionSpinner: '#coding-rules-detail-extend-description-spinner'
+      cancelExtendDescription: '#coding-rules-detail-extend-description-cancel'
+
+      qualityProfileActivate: '#coding-rules-quality-profile-activate'
+
+
+    events:
+      'click @ui.tagsChange': 'changeTags'
+      'click @ui.tagsEditDone': 'editDone'
+
+      'click @ui.extendDescriptionLink': 'showExtendDescriptionForm'
+      'click @ui.cancelExtendDescription': 'hideExtendDescriptionForm'
+      'click @ui.extendDescriptionSubmit': 'submitExtendDescription'
+
+      'click @ui.qualityProfileActivate': 'activateQualityProfile'
+
+
+    initialize: (options) ->
+      @qualityProfilesView = new CodingRulesDetailQualityProfilesView
+        collection: new Backbone.Collection options.model.get 'qualityProfiles'
+
+
+    onRender: ->
+      @qualityProfilesRegion.show @qualityProfilesView
+
+      @ui.tagInput.select2
+        tags: _.difference @options.app.tags, @model.get 'tags'
+        width: '500px'
+      @ui.tagsEdit.hide()
+
+      @ui.extendDescriptionForm.hide()
+      @ui.extendDescriptionSpinner.hide()
+
+      qp = @options.app.getActiveQualityProfile()
+      @$('.coding-rules-detail-quality-profile').first().addClass 'active' if qp?
+
+
+    changeTags: ->
+      @ui.tagsEdit.show()
+      @ui.tagsList.hide()
+
+
+    editDone: ->
+      @ui.tagsEdit.html '<i class="spinner"></i>'
+      tags = @ui.tagInput.val()
+      jQuery.ajax
+        type: 'POST'
+        url: "#{baseUrl}/api/codingrules/set_tags"
+        data: tags: tags
+      .done =>
+          @model.set 'tags', tags.split ','
+          @render()
+
+
+    showExtendDescriptionForm: ->
+      @ui.descriptionExtra.hide()
+      @ui.extendDescriptionForm.show()
+
+
+    hideExtendDescriptionForm: ->
+      @ui.descriptionExtra.show()
+      @ui.extendDescriptionForm.hide()
+
+
+    submitExtendDescription: ->
+      @ui.extendDescriptionForm.hide()
+      @ui.extendDescriptionSpinner.show()
+      jQuery.ajax
+        type: 'POST'
+        url: "#{baseUrl}/api/codingrules/extend_description"
+        dataType: 'json'
+        data: text: @ui.extendDescriptionText.val()
+      .done (r) =>
+        @model.set extra: r.extra, extraRaw: r.extraRaw
+        @render()
+
+
+    activateQualityProfile: ->
+      @options.app.codingRulesQualityProfileActivationView.model = @model
+      @options.app.codingRulesQualityProfileActivationView.show()
\ No newline at end of file
diff --git a/sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-list-empty-view.coffee b/sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-list-empty-view.coffee
new file mode 100644 (file)
index 0000000..203fcad
--- /dev/null
@@ -0,0 +1,11 @@
+define [
+  'backbone.marionette',
+  'common/handlebars-extensions'
+], (
+  Marionette,
+) ->
+
+  class CodingRulesListEmptyView extends Marionette.ItemView
+    tagName: 'li'
+    className: 'navigator-results-no-results'
+    template: getTemplate '#coding-rules-list-empty-template'
diff --git a/sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-list-item-view.coffee b/sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-list-item-view.coffee
new file mode 100644 (file)
index 0000000..bf0ed4d
--- /dev/null
@@ -0,0 +1,38 @@
+define [
+  'backbone.marionette',
+  'coding-rules/views/coding-rules-detail-view',
+  'common/handlebars-extensions'
+], (
+  Marionette,
+  CodingRulesDetailView
+) ->
+
+  class CodingRulesListItemView extends Marionette.ItemView
+    tagName: 'li'
+    template: getTemplate '#coding-rules-list-item-template'
+    activeClass: 'active'
+
+
+    events: ->
+      'click': 'showDetail'
+
+
+    showDetail: ->
+      @$el.siblings().removeClass @activeClass
+      @$el.addClass @activeClass
+
+      @options.app.layout.showSpinner 'detailsRegion'
+      jQuery.ajax
+        url: "#{baseUrl}/api/codingrules/show"
+      .done (r) =>
+        @model.set r.codingrule
+        detailView = new CodingRulesDetailView
+          app: @options.app
+          model: @model
+        @options.app.layout.detailsRegion.show detailView
+
+
+    serializeData: ->
+      _.extend super,
+        qualityProfile: @options.app.getActiveQualityProfile()
+        qualityProfileName: @options.app.activeInFilter.view.renderValue()
diff --git a/sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-list-view.coffee b/sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-list-view.coffee
new file mode 100644 (file)
index 0000000..93db305
--- /dev/null
@@ -0,0 +1,23 @@
+define [
+  'backbone.marionette',
+  'coding-rules/views/coding-rules-list-item-view',
+  'coding-rules/views/coding-rules-list-empty-view'
+], (
+  Marionette,
+  CodingRulesListItemView,
+  CodingRulesListEmptyView
+) ->
+
+  class CodingRulesListView extends Marionette.CollectionView
+    tagName: 'ol'
+    className: 'navigator-results-list'
+    itemView: CodingRulesListItemView,
+    emptyView: CodingRulesListEmptyView,
+
+
+    itemViewOptions: ->
+      listView: @, app: @options.app
+
+
+    selectFirst: ->
+      @$el.find('*:first').click()
diff --git a/sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-quality-profile-activation-view.coffee b/sonar-server/src/main/webapp/coffee/coding-rules/views/coding-rules-quality-profile-activation-view.coffee
new file mode 100644 (file)
index 0000000..d85a41e
--- /dev/null
@@ -0,0 +1,79 @@
+define [
+  'backbone.marionette',
+  'common/handlebars-extensions'
+], (
+  Marionette
+) ->
+
+  class CodingRulesQualityProfileActivationView extends Marionette.ItemView
+    className: 'modal'
+    template: getTemplate '#coding-rules-quality-profile-activation-template'
+
+
+    ui:
+      qualityProfileSelect: '#coding-rules-quality-profile-activation-select'
+      qualityProfileSeverity: '#coding-rules-quality-profile-activation-severity'
+      qualityProfileActivate: '#coding-rules-quality-profile-activation-activate'
+
+
+    events:
+      'click #coding-rules-quality-profile-activation-cancel': 'hide'
+      'click @ui.qualityProfileActivate': 'activate'
+
+
+    activate: ->
+      @$('.modal-foot').html '<i class="spinner"></i>'
+      jQuery.ajax
+        type: 'POST'
+        url: "#{baseUrl}/api/codingrules/activate"
+        data: id: 1
+      .done =>
+        jQuery('.navigator-results-list .active').click()
+        @hide()
+
+
+    onRender: ->
+      @$el.dialog
+        dialogClass: 'no-close',
+        width: '600px',
+        draggable: false,
+        autoOpen: false,
+        modal: true,
+        minHeight: 50,
+        resizable: false,
+        title: null
+
+      @ui.qualityProfileSelect.select2
+        width: '250px'
+        minimumResultsForSearch: 5
+
+      format = (state) ->
+        return state.text unless state.id
+        "<i class='icon-severity-#{state.id.toLowerCase()}'></i> #{state.text}"
+
+      @ui.qualityProfileSeverity.val @model.get 'severity'
+      @ui.qualityProfileSeverity.select2
+        width: '250px'
+        minimumResultsForSearch: 999
+        formatResult: format
+        formatSelection: format
+
+
+    show: ->
+      @render()
+      @$el.dialog 'open'
+
+
+    hide: ->
+      @$el.dialog 'close'
+
+
+    getAvailableQualityProfiles: ->
+      _.reject @options.app.qualityProfiles, (profile) =>
+        _.findWhere @model.get('qualityProfiles'), key: profile.key
+
+
+    serializeData: ->
+      _.extend super,
+        qualityProfiles: @getAvailableQualityProfiles()
+        severities: ['BLOCKER', 'CRITICAL', 'MAJOR', 'MINOR', 'INFO']
diff --git a/sonar-server/src/main/webapp/coffee/coding-rules/views/filter-bar-view.coffee b/sonar-server/src/main/webapp/coffee/coding-rules/views/filter-bar-view.coffee
new file mode 100644 (file)
index 0000000..8b66244
--- /dev/null
@@ -0,0 +1,68 @@
+define [
+  'navigator/filters/filter-bar',
+  'navigator/filters/base-filters',
+  'navigator/filters/favorite-filters',
+  'navigator/filters/more-criteria-filters'
+], (
+  FilterBarView,
+  BaseFilters,
+  FavoriteFiltersModule,
+  MoreCriteriaFilters
+) ->
+
+  class CodingRulesFilterBarView extends FilterBarView
+
+    collectionEvents:
+      'change:enabled': 'changeEnabled'
+
+
+    events:
+      'click .navigator-filter-submit': 'search'
+
+
+    getQuery: ->
+      query = {}
+      @collection.each (filter) ->
+        _.extend query, filter.view.formatValue()
+      query
+
+
+    onAfterItemAdded: (itemView) ->
+      if itemView.model.get('type') == FavoriteFiltersModule.FavoriteFilterView
+        jQuery('.navigator-header').addClass 'navigator-header-favorite'
+
+
+    addMoreCriteriaFilter: ->
+      disabledFilters = this.collection.where enabled: false
+      if disabledFilters.length > 0
+        @moreCriteriaFilter = new BaseFilters.Filter
+          type: MoreCriteriaFilters.MoreCriteriaFilterView,
+          enabled: true,
+          optional: false,
+          filters: disabledFilters
+        @collection.add @moreCriteriaFilter
+
+
+    changeEnabled: ->
+      if @moreCriteriaFilter?
+        disabledFilters = _.reject @collection.where(enabled: false), (filter) ->
+          filter.get('type') == MoreCriteriaFilters.MoreCriteriaFilterView
+
+        if disabledFilters.length == 0
+          @moreCriteriaFilter.set { enabled: false }, { silent: true }
+        else
+          @moreCriteriaFilter.set { enabled: true }, { silent: true }
+
+        @moreCriteriaFilter.set { filters: disabledFilters }, { silent: true }
+        @moreCriteriaFilter.trigger 'change:filters'
+
+
+    search: ->
+      @options.app.state.set
+        query: this.options.app.getQuery(),
+        search: true
+      @options.app.fetchFirstPage()
+
+
+    fetchNextPage: ->
+      @options.app.fetchNextPage()
diff --git a/sonar-server/src/main/webapp/coffee/coding-rules/views/filters/inheritance-filter-view.coffee b/sonar-server/src/main/webapp/coffee/coding-rules/views/filters/inheritance-filter-view.coffee
new file mode 100644 (file)
index 0000000..ef4bb64
--- /dev/null
@@ -0,0 +1,50 @@
+define [
+  'navigator/filters/choice-filters'
+], (
+  ChoiceFilters
+) ->
+
+  class InheritanceFilterView extends ChoiceFilters.ChoiceFilterView
+
+    initialize: ->
+      super
+      @qualityProfileFilter = @model.get 'qualityProfileFilter'
+      @listenTo @qualityProfileFilter, 'change:value', @onChangeQualityProfile
+      @onChangeQualityProfile()
+
+
+    onChangeQualityProfile: ->
+      qualityProfile = @qualityProfileFilter.get 'value'
+      parentQualityProfile = @qualityProfileFilter.get 'parentQualityProfile'
+      if _.isArray(qualityProfile) && qualityProfile.length == 1 && parentQualityProfile
+        @makeActive()
+      else
+        @makeInactive()
+
+
+    makeActive: ->
+      @model.set inactive: false, title: ''
+      @model.trigger 'change:enabled'
+      @$el.removeClass('navigator-filter-inactive').prop 'title', ''
+
+
+    makeInactive: ->
+      @model.set inactive: true, title: t 'coding_rules.filters.inheritance.inactive'
+      @model.trigger 'change:enabled'
+      @choices.each (model) -> model.set 'checked', false
+      @detailsView.updateLists()
+      @detailsView.updateValue()
+      @$el.addClass('navigator-filter-inactive').prop 'title', t 'coding_rules.filters.inheritance.inactive'
+
+
+    showDetails: ->
+      super unless @$el.is '.navigator-filter-inactive'
+
+
+    restore: (value) ->
+      value = value.split(',') if _.isString(value)
+      if @choices && value.length > 0
+        @model.set value: value, enabled: true
+        @onChangeQualityProfile
+      else
+        @clear()
diff --git a/sonar-server/src/main/webapp/coffee/coding-rules/views/filters/quality-profile-filter-view.coffee b/sonar-server/src/main/webapp/coffee/coding-rules/views/filters/quality-profile-filter-view.coffee
new file mode 100644 (file)
index 0000000..ab1c4bd
--- /dev/null
@@ -0,0 +1,41 @@
+define [
+  'navigator/filters/ajax-select-filters'
+], (
+  AjaxSelectFilters
+) ->
+
+  class QualityProfileSuggestions extends AjaxSelectFilters.Suggestions
+
+    url: ->
+      "#{baseUrl}/api/qualityprofiles/list"
+
+
+
+  class QualityProfileFilterView extends AjaxSelectFilters.AjaxSelectFilterView
+
+    initialize: ->
+      super
+      @choices = new QualityProfileSuggestions
+      @listenTo @model, 'change:value', @updateParentQualityProfile
+
+
+    updateParentQualityProfile: ->
+      selected = @getSelected()
+      if selected.length == 1
+        @model.set 'parentQualityProfile', selected[0].get('parent')
+      else
+        @model.unset 'parentQualityProfile'
+
+
+    createRequest: (v) ->
+      jQuery.ajax
+        url: baseUrl + '/api/qualityprofiles/show'
+        type: 'GET'
+        data: key: v
+      .done (r) =>
+        @choices.add new Backbone.Model
+          id: r.qualityprofile.id,
+          text: r.qualityprofile.text,
+          parent: r.qualityprofile.parent,
+          checked: true
+
diff --git a/sonar-server/src/main/webapp/coffee/coding-rules/views/header-view.coffee b/sonar-server/src/main/webapp/coffee/coding-rules/views/header-view.coffee
new file mode 100644 (file)
index 0000000..ddf75bc
--- /dev/null
@@ -0,0 +1,17 @@
+define [
+  'backbone.marionette',
+  'common/handlebars-extensions'
+], (
+  Marionette
+) ->
+
+  class CodingRulesHeaderView extends Marionette.ItemView
+    template: getTemplate '#coding-rules-header-template'
+
+
+    events:
+      'click #coding-rules-new-search': 'newSearch'
+
+
+    newSearch: ->
+      @options.app.router.navigate '', trigger: true
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/app.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/app.coffee
new file mode 100644 (file)
index 0000000..ca7e143
--- /dev/null
@@ -0,0 +1,142 @@
+requirejs.config
+  baseUrl: "#{baseUrl}/javascripts"
+
+  paths:
+    'jquery': 'third-party/jquery'
+    'backbone': 'third-party/backbone'
+    'backbone.marionette': 'third-party/backbone.marionette'
+    'handlebars': 'third-party/handlebars'
+    'moment': 'third-party/moment'
+    'select-list': 'common/select-list'
+
+  shim:
+    'backbone.marionette':
+      deps: ['backbone']
+      exports: 'Marionette'
+    'backbone':
+      exports: 'Backbone'
+    'handlebars':
+      exports: 'Handlebars'
+    'moment':
+      exports: 'moment'
+    'select-list':
+      exports: 'SelectList'
+
+
+requirejs [
+  'backbone', 'backbone.marionette', 'handlebars',
+  'quality-gate/collections/quality-gates',
+  'quality-gate/views/quality-gate-sidebar-list-view',
+  'quality-gate/views/quality-gate-actions-view',
+  'quality-gate/views/quality-gate-edit-view',
+  'quality-gate/router',
+  'quality-gate/layout',
+  'common/handlebars-extensions'
+], (
+  Backbone, Marionette, Handlebars,
+  QualityGates,
+  QualityGateSidebarListItemView,
+  QualityGateActionsView,
+  QualityGateEditView,
+  QualityGateRouter,
+  QualityGateLayout
+) ->
+
+  # Create a generic error handler for ajax requests
+  jQuery.ajaxSetup
+    error: (jqXHR) ->
+      text = jqXHR.responseText
+      errorBox = jQuery('.modal-error')
+      if jqXHR.responseJSON?.errors?
+        text = _.pluck(jqXHR.responseJSON.errors, 'msg').join '. '
+      if errorBox.length > 0
+        errorBox.show().text text
+      else
+        alert text
+
+
+  # Add html class to mark the page as navigator page
+  jQuery('html').addClass('navigator-page quality-gates-page');
+
+
+  # Create a Quality Gate Application
+  App = new Marionette.Application
+
+
+  App.qualityGates = new QualityGates
+
+
+  App.openFirstQualityGate = ->
+    if @qualityGates.length > 0
+      @router.navigate "show/#{@qualityGates.models[0].get('id')}", trigger: true
+    else
+      App.layout.detailsRegion.reset()
+
+
+  App.deleteQualityGate = (id) ->
+    App.qualityGates.remove id
+    App.openFirstQualityGate()
+
+
+  App.unsetDefaults = (id) ->
+    App.qualityGates.each (gate) ->
+      gate.set('default', false) unless gate.id == id
+
+
+  # Construct layout
+  App.addInitializer ->
+    @layout = new QualityGateLayout app: @
+    jQuery('body').append @layout.render().el
+
+
+  # Construct actions bar
+  App.addInitializer ->
+    @codingRulesHeaderView = new QualityGateActionsView
+      app: @
+    @layout.actionsRegion.show @codingRulesHeaderView
+
+
+  # Construct sidebar
+  App.addInitializer ->
+    @qualityGateSidebarListView = new QualityGateSidebarListItemView
+      collection: @qualityGates
+      app: @
+    @layout.resultsRegion.show @qualityGateSidebarListView
+
+
+  # Construct edit view
+  App.addInitializer ->
+    @qualityGateEditView = new QualityGateEditView app: @
+    @qualityGateEditView.render()
+
+
+  # Start router
+  App.addInitializer ->
+    @router = new QualityGateRouter app: @
+    Backbone.history.start()
+
+
+  # Open first quality gate when come to the page
+  App.addInitializer ->
+    initial = Backbone.history.fragment == ''
+    App.openFirstQualityGate() if initial
+
+
+  # Call app, Load metrics and the list of quality gates before start the application
+  appXHR = jQuery.ajax
+    url: "#{baseUrl}/api/qualitygates/app"
+  .done (r) =>
+      App.canEdit = r.edit
+      App.periods = r.periods
+      App.metrics = r.metrics
+      window.messages = r.messages
+
+  qualityGatesXHR = App.qualityGates.fetch()
+
+  jQuery.when(qualityGatesXHR, appXHR)
+    .done ->
+      # Remove the initial spinner
+      jQuery('#quality-gate-page-loader').remove()
+
+      # Start the application
+      App.start()
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/collections/conditions.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/collections/conditions.coffee
new file mode 100644 (file)
index 0000000..d5b76bc
--- /dev/null
@@ -0,0 +1,10 @@
+define [
+  'backbone',
+  'quality-gate/models/condition'
+], (
+  Backbone,
+  Condition
+) ->
+
+  class Conditions extends Backbone.Collection
+    model: Condition
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/collections/quality-gates.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/collections/quality-gates.coffee
new file mode 100644 (file)
index 0000000..976f105
--- /dev/null
@@ -0,0 +1,27 @@
+define [
+  'backbone',
+  'quality-gate/models/quality-gate'
+], (
+  Backbone,
+  QualityGate
+) ->
+
+  class QualityGates extends Backbone.Collection
+    model: QualityGate
+
+
+    url: ->
+      "#{baseUrl}/api/qualitygates/list"
+
+
+    # {
+    #   "qualitygates": [
+    #     { "id": 42, "name": "QG 1" },
+    #     { "id": 43, "name": "QG 2" },
+    #     { "id": 44, "name": "QG 3" }
+    #   ],
+    #   "default": 42
+    # }
+    parse: (r) ->
+      r.qualitygates.map (gate) ->
+        _.extend gate, default: gate.id == r.default
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/layout.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/layout.coffee
new file mode 100644 (file)
index 0000000..e9805d0
--- /dev/null
@@ -0,0 +1,34 @@
+define [
+  'backbone.marionette',
+  'common/handlebars-extensions'
+], (
+  Marionette
+) ->
+
+  class AppLayout extends Marionette.Layout
+    className: 'navigator quality-gates-navigator'
+    template: getTemplate '#quality-gates-layout'
+
+
+    regions:
+      headerRegion: '.navigator-header'
+      actionsRegion: '.navigator-actions'
+      resultsRegion: '.navigator-results'
+      detailsRegion: '.navigator-details'
+
+
+    initialize: (options) ->
+      @listenTo options.app.qualityGates, 'all', @updateLayout
+
+
+    updateLayout: ->
+      empty = @options.app.qualityGates.length == 0
+      @$(@headerRegion.el).toggle !empty
+      @$(@detailsRegion.el).toggle !empty
+
+
+    onRender: ->
+      @updateLayout()
+
+      # Adjust details region height
+      @$(@detailsRegion.el).css 'bottom', jQuery('#footer').outerHeight()
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/models/condition.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/models/condition.coffee
new file mode 100644 (file)
index 0000000..1fe2c63
--- /dev/null
@@ -0,0 +1,42 @@
+define [
+  'backbone'
+], (
+  Backbone
+) ->
+
+  class Condition extends Backbone.Model
+
+    url: ->
+      "#{baseUrl}/api/qualitygates/create_condition"
+
+
+    save: ->
+      method = unless @isNew() then 'update' else 'create'
+      data =
+        metric: @get('metric').key
+        op: @get('op')
+        warning: @get('warning')
+        error: @get('error')
+
+      unless @get('period') == '0'
+        data.period = @get('period')
+
+      unless @isNew()
+        data.id = @id
+      else
+        data.gateId = @get('gateId')
+
+      jQuery.ajax({
+        url: "#{baseUrl}/api/qualitygates/#{method}_condition"
+        type: 'POST'
+        data: data
+      }).done (r) =>
+        @set 'id', r.id
+
+
+    delete: ->
+      jQuery.ajax
+        url: "#{baseUrl}/api/qualitygates/delete_condition"
+        type: 'POST'
+        data: id: @id
+
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/models/quality-gate.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/models/quality-gate.coffee
new file mode 100644 (file)
index 0000000..5acffc0
--- /dev/null
@@ -0,0 +1,10 @@
+define [
+  'backbone'
+], (
+  Backbone
+) ->
+
+  class QualityGate extends Backbone.Model
+
+    url: ->
+      "#{baseUrl}/api/qualitygates/show?id=#{@get('id')}"
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/router.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/router.coffee
new file mode 100644 (file)
index 0000000..f21161a
--- /dev/null
@@ -0,0 +1,42 @@
+define [
+  'backbone',
+  'quality-gate/models/quality-gate',
+  'quality-gate/views/quality-gate-detail-view',
+  'quality-gate/views/quality-gate-detail-header-view',
+], (
+  Backbone,
+  QualityGate,
+  QualityGateDetailView,
+  QualityGateDetailHeaderView
+) ->
+
+  class QualityGateRouter extends Backbone.Router
+
+    routes:
+      'show/:id': 'show'
+
+
+    initialize: (options) ->
+      @app = options.app
+
+
+    show: (id) ->
+      qualityGate = @app.qualityGates.get id
+      if qualityGate
+        @app.qualityGateSidebarListView.highlight id
+
+        qualityGateDetailHeaderView = new QualityGateDetailHeaderView
+          app: @app
+          model: qualityGate
+        @app.layout.headerRegion.show qualityGateDetailHeaderView
+
+        qualityGateDetailView = new QualityGateDetailView
+          app: @app
+          model: qualityGate
+        @app.layout.detailsRegion.show qualityGateDetailView
+        qualityGateDetailView.$el.hide()
+
+        qualityGateDetailHeaderView.showSpinner()
+        qualityGate.fetch().done ->
+          qualityGateDetailView.$el.show()
+          qualityGateDetailHeaderView.hideSpinner()
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-actions-view.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-actions-view.coffee
new file mode 100644 (file)
index 0000000..27d6437
--- /dev/null
@@ -0,0 +1,27 @@
+define [
+  'backbone.marionette',
+  'handlebars',
+  'quality-gate/models/quality-gate'
+], (
+  Marionette,
+  Handlebars,
+  QualityGate
+) ->
+
+  class QualityGateActionsView extends Marionette.ItemView
+    template: Handlebars.compile jQuery('#quality-gate-actions-template').html()
+
+
+    events:
+      'click #quality-gate-add': 'add'
+
+
+    add: ->
+      qualityGate = new QualityGate()
+      @options.app.qualityGateEditView.method = 'create'
+      @options.app.qualityGateEditView.model = qualityGate
+      @options.app.qualityGateEditView.show()
+
+
+    serializeData: ->
+      _.extend super, canEdit: @options.app.canEdit
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-condition-view.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-condition-view.coffee
new file mode 100644 (file)
index 0000000..da1b8d4
--- /dev/null
@@ -0,0 +1,112 @@
+define [
+  'backbone.marionette',
+  'handlebars'
+], (
+  Marionette,
+  Handlebars
+) ->
+
+  class QualityGateDetailConditionView extends Marionette.ItemView
+    tagName: 'tr'
+    template: Handlebars.compile jQuery('#quality-gate-detail-condition-template').html()
+    spinner: '<i class="spinner"></i>'
+
+
+    modelEvents:
+      'change:id': 'render'
+
+
+    ui:
+      periodSelect: '[name=period]'
+      operatorSelect: '[name=operator]'
+      warningInput: '[name=warning]'
+      errorInput: '[name=error]'
+      actionsBox: '.quality-gate-condition-actions'
+      updateButton: '.update-condition'
+
+
+    events:
+      'click @ui.updateButton': 'saveCondition'
+      'click .delete-condition': 'deleteCondition'
+      'click .add-condition': 'saveCondition'
+      'click .cancel-add-condition': 'cancelAddCondition'
+      'keyup :input': 'enableUpdate'
+      'change :input': 'enableUpdate'
+
+
+    initialize: ->
+      @populateMetric()
+
+
+    populateMetric: ->
+      metricKey = @model.get('metric')
+      metric = _.findWhere @options.app.metrics, key: metricKey
+      @model.set { metric: metric }, { silent: true }
+
+
+    onRender: ->
+      @ui.periodSelect.val @model.get('period') || '0'
+      @ui.operatorSelect.val @model.get('op')
+      @ui.warningInput.val @model.get('warning')
+      @ui.errorInput.val @model.get('error')
+
+      @ui.periodSelect.select2
+        allowClear: false
+        minimumResultsForSearch: 999
+        width: '200px'
+
+      @ui.operatorSelect.select2
+        allowClear: false
+        minimumResultsForSearch: 999
+        width: '150px'
+
+      @ui.periodSelect.select2('open') if @model.isNew()
+
+
+    showSpinner: ->
+      jQuery(@spinner).prependTo @ui.actionsBox
+      @ui.actionsBox.find(':not(.spinner)').hide()
+
+
+    hideSpinner: ->
+      @ui.actionsBox.find('.spinner').remove()
+      @ui.actionsBox.find(':not(.spinner)').show()
+
+
+    saveCondition: ->
+      @showSpinner()
+      @model.set
+        period: @ui.periodSelect.val()
+        op: @ui.operatorSelect.val()
+        warning: @ui.warningInput.val()
+        error: @ui.errorInput.val()
+      @model.save()
+        .always =>
+          @ui.updateButton.prop 'disabled', true
+          @hideSpinner()
+        .done =>
+          @options.collectionView.updateConditions()
+
+
+    deleteCondition: ->
+      if confirm t('are_you_sure')
+        @showSpinner()
+        @model.delete().done =>
+          @options.collectionView.updateConditions()
+          @close()
+
+
+    cancelAddCondition: ->
+      @close()
+
+
+    enableUpdate: ->
+      @ui.updateButton.prop 'disabled', false
+
+
+    serializeData: ->
+      period = _.findWhere(@options.app.periods, key: '' + this.model.get('period'))
+      _.extend super,
+        canEdit: @options.app.canEdit
+        periods: @options.app.periods
+        periodText: period?.text
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-conditions-empty-view.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-conditions-empty-view.coffee
new file mode 100644 (file)
index 0000000..35bad09
--- /dev/null
@@ -0,0 +1,11 @@
+define [
+  'backbone.marionette',
+  'handlebars',
+], (
+  Marionette,
+  Handlebars,
+) ->
+
+  class QualityGateDetailConditionsView extends Marionette.ItemView
+    tagName: 'tr'
+    template: Handlebars.compile jQuery('#quality-gate-detail-conditions-empty-template').html()
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-conditions-view.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-conditions-view.coffee
new file mode 100644 (file)
index 0000000..9a29734
--- /dev/null
@@ -0,0 +1,86 @@
+define [
+  'backbone.marionette',
+  'handlebars',
+  'quality-gate/models/condition',
+  'quality-gate/views/quality-gate-detail-condition-view',
+  'quality-gate/views/quality-gate-detail-conditions-empty-view'
+], (
+  Marionette,
+  Handlebars,
+  Condition,
+  QualityGateDetailConditionView,
+  QualityGateDetailConditionsEmptyView
+) ->
+
+  class QualityGateDetailConditionsView extends Marionette.CompositeView
+    template: Handlebars.compile jQuery('#quality-gate-detail-conditions-template').html()
+    itemView: QualityGateDetailConditionView
+    emptyView: QualityGateDetailConditionsEmptyView
+    itemViewContainer: '.quality-gate-conditions tbody'
+
+
+    ui:
+      metricSelect: '#quality-gate-new-condition-metric'
+      introductionShowMore: '.quality-gate-introduction-show-more'
+      introductionMore: '.quality-gate-introduction-more'
+
+
+    events:
+      'click @ui.introductionShowMore': 'showMoreIntroduction'
+      'change @ui.metricSelect': 'addCondition'
+
+
+    itemViewOptions: ->
+      app: @options.app
+      collectionView: @
+
+
+    appendHtml: (compositeView, itemView) ->
+      if (compositeView.isBuffering)
+        compositeView.elBuffer.appendChild itemView.el
+        compositeView._bufferedChildren.push itemView
+      else
+        container = @getItemViewContainer compositeView
+        container.prepend itemView.el
+
+
+    onRender: ->
+      @ui.introductionMore.hide()
+      @ui.metricSelect.select2
+        allowClear: false,
+        width: '250px',
+        placeholder: t('alerts.select_metric')
+
+
+    groupedMetrics: ->
+      metrics = @options.app.metrics
+      metrics = _.groupBy metrics, 'domain'
+      metrics = _.map metrics, (metrics, domain) ->
+        domain: domain, metrics: _.sortBy metrics, 'short_name'
+      _.sortBy metrics, 'domain'
+
+
+    serializeData: ->
+      _.extend super,
+        canEdit: @options.app.canEdit
+        metricGroups: @groupedMetrics()
+
+
+    showMoreIntroduction: ->
+      @ui.introductionShowMore.hide()
+      @ui.introductionMore.show()
+
+
+    addCondition: ->
+      metric = @ui.metricSelect.val()
+      @ui.metricSelect.select2('val', '')
+      condition = new Condition
+        metric: metric
+        gateId: @options.gateId
+      @collection.unshift condition
+
+
+    updateConditions: ->
+      conditions = @collection.map (item) -> _.extend item.toJSON(),
+        metric: item.get('metric').key
+      @options.qualityGate.set { conditions: conditions }, { silent: true }
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-header-view.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-header-view.coffee
new file mode 100644 (file)
index 0000000..69900f0
--- /dev/null
@@ -0,0 +1,89 @@
+define [
+  'backbone.marionette',
+  'handlebars',
+  'quality-gate/models/quality-gate'
+], (
+  Marionette,
+  Handlebars,
+  QualityGate
+) ->
+
+  class QualityGateDetailHeaderView extends Marionette.ItemView
+    template: Handlebars.compile jQuery('#quality-gate-detail-header-template').html()
+    spinner: '<i class="spinner"></i>'
+
+
+    modelEvents:
+      'change': 'render'
+
+
+    events:
+      'click #quality-gate-rename': 'renameQualityGate'
+      'click #quality-gate-copy': 'copyQualityGate'
+      'click #quality-gate-delete': 'deleteQualityGate'
+      'click #quality-gate-set-as-default': 'setAsDefault'
+      'click #quality-gate-unset-as-default': 'unsetAsDefault'
+
+
+    renameQualityGate: ->
+      @options.app.qualityGateEditView.method = 'rename'
+      @options.app.qualityGateEditView.model = @model
+      @options.app.qualityGateEditView.show()
+
+
+    copyQualityGate: ->
+      copiedModel = new QualityGate @model.toJSON()
+      copiedModel.set 'default', false
+      @options.app.qualityGateEditView.method = 'copy'
+      @options.app.qualityGateEditView.model = copiedModel
+      @options.app.qualityGateEditView.show()
+
+
+    deleteQualityGate: ->
+      if confirm t('are_you_sure')
+        @showSpinner()
+        jQuery.ajax
+          type: 'POST'
+          url: "#{baseUrl}/api/qualitygates/destroy"
+          data: id: @model.id
+        .always =>
+          @hideSpinner()
+        .done =>
+          @options.app.deleteQualityGate @model.id
+
+
+    changeDefault: (set) ->
+      @showSpinner()
+      data = if set then { id: @model.id } else {}
+      method = if set then 'set_as_default' else 'unset_default'
+      jQuery.ajax
+        type: 'POST'
+        url: "#{baseUrl}/api/qualitygates/#{method}"
+        data: data
+      .always =>
+        @hideSpinner()
+      .done =>
+        @options.app.unsetDefaults @model.id
+        @model.set 'default', !@model.get('default')
+
+
+    setAsDefault: ->
+      @changeDefault true
+
+
+    unsetAsDefault: ->
+      @changeDefault false
+
+
+    showSpinner: ->
+      @$el.hide()
+      jQuery(@spinner).insertBefore @$el
+
+
+    hideSpinner: ->
+      @$el.prev().remove()
+      @$el.show()
+
+
+    serializeData: ->
+      _.extend super, canEdit: @options.app.canEdit
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-projects-view.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-projects-view.coffee
new file mode 100644 (file)
index 0000000..b496d31
--- /dev/null
@@ -0,0 +1,38 @@
+define [
+  'backbone.marionette',
+  'handlebars',
+  'select-list'
+], (
+  Marionette,
+  Handlebars
+) ->
+
+  class QualityGateDetailProjectsView extends Marionette.ItemView
+    template: Handlebars.compile jQuery('#quality-gate-detail-projects-template').html()
+
+
+    onRender: ->
+      unless @model.get('default')
+        new SelectList
+          el: @$('#select-list-projects')
+          width: '100%'
+          readOnly: !@options.app.canEdit
+          format: (item) -> item.name
+          searchUrl: "#{baseUrl}/api/qualitygates/search?gateId=#{@options.gateId}"
+          selectUrl: "#{baseUrl}/api/qualitygates/select"
+          deselectUrl: "#{baseUrl}/api/qualitygates/deselect"
+          extra:
+            gateId: @options.gateId
+          selectParameter: 'projectId'
+          selectParameterValue: 'id'
+          labels:
+            selected: t('quality_gates.projects.with')
+            deselected: t('quality_gates.projects.without')
+            all: t('quality_gates.projects.all')
+            noResults: t('quality_gates.projects.noResults')
+          tooltips:
+            select: t('quality_gates.projects.select_hint')
+            deselect: t('quality_gates.projects.deselect_hint')
+
+    serializeData: ->
+      _.extend super, canEdit: @options.app.canEdit
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-view.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-detail-view.coffee
new file mode 100644 (file)
index 0000000..475b25f
--- /dev/null
@@ -0,0 +1,50 @@
+define [
+  'backbone.marionette',
+  'handlebars',
+  'quality-gate/collections/conditions',
+  'quality-gate/views/quality-gate-detail-header-view',
+  'quality-gate/views/quality-gate-detail-conditions-view',
+  'quality-gate/views/quality-gate-detail-projects-view'
+], (
+  Marionette,
+  Handlebars,
+  Conditions,
+  QualityGateDetailHeaderView,
+  QualityGateDetailConditionsView,
+  QualityGateDetailProjectsView
+) ->
+
+  class QualityGateDetailView extends Marionette.Layout
+    template: Handlebars.compile jQuery('#quality-gate-detail-template').html()
+
+
+    regions:
+      conditionsRegion: '#quality-gate-conditions'
+      projectsRegion: '#quality-gate-projects'
+
+
+    modelEvents:
+      'change': 'render'
+
+
+    onRender: ->
+      @showConditions()
+      @showProjects()
+
+
+    showConditions: ->
+      conditions = new Conditions @model.get('conditions')
+      view = new QualityGateDetailConditionsView
+        app: @options.app
+        collection: conditions
+        gateId: @model.id
+        qualityGate: @model
+      @conditionsRegion.show view
+
+
+    showProjects: ->
+      view = new QualityGateDetailProjectsView
+        app: @options.app
+        model: @model
+        gateId: @model.id
+      @projectsRegion.show view
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-edit-view.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-edit-view.coffee
new file mode 100644 (file)
index 0000000..a1763ee
--- /dev/null
@@ -0,0 +1,86 @@
+define [
+  'backbone.marionette',
+  'handlebars'
+], (
+  Marionette,
+  Handlebars,
+) ->
+
+  class QualityGateEditView extends Marionette.ItemView
+    className: 'modal'
+    template: Handlebars.compile jQuery('#quality-gate-edit-template').html()
+
+
+    ui:
+      nameInput: '#quality-gate-edit-name'
+
+
+    events:
+      'submit form': 'onSubmit'
+      'click #quality-gate-cancel-create': 'hide'
+
+
+    onRender: ->
+      @$el.dialog
+        dialogClass: 'no-close',
+        width: '600px',
+        draggable: false,
+        autoOpen: false,
+        modal: true,
+        minHeight: 50,
+        resizable: false,
+        title: null
+
+
+    show: ->
+      @render()
+      @$el.dialog 'open'
+      @ui.nameInput.focus()
+
+
+    hide: ->
+      @$el.dialog 'close'
+
+
+    saveRequest: (data) ->
+      jQuery.ajax
+        type: 'POST'
+        url: "#{baseUrl}/api/qualitygates/#{@method}"
+        data: data
+      .done => @hide()
+
+
+    onSubmit: (e) ->
+      e.preventDefault()
+      switch @method
+        when 'create' then @createQualityGate()
+        when 'copy' then @copyQualityGate()
+        when 'rename' then @saveQualityGate()
+        else
+
+
+    createQualityGate: ->
+      data = name: @ui.nameInput.val()
+      @saveRequest(data).done (r) =>
+        @model.set id: r.id, name: r.name
+        @options.app.qualityGates.add @model
+        @options.app.router.navigate "show/#{r.id}", trigger: true
+
+
+    saveQualityGate: ->
+      data = id: @model.id, name: @ui.nameInput.val()
+      @saveRequest(data).done (r) =>
+        @model.set name: r.name
+
+
+    copyQualityGate: ->
+      data = id: @model.id, name: @ui.nameInput.val()
+      @saveRequest(data).done (r) =>
+        @model.set id: r.id, name: r.name
+        @options.app.qualityGates.add @model
+        @options.app.router.navigate "show/#{r.id}", trigger: true
+
+
+    serializeData: ->
+      if @model
+        _.extend @model.toJSON(), method: @method
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-sidebar-list-empty-view.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-sidebar-list-empty-view.coffee
new file mode 100644 (file)
index 0000000..e867a80
--- /dev/null
@@ -0,0 +1,12 @@
+define [
+  'backbone.marionette',
+  'handlebars'
+], (
+  Marionette,
+  Handlebars
+) ->
+
+  class QualityGateSidebarListEmptyView extends Marionette.ItemView
+    tagName: 'li'
+    className: 'empty'
+    template: Handlebars.compile jQuery('#quality-gate-sidebar-list-empty-template').html()
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-sidebar-list-item-view.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-sidebar-list-item-view.coffee
new file mode 100644 (file)
index 0000000..4587367
--- /dev/null
@@ -0,0 +1,27 @@
+define [
+  'backbone.marionette',
+  'handlebars'
+], (
+  Marionette,
+  Handlebars
+) ->
+
+  class QualityGateSidebarListItemView extends Marionette.ItemView
+    tagName: 'li'
+    template: Handlebars.compile jQuery('#quality-gate-sidebar-list-item-template').html()
+
+
+    modelEvents:
+      'change': 'render'
+
+
+    events:
+      'click': 'showQualityGate'
+
+
+    onRender: ->
+      @$el.toggleClass 'active', @options.highlighted
+
+
+    showQualityGate: ->
+      @options.app.router.navigate "show/#{@model.id}", trigger: true
diff --git a/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-sidebar-list-view.coffee b/sonar-server/src/main/webapp/coffee/quality-gate/views/quality-gate-sidebar-list-view.coffee
new file mode 100644 (file)
index 0000000..44269db
--- /dev/null
@@ -0,0 +1,29 @@
+define [
+  'backbone.marionette',
+  'handlebars',
+  'quality-gate/models/quality-gate',
+  'quality-gate/views/quality-gate-sidebar-list-item-view',
+  'quality-gate/views/quality-gate-sidebar-list-empty-view'
+], (
+  Marionette,
+  Handlebars,
+  QualityGate,
+  QualityGateSidebarListItemView,
+  QualityGateSidebarListEmptyView
+) ->
+
+  class QualityGateSidebarListView extends Marionette.CollectionView
+    tagName: 'ol'
+    className: 'navigator-results-list'
+    itemView: QualityGateSidebarListItemView
+    emptyView: QualityGateSidebarListEmptyView
+
+
+    itemViewOptions: (model) ->
+      app: @options.app
+      highlighted: model.get('id') == +@highlighted
+
+
+    highlight: (id) ->
+      @highlighted = id
+      @render()
diff --git a/sonar-server/src/main/webapp/coffee/tests/common/inputsSpec.coffee b/sonar-server/src/main/webapp/coffee/tests/common/inputsSpec.coffee
new file mode 100644 (file)
index 0000000..d20983d
--- /dev/null
@@ -0,0 +1,82 @@
+$ = jQuery
+
+describe 'WORK_DUR suite', ->
+
+  beforeEach ->
+    window.SS = {}
+    window.SS.phrases =
+      'work_duration':
+        'x_days': '{0}d', 'x_hours': '{0}h', 'x_minutes': '{0}min'
+
+    @input = $('<input type="text">')
+    @input.appendTo $('body')
+    @input.data 'type', 'WORK_DUR'
+
+
+  it 'converts', ->
+    @input.originalVal '2d 7h 13min'
+    expect(@input.val()).toBe 1393
+
+
+  it 'converts only days', ->
+    @input.originalVal '1d'
+    expect(@input.val()).toBe 480
+
+
+  it 'converts hours with minutes', ->
+    @input.originalVal '2h 30min'
+    expect(@input.val()).toBe 150
+
+
+  it 'restores', ->
+    @input.val 1393
+    expect(@input.originalVal()).toBe '2d 7h 13min'
+
+
+  it 'returns initially incorrect value', ->
+    @input.val 'something'
+    expect(@input.val()).toBe 'something'
+
+
+
+describe 'RATING suite', ->
+
+  beforeEach ->
+    @input = $('<input type="text">')
+    @input.appendTo $('body')
+    @input.data 'type', 'RATING'
+
+
+  it 'converts A', ->
+    @input.originalVal 'A'
+    expect(@input.val()).toBe 1
+
+
+  it 'converts B', ->
+    @input.originalVal 'B'
+    expect(@input.val()).toBe 2
+
+
+  it 'converts E', ->
+    @input.originalVal 'E'
+    expect(@input.val()).toBe 5
+
+
+  it 'does not convert F', ->
+    @input.originalVal 'F'
+    expect(@input.val()).toBe 'F'
+
+
+  it 'restores A', ->
+    @input.val 1
+    expect(@input.originalVal()).toBe 'A'
+
+
+  it 'restores E', ->
+    @input.val 5
+    expect(@input.originalVal()).toBe 'E'
+
+
+  it 'returns initially incorrect value', ->
+    @input.val 'something'
+    expect(@input.val()).toBe 'something'
diff --git a/sonar-server/src/main/webapp/coffee/tests/translateSpec.coffee b/sonar-server/src/main/webapp/coffee/tests/translateSpec.coffee
new file mode 100644 (file)
index 0000000..7b4576b
--- /dev/null
@@ -0,0 +1,75 @@
+$ = jQuery
+
+describe 'translation "t" suite', ->
+
+  beforeEach ->
+    window.messages =
+      'something': 'SOMETHING'
+      'something_with_underscore': 'SOMETHING_WITH_UNDERSCORE'
+      'something_with{braces}': 'SOMETHING_WITH{braces}'
+
+    window.SS =
+      phrases:
+        'something': 'SOMETHING ANOTHER'
+
+
+  afterEach ->
+    window.messages = window.SS = undefined
+
+
+  it 'translates', ->
+    expect(t('something')).toBe 'SOMETHING'
+
+
+  it 'translates with underscore', ->
+    expect(t('something_with_underscore')).toBe 'SOMETHING_WITH_UNDERSCORE'
+
+
+  it 'translates with braces', ->
+    expect(t('something_with{braces}')).toBe 'SOMETHING_WITH{braces}'
+
+
+  it 'fallbacks to "translate"', ->
+    window.messages = undefined
+    expect(t('something')).toBe 'SOMETHING ANOTHER'
+
+
+  it 'returns the key when no translation', ->
+    expect(t('something_another')).toBe 'something_another'
+
+
+
+describe 'translation "translate" suite', ->
+
+  beforeEach ->
+    window.SS =
+      phrases:
+        'something': 'SOMETHING'
+        'something_with_underscore': 'SOMETHING_WITH_UNDERSCORE'
+        'something_with{braces}': 'SOMETHING_WITH{braces}'
+
+
+  afterEach ->
+    window.messages = window.SS = undefined
+
+
+  it 'translates', ->
+    expect(translate('something')).toBe 'SOMETHING'
+
+
+  it 'translates with underscore', ->
+    expect(translate('something_with_underscore')).toBe 'SOMETHING_WITH_UNDERSCORE'
+
+
+  it 'translates with braces', ->
+    expect(translate('something_with{braces}')).toBe 'SOMETHING_WITH{braces}'
+
+
+  it 'returns the key when no translation', ->
+    expect(translate('something_another')).toBe 'something_another'
+
+
+  it 'does not fail when there is no dictionary', ->
+    window.SS = undefined
+    expect(translate('something_another')).toBe 'something_another'
+
diff --git a/sonar-server/src/main/webapp/javascripts/coding-rules/app.coffee b/sonar-server/src/main/webapp/javascripts/coding-rules/app.coffee
deleted file mode 100644 (file)
index a930804..0000000
+++ /dev/null
@@ -1,329 +0,0 @@
-requirejs.config
-  baseUrl: "#{baseUrl}/javascripts"
-
-  paths:
-    'backbone': 'third-party/backbone'
-    'backbone.marionette': 'third-party/backbone.marionette'
-    'handlebars': 'third-party/handlebars'
-    'jquery.mockjax': 'third-party/jquery.mockjax'
-
-  shim:
-    'backbone.marionette':
-      deps: ['backbone']
-      exports: 'Marionette'
-    'backbone':
-      exports: 'Backbone'
-    'handlebars':
-      exports: 'Handlebars'
-
-
-requirejs [
-  'backbone', 'backbone.marionette',
-
-  'coding-rules/layout',
-  'coding-rules/router',
-
-  # views
-  'coding-rules/views/header-view',
-  'coding-rules/views/actions-view',
-  'coding-rules/views/filter-bar-view',
-  'coding-rules/views/coding-rules-list-view',
-  'coding-rules/views/coding-rules-bulk-change-view',
-  'coding-rules/views/coding-rules-quality-profile-activation-view',
-
-  # filters
-  'navigator/filters/base-filters',
-  'navigator/filters/choice-filters',
-  'navigator/filters/string-filters',
-  'navigator/filters/date-filter-view',
-  'coding-rules/views/filters/quality-profile-filter-view',
-  'coding-rules/views/filters/inheritance-filter-view',
-
-  'coding-rules/mockjax'
-], (
-  Backbone, Marionette,
-
-  CodingRulesLayout,
-  CodingRulesRouter,
-
-  # views
-  CodingRulesHeaderView,
-  CodingRulesActionsView,
-  CodingRulesFilterBarView,
-  CodingRulesListView,
-  CodingRulesBulkChangeView,
-  CodingRulesQualityProfileActivationView,
-
-  # filters
-  BaseFilters,
-  ChoiceFilters,
-  StringFilterView,
-  DateFilterView,
-  QualityProfileFilterView,
-  InheritanceFilterView
-) ->
-
-  # Create a generic error handler for ajax requests
-  jQuery.ajaxSetup
-    error: (jqXHR) ->
-      text = jqXHR.responseText
-      errorBox = jQuery('.modal-error')
-      if jqXHR.responseJSON?.errors?
-        text = _.pluck(jqXHR.responseJSON.errors, 'msg').join '. '
-      if errorBox.length > 0
-        errorBox.show().text text
-      else
-        alert text
-
-
-  # Add html class to mark the page as navigator page
-  jQuery('html').addClass('navigator-page coding-rules-page');
-
-
-  # Create an Application
-  App = new Marionette.Application
-
-
-  App.getQuery =  ->
-    @filterBarView.getQuery()
-
-
-  App.restoreSorting = ->
-
-
-
-  App.storeQuery = (query, sorting) ->
-    if sorting
-      _.extend query,
-        sort: sorting.sort
-        asc: '' + sorting.asc
-    queryString = _.map query, (v, k) -> "#{k}=#{encodeURIComponent(v)}"
-    @router.navigate queryString.join('|'), replace: true
-
-
-
-  App.fetchList = (firstPage) ->
-    query = @getQuery()
-    fetchQuery = _.extend { pageIndex: @pageIndex }, query
-
-    if @codingRules.sorting
-      _.extend fetchQuery,
-          sort: @codingRules.sorting.sort,
-          asc: @codingRules.sorting.asc
-
-    @storeQuery query, @codingRules.sorting
-
-    @layout.showSpinner 'resultsRegion'
-    jQuery.ajax
-      url: "#{baseUrl}/api/codingrules/search"
-      data: fetchQuery
-    .done (r) =>
-      if firstPage
-        @codingRules.reset r.codingrules
-      else
-        @codingRules.add r.codingrules
-      @codingRules.paging = r.paging
-      @codingRulesListView = new CodingRulesListView
-        app: @
-        collection: @codingRules
-      @layout.resultsRegion.show @codingRulesListView
-      @codingRulesListView.selectFirst()
-
-
-
-  App.fetchFirstPage = ->
-    @pageIndex = 1
-    App.fetchList true
-
-
-  App.fetchNextPage = ->
-    if @pageIndex < @codingRules.paging.pages
-      @pageIndex++
-      App.fetchList false
-
-
-  App.getActiveQualityProfile = ->
-    value = @activeInFilter.get('value')
-    if value? && value.length == 1 then value[0] else null
-
-
-  App.getInactiveQualityProfile = ->
-    value = @inactiveInFilter.get('value')
-    if value? && value.length == 1 then value[0] else null
-
-
-  # Construct layout
-  App.addInitializer ->
-    @layout = new CodingRulesLayout app: @
-    jQuery('body').append @layout.render().el
-
-
-  # Construct header
-  App.addInitializer ->
-    @codingRulesHeaderView = new CodingRulesHeaderView app: @
-    @layout.headerRegion.show @codingRulesHeaderView
-
-
-  # Define coding rules
-  App.addInitializer ->
-    @codingRules = new Backbone.Collection
-    @codingRules.sorting = sort: 'CREATION_DATE', asc: false
-
-
-  # Construct status bar
-  App.addInitializer ->
-    @codingRulesActionsView = new CodingRulesActionsView
-      app: @
-      collection: @codingRules
-    @layout.actionsRegion.show @codingRulesActionsView
-
-
-  # Construct bulk change view
-  App.addInitializer ->
-    @codingRulesBulkChangeView = new CodingRulesBulkChangeView app: @
-
-
-  # Construct quality profile activation view
-  App.addInitializer ->
-    @codingRulesQualityProfileActivationView = new CodingRulesQualityProfileActivationView app: @
-
-
-  # Define filters
-  App.addInitializer ->
-    @filters = new BaseFilters.Filters
-
-    @filters.add new BaseFilters.Filter
-      name: t 'coding_rules.filters.name'
-      property: 'name'
-      type: StringFilterView
-
-    @filters.add new BaseFilters.Filter
-      name: t 'coding_rules.filters.language'
-      property: 'languages'
-      type: ChoiceFilters.ChoiceFilterView
-      choices: @languages
-
-    @filters.add new BaseFilters.Filter
-      name: t 'coding_rules.filters.severity'
-      property: 'severities'
-      type: ChoiceFilters.ChoiceFilterView
-      choices:
-        'BLOCKER': t 'severity.BLOCKER'
-        'CRITICAL': t 'severity.CRITICAL'
-        'MAJOR': t 'severity.MAJOR'
-        'MINOR': t 'severity.MINOR'
-        'INFO': t 'severity.INFO'
-      choiceIcons:
-        'BLOCKER': 'severity-blocker'
-        'CRITICAL': 'severity-critical'
-        'MAJOR': 'severity-major'
-        'MINOR': 'severity-minor'
-        'INFO': 'severity-info'
-
-    @filters.add new BaseFilters.Filter
-      name: t 'coding_rules.filters.tag'
-      property: 'tags'
-      type: ChoiceFilters.ChoiceFilterView
-      choices: @tags
-
-    @activeInFilter = new BaseFilters.Filter
-      name: t 'coding_rules.filters.in_quality_profile'
-      property: 'in_quality_profile'
-      type: QualityProfileFilterView
-      multiple: false
-    @filters.add @activeInFilter
-
-
-    @filters.add new BaseFilters.Filter
-      name: t 'coding_rules.filters.key'
-      property: 'key'
-      type: StringFilterView
-      enabled: false
-      optional: true
-
-    @filters.add new BaseFilters.Filter
-      name: t 'coding_rules.filters.description'
-      property: 'description'
-      type: StringFilterView
-      enabled: false
-      optional: true
-
-    @filters.add new BaseFilters.Filter
-      name: t 'coding_rules.filters.repository'
-      property: 'repositories'
-      type: ChoiceFilters.ChoiceFilterView
-      enabled: false
-      optional: true
-      choices: @repositories
-
-    @filters.add new BaseFilters.Filter
-      name: t 'coding_rules.filters.status'
-      property: 'statuses'
-      type: ChoiceFilters.ChoiceFilterView
-      enabled: false
-      optional: true
-      choices: @statuses
-
-    @filters.add new BaseFilters.Filter
-      name: t 'coding_rules.filters.availableSince'
-      property: 'availableSince'
-      type: DateFilterView
-      enabled: false
-      optional: true
-
-    @inactiveInFilter = new BaseFilters.Filter
-      name: t 'coding_rules.filters.out_of_quality_profile'
-      property: 'out_of_quality_profile'
-      type: QualityProfileFilterView
-      multiple: false
-      enabled: false
-      optional: true
-    @filters.add @inactiveInFilter
-
-    @filters.add new BaseFilters.Filter
-      name: t 'coding_rules.filters.inheritance'
-      property: 'inheritance'
-      type: InheritanceFilterView
-      enabled: false
-      optional: true
-      multiple: false
-      qualityProfileFilter: @activeInFilter
-      choices:
-        'any': t 'coding_rules.filters.inheritance.any'
-        'not_inhertited': t 'coding_rules.filters.inheritance.not_inherited'
-        'inhertited': t 'coding_rules.filters.inheritance.inherited'
-        'overriden': t 'coding_rules.filters.inheritance.overriden'
-
-    @filterBarView = new CodingRulesFilterBarView
-      app: @
-      collection: @filters,
-      extra: sort: '', asc: false
-    @layout.filtersRegion.show @filterBarView
-
-
-  # Start router
-  App.addInitializer ->
-    @router = new CodingRulesRouter app: @
-    Backbone.history.start()
-
-
-  # Call app before start the application
-  appXHR = jQuery.ajax
-    url: "#{baseUrl}/api/codingrules/app"
-
-  jQuery.when(appXHR)
-  .done (r) ->
-      App.appState = new Backbone.Model
-      App.state = new Backbone.Model
-      App.qualityProfiles = r.qualityprofiles
-      App.languages = r.languages
-      App.repositories = r.repositories
-      App.statuses = r.statuses
-      App.tags = r.tags
-      window.messages = r.messages
-
-      # Remove the initial spinner
-      jQuery('#coding-rules-page-loader').remove()
-
-      # Start the application
-      App.start()
index 37d534fbd60b83ea44897c647d2ecf69ef196ebb..30594f5515efe0ef8143ed62f59d3a463e024663 100644 (file)
@@ -1,4 +1,3 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   requirejs.config({
     baseUrl: "" + baseUrl + "/javascripts",
@@ -61,8 +60,7 @@
       });
     };
     App.fetchList = function(firstPage) {
-      var fetchQuery, query,
-        _this = this;
+      var fetchQuery, query;
       query = this.getQuery();
       fetchQuery = _.extend({
         pageIndex: this.pageIndex
       return jQuery.ajax({
         url: "" + baseUrl + "/api/codingrules/search",
         data: fetchQuery
-      }).done(function(r) {
-        if (firstPage) {
-          _this.codingRules.reset(r.codingrules);
-        } else {
-          _this.codingRules.add(r.codingrules);
-        }
-        _this.codingRules.paging = r.paging;
-        _this.codingRulesListView = new CodingRulesListView({
-          app: _this,
-          collection: _this.codingRules
-        });
-        _this.layout.resultsRegion.show(_this.codingRulesListView);
-        return _this.codingRulesListView.selectFirst();
-      });
+      }).done((function(_this) {
+        return function(r) {
+          if (firstPage) {
+            _this.codingRules.reset(r.codingrules);
+          } else {
+            _this.codingRules.add(r.codingrules);
+          }
+          _this.codingRules.paging = r.paging;
+          _this.codingRulesListView = new CodingRulesListView({
+            app: _this,
+            collection: _this.codingRules
+          });
+          _this.layout.resultsRegion.show(_this.codingRulesListView);
+          return _this.codingRulesListView.selectFirst();
+        };
+      })(this));
     };
     App.fetchFirstPage = function() {
       this.pageIndex = 1;
diff --git a/sonar-server/src/main/webapp/javascripts/coding-rules/layout.coffee b/sonar-server/src/main/webapp/javascripts/coding-rules/layout.coffee
deleted file mode 100644 (file)
index 0e3abd4..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-define [
-  'backbone.marionette',
-  'common/handlebars-extensions'
-], (
-  Marionette
-) ->
-
-  class AppLayout extends Marionette.Layout
-    className: 'navigator coding-rules-navigator'
-    template: getTemplate '#coding-rules-layout'
-    spinner: '<i class="spinner"></i>'
-
-
-    regions:
-      headerRegion: '.navigator-header'
-      actionsRegion: '.navigator-actions'
-      resultsRegion: '.navigator-results'
-      detailsRegion: '.navigator-details'
-      filtersRegion: '.navigator-filters'
-
-
-    onRender: ->
-      # Adjust details region height
-      @$(@detailsRegion.el).css 'bottom', jQuery('#footer').outerHeight()
-
-
-    showSpinner: (region) ->
-      @$(@[region].el).html @spinner
index 91d7c1067ee885e6c8b28da3be2a04482216d2b1..b042d824ee91e7316391caa0398f6774cd9545c4 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'common/handlebars-extensions'], function(Marionette) {
-    var AppLayout, _ref;
+    var AppLayout;
     return AppLayout = (function(_super) {
       __extends(AppLayout, _super);
 
       function AppLayout() {
-        _ref = AppLayout.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return AppLayout.__super__.constructor.apply(this, arguments);
       }
 
       AppLayout.prototype.className = 'navigator coding-rules-navigator';
diff --git a/sonar-server/src/main/webapp/javascripts/coding-rules/mockjax.coffee b/sonar-server/src/main/webapp/javascripts/coding-rules/mockjax.coffee
deleted file mode 100644 (file)
index d052e6d..0000000
+++ /dev/null
@@ -1,280 +0,0 @@
-define ['jquery.mockjax'], ->
-
-  jQuery.mockjaxSettings.contentType = 'text/json';
-  jQuery.mockjaxSettings.responseTime = 250;
-
-  # GET /api/codingrules/app
-  jQuery.mockjax
-    url: "#{baseUrl}/api/codingrules/app"
-    responseText: JSON.stringify
-      qualityprofiles: [
-        { key: 'sonarway', name: 'Sonar Way', parent: null },
-        { key: 'qualityprofile1', name: 'Quality Profile 1', parent: 'sonarway' },
-        { key: 'qualityprofile2', name: 'Quality Profile 2', parent: 'sonarway' },
-        { key: 'qualityprofile3', name: 'Quality Profile 3', parent: null },
-      ]
-      languages:
-        java: 'Java'
-        javascript: 'JavaScript'
-      repositories:
-        'checkstyle': 'Checkstyle'
-        'common-java': 'Common SonarQube'
-        'findbugs': 'FindBugs'
-        'pmd': 'PMD'
-        'pmd-unit-tests': 'PMD Unit Tests'
-        'squid': 'SonarQube'
-      statuses:
-        'BETA': 'Beta'
-        'DEPRECATED': 'Deprecated'
-        'READY': 'Ready'
-      tags:
-        'brain-overload': 'brain-overload'
-        'bug': 'bug'
-        'comment': 'comment'
-        'convention': 'convention'
-        'error-handling': 'error-handling'
-        'formatting': 'formatting'
-        'java8': 'java8'
-        'multithreading': 'multithreading'
-        'naming': 'naming'
-        'pitfall': 'pitfall'
-        'security': 'security'
-        'size': 'size'
-        'unused': 'unused'
-        'unused-code': 'unused-code'
-      messages:
-        'all': 'All'
-        'any': 'Any'
-        'apply': 'Apply'
-        'bulk_change': 'Bulk Change'
-        'cancel': 'Cancel'
-        'change': 'Change'
-        'delete': 'Delete'
-        'done': 'Done'
-        'edit': 'Edit'
-        'moreCriteria': '+ More Criteria'
-        'search_verb': 'Search'
-        'severity': 'Severity'
-        'update': 'Update'
-
-        'severity.BLOCKER': 'Blocker'
-        'severity.CRITICAL': 'Critical'
-        'severity.MAJOR': 'Major'
-        'severity.MINOR': 'Minor'
-        'severity.INFO': 'Info'
-
-        'coding_rules.activate': 'Activate'
-        'coding_rules.activate_quality_profile': 'Activate Quality Profile'
-        'coding_rules.add_note': 'Add Note'
-        'coding_rules.available_since': 'Available Since'
-        'coding_rules.bulk_change': 'Bulk Change'
-        'coding_rules.extend_description': 'Extend Description'
-        'coding_rules.deactivate_quality_profile': 'Deactivate'
-        'coding_rules.found': 'Found'
-        'coding_rules.inherits': 'Inherits'
-        'coding_rules.key': 'Key:'
-        'coding_rules.new_search': 'New Search'
-        'coding_rules.no_results': 'No Coding Rules'
-        'coding_rules.order': 'Order'
-        'coding_rules.ordered_by': 'Ordered By'
-        'coding_rules.original': 'Original:'
-        'coding_rules.page': 'Coding Rules'
-        'coding_rules.parameters': 'Parameters'
-        'coding_rules.parameters.default_value': 'Default Value:'
-        'coding_rules.quality_profiles': 'Quality Profiles'
-        'coding_rules.quality_profile': 'Quality Profile'
-        'coding_rules.repository': 'Repository:'
-        'coding_rules.revert_to_parent_definition': 'Revert to Parent Definition'
-        'coding_rules._rules': 'rule(s)'
-        'coding_rules.select_tag': 'Select Tag'
-
-        'coding_rules.filters.availableSince': 'Available Since'
-        'coding_rules.filters.description': 'Description'
-        'coding_rules.filters.in_quality_profile': 'In Quality Profile'
-        'coding_rules.filters.inheritance': 'Inheritance'
-        'coding_rules.filters.inheritance.inactive': 'Inheritance criteria is available when an inherited quality profile is selected'
-        'coding_rules.filters.inheritance.any': 'Any'
-        'coding_rules.filters.inheritance.not_inherited': 'Not Inherited'
-        'coding_rules.filters.inheritance.inherited': 'Inherited'
-        'coding_rules.filters.inheritance.overriden': 'Overriden'
-        'coding_rules.filters.key': 'Key'
-        'coding_rules.filters.language': 'Language'
-        'coding_rules.filters.name': 'Name'
-        'coding_rules.filters.out_of_quality_profile': 'Out of Quality Profile'
-        'coding_rules.filters.repository': 'Repository'
-        'coding_rules.filters.severity': 'Severity'
-        'coding_rules.filters.status': 'Status'
-        'coding_rules.filters.tag': 'Tag'
-
-        'coding_rules.sort.creation_date': 'Creation Date'
-        'coding_rules.sort.name': 'Name'
-
-
-  # GET /api/codingrules/search
-  jQuery.mockjax
-    url: "#{baseUrl}/api/codingrules/search"
-    responseText: JSON.stringify
-      codingrules: [
-        {
-          name: 'Array designators "[]" should be located after the type in method signatures'
-          language: 'Java'
-          severity: 'MAJOR'
-          status: 'DEPRECATED'
-        },
-        {
-          name: 'Avoid Array Loops'
-          language: 'Java'
-          severity: 'CRITICAL'
-          status: 'READY'
-        },
-        {
-          name: 'Bad practice - Abstract class defines covariant compareTo() method'
-          language: 'Java'
-          severity: 'MAJOR'
-          status: 'READY'
-        },
-        {
-          name: 'Correctness - Use of class without a hashCode() method in a hashed data structure'
-          language: 'Java'
-          severity: 'MINOR'
-          status: 'BETA'
-        },
-        {
-          name: 'Useless Operation On Immutable'
-          language: 'Java'
-          severity: 'MAJOR'
-          status: 'READY'
-        }
-      ]
-      paging:
-        total: 5
-        fTotal: '5'
-
-
-
-  # GET /api/codingrules/show
-  jQuery.mockjax
-    url: "#{baseUrl}/api/codingrules/show"
-    responseText: JSON.stringify
-      codingrule:
-        name: 'Array designators "[]" should be located after the type in method signatures'
-        language: 'Java'
-        tags: ['bug', 'comment', 'java8']
-        creationDate: '2013-10-15'
-        fCreationDate: 'Oct 15, 2013'
-        status: 'DEPRECATED'
-        repository: 'squid'
-        key: 'S1190'
-        parameters: [
-          { key: 'someParameter', type: 'INT', default: 4, description: 'Some parameter description' }
-          { key: 'boolParameter', type: 'BOOL', description: 'Bool parameter description' }
-        ]
-        description: '''
-            <p>
-            According to the Java Language Specification:
-            </p>
-
-            <pre>For compatibility with older versions of the Java SE platform,
-            the declaration of a method that returns an array is allowed to place (some or all of)
-            the empty bracket pairs that form the declaration of the array type after
-            the formal parameter list. This obsolescent syntax should not be used in new code.
-            </pre>
-
-            <p>The following code snippet illustrates this rule:</p>
-
-            <pre>public int getVector()[] { /* ... */ }    // Non-Compliant
-
-            public int[] getVector() { /* ... */ }    // Compliant
-
-            public int[] getMatrix()[] { /* ... */ }  // Non-Compliant
-
-            public int[][] getMatrix() { /* ... */ }  // Compliant
-            </pre>'''
-        extra: '''<p>This note is here <b>only for test purposes</b>.</p>'''
-        extraRaw: '''This note is here *only for test purposes*.'''
-
-        qualityProfiles: [
-          {
-            name: 'SonarWay'
-            key: 'sonarway'
-            severity: 'MINOR'
-            canDeactivate: true
-            canUpdate: true
-            parameters: [
-              { key: 'someParameter', value: 8 }
-            ]
-          },
-          {
-            name: 'Quality Profile 1'
-            key: 'qualityprofile1'
-            severity: 'MAJOR'
-            canDeactivate: false
-            canUpdate: false
-            parameters: [
-              { key: 'someParameter', value: 6 }
-            ]
-            inherits: 'sonarway'
-            note:
-              username: 'Admin Admin'
-              html: '''<p>This note is here <b>only for test purposes</b>.</p>'''
-              raw: '''This note is here *only for test purposes*.'''
-              fCreationDate: 'less than a minute'
-          }
-        ]
-
-
-
-  # POST /api/codingrules/extend_description
-  jQuery.mockjax
-    url: "#{baseUrl}/api/codingrules/extend_description"
-    responseText: JSON.stringify
-      extra: '''<p>This note is here <i>only for test purposes</i>.</p>'''
-      extraRaw: '''This note is here *only for test purposes*.'''
-
-
-  # POST /api/codingrules/bulk_change
-  jQuery.mockjax
-    url: "#{baseUrl}/api/codingrules/bulk_change"
-
-
-  # POST /api/codingrules/set_tags
-  jQuery.mockjax
-    url: "#{baseUrl}/api/codingrules/set_tags"
-
-
-  # POST /api/codingrules/activate
-  jQuery.mockjax
-    url: "#{baseUrl}/api/codingrules/activate"
-
-
-  # POST /api/codingrules/note
-  jQuery.mockjax
-    url: "#{baseUrl}/api/codingrules/note"
-    responseText: JSON.stringify
-      note:
-        username: 'Admin Admin'
-        html: '''<p>This note is here <b>only for test purposes</b>.</p>'''
-        raw: '''This note is here *only for test purposes*.'''
-        fCreationDate: 'less than a minute'
-
-
-  # GET /api/qualityprofiles/list
-  jQuery.mockjax
-    url: "#{baseUrl}/api/qualityprofiles/list"
-    responseText: JSON.stringify
-      more: false
-      results: [
-        { id: 'sonarway', text: 'Sonar Way', parent: null },
-        { id: 'qp1', text: 'Quality Profile 1', parent: 'sonarway' },
-        { id: 'qp2', text: 'Quality Profile 2', parent: 'sonarway' },
-        { id: 'qp3', text: 'Quality Profile 3', parent: null },
-      ]
-
-
-  # GET /api/qualityprofiles/show
-  jQuery.mockjax
-    url: "#{baseUrl}/api/qualityprofiles/show"
-    responseText: JSON.stringify
-      qualityprofile:
-        id: 'sonarway', text: 'Sonar Way', parent: null
-
index 6d86976882b252000e19f5a7d01e0e645683e7d8..a526a99d3a7ce5794c8546705d93cd3d7188290a 100644 (file)
@@ -1,4 +1,3 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   define(['jquery.mockjax'], function() {
     jQuery.mockjaxSettings.contentType = 'text/json';
diff --git a/sonar-server/src/main/webapp/javascripts/coding-rules/router.coffee b/sonar-server/src/main/webapp/javascripts/coding-rules/router.coffee
deleted file mode 100644 (file)
index 7d55132..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-define [
-  'backbone',
-], (
-  Backbone,
-) ->
-
-  class AppRouter extends Backbone.Router
-
-    routes:
-      '': 'index'
-      ':query': 'index'
-
-
-    initialize: (options) ->
-      @app = options.app
-
-
-    parseQuery: (query, separator) ->
-      (query || '').split(separator || '|').map (t) ->
-        tokens = t.split('=')
-        key: tokens[0], value: decodeURIComponent(tokens[1])
-
-
-    emptyQuery: ->
-      @navigate '', trigger: true, replace: true
-
-
-    index: (query) ->
-      params = this.parseQuery(query)
-      idObj = _.findWhere(params, { key: 'id' })
-      if (idObj)
-        f = this.app.favoriteFilter
-        @app.canSave = false
-        f.set('id', idObj.value)
-        f.fetch
-          success: =>
-            params = _.extend({}, @parseQuery(f.get('query')), params)
-            @loadResults(params)
-      else
-        @loadResults(params)
-
-
-    loadResults: (params) ->
-      @app.filterBarView.restoreFromQuery(params)
-      @app.restoreSorting(params)
-      @app.fetchFirstPage()
index 2fa7aacc72308a7e8fcf23ce0ae53eb4bdbed8cd..91e750abdfe859f97c00fd214ee97bb18a903610 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone'], function(Backbone) {
-    var AppRouter, _ref;
+    var AppRouter;
     return AppRouter = (function(_super) {
       __extends(AppRouter, _super);
 
       function AppRouter() {
-        _ref = AppRouter.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return AppRouter.__super__.constructor.apply(this, arguments);
       }
 
       AppRouter.prototype.routes = {
@@ -41,8 +39,7 @@
       };
 
       AppRouter.prototype.index = function(query) {
-        var f, idObj, params,
-          _this = this;
+        var f, idObj, params;
         params = this.parseQuery(query);
         idObj = _.findWhere(params, {
           key: 'id'
           this.app.canSave = false;
           f.set('id', idObj.value);
           return f.fetch({
-            success: function() {
-              params = _.extend({}, _this.parseQuery(f.get('query')), params);
-              return _this.loadResults(params);
-            }
+            success: (function(_this) {
+              return function() {
+                params = _.extend({}, _this.parseQuery(f.get('query')), params);
+                return _this.loadResults(params);
+              };
+            })(this)
           });
         } else {
           return this.loadResults(params);
diff --git a/sonar-server/src/main/webapp/javascripts/coding-rules/views/actions-view.coffee b/sonar-server/src/main/webapp/javascripts/coding-rules/views/actions-view.coffee
deleted file mode 100644 (file)
index 5371f70..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-define [
-  'backbone.marionette',
-  'common/handlebars-extensions'
-], (
-  Marionette
-) ->
-
-  class CodingRulesStatusView extends Marionette.ItemView
-    template: getTemplate '#coding-rules-status-template'
-
-
-    collectionEvents:
-      'all': 'render'
-
-
-    ui:
-      orderChoices: '.navigator-actions-order-choices'
-
-
-    events:
-      'click .navigator-actions-order': 'toggleOrderChoices'
-      'click @ui.orderChoices': 'sort'
-      'click .navigator-actions-bulk': 'bulkChange'
-
-
-    onRender: ->
-      unless @collection.sorting.sortText
-        @collection.sorting.sortText = @$('[data-sort=' + @collection.sorting.sort + ']:first').text()
-        @render()
-
-
-    toggleOrderChoices: (e) ->
-      e.stopPropagation()
-      @ui.orderChoices.toggleClass 'open'
-      if @ui.orderChoices.is '.open'
-        jQuery('body').on 'click.coding_rules_actions', =>
-          @ui.orderChoices.removeClass 'open'
-
-
-    sort: (e) ->
-      e.stopPropagation()
-      @ui.orderChoices.removeClass 'open'
-      jQuery('body').off 'click.coding_rules_actions'
-      el = jQuery(e.target)
-      sort = el.data 'sort'
-      asc = el.data 'asc'
-      if sort != null && asc != null
-        @collection.sorting = sort: sort, sortText: el.text(), asc: asc
-        @options.app.fetchFirstPage()
-
-
-    bulkChange: ->
-      @options.app.codingRulesBulkChangeView.show()
-
-
-    serializeData: ->
-      _.extend super,
-        paging: @collection.paging
-        sorting: @collection.sorting
index f0ae6110f52f89c894ca2bb9ab91812a28c42145..ab8816875f4531dd0c107bd1efe7e253121696e4 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'common/handlebars-extensions'], function(Marionette) {
-    var CodingRulesStatusView, _ref;
+    var CodingRulesStatusView;
     return CodingRulesStatusView = (function(_super) {
       __extends(CodingRulesStatusView, _super);
 
       function CodingRulesStatusView() {
-        _ref = CodingRulesStatusView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return CodingRulesStatusView.__super__.constructor.apply(this, arguments);
       }
 
       CodingRulesStatusView.prototype.template = getTemplate('#coding-rules-status-template');
       };
 
       CodingRulesStatusView.prototype.toggleOrderChoices = function(e) {
-        var _this = this;
         e.stopPropagation();
         this.ui.orderChoices.toggleClass('open');
         if (this.ui.orderChoices.is('.open')) {
-          return jQuery('body').on('click.coding_rules_actions', function() {
-            return _this.ui.orderChoices.removeClass('open');
-          });
+          return jQuery('body').on('click.coding_rules_actions', (function(_this) {
+            return function() {
+              return _this.ui.orderChoices.removeClass('open');
+            };
+          })(this));
         }
       };
 
diff --git a/sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-bulk-change-view.coffee b/sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-bulk-change-view.coffee
deleted file mode 100644 (file)
index cfb43fd..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-define [
-  'backbone.marionette',
-  'common/handlebars-extensions'
-], (
-  Marionette
-) ->
-
-  class CodingRulesBulkChangeView extends Marionette.ItemView
-    className: 'modal'
-    template: getTemplate '#coding-rules-bulk-change-template'
-
-
-    events:
-      'submit form': 'onSubmit'
-      'click #coding-rules-cancel-bulk-change': 'hide'
-      'click label': 'enableAction'
-      'change select': 'enableAction'
-
-
-    onRender: ->
-      @$el.dialog
-        dialogClass: 'no-close',
-        width: '600px',
-        draggable: false,
-        autoOpen: false,
-        modal: true,
-        minHeight: 50,
-        resizable: false,
-        title: null
-
-      @$('#coding-rules-bulk-change-activate-on, #coding-rules-bulk-change-deactivate-on').select2
-        width: '250px'
-        minimumResultsForSearch: 1
-
-      format = (state) ->
-        return state.text unless state.id
-        "<i class='icon-severity-#{state.id.toLowerCase()}'></i> #{state.text}"
-      @$('#coding-rules-bulk-change-severity').select2
-        width: '250px'
-        minimumResultsForSearch: 999
-        formatResult: format
-        formatSelection: format
-        escapeMarkup: (m) -> m
-
-
-    show: ->
-      @render()
-      @$el.dialog 'open'
-
-
-    hide: ->
-      @$el.dialog 'close'
-
-
-    prepareQuery: ->
-      query = @options.app.getQuery()
-      activateIn = []
-      deactivateIn = []
-      severity = null
-      if @$('#coding-rules-bulk-change-activate-qp').is(':checked')
-        activateIn.push @options.app.getInactiveQualityProfile()
-      if @$('#coding-rules-bulk-change-activate').is(':checked')
-        activateIn.push @$('#coding-rules-bulk-change-activate-on').val()
-      if @$('#coding-rules-bulk-change-deactivate-qp').is(':checked')
-        deactivateIn.push @options.app.getActiveQualityProfile()
-      if @$('#coding-rules-bulk-change-deactivate').is(':checked')
-        deactivateIn.push @$('#coding-rules-bulk-change-deactivate-on').val()
-      if @$('#coding-rules-bulk-change-set-severity').is(':checked')
-        severity = @$('#coding-rules-bulk-change-severity').val()
-      actions = []
-      if activateIn.length > 0
-        actions.push 'bulk_activate'
-        _.extend query, bulk_activate_in: activateIn.join(',')
-      if deactivateIn.length > 0
-        actions.push 'bulk_deactivate'
-        _.extend query, bulk_deactivate_in: deactivateIn.join(',')
-      if severity
-        actions.push 'bulk_set_severity'
-        _.extend query, bulk_severity: severity
-      _.extend query, bulk_actions: actions
-
-    onSubmit: (e) ->
-      e.preventDefault()
-      jQuery.ajax
-        type: 'POST'
-        url: "#{baseUrl}/api/codingrules/bulk_change"
-        data: @prepareQuery()
-      .done =>
-        @options.app.fetchFirstPage()
-        @hide()
-
-
-
-    enableAction: (e) ->
-      jQuery(e.target).siblings('input[type=checkbox]').prop 'checked', true
-
-
-    serializeData: ->
-      paging: @options.app.codingRules.paging
-      qualityProfiles: @options.app.qualityProfiles
-
-      activeQualityProfile: @options.app.getActiveQualityProfile()
-      activeQualityProfileName: @options.app.activeInFilter.view.renderValue()
-      activateOnQualityProfiles: _.reject @options.app.qualityProfiles, (q) => q.key == @options.app.getInactiveQualityProfile()
-
-      inactiveQualityProfile: @options.app.getInactiveQualityProfile()
-      inactiveQualityProfileName: @options.app.inactiveInFilter.view.renderValue()
-      deactivateOnQualityProfiles: _.reject @options.app.qualityProfiles, (q) => q.key == @options.app.getActiveQualityProfile()
-
-      severities: ['BLOCKER', 'CRITICAL', 'MAJOR', 'MINOR', 'INFO']
index 76f3fdc822272dcc7d805afee8c2ade7a0d7ee9f..3667c0477794ec4f5d5609ecde454ad41d3225b9 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'common/handlebars-extensions'], function(Marionette) {
-    var CodingRulesBulkChangeView, _ref;
+    var CodingRulesBulkChangeView;
     return CodingRulesBulkChangeView = (function(_super) {
       __extends(CodingRulesBulkChangeView, _super);
 
       function CodingRulesBulkChangeView() {
-        _ref = CodingRulesBulkChangeView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return CodingRulesBulkChangeView.__super__.constructor.apply(this, arguments);
       }
 
       CodingRulesBulkChangeView.prototype.className = 'modal';
       };
 
       CodingRulesBulkChangeView.prototype.onSubmit = function(e) {
-        var _this = this;
         e.preventDefault();
         return jQuery.ajax({
           type: 'POST',
           url: "" + baseUrl + "/api/codingrules/bulk_change",
           data: this.prepareQuery()
-        }).done(function() {
-          _this.options.app.fetchFirstPage();
-          return _this.hide();
-        });
+        }).done((function(_this) {
+          return function() {
+            _this.options.app.fetchFirstPage();
+            return _this.hide();
+          };
+        })(this));
       };
 
       CodingRulesBulkChangeView.prototype.enableAction = function(e) {
       };
 
       CodingRulesBulkChangeView.prototype.serializeData = function() {
-        var _this = this;
         return {
           paging: this.options.app.codingRules.paging,
           qualityProfiles: this.options.app.qualityProfiles,
           activeQualityProfile: this.options.app.getActiveQualityProfile(),
           activeQualityProfileName: this.options.app.activeInFilter.view.renderValue(),
-          activateOnQualityProfiles: _.reject(this.options.app.qualityProfiles, function(q) {
-            return q.key === _this.options.app.getInactiveQualityProfile();
-          }),
+          activateOnQualityProfiles: _.reject(this.options.app.qualityProfiles, (function(_this) {
+            return function(q) {
+              return q.key === _this.options.app.getInactiveQualityProfile();
+            };
+          })(this)),
           inactiveQualityProfile: this.options.app.getInactiveQualityProfile(),
           inactiveQualityProfileName: this.options.app.inactiveInFilter.view.renderValue(),
-          deactivateOnQualityProfiles: _.reject(this.options.app.qualityProfiles, function(q) {
-            return q.key === _this.options.app.getActiveQualityProfile();
-          }),
+          deactivateOnQualityProfiles: _.reject(this.options.app.qualityProfiles, (function(_this) {
+            return function(q) {
+              return q.key === _this.options.app.getActiveQualityProfile();
+            };
+          })(this)),
           severities: ['BLOCKER', 'CRITICAL', 'MAJOR', 'MINOR', 'INFO']
         };
       };
diff --git a/sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-detail-quality-profile-view.coffee b/sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-detail-quality-profile-view.coffee
deleted file mode 100644 (file)
index 289c209..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-define [
-  'backbone.marionette',
-  'common/handlebars-extensions'
-], (
-  Marionette
-) ->
-
-  class CodingRulesDetailQualityProfilesView extends Marionette.ItemView
-    className: 'coding-rules-detail-quality-profile'
-    template: getTemplate '#coding-rules-detail-quality-profile-template'
-
-
-    ui:
-      severitySelect: '.coding-rules-detail-quality-profile-severity'
-
-      note: '.coding-rules-detail-quality-profile-note'
-      noteForm: '.coding-rules-detail-quality-profile-note-form'
-      noteText: '.coding-rules-detail-quality-profile-note-text'
-      noteAdd: '.coding-rules-detail-quality-profile-note-add'
-      noteEdit: '.coding-rules-detail-quality-profile-note-edit'
-      noteDelete: '.coding-rules-detail-quality-profile-note-delete'
-      noteCancel: '.coding-rules-detail-quality-profile-note-cancel'
-      noteSubmit: '.coding-rules-detail-quality-profile-note-submit'
-
-
-    events:
-      'click @ui.noteAdd': 'editNote'
-      'click @ui.noteEdit': 'editNote'
-      'click @ui.noteDelete': 'deleteNote'
-      'click @ui.noteCancel': 'cancelNote'
-      'click @ui.noteSubmit': 'submitNote'
-
-
-    editNote: ->
-      @ui.note.hide()
-      @ui.noteForm.show()
-      @ui.noteText.focus()
-
-
-    deleteNote: ->
-      @ui.noteText.val ''
-      @submitNote().done =>
-        @model.unset 'note'
-        @render()
-
-
-    cancelNote: ->
-      @ui.note.show()
-      @ui.noteForm.hide()
-
-
-    submitNote: ->
-      @ui.note.html '<i class="spinner"></i>'
-      @ui.noteForm.html '<i class="spinner"></i>'
-      jQuery.ajax
-        type: 'POST'
-        url: "#{baseUrl}/api/codingrules/note"
-        dataType: 'json'
-        data: text: @ui.noteText.val()
-      .done (r) =>
-        @model.set 'note', r.note
-        @render()
-
-
-    onRender: ->
-      @ui.noteForm.hide()
-
-      format = (state) ->
-        return state.text unless state.id
-        "<i class='icon-severity-#{state.id.toLowerCase()}'></i> #{state.text}"
-
-      @ui.severitySelect.val @model.get 'severity'
-      @ui.severitySelect.select2
-        width: '200px'
-        minimumResultsForSearch: 999
-        formatResult: format
-        formatSelection: format
-        escapeMarkup: (m) -> m
-
-
-    getParent: ->
-      return null unless @model.get 'inherits'
-      @options.qualityProfiles.findWhere(key: @model.get('inherits')).toJSON()
-
-
-    enhanceParameters: ->
-      parent = @getParent()
-      parameters = @model.get 'parameters'
-      return parameters unless parent
-      parameters.map (p) ->
-        _.extend p, original: _.findWhere(parent.parameters, key: p.key).value
-
-
-    serializeData: ->
-      _.extend super,
-        parent: @getParent()
-        parameters: @enhanceParameters()
-        severities: ['BLOCKER', 'CRITICAL', 'MAJOR', 'MINOR', 'INFO']
\ No newline at end of file
index 4cb28435c398afbb5ac26c0e7f7f1fb81bb9cf14..988feb8a876f0ab91ace9fe19cbc29bccaa7805d 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'common/handlebars-extensions'], function(Marionette) {
-    var CodingRulesDetailQualityProfilesView, _ref;
+    var CodingRulesDetailQualityProfilesView;
     return CodingRulesDetailQualityProfilesView = (function(_super) {
       __extends(CodingRulesDetailQualityProfilesView, _super);
 
       function CodingRulesDetailQualityProfilesView() {
-        _ref = CodingRulesDetailQualityProfilesView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return CodingRulesDetailQualityProfilesView.__super__.constructor.apply(this, arguments);
       }
 
       CodingRulesDetailQualityProfilesView.prototype.className = 'coding-rules-detail-quality-profile';
       };
 
       CodingRulesDetailQualityProfilesView.prototype.deleteNote = function() {
-        var _this = this;
         this.ui.noteText.val('');
-        return this.submitNote().done(function() {
-          _this.model.unset('note');
-          return _this.render();
-        });
+        return this.submitNote().done((function(_this) {
+          return function() {
+            _this.model.unset('note');
+            return _this.render();
+          };
+        })(this));
       };
 
       CodingRulesDetailQualityProfilesView.prototype.cancelNote = function() {
@@ -58,7 +57,6 @@
       };
 
       CodingRulesDetailQualityProfilesView.prototype.submitNote = function() {
-        var _this = this;
         this.ui.note.html('<i class="spinner"></i>');
         this.ui.noteForm.html('<i class="spinner"></i>');
         return jQuery.ajax({
           data: {
             text: this.ui.noteText.val()
           }
-        }).done(function(r) {
-          _this.model.set('note', r.note);
-          return _this.render();
-        });
+        }).done((function(_this) {
+          return function(r) {
+            _this.model.set('note', r.note);
+            return _this.render();
+          };
+        })(this));
       };
 
       CodingRulesDetailQualityProfilesView.prototype.onRender = function() {
diff --git a/sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-detail-quality-profiles-view.coffee b/sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-detail-quality-profiles-view.coffee
deleted file mode 100644 (file)
index 0b6f7ec..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-define [
-  'backbone.marionette'
-  'coding-rules/views/coding-rules-detail-quality-profile-view'
-], (
-  Marionette,
-  CodingRulesDetailQualityProfileView
-) ->
-
-  class CodingRulesDetailQualityProfilesView extends Marionette.CollectionView
-    itemView: CodingRulesDetailQualityProfileView
-
-    itemViewOptions: ->
-      qualityProfiles: @collection
\ No newline at end of file
index 75cda1e2a8639cbf920da8fda81a6acdb73a12e9..7720c203d89b3fb1de583a60947d11918e173d89 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'coding-rules/views/coding-rules-detail-quality-profile-view'], function(Marionette, CodingRulesDetailQualityProfileView) {
-    var CodingRulesDetailQualityProfilesView, _ref;
+    var CodingRulesDetailQualityProfilesView;
     return CodingRulesDetailQualityProfilesView = (function(_super) {
       __extends(CodingRulesDetailQualityProfilesView, _super);
 
       function CodingRulesDetailQualityProfilesView() {
-        _ref = CodingRulesDetailQualityProfilesView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return CodingRulesDetailQualityProfilesView.__super__.constructor.apply(this, arguments);
       }
 
       CodingRulesDetailQualityProfilesView.prototype.itemView = CodingRulesDetailQualityProfileView;
diff --git a/sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-detail-view.coffee b/sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-detail-view.coffee
deleted file mode 100644 (file)
index 01e4cca..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-define [
-  'backbone',
-  'backbone.marionette',
-  'coding-rules/views/coding-rules-detail-quality-profiles-view'
-  'common/handlebars-extensions'
-], (
-  Backbone,
-  Marionette,
-  CodingRulesDetailQualityProfilesView
-) ->
-
-  class CodingRulesDetailView extends Marionette.Layout
-    template: getTemplate '#coding-rules-detail-template'
-
-
-    regions:
-      qualityProfilesRegion: '#coding-rules-detail-quality-profiles'
-
-
-    ui:
-      tagsChange: '.coding-rules-detail-tags-change'
-      tagInput: '.coding-rules-detail-tag-input'
-      tagsEdit: '.coding-rules-detail-tag-edit'
-      tagsEditDone: '.coding-rules-detail-tag-edit-done'
-      tagsList: '.coding-rules-detail-tag-list'
-
-      descriptionExtra: '#coding-rules-detail-description-extra'
-      extendDescriptionLink: '#coding-rules-detail-extend-description'
-      extendDescriptionForm: '#coding-rules-detail-extend-description-form'
-      extendDescriptionSubmit: '#coding-rules-detail-extend-description-submit'
-      extendDescriptionText: '#coding-rules-detail-extend-description-text'
-      extendDescriptionSpinner: '#coding-rules-detail-extend-description-spinner'
-      cancelExtendDescription: '#coding-rules-detail-extend-description-cancel'
-
-      qualityProfileActivate: '#coding-rules-quality-profile-activate'
-
-
-    events:
-      'click @ui.tagsChange': 'changeTags'
-      'click @ui.tagsEditDone': 'editDone'
-
-      'click @ui.extendDescriptionLink': 'showExtendDescriptionForm'
-      'click @ui.cancelExtendDescription': 'hideExtendDescriptionForm'
-      'click @ui.extendDescriptionSubmit': 'submitExtendDescription'
-
-      'click @ui.qualityProfileActivate': 'activateQualityProfile'
-
-
-    initialize: (options) ->
-      @qualityProfilesView = new CodingRulesDetailQualityProfilesView
-        collection: new Backbone.Collection options.model.get 'qualityProfiles'
-
-
-    onRender: ->
-      @qualityProfilesRegion.show @qualityProfilesView
-
-      @ui.tagInput.select2
-        tags: _.difference @options.app.tags, @model.get 'tags'
-        width: '500px'
-      @ui.tagsEdit.hide()
-
-      @ui.extendDescriptionForm.hide()
-      @ui.extendDescriptionSpinner.hide()
-
-      qp = @options.app.getActiveQualityProfile()
-      @$('.coding-rules-detail-quality-profile').first().addClass 'active' if qp?
-
-
-    changeTags: ->
-      @ui.tagsEdit.show()
-      @ui.tagsList.hide()
-
-
-    editDone: ->
-      @ui.tagsEdit.html '<i class="spinner"></i>'
-      tags = @ui.tagInput.val()
-      jQuery.ajax
-        type: 'POST'
-        url: "#{baseUrl}/api/codingrules/set_tags"
-        data: tags: tags
-      .done =>
-          @model.set 'tags', tags.split ','
-          @render()
-
-
-    showExtendDescriptionForm: ->
-      @ui.descriptionExtra.hide()
-      @ui.extendDescriptionForm.show()
-
-
-    hideExtendDescriptionForm: ->
-      @ui.descriptionExtra.show()
-      @ui.extendDescriptionForm.hide()
-
-
-    submitExtendDescription: ->
-      @ui.extendDescriptionForm.hide()
-      @ui.extendDescriptionSpinner.show()
-      jQuery.ajax
-        type: 'POST'
-        url: "#{baseUrl}/api/codingrules/extend_description"
-        dataType: 'json'
-        data: text: @ui.extendDescriptionText.val()
-      .done (r) =>
-        @model.set extra: r.extra, extraRaw: r.extraRaw
-        @render()
-
-
-    activateQualityProfile: ->
-      @options.app.codingRulesQualityProfileActivationView.model = @model
-      @options.app.codingRulesQualityProfileActivationView.show()
\ No newline at end of file
index 5649c0b1dfac0adfc7f421edca6365785db6df40..2183f1a7004df4b00dc9cc02df25fd107ef16c40 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone', 'backbone.marionette', 'coding-rules/views/coding-rules-detail-quality-profiles-view', 'common/handlebars-extensions'], function(Backbone, Marionette, CodingRulesDetailQualityProfilesView) {
-    var CodingRulesDetailView, _ref;
+    var CodingRulesDetailView;
     return CodingRulesDetailView = (function(_super) {
       __extends(CodingRulesDetailView, _super);
 
       function CodingRulesDetailView() {
-        _ref = CodingRulesDetailView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return CodingRulesDetailView.__super__.constructor.apply(this, arguments);
       }
 
       CodingRulesDetailView.prototype.template = getTemplate('#coding-rules-detail-template');
@@ -72,8 +70,7 @@
       };
 
       CodingRulesDetailView.prototype.editDone = function() {
-        var tags,
-          _this = this;
+        var tags;
         this.ui.tagsEdit.html('<i class="spinner"></i>');
         tags = this.ui.tagInput.val();
         return jQuery.ajax({
           data: {
             tags: tags
           }
-        }).done(function() {
-          _this.model.set('tags', tags.split(','));
-          return _this.render();
-        });
+        }).done((function(_this) {
+          return function() {
+            _this.model.set('tags', tags.split(','));
+            return _this.render();
+          };
+        })(this));
       };
 
       CodingRulesDetailView.prototype.showExtendDescriptionForm = function() {
@@ -99,7 +98,6 @@
       };
 
       CodingRulesDetailView.prototype.submitExtendDescription = function() {
-        var _this = this;
         this.ui.extendDescriptionForm.hide();
         this.ui.extendDescriptionSpinner.show();
         return jQuery.ajax({
           data: {
             text: this.ui.extendDescriptionText.val()
           }
-        }).done(function(r) {
-          _this.model.set({
-            extra: r.extra,
-            extraRaw: r.extraRaw
-          });
-          return _this.render();
-        });
+        }).done((function(_this) {
+          return function(r) {
+            _this.model.set({
+              extra: r.extra,
+              extraRaw: r.extraRaw
+            });
+            return _this.render();
+          };
+        })(this));
       };
 
       CodingRulesDetailView.prototype.activateQualityProfile = function() {
diff --git a/sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-list-empty-view.coffee b/sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-list-empty-view.coffee
deleted file mode 100644 (file)
index 203fcad..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-define [
-  'backbone.marionette',
-  'common/handlebars-extensions'
-], (
-  Marionette,
-) ->
-
-  class CodingRulesListEmptyView extends Marionette.ItemView
-    tagName: 'li'
-    className: 'navigator-results-no-results'
-    template: getTemplate '#coding-rules-list-empty-template'
index 828d78f1b75eda76c4f7534f20da8ee6feeafe1e..d92e95c02a72d6f2d23a335c6628e053171d6d85 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'common/handlebars-extensions'], function(Marionette) {
-    var CodingRulesListEmptyView, _ref;
+    var CodingRulesListEmptyView;
     return CodingRulesListEmptyView = (function(_super) {
       __extends(CodingRulesListEmptyView, _super);
 
       function CodingRulesListEmptyView() {
-        _ref = CodingRulesListEmptyView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return CodingRulesListEmptyView.__super__.constructor.apply(this, arguments);
       }
 
       CodingRulesListEmptyView.prototype.tagName = 'li';
diff --git a/sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-list-item-view.coffee b/sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-list-item-view.coffee
deleted file mode 100644 (file)
index bf0ed4d..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-define [
-  'backbone.marionette',
-  'coding-rules/views/coding-rules-detail-view',
-  'common/handlebars-extensions'
-], (
-  Marionette,
-  CodingRulesDetailView
-) ->
-
-  class CodingRulesListItemView extends Marionette.ItemView
-    tagName: 'li'
-    template: getTemplate '#coding-rules-list-item-template'
-    activeClass: 'active'
-
-
-    events: ->
-      'click': 'showDetail'
-
-
-    showDetail: ->
-      @$el.siblings().removeClass @activeClass
-      @$el.addClass @activeClass
-
-      @options.app.layout.showSpinner 'detailsRegion'
-      jQuery.ajax
-        url: "#{baseUrl}/api/codingrules/show"
-      .done (r) =>
-        @model.set r.codingrule
-        detailView = new CodingRulesDetailView
-          app: @options.app
-          model: @model
-        @options.app.layout.detailsRegion.show detailView
-
-
-    serializeData: ->
-      _.extend super,
-        qualityProfile: @options.app.getActiveQualityProfile()
-        qualityProfileName: @options.app.activeInFilter.view.renderValue()
index 6dc0c2324c1d2229a28b8b89089539dcd84f7175..020835df080044ca89c03380a6d7e18886254517 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'coding-rules/views/coding-rules-detail-view', 'common/handlebars-extensions'], function(Marionette, CodingRulesDetailView) {
-    var CodingRulesListItemView, _ref;
+    var CodingRulesListItemView;
     return CodingRulesListItemView = (function(_super) {
       __extends(CodingRulesListItemView, _super);
 
       function CodingRulesListItemView() {
-        _ref = CodingRulesListItemView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return CodingRulesListItemView.__super__.constructor.apply(this, arguments);
       }
 
       CodingRulesListItemView.prototype.tagName = 'li';
       };
 
       CodingRulesListItemView.prototype.showDetail = function() {
-        var _this = this;
         this.$el.siblings().removeClass(this.activeClass);
         this.$el.addClass(this.activeClass);
         this.options.app.layout.showSpinner('detailsRegion');
         return jQuery.ajax({
           url: "" + baseUrl + "/api/codingrules/show"
-        }).done(function(r) {
-          var detailView;
-          _this.model.set(r.codingrule);
-          detailView = new CodingRulesDetailView({
-            app: _this.options.app,
-            model: _this.model
-          });
-          return _this.options.app.layout.detailsRegion.show(detailView);
-        });
+        }).done((function(_this) {
+          return function(r) {
+            var detailView;
+            _this.model.set(r.codingrule);
+            detailView = new CodingRulesDetailView({
+              app: _this.options.app,
+              model: _this.model
+            });
+            return _this.options.app.layout.detailsRegion.show(detailView);
+          };
+        })(this));
       };
 
       CodingRulesListItemView.prototype.serializeData = function() {
diff --git a/sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-list-view.coffee b/sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-list-view.coffee
deleted file mode 100644 (file)
index 93db305..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-define [
-  'backbone.marionette',
-  'coding-rules/views/coding-rules-list-item-view',
-  'coding-rules/views/coding-rules-list-empty-view'
-], (
-  Marionette,
-  CodingRulesListItemView,
-  CodingRulesListEmptyView
-) ->
-
-  class CodingRulesListView extends Marionette.CollectionView
-    tagName: 'ol'
-    className: 'navigator-results-list'
-    itemView: CodingRulesListItemView,
-    emptyView: CodingRulesListEmptyView,
-
-
-    itemViewOptions: ->
-      listView: @, app: @options.app
-
-
-    selectFirst: ->
-      @$el.find('*:first').click()
index b8a8243983802c0f231ff93ea5ed49a84df5744c..248d2124a5e154789310938f0bebd6897a59ca1b 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'coding-rules/views/coding-rules-list-item-view', 'coding-rules/views/coding-rules-list-empty-view'], function(Marionette, CodingRulesListItemView, CodingRulesListEmptyView) {
-    var CodingRulesListView, _ref;
+    var CodingRulesListView;
     return CodingRulesListView = (function(_super) {
       __extends(CodingRulesListView, _super);
 
       function CodingRulesListView() {
-        _ref = CodingRulesListView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return CodingRulesListView.__super__.constructor.apply(this, arguments);
       }
 
       CodingRulesListView.prototype.tagName = 'ol';
diff --git a/sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-quality-profile-activation-view.coffee b/sonar-server/src/main/webapp/javascripts/coding-rules/views/coding-rules-quality-profile-activation-view.coffee
deleted file mode 100644 (file)
index d85a41e..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-define [
-  'backbone.marionette',
-  'common/handlebars-extensions'
-], (
-  Marionette
-) ->
-
-  class CodingRulesQualityProfileActivationView extends Marionette.ItemView
-    className: 'modal'
-    template: getTemplate '#coding-rules-quality-profile-activation-template'
-
-
-    ui:
-      qualityProfileSelect: '#coding-rules-quality-profile-activation-select'
-      qualityProfileSeverity: '#coding-rules-quality-profile-activation-severity'
-      qualityProfileActivate: '#coding-rules-quality-profile-activation-activate'
-
-
-    events:
-      'click #coding-rules-quality-profile-activation-cancel': 'hide'
-      'click @ui.qualityProfileActivate': 'activate'
-
-
-    activate: ->
-      @$('.modal-foot').html '<i class="spinner"></i>'
-      jQuery.ajax
-        type: 'POST'
-        url: "#{baseUrl}/api/codingrules/activate"
-        data: id: 1
-      .done =>
-        jQuery('.navigator-results-list .active').click()
-        @hide()
-
-
-    onRender: ->
-      @$el.dialog
-        dialogClass: 'no-close',
-        width: '600px',
-        draggable: false,
-        autoOpen: false,
-        modal: true,
-        minHeight: 50,
-        resizable: false,
-        title: null
-
-      @ui.qualityProfileSelect.select2
-        width: '250px'
-        minimumResultsForSearch: 5
-
-      format = (state) ->
-        return state.text unless state.id
-        "<i class='icon-severity-#{state.id.toLowerCase()}'></i> #{state.text}"
-
-      @ui.qualityProfileSeverity.val @model.get 'severity'
-      @ui.qualityProfileSeverity.select2
-        width: '250px'
-        minimumResultsForSearch: 999
-        formatResult: format
-        formatSelection: format
-
-
-    show: ->
-      @render()
-      @$el.dialog 'open'
-
-
-    hide: ->
-      @$el.dialog 'close'
-
-
-    getAvailableQualityProfiles: ->
-      _.reject @options.app.qualityProfiles, (profile) =>
-        _.findWhere @model.get('qualityProfiles'), key: profile.key
-
-
-    serializeData: ->
-      _.extend super,
-        qualityProfiles: @getAvailableQualityProfiles()
-        severities: ['BLOCKER', 'CRITICAL', 'MAJOR', 'MINOR', 'INFO']
diff --git a/sonar-server/src/main/webapp/javascripts/coding-rules/views/filter-bar-view.coffee b/sonar-server/src/main/webapp/javascripts/coding-rules/views/filter-bar-view.coffee
deleted file mode 100644 (file)
index 8b66244..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-define [
-  'navigator/filters/filter-bar',
-  'navigator/filters/base-filters',
-  'navigator/filters/favorite-filters',
-  'navigator/filters/more-criteria-filters'
-], (
-  FilterBarView,
-  BaseFilters,
-  FavoriteFiltersModule,
-  MoreCriteriaFilters
-) ->
-
-  class CodingRulesFilterBarView extends FilterBarView
-
-    collectionEvents:
-      'change:enabled': 'changeEnabled'
-
-
-    events:
-      'click .navigator-filter-submit': 'search'
-
-
-    getQuery: ->
-      query = {}
-      @collection.each (filter) ->
-        _.extend query, filter.view.formatValue()
-      query
-
-
-    onAfterItemAdded: (itemView) ->
-      if itemView.model.get('type') == FavoriteFiltersModule.FavoriteFilterView
-        jQuery('.navigator-header').addClass 'navigator-header-favorite'
-
-
-    addMoreCriteriaFilter: ->
-      disabledFilters = this.collection.where enabled: false
-      if disabledFilters.length > 0
-        @moreCriteriaFilter = new BaseFilters.Filter
-          type: MoreCriteriaFilters.MoreCriteriaFilterView,
-          enabled: true,
-          optional: false,
-          filters: disabledFilters
-        @collection.add @moreCriteriaFilter
-
-
-    changeEnabled: ->
-      if @moreCriteriaFilter?
-        disabledFilters = _.reject @collection.where(enabled: false), (filter) ->
-          filter.get('type') == MoreCriteriaFilters.MoreCriteriaFilterView
-
-        if disabledFilters.length == 0
-          @moreCriteriaFilter.set { enabled: false }, { silent: true }
-        else
-          @moreCriteriaFilter.set { enabled: true }, { silent: true }
-
-        @moreCriteriaFilter.set { filters: disabledFilters }, { silent: true }
-        @moreCriteriaFilter.trigger 'change:filters'
-
-
-    search: ->
-      @options.app.state.set
-        query: this.options.app.getQuery(),
-        search: true
-      @options.app.fetchFirstPage()
-
-
-    fetchNextPage: ->
-      @options.app.fetchNextPage()
index 0fda961f1fc7801176956c5e0253064398de8245..2f77ecc7430e938d666977ad88f9d630c273676c 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['navigator/filters/filter-bar', 'navigator/filters/base-filters', 'navigator/filters/favorite-filters', 'navigator/filters/more-criteria-filters'], function(FilterBarView, BaseFilters, FavoriteFiltersModule, MoreCriteriaFilters) {
-    var CodingRulesFilterBarView, _ref;
+    var CodingRulesFilterBarView;
     return CodingRulesFilterBarView = (function(_super) {
       __extends(CodingRulesFilterBarView, _super);
 
       function CodingRulesFilterBarView() {
-        _ref = CodingRulesFilterBarView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return CodingRulesFilterBarView.__super__.constructor.apply(this, arguments);
       }
 
       CodingRulesFilterBarView.prototype.collectionEvents = {
diff --git a/sonar-server/src/main/webapp/javascripts/coding-rules/views/filters/inheritance-filter-view.coffee b/sonar-server/src/main/webapp/javascripts/coding-rules/views/filters/inheritance-filter-view.coffee
deleted file mode 100644 (file)
index ef4bb64..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-define [
-  'navigator/filters/choice-filters'
-], (
-  ChoiceFilters
-) ->
-
-  class InheritanceFilterView extends ChoiceFilters.ChoiceFilterView
-
-    initialize: ->
-      super
-      @qualityProfileFilter = @model.get 'qualityProfileFilter'
-      @listenTo @qualityProfileFilter, 'change:value', @onChangeQualityProfile
-      @onChangeQualityProfile()
-
-
-    onChangeQualityProfile: ->
-      qualityProfile = @qualityProfileFilter.get 'value'
-      parentQualityProfile = @qualityProfileFilter.get 'parentQualityProfile'
-      if _.isArray(qualityProfile) && qualityProfile.length == 1 && parentQualityProfile
-        @makeActive()
-      else
-        @makeInactive()
-
-
-    makeActive: ->
-      @model.set inactive: false, title: ''
-      @model.trigger 'change:enabled'
-      @$el.removeClass('navigator-filter-inactive').prop 'title', ''
-
-
-    makeInactive: ->
-      @model.set inactive: true, title: t 'coding_rules.filters.inheritance.inactive'
-      @model.trigger 'change:enabled'
-      @choices.each (model) -> model.set 'checked', false
-      @detailsView.updateLists()
-      @detailsView.updateValue()
-      @$el.addClass('navigator-filter-inactive').prop 'title', t 'coding_rules.filters.inheritance.inactive'
-
-
-    showDetails: ->
-      super unless @$el.is '.navigator-filter-inactive'
-
-
-    restore: (value) ->
-      value = value.split(',') if _.isString(value)
-      if @choices && value.length > 0
-        @model.set value: value, enabled: true
-        @onChangeQualityProfile
-      else
-        @clear()
index d780ef3c361e342edbefe84e0f718efd18f3eaaa..47c0d653136bae51d401a92afc91a6679929999c 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['navigator/filters/choice-filters'], function(ChoiceFilters) {
-    var InheritanceFilterView, _ref;
+    var InheritanceFilterView;
     return InheritanceFilterView = (function(_super) {
       __extends(InheritanceFilterView, _super);
 
       function InheritanceFilterView() {
-        _ref = InheritanceFilterView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return InheritanceFilterView.__super__.constructor.apply(this, arguments);
       }
 
       InheritanceFilterView.prototype.initialize = function() {
diff --git a/sonar-server/src/main/webapp/javascripts/coding-rules/views/filters/quality-profile-filter-view.coffee b/sonar-server/src/main/webapp/javascripts/coding-rules/views/filters/quality-profile-filter-view.coffee
deleted file mode 100644 (file)
index ab1c4bd..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-define [
-  'navigator/filters/ajax-select-filters'
-], (
-  AjaxSelectFilters
-) ->
-
-  class QualityProfileSuggestions extends AjaxSelectFilters.Suggestions
-
-    url: ->
-      "#{baseUrl}/api/qualityprofiles/list"
-
-
-
-  class QualityProfileFilterView extends AjaxSelectFilters.AjaxSelectFilterView
-
-    initialize: ->
-      super
-      @choices = new QualityProfileSuggestions
-      @listenTo @model, 'change:value', @updateParentQualityProfile
-
-
-    updateParentQualityProfile: ->
-      selected = @getSelected()
-      if selected.length == 1
-        @model.set 'parentQualityProfile', selected[0].get('parent')
-      else
-        @model.unset 'parentQualityProfile'
-
-
-    createRequest: (v) ->
-      jQuery.ajax
-        url: baseUrl + '/api/qualityprofiles/show'
-        type: 'GET'
-        data: key: v
-      .done (r) =>
-        @choices.add new Backbone.Model
-          id: r.qualityprofile.id,
-          text: r.qualityprofile.text,
-          parent: r.qualityprofile.parent,
-          checked: true
-
index 18c145e5821d037c7af5928a67efedc0cdcef1df..51255bfded2e7f9983d264da1f074783f83a01fe 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['navigator/filters/ajax-select-filters'], function(AjaxSelectFilters) {
-    var QualityProfileFilterView, QualityProfileSuggestions, _ref, _ref1;
+    var QualityProfileFilterView, QualityProfileSuggestions;
     QualityProfileSuggestions = (function(_super) {
       __extends(QualityProfileSuggestions, _super);
 
       function QualityProfileSuggestions() {
-        _ref = QualityProfileSuggestions.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return QualityProfileSuggestions.__super__.constructor.apply(this, arguments);
       }
 
       QualityProfileSuggestions.prototype.url = function() {
@@ -24,8 +22,7 @@
       __extends(QualityProfileFilterView, _super);
 
       function QualityProfileFilterView() {
-        _ref1 = QualityProfileFilterView.__super__.constructor.apply(this, arguments);
-        return _ref1;
+        return QualityProfileFilterView.__super__.constructor.apply(this, arguments);
       }
 
       QualityProfileFilterView.prototype.initialize = function() {
       };
 
       QualityProfileFilterView.prototype.createRequest = function(v) {
-        var _this = this;
         return jQuery.ajax({
           url: baseUrl + '/api/qualityprofiles/show',
           type: 'GET',
           data: {
             key: v
           }
-        }).done(function(r) {
-          return _this.choices.add(new Backbone.Model({
-            id: r.qualityprofile.id,
-            text: r.qualityprofile.text,
-            parent: r.qualityprofile.parent,
-            checked: true
-          }));
-        });
+        }).done((function(_this) {
+          return function(r) {
+            return _this.choices.add(new Backbone.Model({
+              id: r.qualityprofile.id,
+              text: r.qualityprofile.text,
+              parent: r.qualityprofile.parent,
+              checked: true
+            }));
+          };
+        })(this));
       };
 
       return QualityProfileFilterView;
diff --git a/sonar-server/src/main/webapp/javascripts/coding-rules/views/header-view.coffee b/sonar-server/src/main/webapp/javascripts/coding-rules/views/header-view.coffee
deleted file mode 100644 (file)
index ddf75bc..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-define [
-  'backbone.marionette',
-  'common/handlebars-extensions'
-], (
-  Marionette
-) ->
-
-  class CodingRulesHeaderView extends Marionette.ItemView
-    template: getTemplate '#coding-rules-header-template'
-
-
-    events:
-      'click #coding-rules-new-search': 'newSearch'
-
-
-    newSearch: ->
-      @options.app.router.navigate '', trigger: true
index b1d052db9d38e3a3e043535dc146e1a36e69434e..a5b1c4dd3e113a8158d4af3af04726877791b3c2 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'common/handlebars-extensions'], function(Marionette) {
-    var CodingRulesHeaderView, _ref;
+    var CodingRulesHeaderView;
     return CodingRulesHeaderView = (function(_super) {
       __extends(CodingRulesHeaderView, _super);
 
       function CodingRulesHeaderView() {
-        _ref = CodingRulesHeaderView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return CodingRulesHeaderView.__super__.constructor.apply(this, arguments);
       }
 
       CodingRulesHeaderView.prototype.template = getTemplate('#coding-rules-header-template');
index d4c3b61fc8481ccde87c08507aa3ec8f52543ca3..6c3cbe034dc0611bd38e316e3387be2933fb2599 100644 (file)
@@ -1,4 +1,3 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var $, convertRating, convertValue, convertWorkDuration, originalVal, restoreRating, restoreValue, restoreWorkDuration, transformPattern;
 
index 83a7eff578fd28858f8d8d227c1b0777179d61a6..30b6a7df87350ae4722adecfaff4adfc7945649a 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['navigator/filters/string-filters'], function(StringFilterView) {
-    var DateFilterView, _ref;
+    var DateFilterView;
     return DateFilterView = (function(_super) {
       __extends(DateFilterView, _super);
 
       function DateFilterView() {
-        _ref = DateFilterView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return DateFilterView.__super__.constructor.apply(this, arguments);
       }
 
       DateFilterView.prototype.render = function() {
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/app.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/app.coffee
deleted file mode 100644 (file)
index ca7e143..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-requirejs.config
-  baseUrl: "#{baseUrl}/javascripts"
-
-  paths:
-    'jquery': 'third-party/jquery'
-    'backbone': 'third-party/backbone'
-    'backbone.marionette': 'third-party/backbone.marionette'
-    'handlebars': 'third-party/handlebars'
-    'moment': 'third-party/moment'
-    'select-list': 'common/select-list'
-
-  shim:
-    'backbone.marionette':
-      deps: ['backbone']
-      exports: 'Marionette'
-    'backbone':
-      exports: 'Backbone'
-    'handlebars':
-      exports: 'Handlebars'
-    'moment':
-      exports: 'moment'
-    'select-list':
-      exports: 'SelectList'
-
-
-requirejs [
-  'backbone', 'backbone.marionette', 'handlebars',
-  'quality-gate/collections/quality-gates',
-  'quality-gate/views/quality-gate-sidebar-list-view',
-  'quality-gate/views/quality-gate-actions-view',
-  'quality-gate/views/quality-gate-edit-view',
-  'quality-gate/router',
-  'quality-gate/layout',
-  'common/handlebars-extensions'
-], (
-  Backbone, Marionette, Handlebars,
-  QualityGates,
-  QualityGateSidebarListItemView,
-  QualityGateActionsView,
-  QualityGateEditView,
-  QualityGateRouter,
-  QualityGateLayout
-) ->
-
-  # Create a generic error handler for ajax requests
-  jQuery.ajaxSetup
-    error: (jqXHR) ->
-      text = jqXHR.responseText
-      errorBox = jQuery('.modal-error')
-      if jqXHR.responseJSON?.errors?
-        text = _.pluck(jqXHR.responseJSON.errors, 'msg').join '. '
-      if errorBox.length > 0
-        errorBox.show().text text
-      else
-        alert text
-
-
-  # Add html class to mark the page as navigator page
-  jQuery('html').addClass('navigator-page quality-gates-page');
-
-
-  # Create a Quality Gate Application
-  App = new Marionette.Application
-
-
-  App.qualityGates = new QualityGates
-
-
-  App.openFirstQualityGate = ->
-    if @qualityGates.length > 0
-      @router.navigate "show/#{@qualityGates.models[0].get('id')}", trigger: true
-    else
-      App.layout.detailsRegion.reset()
-
-
-  App.deleteQualityGate = (id) ->
-    App.qualityGates.remove id
-    App.openFirstQualityGate()
-
-
-  App.unsetDefaults = (id) ->
-    App.qualityGates.each (gate) ->
-      gate.set('default', false) unless gate.id == id
-
-
-  # Construct layout
-  App.addInitializer ->
-    @layout = new QualityGateLayout app: @
-    jQuery('body').append @layout.render().el
-
-
-  # Construct actions bar
-  App.addInitializer ->
-    @codingRulesHeaderView = new QualityGateActionsView
-      app: @
-    @layout.actionsRegion.show @codingRulesHeaderView
-
-
-  # Construct sidebar
-  App.addInitializer ->
-    @qualityGateSidebarListView = new QualityGateSidebarListItemView
-      collection: @qualityGates
-      app: @
-    @layout.resultsRegion.show @qualityGateSidebarListView
-
-
-  # Construct edit view
-  App.addInitializer ->
-    @qualityGateEditView = new QualityGateEditView app: @
-    @qualityGateEditView.render()
-
-
-  # Start router
-  App.addInitializer ->
-    @router = new QualityGateRouter app: @
-    Backbone.history.start()
-
-
-  # Open first quality gate when come to the page
-  App.addInitializer ->
-    initial = Backbone.history.fragment == ''
-    App.openFirstQualityGate() if initial
-
-
-  # Call app, Load metrics and the list of quality gates before start the application
-  appXHR = jQuery.ajax
-    url: "#{baseUrl}/api/qualitygates/app"
-  .done (r) =>
-      App.canEdit = r.edit
-      App.periods = r.periods
-      App.metrics = r.metrics
-      window.messages = r.messages
-
-  qualityGatesXHR = App.qualityGates.fetch()
-
-  jQuery.when(qualityGatesXHR, appXHR)
-    .done ->
-      # Remove the initial spinner
-      jQuery('#quality-gate-page-loader').remove()
-
-      # Start the application
-      App.start()
index 0ffb6472aa9ee8ef143dc9a45cf094f842b78612..8b1ede8433d948ec9b78beeff41a6b1da8439f65 100644 (file)
@@ -1,4 +1,3 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   requirejs.config({
     baseUrl: "" + baseUrl + "/javascripts",
@@ -31,8 +30,7 @@
   });
 
   requirejs(['backbone', 'backbone.marionette', 'handlebars', 'quality-gate/collections/quality-gates', 'quality-gate/views/quality-gate-sidebar-list-view', 'quality-gate/views/quality-gate-actions-view', 'quality-gate/views/quality-gate-edit-view', 'quality-gate/router', 'quality-gate/layout', 'common/handlebars-extensions'], function(Backbone, Marionette, Handlebars, QualityGates, QualityGateSidebarListItemView, QualityGateActionsView, QualityGateEditView, QualityGateRouter, QualityGateLayout) {
-    var App, appXHR, qualityGatesXHR,
-      _this = this;
+    var App, appXHR, qualityGatesXHR;
     jQuery.ajaxSetup({
       error: function(jqXHR) {
         var errorBox, text, _ref;
     });
     appXHR = jQuery.ajax({
       url: "" + baseUrl + "/api/qualitygates/app"
-    }).done(function(r) {
-      App.canEdit = r.edit;
-      App.periods = r.periods;
-      App.metrics = r.metrics;
-      return window.messages = r.messages;
-    });
+    }).done((function(_this) {
+      return function(r) {
+        App.canEdit = r.edit;
+        App.periods = r.periods;
+        App.metrics = r.metrics;
+        return window.messages = r.messages;
+      };
+    })(this));
     qualityGatesXHR = App.qualityGates.fetch();
     return jQuery.when(qualityGatesXHR, appXHR).done(function() {
       jQuery('#quality-gate-page-loader').remove();
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/collections/conditions.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/collections/conditions.coffee
deleted file mode 100644 (file)
index d5b76bc..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-define [
-  'backbone',
-  'quality-gate/models/condition'
-], (
-  Backbone,
-  Condition
-) ->
-
-  class Conditions extends Backbone.Collection
-    model: Condition
index f6f1e0bfdd51a62efadadb62b688374e3c3edb16..0643c625032395f0e5b345c991dcd3b9aefc279d 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone', 'quality-gate/models/condition'], function(Backbone, Condition) {
-    var Conditions, _ref;
+    var Conditions;
     return Conditions = (function(_super) {
       __extends(Conditions, _super);
 
       function Conditions() {
-        _ref = Conditions.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return Conditions.__super__.constructor.apply(this, arguments);
       }
 
       Conditions.prototype.model = Condition;
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/collections/quality-gates.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/collections/quality-gates.coffee
deleted file mode 100644 (file)
index 976f105..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-define [
-  'backbone',
-  'quality-gate/models/quality-gate'
-], (
-  Backbone,
-  QualityGate
-) ->
-
-  class QualityGates extends Backbone.Collection
-    model: QualityGate
-
-
-    url: ->
-      "#{baseUrl}/api/qualitygates/list"
-
-
-    # {
-    #   "qualitygates": [
-    #     { "id": 42, "name": "QG 1" },
-    #     { "id": 43, "name": "QG 2" },
-    #     { "id": 44, "name": "QG 3" }
-    #   ],
-    #   "default": 42
-    # }
-    parse: (r) ->
-      r.qualitygates.map (gate) ->
-        _.extend gate, default: gate.id == r.default
index 1c8788019241d4b69f8609bdb0c026c03ed4ca66..6167539697ef32d1e636004e5ee164e87dded510 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone', 'quality-gate/models/quality-gate'], function(Backbone, QualityGate) {
-    var QualityGates, _ref;
+    var QualityGates;
     return QualityGates = (function(_super) {
       __extends(QualityGates, _super);
 
       function QualityGates() {
-        _ref = QualityGates.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return QualityGates.__super__.constructor.apply(this, arguments);
       }
 
       QualityGates.prototype.model = QualityGate;
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/layout.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/layout.coffee
deleted file mode 100644 (file)
index e9805d0..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-define [
-  'backbone.marionette',
-  'common/handlebars-extensions'
-], (
-  Marionette
-) ->
-
-  class AppLayout extends Marionette.Layout
-    className: 'navigator quality-gates-navigator'
-    template: getTemplate '#quality-gates-layout'
-
-
-    regions:
-      headerRegion: '.navigator-header'
-      actionsRegion: '.navigator-actions'
-      resultsRegion: '.navigator-results'
-      detailsRegion: '.navigator-details'
-
-
-    initialize: (options) ->
-      @listenTo options.app.qualityGates, 'all', @updateLayout
-
-
-    updateLayout: ->
-      empty = @options.app.qualityGates.length == 0
-      @$(@headerRegion.el).toggle !empty
-      @$(@detailsRegion.el).toggle !empty
-
-
-    onRender: ->
-      @updateLayout()
-
-      # Adjust details region height
-      @$(@detailsRegion.el).css 'bottom', jQuery('#footer').outerHeight()
index 0ffc92a02f0d6e02f3ca305818c1e824abf7aff6..1f1e946e04970a7bec03042e723c0c9b0223f6f7 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'common/handlebars-extensions'], function(Marionette) {
-    var AppLayout, _ref;
+    var AppLayout;
     return AppLayout = (function(_super) {
       __extends(AppLayout, _super);
 
       function AppLayout() {
-        _ref = AppLayout.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return AppLayout.__super__.constructor.apply(this, arguments);
       }
 
       AppLayout.prototype.className = 'navigator quality-gates-navigator';
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/models/condition.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/models/condition.coffee
deleted file mode 100644 (file)
index 1fe2c63..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-define [
-  'backbone'
-], (
-  Backbone
-) ->
-
-  class Condition extends Backbone.Model
-
-    url: ->
-      "#{baseUrl}/api/qualitygates/create_condition"
-
-
-    save: ->
-      method = unless @isNew() then 'update' else 'create'
-      data =
-        metric: @get('metric').key
-        op: @get('op')
-        warning: @get('warning')
-        error: @get('error')
-
-      unless @get('period') == '0'
-        data.period = @get('period')
-
-      unless @isNew()
-        data.id = @id
-      else
-        data.gateId = @get('gateId')
-
-      jQuery.ajax({
-        url: "#{baseUrl}/api/qualitygates/#{method}_condition"
-        type: 'POST'
-        data: data
-      }).done (r) =>
-        @set 'id', r.id
-
-
-    delete: ->
-      jQuery.ajax
-        url: "#{baseUrl}/api/qualitygates/delete_condition"
-        type: 'POST'
-        data: id: @id
-
index d2d02d6e9e3c07266f8d5c26db66d414419d22f4..0686fedacbf17c9868706d53f7c3e2de62230b58 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone'], function(Backbone) {
-    var Condition, _ref;
+    var Condition;
     return Condition = (function(_super) {
       __extends(Condition, _super);
 
       function Condition() {
-        _ref = Condition.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return Condition.__super__.constructor.apply(this, arguments);
       }
 
       Condition.prototype.url = function() {
@@ -18,8 +16,7 @@
       };
 
       Condition.prototype.save = function() {
-        var data, method,
-          _this = this;
+        var data, method;
         method = !this.isNew() ? 'update' : 'create';
         data = {
           metric: this.get('metric').key,
           url: "" + baseUrl + "/api/qualitygates/" + method + "_condition",
           type: 'POST',
           data: data
-        }).done(function(r) {
-          return _this.set('id', r.id);
-        });
+        }).done((function(_this) {
+          return function(r) {
+            return _this.set('id', r.id);
+          };
+        })(this));
       };
 
       Condition.prototype["delete"] = function() {
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/models/quality-gate.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/models/quality-gate.coffee
deleted file mode 100644 (file)
index 5acffc0..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-define [
-  'backbone'
-], (
-  Backbone
-) ->
-
-  class QualityGate extends Backbone.Model
-
-    url: ->
-      "#{baseUrl}/api/qualitygates/show?id=#{@get('id')}"
index a7ff6711e75b4c236e49d7d5f5d07842c023c1f8..921b131442252009978220f2d47003444c29a35b 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone'], function(Backbone) {
-    var QualityGate, _ref;
+    var QualityGate;
     return QualityGate = (function(_super) {
       __extends(QualityGate, _super);
 
       function QualityGate() {
-        _ref = QualityGate.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return QualityGate.__super__.constructor.apply(this, arguments);
       }
 
       QualityGate.prototype.url = function() {
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/router.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/router.coffee
deleted file mode 100644 (file)
index f21161a..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-define [
-  'backbone',
-  'quality-gate/models/quality-gate',
-  'quality-gate/views/quality-gate-detail-view',
-  'quality-gate/views/quality-gate-detail-header-view',
-], (
-  Backbone,
-  QualityGate,
-  QualityGateDetailView,
-  QualityGateDetailHeaderView
-) ->
-
-  class QualityGateRouter extends Backbone.Router
-
-    routes:
-      'show/:id': 'show'
-
-
-    initialize: (options) ->
-      @app = options.app
-
-
-    show: (id) ->
-      qualityGate = @app.qualityGates.get id
-      if qualityGate
-        @app.qualityGateSidebarListView.highlight id
-
-        qualityGateDetailHeaderView = new QualityGateDetailHeaderView
-          app: @app
-          model: qualityGate
-        @app.layout.headerRegion.show qualityGateDetailHeaderView
-
-        qualityGateDetailView = new QualityGateDetailView
-          app: @app
-          model: qualityGate
-        @app.layout.detailsRegion.show qualityGateDetailView
-        qualityGateDetailView.$el.hide()
-
-        qualityGateDetailHeaderView.showSpinner()
-        qualityGate.fetch().done ->
-          qualityGateDetailView.$el.show()
-          qualityGateDetailHeaderView.hideSpinner()
index 3ffdf8f2947e7fda5bbb5e6ec10ee9ecce3a3c11..b86680b330a565f80cb9696a10041ba916f11df1 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone', 'quality-gate/models/quality-gate', 'quality-gate/views/quality-gate-detail-view', 'quality-gate/views/quality-gate-detail-header-view'], function(Backbone, QualityGate, QualityGateDetailView, QualityGateDetailHeaderView) {
-    var QualityGateRouter, _ref;
+    var QualityGateRouter;
     return QualityGateRouter = (function(_super) {
       __extends(QualityGateRouter, _super);
 
       function QualityGateRouter() {
-        _ref = QualityGateRouter.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return QualityGateRouter.__super__.constructor.apply(this, arguments);
       }
 
       QualityGateRouter.prototype.routes = {
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-actions-view.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-actions-view.coffee
deleted file mode 100644 (file)
index 27d6437..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-define [
-  'backbone.marionette',
-  'handlebars',
-  'quality-gate/models/quality-gate'
-], (
-  Marionette,
-  Handlebars,
-  QualityGate
-) ->
-
-  class QualityGateActionsView extends Marionette.ItemView
-    template: Handlebars.compile jQuery('#quality-gate-actions-template').html()
-
-
-    events:
-      'click #quality-gate-add': 'add'
-
-
-    add: ->
-      qualityGate = new QualityGate()
-      @options.app.qualityGateEditView.method = 'create'
-      @options.app.qualityGateEditView.model = qualityGate
-      @options.app.qualityGateEditView.show()
-
-
-    serializeData: ->
-      _.extend super, canEdit: @options.app.canEdit
index f435786767164b6702cb96eff8c53b82d856735f..06993b01c5e846f0d4871cdb859be5119cedb63b 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'handlebars', 'quality-gate/models/quality-gate'], function(Marionette, Handlebars, QualityGate) {
-    var QualityGateActionsView, _ref;
+    var QualityGateActionsView;
     return QualityGateActionsView = (function(_super) {
       __extends(QualityGateActionsView, _super);
 
       function QualityGateActionsView() {
-        _ref = QualityGateActionsView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return QualityGateActionsView.__super__.constructor.apply(this, arguments);
       }
 
       QualityGateActionsView.prototype.template = Handlebars.compile(jQuery('#quality-gate-actions-template').html());
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-condition-view.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-condition-view.coffee
deleted file mode 100644 (file)
index da1b8d4..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-define [
-  'backbone.marionette',
-  'handlebars'
-], (
-  Marionette,
-  Handlebars
-) ->
-
-  class QualityGateDetailConditionView extends Marionette.ItemView
-    tagName: 'tr'
-    template: Handlebars.compile jQuery('#quality-gate-detail-condition-template').html()
-    spinner: '<i class="spinner"></i>'
-
-
-    modelEvents:
-      'change:id': 'render'
-
-
-    ui:
-      periodSelect: '[name=period]'
-      operatorSelect: '[name=operator]'
-      warningInput: '[name=warning]'
-      errorInput: '[name=error]'
-      actionsBox: '.quality-gate-condition-actions'
-      updateButton: '.update-condition'
-
-
-    events:
-      'click @ui.updateButton': 'saveCondition'
-      'click .delete-condition': 'deleteCondition'
-      'click .add-condition': 'saveCondition'
-      'click .cancel-add-condition': 'cancelAddCondition'
-      'keyup :input': 'enableUpdate'
-      'change :input': 'enableUpdate'
-
-
-    initialize: ->
-      @populateMetric()
-
-
-    populateMetric: ->
-      metricKey = @model.get('metric')
-      metric = _.findWhere @options.app.metrics, key: metricKey
-      @model.set { metric: metric }, { silent: true }
-
-
-    onRender: ->
-      @ui.periodSelect.val @model.get('period') || '0'
-      @ui.operatorSelect.val @model.get('op')
-      @ui.warningInput.val @model.get('warning')
-      @ui.errorInput.val @model.get('error')
-
-      @ui.periodSelect.select2
-        allowClear: false
-        minimumResultsForSearch: 999
-        width: '200px'
-
-      @ui.operatorSelect.select2
-        allowClear: false
-        minimumResultsForSearch: 999
-        width: '150px'
-
-      @ui.periodSelect.select2('open') if @model.isNew()
-
-
-    showSpinner: ->
-      jQuery(@spinner).prependTo @ui.actionsBox
-      @ui.actionsBox.find(':not(.spinner)').hide()
-
-
-    hideSpinner: ->
-      @ui.actionsBox.find('.spinner').remove()
-      @ui.actionsBox.find(':not(.spinner)').show()
-
-
-    saveCondition: ->
-      @showSpinner()
-      @model.set
-        period: @ui.periodSelect.val()
-        op: @ui.operatorSelect.val()
-        warning: @ui.warningInput.val()
-        error: @ui.errorInput.val()
-      @model.save()
-        .always =>
-          @ui.updateButton.prop 'disabled', true
-          @hideSpinner()
-        .done =>
-          @options.collectionView.updateConditions()
-
-
-    deleteCondition: ->
-      if confirm t('are_you_sure')
-        @showSpinner()
-        @model.delete().done =>
-          @options.collectionView.updateConditions()
-          @close()
-
-
-    cancelAddCondition: ->
-      @close()
-
-
-    enableUpdate: ->
-      @ui.updateButton.prop 'disabled', false
-
-
-    serializeData: ->
-      period = _.findWhere(@options.app.periods, key: '' + this.model.get('period'))
-      _.extend super,
-        canEdit: @options.app.canEdit
-        periods: @options.app.periods
-        periodText: period?.text
index 0abc1b0532b242fe7fcfe7203eccf0434e6d4bf5..d69b084c3e4a51be0b8f4fde8cb6e06f8d004db5 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'handlebars'], function(Marionette, Handlebars) {
-    var QualityGateDetailConditionView, _ref;
+    var QualityGateDetailConditionView;
     return QualityGateDetailConditionView = (function(_super) {
       __extends(QualityGateDetailConditionView, _super);
 
       function QualityGateDetailConditionView() {
-        _ref = QualityGateDetailConditionView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return QualityGateDetailConditionView.__super__.constructor.apply(this, arguments);
       }
 
       QualityGateDetailConditionView.prototype.tagName = 'tr';
@@ -89,7 +87,6 @@
       };
 
       QualityGateDetailConditionView.prototype.saveCondition = function() {
-        var _this = this;
         this.showSpinner();
         this.model.set({
           period: this.ui.periodSelect.val(),
           warning: this.ui.warningInput.val(),
           error: this.ui.errorInput.val()
         });
-        return this.model.save().always(function() {
-          _this.ui.updateButton.prop('disabled', true);
-          return _this.hideSpinner();
-        }).done(function() {
-          return _this.options.collectionView.updateConditions();
-        });
+        return this.model.save().always((function(_this) {
+          return function() {
+            _this.ui.updateButton.prop('disabled', true);
+            return _this.hideSpinner();
+          };
+        })(this)).done((function(_this) {
+          return function() {
+            return _this.options.collectionView.updateConditions();
+          };
+        })(this));
       };
 
       QualityGateDetailConditionView.prototype.deleteCondition = function() {
-        var _this = this;
         if (confirm(t('are_you_sure'))) {
           this.showSpinner();
-          return this.model["delete"]().done(function() {
-            _this.options.collectionView.updateConditions();
-            return _this.close();
-          });
+          return this.model["delete"]().done((function(_this) {
+            return function() {
+              _this.options.collectionView.updateConditions();
+              return _this.close();
+            };
+          })(this));
         }
       };
 
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-conditions-empty-view.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-conditions-empty-view.coffee
deleted file mode 100644 (file)
index 35bad09..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-define [
-  'backbone.marionette',
-  'handlebars',
-], (
-  Marionette,
-  Handlebars,
-) ->
-
-  class QualityGateDetailConditionsView extends Marionette.ItemView
-    tagName: 'tr'
-    template: Handlebars.compile jQuery('#quality-gate-detail-conditions-empty-template').html()
index 658cfab3c839c47fd0c4ba99850edf84a49768c2..4942957f1be7aac7e0b08797aaa7e08f9bb13bcc 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'handlebars'], function(Marionette, Handlebars) {
-    var QualityGateDetailConditionsView, _ref;
+    var QualityGateDetailConditionsView;
     return QualityGateDetailConditionsView = (function(_super) {
       __extends(QualityGateDetailConditionsView, _super);
 
       function QualityGateDetailConditionsView() {
-        _ref = QualityGateDetailConditionsView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return QualityGateDetailConditionsView.__super__.constructor.apply(this, arguments);
       }
 
       QualityGateDetailConditionsView.prototype.tagName = 'tr';
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-conditions-view.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-conditions-view.coffee
deleted file mode 100644 (file)
index 9a29734..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-define [
-  'backbone.marionette',
-  'handlebars',
-  'quality-gate/models/condition',
-  'quality-gate/views/quality-gate-detail-condition-view',
-  'quality-gate/views/quality-gate-detail-conditions-empty-view'
-], (
-  Marionette,
-  Handlebars,
-  Condition,
-  QualityGateDetailConditionView,
-  QualityGateDetailConditionsEmptyView
-) ->
-
-  class QualityGateDetailConditionsView extends Marionette.CompositeView
-    template: Handlebars.compile jQuery('#quality-gate-detail-conditions-template').html()
-    itemView: QualityGateDetailConditionView
-    emptyView: QualityGateDetailConditionsEmptyView
-    itemViewContainer: '.quality-gate-conditions tbody'
-
-
-    ui:
-      metricSelect: '#quality-gate-new-condition-metric'
-      introductionShowMore: '.quality-gate-introduction-show-more'
-      introductionMore: '.quality-gate-introduction-more'
-
-
-    events:
-      'click @ui.introductionShowMore': 'showMoreIntroduction'
-      'change @ui.metricSelect': 'addCondition'
-
-
-    itemViewOptions: ->
-      app: @options.app
-      collectionView: @
-
-
-    appendHtml: (compositeView, itemView) ->
-      if (compositeView.isBuffering)
-        compositeView.elBuffer.appendChild itemView.el
-        compositeView._bufferedChildren.push itemView
-      else
-        container = @getItemViewContainer compositeView
-        container.prepend itemView.el
-
-
-    onRender: ->
-      @ui.introductionMore.hide()
-      @ui.metricSelect.select2
-        allowClear: false,
-        width: '250px',
-        placeholder: t('alerts.select_metric')
-
-
-    groupedMetrics: ->
-      metrics = @options.app.metrics
-      metrics = _.groupBy metrics, 'domain'
-      metrics = _.map metrics, (metrics, domain) ->
-        domain: domain, metrics: _.sortBy metrics, 'short_name'
-      _.sortBy metrics, 'domain'
-
-
-    serializeData: ->
-      _.extend super,
-        canEdit: @options.app.canEdit
-        metricGroups: @groupedMetrics()
-
-
-    showMoreIntroduction: ->
-      @ui.introductionShowMore.hide()
-      @ui.introductionMore.show()
-
-
-    addCondition: ->
-      metric = @ui.metricSelect.val()
-      @ui.metricSelect.select2('val', '')
-      condition = new Condition
-        metric: metric
-        gateId: @options.gateId
-      @collection.unshift condition
-
-
-    updateConditions: ->
-      conditions = @collection.map (item) -> _.extend item.toJSON(),
-        metric: item.get('metric').key
-      @options.qualityGate.set { conditions: conditions }, { silent: true }
index 6df80cd776644c39d16bf6423186233f950c7d1e..1fdcbbdd769e6b8575b33cf3c09aa140a78262da 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'handlebars', 'quality-gate/models/condition', 'quality-gate/views/quality-gate-detail-condition-view', 'quality-gate/views/quality-gate-detail-conditions-empty-view'], function(Marionette, Handlebars, Condition, QualityGateDetailConditionView, QualityGateDetailConditionsEmptyView) {
-    var QualityGateDetailConditionsView, _ref;
+    var QualityGateDetailConditionsView;
     return QualityGateDetailConditionsView = (function(_super) {
       __extends(QualityGateDetailConditionsView, _super);
 
       function QualityGateDetailConditionsView() {
-        _ref = QualityGateDetailConditionsView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return QualityGateDetailConditionsView.__super__.constructor.apply(this, arguments);
       }
 
       QualityGateDetailConditionsView.prototype.template = Handlebars.compile(jQuery('#quality-gate-detail-conditions-template').html());
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-header-view.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-header-view.coffee
deleted file mode 100644 (file)
index 69900f0..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-define [
-  'backbone.marionette',
-  'handlebars',
-  'quality-gate/models/quality-gate'
-], (
-  Marionette,
-  Handlebars,
-  QualityGate
-) ->
-
-  class QualityGateDetailHeaderView extends Marionette.ItemView
-    template: Handlebars.compile jQuery('#quality-gate-detail-header-template').html()
-    spinner: '<i class="spinner"></i>'
-
-
-    modelEvents:
-      'change': 'render'
-
-
-    events:
-      'click #quality-gate-rename': 'renameQualityGate'
-      'click #quality-gate-copy': 'copyQualityGate'
-      'click #quality-gate-delete': 'deleteQualityGate'
-      'click #quality-gate-set-as-default': 'setAsDefault'
-      'click #quality-gate-unset-as-default': 'unsetAsDefault'
-
-
-    renameQualityGate: ->
-      @options.app.qualityGateEditView.method = 'rename'
-      @options.app.qualityGateEditView.model = @model
-      @options.app.qualityGateEditView.show()
-
-
-    copyQualityGate: ->
-      copiedModel = new QualityGate @model.toJSON()
-      copiedModel.set 'default', false
-      @options.app.qualityGateEditView.method = 'copy'
-      @options.app.qualityGateEditView.model = copiedModel
-      @options.app.qualityGateEditView.show()
-
-
-    deleteQualityGate: ->
-      if confirm t('are_you_sure')
-        @showSpinner()
-        jQuery.ajax
-          type: 'POST'
-          url: "#{baseUrl}/api/qualitygates/destroy"
-          data: id: @model.id
-        .always =>
-          @hideSpinner()
-        .done =>
-          @options.app.deleteQualityGate @model.id
-
-
-    changeDefault: (set) ->
-      @showSpinner()
-      data = if set then { id: @model.id } else {}
-      method = if set then 'set_as_default' else 'unset_default'
-      jQuery.ajax
-        type: 'POST'
-        url: "#{baseUrl}/api/qualitygates/#{method}"
-        data: data
-      .always =>
-        @hideSpinner()
-      .done =>
-        @options.app.unsetDefaults @model.id
-        @model.set 'default', !@model.get('default')
-
-
-    setAsDefault: ->
-      @changeDefault true
-
-
-    unsetAsDefault: ->
-      @changeDefault false
-
-
-    showSpinner: ->
-      @$el.hide()
-      jQuery(@spinner).insertBefore @$el
-
-
-    hideSpinner: ->
-      @$el.prev().remove()
-      @$el.show()
-
-
-    serializeData: ->
-      _.extend super, canEdit: @options.app.canEdit
index c2f5cf0b8ed225b9ee3e8037be09ce7a8bc08a96..04d1e816c6a7b5015390c80a7c4e539c74c5018f 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'handlebars', 'quality-gate/models/quality-gate'], function(Marionette, Handlebars, QualityGate) {
-    var QualityGateDetailHeaderView, _ref;
+    var QualityGateDetailHeaderView;
     return QualityGateDetailHeaderView = (function(_super) {
       __extends(QualityGateDetailHeaderView, _super);
 
       function QualityGateDetailHeaderView() {
-        _ref = QualityGateDetailHeaderView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return QualityGateDetailHeaderView.__super__.constructor.apply(this, arguments);
       }
 
       QualityGateDetailHeaderView.prototype.template = Handlebars.compile(jQuery('#quality-gate-detail-header-template').html());
@@ -45,7 +43,6 @@
       };
 
       QualityGateDetailHeaderView.prototype.deleteQualityGate = function() {
-        var _this = this;
         if (confirm(t('are_you_sure'))) {
           this.showSpinner();
           return jQuery.ajax({
             data: {
               id: this.model.id
             }
-          }).always(function() {
-            return _this.hideSpinner();
-          }).done(function() {
-            return _this.options.app.deleteQualityGate(_this.model.id);
-          });
+          }).always((function(_this) {
+            return function() {
+              return _this.hideSpinner();
+            };
+          })(this)).done((function(_this) {
+            return function() {
+              return _this.options.app.deleteQualityGate(_this.model.id);
+            };
+          })(this));
         }
       };
 
       QualityGateDetailHeaderView.prototype.changeDefault = function(set) {
-        var data, method,
-          _this = this;
+        var data, method;
         this.showSpinner();
         data = set ? {
           id: this.model.id
           type: 'POST',
           url: "" + baseUrl + "/api/qualitygates/" + method,
           data: data
-        }).always(function() {
-          return _this.hideSpinner();
-        }).done(function() {
-          _this.options.app.unsetDefaults(_this.model.id);
-          return _this.model.set('default', !_this.model.get('default'));
-        });
+        }).always((function(_this) {
+          return function() {
+            return _this.hideSpinner();
+          };
+        })(this)).done((function(_this) {
+          return function() {
+            _this.options.app.unsetDefaults(_this.model.id);
+            return _this.model.set('default', !_this.model.get('default'));
+          };
+        })(this));
       };
 
       QualityGateDetailHeaderView.prototype.setAsDefault = function() {
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-projects-view.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-projects-view.coffee
deleted file mode 100644 (file)
index b496d31..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-define [
-  'backbone.marionette',
-  'handlebars',
-  'select-list'
-], (
-  Marionette,
-  Handlebars
-) ->
-
-  class QualityGateDetailProjectsView extends Marionette.ItemView
-    template: Handlebars.compile jQuery('#quality-gate-detail-projects-template').html()
-
-
-    onRender: ->
-      unless @model.get('default')
-        new SelectList
-          el: @$('#select-list-projects')
-          width: '100%'
-          readOnly: !@options.app.canEdit
-          format: (item) -> item.name
-          searchUrl: "#{baseUrl}/api/qualitygates/search?gateId=#{@options.gateId}"
-          selectUrl: "#{baseUrl}/api/qualitygates/select"
-          deselectUrl: "#{baseUrl}/api/qualitygates/deselect"
-          extra:
-            gateId: @options.gateId
-          selectParameter: 'projectId'
-          selectParameterValue: 'id'
-          labels:
-            selected: t('quality_gates.projects.with')
-            deselected: t('quality_gates.projects.without')
-            all: t('quality_gates.projects.all')
-            noResults: t('quality_gates.projects.noResults')
-          tooltips:
-            select: t('quality_gates.projects.select_hint')
-            deselect: t('quality_gates.projects.deselect_hint')
-
-    serializeData: ->
-      _.extend super, canEdit: @options.app.canEdit
index 3651f6fb735ef2e186a20b68c645cc1db464cfe9..7bf96743e78bdb40b774d034e78b9dd9ee51fc3b 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'handlebars', 'select-list'], function(Marionette, Handlebars) {
-    var QualityGateDetailProjectsView, _ref;
+    var QualityGateDetailProjectsView;
     return QualityGateDetailProjectsView = (function(_super) {
       __extends(QualityGateDetailProjectsView, _super);
 
       function QualityGateDetailProjectsView() {
-        _ref = QualityGateDetailProjectsView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return QualityGateDetailProjectsView.__super__.constructor.apply(this, arguments);
       }
 
       QualityGateDetailProjectsView.prototype.template = Handlebars.compile(jQuery('#quality-gate-detail-projects-template').html());
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-view.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-detail-view.coffee
deleted file mode 100644 (file)
index 475b25f..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-define [
-  'backbone.marionette',
-  'handlebars',
-  'quality-gate/collections/conditions',
-  'quality-gate/views/quality-gate-detail-header-view',
-  'quality-gate/views/quality-gate-detail-conditions-view',
-  'quality-gate/views/quality-gate-detail-projects-view'
-], (
-  Marionette,
-  Handlebars,
-  Conditions,
-  QualityGateDetailHeaderView,
-  QualityGateDetailConditionsView,
-  QualityGateDetailProjectsView
-) ->
-
-  class QualityGateDetailView extends Marionette.Layout
-    template: Handlebars.compile jQuery('#quality-gate-detail-template').html()
-
-
-    regions:
-      conditionsRegion: '#quality-gate-conditions'
-      projectsRegion: '#quality-gate-projects'
-
-
-    modelEvents:
-      'change': 'render'
-
-
-    onRender: ->
-      @showConditions()
-      @showProjects()
-
-
-    showConditions: ->
-      conditions = new Conditions @model.get('conditions')
-      view = new QualityGateDetailConditionsView
-        app: @options.app
-        collection: conditions
-        gateId: @model.id
-        qualityGate: @model
-      @conditionsRegion.show view
-
-
-    showProjects: ->
-      view = new QualityGateDetailProjectsView
-        app: @options.app
-        model: @model
-        gateId: @model.id
-      @projectsRegion.show view
index 6df657a234b4d730456d4cf491b5afdca00d975c..f9fdd640c21f13b8e8c38757f6038bc7e49cb763 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'handlebars', 'quality-gate/collections/conditions', 'quality-gate/views/quality-gate-detail-header-view', 'quality-gate/views/quality-gate-detail-conditions-view', 'quality-gate/views/quality-gate-detail-projects-view'], function(Marionette, Handlebars, Conditions, QualityGateDetailHeaderView, QualityGateDetailConditionsView, QualityGateDetailProjectsView) {
-    var QualityGateDetailView, _ref;
+    var QualityGateDetailView;
     return QualityGateDetailView = (function(_super) {
       __extends(QualityGateDetailView, _super);
 
       function QualityGateDetailView() {
-        _ref = QualityGateDetailView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return QualityGateDetailView.__super__.constructor.apply(this, arguments);
       }
 
       QualityGateDetailView.prototype.template = Handlebars.compile(jQuery('#quality-gate-detail-template').html());
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-edit-view.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-edit-view.coffee
deleted file mode 100644 (file)
index a1763ee..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-define [
-  'backbone.marionette',
-  'handlebars'
-], (
-  Marionette,
-  Handlebars,
-) ->
-
-  class QualityGateEditView extends Marionette.ItemView
-    className: 'modal'
-    template: Handlebars.compile jQuery('#quality-gate-edit-template').html()
-
-
-    ui:
-      nameInput: '#quality-gate-edit-name'
-
-
-    events:
-      'submit form': 'onSubmit'
-      'click #quality-gate-cancel-create': 'hide'
-
-
-    onRender: ->
-      @$el.dialog
-        dialogClass: 'no-close',
-        width: '600px',
-        draggable: false,
-        autoOpen: false,
-        modal: true,
-        minHeight: 50,
-        resizable: false,
-        title: null
-
-
-    show: ->
-      @render()
-      @$el.dialog 'open'
-      @ui.nameInput.focus()
-
-
-    hide: ->
-      @$el.dialog 'close'
-
-
-    saveRequest: (data) ->
-      jQuery.ajax
-        type: 'POST'
-        url: "#{baseUrl}/api/qualitygates/#{@method}"
-        data: data
-      .done => @hide()
-
-
-    onSubmit: (e) ->
-      e.preventDefault()
-      switch @method
-        when 'create' then @createQualityGate()
-        when 'copy' then @copyQualityGate()
-        when 'rename' then @saveQualityGate()
-        else
-
-
-    createQualityGate: ->
-      data = name: @ui.nameInput.val()
-      @saveRequest(data).done (r) =>
-        @model.set id: r.id, name: r.name
-        @options.app.qualityGates.add @model
-        @options.app.router.navigate "show/#{r.id}", trigger: true
-
-
-    saveQualityGate: ->
-      data = id: @model.id, name: @ui.nameInput.val()
-      @saveRequest(data).done (r) =>
-        @model.set name: r.name
-
-
-    copyQualityGate: ->
-      data = id: @model.id, name: @ui.nameInput.val()
-      @saveRequest(data).done (r) =>
-        @model.set id: r.id, name: r.name
-        @options.app.qualityGates.add @model
-        @options.app.router.navigate "show/#{r.id}", trigger: true
-
-
-    serializeData: ->
-      if @model
-        _.extend @model.toJSON(), method: @method
index b4eaa4bf9df9ec94b11218742e92c74e8b97a1d9..9529a449d9092bdf602d760eb251d68a6782cf5c 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'handlebars'], function(Marionette, Handlebars) {
-    var QualityGateEditView, _ref;
+    var QualityGateEditView;
     return QualityGateEditView = (function(_super) {
       __extends(QualityGateEditView, _super);
 
       function QualityGateEditView() {
-        _ref = QualityGateEditView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return QualityGateEditView.__super__.constructor.apply(this, arguments);
       }
 
       QualityGateEditView.prototype.className = 'modal';
       };
 
       QualityGateEditView.prototype.saveRequest = function(data) {
-        var _this = this;
         return jQuery.ajax({
           type: 'POST',
           url: "" + baseUrl + "/api/qualitygates/" + this.method,
           data: data
-        }).done(function() {
-          return _this.hide();
-        });
+        }).done((function(_this) {
+          return function() {
+            return _this.hide();
+          };
+        })(this));
       };
 
       QualityGateEditView.prototype.onSubmit = function(e) {
       };
 
       QualityGateEditView.prototype.createQualityGate = function() {
-        var data,
-          _this = this;
+        var data;
         data = {
           name: this.ui.nameInput.val()
         };
-        return this.saveRequest(data).done(function(r) {
-          _this.model.set({
-            id: r.id,
-            name: r.name
-          });
-          _this.options.app.qualityGates.add(_this.model);
-          return _this.options.app.router.navigate("show/" + r.id, {
-            trigger: true
-          });
-        });
+        return this.saveRequest(data).done((function(_this) {
+          return function(r) {
+            _this.model.set({
+              id: r.id,
+              name: r.name
+            });
+            _this.options.app.qualityGates.add(_this.model);
+            return _this.options.app.router.navigate("show/" + r.id, {
+              trigger: true
+            });
+          };
+        })(this));
       };
 
       QualityGateEditView.prototype.saveQualityGate = function() {
-        var data,
-          _this = this;
+        var data;
         data = {
           id: this.model.id,
           name: this.ui.nameInput.val()
         };
-        return this.saveRequest(data).done(function(r) {
-          return _this.model.set({
-            name: r.name
-          });
-        });
+        return this.saveRequest(data).done((function(_this) {
+          return function(r) {
+            return _this.model.set({
+              name: r.name
+            });
+          };
+        })(this));
       };
 
       QualityGateEditView.prototype.copyQualityGate = function() {
-        var data,
-          _this = this;
+        var data;
         data = {
           id: this.model.id,
           name: this.ui.nameInput.val()
         };
-        return this.saveRequest(data).done(function(r) {
-          _this.model.set({
-            id: r.id,
-            name: r.name
-          });
-          _this.options.app.qualityGates.add(_this.model);
-          return _this.options.app.router.navigate("show/" + r.id, {
-            trigger: true
-          });
-        });
+        return this.saveRequest(data).done((function(_this) {
+          return function(r) {
+            _this.model.set({
+              id: r.id,
+              name: r.name
+            });
+            _this.options.app.qualityGates.add(_this.model);
+            return _this.options.app.router.navigate("show/" + r.id, {
+              trigger: true
+            });
+          };
+        })(this));
       };
 
       QualityGateEditView.prototype.serializeData = function() {
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-sidebar-list-empty-view.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-sidebar-list-empty-view.coffee
deleted file mode 100644 (file)
index e867a80..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-define [
-  'backbone.marionette',
-  'handlebars'
-], (
-  Marionette,
-  Handlebars
-) ->
-
-  class QualityGateSidebarListEmptyView extends Marionette.ItemView
-    tagName: 'li'
-    className: 'empty'
-    template: Handlebars.compile jQuery('#quality-gate-sidebar-list-empty-template').html()
index 15345f2ef51630eb68a5e96b4a54b2a4008f204d..289f5a48bbf16294322749b13f7fbeac02644b79 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'handlebars'], function(Marionette, Handlebars) {
-    var QualityGateSidebarListEmptyView, _ref;
+    var QualityGateSidebarListEmptyView;
     return QualityGateSidebarListEmptyView = (function(_super) {
       __extends(QualityGateSidebarListEmptyView, _super);
 
       function QualityGateSidebarListEmptyView() {
-        _ref = QualityGateSidebarListEmptyView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return QualityGateSidebarListEmptyView.__super__.constructor.apply(this, arguments);
       }
 
       QualityGateSidebarListEmptyView.prototype.tagName = 'li';
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-sidebar-list-item-view.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-sidebar-list-item-view.coffee
deleted file mode 100644 (file)
index 4587367..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-define [
-  'backbone.marionette',
-  'handlebars'
-], (
-  Marionette,
-  Handlebars
-) ->
-
-  class QualityGateSidebarListItemView extends Marionette.ItemView
-    tagName: 'li'
-    template: Handlebars.compile jQuery('#quality-gate-sidebar-list-item-template').html()
-
-
-    modelEvents:
-      'change': 'render'
-
-
-    events:
-      'click': 'showQualityGate'
-
-
-    onRender: ->
-      @$el.toggleClass 'active', @options.highlighted
-
-
-    showQualityGate: ->
-      @options.app.router.navigate "show/#{@model.id}", trigger: true
index 05b6798c7beb1b58aa5bcda3bf5088ddf1104e8a..e0fe339fa424a3bc3416797f3a6c44b9a5e61a3d 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'handlebars'], function(Marionette, Handlebars) {
-    var QualityGateSidebarListItemView, _ref;
+    var QualityGateSidebarListItemView;
     return QualityGateSidebarListItemView = (function(_super) {
       __extends(QualityGateSidebarListItemView, _super);
 
       function QualityGateSidebarListItemView() {
-        _ref = QualityGateSidebarListItemView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return QualityGateSidebarListItemView.__super__.constructor.apply(this, arguments);
       }
 
       QualityGateSidebarListItemView.prototype.tagName = 'li';
diff --git a/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-sidebar-list-view.coffee b/sonar-server/src/main/webapp/javascripts/quality-gate/views/quality-gate-sidebar-list-view.coffee
deleted file mode 100644 (file)
index 44269db..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-define [
-  'backbone.marionette',
-  'handlebars',
-  'quality-gate/models/quality-gate',
-  'quality-gate/views/quality-gate-sidebar-list-item-view',
-  'quality-gate/views/quality-gate-sidebar-list-empty-view'
-], (
-  Marionette,
-  Handlebars,
-  QualityGate,
-  QualityGateSidebarListItemView,
-  QualityGateSidebarListEmptyView
-) ->
-
-  class QualityGateSidebarListView extends Marionette.CollectionView
-    tagName: 'ol'
-    className: 'navigator-results-list'
-    itemView: QualityGateSidebarListItemView
-    emptyView: QualityGateSidebarListEmptyView
-
-
-    itemViewOptions: (model) ->
-      app: @options.app
-      highlighted: model.get('id') == +@highlighted
-
-
-    highlight: (id) ->
-      @highlighted = id
-      @render()
index 03de62322aa4b58eb58d4b14ce4fbbc8cbe08792..5001d37d1540ecb355ffe7a73eada48fe7c4585c 100644 (file)
@@ -1,16 +1,14 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var __hasProp = {}.hasOwnProperty,
     __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
 
   define(['backbone.marionette', 'handlebars', 'quality-gate/models/quality-gate', 'quality-gate/views/quality-gate-sidebar-list-item-view', 'quality-gate/views/quality-gate-sidebar-list-empty-view'], function(Marionette, Handlebars, QualityGate, QualityGateSidebarListItemView, QualityGateSidebarListEmptyView) {
-    var QualityGateSidebarListView, _ref;
+    var QualityGateSidebarListView;
     return QualityGateSidebarListView = (function(_super) {
       __extends(QualityGateSidebarListView, _super);
 
       function QualityGateSidebarListView() {
-        _ref = QualityGateSidebarListView.__super__.constructor.apply(this, arguments);
-        return _ref;
+        return QualityGateSidebarListView.__super__.constructor.apply(this, arguments);
       }
 
       QualityGateSidebarListView.prototype.tagName = 'ol';
diff --git a/sonar-server/src/main/webapp/javascripts/tests/common/inputsSpec.coffee b/sonar-server/src/main/webapp/javascripts/tests/common/inputsSpec.coffee
deleted file mode 100644 (file)
index d20983d..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-$ = jQuery
-
-describe 'WORK_DUR suite', ->
-
-  beforeEach ->
-    window.SS = {}
-    window.SS.phrases =
-      'work_duration':
-        'x_days': '{0}d', 'x_hours': '{0}h', 'x_minutes': '{0}min'
-
-    @input = $('<input type="text">')
-    @input.appendTo $('body')
-    @input.data 'type', 'WORK_DUR'
-
-
-  it 'converts', ->
-    @input.originalVal '2d 7h 13min'
-    expect(@input.val()).toBe 1393
-
-
-  it 'converts only days', ->
-    @input.originalVal '1d'
-    expect(@input.val()).toBe 480
-
-
-  it 'converts hours with minutes', ->
-    @input.originalVal '2h 30min'
-    expect(@input.val()).toBe 150
-
-
-  it 'restores', ->
-    @input.val 1393
-    expect(@input.originalVal()).toBe '2d 7h 13min'
-
-
-  it 'returns initially incorrect value', ->
-    @input.val 'something'
-    expect(@input.val()).toBe 'something'
-
-
-
-describe 'RATING suite', ->
-
-  beforeEach ->
-    @input = $('<input type="text">')
-    @input.appendTo $('body')
-    @input.data 'type', 'RATING'
-
-
-  it 'converts A', ->
-    @input.originalVal 'A'
-    expect(@input.val()).toBe 1
-
-
-  it 'converts B', ->
-    @input.originalVal 'B'
-    expect(@input.val()).toBe 2
-
-
-  it 'converts E', ->
-    @input.originalVal 'E'
-    expect(@input.val()).toBe 5
-
-
-  it 'does not convert F', ->
-    @input.originalVal 'F'
-    expect(@input.val()).toBe 'F'
-
-
-  it 'restores A', ->
-    @input.val 1
-    expect(@input.originalVal()).toBe 'A'
-
-
-  it 'restores E', ->
-    @input.val 5
-    expect(@input.originalVal()).toBe 'E'
-
-
-  it 'returns initially incorrect value', ->
-    @input.val 'something'
-    expect(@input.val()).toBe 'something'
index 2278db2d672b0ade87970c021cd6dd1aff7b0fb2..4af7a003c8493c6e29626e254ca62141a384b5a7 100644 (file)
@@ -1,4 +1,3 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var $;
 
diff --git a/sonar-server/src/main/webapp/javascripts/tests/translateSpec.coffee b/sonar-server/src/main/webapp/javascripts/tests/translateSpec.coffee
deleted file mode 100644 (file)
index 7b4576b..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-$ = jQuery
-
-describe 'translation "t" suite', ->
-
-  beforeEach ->
-    window.messages =
-      'something': 'SOMETHING'
-      'something_with_underscore': 'SOMETHING_WITH_UNDERSCORE'
-      'something_with{braces}': 'SOMETHING_WITH{braces}'
-
-    window.SS =
-      phrases:
-        'something': 'SOMETHING ANOTHER'
-
-
-  afterEach ->
-    window.messages = window.SS = undefined
-
-
-  it 'translates', ->
-    expect(t('something')).toBe 'SOMETHING'
-
-
-  it 'translates with underscore', ->
-    expect(t('something_with_underscore')).toBe 'SOMETHING_WITH_UNDERSCORE'
-
-
-  it 'translates with braces', ->
-    expect(t('something_with{braces}')).toBe 'SOMETHING_WITH{braces}'
-
-
-  it 'fallbacks to "translate"', ->
-    window.messages = undefined
-    expect(t('something')).toBe 'SOMETHING ANOTHER'
-
-
-  it 'returns the key when no translation', ->
-    expect(t('something_another')).toBe 'something_another'
-
-
-
-describe 'translation "translate" suite', ->
-
-  beforeEach ->
-    window.SS =
-      phrases:
-        'something': 'SOMETHING'
-        'something_with_underscore': 'SOMETHING_WITH_UNDERSCORE'
-        'something_with{braces}': 'SOMETHING_WITH{braces}'
-
-
-  afterEach ->
-    window.messages = window.SS = undefined
-
-
-  it 'translates', ->
-    expect(translate('something')).toBe 'SOMETHING'
-
-
-  it 'translates with underscore', ->
-    expect(translate('something_with_underscore')).toBe 'SOMETHING_WITH_UNDERSCORE'
-
-
-  it 'translates with braces', ->
-    expect(translate('something_with{braces}')).toBe 'SOMETHING_WITH{braces}'
-
-
-  it 'returns the key when no translation', ->
-    expect(translate('something_another')).toBe 'something_another'
-
-
-  it 'does not fail when there is no dictionary', ->
-    window.SS = undefined
-    expect(translate('something_another')).toBe 'something_another'
-
index 2f3aafe26528779ac1afb12f9cd17f7e4b327a3b..0a59fc4de6a30804d085c8d77ae4f04d1e79f465 100644 (file)
@@ -1,4 +1,3 @@
-// Generated by CoffeeScript 1.6.3
 (function() {
   var $;
 
diff --git a/sonar-server/src/main/webapp/less/coding-rules.less b/sonar-server/src/main/webapp/less/coding-rules.less
new file mode 100644 (file)
index 0000000..6a3358b
--- /dev/null
@@ -0,0 +1,165 @@
+@import 'mixins';
+@import 'variables';
+@import 'navigator/config';
+
+
+.coding-rules-page {
+
+  .navigator-results .spinner {
+    margin: @navigatorPadding;
+  }
+
+}
+
+
+
+/*
+ * Detail
+ */
+
+.coding-rules-detail-header,
+.coding-rules-detail-title {
+  margin-bottom: @navigatorPadding;
+  line-height: 1.5;
+  font-weight: bold;
+}
+
+.coding-rules-detail-title {
+  display: inline-block;
+  text-transform: uppercase;
+}
+
+.coding-rules-detail-status {
+  padding: 3px 4px;
+  background-color: @navigatorBarBackground;
+  color: #777;
+  font-size: @smallFontSize;
+}
+
+.coding-rules-detail-key {
+
+}
+
+.coding-rules-detail-properties {
+  margin: @navigatorPadding 0;
+  font-size: 0;
+}
+
+.coding-rules-detail-property {
+  display: inline-block;
+  vertical-align: middle;
+  font-size: @smallFontSize;
+  height: 22px;
+  line-height: 22px;
+
+  .select2-search-field { line-height: 1; }
+}
+
+.coding-rules-detail-property + .coding-rules-detail-property {
+  margin-left: 2 * @navigatorPadding;
+}
+
+.coding-rules-detail-tag + .coding-rules-detail-tag {
+  margin-left: @navigatorPadding;
+}
+
+.coding-rules-detail-description {
+  margin: 2 * @navigatorPadding 0;
+}
+
+.coding-rules-detail-description-extra {
+  margin-top: -@navigatorPadding;
+}
+
+.coding-rules-detail-parameters {
+  margin: @navigatorPadding 0 @navigatorPadding * 2;
+}
+
+.coding-rules-detail-parameter {
+  margin: @navigatorPadding 0;
+  font-size: 0;
+}
+
+.coding-rules-detail-parameter-name {
+  display: inline-block;
+  visibility: top;
+  width: 150px;
+  font-size: @baseFontSize;
+  font-weight: bold;
+  text-align: right;
+}
+
+.coding-rules-detail-parameter-description {
+  display: inline-block;
+  vertical-align: top;
+  margin-left: 2 * @navigatorPadding;
+  font-size: @baseFontSize;
+}
+
+
+// Quality Profiles
+.coding-rules-detail-quality-profiles-header {
+  margin-top: 3 * @navigatorPadding;
+}
+
+.coding-rules-detail-quality-profiles {
+  font-size: 0;
+}
+
+.coding-rules-detail-quality-profile {
+  border: 1px solid transparent;
+
+  &.active {
+    border-color: @highlighted;
+
+    .coding-rules-detail-quality-profile-name {
+      background-color: @highlighted;
+      color: #fff;
+    }
+  }
+}
+
+.coding-rules-detail-quality-profile + .coding-rules-detail-quality-profile {
+  margin-top: 2 * @navigatorPadding;
+}
+
+.coding-rules-detail-quality-profile-name {
+  padding: @navigatorPadding / 2;
+  background-color: @navigatorBarBackground;
+  line-height: 1;
+  font-weight: bold;
+}
+
+.coding-rules-detail-quality-profile-actions {
+  padding: @navigatorPadding / 2;
+}
+
+.coding-rules-detail-quality-profile-parameters {
+  padding: 0 @navigatorPadding / 2;
+
+  .coding-rules-detail-parameter-name,
+  .coding-rules-detail-parameter-description {
+    vertical-align: middle;
+  }
+
+  .coding-rules-detail-parameter-description input {
+    width: 200px;
+  }
+}
+
+.coding-rules-detail-quality-profile-inheritance {
+  margin: @navigatorPadding 0;
+  padding: 0 @navigatorPadding / 2;
+
+  strong { font-weight: bold; }
+}
+
+.coding-rules-detail-quality-profile-note {
+  margin: @navigatorPadding 0;
+  padding: 0 @navigatorPadding / 2;
+}
+
+.coding-rules-detail-quality-profiles-activation {
+  margin-top: -3px;
+  margin-left: @navigatorPadding;
+}
diff --git a/sonar-server/src/main/webapp/less/dashboard.less b/sonar-server/src/main/webapp/less/dashboard.less
new file mode 100644 (file)
index 0000000..710d6bb
--- /dev/null
@@ -0,0 +1,265 @@
+/* LAYOUT */
+#dashboard {
+  position: relative;
+  width: 100%;
+}
+
+#dashboard .transparent {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  top: 0;
+  left: 0;
+  background: url('../images/transparent.gif') repeat;
+  z-index: 1000;
+}
+
+/* WIDGETS */
+#dashboard .widget {
+  position: relative;
+  overflow-x: auto;
+  overflow-y: hidden;
+  padding: 10px;
+  margin: 0;
+  border: 1px solid #ddd;
+}
+
+#dashboard .block {
+  margin: 0 0 10px 0;
+}
+
+#dashboard .configure_widget {
+  display: block;
+  position: relative;
+}
+
+#dashboard .widget_props {
+  background-color: #FFF6BF;
+  border: 1px solid #FFD324;
+  margin-bottom: 10px;
+  padding: 5px;
+  border-radius: 0 0 3px 3px;
+  -moz-border-radius: 0 0 3px 3px;
+  -webkit-border-radius: 0 0 3px 3px;
+}
+
+#dashboard .widget-title {
+  background-color: #4B9FD5;
+  color: #FEFEFE;
+  padding: 0 5px;
+  height: 24px;
+  line-height: 24px;
+}
+
+#dashboard .widget-title a {
+  color: #FEFEFE;
+}
+
+/*CONFIGURATION*/
+#dashboard #configure {
+  position: relative;
+  height: 260px;
+  margin: 5px 0 10px 0;
+}
+
+#dashboard #widget_defs, #dashboard #edit-layout {
+  background-color: #FFF6BF;
+  border: 2px solid #FFD324;
+  padding: 3px;
+  border-radius: 3px;
+  -moz-border-radius: 3px;
+  -webkit-border-radius: 3px;
+  overflow-x: hidden;
+}
+
+#dashboard #widget_defs {
+  margin-right: 104px;
+  overflow-y: auto;
+  height: 250px;
+}
+
+#dashboard #edit-layout {
+  width: 86px;
+  height: 248px;
+  position: absolute;
+  right: 0;
+  top: 0;
+  padding-top: 5px;
+}
+
+#dashboard #edit-layout p {
+  margin-bottom: 5px;
+}
+
+#dashboard .widget_def {
+  border: 1px solid #FFD324;
+  padding: 5px;
+  margin: 3px;
+  white-space: normal;
+  vertical-align: top;
+  width: 250px;
+  float: left;
+  min-height: 100px;
+}
+
+#dashboard ul.widget_categs li {
+  padding-right: 5px;
+}
+
+#dashboard ul.widget_categs li.selected a {
+  font-weight: bold;
+  text-decoration: none;
+}
+
+#dashboard .select-layout {
+  float: left;
+}
+
+#dashboard .select-layout img {
+  border: 3px solid #FFF6BF;
+}
+
+#dashboard .select-layout.selected img {
+  border: 3px solid #4B9FD5;
+}
+
+.admin_page {
+    position: relative;
+}
+
+.admin_page table {
+  margin-top: 10px;
+  margin-bottom: 50px;
+}
+
+.admin_page .empty {
+  font-style: italic;
+}
+
+.admin_page .operations {
+  width: 260px;
+  text-align: right;
+}
+
+.admin_page .owner {
+  width: 140px;
+  text-align: center;
+}
+
+.admin_page .shared {
+  width: 40px;
+  text-align: center;
+}
+
+.admin_page .order, .admin_page .global {
+  width: 45px;
+  text-align: center;
+}
+
+/*OPERATIONS*/
+#dashboard #dashboard-operations {
+  position: relative;
+  display: inline-block;
+  width: 100%;
+}
+
+#dashboard #dashboard-operations ul.operations {
+  float: left;
+  list-style-type: none;
+  border: 1px solid #cdcdcd;
+  padding: 0;
+  margin: 0;
+  border-radius: 3px;
+  -moz-border-radius: 3px;
+  -webkit-border-radius: 3px;
+}
+
+#dashboard #dashboard-operations ul.operations li {
+  float: left;
+  margin: 0;
+  padding: 2px 10px;
+  position: relative;
+  background-color: #f4f4f4;
+  font-size: 85%;
+  border-right: 1px solid #cdcdcd;
+}
+
+#dashboard #dashboard-operations ul.operations li.last {
+  border-right-width: 0;
+}
+
+#dashboard #dashboard-operations ul.operations li.selected {
+  background-color: #d4d4d4;
+}
+
+#dashboard #dashboard-operations ul.operations li a {
+  color: #555;
+}
+
+#dashboard .dashboard-column {
+  margin: 0;
+  padding: 0;
+  overflow: visible;
+}
+
+#dashboard .dashboard-column-wrapper {
+  float: left;
+  margin: 0;
+  padding: 0;
+}
+
+#dashboard .column-handle {
+  height: 30px;
+  width: 100%;
+  margin: 0;
+  padding: 0;
+  display: inline-block;
+  line-height: 100px;
+  text-align: center;
+  font-size: x-large;
+  vertical-align: middle;
+  background-color: #eee;
+}
+
+#dashboard .block {
+  position: relative;
+  width: 100%;
+}
+
+#dashboard .widget-header {
+  line-height: 16px;
+  padding: 3px 5px;
+  background-color: #efefef;
+  border: 1px solid #ddd;
+  border-bottom: 0;
+}
+
+#dashboard .widget-handle {
+  cursor: move;
+  margin: 0;
+  background-image: url('../images/move.png');
+  background-position: left center;
+  background-repeat: no-repeat;
+  padding-left: 20px;
+}
+
+#dashboard .widget-actions {
+  float: right;
+  overflow: hidden; /* clears float for most browsers */
+  zoom: 1;
+}
+
+#dashboard .widget-actions a {
+  cursor: pointer;
+}
+
+#dashboard .block-hover {
+  outline: 2px dashed #ddd;
+}
+
+#dashboard .shadow-block {
+  box-shadow: 8px 8px 8px #ddd;
+  box-shadow: 8px 8px 8px #ddd;
+  -moz-box-shadow: 8px 8px 8px #ddd;
+  -webkit-box-shadow: 8px 8px 8px #ddd;
+}
diff --git a/sonar-server/src/main/webapp/less/icons.less b/sonar-server/src/main/webapp/less/icons.less
new file mode 100644 (file)
index 0000000..aca5c15
--- /dev/null
@@ -0,0 +1,341 @@
+@import "variables";
+@import "mixins";
+
+@font-face {
+  font-family: 'sonar';
+  src: url('../fonts/sonar.woff') format('woff'),
+       url('../fonts/sonar.svg#sonar') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+  font-family: 'sonar';
+  speak: none;
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+  vertical-align: middle;
+
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+a[class^="icon-"], a[class*=" icon-"] {
+  text-decoration: none !important;
+}
+
+
+/*
+ * Severity
+ */
+
+[class^="icon-severity-"], [class*=" icon-severity"] {
+  position: relative;
+  top: -1px;
+}
+
+.icon-severity-blocker:before,
+.icon-severity-4:before {
+  content: "\f000";
+  color: @severityBlockerColor;
+  font-size: @iconSmallFontSize;
+}
+.icon-severity-critical:before,
+.icon-severity-3:before {
+  content: "\f001";
+  color: @severityCriticalColor;
+  font-size: @iconSmallFontSize;
+}
+.icon-severity-major:before,
+.icon-severity-2:before {
+  content: "\f002";
+  color: @severityMajorColor;
+  font-size: @iconSmallFontSize;
+}
+.icon-severity-minor:before,
+.icon-severity-1:before {
+  content: "\f003";
+  color: @severityMinorColor;
+  font-size: @iconSmallFontSize;
+}
+.icon-severity-info:before,
+.icon-severity-0:before {
+  content: "\f004";
+  color: @severityInfoColor;
+  font-size: @iconSmallFontSize;
+}
+
+
+/*
+ * Status
+ */
+
+[class^="icon-status-"], [class*=" icon-status"] {
+  position: relative;
+  top: -1px;
+}
+
+.icon-status-open:before {
+  content: "\f010";
+  color: @statusOpenColor;
+  font-size: @iconSmallFontSize;
+  line-height: @iconLineHeight;
+}
+.icon-status-confirmed:before {
+  content: "\f011";
+  color: @statusConfirmedColor;
+  font-size: @iconSmallFontSize;
+  line-height: @iconLineHeight;
+}
+.icon-status-reopened:before {
+  content: "\f012";
+  color: @statusReopenedColor;
+  font-size: @iconSmallFontSize;
+  line-height: @iconLineHeight;
+}
+.icon-status-resolved:before {
+  content: "\f013";
+  color: @statusResolvedColor;
+  font-size: @iconSmallFontSize;
+  line-height: @iconLineHeight;
+}
+.icon-status-closed:before {
+  content: "\f014";
+  color: @statusClosedColor;
+  font-size: @iconSmallFontSize;
+  line-height: @iconLineHeight;
+}
+
+
+/*
+ * Alert
+ */
+
+.icon-alert-ok:before {
+  content: "\f013";
+  color: @green;
+  font-size: @iconFontSize;
+}
+.icon-alert-warn:before {
+  content: "\f000";
+  color: @orange;
+  font-size: @iconFontSize;
+}
+.icon-alert-error:before {
+  content: "\f057";
+  color: @red;
+  font-size: @iconFontSize;
+}
+.icon-alert-none:before {
+  content: "\f059";
+  color: @blue;
+  font-size: @iconFontSize;
+}
+
+
+/*
+ * Qualifier
+ */
+
+.icon-qualifier-dir:before {
+  content: "\f07b";
+  font-size: @iconFontSize;
+}
+.icon-qualifier-fil:before {
+  content: "\f0f6";
+  font-size: @iconFontSize;
+}
+.icon-qualifier-lib:before {
+  content: "\e600";
+  font-size: @iconFontSize;
+}
+
+
+/*
+ * Common
+ */
+
+.icon-list:before {
+  content: "\f039";
+}
+.icon-bullet-list:before {
+  content: "\f03a";
+}
+.icon-settings:before {
+  content: "\f015";
+}
+.icon-settings-multiple:before {
+  content: "\f085";
+}
+
+.icon-arrow-down:before {
+  content: "\f0d7";
+  position: relative;
+  top: -2px;
+}
+.icon-arrow-up:before {
+  content: "\f0d8";
+  position: relative;
+  top: -2px;
+}
+.icon-arrow-left:before {
+  content: "\f0d9";
+}
+.icon-arrow-right:before {
+  content: "\f0da";
+}
+
+.icon-emoticon-smiley:before {
+  content: "\f118";
+}
+.icon-emoticon-sad:before {
+  content: "\f119";
+}
+.icon-emoticon-speechless:before {
+  content: "\f11a";
+}
+.icon-rect-check:before {
+  content: "\f046";
+}
+.icon-check:before {
+  content: "\f00c";
+}
+.icon-default:before {
+  position: relative;
+  top: -0.1em;
+  content: "\f00c";
+}
+.icon-lang:before {
+  content: "\f024";
+  font-size: @iconSmallFontSize;
+}
+.icon-quality-profile:before {
+  content: "\f022";
+  font-size: @iconSmallFontSize;
+}
+.icon-tags:before {
+  content: "\f02c";
+  font-size: @iconSmallFontSize;
+}
+.icon-calendar:before {
+  position: relative;
+  top: -0.1em;
+  content: "\f073";
+  font-size: @iconSmallFontSize;
+}
+.icon-favorite:before {
+  content: "\f005";
+  color: @orange;
+  font-size: @iconFontSize;
+}
+.icon-not-favorite:before {
+  content: "\f005";
+  color: @darkGrey;
+  font-size: @iconFontSize;
+}
+.icon-help:before {
+  content: "\f059";
+  color: @blue;
+  font-size: @iconFontSize;
+}
+.icon-info:before {
+  content: "\f05a";
+  color: @blue;
+  font-size: @iconFontSize;
+}
+.icon-uniF060:before {
+  content: "\f060";
+}
+.icon-uniF061:before {
+  content: "\f061";
+}
+.icon-uniF062:before {
+  content: "\f062";
+}
+.icon-uniF063:before {
+  content: "\f063";
+}
+.icon-comment:before {
+  content: "\f075";
+}
+.icon-delete:before {
+  content: "\f00d";
+}
+.icon-compare:before {
+  content: "\f0c5";
+}
+.icon-link:before {
+  content: "\f0c1";
+}
+.icon-inheritance:before {
+  content: "\f126";
+  font-size: @iconFontSize;
+}
+.icon-plus:before {
+  content: "\f067";
+}
+
+
+/*
+ * Spinner
+ */
+
+.spinner {
+  position: relative;
+  vertical-align: middle;
+  .square(16px);
+  border: 2px solid #0cf;
+  border-radius: 50%;
+  .animation(spin 0.75s infinite linear);
+
+  // For IE9 only, because it does not support css animations
+  // Show animated gif
+  .ie9 & {
+    background-image: url(../images/loading.gif);
+    background-repeat: no-repeat;
+    background-position: 0 0;
+    border: none;
+  }
+}
+
+.spinner:before,
+.spinner:after {
+  left: -2px;
+  top: -2px;
+  display: none;
+  position: absolute;
+  content: '';
+  width: inherit;
+  height: inherit;
+  border: inherit;
+  border-radius: inherit;
+}
+
+.spinner,
+.spinner:before,
+.spinner:after {
+  display: inline-block;
+  .box-sizing(border-box);
+  border-color: transparent;
+  border-top-color: @blue;
+  .animation-duration(1.2s);
+}
+.spinner:before {
+  .rotate(120deg);
+}
+.spinner:after {
+  .rotate(240deg);
+}
+
+@-webkit-keyframes spin {
+  from { .rotate(0deg); }
+  to { .rotate(360deg); }
+}
+@keyframes spin {
+  from { .rotate(0deg); }
+  to { .rotate(360deg); }
+}
diff --git a/sonar-server/src/main/webapp/less/jquery-ui.less b/sonar-server/src/main/webapp/less/jquery-ui.less
new file mode 100644 (file)
index 0000000..7bb8a98
--- /dev/null
@@ -0,0 +1,368 @@
+/*! jQuery UI - v1.10.3 - 2013-06-18
+* http://jqueryui.com
+* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.button.css, jquery.ui.dialog.css
+* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+
+/* SONAR */
+.no-close .ui-dialog-titlebar-close {
+  display: none;
+}
+
+.ui-dialog .ui-dialog-titlebar {
+  display: none;
+}
+
+.ui-widget-header {
+  color: #ffffff;
+  font-weight: bold;
+}
+
+.ui-widget-header a {
+  color: #ffffff;
+}
+
+.ui-widget-shadow {
+  margin: -5px 0 0 -5px;
+  padding: 5px;
+  background: #000000 50% 50% repeat-x;
+  opacity: .20;
+  -moz-border-radius: 5px;
+  -khtml-border-radius: 5px;
+  -webkit-border-radius: 5px;
+  border-radius: 5px;
+}
+
+.ui-dialog {
+  position: absolute;
+  width: 300px;
+  overflow: hidden;
+  box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.5);
+  background-color: #FFF
+}
+
+/* /SONAR */
+
+.ui-helper-hidden {
+  display: none;
+}
+.ui-helper-hidden-accessible {
+  border: 0;
+  clip: rect(0 0 0 0);
+  height: 1px;
+  margin: -1px;
+  overflow: hidden;
+  padding: 0;
+  position: absolute;
+  width: 1px;
+}
+.ui-helper-reset {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  outline: 0;
+  line-height: 1.3;
+  text-decoration: none;
+  font-size: 100%;
+  list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+  content: "";
+  display: table;
+  border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+  clear: both;
+}
+.ui-helper-clearfix {
+  min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+  width: 100%;
+  height: 100%;
+  top: 0;
+  left: 0;
+  position: absolute;
+  opacity: 0;
+}
+
+.ui-front {
+  z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+  cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+  display: block;
+  text-indent: -99999px;
+  overflow: hidden;
+  background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  /* sonar */
+  background-color: #000000;
+  opacity: 0.5;
+  /* /sonar */
+}
+
+.ui-resizable {
+  position: relative;
+}
+.ui-resizable-handle {
+  position: absolute;
+  font-size: 0.1px;
+  display: block;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+  display: none;
+}
+.ui-resizable-n {
+  cursor: n-resize;
+  height: 7px;
+  width: 100%;
+  top: -5px;
+  left: 0;
+}
+.ui-resizable-s {
+  cursor: s-resize;
+  height: 7px;
+  width: 100%;
+  bottom: -5px;
+  left: 0;
+}
+.ui-resizable-e {
+  cursor: e-resize;
+  width: 7px;
+  right: -5px;
+  top: 0;
+  height: 100%;
+}
+.ui-resizable-w {
+  cursor: w-resize;
+  width: 7px;
+  left: -5px;
+  top: 0;
+  height: 100%;
+}
+.ui-resizable-se {
+  cursor: se-resize;
+  width: 12px;
+  height: 12px;
+  right: 1px;
+  bottom: 1px;
+}
+.ui-resizable-sw {
+  cursor: sw-resize;
+  width: 9px;
+  height: 9px;
+  left: -5px;
+  bottom: -5px;
+}
+.ui-resizable-nw {
+  cursor: nw-resize;
+  width: 9px;
+  height: 9px;
+  left: -5px;
+  top: -5px;
+}
+.ui-resizable-ne {
+  cursor: ne-resize;
+  width: 9px;
+  height: 9px;
+  right: -5px;
+  top: -5px;
+}
+.ui-button {
+  display: inline-block;
+  position: relative;
+  padding: 0;
+  line-height: normal;
+  margin-right: .1em;
+  cursor: pointer;
+  vertical-align: middle;
+  text-align: center;
+  overflow: visible; /* removes extra width in IE */
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+  text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+  width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+  width: 2.4em;
+}
+.ui-button-icons-only {
+  width: 3.4em;
+}
+button.ui-button-icons-only {
+  width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+  display: block;
+  line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+  padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+  padding: .4em;
+  text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+  padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+  padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+  padding-left: 2.1em;
+  padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+  padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+  position: absolute;
+  top: 50%;
+  margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+  left: 50%;
+  margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+  left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+  right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+  margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+  margin-left: 0;
+  margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+  border: 0;
+  padding: 0;
+}
+.ui-dialog {
+  position: absolute;
+  top: 0;
+  left: 0;
+  /* sonar
+  padding: .2em;
+  */
+  outline: 0;
+}
+/* sonar
+.ui-dialog .ui-dialog-titlebar {
+  padding: .4em 1em;
+  position: relative;
+}
+.ui-dialog .ui-dialog-title {
+  float: left;
+  margin: .1em 0;
+  white-space: nowrap;
+  width: 90%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+  position: absolute;
+  right: .3em;
+  top: 50%;
+  width: 21px;
+  margin: -10px 0 0 0;
+  padding: 1px;
+  height: 20px;
+}
+*/
+.ui-dialog .ui-dialog-content {
+  position: relative;
+  border: 0;
+  /* sonar
+  padding: .5em 1em;
+  */
+  background: none;
+  overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+  text-align: left;
+  border-width: 1px 0 0 0;
+  background-image: none;
+  margin-top: .5em;
+  padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+  float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+  margin: .5em .4em .5em 0;
+  cursor: pointer;
+}
+.ui-dialog .ui-resizable-se {
+  width: 12px;
+  height: 12px;
+  right: -5px;
+  bottom: -5px;
+  background-position: 16px 16px;
+}
+.ui-draggable .ui-dialog-titlebar {
+  cursor: move;
+}
diff --git a/sonar-server/src/main/webapp/less/layout.less b/sonar-server/src/main/webapp/less/layout.less
new file mode 100644 (file)
index 0000000..0e13781
--- /dev/null
@@ -0,0 +1,304 @@
+@media print {
+  /* ------------------- PRINT ------------------- */
+  html, body {
+    font-size: 8pt;
+  }
+
+  a, a:link, a:visited {
+    text-decoration: none;
+    border-bottom: 0;
+  }
+
+  .noprint {
+    display: none !important;
+  }
+
+  .print {
+    display: inline;
+    position: static;
+    left: 0;
+  }
+
+  #hd, #sidebar, #crumbs {
+    display: none;
+  }
+
+  .with_sidebar, .wo_sidebar {
+    padding: 0 !important;
+    margin: 0;
+  }
+
+  #content {
+    margin-left: 0 !important;
+  }
+}
+
+@media screen {
+  .print {
+    display: none;
+  }
+}
+
+body, a {
+  color: #444;
+}
+
+/* LAYOUT */
+#container {
+  height: auto !important;
+  min-width: 940px;
+  min-height: 500px;
+}
+
+#hd {
+  color: #FFF;
+  background: #262626;
+  padding: 0 10px;
+  height: 30px;
+  line-height: 30px;
+  font-size: 93%;
+  margin: 0;
+  position: relative;
+}
+
+#hd a {
+  color: #FFF;
+  text-decoration: none;
+}
+
+#hd a.selected {
+  color: #4B9FD5;
+}
+
+#hd a:focus, #hd a:hover {
+  text-decoration: underline;
+}
+
+#nav-left {
+  float: left;
+  vertical-align: middle;
+}
+
+#nav {
+  float: right;
+  padding: 0 0 0 20px;
+  vertical-align: middle;
+}
+
+#nav-left img, #nav img {
+  vertical-align: text-bottom;
+}
+
+#nav-left > ul> li {
+  float: left;
+  padding: 0 20px 0 0;
+}
+
+#nav > ul> li {
+  float: right;
+  padding: 0 0 0 15px;
+}
+
+#searchResourcesResults {
+  position: absolute;
+  float: right;
+  width: 600px;
+  top: 30px;
+  right: 0;
+}
+
+#crumbs {
+  color: #444;
+  background: #EFEFEF;
+  height: 26px;
+  line-height: 26px;
+  font-size: 93%;
+  margin: 0;
+  padding: 0 10px;
+  border-bottom: 1px solid #CCC;
+}
+
+#crumbs img {
+  vertical-align: text-bottom;
+}
+
+#bc li {
+  float: left;
+  background: #EFEFEF url("../images/bc-gray.png") no-repeat right;
+  border-bottom: 1px solid #CCC;
+  padding: 0 20px 0 0;
+  margin: 0 10px 0 0;
+}
+
+#bc li img {
+  margin-right: -5px;
+}
+
+#bc li a {
+  text-decoration: none;
+}
+
+#bc li a:hover, #bc li a:focus {
+  text-decoration: underline;
+}
+
+#crumbs-ops {
+  float: right;
+  padding: 0 5px 0 0;
+}
+
+#crumbs-ops li {
+  float: left;
+  padding: 0 0 0 10px;
+}
+
+#crumbs-ops li a {
+  text-decoration: none;
+}
+
+#crumbs-ops li a:hover, #crumbs-ops li a:focus {
+  text-decoration: underline;
+}
+
+#hd .dropdown-menu a {
+  color: #000;
+}
+
+#project-settings-menu {
+  float: right;
+  right: 20px;
+}
+
+#nonav {
+  text-align: left;
+  margin: 50px 180px 0;
+}
+
+#body {
+  /*  position: relative;*/
+}
+
+#footer {
+  margin: 10px;
+  clear: both;
+}
+
+.with_sidebar {
+  margin: 0 0 0 160px;
+  padding: 10px;
+}
+
+.wo_sidebar {
+  margin: 0 8px;
+}
+
+#sidebar {
+  width: 150px;
+  float: left;
+  margin: 0 0 0 10px;
+  top: 0;
+  left: 0;
+}
+
+ul.sidebar {
+  text-align: left;
+  border-top: none;
+  padding: 10px 0;
+}
+
+ul.sidebar li {
+  list-style-type: none;
+  padding: 3px 10px;
+}
+
+ul.sidebar li a {
+  text-decoration: none;
+}
+
+ul.sidebar li a:hover {
+  text-decoration: underline;
+}
+
+ul.sidebar li.active {
+  background-color: #4b9fd5;
+}
+
+ul.sidebar li.active a, ul.sidebar li.active a:hover {
+  color: #FFF;
+}
+
+ul.sidebar li.active [class^="icon-"],
+ul.sidebar li.active [class*=" icon-"] {
+  color: #FFF;
+}
+
+li.sidebar-title {
+  text-transform: uppercase;
+  font-size: 93%;
+  font-weight: bold;
+}
+
+ul.sidebar li.spacer {
+  border: 0 none;
+  height: 10px;
+  margin: 0;
+  padding: 0;
+}
+
+ul.sidebar select, ul.sidebar input {
+  font-size: 93%;
+}
+
+#logo {
+  text-align: center;
+  padding: 10px 0 0 0;
+}
+
+#logo a {
+  text-decoration: none;
+  border-bottom-width: 0;
+}
+
+#logo img {
+  display: block;
+}
+
+.page {
+  padding: 10px;
+}
+.page-split-left {
+  min-width: 200px;
+  max-width: 200px;
+  width: 200px;
+  margin: 0;
+  display: block;
+  vertical-align: top;
+  border-top: none;
+  border-left: none;
+  float: left;
+}
+
+.page-split-right {
+  display: block;
+  margin: 0;
+  vertical-align: top;
+  padding: 0 0 0 200px;
+}
+
+.gray-sidebar {
+  background-color: #EFEFEF;
+  border: 1px solid #CCC;
+  color: #666;
+  border-top: none;
+}
+
+.blue-sidebar {
+  background-color: #CAE3F2;
+  color: #262626;
+  border: 2px solid #4b9fd5;
+  border-top: none;
+}
+
+.nolayout {
+  padding: 10px;
+}
diff --git a/sonar-server/src/main/webapp/less/mixins.less b/sonar-server/src/main/webapp/less/mixins.less
new file mode 100644 (file)
index 0000000..808128c
--- /dev/null
@@ -0,0 +1,171 @@
+@import "variables";
+
+.clearfix() {
+  &:before, &:after { display: table; content: ""; line-height: 0; }
+  &:after { clear: both; }
+}
+
+.size(@width, @height) {
+  width: @width;
+  height: @height;
+}
+
+.square(@size) {
+  .size(@size, @size);
+}
+
+.topLeft(@top, @left) {
+  top: @top;
+  left: @left;
+}
+
+.topRight(@top, @right) {
+  top: @top;
+  right: @right;
+}
+
+.bottomLeft(@bottom, @left) {
+  bottom: @bottom;
+  left: @left;
+}
+
+.bottomRight(@bottom, @right) {
+  bottom: @bottom;
+  right: @left;
+}
+
+.rotate(@degrees) {
+  -webkit-transform: rotate(@degrees);
+      -ms-transform: rotate(@degrees);
+          transform: rotate(@degrees);
+}
+.scale(@ratio) {
+  -webkit-transform: scale(@ratio);
+      -ms-transform: scale(@ratio);
+          transform: scale(@ratio);
+}
+.scale2(@w, @h) {
+  -webkit-transform: scale(@w, @h);
+      -ms-transform: scale(@w, @h);
+          transform: scale(@w, @h);
+}
+.translate(@x, @y) {
+  -webkit-transform: translate(@x, @y);
+      -ms-transform: translate(@x, @y);
+          transform: translate(@x, @y);
+}
+.skew(@x, @y) {
+  -webkit-transform: skew(@x, @y);
+      -ms-transform: skew(@x, @y);
+          transform: skew(@x, @y);
+}
+.translate3d(@x, @y, @z) {
+  -webkit-transform: translate3d(@x, @y, @z);
+          transform: translate3d(@x, @y, @z);
+}
+
+.box-sizing(@boxmodel) {
+  -moz-box-sizing: @boxmodel;
+       box-sizing: @boxmodel;
+}
+
+.animation(@animation) {
+  -webkit-animation: @animation;
+  animation: @animation;
+}
+.animation-duration(@duration) {
+  -webkit-animation-duration: @duration;
+  animation-duration: @duration;
+}
+
+.horizontal-gradient(@startColor: #555, @endColor: #333) {
+    background-color: @endColor;
+    background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+
+    background-image: -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
+    background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+
+    background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10
+    background-image: linear-gradient(to right, @startColor, @endColor); // Standard, IE10
+    background-repeat: repeat-x;
+}
+.vertical-gradient(@startColor: #555, @endColor: #333) {
+    background-color: mix(@startColor, @endColor, 60%);
+    background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+
+    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
+    background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+
+    background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10
+    background-image: linear-gradient(to bottom, @startColor, @endColor); // Standard, IE10
+    background-repeat: repeat-x;
+}
+.directional-gradient(@startColor: #555, @endColor: #333, @deg: 45deg) {
+    background-color: @endColor;
+    background-repeat: repeat-x;
+    background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+
+    background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+
+    background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10
+    background-image: linear-gradient(@deg, @startColor, @endColor); // Standard, IE10
+}
+.vertical-three-colors-gradient(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
+    background-color: mix(@midColor, @endColor, 80%);
+    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));
+    background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor);
+    background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop, @endColor);
+    background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor);
+    background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor);
+    background-repeat: no-repeat;
+}
+.radial-gradient(@innerColor: #555, @outerColor: #333)  {
+    background-color: @outerColor;
+    background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@innerColor), to(@outerColor));
+    background-image: -webkit-radial-gradient(circle, @innerColor, @outerColor);
+    background-image: -moz-radial-gradient(circle, @innerColor, @outerColor);
+    background-image: -o-radial-gradient(circle, @innerColor, @outerColor);
+    background-repeat: no-repeat;
+}
+.striped-gradient(@color, @angle: 45deg) {
+    background-color: @color;
+    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));
+    background-image: -webkit-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
+    background-image: -moz-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
+    background-image: -o-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
+    background-image: linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
+}
+
+.trans(@property: all, @options: @defaultTransitionOptions) {
+  transition: @property @options;
+}
+
+.webkit-scrollbar() {
+  &::-webkit-scrollbar {
+    width: 11px;
+    background-color: transparent;
+    background-clip: content-box;
+  }
+  &::-webkit-scrollbar-button {
+    background-color: transparent;
+  }
+  &::-webkit-scrollbar-corner {
+    background-color: transparent;
+  }
+  &::-webkit-scrollbar-thumb {
+    border: solid transparent;
+    border-width: 1px 1px 1px 2px;
+    background-color: #c5c5c5;
+    background-clip: content-box;
+
+    &:hover {
+      background-color: darken(#ccc, 5%);
+    }
+  }
+  &::-webkit-scrollbar-track {
+    border: solid #fff;
+    border-width: 1px 1px 1px 2px;
+    background-color: #fff;
+    background-clip: content-box;
+  }
+  &::-webkit-scrollbar-track-piece {
+    border-left: 1px solid #ccc;
+    background-color: transparent;
+  }
+}
+
+@retina: ~"(-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi)";
diff --git a/sonar-server/src/main/webapp/less/navigator.less b/sonar-server/src/main/webapp/less/navigator.less
new file mode 100644 (file)
index 0000000..ab9401b
--- /dev/null
@@ -0,0 +1,6 @@
+@import "mixins";
+@import "variables";
+
+@import "navigator/config";
+@import "navigator/base";
+@import "navigator/filters";
diff --git a/sonar-server/src/main/webapp/less/navigator/base.less b/sonar-server/src/main/webapp/less/navigator/base.less
new file mode 100644 (file)
index 0000000..35c2b42
--- /dev/null
@@ -0,0 +1,524 @@
+@import "../variables";
+@import "../mixins";
+
+@import "config";
+
+
+.navigator { }
+
+
+.navigator-element() {
+  position: fixed;
+  z-index: 2;
+  .box-sizing(border-box);
+}
+
+.navigator-header {
+  .navigator-element;
+  top: @navigatorTopOffset;
+  left: 0;
+  .size(100%, @navigatorHeaderHeight);
+}
+
+.navigator-filters {
+  .navigator-element;
+  top: @navigatorTopOffset + @navigatorHeaderHeight;
+  left: 0;
+  .size(100%, @navigatorFiltersHeight);
+}
+
+.navigator-facets {
+  .navigator-element;
+  top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight;
+  left: 0;
+  .size(100%, @navigatorFacetsHeight);
+}
+
+.navigator-results {
+  .navigator-element;
+  .box-sizing(content-box);
+  top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight + @navigatorStatusHeight;
+  bottom: 0;
+  left: 0;
+  width: @navigatorResultsWidth - 1px;
+}
+
+.navigator-details {
+  .navigator-element;
+  top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight;
+  bottom: @navigatorBottomOffset;
+  left: @navigatorResultsWidth;
+  right: 0;
+}
+
+.navigator-actions {
+  .navigator-element;
+  top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight;
+  left: 0;
+  .size(@navigatorResultsWidth, @navigatorStatusHeight);
+}
+
+.navigator-notes {
+  .navigator-element;
+  top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight;
+  left: 0;
+  .size(100%, @navigatorNotesHeight);
+  display: none;
+}
+
+
+.measures-page {
+  .navigator-results {
+    top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight;
+    left: 0;
+    bottom: 36px;
+    width: 100%;
+  }
+}
+
+
+.navigator-with-notes {
+
+  .navigator-actions,
+  .navigator-details {
+    top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight + @navigatorNotesHeight;
+  }
+
+  .navigator-results {
+    top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight + @navigatorNotesHeight + @navigatorStatusHeight;
+  }
+
+  .navigator-notes {
+    display: block;
+  }
+
+  .navigator-details .source_title {
+    top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight + @navigatorNotesHeight;
+  }
+
+  .navigator-fetching.navigator-results-list:before {
+    top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight + @navigatorStatusHeight + @navigatorNotesHeight;
+  }
+
+}
+
+
+.navigator-fetching {
+  &:before {
+    content: " ";
+    position: absolute;
+    z-index: 3;
+    top: 0; bottom: 0; left: 0; right: 0;
+    background: #fff url(../images/loading.gif) no-repeat 4px 4px;
+  }
+
+  &#tab-issue-rule {
+    position: relative;
+
+    &:before {
+      z-index: 3;
+      background-color: #EFEFEF;
+    }
+  }
+
+  &.code-issue-actions {
+    position: relative;
+
+    &:before {
+      z-index: 3;
+      background-color: #E4ECF3;
+    }
+  }
+}
+
+
+.navigator-page-loader {
+  padding: @navigatorPadding 0 0 @navigatorPadding;
+}
+
+
+
+// Header
+.navigator-header {
+  padding: 0 @navigatorPadding;
+  border-bottom: 1px solid @navigatorBorderColor;
+  background-color: @navigatorBarBackground;
+  font-size: 0;
+}
+
+.navigator-header-favorite {
+  padding-left: 46px;
+}
+
+.navigator-header-title {
+  display: inline-block;
+  vertical-align: middle;
+  font-size: 20px;
+  line-height: @navigatorHeaderHeight;
+}
+
+.navigator-header-title-note {
+  vertical-align: middle;
+  color: #777;
+  font-size: @smallFontSize;
+}
+
+.navigator-header-description {
+  display: inline-block;
+  vertical-align: middle;
+  margin-left: 16px;
+  font-size: @smallFontSize;
+  font-style: italic;
+}
+
+.navigator-header-actions {
+  margin-left: 20px;
+
+  & > a {
+    vertical-align: middle;
+    margin: 0 8px;
+    font-size: @smallFontSize;
+  }
+}
+
+.navigator-header-menu-toggle {
+  display: inline-block;
+  vertical-align: top;
+  height: 36px;
+  margin-right: 10px;
+  margin-left: -10px;
+  padding: 10px;
+  border-right: 1px solid transparent;
+  .box-sizing(border-box);
+  cursor: pointer;
+  .trans;
+
+  &:hover {
+    background-color: @navigatorHover;
+  }
+
+  &.active {
+    border-color: #cdcdcd;
+    background-color: #fff;
+  }
+
+  [class^="icon-"], [class*=" icon-"] {
+    font-size: 16px;
+  }
+}
+
+
+
+// Notes
+.navigator-notes {
+  padding: 0 @navigatorPadding;
+  border-bottom: 1px solid @navigatorBorderColor;
+  background-color: @navigatorBarBackground;
+
+  color: #777;
+  font-size: @smallFontSize;
+  line-height: @navigatorNotesHeight;
+
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+
+
+// Facets
+.navigator-facets {
+  padding: @navigatorPadding;
+  border-bottom: 1px solid @navigatorBorderColor;
+  background-color: @navigatorBarBackground;
+}
+
+.navigator-facets-list {
+
+}
+
+.navigator-facets-list-item {
+  font-size: 0;
+}
+
+.navigator-facets-list-item + .navigator-facets-list-item {
+  margin-top: @navigatorPadding;
+}
+
+.navigator-facets-list-item-name {
+  display: inline-block;
+  vertical-align: middle;
+  margin-right: @navigatorPadding;
+  font-size: @baseFontSize;
+  font-weight: bold;
+  text-transform: uppercase;
+}
+
+.navigator-facets-list-item-options {
+  display: inline-block;
+  vertical-align: middle;
+}
+
+.navigator-facets-list-item-option {
+  display: inline-block;
+  vertical-align: middle;
+  margin: 0 @navigatorPadding;
+  font-size: @baseFontSize;
+  cursor: pointer;
+
+  &:hover {
+    .navigator-facets-list-item-option-name {
+      text-decoration: underline;
+    }
+  }
+
+  &.active {
+    .navigator-facets-list-item-option-name {
+      font-weight: bold;
+      text-decoration: underline;
+    }
+  }
+}
+
+.navigator-facets-list-item-option-name {
+
+}
+
+.navigator-facets-list-item-option-stat {
+  &:before { content: "("; }
+  &:after { content: ")"; }
+}
+
+
+
+// Results
+.navigator-results {
+  border-right: 1px solid @navigatorBorderLightColor;
+  background-color: @white;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+
+.navigator-results-list {
+
+  & > li {
+    padding: @navigatorPadding / 2 0;
+    border-top: 1px solid transparent;
+    cursor: pointer;
+    .trans;
+
+    .line {
+      padding: @navigatorPadding / 2 @navigatorPadding;
+      line-height: 1.2;
+    }
+
+    .line-small {
+      font-size: 11px;
+      line-height: 14px;
+    }
+
+    .line-right {
+      float: right;
+    }
+
+    .line-nowrap {
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+    }
+
+    &:hover {
+      background-color: @navigatorBarBackground;
+    }
+
+    &.active {
+      background-color: #CAE3F2;
+      border-color: #4B9FD5;
+    }
+
+    &.with-context {
+      border-right: 6px solid @navigatorBorderLightColor;
+    }
+
+    &:last-child {
+      border-bottom: 1px solid transparent;
+
+      &.active {
+        border-bottom-color: #4B9FD5;
+      }
+    }
+  }
+
+  & > li + li {
+    border-top-color: @navigatorBorderLightColor;
+  }
+
+  & > li.active + li {
+    border-top-color: #4B9FD5;
+  }
+
+  &.navigator-fetching {
+
+    & > li .line-nowrap {
+      text-overflow: clip; /* thanks to FF */
+    }
+
+    &:before {
+      position: fixed;
+      z-index: 3;
+      top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight + @navigatorStatusHeight;
+      bottom: 0;
+      left: 0;
+      width: @navigatorResultsWidth - 1px;
+    }
+  }
+}
+
+.navigator-results-no-results {
+  padding-top: 20% !important;
+  background: #fff !important;
+  color: #999;
+  cursor: default !important;
+  text-align: center;
+}
+
+
+
+// Details
+.navigator-details {
+  padding: @navigatorPadding;
+  background-color: @white;
+  overflow: auto;
+
+  .issues-page & {
+    padding-top: 62px;
+    padding-right: 0;
+  }
+
+  &.loading {
+    background: @white url("../images/loading.gif") no-repeat 4px 2px;
+  }
+
+  .code-issue-name {
+    border-bottom: none;
+  }
+
+  .code-issue-actions {
+    background-color: #E4ECF3;
+  }
+
+  .source_title {
+    position: fixed;
+    z-index: 3;
+    top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight;
+    left: @navigatorResultsWidth;
+    right: 0;
+    padding: @navigatorPadding;
+    border-bottom: 1px solid @navigatorBorderLightColor;
+    background-color: #fff;
+  }
+
+  .source {
+    padding-right: 10px;
+
+    & > table {
+      border: 1px solid #DDD;
+    }
+  }
+
+  .scm .author {
+    display: inline-block;
+    vertical-align: middle;
+    max-width: 100px;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+  }
+}
+
+
+
+// Status
+.navigator-actions {
+  padding: 0 @navigatorPadding 0 0;
+
+  border-right: 1px solid @navigatorBorderLightColor;
+  border-bottom: 1px solid @navigatorBorderLightColor;
+  background-color: @navigatorBarBackground;
+  font-size: @smallFontSize;
+
+  strong { font-weight: bold; }
+}
+
+.navigator-actions-order {
+  float: left;
+  padding: 0 @navigatorPadding;
+  line-height: @navigatorStatusHeight;
+  cursor: pointer;
+  .trans;
+
+  &:hover {
+    background-color: @navigatorBarBackground;
+  }
+}
+
+.navigator-actions-order-choices {
+  .navigator-element;
+  top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight + @navigatorStatusHeight;
+  left: 0;
+  min-width: @navigatorResultsWidth / 2;
+  background-color: #fff;
+  border-bottom: 1px solid @navigatorBorderLightColor;
+  border-right: 1px solid @navigatorBorderLightColor;
+  overflow: hidden;
+  display: none;
+
+  & > li {
+    height: @navigatorStatusHeight;
+    line-height: @navigatorStatusHeight;
+    padding: 0 10px;
+    cursor: pointer;
+    .trans;
+
+    &:hover {
+      background-color: @navigatorBarBackground;
+    }
+  }
+
+  &.open {
+    display: block;
+  }
+}
+
+.navigator-actions-total {
+  float: right;
+  line-height: @navigatorStatusHeight - 4px;
+}
+
+.navigator-actions-bulk {
+  position: relative;
+  top: -1px;
+  margin-left: 8px;
+  font-size: 16px;
+  text-decoration: none;
+}
+
+
+
+// Footer
+.navigator-page #footer {
+  .navigator-element;
+  bottom: 0;
+  left: @navigatorResultsWidth;
+  right: 0;
+  margin: 0;
+  border-top: 1px solid @navigatorBorderLightColor;
+}
+
+.navigator-page #ftlinks {
+  margin-top: 0;
+}
+
+.measures-page #footer {
+  left: 0;
+}
diff --git a/sonar-server/src/main/webapp/less/navigator/config.less b/sonar-server/src/main/webapp/less/navigator/config.less
new file mode 100644 (file)
index 0000000..2d920ff
--- /dev/null
@@ -0,0 +1,25 @@
+@import "../variables";
+
+// Layout
+@navigatorTopOffset: 30px;
+@navigatorBottomOffset: 35px;
+
+@navigatorHeaderHeight: 37px;
+@navigatorFiltersHeight: 37px;
+@navigatorFacetsHeight: 90px;
+@navigatorStatusHeight: 30px;
+@navigatorNotesHeight: 20px;
+
+@navigatorResultsWidth: 320px;
+
+@navigatorPadding: 10px;
+
+
+// Colors
+@navigatorBarBackground: @grey;
+@navigatorBorderColor: @darkGrey;
+@navigatorBorderLightColor: lighten(@darkGrey, 8%);
+
+
+@navigatorHover: darken(@grey, 5%);
+@navigatorFilterPadding: @navigatorPadding;
diff --git a/sonar-server/src/main/webapp/less/navigator/filters.less b/sonar-server/src/main/webapp/less/navigator/filters.less
new file mode 100644 (file)
index 0000000..dc9868f
--- /dev/null
@@ -0,0 +1,287 @@
+@import "../variables";
+@import "../mixins";
+
+@import "config";
+
+
+.navigator-filters {
+  border-bottom: 1px solid @darkGrey;
+  background-color: @navigatorBarBackground;
+  font-size: 0;
+}
+
+.navigator-filters-list {
+  display: inline-block;
+  vertical-align: middle;
+  margin-bottom: -1px;
+  font-size: 0;
+}
+
+.navigator-filter-submit,
+.navigator-filter-new-search {
+  vertical-align: middle;
+  margin-left: 15px;
+  font-size: @baseFontSize;
+}
+
+.navigator-filter-list-favorite {
+  position: relative;
+  padding-left: 36px;
+  overflow: hidden;
+}
+
+.navigator-filters-actions {
+  display: inline-block;
+  vertical-align: middle;
+  margin-left: 20px;
+  font-size: @baseFontSize;
+}
+
+.navigator-filter {
+  display: inline-block;
+  vertical-align: top;
+  height: @navigatorFiltersHeight - 1px;
+  line-height: @navigatorFiltersHeight - 1px;
+  margin: -1px 0 0;
+  padding: 0 @navigatorFilterPadding;
+  border: 1px solid transparent;
+  white-space: nowrap;
+  cursor: pointer;
+  transition: background 0.3s ease;
+
+  &:hover {
+    background-color: @navigatorHover;
+  }
+
+  &.active {
+    border-color: @darkGrey;
+    background: #fff;
+  }
+}
+
+.navigator-filter-disabled {
+  display: none;
+}
+
+.navigator-filter-optional {
+  padding-right: 0;
+}
+
+.navigator-filter-inline,
+.navigator-filter-read-only,
+.navigator-filter-inactive {
+  cursor: default;
+
+  &:hover,
+  &.active {
+    border-color: transparent;
+    background: transparent;
+  }
+}
+
+.navigator-filter-inline .navigator-filter-label:after {
+    content: "";
+}
+
+.navigator-filter-inactive {
+  opacity: 0.5;
+}
+
+.navigator-filter-label {
+  display: inline-block;
+  vertical-align: middle;
+  margin-right: 5px;
+  color: #333;
+  font-size: @baseFontSize;
+
+  &:after { content: ":"; }
+}
+
+.navigator-filter-value {
+  display: inline-block;
+  vertical-align: middle;
+  max-width: 120px;
+  color: #333;
+  font-size: @baseFontSize;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+
+  &.default {
+    color: #666;
+  }
+}
+
+.navigator-filter-disable {
+  display: inline-block;
+  vertical-align: middle;
+  .square(20px);
+  line-height: 20px;
+  margin: 0 0 0 5px;
+  font-size: 18px;
+  text-align: center;
+  transition: background 0.3s ease;
+
+  &:hover {
+    background-color: darken(@navigatorHover, 7%);
+  }
+}
+
+.navigator-filter-range-input {
+  width: 120px;
+}
+
+.navigator-filter-details {
+  display: none;
+  position: absolute;
+  z-index: 1200;
+  min-width: 100px;
+  border: 1px solid @darkGrey;
+  background: #fff;
+  box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.5);
+  font-size: @baseFontSize;
+  transition: opacity 0.3s ease;
+
+  &.active {
+    display: block;
+  }
+}
+
+.navigator-filter-details-inner {
+  max-width: 300px;
+  padding: 5px @navigatorFilterPadding;
+
+  .select2-container,
+  input {
+    margin: 5px 0;
+    vertical-align: middle;
+  }
+}
+
+.navigator-filter-select-list {
+  min-width: 150px;
+  max-width: 300px;
+  max-height: 182px;
+  padding: 5px 0;
+  overflow-y: auto;
+  .webkit-scrollbar;
+
+  label {
+    display: block;
+    padding: 5px @navigatorFilterPadding;
+    transition: background 0.3s ease;
+    cursor: pointer;
+    white-space: nowrap;
+    overflow: hidden;
+
+    &:hover,
+    &.current {
+      background-color: darken(#fff, 7%);
+    }
+
+    & > input[type=checkbox] {
+      vertical-align: baseline;
+      cursor: pointer;
+    }
+
+    & > img {
+      vertical-align: text-bottom;
+    }
+
+    & > span {
+      display: inline-block;
+      vertical-align: top;
+      width: 86%;
+      white-space: nowrap;
+      overflow: hidden;
+      text-overflow: ellipsis;
+    }
+
+    &.special {
+      font-style: italic;
+
+      & > span {
+        text-decoration: underline;
+      }
+    }
+
+    &.inactive {
+      cursor: default;
+      opacity: 0.5;
+
+      &:hover {
+        background-color: transparent;
+      }
+    }
+  }
+
+  .single {
+    padding: 5px @navigatorFilterPadding;
+  }
+
+  .line {
+    height: 1px;
+    margin: 5px 0;
+    background: @darkGrey;
+  }
+}
+
+.navigator-filter-select-list:not(.hidden) + .navigator-filter-select-list {
+  margin-top: 5px;
+  border-top: 1px solid @darkGrey;
+}
+
+.navigator-filter-search {
+  position: relative;
+  margin: @navigatorFilterPadding 26px @navigatorFilterPadding @navigatorFilterPadding;
+
+  input {
+    .size(100%, 26px);
+    padding: 0 7px;
+    border: 1px solid @darkGrey;
+    .box-sizing(border-box);
+  }
+
+  .fetching &:after {
+    content: ' ';
+    position: absolute;
+    top: 6px; right: -21px;
+    display: block;
+    .square(16px);
+    background: #fff url(../images/loading.gif) no-repeat center center;
+  }
+}
+
+.navigator-filter-load-more {
+  display: none;
+  height: 26px;
+  line-height: 26px;
+  background-color: @grey;
+  text-align: center;
+  cursor: pointer;
+  transition: background 0.3s ease;
+
+  &:hover {
+    background-color: darken(@grey, 7%);
+  }
+}
+
+.navigator-filter-favorite {
+  position: absolute;
+  top: -100%; left: 0;
+  border-top: none;
+}
+
+.navigator-filter-favorite-toggle {
+  .size(16px, @navigatorFiltersHeight);
+  background: url('../images/navigator/favorite-filters.png') no-repeat center center;
+
+  @media @retina {
+    background-image: url(../images/navigator/favorite-filters@2x.png);
+    background-size: 16px 14px;
+  }
+}
+
+.navigator-filter-more-criteria {
+  font-size: @baseFontSize;
+}
diff --git a/sonar-server/src/main/webapp/less/quality-gates.less b/sonar-server/src/main/webapp/less/quality-gates.less
new file mode 100644 (file)
index 0000000..a0293d5
--- /dev/null
@@ -0,0 +1,110 @@
+@import "variables";
+@import "mixins";
+@import "navigator/config";
+
+@qualityGateSidebarWidth: 230px;
+
+.quality-gates-navigator {
+
+  .navigator-header {
+    left: @qualityGateSidebarWidth;
+    border-color: @navigatorBorderColor;
+
+    .spinner { margin-top: 9px; }
+  }
+
+  .navigator-actions {
+    top: @navigatorTopOffset;
+    height: @navigatorHeaderHeight;
+    width: @qualityGateSidebarWidth;
+    padding: 0 @navigatorPadding;
+    border-color: @navigatorBorderColor;
+    border-bottom-color: @navigatorBarBackground;
+
+    .navigator-header-title {
+      font-size: 13px;
+      font-weight: bold;
+      text-transform: uppercase;
+    }
+  }
+
+  .navigator-results {
+    top: @navigatorTopOffset + @navigatorHeaderHeight;
+    width: @qualityGateSidebarWidth - 1px;
+    border-color: @navigatorBorderColor;
+  }
+
+  .navigator-details {
+    top: @navigatorTopOffset + @navigatorHeaderHeight;
+    left: @qualityGateSidebarWidth;
+    padding: @navigatorPadding;
+  }
+
+}
+
+.quality-gates-page #footer {
+  left: @qualityGateSidebarWidth;
+}
+
+
+.quality-gates-nav {
+  background-color: @navigatorBarBackground;
+
+  .navigator-results-list {
+
+    & > li {
+      border-color: transparent;
+
+      &:hover:not(.active):not(.empty) {
+        background-color: @navigatorBorderLightColor;
+      }
+
+      &.active {
+        border-color: #4B9FD5;
+      }
+
+      &.empty {
+        cursor: default;
+      }
+      
+      .line {
+        padding-top: 2px;
+        padding-bottom: 2px;
+      }
+
+      .subtitle {
+        text-transform: lowercase;
+      }
+    }
+  }
+}
+
+
+.quality-gate-section + .quality-gate-section {
+  margin-top: @navigatorPadding;
+  padding-top: 2 * @navigatorPadding;
+}
+
+.quality-gate-section-empty + .quality-gate-section {
+  border-top: 1px solid @navigatorBorderLightColor;
+}
+
+.quality-gate-section-name {
+  margin-bottom: @navigatorPadding;
+  font-weight: bold;
+  text-transform: uppercase;
+}
+
+
+.quality-gate-introduction {
+  margin-bottom: 2 * @navigatorPadding;
+}
+
+
+.quality-gate-new-condition {
+  margin-bottom: @navigatorPadding;
+}
+
+.quality-gate-condition-actions {
+  position: relative;
+}
diff --git a/sonar-server/src/main/webapp/less/select-list.less b/sonar-server/src/main/webapp/less/select-list.less
new file mode 100644 (file)
index 0000000..90f9d64
--- /dev/null
@@ -0,0 +1,189 @@
+.select-list-container {
+  min-width: 500px;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+
+.select-list-control {
+  margin-bottom: 10px;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+
+.select-list-list-container {
+  border: 1px solid #bfbfbf;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+
+.select-list-list-container.loading .select-list-list {
+  display: none;
+}
+
+.select-list-list-container-readonly {
+  border: none;
+}
+
+.select-list-list-container-readonly .select-list-list {
+  overflow: visible;
+}
+
+.select-list-list-container-readonly .select-list-list > li {
+  border: none;
+}
+
+.select-list-list {
+  overflow-x: hidden;
+}
+
+  .select-list-list > li {
+    position: relative;
+    display: block;
+    margin-top: -1px;
+    padding: 5px 10px;
+    border-top: 1px solid #e0e0e0;
+    color: #404040;
+    transition: -webkit-transform 0.3s ease;
+    transition: -ms-transform 0.3s ease;
+    transition: transform 0.3s ease;
+  }
+
+  .select-list-list > li.removed {
+    -webkit-transform: translateX(100%);
+       -moz-transform: translateX(100%);
+        -ms-transform: translateX(100%);
+         -o-transform: translateX(100%);
+            transform: translateX(100%);
+  }
+
+  .select-list-list > li.added {
+    -webkit-transform: translateX(-100%);
+       -moz-transform: translateX(-100%);
+        -ms-transform: translateX(-100%);
+         -o-transform: translateX(-100%);
+            transform: translateX(-100%);
+  }
+
+  .select-list-list > li.progress {
+    background: url(../images/loading.gif) no-repeat 10px 5px;
+  }
+
+  .select-list-list > li.progress .select-list-list-checkbox {
+    visibility: hidden;
+  }
+
+  .select-list-list > li.empty-message {
+    padding: 6px 5px;
+    border: 1px solid #ddd;
+    background-color: #efefef;
+  }
+
+
+.select-list-list-checkbox {
+  display: inline-block;
+  vertical-align: middle;
+  margin-right: 10px;
+}
+
+.select-list-list-item {
+  display: inline-block;
+  vertical-align: middle;
+}
+
+.select-list-control {
+  height: 27px;
+}
+
+.select-list-check-control {
+  float: left;
+}
+
+.select-list-check-control.disabled {
+  filter: alpha(opacity=60);
+  opacity: 0.6;
+}
+
+.select-list-check-control.disabled .select-list-control-button {
+  background-color: #fff !important;
+}
+
+.select-list-control-button {
+  position: relative;
+  z-index: 1;
+  display: inline-block;
+  vertical-align: middle;
+  width: 110px;
+  height: 27px;
+  line-height: 25px;
+  box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  border: 1px solid #bfbfbf;
+  text-align: center;
+  cursor: pointer;
+  transition: background-color 0.2s ease;
+}
+
+.select-list-control-button:hover {
+  background-color: #f6f6f6;
+}
+
+.select-list-control-button:active,
+.select-list-control-button.active {
+  z-index: 2;
+  background-color: #efefef;
+}
+
+.select-list-control-button + .select-list-control-button {
+  margin-left: -1px;
+}
+
+
+.select-list-search-control {
+  position: relative;
+  float: right;
+  height: 27px;
+}
+
+.select-list-search-control input {
+  width: 170px;
+  height: 100%;
+  line-height: 27px\9;
+  padding: 0 40px 0 10px;
+  border: 1px solid #bfbfbf;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  transition: all 0.3s ease;
+}
+
+.select-list-search-control input:focus {
+  outline: none;
+  box-shadow: none;
+}
+
+.select-list-search-control input::-ms-clear {
+  display: none;
+}
+
+.select-list-search-control-clear {
+  position: absolute;
+  top: 2px;
+  right: 2px;
+  width: 23px;
+  height: 23px;
+  line-height: 24px;
+  background-color: #e0e0e0;
+  color: #fff;
+  cursor: pointer;
+  font-size: 18px;
+  text-align: center;
+  transition: all 0.3s ease;
+}
+
+  .select-list-search-control.disabled .select-list-search-control-clear {
+    filter: alpha(opacity=0);
+    opacity: 0;
+  }
+
+  .select-list-search-control-clear:hover {
+    background-color: #d6d6d6;
+  }
diff --git a/sonar-server/src/main/webapp/less/select2-sonar.less b/sonar-server/src/main/webapp/less/select2-sonar.less
new file mode 100644 (file)
index 0000000..fed9289
--- /dev/null
@@ -0,0 +1,183 @@
+@import "mixins";
+@import "variables";
+
+@imagesPath: '../images/select2.png';
+@imagesPath2x: '../images/select2x2.png';
+@spinnerPath: '../images/spinner.gif';
+
+.select2-container {
+  vertical-align: middle;
+}
+
+.select2-container .select2-choice {
+  height: 20px;
+  line-height: 20px;
+  border-color: @darkGrey;
+  border-radius: 0;
+  background: #fff;
+  text-align: left;
+}
+
+.select2-container .select2-choice,
+.select2-container .select2-choices {
+  .trans(border-color);
+}
+
+.select2-container .select2-choice abbr {
+  top: 4px;
+}
+
+.select2-container .select2-choice div {
+  width: 19px;
+  border: none;
+  border-radius: 0;
+  background: #fff;
+}
+
+.select2-container .select2-choice div b {
+  top: 4px;
+  background-position: 1px -1px;
+}
+
+.select2-dropdown-open .select2-choice div b {
+  background-position: -17px -1px;
+}
+
+
+.select2-container-active .select2-choice,
+.select2-container-active .select2-choices {
+  border-color: @highlighted;
+  box-shadow: none;
+}
+
+.select2-dropdown-open .select2-choice {
+  box-shadow: none;
+}
+
+.select2-drop {
+  border-color: @darkGrey;
+  border-radius: 0;
+}
+
+.select2-drop-active {
+  border-color: @highlighted;
+}
+
+.select2-dropdown-open.select2-drop-above .select2-choice,
+.select2-dropdown-open.select2-drop-above .select2-choices {
+  border-color: @highlighted;
+  border-radius: 0;
+  background: #fff;
+}
+
+.select2-drop.select2-drop-above.select2-drop-active {
+  border-color: @highlighted;
+  border-radius: 0;
+}
+
+.select2-drop.select2-drop-above .select2-search input {
+  margin-top: 0;
+}
+
+.select2-results {
+  margin: 0;
+  padding: 5px 0;
+  border-top: 1px solid @darkGrey;
+}
+
+.select2-results .select2-result-label {
+  height: 20px;
+  line-height: 20px;
+  padding: 0 8px;
+  color: @baseFontColor;
+
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.select2-results .select2-no-results,
+.select2-results .select2-searching,
+.select2-results .select2-selection-limit,
+.select2-more-results.select2-active {
+  height: 20px;
+  line-height: 20px;
+  padding: 0 10px;
+}
+
+.select2-results .select2-highlighted {
+  background: transparent;
+  color: @baseFontColor;
+}
+
+.select2-results .select2-highlighted .select2-result-label {
+  background: darken(@grey, 5%);
+}
+
+.select2-search {
+  padding: 4px;
+}
+
+.select2-search input {
+  height: 20px;
+  padding: 0 7px;
+  border-color: @darkGrey;
+  background: #fff !important;
+}
+
+.select2-container-multi .select2-choices {
+  min-height: 19px;
+  padding-bottom: 1px;
+  border-color: @darkGrey;
+  background: #fff;
+}
+
+.select2-container-multi.select2-container-active .select2-choices {
+  border-color: @highlighted;
+  box-shadow: none;
+}
+
+.select2-container-multi .select2-choices .select2-search-field input {
+  height: 16px;
+  padding: 0 3px;
+}
+
+.select2-container-multi .select2-choices .select2-search-choice {
+  margin: 1px 1px 0 1px;
+  padding: 1px 5px 2px 18px;
+  border-radius: 0;
+  border-color: @darkGrey;
+  background: @grey;
+  box-shadow: none;
+}
+
+.select2-search-choice-close {
+  top: 2px;
+}
+
+.select2-search-choice-close,
+.select2-container .select2-choice abbr,
+.select2-container .select2-choice div b {
+  background-image: url(@imagesPath);
+}
+
+.select2-search input.select2-active,
+.select2-more-results.select2-active,
+.select2-container-multi .select2-choices .select2-search-field input.select2-active {
+  background-image: url(@spinnerPath);
+}
+
+@media @retina {
+  .select2-search-choice-close,
+  .select2-container .select2-choice abbr,
+  .select2-container .select2-choice div b {
+    background-image: url(@imagesPath2x) !important;
+  }
+}
+
+
+
+
+
+
+
diff --git a/sonar-server/src/main/webapp/less/select2.less b/sonar-server/src/main/webapp/less/select2.less
new file mode 100755 (executable)
index 0000000..aae6c48
--- /dev/null
@@ -0,0 +1,536 @@
+/*
+Version: 3.2 Timestamp: Mon Sep 10 10:38:04 PDT 2012
+*/
+.select2-container {
+  position: relative;
+  display: inline-block;
+  /* inline-block for ie7 */
+  zoom: 1;
+  *display: inline;
+  vertical-align: top;
+}
+
+.select2-container,
+.select2-drop,
+.select2-search,
+.select2-search input {
+  /*
+    Force border-box so that % widths fit the parent
+    container without overlap because of margin/padding.
+
+    More Info : http://www.quirksmode.org/css/box.html
+  */
+  -moz-box-sizing: border-box; /* firefox */
+  -ms-box-sizing: border-box; /* ie */
+  -webkit-box-sizing: border-box; /* webkit */
+  -khtml-box-sizing: border-box; /* konqueror */
+  box-sizing: border-box; /* css3 */
+}
+
+.select2-container .select2-choice {
+  background-color: #fff;
+  background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white));
+  background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%);
+  background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%);
+  background-image: -o-linear-gradient(bottom, #eeeeee 0%, #ffffff 50%);
+  background-image: -ms-linear-gradient(top, #eeeeee 0%, #ffffff 50%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
+  background-image: linear-gradient(top, #eeeeee 0%, #ffffff 50%);
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -moz-background-clip: padding;
+  -webkit-background-clip: padding-box;
+  background-clip: padding-box;
+  border: 1px solid #aaa;
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  position: relative;
+  height: 26px;
+  line-height: 26px;
+  padding: 0 0 0 8px;
+  color: #444;
+  text-decoration: none;
+}
+
+.select2-container.select2-drop-above .select2-choice {
+  border-bottom-color: #aaa;
+  -webkit-border-radius: 0px 0px 4px 4px;
+  -moz-border-radius: 0px 0px 4px 4px;
+  border-radius: 0px 0px 4px 4px;
+  background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.9, white));
+  background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 90%);
+  background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 90%);
+  background-image: -o-linear-gradient(bottom, #eeeeee 0%, white 90%);
+  background-image: -ms-linear-gradient(top, #eeeeee 0%, #ffffff 90%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
+  background-image: linear-gradient(top, #eeeeee 0%, #ffffff 90%);
+}
+
+.select2-container .select2-choice span {
+  margin-right: 26px;
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  -o-text-overflow: ellipsis;
+  -ms-text-overflow: ellipsis;
+  text-overflow: ellipsis;
+}
+
+.select2-container .select2-choice abbr {
+  display: block;
+  position: absolute;
+  right: 26px;
+  top: 8px;
+  width: 12px;
+  height: 12px;
+  font-size: 1px;
+  background: url('select2.png') right top no-repeat;
+  cursor: pointer;
+  text-decoration: none;
+  border: 0;
+  outline: 0;
+}
+
+.select2-container .select2-choice abbr:hover {
+  background-position: right -11px;
+  cursor: pointer;
+}
+
+.select2-drop {
+  background: #fff;
+  color: #000;
+  border: 1px solid #aaa;
+  border-top: 0;
+  position: absolute;
+  top: 100%;
+  -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
+  -moz-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
+  -o-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
+  box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
+  z-index: 9999;
+  width: 100%;
+  margin-top: -1px;
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius: 0 0 4px 4px;
+  border-radius: 0 0 4px 4px;
+}
+
+.select2-drop.select2-drop-above {
+  -webkit-border-radius: 4px 4px 0px 0px;
+  -moz-border-radius: 4px 4px 0px 0px;
+  border-radius: 4px 4px 0px 0px;
+  margin-top: 1px;
+  border-top: 1px solid #aaa;
+  border-bottom: 0;
+  -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
+  -moz-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
+  -o-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
+  box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
+}
+
+.select2-container .select2-choice div {
+  -webkit-border-radius: 0 4px 4px 0;
+  -moz-border-radius: 0 4px 4px 0;
+  border-radius: 0 4px 4px 0;
+  -moz-background-clip: padding;
+  -webkit-background-clip: padding-box;
+  background-clip: padding-box;
+  background: #ccc;
+  background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
+  background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
+  background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
+  background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%);
+  background-image: -ms-linear-gradient(top, #cccccc 0%, #eeeeee 60%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#eeeeee', GradientType=0);
+  background-image: linear-gradient(top, #cccccc 0%, #eeeeee 60%);
+  border-left: 1px solid #aaa;
+  position: absolute;
+  right: 0;
+  top: 0;
+  display: block;
+  height: 100%;
+  width: 18px;
+}
+
+.select2-container .select2-choice div b {
+  background: url('select2.png') no-repeat 0 1px;
+  display: block;
+  width: 100%;
+  height: 100%;
+}
+
+.select2-search {
+  display: inline-block;
+  white-space: nowrap;
+  z-index: 10000;
+  min-height: 26px;
+  width: 100%;
+  margin: 0;
+  padding-left: 4px;
+  padding-right: 4px;
+}
+
+.select2-search-hidden {
+  display: block;
+  position: absolute;
+  left: -10000px;
+}
+
+.select2-search input {
+  background: #fff url('select2.png') no-repeat 100% -22px;
+  background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
+  background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
+  background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
+  background: url('select2.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
+  background: url('select2.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);
+  background: url('select2.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%, #eeeeee 99%);
+  padding: 4px 20px 4px 5px;
+  outline: 0;
+  border: 1px solid #aaa;
+  font-family: sans-serif;
+  font-size: 1em;
+  width: 100%;
+  margin: 0;
+  height: auto !important;
+  min-height: 26px;
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+  border-radius: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+}
+
+.select2-drop.select2-drop-above .select2-search input {
+  margin-top: 4px;
+}
+
+.select2-search input.select2-active {
+  background: #fff url('spinner.gif') no-repeat 100%;
+  background: url('spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
+  background: url('spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
+  background: url('spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
+  background: url('spinner.gif') no-repeat 100%, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
+  background: url('spinner.gif') no-repeat 100%, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);
+  background: url('spinner.gif') no-repeat 100%, linear-gradient(top, #ffffff 85%, #eeeeee 99%);
+}
+
+.select2-container-active .select2-choice,
+.select2-container-active .select2-choices {
+  -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+  -moz-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+  -o-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+  box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+  border: 1px solid #5897fb;
+  outline: none;
+}
+
+.select2-dropdown-open .select2-choice {
+  border: 1px solid #aaa;
+  border-bottom-color: transparent;
+  -webkit-box-shadow: 0 1px 0 #fff inset;
+  -moz-box-shadow: 0 1px 0 #fff inset;
+  -o-box-shadow: 0 1px 0 #fff inset;
+  box-shadow: 0 1px 0 #fff inset;
+  background-color: #eee;
+  background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee));
+  background-image: -webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%);
+  background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%);
+  background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%);
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #eeeeee 50%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
+  background-image: linear-gradient(top, #ffffff 0%, #eeeeee 50%);
+  -webkit-border-bottom-left-radius: 0;
+  -webkit-border-bottom-right-radius: 0;
+  -moz-border-radius-bottomleft: 0;
+  -moz-border-radius-bottomright: 0;
+  border-bottom-left-radius: 0;
+  border-bottom-right-radius: 0;
+}
+
+.select2-dropdown-open .select2-choice div {
+  background: transparent;
+  border-left: none;
+}
+
+.select2-dropdown-open .select2-choice div b {
+  background-position: -18px 1px;
+}
+
+/* results */
+.select2-results {
+  margin: 4px 4px 4px 0;
+  padding: 0 0 0 4px;
+  position: relative;
+  overflow-x: hidden;
+  overflow-y: auto;
+  max-height: 200px;
+}
+
+.select2-results ul.select2-result-sub {
+  margin: 0 0 0 0;
+}
+
+.select2-results ul.select2-result-sub > li .select2-result-label { padding-left: 20px }
+
+.select2-results ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 40px }
+
+.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 60px }
+
+.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 80px }
+
+.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 100px }
+
+.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 110px }
+
+.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 120px }
+
+.select2-results li {
+  list-style: none;
+  display: list-item;
+}
+
+.select2-results li.select2-result-with-children > .select2-result-label {
+  font-weight: bold;
+}
+
+.select2-results .select2-result-label {
+  padding: 3px 7px 4px;
+  margin: 0;
+  cursor: pointer;
+}
+
+.select2-results .select2-highlighted {
+  background: #3875d7;
+  color: #fff;
+}
+
+.select2-results li em {
+  background: #feffde;
+  font-style: normal;
+}
+
+.select2-results .select2-highlighted em {
+  background: transparent;
+}
+
+.select2-results .select2-no-results,
+.select2-results .select2-searching,
+.select2-results .select2-selection-limit {
+  background: #f4f4f4;
+  display: list-item;
+}
+
+/*
+disabled look for already selected choices in the results dropdown
+.select2-results .select2-disabled.select2-highlighted {
+    color: #666;
+    background: #f4f4f4;
+    display: list-item;
+    cursor: default;
+}
+.select2-results .select2-disabled {
+  background: #f4f4f4;
+  display: list-item;
+  cursor: default;
+}
+*/
+.select2-results .select2-disabled {
+  display: none;
+}
+
+.select2-more-results.select2-active {
+  background: #f4f4f4 url('spinner.gif') no-repeat 100%;
+}
+
+.select2-more-results {
+  background: #f4f4f4;
+  display: list-item;
+}
+
+/* disabled styles */
+
+.select2-container.select2-container-disabled .select2-choice {
+  background-color: #f4f4f4;
+  background-image: none;
+  border: 1px solid #ddd;
+  cursor: default;
+}
+
+.select2-container.select2-container-disabled .select2-choice div {
+  background-color: #f4f4f4;
+  background-image: none;
+  border-left: 0;
+}
+
+/* multiselect */
+
+.select2-container-multi .select2-choices {
+  background-color: #fff;
+  background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  border: 1px solid #aaa;
+  margin: 0;
+  padding: 0;
+  cursor: text;
+  overflow: hidden;
+  height: auto !important;
+  height: 1%;
+  position: relative;
+}
+
+.select2-container-multi .select2-choices {
+  min-height: 26px;
+}
+
+.select2-container-multi.select2-container-active .select2-choices {
+  -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+  -moz-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+  -o-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+  box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+  border: 1px solid #5897fb;
+  outline: none;
+}
+
+.select2-container-multi .select2-choices li {
+  float: left;
+  list-style: none;
+}
+
+.select2-container-multi .select2-choices .select2-search-field {
+  white-space: nowrap;
+  margin: 0;
+  padding: 0;
+}
+
+.select2-container-multi .select2-choices .select2-search-field input {
+  color: #666;
+  background: transparent !important;
+  font-family: sans-serif;
+  font-size: 100%;
+  height: 15px;
+  padding: 5px;
+  margin: 1px 0;
+  outline: 0;
+  border: 0;
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  -o-box-shadow: none;
+  box-shadow: none;
+}
+
+.select2-container-multi .select2-choices .select2-search-field input.select2-active {
+  background: #fff url('spinner.gif') no-repeat 100% !important;
+}
+
+.select2-default {
+  color: #999 !important;
+}
+
+.select2-container-multi .select2-choices .select2-search-choice {
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+  -moz-background-clip: padding;
+  -webkit-background-clip: padding-box;
+  background-clip: padding-box;
+  background-color: #e4e4e4;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0);
+  background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+  background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
+  box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
+  color: #333;
+  border: 1px solid #aaaaaa;
+  line-height: 13px;
+  padding: 3px 5px 3px 18px;
+  margin: 3px 0 3px 5px;
+  position: relative;
+  cursor: default;
+}
+
+.select2-container-multi .select2-choices .select2-search-choice span {
+  cursor: default;
+}
+
+.select2-container-multi .select2-choices .select2-search-choice-focus {
+  background: #d4d4d4;
+}
+
+.select2-search-choice-close {
+  display: block;
+  position: absolute;
+  right: 3px;
+  top: 4px;
+  width: 12px;
+  height: 13px;
+  font-size: 1px;
+  background: url('select2.png') right top no-repeat;
+  outline: none;
+}
+
+.select2-container-multi .select2-search-choice-close {
+  left: 3px;
+}
+
+.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
+  background-position: right -11px;
+}
+
+.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
+  background-position: right -11px;
+}
+
+/* disabled styles */
+
+.select2-container-multi.select2-container-disabled .select2-choices {
+  background-color: #f4f4f4;
+  background-image: none;
+  border: 1px solid #ddd;
+  cursor: default;
+}
+
+.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
+  background-image: none;
+  background-color: #f4f4f4;
+  border: 1px solid #ddd;
+  padding: 3px 5px 3px 5px;
+}
+
+.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close {
+  display: none;
+}
+
+/* end multiselect */
+
+.select2-result-selectable .select2-match,
+.select2-result-unselectable .select2-result-selectable .select2-match { text-decoration: underline; }
+
+.select2-result-unselectable .select2-match { text-decoration: none; }
+
+.select2-offscreen { position: absolute; left: -10000px; }
+
+/* Retina-ize icons */
+
+@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
+  .select2-search input, .select2-search-choice-close, .select2-container .select2-choice abbr, .select2-container .select2-choice div b {
+    background-image: url(select2x2.png) !important;
+    background-repeat: no-repeat !important;
+    background-size: 60px 40px !important;
+  }
+
+  .select2-search input {
+    background-position: 100% -21px !important;
+  }
+}
diff --git a/sonar-server/src/main/webapp/less/style.less b/sonar-server/src/main/webapp/less/style.less
new file mode 100644 (file)
index 0000000..925cf67
--- /dev/null
@@ -0,0 +1,2740 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+/* CSS optimized by http://www.cleancss.com */
+
+/* ------------------- PROJECTS SEARCH FORM ------------------- */
+#projectSearch {
+  color: #444;
+  margin: 4px 0 0 0;
+}
+
+/*
+  FOOTER
+*/
+#ftlinks {
+  background: #fff;
+  color: #262626;
+  text-align: center;
+  border-top: 1px solid #fff;
+  font-size: 85%;
+  padding: 4px 0;
+  margin-top: 10px;
+}
+
+.ie-warn {
+  color: #EEE;
+  background: #FF5252;
+  padding: 0 5px;
+}
+
+.ie-warn a {
+  color: #EEE;
+  text-decoration: underline;
+}
+
+#ftlinks a {
+  color: #444;
+}
+
+/*
+  GENERAL
+*/
+a {
+  cursor: pointer;
+}
+
+.loading {
+  background: url("../images/loading.gif") no-repeat 4px 2px;
+  color: #444;
+  padding: 3px 25px;
+}
+
+.right {
+  text-align: right;
+}
+
+.left {
+  text-align: left;
+}
+
+.center {
+  text-align: center;
+}
+
+.top {
+  vertical-align: top;
+}
+
+.bottom {
+  vertical-align: bottom;
+}
+
+.middle {
+  vertical-align: middle;
+}
+
+.nowrap {
+  white-space: nowrap;
+}
+
+code {
+  font-size: 93%;
+}
+
+.hidden {
+  display: none;
+  visibility: hidden;
+}
+
+.clear {
+  height: 0;
+  clear: both;
+}
+
+.note {
+  color: #777;
+  font-size: 93%;
+  font-weight: normal;
+  line-height: 13px;
+}
+
+.note img {
+  vertical-align: bottom;
+}
+
+.crossout {
+  text-decoration: line-through;
+}
+
+.small {
+  font-size: 85%;
+}
+
+input[type].small {
+
+}
+
+small {
+  color: #AAA;
+  font-size: 85%;
+  font-style: normal;
+}
+
+em {
+  font-weight: bold;
+}
+
+em.mandatory {
+  color: #990000;
+  font-style: italic;
+}
+
+a.external {
+  background: url('../images/links/external.png') no-repeat 100% 0;
+  padding: 0 16px 0 0;
+}
+
+.fav {
+  display: inline-block;
+  background: url('../images/star.png') no-repeat 100% 0;
+  width: 16px;
+  height: 16px;
+  vertical-align: text-bottom;
+}
+
+.notfav {
+  display: inline-block;
+  background: url('../images/star_off.png') no-repeat 100% 0;
+  width: 16px;
+  height: 16px;
+  vertical-align: text-bottom;
+}
+
+.red-button {
+  color: #990000 !important;
+}
+
+.red-button:hover {
+  color: #FFFFFF !important;
+  border: solid 1px #CD504A !important;
+  background: #B33630 !important;
+  background: -webkit-gradient(linear, left top, left bottom, from(#DC5F59), to(#B33630)) !important;
+  background: -moz-linear-gradient(top, #DC5F59, #B33630) !important;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#DC5F59', endColorstr = '#B33630') !important;
+}
+
+.red-button:active {
+  color: #FFFFFF !important;
+  border: solid 1px #CD504A !important;
+  background: #B33630 !important;
+  background: -webkit-gradient(linear, left top, left bottom, from(#AC2F29), to(#D35650)) !important;
+  background: -moz-linear-gradient(top, #AC2F29, #D35650) !important;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#AC2F29', endColorstr = '#D35650') !important;
+}
+
+.red-button[disabled] {
+  position: relative;
+  top: 0;
+  text-shadow: 1px 1px 0 #FFFFFF;
+  color: #BBBBBB;
+  border: solid 1px #DDD;
+  background: #EBEBEB;
+  background: -webkit-gradient(linear, left top, left bottom, from(#FFFFFF), to(#E1E1E1));
+  background: -moz-linear-gradient(top, #FFFFFF, #E1E1E1);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#FFFFFF', endColorstr = '#E1E1E1');
+  cursor: default;
+}
+
+/* ------------------- PAGE ------------------- */
+h1, .h1 {
+  color: #444;
+  font-size: 16px;
+}
+
+h1 a {
+  color: #444;
+  text-decoration: none;
+  border-bottom: 1px dotted #2B547D;
+}
+
+h2, .h2 {
+  color: #2B547D;
+  font-size: 16px;
+  font-weight: normal;
+}
+
+h2 a {
+  color: #2B547D;
+  text-decoration: none;
+  border-bottom: 1px dotted #2B547D;
+}
+
+h3, .h3 {
+  font-size: 100%;
+  font-weight: bold;
+}
+
+h4, .h4 {
+  font-size: 85%;
+  color: #777;
+}
+
+h1 img, .h1 img, h2 img, .h2 img, h3 img, .h3 img, h4 img, .h4 img {
+  vertical-align: middle;
+}
+
+.subtitle {
+  color: #777;
+  font-size: 85%;
+  margin: 0;
+  padding: 0;
+}
+
+.notes {
+  color: #777;
+  font-size: 11px;
+  margin-bottom: 10px;
+  background-color: #EFEFEF;
+  border: 1px solid #cdcdcd;
+  line-height: 16px;
+  height: 16px;
+  padding: 2px 4px;
+}
+
+.treemap {
+  position: relative;
+  cursor: pointer;
+}
+
+.treemap a {
+  color: #FFF;
+  text-decoration: none;
+  font-size: 12px;
+  padding: 1px;
+}
+.treemap a:hover {
+  text-decoration: underline;
+}
+
+/* ------------------- MESSAGES ------------------- */
+.warning {
+  border: solid 1px #FFD324;
+  background-color: #FFF6BF;
+  color: #514721;
+  margin: 0 0 4px;
+  padding: 4px;
+}
+
+.error {
+  border: 1px solid red;
+  background-color: #FF5252;
+  color: #eee;
+  margin: 0 0 4px;
+  padding: 4px;
+}
+
+.error a {
+  color: #eee;
+}
+
+.notice {
+  border: 1px solid #9c9;
+  background-color: #e2f9e3;
+  color: #060;
+  margin: 0 0 4px;
+  padding: 4px;
+}
+
+.info {
+  background-color: #CAE3F2;
+  padding: 5px;
+  border: 1px solid #4B9FD5;
+}
+
+/* ------------------- SETUP / MIGRATION PAGES ------------------- */
+.migration {
+  background-image: url("../images/sonarqube-24x100.png");
+  background-repeat: no-repeat;
+  background-position: top right;
+}
+
+/* ------------------- LOGIN FORM ------------------- */
+#login_form {
+  border: 2px solid #4b9fd5;
+  width: 230px;
+  text-align: left;
+  background-color: #CAE3F2;
+  padding: 15px 20px;
+}
+
+#login_form h4 {
+  text-align: left;
+  font-weight: bold;
+  color: #036;
+}
+
+#login_form p {
+  padding: 3px 0 10px;
+}
+
+#login_form .desc {
+  font-size: 85%;
+  font-weight: normal;
+}
+
+/* ------------------- DOCUMENTATION --------------------- */
+.doc h2 {
+  margin-top: 8px;
+}
+
+.doc p {
+  margin: 8px 0;
+}
+
+.doc pre, pre.code {
+  color: #777;
+  background-color: #EFEFEF;
+  padding: 10px;
+  margin: 10px 0;
+  border: 1px dashed #777;
+  font-size: 93%;
+  line-height: 1.5em;
+}
+
+.doc li {
+  list-style: disc outside;
+  padding: 2px;
+}
+
+.doc ul {
+  list-style: none outside;
+  padding-left: 30px;
+}
+
+/* ------------------- TABLES ------------------- */
+.odd {
+  background-color: #fff;
+}
+
+.odd.selected, .even.selected, .odd.selected a, .even.selected a, .even.selected span, .odd.selected span {
+  background-color: #4b9fd5;
+  color: #fff;
+}
+
+table.data > thead > tr > th {
+  font-size: 93%;
+  padding: 4px 7px 4px 3px;
+  font-weight: bold;
+  vertical-align: top;
+}
+
+table.data > tfoot > tr > td {
+  font-size: 93%;
+  color: #777;
+  padding: 5px;
+}
+
+table.data > tbody > tr > td {
+  padding: 5px;
+  vertical-align: text-top;
+}
+
+table.data td.small, table.data th.small {
+  padding: 0;
+  white-space: nowrap;
+}
+
+table.data th img, table.data td img {
+  vertical-align: sub;
+}
+
+table.data.zebra tbody tr:nth-child(odd) {
+  background-color: #EFEFEF;
+}
+
+.data thead tr.total {
+  background-color: #EFEFEF;
+  font-weight: normal;
+  border: 1px solid #DDD;
+}
+
+.data thead tr.total th {
+  font-weight: normal;
+}
+
+.data thead tr.blank {
+  background-color: #fff;
+  line-height: 15px;
+}
+
+.data tr.highlight {
+  background-color: #CAE3F2;
+  border-top: 1px solid #4B9FD5;
+  border-bottom: 1px solid #4B9FD5;
+}
+
+.data input, .data select, .data button {
+  vertical-align: baseline;
+}
+
+.data td.category {
+  padding-right: 15px;
+}
+
+.categoryDescription {
+  padding: 10px 5px;
+}
+
+.data td.category.withSubcategories {
+  background-image: url('../images/bullet_arrow_down.gif');
+  background-position: right center;
+  background-repeat: no-repeat;
+}
+
+.data td.subcategory {
+  padding-left: 20px;
+}
+
+.hoverable:hover {
+  background-color: #CAE3F2;
+}
+
+.hoverable:hover a {
+  color: #111;
+}
+
+table.sortable .sortcol {
+  cursor: pointer;
+  padding-left: 15px;
+  background-repeat: no-repeat;
+  background-position: right center;
+  text-decoration: underline;
+}
+
+table.sortable .sortasc {
+  background-image: url('../images/bullet_arrow_up.gif');
+  background-position: left center;
+}
+
+table.sortable .sortdesc {
+  background-image: url('../images/bullet_arrow_down.gif');
+  background-position: left center;
+}
+
+table.sortable .righticon {
+  padding-right: 15px;
+  background-position: right center;
+}
+
+table.sortable .nosort {
+  cursor: default;
+}
+
+table.spaced th {
+  font-weight: bold;
+  color: #333;
+  padding: 4px 5px;
+}
+
+table.spaced td, table.matrix tfoot td {
+  padding: 3px 5px;
+  line-height: 18px;
+}
+
+table.spaced td img {
+  vertical-align: text-bottom;
+}
+
+table.spacedicon th {
+  font-weight: bold;
+  color: #333;
+  padding: 4px 5px;
+}
+
+table.spacedicon td {
+  padding: 0 5px;
+  height: 24px;
+}
+
+.thin {
+  width: 1%;
+}
+
+td.sep {
+  width: 10px;
+}
+
+.spacer {
+  width: 5px;
+  display: inline-block;
+}
+
+.formError {
+  display: inline-block;
+  background-color: #FF9090;
+  color: #000;
+  padding: 0 5px;
+}
+
+table.form td {
+  padding: 2px 5px;
+  vertical-align: top;
+}
+
+table.form td.keyCell {
+  width: 1%;
+  white-space: nowrap;
+  text-align: right;
+  font-weight: bold;
+  vertical-align: top;
+}
+
+table.form td img {
+  vertical-align: bottom;
+}
+
+.admin hr {
+  background: transparent;
+  border-left: none;
+  border-right: none;
+  border-top: none;
+  border-bottom: 1px dashed #FFD324;
+  height: 1px;
+}
+
+table#project-history > tbody > tr > td {
+  vertical-align: top;
+}
+
+/* OPERATIONS */
+#page-operations {
+  display: inline-block;
+  width: 100%;
+}
+
+div.operations {
+  float: right;
+  margin: 0;
+}
+
+ul.operations {
+  float: right;
+  height: 20px;
+  line-height: 20px;
+  list-style-type: none;
+  margin: 0;
+  background-color: #EFEFEF;
+  border: 1px solid #cdcdcd;
+  border-radius: 3px;
+  -moz-border-radius: 3px;
+  -webkit-border-radius: 3px;
+}
+
+ul.operations li {
+  float: left;
+  margin: 0;
+  padding: 0 8px;
+  font-size: 85%;
+  border-right: 1px solid #cdcdcd;
+}
+
+ul.operations li.selected {
+  background-color: #d4d4d4;
+}
+
+ul.operations li.last {
+  border-right-width: 0;
+}
+
+ul.operations li a {
+  color: #555;
+}
+
+ul.operations li img {
+  vertical-align: middle;
+  margin-right: 5px;
+}
+
+th.operations, td.operations {
+  text-align: right;
+}
+
+/* RESOURCE VIEWER */
+.resourceName h1 {
+  margin: 5px 0;
+}
+
+/* SOURCE */
+.sources2 {
+  width: 100%;
+  border: 0;
+  margin: 0;
+  background-color: #FFF;
+}
+
+.sources2 td.lid {
+  background-color: #EFEFEF;
+  border-right: 1px solid #DDDDDD;
+  text-align: right;
+  padding: 2px 0.5em 0 0.5em;
+  vertical-align: top;
+  font-size: 85%;
+}
+
+.sources2 td.lid a {
+  text-decoration: none;
+  color: #AAA;
+}
+
+.sources2 td.scm {
+  border-right: 1px solid #DDD;
+  background-color: #EFEFEF;
+}
+
+.sources2 td.revision {
+  border-top: 1px solid #DDD;
+  vertical-align: top;
+  padding: 0 0.3em;
+  white-space: nowrap;
+}
+
+.sources2 tr:first-child td.revision {
+  border-top: none;
+}
+
+.sources2 tr.row td.plus {
+  background-color: #EFEFEF;
+  padding: 0;
+  width: 16px;
+}
+
+.sources2 tr.row:hover td.plus {
+  background: url("../images/add.png") no-repeat scroll left 0 #EFEFEF;
+}
+
+.sources2 td.plus a {
+  display: block;
+  cursor: pointer;
+  height: 16px;
+  width: 16px;
+}
+
+.sources2 td.gray {
+  background-color: #EFEFEF;
+  padding: 2px 0.5em 0;
+}
+
+.sources2 td.white {
+  border-left: 1px solid #DDD;
+  background-color: #FFF;
+}
+
+.sources2 span.date, .sources2 span.date a {
+  color: #AAA;
+  font-size: 85%;
+  text-decoration: none;
+}
+
+.sources2 span.author, .sources2 span.author a {
+  font-size: 85%;
+}
+
+.sources2 div.violation, #global_violations div.violation {
+  background-color: #FFF;
+  margin: 0;
+  border: 1px solid #DDD;
+  font-size: 12px;
+}
+
+.rulename, .rulename a {
+  color: #444;
+  font-weight: bold;
+}
+
+.rulename a:hover {
+  text-decoration: underline;
+}
+
+.sources2 td.line {
+  width: 100%;
+}
+
+.sources2 td.line pre {
+  font-size: 12px;
+  font-family: monospace;
+}
+
+.sources2 td.ind {
+  border-right: 1px solid #DDD;
+  padding: 0 0.3em;
+  text-align: center;
+  vertical-align: middle;
+}
+
+.sources2 td.ind a,.sources2 td.ind span {
+  padding: 0 3px;
+}
+
+.sources2 td.ok {
+  background-color: #ACE97C;
+}
+
+.sources2 td.warn {
+  background-color: #FFF6BF;
+}
+
+.sources2 td.ko {
+  background-color: #FF9090;
+}
+
+.sources2 td.new_section {
+  border-width: 1px 0;
+  border-style: solid;
+  border-color: #EEE #DDD;
+  height: 30px;
+  background: url('../images/gray-stripes.png');
+}
+
+.sources2 td.violations {
+  background-color: #FFF;
+  padding: 10px;
+  border-left: 1px solid #DDD;
+}
+
+.source_title {
+  padding: 10px 5px;
+}
+
+.source_title span.h1 {
+  font-size: 16px;
+  margin-right: 10px;
+}
+
+.source_links {
+  font-size: 11px;
+}
+
+.global_violations {
+  width: 100%;
+}
+
+.global_violations > tbody > tr > td {
+  padding-bottom: 10px;
+}
+
+.global_violations td {
+  padding: 3px 0;
+}
+
+.global_violations td img, #source_title img {
+  vertical-align: text-bottom;
+}
+
+.code-issue-create-form {
+  padding: 10px;
+}
+
+.code-global-issues {
+  padding: 10px 10px 0;
+}
+
+.code-issues {
+  background-color: #FFF;
+  padding: 10px 10px 0;
+  line-height: 0;
+}
+
+.code-issue {
+  background-color: #FFF;
+  margin: 0;
+  font-size: 12px;
+  padding: 0 0 10px 0;
+}
+
+.code-issue strong {
+  font-weight: bold;
+}
+
+.code-issue-toggle {
+  cursor: pointer;
+}
+
+.code-issue-name {
+  position: relative;
+  background-color: #E4ECF3;
+  margin: 0;
+  padding: 5px 10px;
+  line-height: 16px;
+  color: #777;
+  border: 1px solid #DDD;
+  border-bottom: medium none;
+}
+
+.code-issue-msg {
+  line-height: 1.5;
+  padding: 5px 10px;
+  border-left: 1px solid #DDD;
+  border-right: 1px solid #DDD;
+  background-color: #EFEFEF;
+}
+
+.code-issue-name img {
+  vertical-align: text-bottom;
+}
+
+.code-issue-name-rule {
+  max-width: 90%;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.code-issue-permalink {
+  position: absolute;
+  top: 4px; right: 4px;
+}
+
+.code-issue-name-extra {
+  margin-top: 6px;
+  line-height: 12px;
+}
+
+.code-issue-name-extra li {
+  font-size: 11px !important;
+}
+
+.code-issue-name-right {
+  position: absolute;
+  top: 5px; right: 26px;
+}
+
+.code-issue-comment, .code-issue-msg, .code-issue-actions, .code-issue-form {
+  background-color: #EFEFEF;
+  border: 1px solid #DDD;
+  border-top: none;
+  line-height: 1.5em;
+  margin: 0;
+  padding: 5px 10px;
+}
+
+.code-issue-form input[type=submit],
+.code-issue-form input[type=button],
+.code-issue-form button,
+.code-issue-form .action {
+  vertical-align: middle;
+}
+
+.code-issue-comment h4 {
+  font-size: 11px;
+  margin-bottom: 2px;
+}
+
+.code-issue-comment h4 img {
+  vertical-align: sub;
+}
+
+.code-issue-comment li {
+  list-style: square inside;
+}
+
+.code-issue-comment pre {
+  padding: 10px;
+  border: 1px dashed #DDD;
+  color: #444;
+  font-size: 12px;
+}
+
+.code-issue-details {
+  padding: 0 0 5px;
+  border-left: 1px solid #DDD;
+  border-right: 1px solid #DDD;
+  border-bottom: 1px solid #DDD;
+  background-color: #EFEFEF;
+}
+
+.code-issue-details .ui-tabs-panel {
+  padding: 5px 10px 0;
+  line-height: 1.3;
+}
+
+.code-issue-details .tabs {
+  height: auto;
+  padding: 5px 10px;
+  border-bottom: 1px solid #DDD;
+}
+
+.code-issue-details .tabs li + li {
+  margin-left: 10px;
+}
+
+.code-issue-details .tabs li a:link,
+.code-issue-details .tabs li a:visited {
+  float: none;
+  margin: 0;
+  padding: 0;
+}
+
+.code-issue-details-list {
+
+}
+
+.code-issue-details-list > li {
+  font-size: 0;
+}
+
+.code-issue-details-term,
+.code-issue-details-value {
+  display: inline-block;
+  vertical-align: top;
+  font-size: 12px;
+  line-height: 20px;
+}
+
+.code-issue-details-term {
+  width: 90px;
+}
+
+.code-issue-details-term:after {
+  content: ":";
+}
+
+.code-issue-list {
+  font-size: 0;
+  white-space: nowrap;
+  background-color: #E4ECF3;
+}
+
+.code-issue-list > li {
+  display: inline-block;
+  vertical-align: middle;
+  height: 14px;
+  line-height: 14px;
+  padding: 0 8px;
+  border-left: 1px solid #fff;
+  border-right: 1px solid #bfbfbf;
+  font-size: 12px;
+}
+
+.code-issue-list > li:first-child {
+  padding-left: 0;
+  border-left: none;
+}
+
+.code-issue-list > li:last-child {
+  padding-right: 0;
+  border-right: none;
+}
+
+.code-issue-collapsed .code-issue-msg,
+.code-issue-collapsed .code-issue-details {
+  display: none;
+}
+
+.tab_header {
+  border-bottom: 1px solid #DDD;
+  background-color: #EFEFEF;
+  padding: 5px 10px;
+}
+
+.tab_header td {
+  padding-right: 7px;
+}
+
+.tab_header td.name {
+  text-align: left;
+  white-space: nowrap;
+}
+
+.tab_header td.value {
+  text-align: right;
+  white-space: nowrap;
+  font-weight: bold;
+}
+
+.source_options {
+  margin-top: 5px;
+  padding-top: 5px;
+  border-top: 1px solid #ddd;
+  font-size: 85%;
+}
+
+.source_options td {
+  background: url("../images/sep12.png") no-repeat scroll 0 50% transparent;
+  padding: 0 10px;
+}
+
+.source_options td.first {
+  background: none;
+  padding: 0 10px 0 0;
+}
+
+/* DUPLICATIONS */
+
+.duplications {
+  max-width: 100%;
+}
+
+.duplications td.item {
+  text-align: right;
+  vertical-align: top;
+  padding: 0;
+}
+
+.duplications td.item p {
+  padding: 3px 5px;
+}
+
+.duplications td.fileItem {
+  text-align: left;
+  vertical-align: top;
+  padding: 0;
+  white-space: nowrap;
+}
+
+.duplications td.fileItem p {
+  padding: 3px 5px;
+}
+
+.duplications td.item p.selected, .duplications td.fileItem p.selected {
+  background-color: #EFEFEF;
+  border-top: 1px solid #DDD;
+  border-bottom: 1px solid #DDD;
+  padding: 3px 5px;
+}
+
+.duplications td.fileItem p.selected a {
+  text-decoration: none;
+}
+
+.duplications td.sourceItem {
+  padding: 0;
+  background-color: #EFEFEF;
+  border: 1px solid #DDD;
+  border-left: none;
+}
+
+.duplications td.sourceItem p {
+  padding: 3px;
+}
+
+.duplicationsMessage {
+  padding: 10px;
+}
+
+.discussion {
+  width: 100%;
+  border: 1px solid #DDDDDD;
+}
+
+.discussionComment.first {
+  border-top: none;
+}
+
+.discussionComment {
+  background-color: #EFEFEF;
+  border-top: 1px solid #DDDDDD;
+  line-height: 1.5em;
+  margin: 0;
+  padding: 5px 10px;
+}
+
+.discussionComment h4 {
+  font-size: 90%;
+  margin-bottom: 2px;
+}
+
+.discussionComment h4 img {
+  vertical-align: sub;
+}
+
+.discussionComment li {
+  list-style: square inside;
+}
+
+.discussionComment pre {
+  padding: 10px;
+  border: 1px dashed #DDD;
+  color: #444;
+  font-size: 12px;
+}
+
+div.comment-excerpt {
+  background-color: transparent;
+  margin-top: 5px;
+  margin-bottom: 5px;
+  color: #777777;
+  font-size: 90%;
+}
+
+/* ACTION PLANS */
+table.actionPlans {
+  margin-top: 10px;
+}
+
+table.actionPlans td.progress {
+  width: 300px;
+  padding: 0px 40px;
+}
+
+table.actionPlans td.noprogress {
+  color: #777777;
+  font-size: 93%;
+  padding-left: 43px;
+  padding-right: 40px;
+}
+
+table.actionPlans td.over-due {
+  color: #CC0000;
+  font-weight: bold;
+}
+
+div.progress {
+  width: 100%;
+  margin: 4px;
+}
+
+div.progress table {
+  width: 100%;
+}
+
+div.progress td {
+  height: 10px;
+}
+
+div.progress td a {
+  display: block;
+  width: 100%;
+  height: 100%;
+}
+
+div.progress td.resolved {
+  background-color: #078C00;
+}
+
+div.progress td.open {
+  background-color: #CC0000;
+}
+
+div.progress div.note {
+  color: #777;
+  font-size: 93%;
+  font-weight: normal;
+  white-space: nowrap;
+}
+div.note a {
+  color: #777777;
+}
+
+/* SEARCH AUTOCOMPLETE FIELDS */
+#searchInput {
+  color: #444;
+  font-size: 13px;
+  padding-right: 20px;
+}
+
+#searchingResources {
+  position: absolute;
+  top: 8px;
+  right: 18px;
+}
+
+div.autocomplete {
+  position: absolute;
+  width: 600px;
+  right: 10px;
+  top: 10px;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  margin: 0;
+  padding: 0;
+  color: #111;
+  line-height: 18px;
+  box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.5);
+  z-index: 999999;
+}
+
+div.autocomplete ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+
+div.autocomplete ul li {
+  list-style-type: none;
+  display: block;
+  margin: 0;
+  padding: 3px 5px;
+  cursor: pointer;
+  color: #333;
+  line-height: 18px;
+  height: 18px;
+  vertical-align: middle;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+div.autocomplete div.q {
+  font-size: 93%;
+  color: #777;
+  width: 90px;
+  text-align: right;
+  margin-right: 5px;
+  display: inline-block;
+
+  /* For IE 7 */
+  zoom: 1;
+  *display: inline;
+}
+
+div.autocomplete ul li img {
+  vertical-align: middle;
+}
+
+div.autocomplete ul li.selected {
+  background-color: #4b9fd5;
+  color: #fff;
+}
+
+div.autocomplete ul li.selected div.q {
+  color: #fff;
+}
+
+div.autocomplete strong {
+  font-weight: bold;
+}
+
+div.autocompleteNote {
+  color: #777;
+  font-size: 85%;
+  background-color: #EFEFEF;
+  border-top: 1px solid #CCC;
+  padding: 1px 10px;
+}
+
+#gwtpage {
+  width: 100%;
+}
+
+.gwt-SourcePanel {
+  font-size: 12px;
+  background-color: #fff;
+  border-top: 1px solid silver;
+  border-bottom: 1px solid silver;
+  width: 100%;
+}
+
+.gwt-SourcePanel .ln {
+  background-color: #EFEFEF;
+  white-space: nowrap;
+  text-align: right;
+  font-size: 85%;
+  color: #AAAAAA;
+  border-right: 1px solid #DDD;
+  padding: 0 3px;
+  height: 14px;
+}
+
+.gwt-SourcePanel .src {
+  padding: 0 5px;
+  height: 14px;
+}
+
+.gwt-SourcePanel .val {
+  background-color: #EFEFEF;
+  border-right: 1px solid #DDD;
+  text-align: right;
+  color: #777;
+  padding: 0 3px;
+  height: 14px;
+  white-space: nowrap;
+}
+
+.gwt-SourcePanel .red {
+  background-color: #F0C8C8;
+}
+
+.gwt-SourcePanel .orange {
+  background-color: #FFF6BF;
+  color: #514721;
+}
+
+.gwt-SourcePanel .green {
+  background-color: #ACE97C;
+}
+
+.gwt-SourcePanel .msg {
+  font-family: sans-serif;
+  vertical-align: top;
+  padding: 3px 0;
+  height: 1.3em;
+  background-position: 5px 1px;
+  background-repeat: no-repeat;
+}
+
+.gwt-SourcePanel .bigln {
+  font-family: sans-serif;
+  vertical-align: top;
+  padding: 3px 0;
+  height: 1.6em;
+  background-position: 5px 1px;
+  background-repeat: no-repeat;
+  background-color: #EFEFEF;
+}
+
+.gwt-SourcePanel .warn {
+  font-family: sans-serif;
+  vertical-align: top;
+  background-color: #FFFFC9;
+  border: 1px solid #DCDCDC;
+  border-top: none;
+  color: black;
+  line-height: 1.6em;
+  margin: 0;
+  padding: 0 0 2px 5px;
+}
+
+.gwt-SourcePanel .msg.error {
+  background-image: url("../images/exclamation.png");
+}
+
+.gwt-SourcePanel .msg.warning {
+  background-image: url("../images/warning.png");
+}
+
+.gwt-SourcePanel .msg.BLOCKER {
+  padding: 1px 5px 1px 25px;
+  background-image: url("../images/priority/BLOCKER.gif");
+  background-color: #FF5252;
+  color: #eee;
+  border: 1px solid red;
+  margin: 1px 0 1px 5px;
+  height: 100%;
+}
+
+.gwt-SourcePanel .msg.CRITICAL {
+  padding: 1px 5px 1px 25px;
+  background-image: url("../images/priority/CRITICAL.gif");
+  background-color: #FF5252;
+  color: #eee;
+  border: 1px solid red;
+  margin: 1px 0 1px 5px;
+  height: 100%;
+}
+
+.gwt-SourcePanel .msg.MAJOR {
+  padding: 1px 5px 1px 25px;
+  background-image: url("../images/priority/MAJOR.gif");
+  background-color: #FF5252;
+  color: #eee;
+  border: 1px solid red;
+  margin: 1px 0 1px 5px;
+  height: 100%;
+}
+
+.gwt-SourcePanel .msg.MINOR {
+  padding: 1px 5px 1px 25px;
+  background-image: url("../images/priority/MINOR.gif");
+  background-color: #FFF6BF;
+  border: 1px solid #FFD324;
+  margin: 1px 0 1px 5px;
+  height: 100%;
+}
+
+.gwt-SourcePanel .msg.INFO {
+  padding: 1px 5px 1px 25px;
+  background-image: url("../images/priority/INFO.gif");
+  background-color: #FFF6BF;
+  border: 1px solid #FFD324;
+  margin: 1px 0 1px 5px;
+  height: 100%;
+}
+
+.gwt-ViewerHeader {
+  background-color: #EFEFEF;
+  border: 1px solid #DDD;
+  border-top: none;
+  margin-bottom: 8px;
+  color: #333;
+  vertical-align: bottom;
+}
+
+.gwt-ViewerHeader .metric {
+  padding: 8px 2px 5px 10px;
+  font-size: 93%;
+  text-align: right;
+  font-weight: bold;
+}
+
+.gwt-ViewerHeader .value {
+  padding: 8px 15px 5px 2px;
+  font-size: 93%;
+  text-align: left;
+  font-weight: normal;
+}
+
+.gwt-ViewerHeader .cell {
+  padding: 3px 10px;
+}
+
+.gwt-ViewerHeader .big {
+  padding: 4px 10px 2px 10px;
+  font-size: 152%;
+  font-weight: bold;
+}
+
+/* ------------------- DASHBOARD ------------------- */
+.page_title {
+  margin: 0 0 7px 0;
+}
+
+.color_OK {
+  border: 2px solid #85bb43 !important;
+  color: #85bb43 !important;
+}
+
+.color_WARN {
+  border: 2px solid #f90 !important;
+  color: #f90 !important;
+}
+
+.color_ERROR {
+  border: 2px solid #d4333f !important;
+  color: #d4333f !important;
+}
+
+#alerts_widget {
+  margin-bottom: 10px;
+  padding: 5px 5px 5px 10px;
+}
+
+#alerts_widget img {
+  vertical-align: bottom;
+}
+
+span.empty_widget {
+  color: #777777;
+  font-size: 93%;
+}
+
+.dashbox {
+  float: left;
+  vertical-align: top;
+  text-align: left;
+  padding: 0 10px 7px 0;
+}
+
+.big {
+  font-size: 152%;
+  font-weight: bold;
+}
+
+.adminportlet {
+  border: 2px dashed #ccc;
+  margin-bottom: 10px;
+  padding: 10px;
+}
+
+table.header1 {
+  background-color: #EFEFEF;
+  color: #444;
+  border: 1px solid #DDD;
+  margin: 0 0 10px 0;
+  width: 100%;
+}
+
+table.header1 td {
+  padding: 10px 0 10px 10px;
+  text-align: left;
+  vertical-align: top;
+}
+
+.headerLine {
+  background-color: #EFEFEF;
+  color: #444;
+  border: 1px solid #DDD;
+  margin: 0 0 10px 0;
+  line-height: 28px;
+  height: 28px;
+}
+
+ul.headerLine li {
+  float: left;
+  display: block;
+  padding: 0 10px 0;
+  height: 28px;
+  vertical-align: middle;
+}
+
+ul.headerLine li.sep {
+  background: url("../images/sep12.png") no-repeat scroll 50% 50% transparent;
+  padding: 0 5px 0 5px;
+}
+
+ul.headerLine select, ul.headerLine input, ul.headerLine button, ul.headerLine textarea, ul.headerLine span {
+  vertical-align: middle;
+}
+
+select.withIcons option, span.withIcons {
+  background-repeat: no-repeat;
+  background-position: 2px 0;
+  padding: 0 2px 0 22px;
+  vertical-align: middle;
+}
+
+option.status_open {
+  background-image: url('../images/status/OPEN.png');
+}
+
+option.status_reopened {
+  background-image: url('../images/status/REOPENED.png');
+}
+
+option.status_resolved {
+  background-image: url('../images/status/RESOLVED.png');
+}
+
+option.status_closed {
+  background-image: url('../images/status/CLOSED.png');
+}
+
+option.sev_INFO, span.sev_INFO {
+  background-image: url('../images/priority/INFO.png');
+}
+
+option.sev_MINOR, span.sev_MINOR {
+  background-image: url('../images/priority/MINOR.png');
+}
+
+option.sev_MAJOR, span.sev_MAJOR {
+  background-image: url('../images/priority/MAJOR.png');
+}
+
+option.sev_CRITICAL, span.sev_CRITICAL {
+  background-image: url('../images/priority/CRITICAL.png');
+}
+
+option.sev_BLOCKER, span.sev_BLOCKER {
+  background-image: url('../images/priority/BLOCKER.png');
+}
+
+/* ------------------- VARIATIONS ------------------- */
+.var {
+  color: #444 !important;
+}
+
+.varb {
+  /* better */
+  color: #078C00 !important;
+}
+
+.varw {
+  /* worst */
+  color: #cc0000 !important;
+}
+
+/* ------------------- HELP ------------------- */
+.help {
+  border: 1px solid #DDD;
+  background-color: #EFEFEF;
+  color: #444;
+  padding: 5px;
+}
+
+.help h2 {
+  padding-left: 23px;
+  color: #444;
+  vertical-align: bottom;
+  font-weight: bold;
+  background: url('../images/information.png') no-repeat left center;
+}
+
+.help p {
+  padding: 5px 0;
+}
+
+/* ------------------- FORMS ------------------- */
+.admintable {
+  border: solid 1px #FFD324;
+  background-color: #FFF6BF;
+  color: #111;
+}
+
+.admintable td {
+  padding: 5px 10px;
+}
+
+.admintable span.desc {
+  font-size: 85%;
+  font-weight: normal;
+}
+
+/* ------------------- BOXES ------------------- */
+.box {
+  border: 1px solid #ccc;
+  background-color: #EFEFEF;
+  margin-bottom: 5px;
+  color: #444;
+  padding: 10px;
+}
+
+.box a, .box a:visited {
+  color: #555;
+}
+
+.admin {
+  border: solid 1px #FFD324;
+  background-color: #FFF6BF;
+  color: #514721;
+  margin-bottom: 5px;
+  padding: 5px;
+}
+
+.admin h3 {
+  font-size: 100%;
+  text-align: left;
+  font-weight: bold;
+  color: #333;
+}
+
+.column {
+  vertical-align: top;
+  text-align: left;
+  padding: 0 0 0 10px;
+}
+
+.column.first {
+  padding: 0;
+}
+
+.column h3 {
+  padding: 3px 0;
+}
+
+.scrollable {
+  height: 144px;
+  overflow: auto;
+  border: 1px solid #ccc;
+}
+
+.scroll-ie {
+  overflow-x: hidden;
+  padding-right: 17px;
+}
+
+.red {
+  color: #8B0000;
+}
+
+.green {
+  color: #050;
+}
+
+ul.bullet {
+  margin: 3px 0 3px 25px;
+}
+
+ul.bullet li {
+  padding: 2px 0;
+  list-style-image: url("../images/bullet.png");
+}
+
+.rule_title {
+  font-size: 110%;
+}
+
+.tablinks {
+  float: right;
+  padding: 0 5px 0 10px;
+  text-align: right;
+}
+
+.tablinks li {
+  float: left;
+  text-align: right;
+  margin-left: 5px;
+  padding: 0 0 0 5px;
+}
+
+.tablinks li.first {
+  background: none;
+}
+
+.tablinks a {
+  text-decoration: underline;
+  color: #777;
+  font-size: 85%;
+}
+
+.tabs-panel {
+  border-right: 1px solid #DDD;
+  border-bottom: 1px solid #DDD;
+  border-left: 1px solid #DDD;
+  border-top-width: 0;
+  padding: 10px;
+}
+
+/* tabs2 is deprecated since 4.1. It is kept for backward-compatibility */
+.tabs2, .tabs {
+  height: 20px;
+  border-bottom: 1px solid #DDD;
+  margin: 0;
+  padding: 0;
+  font-size: 93%;
+}
+
+.tabs2 li, .tabs li {
+  display: inline;
+  list-style-type: none;
+  font-weight: normal;
+  color: #777;
+  vertical-align: baseline;
+  white-space: nowrap;
+  margin: 0;
+  border: 0;
+  padding: 0;
+}
+
+.tabs li a {
+  outline: none;
+}
+
+.tabs2 li a, .tabs li a {
+  float: left;
+  color: #777;
+  vertical-align: bottom;
+  height: 17px;
+  margin: 0 1px 0 0;
+  padding: 1px 5px;
+}
+
+.tabs2 li a.selected, .tabs li a.selected, .tabs .ui-tabs-active a {
+  text-decoration: none;
+  color: #555 !important;
+  font-weight: bold;
+  margin: 0 1px 0 0;
+}
+
+.tabbed {
+  border: 1px solid silver;
+  border-top: 0;
+  padding: 5px;
+}
+.comments {
+  color: #777;
+  font-size: 12px;
+  margin-bottom: 10px;
+  padding: 4px;
+}
+
+.little {
+  font-size: 80%;
+}
+
+.tooltip {
+  position: absolute;
+  background-color: #CAE3F2;
+  border: 1px solid #4b9fd5;
+  max-width: 480px;
+  text-align: left;
+  color: #262626;
+}
+
+.tooltip .content {
+  color: #111;
+  padding: 4px;
+}
+
+.tooltip .title {
+  color: #111;
+  font-weight: bold;
+  font-size: 100%;
+  padding: 2px 4px;
+}
+
+.tooltip td {
+  margin: 0;
+  padding: 2px;
+}
+
+.tooltip p {
+  margin: 0;
+  padding: 0;
+}
+
+.alert_WARN {
+  background-color: #ff8500;
+  color: #fff;
+  margin: 0;
+  padding: 0 3px;
+}
+
+.alert_ERROR {
+  background-color: #f93f40;
+  color: #fff;
+  margin: 0;
+  padding: 0 3px;
+}
+
+#comparison span.best {
+  font-size: 108%;
+  font-weight: bold;
+}
+
+.gwt-TabBar {
+  font-size: 93%;
+  width: 100%;
+  border-bottom: 1px solid #cdcdcd;
+}
+
+.gwt-TabBarFirst {
+  width: 0;
+}
+
+.gwt-TabBar .gwt-TabBarItem {
+  cursor: pointer;
+  font-weight: normal;
+  text-decoration: underline;
+  color: #555;
+  background-color: #EFEFEF;
+  vertical-align: middle;
+  white-space: nowrap;
+  padding: 0.3em 0.6em;
+  border: 1px solid #cdcdcd;
+  border-bottom: none;
+  border-radius: 4px 4px 0 0;
+  -moz-border-radius: 4px 4px 0 0;
+  -webkit-border-radius: 4px 4px 0 0;
+}
+
+.gwt-TabBar .gwt-TabBarItem-wrapper {
+  padding: 0 0 0 1px;
+}
+
+.gwt-TabBar .gwt-TabBarItem-selected {
+  cursor: default;
+  font-weight: bold;
+  text-decoration: underline;
+  color: #efefef;
+  background-color: #4B9FD5;
+  border-bottom: none;
+  vertical-align: middle;
+  white-space: nowrap;
+  padding: 0.3em 0.6em;
+}
+
+.gwt-TabPanelBottom {
+  width: 100%;
+}
+
+.markdown-tips, .markdown-tips a {
+  font-size: 12px;
+  color: #777;
+}
+
+
+/* API for Rule and Property Descriptions  */
+.rule-desc h2 {
+  margin-top: 16px;
+  font-size: 16px;
+  line-height: 1.5;
+  color: #2B547D;
+}
+
+.rule-desc h3 {
+  margin-top: 16px;
+  font-size: 12px;
+  line-height: 1.5;
+  color: #2B547D;
+  font-weight: bold;
+}
+
+.rule-desc p, .property p {
+  margin-top: 10px;
+}
+
+.rule-desc pre, .property pre {
+  margin: 10px 0 !important;
+  padding: 10px !important;
+  border: 1px dashed #aaa;
+  font-size: 12px;
+  font-family: monospace;;
+}
+
+.rule-desc blockquote, .property blockquote {
+  margin-top: 10px;
+  padding: 10px;
+}
+
+.rule-desc ul, .property ul {
+  list-style-type: disc;
+  list-style-position: inside;
+  margin: 10px;
+}
+
+.rule-desc ol, .property ol {
+  list-style-type: decimal;
+  list-style-position: inside;
+  margin: 10px;
+}
+
+.rule-table {
+  margin-top: 10px;
+  overflow-x: auto;
+  border-collapse: collapse;
+}
+.rule-table th {
+  background: none no-repeat scroll right center #EFEFEF;
+  border: 1px solid #DDD;
+  padding: 5px 10px;
+  font-weight: bold;
+}
+.rule-table td {
+  background: none no-repeat scroll right center transparent;
+  border: 1px solid #DDD;
+  padding: 5px 10px;
+}
+/* End of API for Rule Descriptions */
+
+
+
+.tip:hover {
+  background: #FFF;
+  position: relative;
+  z-index: 100;
+}
+
+.tip span {
+  display: none;
+  margin-left: -20px;
+  padding: 4px 5px;
+}
+
+.tip:hover span {
+  display: inline;
+  position: absolute;
+  background: #CAE3F2;
+  border: 1px solid #4b9fd5;
+  color: #262626;
+  white-space: nowrap;
+  text-decoration: none;
+}
+
+.hbar {
+  float: left;
+  border: none;
+  clear: both;
+  width: 4em;
+  margin: 0;
+  padding: 2px 0 0;
+}
+
+.hbar li {
+  background-color: #777;
+  color: #FFF;
+  font-family: Verdana, Tahoma, Arial, sans-serif;
+  font-size: xx-small;
+  letter-spacing: -0.075em;
+  list-style: none;
+  line-height: 1.1em;
+  text-align: right;
+  vertical-align: middle;
+  padding: 0.1em;
+}
+
+div.barchart {
+  border: 0;
+  margin: 0;
+  padding: 0;
+  float: left;
+}
+
+div.barchart > div {
+  background-color: #4B9FD5;
+  height: 0.9em;
+}
+
+table.matrix thead {
+  background-color: #CAE3F2;
+  border: 1px solid #4b9fd5;
+}
+
+table.matrix thead th {
+  text-align: right;
+  border-right: 1px solid #4b9fd5;
+  padding: 4px 5px;
+}
+
+table.matrix tbody td {
+  border: 1px solid #ddd;
+  margin: 0;
+  padding: 4px 5px;
+}
+
+table.matrix tbody td.title {
+  border: none;
+  font-weight: bold;
+  margin: 0;
+  padding: 5px 0 0 5px;
+}
+
+a.nolink, .dashbox a, .dashbox a:visited {
+  text-decoration: none;
+}
+
+a.nolink:hover, .dashbox a:hover, .dashbox a.action, .dashbox a.action:visited {
+  text-decoration: underline;
+}
+
+h1 strong, .dashbox .title, .gwt-SourcePanel .sources .msg li strong {
+  font-weight: bold;
+}
+
+h4 a, h4 a:visited, .gray, table.data tfoot a, table.data tfoot a:visited {
+  color: #777;
+}
+
+.even, table.sortable tr.rowodd {
+  background-color: #EFEFEF;
+}
+
+.bordered, table.data > thead {
+  border-bottom: 1px solid #ddd;
+}
+
+table.data > tbody {
+  border-bottom: 1px solid #ddd;
+  border-right: 1px solid #ddd;
+  border-left: 1px solid #ddd;
+}
+
+table.data, table.spaced, .gwt-SourcePanel .sources {
+  width: 100%;
+}
+
+table.data td.barchart {
+  width: 100px;
+}
+
+table.without-header {
+  border-top: 1px solid #ddd;
+}
+
+.hoverable.selected a {
+  color: #fff;
+}
+
+.gwt-SourcePanel .sources td {
+  vertical-align: top;
+}
+
+/* GENERIC STYLES */
+.line-block {
+  display: block;
+  width: 100%;
+  height: 24px;
+  line-height: 22px;
+  margin-bottom: 5px;
+}
+
+.line-info {
+  background: url('../images/information.png') no-repeat scroll left 50% transparent;
+  padding-left: 18px
+}
+
+div.break10 {
+  height: 10px;
+}
+
+div.break30 {
+  height: 30px;
+}
+
+.marginbottom10 {
+  margin-bottom: 10px;
+}
+
+.marginbottom5 {
+  margin-bottom: 5px;
+}
+
+.marginright10 {
+  margin-right: 10px;
+}
+
+.marginleft10 {
+  margin-left: 10px;
+}
+
+.width100 {
+  width: 100%;
+}
+
+ul.horizontal {
+  list-style-type: none;
+}
+
+ul.horizontal li {
+  float: left;
+  position: relative;
+}
+
+table.nowrap td, td.nowrap, th.nowrap {
+  white-space: nowrap;
+}
+
+table.nowrap td.small, td.nowrap.small, th.nowrap.small {
+  line-height: 16px;
+}
+
+.background-gray {
+  background-color: #EFEFEF;
+  color: #444;
+}
+
+/* CONFIGURATION OF Q PROFILES */
+.bulk-edit {
+  display: block;
+  background: url("../images/bulk-edit.png") no-repeat scroll left 50% transparent;
+  padding: 2px 0 2px 20px;
+}
+
+.csv {
+  display: block;
+  background: url("../images/csv.png") no-repeat scroll left 50% transparent;
+  padding: 2px 0 2px 20px;
+}
+
+.add {
+  display: block;
+  background: url("../images/add.png") no-repeat scroll left 50% transparent;
+  padding: 2px 0 2px 20px;
+}
+
+.restore {
+  display: block;
+  background: url("../images/restore.gif") no-repeat scroll left 50% transparent;
+  padding: 2px 0 2px 20px;
+}
+
+.compare {
+  display: block;
+  background: url("../images/compare.png") no-repeat scroll left 50% transparent;
+  padding: 2px 0 2px 20px;
+}
+
+/* Profile diff */
+.diffParam {
+  font-family: 'Bitstream Vera Sans Mono', 'Courier', monospace;
+}
+
+.yellowHighlight {
+  background: #FFFBCC;
+}
+
+.action {
+  text-decoration: underline;
+  cursor: pointer;
+}
+
+/* Used on links which are located inside a dense text place or in tables */
+/* in order to rapidly identify them                                      */
+.link-action {
+  text-decoration: underline !important;
+  color: #4183C4 !important;
+  cursor: pointer;
+}
+
+.link-red {
+  color: #990000 !important;
+}
+
+.link-more {
+  background-image: url('../images/bullet_arrow_down.png');
+  background-repeat: no-repeat;
+  padding-right: 20px;
+  background-position: right center;
+  cursor: pointer;
+}
+
+.dropdown {
+  cursor: pointer;
+  display: inline-block;
+  text-decoration: none !important;
+  /* zoom and *display = ie7 hack for display:inline-block */
+  zoom: 1;
+  *display: inline;
+}
+
+.dropdown-menu {
+  background-clip: padding-box;
+  background-color: #FFFFFF;
+  border: 1px solid #DDD;
+  box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.5);
+  float: left;
+  margin: 0;
+  max-width: 220px;
+  min-width: 160px;
+  padding: 0;
+  position: absolute;
+  z-index: 1000;
+}
+
+.dropdown-menu h2 {
+  padding: 0 8px;
+  font-size: 100%;
+  font-weight: bold;
+}
+
+.dropdown-menu li {
+  list-style-type: none !important;
+  line-height: 24px;
+  height: 24px;
+  padding: 0 8px;
+  cursor: pointer !important;
+  float: none !important;
+}
+
+.dropdown-menu li:hover {
+  background-color: #4b9fd5 !important;
+}
+
+.dropdown-menu li:hover a {
+  color: #fff !important;
+}
+
+.dropdown-menu a {
+  text-decoration: none !important;
+  color: #333 !important;
+}
+
+.form-key-cell {
+  padding: 2px 8px 4px 10px;
+  text-align: right;
+  width: 1%;
+  white-space: nowrap;
+  vertical-align: top;
+}
+
+.form-val-cell {
+  padding: 2px 8px 4px 0;
+  text-align: left;
+  white-space: normal;
+}
+
+.form-val-cell li {
+  margin-bottom: 5px;
+}
+
+.form-val-note {
+  color: #999;
+}
+
+blockquote {
+  border-left: 3px solid #E5E5E5;
+  padding: 0 8px;
+  line-height: 16px;
+}
+
+blockquote cite {
+  line-height: 16px;
+  background-image: url('../images/reviews/comment.png');
+  background-repeat: no-repeat;
+  padding-left: 20px;
+  background-position: left center;
+  font-size: 12px;
+  color: #888;
+}
+
+.spacer-left {
+  margin-left: 8px;
+}
+
+.spacer-right {
+  margin-right: 8px;
+}
+
+.spacer-bottom {
+  margin-bottom: 8px;
+}
+
+.spacer-top {
+  margin-top: 8px;
+}
+
+td.spacer-left {
+  padding-left: 8px;
+}
+
+td.spacer-right {
+  padding-right: 8px;
+}
+
+td.spacer-bottom {
+  padding-bottom: 8px;
+}
+
+td.spacer-top {
+  padding-top: 8px;
+}
+
+.bordered {
+  border: 1px solid #DDD;
+}
+
+.bordered-left {
+  border-left: 1px solid #DDD;
+}
+
+.bordered-right {
+  border-right: 1px solid #DDD;
+}
+
+.bordered-bottom {
+  border-bottom: 1px solid #DDD;
+}
+
+.bordered-top {
+  border-top: 1px solid #DDD;
+}
+
+.table > thead > tr > th {
+  border-top: 0 none;
+  font-weight: bold;
+  vertical-align: bottom;
+  line-height: 16px;
+  padding: 4px 5px;
+  vertical-align: bottom;
+}
+
+.table > tbody > tr > td {
+  line-height: 16px;
+  padding: 4px 5px;
+  vertical-align: top;
+}
+
+.table > tfoot > tr > td {
+  font-size: 93%;
+  color: #777;
+  padding: 4px 5px;
+}
+
+.table > tfoot > tr > td a {
+  color: #777;
+}
+
+.table-bordered > tbody {
+  border-left: 1px solid #DDD;
+  border-right: 1px solid #DDD;
+  border-bottom: 1px solid #DDD;
+}
+
+.table-bordered > tbody > tr > td {
+  border-top: 1px solid #DDD;
+}
+
+select.small-width {
+  max-width: 120px;
+}
+
+select.medium-width {
+  max-width: 175px;
+  width: 175px;
+}
+
+/*
+
+ MODAL WINDOWS
+
+*/
+.modal-head {
+  padding: 0 10px;
+  background-color: #EFEFEF;
+  border-bottom: 1px solid #DDD;
+}
+
+.modal-head h1, .modal-head h2 {
+  line-height: 30px;
+  min-height: 30px;
+}
+
+ul.modal-head-metadata {
+  overflow: hidden;
+  padding: 0 0 5px 0;
+}
+
+ul.modal-head-metadata li {
+  float: left;
+  position: relative;
+  font-size: 85%;
+  color: #777;
+}
+
+.modal-body {
+  padding: 10px;
+}
+
+.modal-body .notes {
+  height: auto;
+}
+
+.modal-field {
+  clear: both;
+  display: block;
+  padding: 5px 0 5px 130px;
+}
+
+.modal-field label {
+  display: block;
+  float: left;
+  text-align: right;
+  width: 130px;
+  left: -140px;
+  margin-right: -130px;
+  line-height: 1;
+  word-wrap: break-word;
+  position: relative;
+  padding-top: 5px;
+}
+
+.modal-field input {
+  margin-right: 5px;
+  margin-bottom: 10px;
+}
+
+.modal-field input[type=text],
+.modal-field input[type=password],
+.modal-field textarea {
+  width: 250px;
+}
+
+.modal-field .text {
+  line-height: 20px;
+}
+
+.modal-foot {
+  text-align: right;
+  padding: 2px 10px;
+  border-top: 1px solid #CCC;
+  line-height: 30px;
+  height: 30px;
+  background-color: #EFEFEF;
+}
+
+.modal-foot input {
+  margin-right: 10px;
+}
+
+.modal-field-description {
+  clear: both;
+  font-size: 93%;
+  color: #777;
+}
+
+.modal-error {
+  border: 1px solid red;
+  background-color: #FF5252;
+  color: #eee;
+  margin: 0 0 4px;
+  padding: 4px;
+  display: none;
+}
+
+textarea.width100 {
+  width: 100%;
+  -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
+  -moz-box-sizing: border-box; /* Firefox, other Gecko */
+  box-sizing: border-box; /* Opera/IE 8+ */
+}
+
+.property {
+  margin-bottom: 10px;
+}
+
+.property h3 {
+  float: none;
+  max-width: 20em;
+}
+
+.property > th, .property > td {
+  vertical-align: top;
+  padding: 10px;
+}
+
+.property > th {
+  text-align: right;
+}
+
+.property table.data {
+  width: 480px;
+}
+
+.property textarea {
+  vertical-align: text-top;
+}
+
+.property .note {
+  margin-top: 5px;
+}
+
+/* ------------------- Accordion navigation styles ------------------- */
+
+.accordion-item {
+  border: 1px solid #DDD;
+  margin-bottom: 20px;
+}
+
+.accordion-item table.data {
+  /* Fix an issue on Google Chrome to prevent the horizontal scroll to appear */
+  border-collapse : separate;
+}
+
+.accordion-item-body-medium {
+  max-height: 200px;
+  overflow: auto;
+}
+
+
+/* ------------------- Rule styles ------------------- */
+
+.rule-search {
+  display: inline-block;
+  line-height: 16px;
+}
+
+div.rule-title {
+  display: inline-block;
+  float: left;
+  clear: right;
+}
+
+#result_table .rule-desc {
+  width: 100%;
+  float: left;
+  clear: right;
+}
+
+.rule-status, .rule-tags {
+  display: inline-block;
+  margin-left: 10px;
+  float: right;
+  padding: 3px 5px 0 0;
+  font-size: 85%;
+  color: #777;
+}
+
+.rule-tags a {
+  color: inherit;
+  text-decoration: none;
+}
+
+.rule-status span {
+  text-transform: uppercase;
+}
+
+.rule-tags span {
+  background-color: #eee;
+  padding: 3px 4px;
+  margin: 4px 2px;
+  border-radius: 2px;
+  box-shadow: 0px -1px 0px rgba(0, 0, 0, 0.12) inset;
+}
+
+/* ------------------- Role search styles ------------------- */
+
+.project-search {
+  display: inline-block;
+  line-height: 16px;
+  padding: 4px 2px;
+}
+
+
+
+
+.sonar-d3 {
+
+}
+
+.sonar-d3 .axis path {
+  fill: none;
+  stroke: #444;
+}
+
+.sonar-d3 .tick line {
+  stroke: #444;
+}
+
+.sonar-d3 .tick text {
+  fill: #444;
+}
+
+.sonar-d3 .plot {
+  transition: all 0.2s ease;
+}
+
+.sonar-d3 .plot:hover .arc,
+.sonar-d3 .plot.hover .arc {
+  opacity: 0.4;
+}
+
+.sonar-d3 .plot .arc:hover,
+.sonar-d3 .plot .arc.hover {
+  opacity: 1;
+}
+
+.sonar-d3 .plot .line {
+  fill: none;
+  stroke: #000;
+  stroke-width: 2;
+}
+
+.sonar-d3 .plot .line-marker {
+  fill: #fff;
+  stroke: #000;
+  stroke-width: 2;
+  opacity: 0;
+}
+
+.sonar-d3 .plot .scanner {
+  stroke: #000;
+  opacity: 0.25;
+}
+
+.sonar-d3 .arc,
+.sonar-d3 .bar rect {
+  cursor: pointer;
+  stroke: #fff;
+  stroke-width: 1px;
+  transition: all 0.2s ease;
+}
+
+.sonar-d3 .bar,
+.sonar-d3 .bar .legend-text,
+.sonar-d3 .pie-legend,
+.sonar-d3 .pie-legend .legend-text {
+  cursor: pointer;
+}
+
+.sonar-d3 .legend {
+
+}
+
+.sonar-d3 .legend-bullet {
+  transition: all 0.2s ease;
+}
+
+.sonar-d3 .legend-text {
+  font-size: 12px;
+  cursor: default;
+}
+
+.sonar-d3 .legend-active .legend-bullet {
+  -webkit-transform: scale(1.4);
+  -webkit-transform-origin: center;
+}
+
+.sonar-d3 .details-color-indicator {
+  fill: #fff;
+  transition: fill 0.2s ease;
+}
+
+.sonar-d3 .details-metric {
+  font-size: 12px;
+}
+
+.sonar-d3 .details-metric-main {
+  font-weight: bold;
+}
+
+.sonar-d3 .info {
+
+}
+
+.sonar-d3 .info-text {
+  font-size: 13px;
+}
+
+.sonar-d3 .info-text-bold {
+  font-weight: bold;
+}
+
+.sonar-d3 .info-text-small {
+  font-size: 12px;
+}
+
+.sonar-d3 .event-tick {
+  fill: none;
+  stroke: #000;
+  stroke-width: 1px;
+  transition: all 0.3s ease;
+}
+
+/* ------------------- Admin pages ------------------- */
+
+.admin-page-title {
+  margin-bottom: 0px;
+}
+
+.admin-page-description {
+  font-size: 85%;
+  font-weight: normal;
+  margin-bottom: 25px;
+}
diff --git a/sonar-server/src/main/webapp/less/ui.less b/sonar-server/src/main/webapp/less/ui.less
new file mode 100644 (file)
index 0000000..6627c09
--- /dev/null
@@ -0,0 +1,129 @@
+@import "variables";
+@import "mixins";
+
+input[type=text],
+input[type=password],
+input[type=email],
+textarea {
+  border: 1px solid @darkGrey;
+  .box-sizing(border-box);
+  background: #fff;
+  color: @baseFontColor;
+  .trans(border-color);
+
+  &:active,
+  &:focus {
+    border-color: @highlighted;
+    box-shadow: none;
+    outline: none;
+  }
+}
+
+input[type=text],
+input[type=password],
+input[type=email] {
+  height: 22px;
+  padding: 0 3px;
+}
+
+textarea {
+  padding: 3px;
+}
+
+button,
+.button,
+input[type=submit],
+input[type=button] {
+  display: inline-block;
+  vertical-align: baseline;
+  height: 22px;
+  margin: 0 1px;
+  padding: 2px 10px;
+
+  border: 1px solid @darkGrey;
+  .box-sizing(border-box);
+
+  background: #f4f4f4;
+
+  color: @baseFontColor;
+  font-weight: bold;
+  font-size: @baseFontSize;
+  text-align: center;
+  text-decoration: none;
+
+  cursor: pointer;
+  outline: none;
+  .trans(border-color);
+
+  &:hover {
+    border-color: #5281a0;
+    background: #4b9fd5;
+    color: #fff;
+  }
+
+  &:active {
+    border-color: #2790c0;
+    background: #78bdea;
+    color: #fff;
+  }
+
+  &:focus {
+    border-color: @highlighted;
+  }
+
+  &[disabled],
+  &[disabled]:hover,
+  &[disabled]:active,
+  &[disabled]:focus {
+    color: #bbb;
+    border-color: #ddd;
+    background: #ebebeb;
+    cursor: default;
+  }
+}
+
+.button-red {
+  &:hover, &:focus {
+    border-color: #900;
+    background: lighten(#900, 10%);
+    color: #fff;
+  }
+
+  &:active {
+    border-color: #900;
+    background: lighten(#900, 20%);
+  }
+}
+
+.button-group {
+  display: inline-block;
+  vertical-align: middle;
+  font-size: 0;
+  white-space: nowrap;
+
+  & > button {
+    position: relative;
+    z-index: 2;
+    display: inline-block;
+    vertical-align: middle;
+    margin: 0;
+    padding: 2px 8px;
+    font-size: @smallFontSize;
+    font-weight: normal;
+    cursor: pointer;
+
+    &:hover, &:focus {
+      z-index: 3;
+    }
+  }
+
+  & > button + button {
+    margin-left: -1px;
+  }
+
+  & > a {
+    vertical-align: middle;
+    margin: 0 8px;
+    font-size: @smallFontSize;
+  }
+}
diff --git a/sonar-server/src/main/webapp/less/variables.less b/sonar-server/src/main/webapp/less/variables.less
new file mode 100644 (file)
index 0000000..b43675b
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Fonts
+ */
+
+@baseFontSize: 13px;
+@baseFontColor: #444;
+@smallFontSize: 11px;
+@headerFontSize: 16px;
+
+
+
+/*
+ * Colors
+ */
+
+@black: #000000;
+@white: #ffffff;
+@grey:  #efefef;
+@darkGrey: #cdcdcd;
+
+@blue: #4b9fd5;
+@red: #d4333f;
+@green: #85bb43;
+@yellow: #fede06;
+@orange: #f90;
+
+@highlighted: @blue;
+
+
+
+/*
+ * Icons
+ */
+
+@iconSmallFontSize: 14px;
+@iconFontSize: 16px;
+@iconLineHeight: 12px;
+
+@severityBlockerColor: @red;
+@severityCriticalColor: @red;
+@severityMajorColor: @red;
+@severityMinorColor: @green;
+@severityInfoColor: @green;
+
+@statusOpenColor: @blue;
+@statusConfirmedColor: @blue;
+@statusReopenedColor: @blue;
+@statusResolvedColor: @baseFontColor;
+@statusClosedColor: @baseFontColor;
+
+@resolutionFixedColor: @baseFontColor;
+@resolutionFalsePositiveColor: @baseFontColor;
+@resolutionRemovedColor: @baseFontColor;
+
+
+
+/*
+ * Transitions
+ */
+
+@defaultTransitionOptions: .3s ease;
diff --git a/sonar-server/src/main/webapp/less/yui-reset-font.less b/sonar-server/src/main/webapp/less/yui-reset-font.less
new file mode 100644 (file)
index 0000000..bf3e732
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+YUI 3.6.0 (build 5521)
+Copyright 2012 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+
+/* reset */
+html{color:#000;background:#FFF}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}ol,ul{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:''}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit}input,textarea,select{*font-size:100%}legend{color:#000}
+
+/* font */
+body{font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small}select,input,button,textarea{font:99% arial,helvetica,clean,sans-serif}table{font-size:inherit;font:100%}pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%}
\ No newline at end of file
diff --git a/sonar-server/src/main/webapp/stylesheets/coding-rules.css b/sonar-server/src/main/webapp/stylesheets/coding-rules.css
deleted file mode 100644 (file)
index 7e2e846..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Fonts
- */
-/*
- * Colors
- */
-/*
- * Icons
- */
-/*
- * Transitions
- */
-.coding-rules-page .navigator-results .spinner {
-  margin: 10px;
-}
-/*
- * Detail
- */
-.coding-rules-detail-header,
-.coding-rules-detail-title {
-  margin-bottom: 10px;
-  line-height: 1.5;
-  font-weight: bold;
-}
-.coding-rules-detail-title {
-  display: inline-block;
-  text-transform: uppercase;
-}
-.coding-rules-detail-status {
-  padding: 3px 4px;
-  background-color: #efefef;
-  color: #777;
-  font-size: 11px;
-}
-.coding-rules-detail-properties {
-  margin: 10px 0;
-  font-size: 0;
-}
-.coding-rules-detail-property {
-  display: inline-block;
-  vertical-align: middle;
-  font-size: 11px;
-  height: 22px;
-  line-height: 22px;
-}
-.coding-rules-detail-property .select2-search-field {
-  line-height: 1;
-}
-.coding-rules-detail-property + .coding-rules-detail-property {
-  margin-left: 20px;
-}
-.coding-rules-detail-tag + .coding-rules-detail-tag {
-  margin-left: 10px;
-}
-.coding-rules-detail-description {
-  margin: 20px 0;
-}
-.coding-rules-detail-description-extra {
-  margin-top: -10px;
-}
-.coding-rules-detail-parameters {
-  margin: 10px 0 20px;
-}
-.coding-rules-detail-parameter {
-  margin: 10px 0;
-  font-size: 0;
-}
-.coding-rules-detail-parameter-name {
-  display: inline-block;
-  visibility: top;
-  width: 150px;
-  font-size: 13px;
-  font-weight: bold;
-  text-align: right;
-}
-.coding-rules-detail-parameter-description {
-  display: inline-block;
-  vertical-align: top;
-  margin-left: 20px;
-  font-size: 13px;
-}
-.coding-rules-detail-quality-profiles-header {
-  margin-top: 30px;
-}
-.coding-rules-detail-quality-profiles {
-  font-size: 0;
-}
-.coding-rules-detail-quality-profile {
-  border: 1px solid transparent;
-}
-.coding-rules-detail-quality-profile.active {
-  border-color: #4b9fd5;
-}
-.coding-rules-detail-quality-profile.active .coding-rules-detail-quality-profile-name {
-  background-color: #4b9fd5;
-  color: #fff;
-}
-.coding-rules-detail-quality-profile + .coding-rules-detail-quality-profile {
-  margin-top: 20px;
-}
-.coding-rules-detail-quality-profile-name {
-  padding: 5px;
-  background-color: #efefef;
-  line-height: 1;
-  font-weight: bold;
-}
-.coding-rules-detail-quality-profile-actions {
-  padding: 5px;
-}
-.coding-rules-detail-quality-profile-parameters {
-  padding: 0 5px;
-}
-.coding-rules-detail-quality-profile-parameters .coding-rules-detail-parameter-name,
-.coding-rules-detail-quality-profile-parameters .coding-rules-detail-parameter-description {
-  vertical-align: middle;
-}
-.coding-rules-detail-quality-profile-parameters .coding-rules-detail-parameter-description input {
-  width: 200px;
-}
-.coding-rules-detail-quality-profile-inheritance {
-  margin: 10px 0;
-  padding: 0 5px;
-}
-.coding-rules-detail-quality-profile-inheritance strong {
-  font-weight: bold;
-}
-.coding-rules-detail-quality-profile-note {
-  margin: 10px 0;
-  padding: 0 5px;
-}
-.coding-rules-detail-quality-profiles-activation {
-  margin-top: -3px;
-  margin-left: 10px;
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/coding-rules.less b/sonar-server/src/main/webapp/stylesheets/coding-rules.less
deleted file mode 100644 (file)
index 6a3358b..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-@import 'mixins';
-@import 'variables';
-@import 'navigator/config';
-
-
-.coding-rules-page {
-
-  .navigator-results .spinner {
-    margin: @navigatorPadding;
-  }
-
-}
-
-
-
-/*
- * Detail
- */
-
-.coding-rules-detail-header,
-.coding-rules-detail-title {
-  margin-bottom: @navigatorPadding;
-  line-height: 1.5;
-  font-weight: bold;
-}
-
-.coding-rules-detail-title {
-  display: inline-block;
-  text-transform: uppercase;
-}
-
-.coding-rules-detail-status {
-  padding: 3px 4px;
-  background-color: @navigatorBarBackground;
-  color: #777;
-  font-size: @smallFontSize;
-}
-
-.coding-rules-detail-key {
-
-}
-
-.coding-rules-detail-properties {
-  margin: @navigatorPadding 0;
-  font-size: 0;
-}
-
-.coding-rules-detail-property {
-  display: inline-block;
-  vertical-align: middle;
-  font-size: @smallFontSize;
-  height: 22px;
-  line-height: 22px;
-
-  .select2-search-field { line-height: 1; }
-}
-
-.coding-rules-detail-property + .coding-rules-detail-property {
-  margin-left: 2 * @navigatorPadding;
-}
-
-.coding-rules-detail-tag + .coding-rules-detail-tag {
-  margin-left: @navigatorPadding;
-}
-
-.coding-rules-detail-description {
-  margin: 2 * @navigatorPadding 0;
-}
-
-.coding-rules-detail-description-extra {
-  margin-top: -@navigatorPadding;
-}
-
-.coding-rules-detail-parameters {
-  margin: @navigatorPadding 0 @navigatorPadding * 2;
-}
-
-.coding-rules-detail-parameter {
-  margin: @navigatorPadding 0;
-  font-size: 0;
-}
-
-.coding-rules-detail-parameter-name {
-  display: inline-block;
-  visibility: top;
-  width: 150px;
-  font-size: @baseFontSize;
-  font-weight: bold;
-  text-align: right;
-}
-
-.coding-rules-detail-parameter-description {
-  display: inline-block;
-  vertical-align: top;
-  margin-left: 2 * @navigatorPadding;
-  font-size: @baseFontSize;
-}
-
-
-// Quality Profiles
-.coding-rules-detail-quality-profiles-header {
-  margin-top: 3 * @navigatorPadding;
-}
-
-.coding-rules-detail-quality-profiles {
-  font-size: 0;
-}
-
-.coding-rules-detail-quality-profile {
-  border: 1px solid transparent;
-
-  &.active {
-    border-color: @highlighted;
-
-    .coding-rules-detail-quality-profile-name {
-      background-color: @highlighted;
-      color: #fff;
-    }
-  }
-}
-
-.coding-rules-detail-quality-profile + .coding-rules-detail-quality-profile {
-  margin-top: 2 * @navigatorPadding;
-}
-
-.coding-rules-detail-quality-profile-name {
-  padding: @navigatorPadding / 2;
-  background-color: @navigatorBarBackground;
-  line-height: 1;
-  font-weight: bold;
-}
-
-.coding-rules-detail-quality-profile-actions {
-  padding: @navigatorPadding / 2;
-}
-
-.coding-rules-detail-quality-profile-parameters {
-  padding: 0 @navigatorPadding / 2;
-
-  .coding-rules-detail-parameter-name,
-  .coding-rules-detail-parameter-description {
-    vertical-align: middle;
-  }
-
-  .coding-rules-detail-parameter-description input {
-    width: 200px;
-  }
-}
-
-.coding-rules-detail-quality-profile-inheritance {
-  margin: @navigatorPadding 0;
-  padding: 0 @navigatorPadding / 2;
-
-  strong { font-weight: bold; }
-}
-
-.coding-rules-detail-quality-profile-note {
-  margin: @navigatorPadding 0;
-  padding: 0 @navigatorPadding / 2;
-}
-
-.coding-rules-detail-quality-profiles-activation {
-  margin-top: -3px;
-  margin-left: @navigatorPadding;
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/dashboard.css b/sonar-server/src/main/webapp/stylesheets/dashboard.css
deleted file mode 100644 (file)
index 710d6bb..0000000
+++ /dev/null
@@ -1,265 +0,0 @@
-/* LAYOUT */
-#dashboard {
-  position: relative;
-  width: 100%;
-}
-
-#dashboard .transparent {
-  position: absolute;
-  width: 100%;
-  height: 100%;
-  top: 0;
-  left: 0;
-  background: url('../images/transparent.gif') repeat;
-  z-index: 1000;
-}
-
-/* WIDGETS */
-#dashboard .widget {
-  position: relative;
-  overflow-x: auto;
-  overflow-y: hidden;
-  padding: 10px;
-  margin: 0;
-  border: 1px solid #ddd;
-}
-
-#dashboard .block {
-  margin: 0 0 10px 0;
-}
-
-#dashboard .configure_widget {
-  display: block;
-  position: relative;
-}
-
-#dashboard .widget_props {
-  background-color: #FFF6BF;
-  border: 1px solid #FFD324;
-  margin-bottom: 10px;
-  padding: 5px;
-  border-radius: 0 0 3px 3px;
-  -moz-border-radius: 0 0 3px 3px;
-  -webkit-border-radius: 0 0 3px 3px;
-}
-
-#dashboard .widget-title {
-  background-color: #4B9FD5;
-  color: #FEFEFE;
-  padding: 0 5px;
-  height: 24px;
-  line-height: 24px;
-}
-
-#dashboard .widget-title a {
-  color: #FEFEFE;
-}
-
-/*CONFIGURATION*/
-#dashboard #configure {
-  position: relative;
-  height: 260px;
-  margin: 5px 0 10px 0;
-}
-
-#dashboard #widget_defs, #dashboard #edit-layout {
-  background-color: #FFF6BF;
-  border: 2px solid #FFD324;
-  padding: 3px;
-  border-radius: 3px;
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-  overflow-x: hidden;
-}
-
-#dashboard #widget_defs {
-  margin-right: 104px;
-  overflow-y: auto;
-  height: 250px;
-}
-
-#dashboard #edit-layout {
-  width: 86px;
-  height: 248px;
-  position: absolute;
-  right: 0;
-  top: 0;
-  padding-top: 5px;
-}
-
-#dashboard #edit-layout p {
-  margin-bottom: 5px;
-}
-
-#dashboard .widget_def {
-  border: 1px solid #FFD324;
-  padding: 5px;
-  margin: 3px;
-  white-space: normal;
-  vertical-align: top;
-  width: 250px;
-  float: left;
-  min-height: 100px;
-}
-
-#dashboard ul.widget_categs li {
-  padding-right: 5px;
-}
-
-#dashboard ul.widget_categs li.selected a {
-  font-weight: bold;
-  text-decoration: none;
-}
-
-#dashboard .select-layout {
-  float: left;
-}
-
-#dashboard .select-layout img {
-  border: 3px solid #FFF6BF;
-}
-
-#dashboard .select-layout.selected img {
-  border: 3px solid #4B9FD5;
-}
-
-.admin_page {
-    position: relative;
-}
-
-.admin_page table {
-  margin-top: 10px;
-  margin-bottom: 50px;
-}
-
-.admin_page .empty {
-  font-style: italic;
-}
-
-.admin_page .operations {
-  width: 260px;
-  text-align: right;
-}
-
-.admin_page .owner {
-  width: 140px;
-  text-align: center;
-}
-
-.admin_page .shared {
-  width: 40px;
-  text-align: center;
-}
-
-.admin_page .order, .admin_page .global {
-  width: 45px;
-  text-align: center;
-}
-
-/*OPERATIONS*/
-#dashboard #dashboard-operations {
-  position: relative;
-  display: inline-block;
-  width: 100%;
-}
-
-#dashboard #dashboard-operations ul.operations {
-  float: left;
-  list-style-type: none;
-  border: 1px solid #cdcdcd;
-  padding: 0;
-  margin: 0;
-  border-radius: 3px;
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-}
-
-#dashboard #dashboard-operations ul.operations li {
-  float: left;
-  margin: 0;
-  padding: 2px 10px;
-  position: relative;
-  background-color: #f4f4f4;
-  font-size: 85%;
-  border-right: 1px solid #cdcdcd;
-}
-
-#dashboard #dashboard-operations ul.operations li.last {
-  border-right-width: 0;
-}
-
-#dashboard #dashboard-operations ul.operations li.selected {
-  background-color: #d4d4d4;
-}
-
-#dashboard #dashboard-operations ul.operations li a {
-  color: #555;
-}
-
-#dashboard .dashboard-column {
-  margin: 0;
-  padding: 0;
-  overflow: visible;
-}
-
-#dashboard .dashboard-column-wrapper {
-  float: left;
-  margin: 0;
-  padding: 0;
-}
-
-#dashboard .column-handle {
-  height: 30px;
-  width: 100%;
-  margin: 0;
-  padding: 0;
-  display: inline-block;
-  line-height: 100px;
-  text-align: center;
-  font-size: x-large;
-  vertical-align: middle;
-  background-color: #eee;
-}
-
-#dashboard .block {
-  position: relative;
-  width: 100%;
-}
-
-#dashboard .widget-header {
-  line-height: 16px;
-  padding: 3px 5px;
-  background-color: #efefef;
-  border: 1px solid #ddd;
-  border-bottom: 0;
-}
-
-#dashboard .widget-handle {
-  cursor: move;
-  margin: 0;
-  background-image: url('../images/move.png');
-  background-position: left center;
-  background-repeat: no-repeat;
-  padding-left: 20px;
-}
-
-#dashboard .widget-actions {
-  float: right;
-  overflow: hidden; /* clears float for most browsers */
-  zoom: 1;
-}
-
-#dashboard .widget-actions a {
-  cursor: pointer;
-}
-
-#dashboard .block-hover {
-  outline: 2px dashed #ddd;
-}
-
-#dashboard .shadow-block {
-  box-shadow: 8px 8px 8px #ddd;
-  box-shadow: 8px 8px 8px #ddd;
-  -moz-box-shadow: 8px 8px 8px #ddd;
-  -webkit-box-shadow: 8px 8px 8px #ddd;
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/icons.css b/sonar-server/src/main/webapp/stylesheets/icons.css
deleted file mode 100644 (file)
index cbeeb71..0000000
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * Fonts
- */
-/*
- * Colors
- */
-/*
- * Icons
- */
-/*
- * Transitions
- */
-@font-face {
-  font-family: 'sonar';
-  src: url('../fonts/sonar.woff') format('woff'), url('../fonts/sonar.svg#sonar') format('svg');
-  font-weight: normal;
-  font-style: normal;
-}
-[class^="icon-"],
-[class*=" icon-"] {
-  font-family: 'sonar';
-  speak: none;
-  font-style: normal;
-  font-weight: normal;
-  font-variant: normal;
-  text-transform: none;
-  line-height: 1;
-  vertical-align: middle;
-  /* Better Font Rendering =========== */
-
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-a[class^="icon-"],
-a[class*=" icon-"] {
-  text-decoration: none !important;
-}
-/*
- * Severity
- */
-[class^="icon-severity-"],
-[class*=" icon-severity"] {
-  position: relative;
-  top: -1px;
-}
-.icon-severity-blocker:before,
-.icon-severity-4:before {
-  content: "\f000";
-  color: #d4333f;
-  font-size: 14px;
-}
-.icon-severity-critical:before,
-.icon-severity-3:before {
-  content: "\f001";
-  color: #d4333f;
-  font-size: 14px;
-}
-.icon-severity-major:before,
-.icon-severity-2:before {
-  content: "\f002";
-  color: #d4333f;
-  font-size: 14px;
-}
-.icon-severity-minor:before,
-.icon-severity-1:before {
-  content: "\f003";
-  color: #85bb43;
-  font-size: 14px;
-}
-.icon-severity-info:before,
-.icon-severity-0:before {
-  content: "\f004";
-  color: #85bb43;
-  font-size: 14px;
-}
-/*
- * Status
- */
-[class^="icon-status-"],
-[class*=" icon-status"] {
-  position: relative;
-  top: -1px;
-}
-.icon-status-open:before {
-  content: "\f010";
-  color: #4b9fd5;
-  font-size: 14px;
-  line-height: 12px;
-}
-.icon-status-confirmed:before {
-  content: "\f011";
-  color: #4b9fd5;
-  font-size: 14px;
-  line-height: 12px;
-}
-.icon-status-reopened:before {
-  content: "\f012";
-  color: #4b9fd5;
-  font-size: 14px;
-  line-height: 12px;
-}
-.icon-status-resolved:before {
-  content: "\f013";
-  color: #444444;
-  font-size: 14px;
-  line-height: 12px;
-}
-.icon-status-closed:before {
-  content: "\f014";
-  color: #444444;
-  font-size: 14px;
-  line-height: 12px;
-}
-/*
- * Alert
- */
-.icon-alert-ok:before {
-  content: "\f013";
-  color: #85bb43;
-  font-size: 16px;
-}
-.icon-alert-warn:before {
-  content: "\f000";
-  color: #ff9900;
-  font-size: 16px;
-}
-.icon-alert-error:before {
-  content: "\f057";
-  color: #d4333f;
-  font-size: 16px;
-}
-.icon-alert-none:before {
-  content: "\f059";
-  color: #4b9fd5;
-  font-size: 16px;
-}
-/*
- * Qualifier
- */
-.icon-qualifier-dir:before {
-  content: "\f07b";
-  font-size: 16px;
-}
-.icon-qualifier-fil:before {
-  content: "\f0f6";
-  font-size: 16px;
-}
-.icon-qualifier-lib:before {
-  content: "\e600";
-  font-size: 16px;
-}
-/*
- * Common
- */
-.icon-list:before {
-  content: "\f039";
-}
-.icon-bullet-list:before {
-  content: "\f03a";
-}
-.icon-settings:before {
-  content: "\f015";
-}
-.icon-settings-multiple:before {
-  content: "\f085";
-}
-.icon-arrow-down:before {
-  content: "\f0d7";
-  position: relative;
-  top: -2px;
-}
-.icon-arrow-up:before {
-  content: "\f0d8";
-  position: relative;
-  top: -2px;
-}
-.icon-arrow-left:before {
-  content: "\f0d9";
-}
-.icon-arrow-right:before {
-  content: "\f0da";
-}
-.icon-emoticon-smiley:before {
-  content: "\f118";
-}
-.icon-emoticon-sad:before {
-  content: "\f119";
-}
-.icon-emoticon-speechless:before {
-  content: "\f11a";
-}
-.icon-rect-check:before {
-  content: "\f046";
-}
-.icon-check:before {
-  content: "\f00c";
-}
-.icon-default:before {
-  position: relative;
-  top: -0.1em;
-  content: "\f00c";
-}
-.icon-lang:before {
-  content: "\f024";
-  font-size: 14px;
-}
-.icon-quality-profile:before {
-  content: "\f022";
-  font-size: 14px;
-}
-.icon-tags:before {
-  content: "\f02c";
-  font-size: 14px;
-}
-.icon-calendar:before {
-  position: relative;
-  top: -0.1em;
-  content: "\f073";
-  font-size: 14px;
-}
-.icon-favorite:before {
-  content: "\f005";
-  color: #ff9900;
-  font-size: 16px;
-}
-.icon-not-favorite:before {
-  content: "\f005";
-  color: #cdcdcd;
-  font-size: 16px;
-}
-.icon-help:before {
-  content: "\f059";
-  color: #4b9fd5;
-  font-size: 16px;
-}
-.icon-info:before {
-  content: "\f05a";
-  color: #4b9fd5;
-  font-size: 16px;
-}
-.icon-uniF060:before {
-  content: "\f060";
-}
-.icon-uniF061:before {
-  content: "\f061";
-}
-.icon-uniF062:before {
-  content: "\f062";
-}
-.icon-uniF063:before {
-  content: "\f063";
-}
-.icon-comment:before {
-  content: "\f075";
-}
-.icon-delete:before {
-  content: "\f00d";
-}
-.icon-compare:before {
-  content: "\f0c5";
-}
-.icon-link:before {
-  content: "\f0c1";
-}
-.icon-inheritance:before {
-  content: "\f126";
-  font-size: 16px;
-}
-.icon-plus:before {
-  content: "\f067";
-}
-/*
- * Spinner
- */
-.spinner {
-  position: relative;
-  vertical-align: middle;
-  width: 16px;
-  height: 16px;
-  border: 2px solid #0cf;
-  border-radius: 50%;
-  -webkit-animation: spin 0.75s infinite linear;
-  animation: spin 0.75s infinite linear;
-}
-.ie9 .spinner {
-  background-image: url(../images/loading.gif);
-  background-repeat: no-repeat;
-  background-position: 0 0;
-  border: none;
-}
-.spinner:before,
-.spinner:after {
-  left: -2px;
-  top: -2px;
-  display: none;
-  position: absolute;
-  content: '';
-  width: inherit;
-  height: inherit;
-  border: inherit;
-  border-radius: inherit;
-}
-.spinner,
-.spinner:before,
-.spinner:after {
-  display: inline-block;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  border-color: transparent;
-  border-top-color: #4b9fd5;
-  -webkit-animation-duration: 1.2s;
-  animation-duration: 1.2s;
-}
-.spinner:before {
-  -webkit-transform: rotate(120deg);
-  -ms-transform: rotate(120deg);
-  transform: rotate(120deg);
-}
-.spinner:after {
-  -webkit-transform: rotate(240deg);
-  -ms-transform: rotate(240deg);
-  transform: rotate(240deg);
-}
-@-webkit-keyframes spin {
-  from {
-    -webkit-transform: rotate(0deg);
-    -ms-transform: rotate(0deg);
-    transform: rotate(0deg);
-  }
-  to {
-    -webkit-transform: rotate(360deg);
-    -ms-transform: rotate(360deg);
-    transform: rotate(360deg);
-  }
-}
-@keyframes spin {
-  from {
-    -webkit-transform: rotate(0deg);
-    -ms-transform: rotate(0deg);
-    transform: rotate(0deg);
-  }
-  to {
-    -webkit-transform: rotate(360deg);
-    -ms-transform: rotate(360deg);
-    transform: rotate(360deg);
-  }
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/icons.less b/sonar-server/src/main/webapp/stylesheets/icons.less
deleted file mode 100644 (file)
index aca5c15..0000000
+++ /dev/null
@@ -1,341 +0,0 @@
-@import "variables";
-@import "mixins";
-
-@font-face {
-  font-family: 'sonar';
-  src: url('../fonts/sonar.woff') format('woff'),
-       url('../fonts/sonar.svg#sonar') format('svg');
-  font-weight: normal;
-  font-style: normal;
-}
-
-[class^="icon-"], [class*=" icon-"] {
-  font-family: 'sonar';
-  speak: none;
-  font-style: normal;
-  font-weight: normal;
-  font-variant: normal;
-  text-transform: none;
-  line-height: 1;
-  vertical-align: middle;
-
-  /* Better Font Rendering =========== */
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-
-a[class^="icon-"], a[class*=" icon-"] {
-  text-decoration: none !important;
-}
-
-
-/*
- * Severity
- */
-
-[class^="icon-severity-"], [class*=" icon-severity"] {
-  position: relative;
-  top: -1px;
-}
-
-.icon-severity-blocker:before,
-.icon-severity-4:before {
-  content: "\f000";
-  color: @severityBlockerColor;
-  font-size: @iconSmallFontSize;
-}
-.icon-severity-critical:before,
-.icon-severity-3:before {
-  content: "\f001";
-  color: @severityCriticalColor;
-  font-size: @iconSmallFontSize;
-}
-.icon-severity-major:before,
-.icon-severity-2:before {
-  content: "\f002";
-  color: @severityMajorColor;
-  font-size: @iconSmallFontSize;
-}
-.icon-severity-minor:before,
-.icon-severity-1:before {
-  content: "\f003";
-  color: @severityMinorColor;
-  font-size: @iconSmallFontSize;
-}
-.icon-severity-info:before,
-.icon-severity-0:before {
-  content: "\f004";
-  color: @severityInfoColor;
-  font-size: @iconSmallFontSize;
-}
-
-
-/*
- * Status
- */
-
-[class^="icon-status-"], [class*=" icon-status"] {
-  position: relative;
-  top: -1px;
-}
-
-.icon-status-open:before {
-  content: "\f010";
-  color: @statusOpenColor;
-  font-size: @iconSmallFontSize;
-  line-height: @iconLineHeight;
-}
-.icon-status-confirmed:before {
-  content: "\f011";
-  color: @statusConfirmedColor;
-  font-size: @iconSmallFontSize;
-  line-height: @iconLineHeight;
-}
-.icon-status-reopened:before {
-  content: "\f012";
-  color: @statusReopenedColor;
-  font-size: @iconSmallFontSize;
-  line-height: @iconLineHeight;
-}
-.icon-status-resolved:before {
-  content: "\f013";
-  color: @statusResolvedColor;
-  font-size: @iconSmallFontSize;
-  line-height: @iconLineHeight;
-}
-.icon-status-closed:before {
-  content: "\f014";
-  color: @statusClosedColor;
-  font-size: @iconSmallFontSize;
-  line-height: @iconLineHeight;
-}
-
-
-/*
- * Alert
- */
-
-.icon-alert-ok:before {
-  content: "\f013";
-  color: @green;
-  font-size: @iconFontSize;
-}
-.icon-alert-warn:before {
-  content: "\f000";
-  color: @orange;
-  font-size: @iconFontSize;
-}
-.icon-alert-error:before {
-  content: "\f057";
-  color: @red;
-  font-size: @iconFontSize;
-}
-.icon-alert-none:before {
-  content: "\f059";
-  color: @blue;
-  font-size: @iconFontSize;
-}
-
-
-/*
- * Qualifier
- */
-
-.icon-qualifier-dir:before {
-  content: "\f07b";
-  font-size: @iconFontSize;
-}
-.icon-qualifier-fil:before {
-  content: "\f0f6";
-  font-size: @iconFontSize;
-}
-.icon-qualifier-lib:before {
-  content: "\e600";
-  font-size: @iconFontSize;
-}
-
-
-/*
- * Common
- */
-
-.icon-list:before {
-  content: "\f039";
-}
-.icon-bullet-list:before {
-  content: "\f03a";
-}
-.icon-settings:before {
-  content: "\f015";
-}
-.icon-settings-multiple:before {
-  content: "\f085";
-}
-
-.icon-arrow-down:before {
-  content: "\f0d7";
-  position: relative;
-  top: -2px;
-}
-.icon-arrow-up:before {
-  content: "\f0d8";
-  position: relative;
-  top: -2px;
-}
-.icon-arrow-left:before {
-  content: "\f0d9";
-}
-.icon-arrow-right:before {
-  content: "\f0da";
-}
-
-.icon-emoticon-smiley:before {
-  content: "\f118";
-}
-.icon-emoticon-sad:before {
-  content: "\f119";
-}
-.icon-emoticon-speechless:before {
-  content: "\f11a";
-}
-.icon-rect-check:before {
-  content: "\f046";
-}
-.icon-check:before {
-  content: "\f00c";
-}
-.icon-default:before {
-  position: relative;
-  top: -0.1em;
-  content: "\f00c";
-}
-.icon-lang:before {
-  content: "\f024";
-  font-size: @iconSmallFontSize;
-}
-.icon-quality-profile:before {
-  content: "\f022";
-  font-size: @iconSmallFontSize;
-}
-.icon-tags:before {
-  content: "\f02c";
-  font-size: @iconSmallFontSize;
-}
-.icon-calendar:before {
-  position: relative;
-  top: -0.1em;
-  content: "\f073";
-  font-size: @iconSmallFontSize;
-}
-.icon-favorite:before {
-  content: "\f005";
-  color: @orange;
-  font-size: @iconFontSize;
-}
-.icon-not-favorite:before {
-  content: "\f005";
-  color: @darkGrey;
-  font-size: @iconFontSize;
-}
-.icon-help:before {
-  content: "\f059";
-  color: @blue;
-  font-size: @iconFontSize;
-}
-.icon-info:before {
-  content: "\f05a";
-  color: @blue;
-  font-size: @iconFontSize;
-}
-.icon-uniF060:before {
-  content: "\f060";
-}
-.icon-uniF061:before {
-  content: "\f061";
-}
-.icon-uniF062:before {
-  content: "\f062";
-}
-.icon-uniF063:before {
-  content: "\f063";
-}
-.icon-comment:before {
-  content: "\f075";
-}
-.icon-delete:before {
-  content: "\f00d";
-}
-.icon-compare:before {
-  content: "\f0c5";
-}
-.icon-link:before {
-  content: "\f0c1";
-}
-.icon-inheritance:before {
-  content: "\f126";
-  font-size: @iconFontSize;
-}
-.icon-plus:before {
-  content: "\f067";
-}
-
-
-/*
- * Spinner
- */
-
-.spinner {
-  position: relative;
-  vertical-align: middle;
-  .square(16px);
-  border: 2px solid #0cf;
-  border-radius: 50%;
-  .animation(spin 0.75s infinite linear);
-
-  // For IE9 only, because it does not support css animations
-  // Show animated gif
-  .ie9 & {
-    background-image: url(../images/loading.gif);
-    background-repeat: no-repeat;
-    background-position: 0 0;
-    border: none;
-  }
-}
-
-.spinner:before,
-.spinner:after {
-  left: -2px;
-  top: -2px;
-  display: none;
-  position: absolute;
-  content: '';
-  width: inherit;
-  height: inherit;
-  border: inherit;
-  border-radius: inherit;
-}
-
-.spinner,
-.spinner:before,
-.spinner:after {
-  display: inline-block;
-  .box-sizing(border-box);
-  border-color: transparent;
-  border-top-color: @blue;
-  .animation-duration(1.2s);
-}
-.spinner:before {
-  .rotate(120deg);
-}
-.spinner:after {
-  .rotate(240deg);
-}
-
-@-webkit-keyframes spin {
-  from { .rotate(0deg); }
-  to { .rotate(360deg); }
-}
-@keyframes spin {
-  from { .rotate(0deg); }
-  to { .rotate(360deg); }
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/jquery-ui.css b/sonar-server/src/main/webapp/stylesheets/jquery-ui.css
deleted file mode 100644 (file)
index a1d7c97..0000000
+++ /dev/null
@@ -1,372 +0,0 @@
-/*! jQuery UI - v1.10.3 - 2013-06-18
-* http://jqueryui.com
-* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.button.css, jquery.ui.dialog.css
-* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */
-
-/* Layout helpers
-----------------------------------*/
-
-/* SONAR */
-.no-close .ui-dialog-titlebar-close {
-  display: none;
-}
-
-.ui-dialog .ui-dialog-titlebar {
-  display: none;
-}
-
-.ui-widget-header {
-  color: #ffffff;
-  font-weight: bold;
-}
-
-.ui-widget-header a {
-  color: #ffffff;
-}
-
-.ui-widget-shadow {
-  margin: -5px 0 0 -5px;
-  padding: 5px;
-  background: #000000 50% 50% repeat-x;
-  opacity: .20;
-  filter: Alpha(Opacity = 20);
-  -moz-border-radius: 5px;
-  -khtml-border-radius: 5px;
-  -webkit-border-radius: 5px;
-  border-radius: 5px;
-}
-
-.ui-dialog {
-  position: absolute;
-  width: 300px;
-  overflow: hidden;
-  box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.5);
-  background-color: #FFF
-}
-
-/* /SONAR */
-
-.ui-helper-hidden {
-  display: none;
-}
-.ui-helper-hidden-accessible {
-  border: 0;
-  clip: rect(0 0 0 0);
-  height: 1px;
-  margin: -1px;
-  overflow: hidden;
-  padding: 0;
-  position: absolute;
-  width: 1px;
-}
-.ui-helper-reset {
-  margin: 0;
-  padding: 0;
-  border: 0;
-  outline: 0;
-  line-height: 1.3;
-  text-decoration: none;
-  font-size: 100%;
-  list-style: none;
-}
-.ui-helper-clearfix:before,
-.ui-helper-clearfix:after {
-  content: "";
-  display: table;
-  border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
-  clear: both;
-}
-.ui-helper-clearfix {
-  min-height: 0; /* support: IE7 */
-}
-.ui-helper-zfix {
-  width: 100%;
-  height: 100%;
-  top: 0;
-  left: 0;
-  position: absolute;
-  opacity: 0;
-  filter:Alpha(Opacity=0);
-}
-
-.ui-front {
-  z-index: 100;
-}
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled {
-  cursor: default !important;
-}
-
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
-  display: block;
-  text-indent: -99999px;
-  overflow: hidden;
-  background-repeat: no-repeat;
-}
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay {
-  position: fixed;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-  /* sonar */
-  background-color: #000000;
-  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
-  filter: alpha(opacity = 50);
-  opacity: 0.5;
-  /* /sonar */
-}
-
-.ui-resizable {
-  position: relative;
-}
-.ui-resizable-handle {
-  position: absolute;
-  font-size: 0.1px;
-  display: block;
-}
-.ui-resizable-disabled .ui-resizable-handle,
-.ui-resizable-autohide .ui-resizable-handle {
-  display: none;
-}
-.ui-resizable-n {
-  cursor: n-resize;
-  height: 7px;
-  width: 100%;
-  top: -5px;
-  left: 0;
-}
-.ui-resizable-s {
-  cursor: s-resize;
-  height: 7px;
-  width: 100%;
-  bottom: -5px;
-  left: 0;
-}
-.ui-resizable-e {
-  cursor: e-resize;
-  width: 7px;
-  right: -5px;
-  top: 0;
-  height: 100%;
-}
-.ui-resizable-w {
-  cursor: w-resize;
-  width: 7px;
-  left: -5px;
-  top: 0;
-  height: 100%;
-}
-.ui-resizable-se {
-  cursor: se-resize;
-  width: 12px;
-  height: 12px;
-  right: 1px;
-  bottom: 1px;
-}
-.ui-resizable-sw {
-  cursor: sw-resize;
-  width: 9px;
-  height: 9px;
-  left: -5px;
-  bottom: -5px;
-}
-.ui-resizable-nw {
-  cursor: nw-resize;
-  width: 9px;
-  height: 9px;
-  left: -5px;
-  top: -5px;
-}
-.ui-resizable-ne {
-  cursor: ne-resize;
-  width: 9px;
-  height: 9px;
-  right: -5px;
-  top: -5px;
-}
-.ui-button {
-  display: inline-block;
-  position: relative;
-  padding: 0;
-  line-height: normal;
-  margin-right: .1em;
-  cursor: pointer;
-  vertical-align: middle;
-  text-align: center;
-  overflow: visible; /* removes extra width in IE */
-}
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
-  text-decoration: none;
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
-  width: 2.2em;
-}
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
-  width: 2.4em;
-}
-.ui-button-icons-only {
-  width: 3.4em;
-}
-button.ui-button-icons-only {
-  width: 3.7em;
-}
-
-/* button text element */
-.ui-button .ui-button-text {
-  display: block;
-  line-height: normal;
-}
-.ui-button-text-only .ui-button-text {
-  padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
-  padding: .4em;
-  text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
-  padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
-  padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
-  padding-left: 2.1em;
-  padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-input.ui-button {
-  padding: .4em 1em;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
-  position: absolute;
-  top: 50%;
-  margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
-  left: 50%;
-  margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
-  left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
-  right: .5em;
-}
-
-/* button sets */
-.ui-buttonset {
-  margin-right: 7px;
-}
-.ui-buttonset .ui-button {
-  margin-left: 0;
-  margin-right: -.3em;
-}
-
-/* workarounds */
-/* reset extra padding in Firefox, see h5bp.com/l */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
-  border: 0;
-  padding: 0;
-}
-.ui-dialog {
-  position: absolute;
-  top: 0;
-  left: 0;
-  /* sonar
-  padding: .2em;
-  */
-  outline: 0;
-}
-/* sonar
-.ui-dialog .ui-dialog-titlebar {
-  padding: .4em 1em;
-  position: relative;
-}
-.ui-dialog .ui-dialog-title {
-  float: left;
-  margin: .1em 0;
-  white-space: nowrap;
-  width: 90%;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
-  position: absolute;
-  right: .3em;
-  top: 50%;
-  width: 21px;
-  margin: -10px 0 0 0;
-  padding: 1px;
-  height: 20px;
-}
-*/
-.ui-dialog .ui-dialog-content {
-  position: relative;
-  border: 0;
-  /* sonar
-  padding: .5em 1em;
-  */
-  background: none;
-  overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
-  text-align: left;
-  border-width: 1px 0 0 0;
-  background-image: none;
-  margin-top: .5em;
-  padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
-  float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
-  margin: .5em .4em .5em 0;
-  cursor: pointer;
-}
-.ui-dialog .ui-resizable-se {
-  width: 12px;
-  height: 12px;
-  right: -5px;
-  bottom: -5px;
-  background-position: 16px 16px;
-}
-.ui-draggable .ui-dialog-titlebar {
-  cursor: move;
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/layout.css b/sonar-server/src/main/webapp/stylesheets/layout.css
deleted file mode 100644 (file)
index 0e13781..0000000
+++ /dev/null
@@ -1,304 +0,0 @@
-@media print {
-  /* ------------------- PRINT ------------------- */
-  html, body {
-    font-size: 8pt;
-  }
-
-  a, a:link, a:visited {
-    text-decoration: none;
-    border-bottom: 0;
-  }
-
-  .noprint {
-    display: none !important;
-  }
-
-  .print {
-    display: inline;
-    position: static;
-    left: 0;
-  }
-
-  #hd, #sidebar, #crumbs {
-    display: none;
-  }
-
-  .with_sidebar, .wo_sidebar {
-    padding: 0 !important;
-    margin: 0;
-  }
-
-  #content {
-    margin-left: 0 !important;
-  }
-}
-
-@media screen {
-  .print {
-    display: none;
-  }
-}
-
-body, a {
-  color: #444;
-}
-
-/* LAYOUT */
-#container {
-  height: auto !important;
-  min-width: 940px;
-  min-height: 500px;
-}
-
-#hd {
-  color: #FFF;
-  background: #262626;
-  padding: 0 10px;
-  height: 30px;
-  line-height: 30px;
-  font-size: 93%;
-  margin: 0;
-  position: relative;
-}
-
-#hd a {
-  color: #FFF;
-  text-decoration: none;
-}
-
-#hd a.selected {
-  color: #4B9FD5;
-}
-
-#hd a:focus, #hd a:hover {
-  text-decoration: underline;
-}
-
-#nav-left {
-  float: left;
-  vertical-align: middle;
-}
-
-#nav {
-  float: right;
-  padding: 0 0 0 20px;
-  vertical-align: middle;
-}
-
-#nav-left img, #nav img {
-  vertical-align: text-bottom;
-}
-
-#nav-left > ul> li {
-  float: left;
-  padding: 0 20px 0 0;
-}
-
-#nav > ul> li {
-  float: right;
-  padding: 0 0 0 15px;
-}
-
-#searchResourcesResults {
-  position: absolute;
-  float: right;
-  width: 600px;
-  top: 30px;
-  right: 0;
-}
-
-#crumbs {
-  color: #444;
-  background: #EFEFEF;
-  height: 26px;
-  line-height: 26px;
-  font-size: 93%;
-  margin: 0;
-  padding: 0 10px;
-  border-bottom: 1px solid #CCC;
-}
-
-#crumbs img {
-  vertical-align: text-bottom;
-}
-
-#bc li {
-  float: left;
-  background: #EFEFEF url("../images/bc-gray.png") no-repeat right;
-  border-bottom: 1px solid #CCC;
-  padding: 0 20px 0 0;
-  margin: 0 10px 0 0;
-}
-
-#bc li img {
-  margin-right: -5px;
-}
-
-#bc li a {
-  text-decoration: none;
-}
-
-#bc li a:hover, #bc li a:focus {
-  text-decoration: underline;
-}
-
-#crumbs-ops {
-  float: right;
-  padding: 0 5px 0 0;
-}
-
-#crumbs-ops li {
-  float: left;
-  padding: 0 0 0 10px;
-}
-
-#crumbs-ops li a {
-  text-decoration: none;
-}
-
-#crumbs-ops li a:hover, #crumbs-ops li a:focus {
-  text-decoration: underline;
-}
-
-#hd .dropdown-menu a {
-  color: #000;
-}
-
-#project-settings-menu {
-  float: right;
-  right: 20px;
-}
-
-#nonav {
-  text-align: left;
-  margin: 50px 180px 0;
-}
-
-#body {
-  /*  position: relative;*/
-}
-
-#footer {
-  margin: 10px;
-  clear: both;
-}
-
-.with_sidebar {
-  margin: 0 0 0 160px;
-  padding: 10px;
-}
-
-.wo_sidebar {
-  margin: 0 8px;
-}
-
-#sidebar {
-  width: 150px;
-  float: left;
-  margin: 0 0 0 10px;
-  top: 0;
-  left: 0;
-}
-
-ul.sidebar {
-  text-align: left;
-  border-top: none;
-  padding: 10px 0;
-}
-
-ul.sidebar li {
-  list-style-type: none;
-  padding: 3px 10px;
-}
-
-ul.sidebar li a {
-  text-decoration: none;
-}
-
-ul.sidebar li a:hover {
-  text-decoration: underline;
-}
-
-ul.sidebar li.active {
-  background-color: #4b9fd5;
-}
-
-ul.sidebar li.active a, ul.sidebar li.active a:hover {
-  color: #FFF;
-}
-
-ul.sidebar li.active [class^="icon-"],
-ul.sidebar li.active [class*=" icon-"] {
-  color: #FFF;
-}
-
-li.sidebar-title {
-  text-transform: uppercase;
-  font-size: 93%;
-  font-weight: bold;
-}
-
-ul.sidebar li.spacer {
-  border: 0 none;
-  height: 10px;
-  margin: 0;
-  padding: 0;
-}
-
-ul.sidebar select, ul.sidebar input {
-  font-size: 93%;
-}
-
-#logo {
-  text-align: center;
-  padding: 10px 0 0 0;
-}
-
-#logo a {
-  text-decoration: none;
-  border-bottom-width: 0;
-}
-
-#logo img {
-  display: block;
-}
-
-.page {
-  padding: 10px;
-}
-.page-split-left {
-  min-width: 200px;
-  max-width: 200px;
-  width: 200px;
-  margin: 0;
-  display: block;
-  vertical-align: top;
-  border-top: none;
-  border-left: none;
-  float: left;
-}
-
-.page-split-right {
-  display: block;
-  margin: 0;
-  vertical-align: top;
-  padding: 0 0 0 200px;
-}
-
-.gray-sidebar {
-  background-color: #EFEFEF;
-  border: 1px solid #CCC;
-  color: #666;
-  border-top: none;
-}
-
-.blue-sidebar {
-  background-color: #CAE3F2;
-  color: #262626;
-  border: 2px solid #4b9fd5;
-  border-top: none;
-}
-
-.nolayout {
-  padding: 10px;
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/mixins.css b/sonar-server/src/main/webapp/stylesheets/mixins.css
deleted file mode 100644 (file)
index 620cf3a..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * Fonts
- */
-/*
- * Colors
- */
-/*
- * Icons
- */
-/*
- * Transitions
- */
diff --git a/sonar-server/src/main/webapp/stylesheets/mixins.less b/sonar-server/src/main/webapp/stylesheets/mixins.less
deleted file mode 100644 (file)
index 808128c..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-@import "variables";
-
-.clearfix() {
-  &:before, &:after { display: table; content: ""; line-height: 0; }
-  &:after { clear: both; }
-}
-
-.size(@width, @height) {
-  width: @width;
-  height: @height;
-}
-
-.square(@size) {
-  .size(@size, @size);
-}
-
-.topLeft(@top, @left) {
-  top: @top;
-  left: @left;
-}
-
-.topRight(@top, @right) {
-  top: @top;
-  right: @right;
-}
-
-.bottomLeft(@bottom, @left) {
-  bottom: @bottom;
-  left: @left;
-}
-
-.bottomRight(@bottom, @right) {
-  bottom: @bottom;
-  right: @left;
-}
-
-.rotate(@degrees) {
-  -webkit-transform: rotate(@degrees);
-      -ms-transform: rotate(@degrees);
-          transform: rotate(@degrees);
-}
-.scale(@ratio) {
-  -webkit-transform: scale(@ratio);
-      -ms-transform: scale(@ratio);
-          transform: scale(@ratio);
-}
-.scale2(@w, @h) {
-  -webkit-transform: scale(@w, @h);
-      -ms-transform: scale(@w, @h);
-          transform: scale(@w, @h);
-}
-.translate(@x, @y) {
-  -webkit-transform: translate(@x, @y);
-      -ms-transform: translate(@x, @y);
-          transform: translate(@x, @y);
-}
-.skew(@x, @y) {
-  -webkit-transform: skew(@x, @y);
-      -ms-transform: skew(@x, @y);
-          transform: skew(@x, @y);
-}
-.translate3d(@x, @y, @z) {
-  -webkit-transform: translate3d(@x, @y, @z);
-          transform: translate3d(@x, @y, @z);
-}
-
-.box-sizing(@boxmodel) {
-  -moz-box-sizing: @boxmodel;
-       box-sizing: @boxmodel;
-}
-
-.animation(@animation) {
-  -webkit-animation: @animation;
-  animation: @animation;
-}
-.animation-duration(@duration) {
-  -webkit-animation-duration: @duration;
-  animation-duration: @duration;
-}
-
-.horizontal-gradient(@startColor: #555, @endColor: #333) {
-    background-color: @endColor;
-    background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+
-    background-image: -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
-    background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+
-    background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10
-    background-image: linear-gradient(to right, @startColor, @endColor); // Standard, IE10
-    background-repeat: repeat-x;
-}
-.vertical-gradient(@startColor: #555, @endColor: #333) {
-    background-color: mix(@startColor, @endColor, 60%);
-    background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
-    background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+
-    background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10
-    background-image: linear-gradient(to bottom, @startColor, @endColor); // Standard, IE10
-    background-repeat: repeat-x;
-}
-.directional-gradient(@startColor: #555, @endColor: #333, @deg: 45deg) {
-    background-color: @endColor;
-    background-repeat: repeat-x;
-    background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+
-    background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+
-    background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10
-    background-image: linear-gradient(@deg, @startColor, @endColor); // Standard, IE10
-}
-.vertical-three-colors-gradient(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
-    background-color: mix(@midColor, @endColor, 80%);
-    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));
-    background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor);
-    background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop, @endColor);
-    background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor);
-    background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor);
-    background-repeat: no-repeat;
-}
-.radial-gradient(@innerColor: #555, @outerColor: #333)  {
-    background-color: @outerColor;
-    background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@innerColor), to(@outerColor));
-    background-image: -webkit-radial-gradient(circle, @innerColor, @outerColor);
-    background-image: -moz-radial-gradient(circle, @innerColor, @outerColor);
-    background-image: -o-radial-gradient(circle, @innerColor, @outerColor);
-    background-repeat: no-repeat;
-}
-.striped-gradient(@color, @angle: 45deg) {
-    background-color: @color;
-    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));
-    background-image: -webkit-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
-    background-image: -moz-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
-    background-image: -o-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
-    background-image: linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
-}
-
-.trans(@property: all, @options: @defaultTransitionOptions) {
-  transition: @property @options;
-}
-
-.webkit-scrollbar() {
-  &::-webkit-scrollbar {
-    width: 11px;
-    background-color: transparent;
-    background-clip: content-box;
-  }
-  &::-webkit-scrollbar-button {
-    background-color: transparent;
-  }
-  &::-webkit-scrollbar-corner {
-    background-color: transparent;
-  }
-  &::-webkit-scrollbar-thumb {
-    border: solid transparent;
-    border-width: 1px 1px 1px 2px;
-    background-color: #c5c5c5;
-    background-clip: content-box;
-
-    &:hover {
-      background-color: darken(#ccc, 5%);
-    }
-  }
-  &::-webkit-scrollbar-track {
-    border: solid #fff;
-    border-width: 1px 1px 1px 2px;
-    background-color: #fff;
-    background-clip: content-box;
-  }
-  &::-webkit-scrollbar-track-piece {
-    border-left: 1px solid #ccc;
-    background-color: transparent;
-  }
-}
-
-@retina: ~"(-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi)";
diff --git a/sonar-server/src/main/webapp/stylesheets/navigator.css b/sonar-server/src/main/webapp/stylesheets/navigator.css
deleted file mode 100644 (file)
index d274b55..0000000
+++ /dev/null
@@ -1,713 +0,0 @@
-/*
- * Fonts
- */
-/*
- * Colors
- */
-/*
- * Icons
- */
-/*
- * Transitions
- */
-.navigator-header {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  top: 30px;
-  left: 0;
-  width: 100%;
-  height: 37px;
-}
-.navigator-filters {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  top: 67px;
-  left: 0;
-  width: 100%;
-  height: 37px;
-}
-.navigator-facets {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  top: 104px;
-  left: 0;
-  width: 100%;
-  height: 90px;
-}
-.navigator-results {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-  top: 134px;
-  bottom: 0;
-  left: 0;
-  width: 319px;
-}
-.navigator-details {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  top: 104px;
-  bottom: 35px;
-  left: 320px;
-  right: 0;
-}
-.navigator-actions {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  top: 104px;
-  left: 0;
-  width: 320px;
-  height: 30px;
-}
-.navigator-notes {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  top: 104px;
-  left: 0;
-  width: 100%;
-  height: 20px;
-  display: none;
-}
-.measures-page .navigator-results {
-  top: 104px;
-  left: 0;
-  bottom: 36px;
-  width: 100%;
-}
-.navigator-with-notes .navigator-actions,
-.navigator-with-notes .navigator-details {
-  top: 124px;
-}
-.navigator-with-notes .navigator-results {
-  top: 154px;
-}
-.navigator-with-notes .navigator-notes {
-  display: block;
-}
-.navigator-with-notes .navigator-details .source_title {
-  top: 124px;
-}
-.navigator-with-notes .navigator-fetching.navigator-results-list:before {
-  top: 154px;
-}
-.navigator-fetching:before {
-  content: " ";
-  position: absolute;
-  z-index: 3;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  background: #ffffff url(../images/loading.gif) no-repeat 4px 4px;
-}
-.navigator-fetching#tab-issue-rule {
-  position: relative;
-}
-.navigator-fetching#tab-issue-rule:before {
-  z-index: 3;
-  background-color: #EFEFEF;
-}
-.navigator-fetching.code-issue-actions {
-  position: relative;
-}
-.navigator-fetching.code-issue-actions:before {
-  z-index: 3;
-  background-color: #E4ECF3;
-}
-.navigator-page-loader {
-  padding: 10px 0 0 10px;
-}
-.navigator-header {
-  padding: 0 10px;
-  border-bottom: 1px solid #cdcdcd;
-  background-color: #efefef;
-  font-size: 0;
-}
-.navigator-header-favorite {
-  padding-left: 46px;
-}
-.navigator-header-title {
-  display: inline-block;
-  vertical-align: middle;
-  font-size: 20px;
-  line-height: 37px;
-}
-.navigator-header-title-note {
-  vertical-align: middle;
-  color: #777;
-  font-size: 11px;
-}
-.navigator-header-description {
-  display: inline-block;
-  vertical-align: middle;
-  margin-left: 16px;
-  font-size: 11px;
-  font-style: italic;
-}
-.navigator-header-actions {
-  margin-left: 20px;
-}
-.navigator-header-actions > a {
-  vertical-align: middle;
-  margin: 0 8px;
-  font-size: 11px;
-}
-.navigator-header-menu-toggle {
-  display: inline-block;
-  vertical-align: top;
-  height: 36px;
-  margin-right: 10px;
-  margin-left: -10px;
-  padding: 10px;
-  border-right: 1px solid transparent;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  cursor: pointer;
-  transition: all 0.3s ease;
-}
-.navigator-header-menu-toggle:hover {
-  background-color: #e2e2e2;
-}
-.navigator-header-menu-toggle.active {
-  border-color: #cdcdcd;
-  background-color: #fff;
-}
-.navigator-header-menu-toggle [class^="icon-"],
-.navigator-header-menu-toggle [class*=" icon-"] {
-  font-size: 16px;
-}
-.navigator-notes {
-  padding: 0 10px;
-  border-bottom: 1px solid #cdcdcd;
-  background-color: #efefef;
-  color: #777;
-  font-size: 11px;
-  line-height: 20px;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.navigator-facets {
-  padding: 10px;
-  border-bottom: 1px solid #cdcdcd;
-  background-color: #efefef;
-}
-.navigator-facets-list-item {
-  font-size: 0;
-}
-.navigator-facets-list-item + .navigator-facets-list-item {
-  margin-top: 10px;
-}
-.navigator-facets-list-item-name {
-  display: inline-block;
-  vertical-align: middle;
-  margin-right: 10px;
-  font-size: 13px;
-  font-weight: bold;
-  text-transform: uppercase;
-}
-.navigator-facets-list-item-options {
-  display: inline-block;
-  vertical-align: middle;
-}
-.navigator-facets-list-item-option {
-  display: inline-block;
-  vertical-align: middle;
-  margin: 0 10px;
-  font-size: 13px;
-  cursor: pointer;
-}
-.navigator-facets-list-item-option:hover .navigator-facets-list-item-option-name {
-  text-decoration: underline;
-}
-.navigator-facets-list-item-option.active .navigator-facets-list-item-option-name {
-  font-weight: bold;
-  text-decoration: underline;
-}
-.navigator-facets-list-item-option-stat:before {
-  content: "(";
-}
-.navigator-facets-list-item-option-stat:after {
-  content: ")";
-}
-.navigator-results {
-  border-right: 1px solid #e1e1e1;
-  background-color: #ffffff;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.navigator-results-list > li {
-  padding: 5px 0;
-  border-top: 1px solid transparent;
-  cursor: pointer;
-  transition: all 0.3s ease;
-}
-.navigator-results-list > li .line {
-  padding: 5px 10px;
-  line-height: 1.2;
-}
-.navigator-results-list > li .line-small {
-  font-size: 11px;
-  line-height: 14px;
-}
-.navigator-results-list > li .line-right {
-  float: right;
-}
-.navigator-results-list > li .line-nowrap {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.navigator-results-list > li:hover {
-  background-color: #efefef;
-}
-.navigator-results-list > li.active {
-  background-color: #CAE3F2;
-  border-color: #4B9FD5;
-}
-.navigator-results-list > li.with-context {
-  border-right: 6px solid #e1e1e1;
-}
-.navigator-results-list > li:last-child {
-  border-bottom: 1px solid transparent;
-}
-.navigator-results-list > li:last-child.active {
-  border-bottom-color: #4B9FD5;
-}
-.navigator-results-list > li + li {
-  border-top-color: #e1e1e1;
-}
-.navigator-results-list > li.active + li {
-  border-top-color: #4B9FD5;
-}
-.navigator-results-list.navigator-fetching > li .line-nowrap {
-  text-overflow: clip;
-  /* thanks to FF */
-
-}
-.navigator-results-list.navigator-fetching:before {
-  position: fixed;
-  z-index: 3;
-  top: 134px;
-  bottom: 0;
-  left: 0;
-  width: 319px;
-}
-.navigator-results-no-results {
-  padding-top: 20% !important;
-  background: #fff !important;
-  color: #999;
-  cursor: default !important;
-  text-align: center;
-}
-.navigator-details {
-  padding: 10px;
-  background-color: #ffffff;
-  overflow: auto;
-}
-.issues-page .navigator-details {
-  padding-top: 62px;
-  padding-right: 0;
-}
-.navigator-details.loading {
-  background: #ffffff url("../images/loading.gif") no-repeat 4px 2px;
-}
-.navigator-details .code-issue-name {
-  border-bottom: none;
-}
-.navigator-details .code-issue-actions {
-  background-color: #E4ECF3;
-}
-.navigator-details .source_title {
-  position: fixed;
-  z-index: 3;
-  top: 104px;
-  left: 320px;
-  right: 0;
-  padding: 10px;
-  border-bottom: 1px solid #e1e1e1;
-  background-color: #fff;
-}
-.navigator-details .source {
-  padding-right: 10px;
-}
-.navigator-details .source > table {
-  border: 1px solid #DDD;
-}
-.navigator-details .scm .author {
-  display: inline-block;
-  vertical-align: middle;
-  max-width: 100px;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.navigator-actions {
-  padding: 0 10px 0 0;
-  border-right: 1px solid #e1e1e1;
-  border-bottom: 1px solid #e1e1e1;
-  background-color: #efefef;
-  font-size: 11px;
-}
-.navigator-actions strong {
-  font-weight: bold;
-}
-.navigator-actions-order {
-  float: left;
-  padding: 0 10px;
-  line-height: 30px;
-  cursor: pointer;
-  transition: all 0.3s ease;
-}
-.navigator-actions-order:hover {
-  background-color: #efefef;
-}
-.navigator-actions-order-choices {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  top: 134px;
-  left: 0;
-  min-width: 160px;
-  background-color: #fff;
-  border-bottom: 1px solid #e1e1e1;
-  border-right: 1px solid #e1e1e1;
-  overflow: hidden;
-  display: none;
-}
-.navigator-actions-order-choices > li {
-  height: 30px;
-  line-height: 30px;
-  padding: 0 10px;
-  cursor: pointer;
-  transition: all 0.3s ease;
-}
-.navigator-actions-order-choices > li:hover {
-  background-color: #efefef;
-}
-.navigator-actions-order-choices.open {
-  display: block;
-}
-.navigator-actions-total {
-  float: right;
-  line-height: 26px;
-}
-.navigator-actions-bulk {
-  position: relative;
-  top: -1px;
-  margin-left: 8px;
-  font-size: 16px;
-  text-decoration: none;
-}
-.navigator-page #footer {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  bottom: 0;
-  left: 320px;
-  right: 0;
-  margin: 0;
-  border-top: 1px solid #e1e1e1;
-}
-.navigator-page #ftlinks {
-  margin-top: 0;
-}
-.measures-page #footer {
-  left: 0;
-}
-.navigator-filters {
-  border-bottom: 1px solid #cdcdcd;
-  background-color: #efefef;
-  font-size: 0;
-}
-.navigator-filters-list {
-  display: inline-block;
-  vertical-align: middle;
-  margin-bottom: -1px;
-  font-size: 0;
-}
-.navigator-filter-submit,
-.navigator-filter-new-search {
-  vertical-align: middle;
-  margin-left: 15px;
-  font-size: 13px;
-}
-.navigator-filter-list-favorite {
-  position: relative;
-  padding-left: 36px;
-  overflow: hidden;
-}
-.navigator-filters-actions {
-  display: inline-block;
-  vertical-align: middle;
-  margin-left: 20px;
-  font-size: 13px;
-}
-.navigator-filter {
-  display: inline-block;
-  vertical-align: top;
-  height: 36px;
-  line-height: 36px;
-  margin: -1px 0 0;
-  padding: 0 10px;
-  border: 1px solid transparent;
-  white-space: nowrap;
-  cursor: pointer;
-  transition: background 0.3s ease;
-}
-.navigator-filter:hover {
-  background-color: #e2e2e2;
-}
-.navigator-filter.active {
-  border-color: #cdcdcd;
-  background: #fff;
-}
-.navigator-filter-disabled {
-  display: none;
-}
-.navigator-filter-optional {
-  padding-right: 0;
-}
-.navigator-filter-inline,
-.navigator-filter-read-only,
-.navigator-filter-inactive {
-  cursor: default;
-}
-.navigator-filter-inline:hover,
-.navigator-filter-read-only:hover,
-.navigator-filter-inactive:hover,
-.navigator-filter-inline.active,
-.navigator-filter-read-only.active,
-.navigator-filter-inactive.active {
-  border-color: transparent;
-  background: transparent;
-}
-.navigator-filter-inline .navigator-filter-label:after {
-  content: "";
-}
-.navigator-filter-inactive {
-  opacity: 0.5;
-}
-.navigator-filter-label {
-  display: inline-block;
-  vertical-align: middle;
-  margin-right: 5px;
-  color: #333;
-  font-size: 13px;
-}
-.navigator-filter-label:after {
-  content: ":";
-}
-.navigator-filter-value {
-  display: inline-block;
-  vertical-align: middle;
-  max-width: 120px;
-  color: #333;
-  font-size: 13px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.navigator-filter-value.default {
-  color: #666;
-}
-.navigator-filter-disable {
-  display: inline-block;
-  vertical-align: middle;
-  width: 20px;
-  height: 20px;
-  line-height: 20px;
-  margin: 0 0 0 5px;
-  font-size: 18px;
-  text-align: center;
-  transition: background 0.3s ease;
-}
-.navigator-filter-disable:hover {
-  background-color: #d0d0d0;
-}
-.navigator-filter-range-input {
-  width: 120px;
-}
-.navigator-filter-details {
-  display: none;
-  position: absolute;
-  z-index: 1200;
-  min-width: 100px;
-  border: 1px solid #cdcdcd;
-  background: #fff;
-  box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.5);
-  font-size: 13px;
-  transition: opacity 0.3s ease;
-}
-.navigator-filter-details.active {
-  display: block;
-}
-.navigator-filter-details-inner {
-  max-width: 300px;
-  padding: 5px 10px;
-}
-.navigator-filter-details-inner .select2-container,
-.navigator-filter-details-inner input {
-  margin: 5px 0;
-  vertical-align: middle;
-}
-.navigator-filter-select-list {
-  min-width: 150px;
-  max-width: 300px;
-  max-height: 182px;
-  padding: 5px 0;
-  overflow-y: auto;
-}
-.navigator-filter-select-list::-webkit-scrollbar {
-  width: 11px;
-  background-color: transparent;
-  background-clip: content-box;
-}
-.navigator-filter-select-list::-webkit-scrollbar-button {
-  background-color: transparent;
-}
-.navigator-filter-select-list::-webkit-scrollbar-corner {
-  background-color: transparent;
-}
-.navigator-filter-select-list::-webkit-scrollbar-thumb {
-  border: solid transparent;
-  border-width: 1px 1px 1px 2px;
-  background-color: #c5c5c5;
-  background-clip: content-box;
-}
-.navigator-filter-select-list::-webkit-scrollbar-thumb:hover {
-  background-color: #bfbfbf;
-}
-.navigator-filter-select-list::-webkit-scrollbar-track {
-  border: solid #fff;
-  border-width: 1px 1px 1px 2px;
-  background-color: #fff;
-  background-clip: content-box;
-}
-.navigator-filter-select-list::-webkit-scrollbar-track-piece {
-  border-left: 1px solid #ccc;
-  background-color: transparent;
-}
-.navigator-filter-select-list label {
-  display: block;
-  padding: 5px 10px;
-  transition: background 0.3s ease;
-  cursor: pointer;
-  white-space: nowrap;
-  overflow: hidden;
-}
-.navigator-filter-select-list label:hover,
-.navigator-filter-select-list label.current {
-  background-color: #ededed;
-}
-.navigator-filter-select-list label > input[type=checkbox] {
-  vertical-align: baseline;
-  cursor: pointer;
-}
-.navigator-filter-select-list label > img {
-  vertical-align: text-bottom;
-}
-.navigator-filter-select-list label > span {
-  display: inline-block;
-  vertical-align: top;
-  width: 86%;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.navigator-filter-select-list label.special {
-  font-style: italic;
-}
-.navigator-filter-select-list label.special > span {
-  text-decoration: underline;
-}
-.navigator-filter-select-list label.inactive {
-  cursor: default;
-  opacity: 0.5;
-}
-.navigator-filter-select-list label.inactive:hover {
-  background-color: transparent;
-}
-.navigator-filter-select-list .single {
-  padding: 5px 10px;
-}
-.navigator-filter-select-list .line {
-  height: 1px;
-  margin: 5px 0;
-  background: #cdcdcd;
-}
-.navigator-filter-select-list:not(.hidden) + .navigator-filter-select-list {
-  margin-top: 5px;
-  border-top: 1px solid #cdcdcd;
-}
-.navigator-filter-search {
-  position: relative;
-  margin: 10px 26px 10px 10px;
-}
-.navigator-filter-search input {
-  width: 100%;
-  height: 26px;
-  padding: 0 7px;
-  border: 1px solid #cdcdcd;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.fetching .navigator-filter-search:after {
-  content: ' ';
-  position: absolute;
-  top: 6px;
-  right: -21px;
-  display: block;
-  width: 16px;
-  height: 16px;
-  background: #ffffff url(../images/loading.gif) no-repeat center center;
-}
-.navigator-filter-load-more {
-  display: none;
-  height: 26px;
-  line-height: 26px;
-  background-color: #efefef;
-  text-align: center;
-  cursor: pointer;
-  transition: background 0.3s ease;
-}
-.navigator-filter-load-more:hover {
-  background-color: #dddddd;
-}
-.navigator-filter-favorite {
-  position: absolute;
-  top: -100%;
-  left: 0;
-  border-top: none;
-}
-.navigator-filter-favorite-toggle {
-  width: 16px;
-  height: 37px;
-  background: url('../images/navigator/favorite-filters.png') no-repeat center center;
-}
-@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
-  .navigator-filter-favorite-toggle {
-    background-image: url(../images/navigator/favorite-filters@2x.png);
-    background-size: 16px 14px;
-  }
-}
-.navigator-filter-more-criteria {
-  font-size: 13px;
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/navigator.less b/sonar-server/src/main/webapp/stylesheets/navigator.less
deleted file mode 100644 (file)
index ab9401b..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-@import "mixins";
-@import "variables";
-
-@import "navigator/config";
-@import "navigator/base";
-@import "navigator/filters";
diff --git a/sonar-server/src/main/webapp/stylesheets/navigator/base.css b/sonar-server/src/main/webapp/stylesheets/navigator/base.css
deleted file mode 100644 (file)
index 3ba6790..0000000
+++ /dev/null
@@ -1,434 +0,0 @@
-/*
- * Fonts
- */
-/*
- * Colors
- */
-/*
- * Icons
- */
-/*
- * Transitions
- */
-.navigator-header {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  top: 30px;
-  left: 0;
-  width: 100%;
-  height: 37px;
-}
-.navigator-filters {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  top: 67px;
-  left: 0;
-  width: 100%;
-  height: 37px;
-}
-.navigator-facets {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  top: 104px;
-  left: 0;
-  width: 100%;
-  height: 90px;
-}
-.navigator-results {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-  top: 134px;
-  bottom: 0;
-  left: 0;
-  width: 319px;
-}
-.navigator-details {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  top: 104px;
-  bottom: 35px;
-  left: 320px;
-  right: 0;
-}
-.navigator-actions {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  top: 104px;
-  left: 0;
-  width: 320px;
-  height: 30px;
-}
-.navigator-notes {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  top: 104px;
-  left: 0;
-  width: 100%;
-  height: 20px;
-  display: none;
-}
-.measures-page .navigator-results {
-  top: 104px;
-  left: 0;
-  bottom: 36px;
-  width: 100%;
-}
-.navigator-with-notes .navigator-actions,
-.navigator-with-notes .navigator-details {
-  top: 124px;
-}
-.navigator-with-notes .navigator-results {
-  top: 154px;
-}
-.navigator-with-notes .navigator-notes {
-  display: block;
-}
-.navigator-with-notes .navigator-details .source_title {
-  top: 124px;
-}
-.navigator-with-notes .navigator-fetching.navigator-results-list:before {
-  top: 154px;
-}
-.navigator-fetching:before {
-  content: " ";
-  position: absolute;
-  z-index: 3;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  background: #ffffff url(../images/loading.gif) no-repeat 4px 4px;
-}
-.navigator-fetching#tab-issue-rule {
-  position: relative;
-}
-.navigator-fetching#tab-issue-rule:before {
-  z-index: 3;
-  background-color: #EFEFEF;
-}
-.navigator-fetching.code-issue-actions {
-  position: relative;
-}
-.navigator-fetching.code-issue-actions:before {
-  z-index: 3;
-  background-color: #E4ECF3;
-}
-.navigator-page-loader {
-  padding: 10px 0 0 10px;
-}
-.navigator-header {
-  padding: 0 10px;
-  border-bottom: 1px solid #cdcdcd;
-  background-color: #efefef;
-  font-size: 0;
-}
-.navigator-header-favorite {
-  padding-left: 46px;
-}
-.navigator-header-title {
-  display: inline-block;
-  vertical-align: middle;
-  font-size: 20px;
-  line-height: 37px;
-}
-.navigator-header-title-note {
-  vertical-align: middle;
-  color: #777;
-  font-size: 11px;
-}
-.navigator-header-description {
-  display: inline-block;
-  vertical-align: middle;
-  margin-left: 16px;
-  font-size: 11px;
-  font-style: italic;
-}
-.navigator-header-actions {
-  margin-left: 20px;
-}
-.navigator-header-actions > a {
-  vertical-align: middle;
-  margin: 0 8px;
-  font-size: 11px;
-}
-.navigator-header-menu-toggle {
-  display: inline-block;
-  vertical-align: top;
-  height: 36px;
-  margin-right: 10px;
-  margin-left: -10px;
-  padding: 10px;
-  border-right: 1px solid transparent;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  cursor: pointer;
-  transition: all 0.3s ease;
-}
-.navigator-header-menu-toggle:hover {
-  background-color: #e2e2e2;
-}
-.navigator-header-menu-toggle.active {
-  border-color: #cdcdcd;
-  background-color: #fff;
-}
-.navigator-header-menu-toggle [class^="icon-"],
-.navigator-header-menu-toggle [class*=" icon-"] {
-  font-size: 16px;
-}
-.navigator-notes {
-  padding: 0 10px;
-  border-bottom: 1px solid #cdcdcd;
-  background-color: #efefef;
-  color: #777;
-  font-size: 11px;
-  line-height: 20px;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.navigator-facets {
-  padding: 10px;
-  border-bottom: 1px solid #cdcdcd;
-  background-color: #efefef;
-}
-.navigator-facets-list-item {
-  font-size: 0;
-}
-.navigator-facets-list-item + .navigator-facets-list-item {
-  margin-top: 10px;
-}
-.navigator-facets-list-item-name {
-  display: inline-block;
-  vertical-align: middle;
-  margin-right: 10px;
-  font-size: 13px;
-  font-weight: bold;
-  text-transform: uppercase;
-}
-.navigator-facets-list-item-options {
-  display: inline-block;
-  vertical-align: middle;
-}
-.navigator-facets-list-item-option {
-  display: inline-block;
-  vertical-align: middle;
-  margin: 0 10px;
-  font-size: 13px;
-  cursor: pointer;
-}
-.navigator-facets-list-item-option:hover .navigator-facets-list-item-option-name {
-  text-decoration: underline;
-}
-.navigator-facets-list-item-option.active .navigator-facets-list-item-option-name {
-  font-weight: bold;
-  text-decoration: underline;
-}
-.navigator-facets-list-item-option-stat:before {
-  content: "(";
-}
-.navigator-facets-list-item-option-stat:after {
-  content: ")";
-}
-.navigator-results {
-  border-right: 1px solid #e1e1e1;
-  background-color: #ffffff;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.navigator-results-list > li {
-  padding: 5px 0;
-  border-top: 1px solid transparent;
-  cursor: pointer;
-  transition: all 0.3s ease;
-}
-.navigator-results-list > li .line {
-  padding: 5px 10px;
-  line-height: 1.2;
-}
-.navigator-results-list > li .line-small {
-  font-size: 11px;
-  line-height: 14px;
-}
-.navigator-results-list > li .line-right {
-  float: right;
-}
-.navigator-results-list > li .line-nowrap {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.navigator-results-list > li:hover {
-  background-color: #efefef;
-}
-.navigator-results-list > li.active {
-  background-color: #CAE3F2;
-  border-color: #4B9FD5;
-}
-.navigator-results-list > li.with-context {
-  border-right: 6px solid #e1e1e1;
-}
-.navigator-results-list > li:last-child {
-  border-bottom: 1px solid transparent;
-}
-.navigator-results-list > li:last-child.active {
-  border-bottom-color: #4B9FD5;
-}
-.navigator-results-list > li + li {
-  border-top-color: #e1e1e1;
-}
-.navigator-results-list > li.active + li {
-  border-top-color: #4B9FD5;
-}
-.navigator-results-list.navigator-fetching > li .line-nowrap {
-  text-overflow: clip;
-  /* thanks to FF */
-
-}
-.navigator-results-list.navigator-fetching:before {
-  position: fixed;
-  z-index: 3;
-  top: 134px;
-  bottom: 0;
-  left: 0;
-  width: 319px;
-}
-.navigator-results-no-results {
-  padding-top: 20% !important;
-  background: #fff !important;
-  color: #999;
-  cursor: default !important;
-  text-align: center;
-}
-.navigator-details {
-  padding: 10px;
-  background-color: #ffffff;
-  overflow: auto;
-}
-.issues-page .navigator-details {
-  padding-top: 62px;
-  padding-right: 0;
-}
-.navigator-details.loading {
-  background: #ffffff url("../images/loading.gif") no-repeat 4px 2px;
-}
-.navigator-details .code-issue-name {
-  border-bottom: none;
-}
-.navigator-details .code-issue-actions {
-  background-color: #E4ECF3;
-}
-.navigator-details .source_title {
-  position: fixed;
-  z-index: 3;
-  top: 104px;
-  left: 320px;
-  right: 0;
-  padding: 10px;
-  border-bottom: 1px solid #e1e1e1;
-  background-color: #fff;
-}
-.navigator-details .source {
-  padding-right: 10px;
-}
-.navigator-details .source > table {
-  border: 1px solid #DDD;
-}
-.navigator-details .scm .author {
-  display: inline-block;
-  vertical-align: middle;
-  max-width: 100px;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.navigator-actions {
-  padding: 0 10px 0 0;
-  border-right: 1px solid #e1e1e1;
-  border-bottom: 1px solid #e1e1e1;
-  background-color: #efefef;
-  font-size: 11px;
-}
-.navigator-actions strong {
-  font-weight: bold;
-}
-.navigator-actions-order {
-  float: left;
-  padding: 0 10px;
-  line-height: 30px;
-  cursor: pointer;
-  transition: all 0.3s ease;
-}
-.navigator-actions-order:hover {
-  background-color: #efefef;
-}
-.navigator-actions-order-choices {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  top: 134px;
-  left: 0;
-  min-width: 160px;
-  background-color: #fff;
-  border-bottom: 1px solid #e1e1e1;
-  border-right: 1px solid #e1e1e1;
-  overflow: hidden;
-  display: none;
-}
-.navigator-actions-order-choices > li {
-  height: 30px;
-  line-height: 30px;
-  padding: 0 10px;
-  cursor: pointer;
-  transition: all 0.3s ease;
-}
-.navigator-actions-order-choices > li:hover {
-  background-color: #efefef;
-}
-.navigator-actions-order-choices.open {
-  display: block;
-}
-.navigator-actions-total {
-  float: right;
-  line-height: 26px;
-}
-.navigator-actions-bulk {
-  position: relative;
-  top: -1px;
-  margin-left: 8px;
-  font-size: 16px;
-  text-decoration: none;
-}
-.navigator-page #footer {
-  position: fixed;
-  z-index: 2;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  bottom: 0;
-  left: 320px;
-  right: 0;
-  margin: 0;
-  border-top: 1px solid #e1e1e1;
-}
-.navigator-page #ftlinks {
-  margin-top: 0;
-}
-.measures-page #footer {
-  left: 0;
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/navigator/base.less b/sonar-server/src/main/webapp/stylesheets/navigator/base.less
deleted file mode 100644 (file)
index 35c2b42..0000000
+++ /dev/null
@@ -1,524 +0,0 @@
-@import "../variables";
-@import "../mixins";
-
-@import "config";
-
-
-.navigator { }
-
-
-.navigator-element() {
-  position: fixed;
-  z-index: 2;
-  .box-sizing(border-box);
-}
-
-.navigator-header {
-  .navigator-element;
-  top: @navigatorTopOffset;
-  left: 0;
-  .size(100%, @navigatorHeaderHeight);
-}
-
-.navigator-filters {
-  .navigator-element;
-  top: @navigatorTopOffset + @navigatorHeaderHeight;
-  left: 0;
-  .size(100%, @navigatorFiltersHeight);
-}
-
-.navigator-facets {
-  .navigator-element;
-  top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight;
-  left: 0;
-  .size(100%, @navigatorFacetsHeight);
-}
-
-.navigator-results {
-  .navigator-element;
-  .box-sizing(content-box);
-  top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight + @navigatorStatusHeight;
-  bottom: 0;
-  left: 0;
-  width: @navigatorResultsWidth - 1px;
-}
-
-.navigator-details {
-  .navigator-element;
-  top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight;
-  bottom: @navigatorBottomOffset;
-  left: @navigatorResultsWidth;
-  right: 0;
-}
-
-.navigator-actions {
-  .navigator-element;
-  top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight;
-  left: 0;
-  .size(@navigatorResultsWidth, @navigatorStatusHeight);
-}
-
-.navigator-notes {
-  .navigator-element;
-  top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight;
-  left: 0;
-  .size(100%, @navigatorNotesHeight);
-  display: none;
-}
-
-
-.measures-page {
-  .navigator-results {
-    top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight;
-    left: 0;
-    bottom: 36px;
-    width: 100%;
-  }
-}
-
-
-.navigator-with-notes {
-
-  .navigator-actions,
-  .navigator-details {
-    top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight + @navigatorNotesHeight;
-  }
-
-  .navigator-results {
-    top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight + @navigatorNotesHeight + @navigatorStatusHeight;
-  }
-
-  .navigator-notes {
-    display: block;
-  }
-
-  .navigator-details .source_title {
-    top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight + @navigatorNotesHeight;
-  }
-
-  .navigator-fetching.navigator-results-list:before {
-    top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight + @navigatorStatusHeight + @navigatorNotesHeight;
-  }
-
-}
-
-
-.navigator-fetching {
-  &:before {
-    content: " ";
-    position: absolute;
-    z-index: 3;
-    top: 0; bottom: 0; left: 0; right: 0;
-    background: #fff url(../images/loading.gif) no-repeat 4px 4px;
-  }
-
-  &#tab-issue-rule {
-    position: relative;
-
-    &:before {
-      z-index: 3;
-      background-color: #EFEFEF;
-    }
-  }
-
-  &.code-issue-actions {
-    position: relative;
-
-    &:before {
-      z-index: 3;
-      background-color: #E4ECF3;
-    }
-  }
-}
-
-
-.navigator-page-loader {
-  padding: @navigatorPadding 0 0 @navigatorPadding;
-}
-
-
-
-// Header
-.navigator-header {
-  padding: 0 @navigatorPadding;
-  border-bottom: 1px solid @navigatorBorderColor;
-  background-color: @navigatorBarBackground;
-  font-size: 0;
-}
-
-.navigator-header-favorite {
-  padding-left: 46px;
-}
-
-.navigator-header-title {
-  display: inline-block;
-  vertical-align: middle;
-  font-size: 20px;
-  line-height: @navigatorHeaderHeight;
-}
-
-.navigator-header-title-note {
-  vertical-align: middle;
-  color: #777;
-  font-size: @smallFontSize;
-}
-
-.navigator-header-description {
-  display: inline-block;
-  vertical-align: middle;
-  margin-left: 16px;
-  font-size: @smallFontSize;
-  font-style: italic;
-}
-
-.navigator-header-actions {
-  margin-left: 20px;
-
-  & > a {
-    vertical-align: middle;
-    margin: 0 8px;
-    font-size: @smallFontSize;
-  }
-}
-
-.navigator-header-menu-toggle {
-  display: inline-block;
-  vertical-align: top;
-  height: 36px;
-  margin-right: 10px;
-  margin-left: -10px;
-  padding: 10px;
-  border-right: 1px solid transparent;
-  .box-sizing(border-box);
-  cursor: pointer;
-  .trans;
-
-  &:hover {
-    background-color: @navigatorHover;
-  }
-
-  &.active {
-    border-color: #cdcdcd;
-    background-color: #fff;
-  }
-
-  [class^="icon-"], [class*=" icon-"] {
-    font-size: 16px;
-  }
-}
-
-
-
-// Notes
-.navigator-notes {
-  padding: 0 @navigatorPadding;
-  border-bottom: 1px solid @navigatorBorderColor;
-  background-color: @navigatorBarBackground;
-
-  color: #777;
-  font-size: @smallFontSize;
-  line-height: @navigatorNotesHeight;
-
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-
-
-// Facets
-.navigator-facets {
-  padding: @navigatorPadding;
-  border-bottom: 1px solid @navigatorBorderColor;
-  background-color: @navigatorBarBackground;
-}
-
-.navigator-facets-list {
-
-}
-
-.navigator-facets-list-item {
-  font-size: 0;
-}
-
-.navigator-facets-list-item + .navigator-facets-list-item {
-  margin-top: @navigatorPadding;
-}
-
-.navigator-facets-list-item-name {
-  display: inline-block;
-  vertical-align: middle;
-  margin-right: @navigatorPadding;
-  font-size: @baseFontSize;
-  font-weight: bold;
-  text-transform: uppercase;
-}
-
-.navigator-facets-list-item-options {
-  display: inline-block;
-  vertical-align: middle;
-}
-
-.navigator-facets-list-item-option {
-  display: inline-block;
-  vertical-align: middle;
-  margin: 0 @navigatorPadding;
-  font-size: @baseFontSize;
-  cursor: pointer;
-
-  &:hover {
-    .navigator-facets-list-item-option-name {
-      text-decoration: underline;
-    }
-  }
-
-  &.active {
-    .navigator-facets-list-item-option-name {
-      font-weight: bold;
-      text-decoration: underline;
-    }
-  }
-}
-
-.navigator-facets-list-item-option-name {
-
-}
-
-.navigator-facets-list-item-option-stat {
-  &:before { content: "("; }
-  &:after { content: ")"; }
-}
-
-
-
-// Results
-.navigator-results {
-  border-right: 1px solid @navigatorBorderLightColor;
-  background-color: @white;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-.navigator-results-list {
-
-  & > li {
-    padding: @navigatorPadding / 2 0;
-    border-top: 1px solid transparent;
-    cursor: pointer;
-    .trans;
-
-    .line {
-      padding: @navigatorPadding / 2 @navigatorPadding;
-      line-height: 1.2;
-    }
-
-    .line-small {
-      font-size: 11px;
-      line-height: 14px;
-    }
-
-    .line-right {
-      float: right;
-    }
-
-    .line-nowrap {
-      overflow: hidden;
-      text-overflow: ellipsis;
-      white-space: nowrap;
-    }
-
-    &:hover {
-      background-color: @navigatorBarBackground;
-    }
-
-    &.active {
-      background-color: #CAE3F2;
-      border-color: #4B9FD5;
-    }
-
-    &.with-context {
-      border-right: 6px solid @navigatorBorderLightColor;
-    }
-
-    &:last-child {
-      border-bottom: 1px solid transparent;
-
-      &.active {
-        border-bottom-color: #4B9FD5;
-      }
-    }
-  }
-
-  & > li + li {
-    border-top-color: @navigatorBorderLightColor;
-  }
-
-  & > li.active + li {
-    border-top-color: #4B9FD5;
-  }
-
-  &.navigator-fetching {
-
-    & > li .line-nowrap {
-      text-overflow: clip; /* thanks to FF */
-    }
-
-    &:before {
-      position: fixed;
-      z-index: 3;
-      top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight + @navigatorStatusHeight;
-      bottom: 0;
-      left: 0;
-      width: @navigatorResultsWidth - 1px;
-    }
-  }
-}
-
-.navigator-results-no-results {
-  padding-top: 20% !important;
-  background: #fff !important;
-  color: #999;
-  cursor: default !important;
-  text-align: center;
-}
-
-
-
-// Details
-.navigator-details {
-  padding: @navigatorPadding;
-  background-color: @white;
-  overflow: auto;
-
-  .issues-page & {
-    padding-top: 62px;
-    padding-right: 0;
-  }
-
-  &.loading {
-    background: @white url("../images/loading.gif") no-repeat 4px 2px;
-  }
-
-  .code-issue-name {
-    border-bottom: none;
-  }
-
-  .code-issue-actions {
-    background-color: #E4ECF3;
-  }
-
-  .source_title {
-    position: fixed;
-    z-index: 3;
-    top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight;
-    left: @navigatorResultsWidth;
-    right: 0;
-    padding: @navigatorPadding;
-    border-bottom: 1px solid @navigatorBorderLightColor;
-    background-color: #fff;
-  }
-
-  .source {
-    padding-right: 10px;
-
-    & > table {
-      border: 1px solid #DDD;
-    }
-  }
-
-  .scm .author {
-    display: inline-block;
-    vertical-align: middle;
-    max-width: 100px;
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
-  }
-}
-
-
-
-// Status
-.navigator-actions {
-  padding: 0 @navigatorPadding 0 0;
-
-  border-right: 1px solid @navigatorBorderLightColor;
-  border-bottom: 1px solid @navigatorBorderLightColor;
-  background-color: @navigatorBarBackground;
-  font-size: @smallFontSize;
-
-  strong { font-weight: bold; }
-}
-
-.navigator-actions-order {
-  float: left;
-  padding: 0 @navigatorPadding;
-  line-height: @navigatorStatusHeight;
-  cursor: pointer;
-  .trans;
-
-  &:hover {
-    background-color: @navigatorBarBackground;
-  }
-}
-
-.navigator-actions-order-choices {
-  .navigator-element;
-  top: @navigatorTopOffset + @navigatorHeaderHeight + @navigatorFiltersHeight + @navigatorStatusHeight;
-  left: 0;
-  min-width: @navigatorResultsWidth / 2;
-  background-color: #fff;
-  border-bottom: 1px solid @navigatorBorderLightColor;
-  border-right: 1px solid @navigatorBorderLightColor;
-  overflow: hidden;
-  display: none;
-
-  & > li {
-    height: @navigatorStatusHeight;
-    line-height: @navigatorStatusHeight;
-    padding: 0 10px;
-    cursor: pointer;
-    .trans;
-
-    &:hover {
-      background-color: @navigatorBarBackground;
-    }
-  }
-
-  &.open {
-    display: block;
-  }
-}
-
-.navigator-actions-total {
-  float: right;
-  line-height: @navigatorStatusHeight - 4px;
-}
-
-.navigator-actions-bulk {
-  position: relative;
-  top: -1px;
-  margin-left: 8px;
-  font-size: 16px;
-  text-decoration: none;
-}
-
-
-
-// Footer
-.navigator-page #footer {
-  .navigator-element;
-  bottom: 0;
-  left: @navigatorResultsWidth;
-  right: 0;
-  margin: 0;
-  border-top: 1px solid @navigatorBorderLightColor;
-}
-
-.navigator-page #ftlinks {
-  margin-top: 0;
-}
-
-.measures-page #footer {
-  left: 0;
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/navigator/config.css b/sonar-server/src/main/webapp/stylesheets/navigator/config.css
deleted file mode 100644 (file)
index 620cf3a..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * Fonts
- */
-/*
- * Colors
- */
-/*
- * Icons
- */
-/*
- * Transitions
- */
diff --git a/sonar-server/src/main/webapp/stylesheets/navigator/config.less b/sonar-server/src/main/webapp/stylesheets/navigator/config.less
deleted file mode 100644 (file)
index 2d920ff..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-@import "../variables";
-
-// Layout
-@navigatorTopOffset: 30px;
-@navigatorBottomOffset: 35px;
-
-@navigatorHeaderHeight: 37px;
-@navigatorFiltersHeight: 37px;
-@navigatorFacetsHeight: 90px;
-@navigatorStatusHeight: 30px;
-@navigatorNotesHeight: 20px;
-
-@navigatorResultsWidth: 320px;
-
-@navigatorPadding: 10px;
-
-
-// Colors
-@navigatorBarBackground: @grey;
-@navigatorBorderColor: @darkGrey;
-@navigatorBorderLightColor: lighten(@darkGrey, 8%);
-
-
-@navigatorHover: darken(@grey, 5%);
-@navigatorFilterPadding: @navigatorPadding;
diff --git a/sonar-server/src/main/webapp/stylesheets/navigator/filters.css b/sonar-server/src/main/webapp/stylesheets/navigator/filters.css
deleted file mode 100644 (file)
index b397683..0000000
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Fonts
- */
-/*
- * Colors
- */
-/*
- * Icons
- */
-/*
- * Transitions
- */
-.navigator-filters {
-  border-bottom: 1px solid #cdcdcd;
-  background-color: #efefef;
-  font-size: 0;
-}
-.navigator-filters-list {
-  display: inline-block;
-  vertical-align: middle;
-  margin-bottom: -1px;
-  font-size: 0;
-}
-.navigator-filter-submit,
-.navigator-filter-new-search {
-  vertical-align: middle;
-  margin-left: 15px;
-  font-size: 13px;
-}
-.navigator-filter-list-favorite {
-  position: relative;
-  padding-left: 36px;
-  overflow: hidden;
-}
-.navigator-filters-actions {
-  display: inline-block;
-  vertical-align: middle;
-  margin-left: 20px;
-  font-size: 13px;
-}
-.navigator-filter {
-  display: inline-block;
-  vertical-align: top;
-  height: 36px;
-  line-height: 36px;
-  margin: -1px 0 0;
-  padding: 0 10px;
-  border: 1px solid transparent;
-  white-space: nowrap;
-  cursor: pointer;
-  transition: background 0.3s ease;
-}
-.navigator-filter:hover {
-  background-color: #e2e2e2;
-}
-.navigator-filter.active {
-  border-color: #cdcdcd;
-  background: #fff;
-}
-.navigator-filter-disabled {
-  display: none;
-}
-.navigator-filter-optional {
-  padding-right: 0;
-}
-.navigator-filter-inline,
-.navigator-filter-read-only,
-.navigator-filter-inactive {
-  cursor: default;
-}
-.navigator-filter-inline:hover,
-.navigator-filter-read-only:hover,
-.navigator-filter-inactive:hover,
-.navigator-filter-inline.active,
-.navigator-filter-read-only.active,
-.navigator-filter-inactive.active {
-  border-color: transparent;
-  background: transparent;
-}
-.navigator-filter-inline .navigator-filter-label:after {
-  content: "";
-}
-.navigator-filter-inactive {
-  opacity: 0.5;
-}
-.navigator-filter-label {
-  display: inline-block;
-  vertical-align: middle;
-  margin-right: 5px;
-  color: #333;
-  font-size: 13px;
-}
-.navigator-filter-label:after {
-  content: ":";
-}
-.navigator-filter-value {
-  display: inline-block;
-  vertical-align: middle;
-  max-width: 120px;
-  color: #333;
-  font-size: 13px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.navigator-filter-value.default {
-  color: #666;
-}
-.navigator-filter-disable {
-  display: inline-block;
-  vertical-align: middle;
-  width: 20px;
-  height: 20px;
-  line-height: 20px;
-  margin: 0 0 0 5px;
-  font-size: 18px;
-  text-align: center;
-  transition: background 0.3s ease;
-}
-.navigator-filter-disable:hover {
-  background-color: #d0d0d0;
-}
-.navigator-filter-range-input {
-  width: 120px;
-}
-.navigator-filter-details {
-  display: none;
-  position: absolute;
-  z-index: 1200;
-  min-width: 100px;
-  border: 1px solid #cdcdcd;
-  background: #fff;
-  box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.5);
-  font-size: 13px;
-  transition: opacity 0.3s ease;
-}
-.navigator-filter-details.active {
-  display: block;
-}
-.navigator-filter-details-inner {
-  max-width: 300px;
-  padding: 5px 10px;
-}
-.navigator-filter-details-inner .select2-container,
-.navigator-filter-details-inner input {
-  margin: 5px 0;
-  vertical-align: middle;
-}
-.navigator-filter-select-list {
-  min-width: 150px;
-  max-width: 300px;
-  max-height: 182px;
-  padding: 5px 0;
-  overflow-y: auto;
-}
-.navigator-filter-select-list::-webkit-scrollbar {
-  width: 11px;
-  background-color: transparent;
-  background-clip: content-box;
-}
-.navigator-filter-select-list::-webkit-scrollbar-button {
-  background-color: transparent;
-}
-.navigator-filter-select-list::-webkit-scrollbar-corner {
-  background-color: transparent;
-}
-.navigator-filter-select-list::-webkit-scrollbar-thumb {
-  border: solid transparent;
-  border-width: 1px 1px 1px 2px;
-  background-color: #c5c5c5;
-  background-clip: content-box;
-}
-.navigator-filter-select-list::-webkit-scrollbar-thumb:hover {
-  background-color: #bfbfbf;
-}
-.navigator-filter-select-list::-webkit-scrollbar-track {
-  border: solid #fff;
-  border-width: 1px 1px 1px 2px;
-  background-color: #fff;
-  background-clip: content-box;
-}
-.navigator-filter-select-list::-webkit-scrollbar-track-piece {
-  border-left: 1px solid #ccc;
-  background-color: transparent;
-}
-.navigator-filter-select-list label {
-  display: block;
-  padding: 5px 10px;
-  transition: background 0.3s ease;
-  cursor: pointer;
-  white-space: nowrap;
-  overflow: hidden;
-}
-.navigator-filter-select-list label:hover,
-.navigator-filter-select-list label.current {
-  background-color: #ededed;
-}
-.navigator-filter-select-list label > input[type=checkbox] {
-  vertical-align: baseline;
-  cursor: pointer;
-}
-.navigator-filter-select-list label > img {
-  vertical-align: text-bottom;
-}
-.navigator-filter-select-list label > span {
-  display: inline-block;
-  vertical-align: top;
-  width: 86%;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.navigator-filter-select-list label.special {
-  font-style: italic;
-}
-.navigator-filter-select-list label.special > span {
-  text-decoration: underline;
-}
-.navigator-filter-select-list label.inactive {
-  cursor: default;
-  opacity: 0.5;
-}
-.navigator-filter-select-list label.inactive:hover {
-  background-color: transparent;
-}
-.navigator-filter-select-list .single {
-  padding: 5px 10px;
-}
-.navigator-filter-select-list .line {
-  height: 1px;
-  margin: 5px 0;
-  background: #cdcdcd;
-}
-.navigator-filter-select-list:not(.hidden) + .navigator-filter-select-list {
-  margin-top: 5px;
-  border-top: 1px solid #cdcdcd;
-}
-.navigator-filter-search {
-  position: relative;
-  margin: 10px 26px 10px 10px;
-}
-.navigator-filter-search input {
-  width: 100%;
-  height: 26px;
-  padding: 0 7px;
-  border: 1px solid #cdcdcd;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.fetching .navigator-filter-search:after {
-  content: ' ';
-  position: absolute;
-  top: 6px;
-  right: -21px;
-  display: block;
-  width: 16px;
-  height: 16px;
-  background: #ffffff url(../images/loading.gif) no-repeat center center;
-}
-.navigator-filter-load-more {
-  display: none;
-  height: 26px;
-  line-height: 26px;
-  background-color: #efefef;
-  text-align: center;
-  cursor: pointer;
-  transition: background 0.3s ease;
-}
-.navigator-filter-load-more:hover {
-  background-color: #dddddd;
-}
-.navigator-filter-favorite {
-  position: absolute;
-  top: -100%;
-  left: 0;
-  border-top: none;
-}
-.navigator-filter-favorite-toggle {
-  width: 16px;
-  height: 37px;
-  background: url('../images/navigator/favorite-filters.png') no-repeat center center;
-}
-@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
-  .navigator-filter-favorite-toggle {
-    background-image: url(../images/navigator/favorite-filters@2x.png);
-    background-size: 16px 14px;
-  }
-}
-.navigator-filter-more-criteria {
-  font-size: 13px;
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/navigator/filters.less b/sonar-server/src/main/webapp/stylesheets/navigator/filters.less
deleted file mode 100644 (file)
index dc9868f..0000000
+++ /dev/null
@@ -1,287 +0,0 @@
-@import "../variables";
-@import "../mixins";
-
-@import "config";
-
-
-.navigator-filters {
-  border-bottom: 1px solid @darkGrey;
-  background-color: @navigatorBarBackground;
-  font-size: 0;
-}
-
-.navigator-filters-list {
-  display: inline-block;
-  vertical-align: middle;
-  margin-bottom: -1px;
-  font-size: 0;
-}
-
-.navigator-filter-submit,
-.navigator-filter-new-search {
-  vertical-align: middle;
-  margin-left: 15px;
-  font-size: @baseFontSize;
-}
-
-.navigator-filter-list-favorite {
-  position: relative;
-  padding-left: 36px;
-  overflow: hidden;
-}
-
-.navigator-filters-actions {
-  display: inline-block;
-  vertical-align: middle;
-  margin-left: 20px;
-  font-size: @baseFontSize;
-}
-
-.navigator-filter {
-  display: inline-block;
-  vertical-align: top;
-  height: @navigatorFiltersHeight - 1px;
-  line-height: @navigatorFiltersHeight - 1px;
-  margin: -1px 0 0;
-  padding: 0 @navigatorFilterPadding;
-  border: 1px solid transparent;
-  white-space: nowrap;
-  cursor: pointer;
-  transition: background 0.3s ease;
-
-  &:hover {
-    background-color: @navigatorHover;
-  }
-
-  &.active {
-    border-color: @darkGrey;
-    background: #fff;
-  }
-}
-
-.navigator-filter-disabled {
-  display: none;
-}
-
-.navigator-filter-optional {
-  padding-right: 0;
-}
-
-.navigator-filter-inline,
-.navigator-filter-read-only,
-.navigator-filter-inactive {
-  cursor: default;
-
-  &:hover,
-  &.active {
-    border-color: transparent;
-    background: transparent;
-  }
-}
-
-.navigator-filter-inline .navigator-filter-label:after {
-    content: "";
-}
-
-.navigator-filter-inactive {
-  opacity: 0.5;
-}
-
-.navigator-filter-label {
-  display: inline-block;
-  vertical-align: middle;
-  margin-right: 5px;
-  color: #333;
-  font-size: @baseFontSize;
-
-  &:after { content: ":"; }
-}
-
-.navigator-filter-value {
-  display: inline-block;
-  vertical-align: middle;
-  max-width: 120px;
-  color: #333;
-  font-size: @baseFontSize;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-
-  &.default {
-    color: #666;
-  }
-}
-
-.navigator-filter-disable {
-  display: inline-block;
-  vertical-align: middle;
-  .square(20px);
-  line-height: 20px;
-  margin: 0 0 0 5px;
-  font-size: 18px;
-  text-align: center;
-  transition: background 0.3s ease;
-
-  &:hover {
-    background-color: darken(@navigatorHover, 7%);
-  }
-}
-
-.navigator-filter-range-input {
-  width: 120px;
-}
-
-.navigator-filter-details {
-  display: none;
-  position: absolute;
-  z-index: 1200;
-  min-width: 100px;
-  border: 1px solid @darkGrey;
-  background: #fff;
-  box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.5);
-  font-size: @baseFontSize;
-  transition: opacity 0.3s ease;
-
-  &.active {
-    display: block;
-  }
-}
-
-.navigator-filter-details-inner {
-  max-width: 300px;
-  padding: 5px @navigatorFilterPadding;
-
-  .select2-container,
-  input {
-    margin: 5px 0;
-    vertical-align: middle;
-  }
-}
-
-.navigator-filter-select-list {
-  min-width: 150px;
-  max-width: 300px;
-  max-height: 182px;
-  padding: 5px 0;
-  overflow-y: auto;
-  .webkit-scrollbar;
-
-  label {
-    display: block;
-    padding: 5px @navigatorFilterPadding;
-    transition: background 0.3s ease;
-    cursor: pointer;
-    white-space: nowrap;
-    overflow: hidden;
-
-    &:hover,
-    &.current {
-      background-color: darken(#fff, 7%);
-    }
-
-    & > input[type=checkbox] {
-      vertical-align: baseline;
-      cursor: pointer;
-    }
-
-    & > img {
-      vertical-align: text-bottom;
-    }
-
-    & > span {
-      display: inline-block;
-      vertical-align: top;
-      width: 86%;
-      white-space: nowrap;
-      overflow: hidden;
-      text-overflow: ellipsis;
-    }
-
-    &.special {
-      font-style: italic;
-
-      & > span {
-        text-decoration: underline;
-      }
-    }
-
-    &.inactive {
-      cursor: default;
-      opacity: 0.5;
-
-      &:hover {
-        background-color: transparent;
-      }
-    }
-  }
-
-  .single {
-    padding: 5px @navigatorFilterPadding;
-  }
-
-  .line {
-    height: 1px;
-    margin: 5px 0;
-    background: @darkGrey;
-  }
-}
-
-.navigator-filter-select-list:not(.hidden) + .navigator-filter-select-list {
-  margin-top: 5px;
-  border-top: 1px solid @darkGrey;
-}
-
-.navigator-filter-search {
-  position: relative;
-  margin: @navigatorFilterPadding 26px @navigatorFilterPadding @navigatorFilterPadding;
-
-  input {
-    .size(100%, 26px);
-    padding: 0 7px;
-    border: 1px solid @darkGrey;
-    .box-sizing(border-box);
-  }
-
-  .fetching &:after {
-    content: ' ';
-    position: absolute;
-    top: 6px; right: -21px;
-    display: block;
-    .square(16px);
-    background: #fff url(../images/loading.gif) no-repeat center center;
-  }
-}
-
-.navigator-filter-load-more {
-  display: none;
-  height: 26px;
-  line-height: 26px;
-  background-color: @grey;
-  text-align: center;
-  cursor: pointer;
-  transition: background 0.3s ease;
-
-  &:hover {
-    background-color: darken(@grey, 7%);
-  }
-}
-
-.navigator-filter-favorite {
-  position: absolute;
-  top: -100%; left: 0;
-  border-top: none;
-}
-
-.navigator-filter-favorite-toggle {
-  .size(16px, @navigatorFiltersHeight);
-  background: url('../images/navigator/favorite-filters.png') no-repeat center center;
-
-  @media @retina {
-    background-image: url(../images/navigator/favorite-filters@2x.png);
-    background-size: 16px 14px;
-  }
-}
-
-.navigator-filter-more-criteria {
-  font-size: @baseFontSize;
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/quality-gates.css b/sonar-server/src/main/webapp/stylesheets/quality-gates.css
deleted file mode 100644 (file)
index dc1db97..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Fonts
- */
-/*
- * Colors
- */
-/*
- * Icons
- */
-/*
- * Transitions
- */
-.quality-gates-navigator .navigator-header {
-  left: 230px;
-  border-color: #cdcdcd;
-}
-.quality-gates-navigator .navigator-header .spinner {
-  margin-top: 9px;
-}
-.quality-gates-navigator .navigator-actions {
-  top: 30px;
-  height: 37px;
-  width: 230px;
-  padding: 0 10px;
-  border-color: #cdcdcd;
-  border-bottom-color: #efefef;
-}
-.quality-gates-navigator .navigator-actions .navigator-header-title {
-  font-size: 13px;
-  font-weight: bold;
-  text-transform: uppercase;
-}
-.quality-gates-navigator .navigator-results {
-  top: 67px;
-  width: 229px;
-  border-color: #cdcdcd;
-}
-.quality-gates-navigator .navigator-details {
-  top: 67px;
-  left: 230px;
-  padding: 10px;
-}
-.quality-gates-page #footer {
-  left: 230px;
-}
-.quality-gates-nav {
-  background-color: #efefef;
-}
-.quality-gates-nav .navigator-results-list > li {
-  border-color: transparent;
-}
-.quality-gates-nav .navigator-results-list > li:hover:not(.active):not(.empty) {
-  background-color: #e1e1e1;
-}
-.quality-gates-nav .navigator-results-list > li.active {
-  border-color: #4B9FD5;
-}
-.quality-gates-nav .navigator-results-list > li.empty {
-  cursor: default;
-}
-.quality-gates-nav .navigator-results-list > li .line {
-  padding-top: 2px;
-  padding-bottom: 2px;
-}
-.quality-gates-nav .navigator-results-list > li .subtitle {
-  text-transform: lowercase;
-}
-.quality-gate-section + .quality-gate-section {
-  margin-top: 10px;
-  padding-top: 20px;
-}
-.quality-gate-section-empty + .quality-gate-section {
-  border-top: 1px solid #e1e1e1;
-}
-.quality-gate-section-name {
-  margin-bottom: 10px;
-  font-weight: bold;
-  text-transform: uppercase;
-}
-.quality-gate-introduction {
-  margin-bottom: 20px;
-}
-.quality-gate-new-condition {
-  margin-bottom: 10px;
-}
-.quality-gate-condition-actions {
-  position: relative;
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/quality-gates.less b/sonar-server/src/main/webapp/stylesheets/quality-gates.less
deleted file mode 100644 (file)
index a0293d5..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-@import "variables";
-@import "mixins";
-@import "navigator/config";
-
-@qualityGateSidebarWidth: 230px;
-
-.quality-gates-navigator {
-
-  .navigator-header {
-    left: @qualityGateSidebarWidth;
-    border-color: @navigatorBorderColor;
-
-    .spinner { margin-top: 9px; }
-  }
-
-  .navigator-actions {
-    top: @navigatorTopOffset;
-    height: @navigatorHeaderHeight;
-    width: @qualityGateSidebarWidth;
-    padding: 0 @navigatorPadding;
-    border-color: @navigatorBorderColor;
-    border-bottom-color: @navigatorBarBackground;
-
-    .navigator-header-title {
-      font-size: 13px;
-      font-weight: bold;
-      text-transform: uppercase;
-    }
-  }
-
-  .navigator-results {
-    top: @navigatorTopOffset + @navigatorHeaderHeight;
-    width: @qualityGateSidebarWidth - 1px;
-    border-color: @navigatorBorderColor;
-  }
-
-  .navigator-details {
-    top: @navigatorTopOffset + @navigatorHeaderHeight;
-    left: @qualityGateSidebarWidth;
-    padding: @navigatorPadding;
-  }
-
-}
-
-.quality-gates-page #footer {
-  left: @qualityGateSidebarWidth;
-}
-
-
-.quality-gates-nav {
-  background-color: @navigatorBarBackground;
-
-  .navigator-results-list {
-
-    & > li {
-      border-color: transparent;
-
-      &:hover:not(.active):not(.empty) {
-        background-color: @navigatorBorderLightColor;
-      }
-
-      &.active {
-        border-color: #4B9FD5;
-      }
-
-      &.empty {
-        cursor: default;
-      }
-      
-      .line {
-        padding-top: 2px;
-        padding-bottom: 2px;
-      }
-
-      .subtitle {
-        text-transform: lowercase;
-      }
-    }
-  }
-}
-
-
-.quality-gate-section + .quality-gate-section {
-  margin-top: @navigatorPadding;
-  padding-top: 2 * @navigatorPadding;
-}
-
-.quality-gate-section-empty + .quality-gate-section {
-  border-top: 1px solid @navigatorBorderLightColor;
-}
-
-.quality-gate-section-name {
-  margin-bottom: @navigatorPadding;
-  font-weight: bold;
-  text-transform: uppercase;
-}
-
-
-.quality-gate-introduction {
-  margin-bottom: 2 * @navigatorPadding;
-}
-
-
-.quality-gate-new-condition {
-  margin-bottom: @navigatorPadding;
-}
-
-.quality-gate-condition-actions {
-  position: relative;
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/select-list.css b/sonar-server/src/main/webapp/stylesheets/select-list.css
deleted file mode 100644 (file)
index 90f9d64..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
-.select-list-container {
-  min-width: 500px;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.select-list-control {
-  margin-bottom: 10px;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.select-list-list-container {
-  border: 1px solid #bfbfbf;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-
-.select-list-list-container.loading .select-list-list {
-  display: none;
-}
-
-.select-list-list-container-readonly {
-  border: none;
-}
-
-.select-list-list-container-readonly .select-list-list {
-  overflow: visible;
-}
-
-.select-list-list-container-readonly .select-list-list > li {
-  border: none;
-}
-
-.select-list-list {
-  overflow-x: hidden;
-}
-
-  .select-list-list > li {
-    position: relative;
-    display: block;
-    margin-top: -1px;
-    padding: 5px 10px;
-    border-top: 1px solid #e0e0e0;
-    color: #404040;
-    transition: -webkit-transform 0.3s ease;
-    transition: -ms-transform 0.3s ease;
-    transition: transform 0.3s ease;
-  }
-
-  .select-list-list > li.removed {
-    -webkit-transform: translateX(100%);
-       -moz-transform: translateX(100%);
-        -ms-transform: translateX(100%);
-         -o-transform: translateX(100%);
-            transform: translateX(100%);
-  }
-
-  .select-list-list > li.added {
-    -webkit-transform: translateX(-100%);
-       -moz-transform: translateX(-100%);
-        -ms-transform: translateX(-100%);
-         -o-transform: translateX(-100%);
-            transform: translateX(-100%);
-  }
-
-  .select-list-list > li.progress {
-    background: url(../images/loading.gif) no-repeat 10px 5px;
-  }
-
-  .select-list-list > li.progress .select-list-list-checkbox {
-    visibility: hidden;
-  }
-
-  .select-list-list > li.empty-message {
-    padding: 6px 5px;
-    border: 1px solid #ddd;
-    background-color: #efefef;
-  }
-
-
-.select-list-list-checkbox {
-  display: inline-block;
-  vertical-align: middle;
-  margin-right: 10px;
-}
-
-.select-list-list-item {
-  display: inline-block;
-  vertical-align: middle;
-}
-
-.select-list-control {
-  height: 27px;
-}
-
-.select-list-check-control {
-  float: left;
-}
-
-.select-list-check-control.disabled {
-  filter: alpha(opacity=60);
-  opacity: 0.6;
-}
-
-.select-list-check-control.disabled .select-list-control-button {
-  background-color: #fff !important;
-}
-
-.select-list-control-button {
-  position: relative;
-  z-index: 1;
-  display: inline-block;
-  vertical-align: middle;
-  width: 110px;
-  height: 27px;
-  line-height: 25px;
-  box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  border: 1px solid #bfbfbf;
-  text-align: center;
-  cursor: pointer;
-  transition: background-color 0.2s ease;
-}
-
-.select-list-control-button:hover {
-  background-color: #f6f6f6;
-}
-
-.select-list-control-button:active,
-.select-list-control-button.active {
-  z-index: 2;
-  background-color: #efefef;
-}
-
-.select-list-control-button + .select-list-control-button {
-  margin-left: -1px;
-}
-
-
-.select-list-search-control {
-  position: relative;
-  float: right;
-  height: 27px;
-}
-
-.select-list-search-control input {
-  width: 170px;
-  height: 100%;
-  line-height: 27px\9;
-  padding: 0 40px 0 10px;
-  border: 1px solid #bfbfbf;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  transition: all 0.3s ease;
-}
-
-.select-list-search-control input:focus {
-  outline: none;
-  box-shadow: none;
-}
-
-.select-list-search-control input::-ms-clear {
-  display: none;
-}
-
-.select-list-search-control-clear {
-  position: absolute;
-  top: 2px;
-  right: 2px;
-  width: 23px;
-  height: 23px;
-  line-height: 24px;
-  background-color: #e0e0e0;
-  color: #fff;
-  cursor: pointer;
-  font-size: 18px;
-  text-align: center;
-  transition: all 0.3s ease;
-}
-
-  .select-list-search-control.disabled .select-list-search-control-clear {
-    filter: alpha(opacity=0);
-    opacity: 0;
-  }
-
-  .select-list-search-control-clear:hover {
-    background-color: #d6d6d6;
-  }
diff --git a/sonar-server/src/main/webapp/stylesheets/select2-sonar.css b/sonar-server/src/main/webapp/stylesheets/select2-sonar.css
deleted file mode 100644 (file)
index 4f60dea..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Fonts
- */
-/*
- * Colors
- */
-/*
- * Icons
- */
-/*
- * Transitions
- */
-.select2-container {
-  vertical-align: middle;
-}
-.select2-container .select2-choice {
-  height: 20px;
-  line-height: 20px;
-  border-color: #cdcdcd;
-  border-radius: 0;
-  background: #fff;
-  text-align: left;
-}
-.select2-container .select2-choice,
-.select2-container .select2-choices {
-  transition: border-color 0.3s ease;
-}
-.select2-container .select2-choice abbr {
-  top: 4px;
-}
-.select2-container .select2-choice div {
-  width: 19px;
-  border: none;
-  border-radius: 0;
-  background: #fff;
-}
-.select2-container .select2-choice div b {
-  top: 4px;
-  background-position: 1px -1px;
-}
-.select2-dropdown-open .select2-choice div b {
-  background-position: -17px -1px;
-}
-.select2-container-active .select2-choice,
-.select2-container-active .select2-choices {
-  border-color: #4b9fd5;
-  box-shadow: none;
-}
-.select2-dropdown-open .select2-choice {
-  box-shadow: none;
-}
-.select2-drop {
-  border-color: #cdcdcd;
-  border-radius: 0;
-}
-.select2-drop-active {
-  border-color: #4b9fd5;
-}
-.select2-dropdown-open.select2-drop-above .select2-choice,
-.select2-dropdown-open.select2-drop-above .select2-choices {
-  border-color: #4b9fd5;
-  border-radius: 0;
-  background: #fff;
-}
-.select2-drop.select2-drop-above.select2-drop-active {
-  border-color: #4b9fd5;
-  border-radius: 0;
-}
-.select2-drop.select2-drop-above .select2-search input {
-  margin-top: 0;
-}
-.select2-results {
-  margin: 0;
-  padding: 5px 0;
-  border-top: 1px solid #cdcdcd;
-}
-.select2-results .select2-result-label {
-  height: 20px;
-  line-height: 20px;
-  padding: 0 8px;
-  color: #444444;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.select2-results .select2-no-results,
-.select2-results .select2-searching,
-.select2-results .select2-selection-limit,
-.select2-more-results.select2-active {
-  height: 20px;
-  line-height: 20px;
-  padding: 0 10px;
-}
-.select2-results .select2-highlighted {
-  background: transparent;
-  color: #444444;
-}
-.select2-results .select2-highlighted .select2-result-label {
-  background: #e2e2e2;
-}
-.select2-search {
-  padding: 4px;
-}
-.select2-search input {
-  height: 20px;
-  padding: 0 7px;
-  border-color: #cdcdcd;
-  background: #fff !important;
-}
-.select2-container-multi .select2-choices {
-  min-height: 19px;
-  padding-bottom: 1px;
-  border-color: #cdcdcd;
-  background: #fff;
-}
-.select2-container-multi.select2-container-active .select2-choices {
-  border-color: #4b9fd5;
-  box-shadow: none;
-}
-.select2-container-multi .select2-choices .select2-search-field input {
-  height: 16px;
-  padding: 0 3px;
-}
-.select2-container-multi .select2-choices .select2-search-choice {
-  margin: 1px 1px 0 1px;
-  padding: 1px 5px 2px 18px;
-  border-radius: 0;
-  border-color: #cdcdcd;
-  background: #efefef;
-  box-shadow: none;
-}
-.select2-search-choice-close {
-  top: 2px;
-}
-.select2-search-choice-close,
-.select2-container .select2-choice abbr,
-.select2-container .select2-choice div b {
-  background-image: url('../images/select2.png');
-}
-.select2-search input.select2-active,
-.select2-more-results.select2-active,
-.select2-container-multi .select2-choices .select2-search-field input.select2-active {
-  background-image: url('../images/spinner.gif');
-}
-@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
-  .select2-search-choice-close,
-  .select2-container .select2-choice abbr,
-  .select2-container .select2-choice div b {
-    background-image: url('../images/select2x2.png') !important;
-  }
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/select2-sonar.less b/sonar-server/src/main/webapp/stylesheets/select2-sonar.less
deleted file mode 100644 (file)
index fed9289..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-@import "mixins";
-@import "variables";
-
-@imagesPath: '../images/select2.png';
-@imagesPath2x: '../images/select2x2.png';
-@spinnerPath: '../images/spinner.gif';
-
-.select2-container {
-  vertical-align: middle;
-}
-
-.select2-container .select2-choice {
-  height: 20px;
-  line-height: 20px;
-  border-color: @darkGrey;
-  border-radius: 0;
-  background: #fff;
-  text-align: left;
-}
-
-.select2-container .select2-choice,
-.select2-container .select2-choices {
-  .trans(border-color);
-}
-
-.select2-container .select2-choice abbr {
-  top: 4px;
-}
-
-.select2-container .select2-choice div {
-  width: 19px;
-  border: none;
-  border-radius: 0;
-  background: #fff;
-}
-
-.select2-container .select2-choice div b {
-  top: 4px;
-  background-position: 1px -1px;
-}
-
-.select2-dropdown-open .select2-choice div b {
-  background-position: -17px -1px;
-}
-
-
-.select2-container-active .select2-choice,
-.select2-container-active .select2-choices {
-  border-color: @highlighted;
-  box-shadow: none;
-}
-
-.select2-dropdown-open .select2-choice {
-  box-shadow: none;
-}
-
-.select2-drop {
-  border-color: @darkGrey;
-  border-radius: 0;
-}
-
-.select2-drop-active {
-  border-color: @highlighted;
-}
-
-.select2-dropdown-open.select2-drop-above .select2-choice,
-.select2-dropdown-open.select2-drop-above .select2-choices {
-  border-color: @highlighted;
-  border-radius: 0;
-  background: #fff;
-}
-
-.select2-drop.select2-drop-above.select2-drop-active {
-  border-color: @highlighted;
-  border-radius: 0;
-}
-
-.select2-drop.select2-drop-above .select2-search input {
-  margin-top: 0;
-}
-
-.select2-results {
-  margin: 0;
-  padding: 5px 0;
-  border-top: 1px solid @darkGrey;
-}
-
-.select2-results .select2-result-label {
-  height: 20px;
-  line-height: 20px;
-  padding: 0 8px;
-  color: @baseFontColor;
-
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-.select2-results .select2-no-results,
-.select2-results .select2-searching,
-.select2-results .select2-selection-limit,
-.select2-more-results.select2-active {
-  height: 20px;
-  line-height: 20px;
-  padding: 0 10px;
-}
-
-.select2-results .select2-highlighted {
-  background: transparent;
-  color: @baseFontColor;
-}
-
-.select2-results .select2-highlighted .select2-result-label {
-  background: darken(@grey, 5%);
-}
-
-.select2-search {
-  padding: 4px;
-}
-
-.select2-search input {
-  height: 20px;
-  padding: 0 7px;
-  border-color: @darkGrey;
-  background: #fff !important;
-}
-
-.select2-container-multi .select2-choices {
-  min-height: 19px;
-  padding-bottom: 1px;
-  border-color: @darkGrey;
-  background: #fff;
-}
-
-.select2-container-multi.select2-container-active .select2-choices {
-  border-color: @highlighted;
-  box-shadow: none;
-}
-
-.select2-container-multi .select2-choices .select2-search-field input {
-  height: 16px;
-  padding: 0 3px;
-}
-
-.select2-container-multi .select2-choices .select2-search-choice {
-  margin: 1px 1px 0 1px;
-  padding: 1px 5px 2px 18px;
-  border-radius: 0;
-  border-color: @darkGrey;
-  background: @grey;
-  box-shadow: none;
-}
-
-.select2-search-choice-close {
-  top: 2px;
-}
-
-.select2-search-choice-close,
-.select2-container .select2-choice abbr,
-.select2-container .select2-choice div b {
-  background-image: url(@imagesPath);
-}
-
-.select2-search input.select2-active,
-.select2-more-results.select2-active,
-.select2-container-multi .select2-choices .select2-search-field input.select2-active {
-  background-image: url(@spinnerPath);
-}
-
-@media @retina {
-  .select2-search-choice-close,
-  .select2-container .select2-choice abbr,
-  .select2-container .select2-choice div b {
-    background-image: url(@imagesPath2x) !important;
-  }
-}
-
-
-
-
-
-
-
diff --git a/sonar-server/src/main/webapp/stylesheets/select2.css b/sonar-server/src/main/webapp/stylesheets/select2.css
deleted file mode 100755 (executable)
index aae6c48..0000000
+++ /dev/null
@@ -1,536 +0,0 @@
-/*
-Version: 3.2 Timestamp: Mon Sep 10 10:38:04 PDT 2012
-*/
-.select2-container {
-  position: relative;
-  display: inline-block;
-  /* inline-block for ie7 */
-  zoom: 1;
-  *display: inline;
-  vertical-align: top;
-}
-
-.select2-container,
-.select2-drop,
-.select2-search,
-.select2-search input {
-  /*
-    Force border-box so that % widths fit the parent
-    container without overlap because of margin/padding.
-
-    More Info : http://www.quirksmode.org/css/box.html
-  */
-  -moz-box-sizing: border-box; /* firefox */
-  -ms-box-sizing: border-box; /* ie */
-  -webkit-box-sizing: border-box; /* webkit */
-  -khtml-box-sizing: border-box; /* konqueror */
-  box-sizing: border-box; /* css3 */
-}
-
-.select2-container .select2-choice {
-  background-color: #fff;
-  background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white));
-  background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%);
-  background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%);
-  background-image: -o-linear-gradient(bottom, #eeeeee 0%, #ffffff 50%);
-  background-image: -ms-linear-gradient(top, #eeeeee 0%, #ffffff 50%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
-  background-image: linear-gradient(top, #eeeeee 0%, #ffffff 50%);
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-  -moz-background-clip: padding;
-  -webkit-background-clip: padding-box;
-  background-clip: padding-box;
-  border: 1px solid #aaa;
-  display: block;
-  overflow: hidden;
-  white-space: nowrap;
-  position: relative;
-  height: 26px;
-  line-height: 26px;
-  padding: 0 0 0 8px;
-  color: #444;
-  text-decoration: none;
-}
-
-.select2-container.select2-drop-above .select2-choice {
-  border-bottom-color: #aaa;
-  -webkit-border-radius: 0px 0px 4px 4px;
-  -moz-border-radius: 0px 0px 4px 4px;
-  border-radius: 0px 0px 4px 4px;
-  background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.9, white));
-  background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 90%);
-  background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 90%);
-  background-image: -o-linear-gradient(bottom, #eeeeee 0%, white 90%);
-  background-image: -ms-linear-gradient(top, #eeeeee 0%, #ffffff 90%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
-  background-image: linear-gradient(top, #eeeeee 0%, #ffffff 90%);
-}
-
-.select2-container .select2-choice span {
-  margin-right: 26px;
-  display: block;
-  overflow: hidden;
-  white-space: nowrap;
-  -o-text-overflow: ellipsis;
-  -ms-text-overflow: ellipsis;
-  text-overflow: ellipsis;
-}
-
-.select2-container .select2-choice abbr {
-  display: block;
-  position: absolute;
-  right: 26px;
-  top: 8px;
-  width: 12px;
-  height: 12px;
-  font-size: 1px;
-  background: url('select2.png') right top no-repeat;
-  cursor: pointer;
-  text-decoration: none;
-  border: 0;
-  outline: 0;
-}
-
-.select2-container .select2-choice abbr:hover {
-  background-position: right -11px;
-  cursor: pointer;
-}
-
-.select2-drop {
-  background: #fff;
-  color: #000;
-  border: 1px solid #aaa;
-  border-top: 0;
-  position: absolute;
-  top: 100%;
-  -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-  -moz-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-  -o-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-  box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-  z-index: 9999;
-  width: 100%;
-  margin-top: -1px;
-  -webkit-border-radius: 0 0 4px 4px;
-  -moz-border-radius: 0 0 4px 4px;
-  border-radius: 0 0 4px 4px;
-}
-
-.select2-drop.select2-drop-above {
-  -webkit-border-radius: 4px 4px 0px 0px;
-  -moz-border-radius: 4px 4px 0px 0px;
-  border-radius: 4px 4px 0px 0px;
-  margin-top: 1px;
-  border-top: 1px solid #aaa;
-  border-bottom: 0;
-  -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-  -moz-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-  -o-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-  box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-}
-
-.select2-container .select2-choice div {
-  -webkit-border-radius: 0 4px 4px 0;
-  -moz-border-radius: 0 4px 4px 0;
-  border-radius: 0 4px 4px 0;
-  -moz-background-clip: padding;
-  -webkit-background-clip: padding-box;
-  background-clip: padding-box;
-  background: #ccc;
-  background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
-  background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
-  background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
-  background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%);
-  background-image: -ms-linear-gradient(top, #cccccc 0%, #eeeeee 60%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#eeeeee', GradientType=0);
-  background-image: linear-gradient(top, #cccccc 0%, #eeeeee 60%);
-  border-left: 1px solid #aaa;
-  position: absolute;
-  right: 0;
-  top: 0;
-  display: block;
-  height: 100%;
-  width: 18px;
-}
-
-.select2-container .select2-choice div b {
-  background: url('select2.png') no-repeat 0 1px;
-  display: block;
-  width: 100%;
-  height: 100%;
-}
-
-.select2-search {
-  display: inline-block;
-  white-space: nowrap;
-  z-index: 10000;
-  min-height: 26px;
-  width: 100%;
-  margin: 0;
-  padding-left: 4px;
-  padding-right: 4px;
-}
-
-.select2-search-hidden {
-  display: block;
-  position: absolute;
-  left: -10000px;
-}
-
-.select2-search input {
-  background: #fff url('select2.png') no-repeat 100% -22px;
-  background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
-  background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
-  background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
-  background: url('select2.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
-  background: url('select2.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);
-  background: url('select2.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%, #eeeeee 99%);
-  padding: 4px 20px 4px 5px;
-  outline: 0;
-  border: 1px solid #aaa;
-  font-family: sans-serif;
-  font-size: 1em;
-  width: 100%;
-  margin: 0;
-  height: auto !important;
-  min-height: 26px;
-  -webkit-box-shadow: none;
-  -moz-box-shadow: none;
-  box-shadow: none;
-  border-radius: 0;
-  -moz-border-radius: 0;
-  -webkit-border-radius: 0;
-}
-
-.select2-drop.select2-drop-above .select2-search input {
-  margin-top: 4px;
-}
-
-.select2-search input.select2-active {
-  background: #fff url('spinner.gif') no-repeat 100%;
-  background: url('spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
-  background: url('spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
-  background: url('spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
-  background: url('spinner.gif') no-repeat 100%, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
-  background: url('spinner.gif') no-repeat 100%, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);
-  background: url('spinner.gif') no-repeat 100%, linear-gradient(top, #ffffff 85%, #eeeeee 99%);
-}
-
-.select2-container-active .select2-choice,
-.select2-container-active .select2-choices {
-  -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-  -moz-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-  -o-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-  box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-  border: 1px solid #5897fb;
-  outline: none;
-}
-
-.select2-dropdown-open .select2-choice {
-  border: 1px solid #aaa;
-  border-bottom-color: transparent;
-  -webkit-box-shadow: 0 1px 0 #fff inset;
-  -moz-box-shadow: 0 1px 0 #fff inset;
-  -o-box-shadow: 0 1px 0 #fff inset;
-  box-shadow: 0 1px 0 #fff inset;
-  background-color: #eee;
-  background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee));
-  background-image: -webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%);
-  background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%);
-  background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%);
-  background-image: -ms-linear-gradient(top, #ffffff 0%, #eeeeee 50%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
-  background-image: linear-gradient(top, #ffffff 0%, #eeeeee 50%);
-  -webkit-border-bottom-left-radius: 0;
-  -webkit-border-bottom-right-radius: 0;
-  -moz-border-radius-bottomleft: 0;
-  -moz-border-radius-bottomright: 0;
-  border-bottom-left-radius: 0;
-  border-bottom-right-radius: 0;
-}
-
-.select2-dropdown-open .select2-choice div {
-  background: transparent;
-  border-left: none;
-}
-
-.select2-dropdown-open .select2-choice div b {
-  background-position: -18px 1px;
-}
-
-/* results */
-.select2-results {
-  margin: 4px 4px 4px 0;
-  padding: 0 0 0 4px;
-  position: relative;
-  overflow-x: hidden;
-  overflow-y: auto;
-  max-height: 200px;
-}
-
-.select2-results ul.select2-result-sub {
-  margin: 0 0 0 0;
-}
-
-.select2-results ul.select2-result-sub > li .select2-result-label { padding-left: 20px }
-
-.select2-results ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 40px }
-
-.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 60px }
-
-.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 80px }
-
-.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 100px }
-
-.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 110px }
-
-.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 120px }
-
-.select2-results li {
-  list-style: none;
-  display: list-item;
-}
-
-.select2-results li.select2-result-with-children > .select2-result-label {
-  font-weight: bold;
-}
-
-.select2-results .select2-result-label {
-  padding: 3px 7px 4px;
-  margin: 0;
-  cursor: pointer;
-}
-
-.select2-results .select2-highlighted {
-  background: #3875d7;
-  color: #fff;
-}
-
-.select2-results li em {
-  background: #feffde;
-  font-style: normal;
-}
-
-.select2-results .select2-highlighted em {
-  background: transparent;
-}
-
-.select2-results .select2-no-results,
-.select2-results .select2-searching,
-.select2-results .select2-selection-limit {
-  background: #f4f4f4;
-  display: list-item;
-}
-
-/*
-disabled look for already selected choices in the results dropdown
-.select2-results .select2-disabled.select2-highlighted {
-    color: #666;
-    background: #f4f4f4;
-    display: list-item;
-    cursor: default;
-}
-.select2-results .select2-disabled {
-  background: #f4f4f4;
-  display: list-item;
-  cursor: default;
-}
-*/
-.select2-results .select2-disabled {
-  display: none;
-}
-
-.select2-more-results.select2-active {
-  background: #f4f4f4 url('spinner.gif') no-repeat 100%;
-}
-
-.select2-more-results {
-  background: #f4f4f4;
-  display: list-item;
-}
-
-/* disabled styles */
-
-.select2-container.select2-container-disabled .select2-choice {
-  background-color: #f4f4f4;
-  background-image: none;
-  border: 1px solid #ddd;
-  cursor: default;
-}
-
-.select2-container.select2-container-disabled .select2-choice div {
-  background-color: #f4f4f4;
-  background-image: none;
-  border-left: 0;
-}
-
-/* multiselect */
-
-.select2-container-multi .select2-choices {
-  background-color: #fff;
-  background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
-  background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background-image: -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  background-image: linear-gradient(top, #eeeeee 1%, #ffffff 15%);
-  border: 1px solid #aaa;
-  margin: 0;
-  padding: 0;
-  cursor: text;
-  overflow: hidden;
-  height: auto !important;
-  height: 1%;
-  position: relative;
-}
-
-.select2-container-multi .select2-choices {
-  min-height: 26px;
-}
-
-.select2-container-multi.select2-container-active .select2-choices {
-  -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-  -moz-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-  -o-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-  box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-  border: 1px solid #5897fb;
-  outline: none;
-}
-
-.select2-container-multi .select2-choices li {
-  float: left;
-  list-style: none;
-}
-
-.select2-container-multi .select2-choices .select2-search-field {
-  white-space: nowrap;
-  margin: 0;
-  padding: 0;
-}
-
-.select2-container-multi .select2-choices .select2-search-field input {
-  color: #666;
-  background: transparent !important;
-  font-family: sans-serif;
-  font-size: 100%;
-  height: 15px;
-  padding: 5px;
-  margin: 1px 0;
-  outline: 0;
-  border: 0;
-  -webkit-box-shadow: none;
-  -moz-box-shadow: none;
-  -o-box-shadow: none;
-  box-shadow: none;
-}
-
-.select2-container-multi .select2-choices .select2-search-field input.select2-active {
-  background: #fff url('spinner.gif') no-repeat 100% !important;
-}
-
-.select2-default {
-  color: #999 !important;
-}
-
-.select2-container-multi .select2-choices .select2-search-choice {
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-  -moz-background-clip: padding;
-  -webkit-background-clip: padding-box;
-  background-clip: padding-box;
-  background-color: #e4e4e4;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0);
-  background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
-  background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
-  -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
-  -moz-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
-  box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
-  color: #333;
-  border: 1px solid #aaaaaa;
-  line-height: 13px;
-  padding: 3px 5px 3px 18px;
-  margin: 3px 0 3px 5px;
-  position: relative;
-  cursor: default;
-}
-
-.select2-container-multi .select2-choices .select2-search-choice span {
-  cursor: default;
-}
-
-.select2-container-multi .select2-choices .select2-search-choice-focus {
-  background: #d4d4d4;
-}
-
-.select2-search-choice-close {
-  display: block;
-  position: absolute;
-  right: 3px;
-  top: 4px;
-  width: 12px;
-  height: 13px;
-  font-size: 1px;
-  background: url('select2.png') right top no-repeat;
-  outline: none;
-}
-
-.select2-container-multi .select2-search-choice-close {
-  left: 3px;
-}
-
-.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
-  background-position: right -11px;
-}
-
-.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
-  background-position: right -11px;
-}
-
-/* disabled styles */
-
-.select2-container-multi.select2-container-disabled .select2-choices {
-  background-color: #f4f4f4;
-  background-image: none;
-  border: 1px solid #ddd;
-  cursor: default;
-}
-
-.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
-  background-image: none;
-  background-color: #f4f4f4;
-  border: 1px solid #ddd;
-  padding: 3px 5px 3px 5px;
-}
-
-.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close {
-  display: none;
-}
-
-/* end multiselect */
-
-.select2-result-selectable .select2-match,
-.select2-result-unselectable .select2-result-selectable .select2-match { text-decoration: underline; }
-
-.select2-result-unselectable .select2-match { text-decoration: none; }
-
-.select2-offscreen { position: absolute; left: -10000px; }
-
-/* Retina-ize icons */
-
-@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
-  .select2-search input, .select2-search-choice-close, .select2-container .select2-choice abbr, .select2-container .select2-choice div b {
-    background-image: url(select2x2.png) !important;
-    background-repeat: no-repeat !important;
-    background-size: 60px 40px !important;
-  }
-
-  .select2-search input {
-    background-position: 100% -21px !important;
-  }
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/sonar-colorizer.less b/sonar-server/src/main/webapp/stylesheets/sonar-colorizer.less
new file mode 100644 (file)
index 0000000..dd924b9
--- /dev/null
@@ -0,0 +1,61 @@
+.code {
+  font-size: 12px;
+}
+.code pre {
+  font-family: Monospace;
+  padding: 0 5px;
+  color: #111;
+  margin: 0;
+}
+/* for example java annotations */
+.code .a {
+  color: #808000;
+}
+/* constants */
+.code .c {
+  color: #660E80;
+  font-style: italic;
+  font-weight: bold;
+}
+/* javadoc */
+.code .j {
+  color: #666666;
+  font-style: normal;
+}
+/* classic comment */
+.code .cd {
+  color: #666666;
+  font-style: italic;
+}
+/* C++ doc */
+.code .cppd {
+  color: #666666;
+  font-style: italic;
+}
+/* keyword */
+.code .k {
+  color: #000080;
+  font-weight: bold;
+}
+/* string */
+.code .s {
+  color: #008000;
+  font-weight: bold;
+}
+/* keyword light*/
+.code .h {
+  color: #000080;
+  font-weight: normal;
+}
+/* preprocessing directive */
+.code .p {
+  color: #347235;
+  font-weight: normal;
+}
+.sym {
+  cursor: hand;
+  cursor: pointer;
+}
+.highlighted {
+  background-color: #B3D4FF;
+}
diff --git a/sonar-server/src/main/webapp/stylesheets/style.css b/sonar-server/src/main/webapp/stylesheets/style.css
deleted file mode 100644 (file)
index 042653c..0000000
+++ /dev/null
@@ -1,2740 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-
-/* CSS optimized by http://www.cleancss.com */
-
-/* ------------------- PROJECTS SEARCH FORM ------------------- */
-#projectSearch {
-  color: #444;
-  margin: 4px 0 0 0;
-}
-
-/*
-  FOOTER
-*/
-#ftlinks {
-  background: #fff;
-  color: #262626;
-  text-align: center;
-  border-top: 1px solid #fff;
-  font-size: 85%;
-  padding: 4px 0;
-  margin-top: 10px;
-}
-
-.ie-warn {
-  color: #EEE;
-  background: #FF5252;
-  padding: 0 5px;
-}
-
-.ie-warn a {
-  color: #EEE;
-  text-decoration: underline;
-}
-
-#ftlinks a {
-  color: #444;
-}
-
-/*
-  GENERAL
-*/
-a {
-  cursor: pointer;
-}
-
-.loading {
-  background: url("../images/loading.gif") no-repeat 4px 2px;
-  color: #444;
-  padding: 3px 25px;
-}
-
-.right {
-  text-align: right;
-}
-
-.left {
-  text-align: left;
-}
-
-.center {
-  text-align: center;
-}
-
-.top {
-  vertical-align: top;
-}
-
-.bottom {
-  vertical-align: bottom;
-}
-
-.middle {
-  vertical-align: middle;
-}
-
-.nowrap {
-  white-space: nowrap;
-}
-
-code {
-  font-size: 93%;
-}
-
-.hidden {
-  display: none;
-  visibility: hidden;
-}
-
-.clear {
-  height: 0;
-  clear: both;
-}
-
-.note {
-  color: #777;
-  font-size: 93%;
-  font-weight: normal;
-  line-height: 13px;
-}
-
-.note img {
-  vertical-align: bottom;
-}
-
-.crossout {
-  text-decoration: line-through;
-}
-
-.small {
-  font-size: 85%;
-}
-
-input[type].small {
-
-}
-
-small {
-  color: #AAA;
-  font-size: 85%;
-  font-style: normal;
-}
-
-em {
-  font-weight: bold;
-}
-
-em.mandatory {
-  color: #990000;
-  font-style: italic;
-}
-
-a.external {
-  background: url('../images/links/external.png') no-repeat 100% 0;
-  padding: 0 16px 0 0;
-}
-
-.fav {
-  display: inline-block;
-  background: url('../images/star.png') no-repeat 100% 0;
-  width: 16px;
-  height: 16px;
-  vertical-align: text-bottom;
-}
-
-.notfav {
-  display: inline-block;
-  background: url('../images/star_off.png') no-repeat 100% 0;
-  width: 16px;
-  height: 16px;
-  vertical-align: text-bottom;
-}
-
-.red-button {
-  color: #990000 !important;
-}
-
-.red-button:hover {
-  color: #FFFFFF !important;
-  border: solid 1px #CD504A !important;
-  background: #B33630 !important;
-  background: -webkit-gradient(linear, left top, left bottom, from(#DC5F59), to(#B33630)) !important;
-  background: -moz-linear-gradient(top, #DC5F59, #B33630) !important;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#DC5F59', endColorstr = '#B33630') !important;
-}
-
-.red-button:active {
-  color: #FFFFFF !important;
-  border: solid 1px #CD504A !important;
-  background: #B33630 !important;
-  background: -webkit-gradient(linear, left top, left bottom, from(#AC2F29), to(#D35650)) !important;
-  background: -moz-linear-gradient(top, #AC2F29, #D35650) !important;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#AC2F29', endColorstr = '#D35650') !important;
-}
-
-.red-button[disabled] {
-  position: relative;
-  top: 0;
-  text-shadow: 1px 1px 0 #FFFFFF;
-  color: #BBBBBB;
-  border: solid 1px #DDD;
-  background: #EBEBEB;
-  background: -webkit-gradient(linear, left top, left bottom, from(#FFFFFF), to(#E1E1E1));
-  background: -moz-linear-gradient(top, #FFFFFF, #E1E1E1);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#FFFFFF', endColorstr = '#E1E1E1');
-  cursor: default;
-}
-
-/* ------------------- PAGE ------------------- */
-h1, .h1 {
-  color: #444;
-  font-size: 16px;
-}
-
-h1 a {
-  color: #444;
-  text-decoration: none;
-  border-bottom: 1px dotted #2B547D;
-}
-
-h2, .h2 {
-  color: #2B547D;
-  font-size: 16px;
-  font-weight: normal;
-}
-
-h2 a {
-  color: #2B547D;
-  text-decoration: none;
-  border-bottom: 1px dotted #2B547D;
-}
-
-h3, .h3 {
-  font-size: 100%;
-  font-weight: bold;
-}
-
-h4, .h4 {
-  font-size: 85%;
-  color: #777;
-}
-
-h1 img, .h1 img, h2 img, .h2 img, h3 img, .h3 img, h4 img, .h4 img {
-  vertical-align: middle;
-}
-
-.subtitle {
-  color: #777;
-  font-size: 85%;
-  margin: 0;
-  padding: 0;
-}
-
-.notes {
-  color: #777;
-  font-size: 11px;
-  margin-bottom: 10px;
-  background-color: #EFEFEF;
-  border: 1px solid #cdcdcd;
-  line-height: 16px;
-  height: 16px;
-  padding: 2px 4px;
-}
-
-.treemap {
-  position: relative;
-  cursor: pointer;
-}
-
-.treemap a {
-  color: #FFF;
-  text-decoration: none;
-  font-size: 12px;
-  padding: 1px;
-}
-.treemap a:hover {
-  text-decoration: underline;
-}
-
-/* ------------------- MESSAGES ------------------- */
-.warning {
-  border: solid 1px #FFD324;
-  background-color: #FFF6BF;
-  color: #514721;
-  margin: 0 0 4px;
-  padding: 4px;
-}
-
-.error {
-  border: 1px solid red;
-  background-color: #FF5252;
-  color: #eee;
-  margin: 0 0 4px;
-  padding: 4px;
-}
-
-.error a {
-  color: #eee;
-}
-
-.notice {
-  border: 1px solid #9c9;
-  background-color: #e2f9e3;
-  color: #060;
-  margin: 0 0 4px;
-  padding: 4px;
-}
-
-.info {
-  background-color: #CAE3F2;
-  padding: 5px;
-  border: 1px solid #4B9FD5;
-}
-
-/* ------------------- SETUP / MIGRATION PAGES ------------------- */
-.migration {
-  background-image: url("../images/sonarqube-24x100.png");
-  background-repeat: no-repeat;
-  background-position: top right;
-}
-
-/* ------------------- LOGIN FORM ------------------- */
-#login_form {
-  border: 2px solid #4b9fd5;
-  width: 230px;
-  text-align: left;
-  background-color: #CAE3F2;
-  padding: 15px 20px;
-}
-
-#login_form h4 {
-  text-align: left;
-  font-weight: bold;
-  color: #036;
-}
-
-#login_form p {
-  padding: 3px 0 10px;
-}
-
-#login_form .desc {
-  font-size: 85%;
-  font-weight: normal;
-}
-
-/* ------------------- DOCUMENTATION --------------------- */
-.doc h2 {
-  margin-top: 8px;
-}
-
-.doc p {
-  margin: 8px 0;
-}
-
-.doc pre, pre.code {
-  color: #777;
-  background-color: #EFEFEF;
-  padding: 10px;
-  margin: 10px 0;
-  border: 1px dashed #777;
-  font-size: 93%;
-  line-height: 1.5em;
-}
-
-.doc li {
-  list-style: disc outside;
-  padding: 2px;
-}
-
-.doc ul {
-  list-style: none outside;
-  padding-left: 30px;
-}
-
-/* ------------------- TABLES ------------------- */
-.odd {
-  background-color: #fff;
-}
-
-.odd.selected, .even.selected, .odd.selected a, .even.selected a, .even.selected span, .odd.selected span {
-  background-color: #4b9fd5;
-  color: #fff;
-}
-
-table.data > thead > tr > th {
-  font-size: 93%;
-  padding: 4px 7px 4px 3px;
-  font-weight: bold;
-  vertical-align: top;
-}
-
-table.data > tfoot > tr > td {
-  font-size: 93%;
-  color: #777;
-  padding: 5px;
-}
-
-table.data > tbody > tr > td {
-  padding: 5px;
-  vertical-align: text-top;
-}
-
-table.data td.small, table.data th.small {
-  padding: 0;
-  white-space: nowrap;
-}
-
-table.data th img, table.data td img {
-  vertical-align: sub;
-}
-
-table.data.zebra tbody tr:nth-child(odd) {
-  background-color: #EFEFEF;
-}
-
-.data thead tr.total {
-  background-color: #EFEFEF;
-  font-weight: normal;
-  border: 1px solid #DDD;
-}
-
-.data thead tr.total th {
-  font-weight: normal;
-}
-
-.data thead tr.blank {
-  background-color: #fff;
-  line-height: 15px;
-}
-
-.data tr.highlight {
-  background-color: #CAE3F2;
-  border-top: 1px solid #4B9FD5;
-  border-bottom: 1px solid #4B9FD5;
-}
-
-.data input, .data select, .data button {
-  vertical-align: baseline;
-}
-
-.data td.category {
-  padding-right: 15px;
-}
-
-.categoryDescription {
-  padding: 10px 5px;
-}
-
-.data td.category.withSubcategories {
-  background-image: url('../images/bullet_arrow_down.gif');
-  background-position: right center;
-  background-repeat: no-repeat;
-}
-
-.data td.subcategory {
-  padding-left: 20px;
-}
-
-.hoverable:hover {
-  background-color: #CAE3F2;
-}
-
-.hoverable:hover a {
-  color: #111;
-}
-
-table.sortable .sortcol {
-  cursor: pointer;
-  padding-left: 15px;
-  background-repeat: no-repeat;
-  background-position: right center;
-  text-decoration: underline;
-}
-
-table.sortable .sortasc {
-  background-image: url('../images/bullet_arrow_up.gif');
-  background-position: left center;
-}
-
-table.sortable .sortdesc {
-  background-image: url('../images/bullet_arrow_down.gif');
-  background-position: left center;
-}
-
-table.sortable .righticon {
-  padding-right: 15px;
-  background-position: right center;
-}
-
-table.sortable .nosort {
-  cursor: default;
-}
-
-table.spaced th {
-  font-weight: bold;
-  color: #333;
-  padding: 4px 5px;
-}
-
-table.spaced td, table.matrix tfoot td {
-  padding: 3px 5px;
-  line-height: 18px;
-}
-
-table.spaced td img {
-  vertical-align: text-bottom;
-}
-
-table.spacedicon th {
-  font-weight: bold;
-  color: #333;
-  padding: 4px 5px;
-}
-
-table.spacedicon td {
-  padding: 0 5px;
-  height: 24px;
-}
-
-.thin {
-  width: 1%;
-}
-
-td.sep {
-  width: 10px;
-}
-
-.spacer {
-  width: 5px;
-  display: inline-block;
-}
-
-.formError {
-  display: inline-block;
-  background-color: #FF9090;
-  color: #000;
-  padding: 0 5px;
-}
-
-table.form td {
-  padding: 2px 5px;
-  vertical-align: top;
-}
-
-table.form td.keyCell {
-  width: 1%;
-  white-space: nowrap;
-  text-align: right;
-  font-weight: bold;
-  vertical-align: top;
-}
-
-table.form td img {
-  vertical-align: bottom;
-}
-
-.admin hr {
-  background: transparent;
-  border-left: none;
-  border-right: none;
-  border-top: none;
-  border-bottom: 1px dashed #FFD324;
-  height: 1px;
-}
-
-table#project-history > tbody > tr > td {
-  vertical-align: top;
-}
-
-/* OPERATIONS */
-#page-operations {
-  display: inline-block;
-  width: 100%;
-}
-
-div.operations {
-  float: right;
-  margin: 0;
-}
-
-ul.operations {
-  float: right;
-  height: 20px;
-  line-height: 20px;
-  list-style-type: none;
-  margin: 0;
-  background-color: #EFEFEF;
-  border: 1px solid #cdcdcd;
-  border-radius: 3px;
-  -moz-border-radius: 3px;
-  -webkit-border-radius: 3px;
-}
-
-ul.operations li {
-  float: left;
-  margin: 0;
-  padding: 0 8px;
-  font-size: 85%;
-  border-right: 1px solid #cdcdcd;
-}
-
-ul.operations li.selected {
-  background-color: #d4d4d4;
-}
-
-ul.operations li.last {
-  border-right-width: 0;
-}
-
-ul.operations li a {
-  color: #555;
-}
-
-ul.operations li img {
-  vertical-align: middle;
-  margin-right: 5px;
-}
-
-th.operations, td.operations {
-  text-align: right;
-}
-
-/* RESOURCE VIEWER */
-.resourceName h1 {
-  margin: 5px 0;
-}
-
-/* SOURCE */
-.sources2 {
-  width: 100%;
-  border: 0;
-  margin: 0;
-  background-color: #FFF;
-}
-
-.sources2 td.lid {
-  background-color: #EFEFEF;
-  border-right: 1px solid #DDDDDD;
-  text-align: right;
-  padding: 2px 0.5em 0 0.5em;
-  vertical-align: top;
-  font-size: 85%;
-}
-
-.sources2 td.lid a {
-  text-decoration: none;
-  color: #AAA;
-}
-
-.sources2 td.scm {
-  border-right: 1px solid #DDD;
-  background-color: #EFEFEF;
-}
-
-.sources2 td.revision {
-  border-top: 1px solid #DDD;
-  vertical-align: top;
-  padding: 0 0.3em;
-  white-space: nowrap;
-}
-
-.sources2 tr:first-child td.revision {
-  border-top: none;
-}
-
-.sources2 tr.row td.plus {
-  background-color: #EFEFEF;
-  padding: 0;
-  width: 16px;
-}
-
-.sources2 tr.row:hover td.plus {
-  background: url("../images/add.png") no-repeat scroll left 0 #EFEFEF;
-}
-
-.sources2 td.plus a {
-  display: block;
-  cursor: pointer;
-  height: 16px;
-  width: 16px;
-}
-
-.sources2 td.gray {
-  background-color: #EFEFEF;
-  padding: 2px 0.5em 0;
-}
-
-.sources2 td.white {
-  border-left: 1px solid #DDD;
-  background-color: #FFF;
-}
-
-.sources2 span.date, .sources2 span.date a {
-  color: #AAA;
-  font-size: 85%;
-  text-decoration: none;
-}
-
-.sources2 span.author, .sources2 span.author a {
-  font-size: 85%;
-}
-
-.sources2 div.violation, #global_violations div.violation {
-  background-color: #FFF;
-  margin: 0;
-  border: 1px solid #DDD;
-  font-size: 12px;
-}
-
-.rulename, .rulename a {
-  color: #444;
-  font-weight: bold;
-}
-
-.rulename a:hover {
-  text-decoration: underline;
-}
-
-.sources2 td.line {
-  width: 100%;
-}
-
-.sources2 td.line pre {
-  font-size: 12px;
-  font-family: monospace;
-}
-
-.sources2 td.ind {
-  border-right: 1px solid #DDD;
-  padding: 0 0.3em;
-  text-align: center;
-  vertical-align: middle;
-}
-
-.sources2 td.ind a,.sources2 td.ind span {
-  padding: 0 3px;
-}
-
-.sources2 td.ok {
-  background-color: #ACE97C;
-}
-
-.sources2 td.warn {
-  background-color: #FFF6BF;
-}
-
-.sources2 td.ko {
-  background-color: #FF9090;
-}
-
-.sources2 td.new_section {
-  border-width: 1px 0;
-  border-style: solid;
-  border-color: #EEE #DDD;
-  height: 30px;
-  background: url('../images/gray-stripes.png');
-}
-
-.sources2 td.violations {
-  background-color: #FFF;
-  padding: 10px;
-  border-left: 1px solid #DDD;
-}
-
-.source_title {
-  padding: 10px 5px;
-}
-
-.source_title span.h1 {
-  font-size: 16px;
-  margin-right: 10px;
-}
-
-.source_links {
-  font-size: 11px;
-}
-
-.global_violations {
-  width: 100%;
-}
-
-.global_violations > tbody > tr > td {
-  padding-bottom: 10px;
-}
-
-.global_violations td {
-  padding: 3px 0;
-}
-
-.global_violations td img, #source_title img {
-  vertical-align: text-bottom;
-}
-
-.code-issue-create-form {
-  padding: 10px;
-}
-
-.code-global-issues {
-  padding: 10px 10px 0;
-}
-
-.code-issues {
-  background-color: #FFF;
-  padding: 10px 10px 0;
-  line-height: 0;
-}
-
-.code-issue {
-  background-color: #FFF;
-  margin: 0;
-  font-size: 12px;
-  padding: 0 0 10px 0;
-}
-
-.code-issue strong {
-  font-weight: bold;
-}
-
-.code-issue-toggle {
-  cursor: pointer;
-}
-
-.code-issue-name {
-  position: relative;
-  background-color: #E4ECF3;
-  margin: 0;
-  padding: 5px 10px;
-  line-height: 16px;
-  color: #777;
-  border: 1px solid #DDD;
-  border-bottom: medium none;
-}
-
-.code-issue-msg {
-  line-height: 1.5;
-  padding: 5px 10px;
-  border-left: 1px solid #DDD;
-  border-right: 1px solid #DDD;
-  background-color: #EFEFEF;
-}
-
-.code-issue-name img {
-  vertical-align: text-bottom;
-}
-
-.code-issue-name-rule {
-  max-width: 90%;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-.code-issue-permalink {
-  position: absolute;
-  top: 4px; right: 4px;
-}
-
-.code-issue-name-extra {
-  margin-top: 6px;
-  line-height: 12px;
-}
-
-.code-issue-name-extra li {
-  font-size: 11px !important;
-}
-
-.code-issue-name-right {
-  position: absolute;
-  top: 5px; right: 26px;
-}
-
-.code-issue-comment, .code-issue-msg, .code-issue-actions, .code-issue-form {
-  background-color: #EFEFEF;
-  border: 1px solid #DDD;
-  border-top: none;
-  line-height: 1.5em;
-  margin: 0;
-  padding: 5px 10px;
-}
-
-.code-issue-form input[type=submit],
-.code-issue-form input[type=button],
-.code-issue-form button,
-.code-issue-form .action {
-  vertical-align: middle;
-}
-
-.code-issue-comment h4 {
-  font-size: 11px;
-  margin-bottom: 2px;
-}
-
-.code-issue-comment h4 img {
-  vertical-align: sub;
-}
-
-.code-issue-comment li {
-  list-style: square inside;
-}
-
-.code-issue-comment pre {
-  padding: 10px;
-  border: 1px dashed #DDD;
-  color: #444;
-  font-size: 12px;
-}
-
-.code-issue-details {
-  padding: 0 0 5px;
-  border-left: 1px solid #DDD;
-  border-right: 1px solid #DDD;
-  border-bottom: 1px solid #DDD;
-  background-color: #EFEFEF;
-}
-
-.code-issue-details .ui-tabs-panel {
-  padding: 5px 10px 0;
-  line-height: 1.3;
-}
-
-.code-issue-details .tabs {
-  height: auto;
-  padding: 5px 10px;
-  border-bottom: 1px solid #DDD;
-}
-
-.code-issue-details .tabs li + li {
-  margin-left: 10px;
-}
-
-.code-issue-details .tabs li a:link,
-.code-issue-details .tabs li a:visited {
-  float: none;
-  margin: 0;
-  padding: 0;
-}
-
-.code-issue-details-list {
-
-}
-
-.code-issue-details-list > li {
-  font-size: 0;
-}
-
-.code-issue-details-term,
-.code-issue-details-value {
-  display: inline-block;
-  vertical-align: top;
-  font-size: 12px;
-  line-height: 20px;
-}
-
-.code-issue-details-term {
-  width: 90px;
-}
-
-.code-issue-details-term:after {
-  content: ":";
-}
-
-.code-issue-list {
-  font-size: 0;
-  white-space: nowrap;
-  background-color: #E4ECF3;
-}
-
-.code-issue-list > li {
-  display: inline-block;
-  vertical-align: middle;
-  height: 14px;
-  line-height: 14px;
-  padding: 0 8px;
-  border-left: 1px solid #fff;
-  border-right: 1px solid #bfbfbf;
-  font-size: 12px;
-}
-
-.code-issue-list > li:first-child {
-  padding-left: 0;
-  border-left: none;
-}
-
-.code-issue-list > li:last-child {
-  padding-right: 0;
-  border-right: none;
-}
-
-.code-issue-collapsed .code-issue-msg,
-.code-issue-collapsed .code-issue-details {
-  display: none;
-}
-
-.tab_header {
-  border-bottom: 1px solid #DDD;
-  background-color: #EFEFEF;
-  padding: 5px 10px;
-}
-
-.tab_header td {
-  padding-right: 7px;
-}
-
-.tab_header td.name {
-  text-align: left;
-  white-space: nowrap;
-}
-
-.tab_header td.value {
-  text-align: right;
-  white-space: nowrap;
-  font-weight: bold;
-}
-
-.source_options {
-  margin-top: 5px;
-  padding-top: 5px;
-  border-top: 1px solid #ddd;
-  font-size: 85%;
-}
-
-.source_options td {
-  background: url("../images/sep12.png") no-repeat scroll 0 50% transparent;
-  padding: 0 10px;
-}
-
-.source_options td.first {
-  background: none;
-  padding: 0 10px 0 0;
-}
-
-/* DUPLICATIONS */
-
-.duplications {
-  max-width: 100%;
-}
-
-.duplications td.item {
-  text-align: right;
-  vertical-align: top;
-  padding: 0;
-}
-
-.duplications td.item p {
-  padding: 3px 5px;
-}
-
-.duplications td.fileItem {
-  text-align: left;
-  vertical-align: top;
-  padding: 0;
-  white-space: nowrap;
-}
-
-.duplications td.fileItem p {
-  padding: 3px 5px;
-}
-
-.duplications td.item p.selected, .duplications td.fileItem p.selected {
-  background-color: #EFEFEF;
-  border-top: 1px solid #DDD;
-  border-bottom: 1px solid #DDD;
-  padding: 3px 5px;
-}
-
-.duplications td.fileItem p.selected a {
-  text-decoration: none;
-}
-
-.duplications td.sourceItem {
-  padding: 0;
-  background-color: #EFEFEF;
-  border: 1px solid #DDD;
-  border-left: none;
-}
-
-.duplications td.sourceItem p {
-  padding: 3px;
-}
-
-.duplicationsMessage {
-  padding: 10px;
-}
-
-.discussion {
-  width: 100%;
-  border: 1px solid #DDDDDD;
-}
-
-.discussionComment.first {
-  border-top: none;
-}
-
-.discussionComment {
-  background-color: #EFEFEF;
-  border-top: 1px solid #DDDDDD;
-  line-height: 1.5em;
-  margin: 0;
-  padding: 5px 10px;
-}
-
-.discussionComment h4 {
-  font-size: 90%;
-  margin-bottom: 2px;
-}
-
-.discussionComment h4 img {
-  vertical-align: sub;
-}
-
-.discussionComment li {
-  list-style: square inside;
-}
-
-.discussionComment pre {
-  padding: 10px;
-  border: 1px dashed #DDD;
-  color: #444;
-  font-size: 12px;
-}
-
-div.comment-excerpt {
-  background-color: transparent;
-  margin-top: 5px;
-  margin-bottom: 5px;
-  color: #777777;
-  font-size: 90%;
-}
-
-/* ACTION PLANS */
-table.actionPlans {
-  margin-top: 10px;
-}
-
-table.actionPlans td.progress {
-  width: 300px;
-  padding: 0px 40px;
-}
-
-table.actionPlans td.noprogress {
-  color: #777777;
-  font-size: 93%;
-  padding-left: 43px;
-  padding-right: 40px;
-}
-
-table.actionPlans td.over-due {
-  color: #CC0000;
-  font-weight: bold;
-}
-
-div.progress {
-  width: 100%;
-  margin: 4px;
-}
-
-div.progress table {
-  width: 100%;
-}
-
-div.progress td {
-  height: 10px;
-}
-
-div.progress td a {
-  display: block;
-  width: 100%;
-  height: 100%;
-}
-
-div.progress td.resolved {
-  background-color: #078C00;
-}
-
-div.progress td.open {
-  background-color: #CC0000;
-}
-
-div.progress div.note {
-  color: #777;
-  font-size: 93%;
-  font-weight: normal;
-  white-space: nowrap;
-}
-div.note a {
-  color: #777777;
-}
-
-/* SEARCH AUTOCOMPLETE FIELDS */
-#searchInput {
-  color: #444;
-  font-size: 13px;
-  padding-right: 20px;
-}
-
-#searchingResources {
-  position: absolute;
-  top: 8px;
-  right: 18px;
-}
-
-div.autocomplete {
-  position: absolute;
-  width: 600px;
-  right: 10px;
-  top: 10px;
-  background-color: #fff;
-  border: 1px solid #ccc;
-  margin: 0;
-  padding: 0;
-  color: #111;
-  line-height: 18px;
-  box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.5);
-  z-index: 999999;
-}
-
-div.autocomplete ul {
-  list-style-type: none;
-  margin: 0;
-  padding: 0;
-}
-
-div.autocomplete ul li {
-  list-style-type: none;
-  display: block;
-  margin: 0;
-  padding: 3px 5px;
-  cursor: pointer;
-  color: #333;
-  line-height: 18px;
-  height: 18px;
-  vertical-align: middle;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-div.autocomplete div.q {
-  font-size: 93%;
-  color: #777;
-  width: 90px;
-  text-align: right;
-  margin-right: 5px;
-  display: inline-block;
-
-  /* For IE 7 */
-  zoom: 1;
-  *display: inline;
-}
-
-div.autocomplete ul li img {
-  vertical-align: middle;
-}
-
-div.autocomplete ul li.selected {
-  background-color: #4b9fd5;
-  color: #fff;
-}
-
-div.autocomplete ul li.selected div.q {
-  color: #fff;
-}
-
-div.autocomplete strong {
-  font-weight: bold;
-}
-
-div.autocompleteNote {
-  color: #777;
-  font-size: 85%;
-  background-color: #EFEFEF;
-  border-top: 1px solid #CCC;
-  padding: 1px 10px;
-}
-
-#gwtpage {
-  width: 100%;
-}
-
-.gwt-SourcePanel {
-  font-size: 12px;
-  background-color: #fff;
-  border-top: 1px solid silver;
-  border-bottom: 1px solid silver;
-  width: 100%;
-}
-
-.gwt-SourcePanel .ln {
-  background-color: #EFEFEF;
-  white-space: nowrap;
-  text-align: right;
-  font-size: 85%;
-  color: #AAAAAA;
-  border-right: 1px solid #DDD;
-  padding: 0 3px;
-  height: 14px;
-}
-
-.gwt-SourcePanel .src {
-  padding: 0 5px;
-  height: 14px;
-}
-
-.gwt-SourcePanel .val {
-  background-color: #EFEFEF;
-  border-right: 1px solid #DDD;
-  text-align: right;
-  color: #777;
-  padding: 0 3px;
-  height: 14px;
-  white-space: nowrap;
-}
-
-.gwt-SourcePanel .red {
-  background-color: #F0C8C8;
-}
-
-.gwt-SourcePanel .orange {
-  background-color: #FFF6BF;
-  color: #514721;
-}
-
-.gwt-SourcePanel .green {
-  background-color: #ACE97C;
-}
-
-.gwt-SourcePanel .msg {
-  font-family: sans-serif;
-  vertical-align: top;
-  padding: 3px 0;
-  height: 1.3em;
-  background-position: 5px 1px;
-  background-repeat: no-repeat;
-}
-
-.gwt-SourcePanel .bigln {
-  font-family: sans-serif;
-  vertical-align: top;
-  padding: 3px 0;
-  height: 1.6em;
-  background-position: 5px 1px;
-  background-repeat: no-repeat;
-  background-color: #EFEFEF;
-}
-
-.gwt-SourcePanel .warn {
-  font-family: sans-serif;
-  vertical-align: top;
-  background-color: #FFFFC9;
-  border: 1px solid #DCDCDC;
-  border-top: none;
-  color: black;
-  line-height: 1.6em;
-  margin: 0;
-  padding: 0 0 2px 5px;
-}
-
-.gwt-SourcePanel .msg.error {
-  background-image: url("../images/exclamation.png");
-}
-
-.gwt-SourcePanel .msg.warning {
-  background-image: url("../images/warning.png");
-}
-
-.gwt-SourcePanel .msg.BLOCKER {
-  padding: 1px 5px 1px 25px;
-  background-image: url("../images/priority/BLOCKER.gif");
-  background-color: #FF5252;
-  color: #eee;
-  border: 1px solid red;
-  margin: 1px 0 1px 5px;
-  height: 100%;
-}
-
-.gwt-SourcePanel .msg.CRITICAL {
-  padding: 1px 5px 1px 25px;
-  background-image: url("../images/priority/CRITICAL.gif");
-  background-color: #FF5252;
-  color: #eee;
-  border: 1px solid red;
-  margin: 1px 0 1px 5px;
-  height: 100%;
-}
-
-.gwt-SourcePanel .msg.MAJOR {
-  padding: 1px 5px 1px 25px;
-  background-image: url("../images/priority/MAJOR.gif");
-  background-color: #FF5252;
-  color: #eee;
-  border: 1px solid red;
-  margin: 1px 0 1px 5px;
-  height: 100%;
-}
-
-.gwt-SourcePanel .msg.MINOR {
-  padding: 1px 5px 1px 25px;
-  background-image: url("../images/priority/MINOR.gif");
-  background-color: #FFF6BF;
-  border: 1px solid #FFD324;
-  margin: 1px 0 1px 5px;
-  height: 100%;
-}
-
-.gwt-SourcePanel .msg.INFO {
-  padding: 1px 5px 1px 25px;
-  background-image: url("../images/priority/INFO.gif");
-  background-color: #FFF6BF;
-  border: 1px solid #FFD324;
-  margin: 1px 0 1px 5px;
-  height: 100%;
-}
-
-.gwt-ViewerHeader {
-  background-color: #EFEFEF;
-  border: 1px solid #DDD;
-  border-top: none;
-  margin-bottom: 8px;
-  color: #333;
-  vertical-align: bottom;
-}
-
-.gwt-ViewerHeader .metric {
-  padding: 8px 2px 5px 10px;
-  font-size: 93%;
-  text-align: right;
-  font-weight: bold;
-}
-
-.gwt-ViewerHeader .value {
-  padding: 8px 15px 5px 2px;
-  font-size: 93%;
-  text-align: left;
-  font-weight: normal;
-}
-
-.gwt-ViewerHeader .cell {
-  padding: 3px 10px;
-}
-
-.gwt-ViewerHeader .big {
-  padding: 4px 10px 2px 10px;
-  font-size: 152%;
-  font-weight: bold;
-}
-
-/* ------------------- DASHBOARD ------------------- */
-.page_title {
-  margin: 0 0 7px 0;
-}
-
-.color_OK {
-  border: 2px solid #85bb43 !important;
-  color: #85bb43 !important;
-}
-
-.color_WARN {
-  border: 2px solid #f90 !important;
-  color: #f90 !important;
-}
-
-.color_ERROR {
-  border: 2px solid #d4333f !important;
-  color: #d4333f !important;
-}
-
-#alerts_widget {
-  margin-bottom: 10px;
-  padding: 5px 5px 5px 10px;
-}
-
-#alerts_widget img {
-  vertical-align: bottom;
-}
-
-span.empty_widget {
-  color: #777777;
-  font-size: 93%;
-}
-
-.dashbox {
-  float: left;
-  vertical-align: top;
-  text-align: left;
-  padding: 0 10px 7px 0;
-}
-
-.big {
-  font-size: 152%;
-  font-weight: bold;
-}
-
-.adminportlet {
-  border: 2px dashed #ccc;
-  margin-bottom: 10px;
-  padding: 10px;
-}
-
-table.header1 {
-  background-color: #EFEFEF;
-  color: #444;
-  border: 1px solid #DDD;
-  margin: 0 0 10px 0;
-  width: 100%;
-}
-
-table.header1 td {
-  padding: 10px 0 10px 10px;
-  text-align: left;
-  vertical-align: top;
-}
-
-.headerLine {
-  background-color: #EFEFEF;
-  color: #444;
-  border: 1px solid #DDD;
-  margin: 0 0 10px 0;
-  line-height: 28px;
-  height: 28px;
-}
-
-ul.headerLine li {
-  float: left;
-  display: block;
-  padding: 0 10px 0;
-  height: 28px;
-  vertical-align: middle;
-}
-
-ul.headerLine li.sep {
-  background: url("../images/sep12.png") no-repeat scroll 50% 50% transparent;
-  padding: 0 5px 0 5px;
-}
-
-ul.headerLine select, ul.headerLine input, ul.headerLine button, ul.headerLine textarea, ul.headerLine span {
-  vertical-align: middle;
-}
-
-select.withIcons option, span.withIcons {
-  background-repeat: no-repeat;
-  background-position: 2px 0;
-  padding: 0 2px 0 22px;
-  vertical-align: middle;
-}
-
-option.status_open {
-  background-image: url('../images/status/OPEN.png');
-}
-
-option.status_reopened {
-  background-image: url('../images/status/REOPENED.png');
-}
-
-option.status_resolved {
-  background-image: url('../images/status/RESOLVED.png');
-}
-
-option.status_closed {
-  background-image: url('../images/status/CLOSED.png');
-}
-
-option.sev_INFO, span.sev_INFO {
-  background-image: url('../images/priority/INFO.png');
-}
-
-option.sev_MINOR, span.sev_MINOR {
-  background-image: url('../images/priority/MINOR.png');
-}
-
-option.sev_MAJOR, span.sev_MAJOR {
-  background-image: url('../images/priority/MAJOR.png');
-}
-
-option.sev_CRITICAL, span.sev_CRITICAL {
-  background-image: url('../images/priority/CRITICAL.png');
-}
-
-option.sev_BLOCKER, span.sev_BLOCKER {
-  background-image: url('../images/priority/BLOCKER.png');
-}
-
-/* ------------------- VARIATIONS ------------------- */
-.var {
-  color: #444 !important;
-}
-
-.varb {
-  /* better */
-  color: #078C00 !important;
-}
-
-.varw {
-  /* worst */
-  color: #cc0000 !important;
-}
-
-/* ------------------- HELP ------------------- */
-.help {
-  border: 1px solid #DDD;
-  background-color: #EFEFEF;
-  color: #444;
-  padding: 5px;
-}
-
-.help h2 {
-  padding-left: 23px;
-  color: #444;
-  vertical-align: bottom;
-  font-weight: bold;
-  background: url('../images/information.png') no-repeat left center;
-}
-
-.help p {
-  padding: 5px 0;
-}
-
-/* ------------------- FORMS ------------------- */
-.admintable {
-  border: solid 1px #FFD324;
-  background-color: #FFF6BF;
-  color: #111;
-}
-
-.admintable td {
-  padding: 5px 10px;
-}
-
-.admintable span.desc {
-  font-size: 85%;
-  font-weight: normal;
-}
-
-/* ------------------- BOXES ------------------- */
-.box {
-  border: 1px solid #ccc;
-  background-color: #EFEFEF;
-  margin-bottom: 5px;
-  color: #444;
-  padding: 10px;
-}
-
-.box a, .box a:visited {
-  color: #555;
-}
-
-.admin {
-  border: solid 1px #FFD324;
-  background-color: #FFF6BF;
-  color: #514721;
-  margin-bottom: 5px;
-  padding: 5px;
-}
-
-.admin h3 {
-  font-size: 100%;
-  text-align: left;
-  font-weight: bold;
-  color: #333;
-}
-
-.column {
-  vertical-align: top;
-  text-align: left;
-  padding: 0 0 0 10px;
-}
-
-.column.first {
-  padding: 0;
-}
-
-.column h3 {
-  padding: 3px 0;
-}
-
-.scrollable {
-  height: 144px;
-  overflow: auto;
-  border: 1px solid #ccc;
-}
-
-.scroll-ie {
-  overflow-x: hidden;
-  padding-right: 17px;
-}
-
-.red {
-  color: #8B0000;
-}
-
-.green {
-  color: #050;
-}
-
-ul.bullet {
-  margin: 3px 0 3px 25px;
-}
-
-ul.bullet li {
-  padding: 2px 0;
-  list-style-image: url("../images/bullet.png");
-}
-
-.rule_title {
-  font-size: 110%;
-}
-
-.tablinks {
-  float: right;
-  padding: 0 5px 0 10px;
-  text-align: right;
-}
-
-.tablinks li {
-  float: left;
-  text-align: right;
-  margin-left: 5px;
-  padding: 0 0 0 5px;
-}
-
-.tablinks li.first {
-  background: none;
-}
-
-.tablinks a {
-  text-decoration: underline;
-  color: #777;
-  font-size: 85%;
-}
-
-.tabs-panel {
-  border-right: 1px solid #DDD;
-  border-bottom: 1px solid #DDD;
-  border-left: 1px solid #DDD;
-  border-top-width: 0;
-  padding: 10px;
-}
-
-/* tabs2 is deprecated since 4.1. It is kept for backward-compatibility */
-.tabs2, .tabs {
-  height: 20px;
-  border-bottom: 1px solid #DDD;
-  margin: 0;
-  padding: 0;
-  font-size: 93%;
-}
-
-.tabs2 li, .tabs li {
-  display: inline;
-  list-style-type: none;
-  font-weight: normal;
-  color: #777;
-  vertical-align: baseline;
-  white-space: nowrap;
-  margin: 0;
-  border: 0;
-  padding: 0;
-}
-
-.tabs li a {
-  outline: none;
-}
-
-.tabs2 li a, .tabs li a {
-  float: left;
-  color: #777;
-  vertical-align: bottom;
-  height: 17px;
-  margin: 0 1px 0 0;
-  padding: 1px 5px;
-}
-
-.tabs2 li a.selected, .tabs li a.selected, .tabs .ui-tabs-active a {
-  text-decoration: none;
-  color: #555 !important;
-  font-weight: bold;
-  margin: 0 1px 0 0;
-}
-
-.tabbed {
-  border: 1px solid silver;
-  border-top: 0;
-  padding: 5px;
-}
-.comments {
-  color: #777;
-  font-size: 12px;
-  margin-bottom: 10px;
-  padding: 4px;
-}
-
-.little {
-  font-size: 80%;
-}
-
-.tooltip {
-  position: absolute;
-  background-color: #CAE3F2;
-  border: 1px solid #4b9fd5;
-  max-width: 480px;
-  text-align: left;
-  color: #262626;
-}
-
-.tooltip .content {
-  color: #111;
-  padding: 4px;
-}
-
-.tooltip .title {
-  color: #111;
-  font-weight: bold;
-  font-size: 100%;
-  padding: 2px 4px;
-}
-
-.tooltip td {
-  margin: 0;
-  padding: 2px;
-}
-
-.tooltip p {
-  margin: 0;
-  padding: 0;
-}
-
-.alert_WARN {
-  background-color: #ff8500;
-  color: #fff;
-  margin: 0;
-  padding: 0 3px;
-}
-
-.alert_ERROR {
-  background-color: #f93f40;
-  color: #fff;
-  margin: 0;
-  padding: 0 3px;
-}
-
-#comparison span.best {
-  font-size: 108%;
-  font-weight: bold;
-}
-
-.gwt-TabBar {
-  font-size: 93%;
-  width: 100%;
-  border-bottom: 1px solid #cdcdcd;
-}
-
-.gwt-TabBarFirst {
-  width: 0;
-}
-
-.gwt-TabBar .gwt-TabBarItem {
-  cursor: pointer;
-  font-weight: normal;
-  text-decoration: underline;
-  color: #555;
-  background-color: #EFEFEF;
-  vertical-align: middle;
-  white-space: nowrap;
-  padding: 0.3em 0.6em;
-  border: 1px solid #cdcdcd;
-  border-bottom: none;
-  border-radius: 4px 4px 0 0;
-  -moz-border-radius: 4px 4px 0 0;
-  -webkit-border-radius: 4px 4px 0 0;
-}
-
-.gwt-TabBar .gwt-TabBarItem-wrapper {
-  padding: 0 0 0 1px;
-}
-
-.gwt-TabBar .gwt-TabBarItem-selected {
-  cursor: default;
-  font-weight: bold;
-  text-decoration: underline;
-  color: #efefef;
-  background-color: #4B9FD5;
-  border-bottom: none;
-  vertical-align: middle;
-  white-space: nowrap;
-  padding: 0.3em 0.6em;
-}
-
-.gwt-TabPanelBottom {
-  width: 100%;
-}
-
-.markdown-tips, .markdown-tips a {
-  font-size: 12px;
-  color: #777;
-}
-
-
-/* API for Rule and Property Descriptions  */
-.rule-desc h2 {
-  margin-top: 16px;
-  font-size: 16px;
-  line-height: 1.5;
-  color: #2B547D;
-}
-
-.rule-desc h3 {
-  margin-top: 16px;
-  font-size: 12px;
-  line-height: 1.5;
-  color: #2B547D;
-  font-weight: bold;
-}
-
-.rule-desc p, .property p {
-  margin-top: 10px;
-}
-
-.rule-desc pre, .property pre {
-  margin: 10px 0 !important;
-  padding: 10px !important;
-  border: 1px dashed #aaa;
-  font-size: 12px;
-  font-family: monospace;;
-}
-
-.rule-desc blockquote, .property blockquote {
-  margin-top: 10px;
-  padding: 10px;
-}
-
-.rule-desc ul, .property ul {
-  list-style-type: disc;
-  list-style-position: inside;
-  margin: 10px;
-}
-
-.rule-desc ol, .property ol {
-  list-style-type: decimal;
-  list-style-position: inside;
-  margin: 10px;
-}
-
-.rule-table {
-  margin-top: 10px;
-  overflow-x: auto;
-  border-collapse: collapse;
-}
-.rule-table th {
-  background: none no-repeat scroll right center #EFEFEF;
-  border: 1px solid #DDD;
-  padding: 5px 10px;
-  font-weight: bold;
-}
-.rule-table td {
-  background: none no-repeat scroll right center transparent;
-  border: 1px solid #DDD;
-  padding: 5px 10px;
-}
-/* End of API for Rule Descriptions */
-
-
-
-.tip:hover {
-  background: #FFF;
-  position: relative;
-  z-index: 100;
-}
-
-.tip span {
-  display: none;
-  margin-left: -20px;
-  padding: 4px 5px;
-}
-
-.tip:hover span {
-  display: inline;
-  position: absolute;
-  background: #CAE3F2;
-  border: 1px solid #4b9fd5;
-  color: #262626;
-  white-space: nowrap;
-  text-decoration: none;
-}
-
-.hbar {
-  float: left;
-  border: none;
-  clear: both;
-  width: 4em;
-  margin: 0;
-  padding: 2px 0 0;
-}
-
-.hbar li {
-  background-color: #777;
-  color: #FFF;
-  font-family: Verdana, Tahoma, Arial, sans-serif;
-  font-size: xx-small;
-  letter-spacing: -0.075em;
-  list-style: none;
-  line-height: 1.1em;
-  text-align: right;
-  vertical-align: middle;
-  padding: 0.1em;
-}
-
-div.barchart {
-  border: 0;
-  margin: 0;
-  padding: 0;
-  float: left;
-}
-
-div.barchart > div {
-  background-color: #4B9FD5;
-  height: 0.9em;
-}
-
-table.matrix thead {
-  background-color: #CAE3F2;
-  border: 1px solid #4b9fd5;
-}
-
-table.matrix thead th {
-  text-align: right;
-  border-right: 1px solid #4b9fd5;
-  padding: 4px 5px;
-}
-
-table.matrix tbody td {
-  border: 1px solid #ddd;
-  margin: 0;
-  padding: 4px 5px;
-}
-
-table.matrix tbody td.title {
-  border: none;
-  font-weight: bold;
-  margin: 0;
-  padding: 5px 0 0 5px;
-}
-
-a.nolink, .dashbox a, .dashbox a:visited {
-  text-decoration: none;
-}
-
-a.nolink:hover, .dashbox a:hover, .dashbox a.action, .dashbox a.action:visited {
-  text-decoration: underline;
-}
-
-h1 strong, .dashbox .title, .gwt-SourcePanel .sources .msg li strong {
-  font-weight: bold;
-}
-
-h4 a, h4 a:visited, .gray, table.data tfoot a, table.data tfoot a:visited {
-  color: #777;
-}
-
-.even, table.sortable tr.rowodd {
-  background-color: #EFEFEF;
-}
-
-.bordered, table.data > thead {
-  border-bottom: 1px solid #ddd;
-}
-
-table.data > tbody {
-  border-bottom: 1px solid #ddd;
-  border-right: 1px solid #ddd;
-  border-left: 1px solid #ddd;
-}
-
-table.data, table.spaced, .gwt-SourcePanel .sources {
-  width: 100%;
-}
-
-table.data td.barchart {
-  width: 100px;
-}
-
-table.without-header {
-  border-top: 1px solid #ddd;
-}
-
-.hoverable.selected a {
-  color: #fff;
-}
-
-.gwt-SourcePanel .sources td {
-  vertical-align: top;
-}
-
-/* GENERIC STYLES */
-.line-block {
-  display: block;
-  width: 100%;
-  height: 24px;
-  line-height: 22px;
-  margin-bottom: 5px;
-}
-
-.line-info {
-  background: url('../images/information.png') no-repeat scroll left 50% transparent;
-  padding-left: 18px
-}
-
-div.break10 {
-  height: 10px;
-}
-
-div.break30 {
-  height: 30px;
-}
-
-.marginbottom10 {
-  margin-bottom: 10px;
-}
-
-.marginbottom5 {
-  margin-bottom: 5px;
-}
-
-.marginright10 {
-  margin-right: 10px;
-}
-
-.marginleft10 {
-  margin-left: 10px;
-}
-
-.width100 {
-  width: 100%;
-}
-
-ul.horizontal {
-  list-style-type: none;
-}
-
-ul.horizontal li {
-  float: left;
-  position: relative;
-}
-
-table.nowrap td, td.nowrap, th.nowrap {
-  white-space: nowrap;
-}
-
-table.nowrap td.small, td.nowrap.small, th.nowrap.small {
-  line-height: 16px;
-}
-
-.background-gray {
-  background-color: #EFEFEF;
-  color: #444;
-}
-
-/* CONFIGURATION OF Q PROFILES */
-.bulk-edit {
-  display: block;
-  background: url("../images/bulk-edit.png") no-repeat scroll left 50% transparent;
-  padding: 2px 0 2px 20px;
-}
-
-.csv {
-  display: block;
-  background: url("../images/csv.png") no-repeat scroll left 50% transparent;
-  padding: 2px 0 2px 20px;
-}
-
-.add {
-  display: block;
-  background: url("../images/add.png") no-repeat scroll left 50% transparent;
-  padding: 2px 0 2px 20px;
-}
-
-.restore {
-  display: block;
-  background: url("../images/restore.gif") no-repeat scroll left 50% transparent;
-  padding: 2px 0 2px 20px;
-}
-
-.compare {
-  display: block;
-  background: url("../images/compare.png") no-repeat scroll left 50% transparent;
-  padding: 2px 0 2px 20px;
-}
-
-/* Profile diff */
-.diffParam {
-  font-family: 'Bitstream Vera Sans Mono', 'Courier', monospace;
-}
-
-.yellowHighlight {
-  background: #FFFBCC;
-}
-
-.action {
-  text-decoration: underline;
-  cursor: pointer;
-}
-
-/* Used on links which are located inside a dense text place or in tables */
-/* in order to rapidly identify them                                      */
-.link-action {
-  text-decoration: underline !important;
-  color: #4183C4 !important;
-  cursor: pointer;
-}
-
-.link-red {
-  color: #990000 !important;
-}
-
-.link-more {
-  background-image: url('../images/bullet_arrow_down.png');
-  background-repeat: no-repeat;
-  padding-right: 20px;
-  background-position: right center;
-  cursor: pointer;
-}
-
-.dropdown {
-  cursor: pointer;
-  display: inline-block;
-  text-decoration: none !important;
-  /* zoom and *display = ie7 hack for display:inline-block */
-  zoom: 1;
-  *display: inline;
-}
-
-.dropdown-menu {
-  background-clip: padding-box;
-  background-color: #FFFFFF;
-  border: 1px solid #DDD;
-  box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.5);
-  float: left;
-  margin: 0;
-  max-width: 220px;
-  min-width: 160px;
-  padding: 0;
-  position: absolute;
-  z-index: 1000;
-}
-
-.dropdown-menu h2 {
-  padding: 0 8px;
-  font-size: 100%;
-  font-weight: bold;
-}
-
-.dropdown-menu li {
-  list-style-type: none !important;
-  line-height: 24px;
-  height: 24px;
-  padding: 0 8px;
-  cursor: pointer !important;
-  float: none !important;
-}
-
-.dropdown-menu li:hover {
-  background-color: #4b9fd5 !important;
-}
-
-.dropdown-menu li:hover a {
-  color: #fff !important;
-}
-
-.dropdown-menu a {
-  text-decoration: none !important;
-  color: #333 !important;
-}
-
-.form-key-cell {
-  padding: 2px 8px 4px 10px;
-  text-align: right;
-  width: 1%;
-  white-space: nowrap;
-  vertical-align: top;
-}
-
-.form-val-cell {
-  padding: 2px 8px 4px 0;
-  text-align: left;
-  white-space: normal;
-}
-
-.form-val-cell li {
-  margin-bottom: 5px;
-}
-
-.form-val-note {
-  color: #999;
-}
-
-blockquote {
-  border-left: 3px solid #E5E5E5;
-  padding: 0 8px;
-  line-height: 16px;
-}
-
-blockquote cite {
-  line-height: 16px;
-  background-image: url('../images/reviews/comment.png');
-  background-repeat: no-repeat;
-  padding-left: 20px;
-  background-position: left center;
-  font-size: 12px;
-  color: #888;
-}
-
-.spacer-left {
-  margin-left: 8px;
-}
-
-.spacer-right {
-  margin-right: 8px;
-}
-
-.spacer-bottom {
-  margin-bottom: 8px;
-}
-
-.spacer-top {
-  margin-top: 8px;
-}
-
-td.spacer-left {
-  padding-left: 8px;
-}
-
-td.spacer-right {
-  padding-right: 8px;
-}
-
-td.spacer-bottom {
-  padding-bottom: 8px;
-}
-
-td.spacer-top {
-  padding-top: 8px;
-}
-
-.bordered {
-  border: 1px solid #DDD;
-}
-
-.bordered-left {
-  border-left: 1px solid #DDD;
-}
-
-.bordered-right {
-  border-right: 1px solid #DDD;
-}
-
-.bordered-bottom {
-  border-bottom: 1px solid #DDD;
-}
-
-.bordered-top {
-  border-top: 1px solid #DDD;
-}
-
-.table > thead > tr > th {
-  border-top: 0 none;
-  font-weight: bold;
-  vertical-align: bottom;
-  line-height: 16px;
-  padding: 4px 5px;
-  vertical-align: bottom;
-}
-
-.table > tbody > tr > td {
-  line-height: 16px;
-  padding: 4px 5px;
-  vertical-align: top;
-}
-
-.table > tfoot > tr > td {
-  font-size: 93%;
-  color: #777;
-  padding: 4px 5px;
-}
-
-.table > tfoot > tr > td a {
-  color: #777;
-}
-
-.table-bordered > tbody {
-  border-left: 1px solid #DDD;
-  border-right: 1px solid #DDD;
-  border-bottom: 1px solid #DDD;
-}
-
-.table-bordered > tbody > tr > td {
-  border-top: 1px solid #DDD;
-}
-
-select.small-width {
-  max-width: 120px;
-}
-
-select.medium-width {
-  max-width: 175px;
-  width: 175px;
-}
-
-/*
-
- MODAL WINDOWS
-
-*/
-.modal-head {
-  padding: 0 10px;
-  background-color: #EFEFEF;
-  border-bottom: 1px solid #DDD;
-}
-
-.modal-head h1, .modal-head h2 {
-  line-height: 30px;
-  min-height: 30px;
-}
-
-ul.modal-head-metadata {
-  overflow: hidden;
-  padding: 0 0 5px 0;
-}
-
-ul.modal-head-metadata li {
-  float: left;
-  position: relative;
-  font-size: 85%;
-  color: #777;
-}
-
-.modal-body {
-  padding: 10px;
-}
-
-.modal-body .notes {
-  height: auto;
-}
-
-.modal-field {
-  clear: both;
-  display: block;
-  padding: 5px 0 5px 130px;
-}
-
-.modal-field label {
-  display: block;
-  float: left;
-  text-align: right;
-  width: 130px;
-  left: -140px;
-  margin-right: -130px;
-  line-height: 1;
-  word-wrap: break-word;
-  position: relative;
-  padding-top: 5px;
-}
-
-.modal-field input {
-  margin-right: 5px;
-  margin-bottom: 10px;
-}
-
-.modal-field input[type=text],
-.modal-field input[type=password],
-.modal-field textarea {
-  width: 250px;
-}
-
-.modal-field .text {
-  line-height: 20px;
-}
-
-.modal-foot {
-  text-align: right;
-  padding: 2px 10px;
-  border-top: 1px solid #CCC;
-  line-height: 30px;
-  height: 30px;
-  background-color: #EFEFEF;
-}
-
-.modal-foot input {
-  margin-right: 10px;
-}
-
-.modal-field-description {
-  clear: both;
-  font-size: 93%;
-  color: #777;
-}
-
-.modal-error {
-  border: 1px solid red;
-  background-color: #FF5252;
-  color: #eee;
-  margin: 0 0 4px;
-  padding: 4px;
-  display: none;
-}
-
-textarea.width100 {
-  width: 100%;
-  -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box; /* Firefox, other Gecko */
-  box-sizing: border-box; /* Opera/IE 8+ */
-}
-
-.property {
-  margin-bottom: 10px:
-}
-
-.property h3 {
-  float: none;
-  max-width: 20em;
-}
-
-.property > th, .property > td {
-  vertical-align: top;
-  padding: 10px;
-}
-
-.property > th {
-  text-align: right;
-}
-
-.property table.data {
-  width: 480px;
-}
-
-.property textarea {
-  vertical-align: text-top;
-}
-
-.property .note {
-  margin-top: 5px;
-}
-
-/* ------------------- Accordion navigation styles ------------------- */
-
-.accordion-item {
-  border: 1px solid #DDD;
-  margin-bottom: 20px;
-}
-
-.accordion-item table.data {
-  /* Fix an issue on Google Chrome to prevent the horizontal scroll to appear */
-  border-collapse : separate;
-}
-
-.accordion-item-body-medium {
-  max-height: 200px;
-  overflow: auto;
-}
-
-
-/* ------------------- Rule styles ------------------- */
-
-.rule-search {
-  display: inline-block;
-  line-height: 16px;
-}
-
-div.rule-title {
-  display: inline-block;
-  float: left;
-  clear: right;
-}
-
-#result_table .rule-desc {
-  width: 100%;
-  float: left;
-  clear: right;
-}
-
-.rule-status, .rule-tags {
-  display: inline-block;
-  margin-left: 10px;
-  float: right;
-  padding: 3px 5px 0 0;
-  font-size: 85%;
-  color: #777;
-}
-
-.rule-tags a {
-  color: inherit;
-  text-decoration: none;
-}
-
-.rule-status span {
-  text-transform: uppercase;
-}
-
-.rule-tags span {
-  background-color: #eee;
-  padding: 3px 4px;
-  margin: 4px 2px;
-  border-radius: 2px;
-  box-shadow: 0px -1px 0px rgba(0, 0, 0, 0.12) inset;
-}
-
-/* ------------------- Role search styles ------------------- */
-
-.project-search {
-  display: inline-block;
-  line-height: 16px;
-  padding: 4px 2px;
-}
-
-
-
-
-.sonar-d3 {
-
-}
-
-.sonar-d3 .axis path {
-  fill: none;
-  stroke: #444;
-}
-
-.sonar-d3 .tick line {
-  stroke: #444;
-}
-
-.sonar-d3 .tick text {
-  fill: #444;
-}
-
-.sonar-d3 .plot {
-  transition: all 0.2s ease;
-}
-
-.sonar-d3 .plot:hover .arc,
-.sonar-d3 .plot.hover .arc {
-  opacity: 0.4;
-}
-
-.sonar-d3 .plot .arc:hover,
-.sonar-d3 .plot .arc.hover {
-  opacity: 1;
-}
-
-.sonar-d3 .plot .line {
-  fill: none;
-  stroke: #000;
-  stroke-width: 2;
-}
-
-.sonar-d3 .plot .line-marker {
-  fill: #fff;
-  stroke: #000;
-  stroke-width: 2;
-  opacity: 0;
-}
-
-.sonar-d3 .plot .scanner {
-  stroke: #000;
-  opacity: 0.25;
-}
-
-.sonar-d3 .arc,
-.sonar-d3 .bar rect {
-  cursor: pointer;
-  stroke: #fff;
-  stroke-width: 1px;
-  transition: all 0.2s ease;
-}
-
-.sonar-d3 .bar,
-.sonar-d3 .bar .legend-text,
-.sonar-d3 .pie-legend,
-.sonar-d3 .pie-legend .legend-text {
-  cursor: pointer;
-}
-
-.sonar-d3 .legend {
-
-}
-
-.sonar-d3 .legend-bullet {
-  transition: all 0.2s ease;
-}
-
-.sonar-d3 .legend-text {
-  font-size: 12px;
-  cursor: default;
-}
-
-.sonar-d3 .legend-active .legend-bullet {
-  -webkit-transform: scale(1.4);
-  -webkit-transform-origin: center;
-}
-
-.sonar-d3 .details-color-indicator {
-  fill: #fff;
-  transition: fill 0.2s ease;
-}
-
-.sonar-d3 .details-metric {
-  font-size: 12px;
-}
-
-.sonar-d3 .details-metric-main {
-  font-weight: bold;
-}
-
-.sonar-d3 .info {
-
-}
-
-.sonar-d3 .info-text {
-  font-size: 13px;
-}
-
-.sonar-d3 .info-text-bold {
-  font-weight: bold;
-}
-
-.sonar-d3 .info-text-small {
-  font-size: 12px;
-}
-
-.sonar-d3 .event-tick {
-  fill: none;
-  stroke: #000;
-  stroke-width: 1px;
-  transition: all 0.3s ease;
-}
-
-/* ------------------- Admin pages ------------------- */
-
-.admin-page-title {
-  margin-bottom: 0px;
-}
-
-.admin-page-description {
-  font-size: 85%;
-  font-weight: normal;
-  margin-bottom: 25px;
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/ui.css b/sonar-server/src/main/webapp/stylesheets/ui.css
deleted file mode 100644 (file)
index 14ff2e2..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Fonts
- */
-/*
- * Colors
- */
-/*
- * Icons
- */
-/*
- * Transitions
- */
-input[type=text],
-input[type=password],
-input[type=email],
-textarea {
-  border: 1px solid #cdcdcd;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  background: #fff;
-  color: #444444;
-  transition: border-color 0.3s ease;
-}
-input[type=text]:active,
-input[type=password]:active,
-input[type=email]:active,
-textarea:active,
-input[type=text]:focus,
-input[type=password]:focus,
-input[type=email]:focus,
-textarea:focus {
-  border-color: #4b9fd5;
-  box-shadow: none;
-  outline: none;
-}
-input[type=text],
-input[type=password],
-input[type=email] {
-  height: 22px;
-  padding: 0 3px;
-}
-textarea {
-  padding: 3px;
-}
-button,
-.button,
-input[type=submit],
-input[type=button] {
-  display: inline-block;
-  vertical-align: baseline;
-  height: 22px;
-  margin: 0 1px;
-  padding: 2px 10px;
-  border: 1px solid #cdcdcd;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  background: #f4f4f4;
-  color: #444444;
-  font-weight: bold;
-  font-size: 13px;
-  text-align: center;
-  text-decoration: none;
-  cursor: pointer;
-  outline: none;
-  transition: border-color 0.3s ease;
-}
-button:hover,
-.button:hover,
-input[type=submit]:hover,
-input[type=button]:hover {
-  border-color: #5281a0;
-  background: #4b9fd5;
-  color: #fff;
-}
-button:active,
-.button:active,
-input[type=submit]:active,
-input[type=button]:active {
-  border-color: #2790c0;
-  background: #78bdea;
-  color: #fff;
-}
-button:focus,
-.button:focus,
-input[type=submit]:focus,
-input[type=button]:focus {
-  border-color: #4b9fd5;
-}
-button[disabled],
-.button[disabled],
-input[type=submit][disabled],
-input[type=button][disabled],
-button[disabled]:hover,
-.button[disabled]:hover,
-input[type=submit][disabled]:hover,
-input[type=button][disabled]:hover,
-button[disabled]:active,
-.button[disabled]:active,
-input[type=submit][disabled]:active,
-input[type=button][disabled]:active,
-button[disabled]:focus,
-.button[disabled]:focus,
-input[type=submit][disabled]:focus,
-input[type=button][disabled]:focus {
-  color: #bbb;
-  border-color: #ddd;
-  background: #ebebeb;
-  cursor: default;
-}
-.button-red:hover,
-.button-red:focus {
-  border-color: #900;
-  background: #cc0000;
-  color: #fff;
-}
-.button-red:active {
-  border-color: #900;
-  background: #ff0000;
-}
-.button-group {
-  display: inline-block;
-  vertical-align: middle;
-  font-size: 0;
-  white-space: nowrap;
-}
-.button-group > button {
-  position: relative;
-  z-index: 2;
-  display: inline-block;
-  vertical-align: middle;
-  margin: 0;
-  padding: 2px 8px;
-  font-size: 11px;
-  font-weight: normal;
-  cursor: pointer;
-}
-.button-group > button:hover,
-.button-group > button:focus {
-  z-index: 3;
-}
-.button-group > button + button {
-  margin-left: -1px;
-}
-.button-group > a {
-  vertical-align: middle;
-  margin: 0 8px;
-  font-size: 11px;
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/ui.less b/sonar-server/src/main/webapp/stylesheets/ui.less
deleted file mode 100644 (file)
index 6627c09..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-@import "variables";
-@import "mixins";
-
-input[type=text],
-input[type=password],
-input[type=email],
-textarea {
-  border: 1px solid @darkGrey;
-  .box-sizing(border-box);
-  background: #fff;
-  color: @baseFontColor;
-  .trans(border-color);
-
-  &:active,
-  &:focus {
-    border-color: @highlighted;
-    box-shadow: none;
-    outline: none;
-  }
-}
-
-input[type=text],
-input[type=password],
-input[type=email] {
-  height: 22px;
-  padding: 0 3px;
-}
-
-textarea {
-  padding: 3px;
-}
-
-button,
-.button,
-input[type=submit],
-input[type=button] {
-  display: inline-block;
-  vertical-align: baseline;
-  height: 22px;
-  margin: 0 1px;
-  padding: 2px 10px;
-
-  border: 1px solid @darkGrey;
-  .box-sizing(border-box);
-
-  background: #f4f4f4;
-
-  color: @baseFontColor;
-  font-weight: bold;
-  font-size: @baseFontSize;
-  text-align: center;
-  text-decoration: none;
-
-  cursor: pointer;
-  outline: none;
-  .trans(border-color);
-
-  &:hover {
-    border-color: #5281a0;
-    background: #4b9fd5;
-    color: #fff;
-  }
-
-  &:active {
-    border-color: #2790c0;
-    background: #78bdea;
-    color: #fff;
-  }
-
-  &:focus {
-    border-color: @highlighted;
-  }
-
-  &[disabled],
-  &[disabled]:hover,
-  &[disabled]:active,
-  &[disabled]:focus {
-    color: #bbb;
-    border-color: #ddd;
-    background: #ebebeb;
-    cursor: default;
-  }
-}
-
-.button-red {
-  &:hover, &:focus {
-    border-color: #900;
-    background: lighten(#900, 10%);
-    color: #fff;
-  }
-
-  &:active {
-    border-color: #900;
-    background: lighten(#900, 20%);
-  }
-}
-
-.button-group {
-  display: inline-block;
-  vertical-align: middle;
-  font-size: 0;
-  white-space: nowrap;
-
-  & > button {
-    position: relative;
-    z-index: 2;
-    display: inline-block;
-    vertical-align: middle;
-    margin: 0;
-    padding: 2px 8px;
-    font-size: @smallFontSize;
-    font-weight: normal;
-    cursor: pointer;
-
-    &:hover, &:focus {
-      z-index: 3;
-    }
-  }
-
-  & > button + button {
-    margin-left: -1px;
-  }
-
-  & > a {
-    vertical-align: middle;
-    margin: 0 8px;
-    font-size: @smallFontSize;
-  }
-}
diff --git a/sonar-server/src/main/webapp/stylesheets/variables.css b/sonar-server/src/main/webapp/stylesheets/variables.css
deleted file mode 100644 (file)
index 620cf3a..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * Fonts
- */
-/*
- * Colors
- */
-/*
- * Icons
- */
-/*
- * Transitions
- */
diff --git a/sonar-server/src/main/webapp/stylesheets/variables.less b/sonar-server/src/main/webapp/stylesheets/variables.less
deleted file mode 100644 (file)
index b43675b..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Fonts
- */
-
-@baseFontSize: 13px;
-@baseFontColor: #444;
-@smallFontSize: 11px;
-@headerFontSize: 16px;
-
-
-
-/*
- * Colors
- */
-
-@black: #000000;
-@white: #ffffff;
-@grey:  #efefef;
-@darkGrey: #cdcdcd;
-
-@blue: #4b9fd5;
-@red: #d4333f;
-@green: #85bb43;
-@yellow: #fede06;
-@orange: #f90;
-
-@highlighted: @blue;
-
-
-
-/*
- * Icons
- */
-
-@iconSmallFontSize: 14px;
-@iconFontSize: 16px;
-@iconLineHeight: 12px;
-
-@severityBlockerColor: @red;
-@severityCriticalColor: @red;
-@severityMajorColor: @red;
-@severityMinorColor: @green;
-@severityInfoColor: @green;
-
-@statusOpenColor: @blue;
-@statusConfirmedColor: @blue;
-@statusReopenedColor: @blue;
-@statusResolvedColor: @baseFontColor;
-@statusClosedColor: @baseFontColor;
-
-@resolutionFixedColor: @baseFontColor;
-@resolutionFalsePositiveColor: @baseFontColor;
-@resolutionRemovedColor: @baseFontColor;
-
-
-
-/*
- * Transitions
- */
-
-@defaultTransitionOptions: .3s ease;
diff --git a/sonar-server/src/main/webapp/stylesheets/yui-reset-font.css b/sonar-server/src/main/webapp/stylesheets/yui-reset-font.css
deleted file mode 100644 (file)
index bf3e732..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
-YUI 3.6.0 (build 5521)
-Copyright 2012 Yahoo! Inc. All rights reserved.
-Licensed under the BSD License.
-http://yuilibrary.com/license/
-*/
-
-/* reset */
-html{color:#000;background:#FFF}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}ol,ul{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:''}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit}input,textarea,select{*font-size:100%}legend{color:#000}
-
-/* font */
-body{font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small}select,input,button,textarea{font:99% arial,helvetica,clean,sans-serif}table{font-size:inherit;font:100%}pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%}
\ No newline at end of file
index ab9a38e5cd866695f5051427b19df29538177cd6..acdf6ddc0ef751042441af60667c4013a8489ea8 100644 (file)
@@ -3,21 +3,6 @@
 <groups xmlns="http://www.isdc.ro/wro">
 
   <group name='sonar'>
-    <css>/stylesheets/yui-reset-font.css</css>
-    <css>/stylesheets/jquery-ui.css</css>
-    <css>/stylesheets/select2.css</css>
-    <css>/stylesheets/select2-sonar.css</css>
-    <css>/stylesheets/layout.css</css>
-    <css>/stylesheets/style.css</css>
-    <css>/stylesheets/icons.css</css>
-    <css>/stylesheets/ui.css</css>
-    <css>/stylesheets/sonar-colorizer.css</css>
-    <css>/stylesheets/dashboard.css</css>
-    <css>/stylesheets/select-list.css</css>
-    <css>/stylesheets/navigator.css</css>
-    <css>/stylesheets/quality-gates.css</css>
-    <css>/stylesheets/coding-rules.css</css>
-
     <js>/javascripts/third-party/jquery.js</js>
     <js>/javascripts/third-party/jquery-ui.js</js>
     <js>/javascripts/third-party/d3.js</js>