Browse Source

SONAR-6215 apply feedback

tags/5.2-RC1
Stas Vilchik 9 years ago
parent
commit
b68ea730e9

+ 11
- 4
server/sonar-web/src/main/hbs/workspace/workspace-viewer-header.hbs View File

@@ -1,8 +1,15 @@
<h6 class="workspace-viewer-name">{{qualifierIcon q}}&nbsp;{{name}}</h6>

<div class="workspace-viewer-actions">
<a href="#" class="js-minimize icon-minimize spacer-right"></a>
<a href="#" class="js-full-screen icon-bigger-size workspace-for-normal-size spacer-right"></a>
<a href="#" class="js-normal-size icon-smaller-size workspace-for-full-screen spacer-right"></a>
<a href="#" class="js-close icon-close"></a>
<a href="#" class="js-minimize icon-minimize spacer-right"
title="{{t 'workspace.minimize'}}" data-placement="bottom" data-toggle="tooltip"></a>

<a href="#" class="js-full-screen icon-bigger-size workspace-for-normal-size spacer-right"
title="{{t 'workspace.full_window'}}" data-placement="bottom" data-toggle="tooltip"></a>

<a href="#" class="js-normal-size icon-smaller-size workspace-for-full-screen spacer-right"
title="{{t 'workspace.normal_size'}}" data-placement="bottom" data-toggle="tooltip"></a>

<a href="#" class="js-close icon-close"
title="{{t 'workspace.close'}}" data-placement="bottom" data-toggle="tooltip"></a>
</div>

+ 3
- 1
server/sonar-web/src/main/js/workspace/main.js View File

@@ -61,7 +61,9 @@ define([
},

addComponent: function (model) {
this.items.add(model);
if (!this.items.has(model)) {
this.items.add(model);
}
this.save();
},


+ 6
- 0
server/sonar-web/src/main/js/workspace/models/items.js View File

@@ -41,6 +41,12 @@ define(['workspace/models/item'], function (Item) {
this.reset(parsed);
} catch (err) { }
}
},

has: function (model) {
var forComponent = model.isComponent() && this.findWhere({ uuid: model.get('uuid') }) != null,
forRule = model.isRule() && this.findWhere({ key: model.get('key') }) != null;
return forComponent || forRule;
}
});


+ 11
- 0
server/sonar-web/src/main/js/workspace/views/viewer-header-view.js View File

@@ -21,6 +21,8 @@ define([
'templates/workspace'
], function () {

var $ = jQuery;

return Marionette.ItemView.extend({
template: Templates['workspace-viewer-header'],

@@ -35,6 +37,15 @@ define([
'click .js-close': 'onCloseClick'
},

onRender: function () {
this.$('[data-toggle="tooltip"]').tooltip({ container: 'body' });
},

onClose: function () {
this.$('[data-toggle="tooltip"]').tooltip('destroy');
$('.tooltip').remove();
},

onMinimizeClick: function (e) {
e.preventDefault();
this.trigger('viewerMinimize');

+ 4
- 0
server/sonar-web/src/main/js/workspace/views/viewer-view.js View File

@@ -27,6 +27,10 @@ define([
className: 'workspace-viewer',
template: Templates['workspace-viewer'],

modelEvents: {
'destroy': 'close'
},

regions: {
headerRegion: '.workspace-viewer-header',
viewerRegion: '.workspace-viewer-container'

+ 245
- 6
server/sonar-web/src/test/js/workspace.js View File

@@ -24,21 +24,260 @@ var lib = require('../lib'),


lib.initMessages();
lib.changeWorkingDirectory('workspace');
lib.configureCasper();


casper.test.begin(testName('API'), function (test) {
casper.test.begin(testName('Open From Component Viewer'), 8, function (test) {
casper
.start(lib.buildUrl('source-viewer'), function () {
lib.setDefaultViewport();

lib.mockRequestFromFile('/api/components/app', 'app.json');
lib.mockRequestFromFile('/api/sources/lines', 'lines.json');
lib.mockRequestFromFile('/api/issues/search', 'issues.json');
})

.then(function () {
casper.evaluate(function () {
window.localStorage.removeItem('sonarqube-workspace');
require(['/js/source-viewer/app.js']);
});
})

.then(function () {
casper.waitForSelector('.source-line');
})

.then(function () {
casper.click('.js-actions');
casper.waitForSelector('.js-workspace', function () {
casper.click('.js-workspace');
});
})

.then(function () {
casper.waitForSelector('.workspace-viewer .source-line');
})

.then(function () {
test.assertElementCount('.workspace-nav-item', 1);
test.assertSelectorContains('.workspace-nav-item', 'Cache.java');
test.assertExists('.workspace-nav-item .icon-qualifier-fil');

test.assertSelectorContains('.workspace-viewer-name', 'Cache.java');
test.assertExists('.workspace-viewer-name .icon-qualifier-fil');

test.assertExists('.workspace-viewer .source-viewer');
test.assertElementCount('.workspace-viewer .source-line', 11);
})

.then(function () {
casper.click('.workspace-viewer .js-close');
test.assertDoesntExist('.workspace-viewer');
})

.then(function () {
lib.sendCoverage();
})

.run(function () {
test.done();
});
});


casper.test.begin(testName('Load From Local Storage'), 7, function (test) {
casper
.start(lib.buildUrl('nav'), function () {
lib.setDefaultViewport();

lib.mockRequestFromFile('/api/components/app', 'app.json');
lib.mockRequestFromFile('/api/sources/lines', 'lines.json');
lib.mockRequestFromFile('/api/issues/search', 'issues.json');
})

.then(function () {
casper.evaluate(function () {
window.localStorage.setItem('sonarqube-workspace',
'[{"uuid":"12345","type":"component","name":"Cache.java","q":"FIL"}]');
window.SS.isUserAdmin = false;
window.navbarOptions = new Backbone.Model();
require(['/js/nav/app.js']);
});
})

.then(function () {
casper.waitForSelector('.workspace-nav-item');
})

.then(function () {
test.assertElementCount('.workspace-nav-item', 1);
test.assertSelectorContains('.workspace-nav-item', 'Cache.java');
test.assertExists('.workspace-nav-item .icon-qualifier-fil');
})

.then(function () {
test.assertNotEquals(casper.evaluate(function () {
window.workspace = require(['/js/workspace/main.js'])();
console.log(window.workspace);
return window.workspace;
}), null);
casper.click('.workspace-nav-item');
casper.waitForSelector('.workspace-viewer .source-line');
})

.then(function () {
test.assertSelectorContains('.workspace-viewer-name', 'Cache.java');
test.assertExists('.workspace-viewer-name .icon-qualifier-fil');

test.assertExists('.workspace-viewer .source-viewer');
test.assertElementCount('.workspace-viewer .source-line', 11);
})

.then(function () {
lib.sendCoverage();
})

.run(function () {
test.done();
});
});


casper.test.begin(testName('Close From Nav'), 2, function (test) {
casper
.start(lib.buildUrl('nav'), function () {
lib.setDefaultViewport();

lib.mockRequestFromFile('/api/components/app', 'app.json');
lib.mockRequestFromFile('/api/sources/lines', 'lines.json');
lib.mockRequestFromFile('/api/issues/search', 'issues.json');
})

.then(function () {
casper.evaluate(function () {
window.localStorage.setItem('sonarqube-workspace',
'[{"uuid":"12345","type":"component","name":"Cache.java","q":"FIL"}]');
window.SS.isUserAdmin = false;
window.navbarOptions = new Backbone.Model();
require(['/js/nav/app.js']);
});
})

.then(function () {
casper.waitForSelector('.workspace-nav-item');
})

.then(function () {
casper.click('.workspace-nav-item');
casper.waitForSelector('.workspace-viewer .source-line');
})

.then(function () {
casper.click('.workspace-nav-item .js-close');
test.assertDoesntExist('.workspace-nav-item');
test.assertDoesntExist('.workspace-viewer');
})

.then(function () {
lib.sendCoverage();
})

.run(function () {
test.done();
});
});


casper.test.begin(testName('Minimize'), 2, function (test) {
casper
.start(lib.buildUrl('source-viewer'), function () {
lib.setDefaultViewport();

lib.mockRequestFromFile('/api/components/app', 'app.json');
lib.mockRequestFromFile('/api/sources/lines', 'lines.json');
lib.mockRequestFromFile('/api/issues/search', 'issues.json');
})

.then(function () {
casper.evaluate(function () {
window.localStorage.removeItem('sonarqube-workspace');
require(['/js/source-viewer/app.js']);
});
})

.then(function () {
casper.waitForSelector('.source-line');
})

.then(function () {
casper.click('.js-actions');
casper.waitForSelector('.js-workspace', function () {
casper.click('.js-workspace');
});
})

.then(function () {
casper.waitForSelector('.workspace-viewer .source-line');
})

.then(function () {
casper.click('.workspace-viewer .js-minimize');
test.assertDoesntExist('.workspace-viewer');
test.assertElementCount('.workspace-nav-item', 1);
})

.then(function () {
lib.sendCoverage();
})

.run(function () {
test.done();
});
});


casper.test.begin(testName('Full Screen'), 8, function (test) {
casper
.start(lib.buildUrl('source-viewer'), function () {
lib.setDefaultViewport();

lib.mockRequestFromFile('/api/components/app', 'app.json');
lib.mockRequestFromFile('/api/sources/lines', 'lines.json');
lib.mockRequestFromFile('/api/issues/search', 'issues.json');
})

.then(function () {
casper.evaluate(function () {
window.localStorage.removeItem('sonarqube-workspace');
require(['/js/source-viewer/app.js']);
});
})

.then(function () {
casper.waitForSelector('.source-line');
})

.then(function () {
casper.click('.js-actions');
casper.waitForSelector('.js-workspace', function () {
casper.click('.js-workspace');
});
})

.then(function () {
casper.waitForSelector('.workspace-viewer .source-line');
})

.then(function () {
test.assertVisible('.workspace-viewer .js-full-screen');
test.assertNotVisible('.workspace-viewer .js-normal-size');

casper.click('.workspace-viewer .js-full-screen');
test.assertExists('.workspace-viewer.workspace-viewer-full-screen');
test.assertNotVisible('.workspace-viewer .js-full-screen');
test.assertVisible('.workspace-viewer .js-normal-size');

casper.click('.workspace-viewer .js-normal-size');
test.assertDoesntExist('.workspace-viewer.workspace-viewer-full-screen');
test.assertVisible('.workspace-viewer .js-full-screen');
test.assertNotVisible('.workspace-viewer .js-normal-size');
})

.then(function () {

+ 24
- 0
server/sonar-web/src/test/json/workspace/app.json View File

@@ -0,0 +1,24 @@
{
"uuid": "12345",
"key": "org.codehaus.sonar:sonar-batch:src/main/java/org/sonar/batch/index/Cache.java",
"path": "src/main/java/org/sonar/batch/index/Cache.java",
"name": "Cache.java",
"longName": "src/main/java/org/sonar/batch/index/Cache.java",
"q": "FIL",
"subProject": "org.codehaus.sonar:sonar-batch",
"subProjectName": "SonarQube :: Batch",
"project": "org.codehaus.sonar:sonar",
"projectName": "SonarQube",
"fav": false,
"canMarkAsFavourite": false,
"canCreateManualIssue": false,
"measures": {
"lines": "378",
"coverage": "74.3%",
"duplicationDensity": "5.8%",
"debt": "2h 10min",
"sqaleRating": "A",
"debtRatio": "1.1%",
"issues": "6"
}
}

+ 9
- 0
server/sonar-web/src/test/json/workspace/issues.json View File

@@ -0,0 +1,9 @@
{
"total": 0,
"p": 1,
"ps": 100,
"issues": [],
"rules": [],
"users": [],
"languages": []
}

+ 72
- 0
server/sonar-web/src/test/json/workspace/lines.json View File

@@ -0,0 +1,72 @@
{"sources": [
{
"line": 1,
"code": "<span class=\"cppd\">/*</span>",
"scmAuthor": "simon.brandhof@gmail.com",
"scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
"scmDate": "2013-04-16T17:26:34+0200"
},
{
"line": 2,
"code": "<span class=\"cppd\"> * SonarQube, open source software quality management tool.</span>",
"scmAuthor": "simon.brandhof@gmail.com",
"scmRevision": "b1436788cfc71b23cc3e3c15400a6c630c914bec",
"scmDate": "2013-04-21T11:58:14+0200"
},
{
"line": 3,
"code": "<span class=\"cppd\"> * Copyright (C) 2008-2014 SonarSource</span>",
"scmAuthor": "simon.brandhof@gmail.com",
"scmRevision": "57ae3026c36ae3b0b71756d6161124b1ae594c53",
"scmDate": "2014-03-11T17:52:41+0100"
},
{
"line": 4,
"code": "<span class=\"cppd\"> * mailto:contact AT sonarsource DOT com</span>",
"scmAuthor": "simon.brandhof@gmail.com",
"scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
"scmDate": "2013-04-16T17:26:34+0200"
},
{
"line": 5,
"code": "<span class=\"cppd\"> *</span>",
"scmAuthor": "simon.brandhof@gmail.com",
"scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
"scmDate": "2013-04-16T17:26:34+0200"
},
{
"line": 6,
"code": "<span class=\"cppd\"> * SonarQube is free software; you can redistribute it and/or</span>",
"scmAuthor": "simon.brandhof@gmail.com",
"scmRevision": "b1436788cfc71b23cc3e3c15400a6c630c914bec",
"scmDate": "2013-04-21T11:58:14+0200"
},
{
"line": 7,
"code": "<span class=\"cppd\"> * modify it under the terms of the GNU Lesser General Public</span>",
"scmAuthor": "simon.brandhof@gmail.com",
"scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
"scmDate": "2013-04-16T17:26:34+0200"
},
{
"line": 8,
"code": "<span class=\"cppd\"> * License as published by the Free Software Foundation; either</span>",
"scmAuthor": "simon.brandhof@gmail.com",
"scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
"scmDate": "2013-04-16T17:26:34+0200"
},
{
"line": 9,
"code": "<span class=\"cppd\"> * version 3 of the License, or (at your option) any later version.</span>",
"scmAuthor": "simon.brandhof@gmail.com",
"scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
"scmDate": "2013-04-16T17:26:34+0200"
},
{
"line": 10,
"code": "<span class=\"cppd\"> *</span>",
"scmAuthor": "simon.brandhof@gmail.com",
"scmRevision": "26edff10d133e29e7013f803e7ef0d69ff593aeb",
"scmDate": "2013-04-16T17:26:34+0200"
}
]}

+ 13
- 0
sonar-core/src/main/resources/org/sonar/l10n/core.properties View File

@@ -2971,3 +2971,16 @@ analysis_reports.show_past_reports=Show Past Reports
analysis_reports.current_activity=Current Activity
analysis_reports.show_current_activity=Show Current Activity
analysis_reports.x_reports={0} reports




#------------------------------------------------------------------------------
#
# WORKSPACE
#
#------------------------------------------------------------------------------
workspace.minimize=Minimize
workspace.full_window=Expand to full window
workspace.normal_size=Collapse to normal size
workspace.close=Remove from the list of pinned files

Loading…
Cancel
Save