Compare commits

...

64 Commits
1.2.0 ... 1.8.0

Author SHA1 Message Date
Alex Kilgour
129e48e0ce Merge pull request #94 from nature/enhance-graph
Enhance graph for accessibility
2016-02-04 11:26:58 +00:00
Alex Kilgour
ca9551a3e6 Update graph styling 2016-02-02 15:56:21 +00:00
Alex Kilgour
d93f8af20e Custom legend and hide to flot one 2016-02-02 15:27:52 +00:00
Alex Kilgour
cc7f769653 Fix linting errors 2016-02-01 21:36:23 +00:00
Alex Kilgour
fc510b328a Move some CSS styles out of the JS and into the CSS 2016-02-01 21:25:11 +00:00
Alex Kilgour
77ed85eb87 Fix the graph legend to match the dashed lines 2016-02-01 19:18:55 +00:00
Alex Kilgour
816eecb256 Add dashed lines to graph 2016-02-01 17:14:21 +00:00
Alex Kilgour
ed1b9830fd Version 1.7.0 2016-01-29 15:44:20 +00:00
Alex Kilgour
b5d3542670 Merge pull request #93 from nature/accessible-results
Make the Results page more accessible
2016-01-29 15:41:00 +00:00
Alex Kilgour
31bbb7229b Add style tweaks and hide the date list from the individual pages 2016-01-29 15:19:05 +00:00
Alex Kilgour
27cdf51258 Make the date selector properly keyboard accessible 2016-01-29 14:37:02 +00:00
Alex Kilgour
b3b2cd21da Change options button into a more accessible list 2016-01-29 11:27:10 +00:00
Alex Kilgour
537b93c671 Make the errors/warnings/notices lists keyboard accessible 2016-01-28 15:40:22 +00:00
Alex Kilgour
32a8ec55e1 Version 1.6.1 2016-01-26 16:00:27 +00:00
Alex Kilgour
0829482020 Merge pull request #92 from nature/keyboard-access
Keyboard access
2016-01-26 14:38:08 +00:00
Alex Kilgour
eb8f35779e revert spacing issue with public/js/site.js 2016-01-26 14:13:42 +00:00
Alex Kilgour
3cdbba00c1 Fix linting errors in the Javascript 2016-01-26 14:04:12 +00:00
Alex Kilgour
fd2dd62478 Add keyboard access for filters 2016-01-26 13:52:38 +00:00
Rowan Manning
baf73203e9 Version 1.6.0 2015-08-20 16:05:31 +01:00
Rowan Manning
87daa49638 Hide all graph data except for errors by default 2015-08-20 14:54:44 +01:00
Rowan Manning
938ca6090b Version 1.5.0 2015-07-06 10:14:53 +01:00
Rowan Manning
eda75efc9c Update pa11y-webservice 2015-07-06 10:11:38 +01:00
Rowan Manning
ff3755070a Merge branch 'http-basic-auth' 2015-07-06 10:09:24 +01:00
Andrew Mee
06a41ad980 adding a notice that passwords are not securely stored when provided through the dashboard 2015-07-06 09:58:24 +01:00
Rowan Manning
3b4557d75d Build only master and PRs on CI 2015-07-06 09:39:42 +01:00
Andrew Mee
91a4c8391f adding ability to provide username and password when creating new task 2015-07-03 16:23:45 +01:00
Rowan Manning
d6bc045d52 Version 1.4.0 2015-07-02 16:52:40 +01:00
Rowan Manning
780b66128f Add the ability to set a per-task timeout 2015-07-02 16:03:12 +01:00
Rowan Manning
0b1daf1482 Version 1.3.2 2015-01-17 18:37:03 +00:00
Rowan Manning
57933c074b Update pa11y-webservice dependency 2015-01-17 18:35:35 +00:00
Rowan Manning
977dfa9dd0 Version 1.3.1 2014-03-05 10:00:51 +00:00
Rowan Manning
a94b1a45ae Merge branch 'filter-urls' of github.com:nature/pa11y-dashboard into develop
Conflicts:
	view/partial/tasks.html
2014-03-05 09:57:18 +00:00
perryharlock
e830d48074 Fix for url filter position when in demo mode with a message 2014-03-05 09:39:07 +00:00
Rowan Manning
ff239edf5a Version 1.3.0 2014-03-04 14:28:03 +00:00
Rowan Manning
c2013e42d4 Commit style changes 2014-03-04 14:15:31 +00:00
Rowan Manning
a79a5a2fe6 Merge branch 'filter-urls' of github.com:nature/pa11y-dashboard into develop 2014-03-04 14:14:49 +00:00
perryharlock
85fe2c4a37 Move toggle functionality from filter input to containing div 2014-03-04 14:08:57 +00:00
Rowan Manning
c04396e80e Merge branch 'gpl-preamble' of github.com:nature/pa11y-dashboard into develop 2014-02-10 14:56:06 +00:00
Jude Robinson
7b10f2de91 adding the gpl preamble 2014-02-10 14:08:38 +00:00
perryharlock
890ec38216 Add filter styling 2014-01-21 10:50:57 +00:00
Rowan Manning
d8cb1b6c71 Write the JavaScript for URL filtering 2014-01-14 11:40:23 +00:00
Rowan Manning
a605835cc9 Attempt to fix timeout errors in tests 2014-01-13 09:59:21 +00:00
perryharlock
01897d8a17 Amend styles for ignore button 2014-01-13 09:59:21 +00:00
Rowan Manning
02e22eb094 Add "unigore" buttons to ignored rules 2014-01-13 09:59:13 +00:00
perryharlock
dfac541294 Amends to task-card min heights 2014-01-13 09:59:13 +00:00
Rowan Manning
f3b295982f Fix typo 2014-01-13 09:58:35 +00:00
Rowan Manning
ddf2c705c9 Fix the ignore buttons for readonly/result pages 2014-01-13 09:58:35 +00:00
perryharlock
20de93bf2d Change ignore rules in results to come from mainResult 2014-01-13 09:58:35 +00:00
Rowan Manning
ccc7ddfc18 Write the back-end for rule ignoring 2014-01-13 09:58:35 +00:00
perryharlock
4347acf654 Issue 65 - Ability to select a rule to ignore from result - css / html 2014-01-13 09:58:35 +00:00
Rowan Manning
da9b383909 Fix mistakes in versioning instructions 2014-01-13 09:58:34 +00:00
Rowan Manning
d0feee8dd5 Version 1.2.3 2014-01-13 09:38:10 +00:00
Rowan Manning
f97e224679 Update the tests to allow for the new CSV format 2014-01-13 09:37:16 +00:00
Rowan Manning
ddbb0db33d Remove spaces in the CSV header row 2014-01-13 09:33:51 +00:00
Quannon Au
e0290b4fc5 Issue 74 - Fix CSV format for Mac Excel 2014-01-10 11:25:16 -08:00
perryharlock
1f6ea332ac Version 1.2.2 2014-01-09 11:44:25 +00:00
perryharlock
5b109fb23d Amend versioning instructions 2014-01-09 11:43:44 +00:00
perryharlock
3b03af7e8f Merge branch 'develop' of github.com:nature/pa11y-dashboard into develop 2014-01-09 11:05:22 +00:00
perryharlock
1c96369bb0 Issue 68 - Bad spacing when graph not visible 2014-01-09 11:04:53 +00:00
Rowan Manning
e421444487 Versioning clarifications 2014-01-09 10:36:08 +00:00
Rowan Manning
5c7d9bfc43 Add notes on publishing a release 2014-01-09 10:31:50 +00:00
Rowan Manning
75497ff95f Version 1.2.1 2014-01-08 11:51:57 +00:00
perryharlock
c481f8dbb5 IE7 and IE8 amends for Options dropdown positioning
Conflicts:
	public/css/site.min.css
2014-01-08 11:43:47 +00:00
perryharlock
716151e696 Include IE8and.less file and make IE amends for Options dropdowns
Conflicts:
	public/css/site.min.css
2014-01-08 11:42:34 +00:00
67 changed files with 1909 additions and 246 deletions

View File

@@ -4,6 +4,11 @@ language: node_js
node_js: node_js:
- "0.10" - "0.10"
# Build only master (and pull-requests)
branches:
only:
- master
# Services setup # Services setup
services: services:
- mongodb - mongodb

View File

@@ -31,8 +31,23 @@ Coding Guidelines
* Don't commit code without passing tests (run `grunt test`). * Don't commit code without passing tests (run `grunt test`).
Versioning
----------
We use [Semantic Versioning][semver] in this project. The process for releasing a new version is as follows; this should only be done by core contributors you don't need to include a tagged version in your pull-requests.
* Switch to `master` and merge the `develop` branch into it
* Update the version number in `package.json` and `README.md`
* Commit the changes with the message: "Version x.x.x" (x.x.x being the new version number)
* Tag the commit with the version number (just the numbers, no "version" or "v"): `git tag x.x.x`
* Push with tags: `git push && git push --tags`
* Check out the `develop` branch, merge `master` into it, and push
* On GitHub, add [release notes][release-notes] for the new version. The title should be "Version x.x.x", and the description should be a list of new features/fixes
[bugs]: https://github.com/nature/pa11y-dashboard/issues?labels=bug&state=open [bugs]: https://github.com/nature/pa11y-dashboard/issues?labels=bug&state=open
[ready]: https://github.com/nature/pa11y-dashboard/issues?labels=ready&state=open [ready]: https://github.com/nature/pa11y-dashboard/issues?labels=ready&state=open
[issues]: https://github.com/nature/pa11y-dashboard/issues [issues]: https://github.com/nature/pa11y-dashboard/issues
[milestones]: https://github.com/nature/pa11y-dashboard/issues/milestones [milestones]: https://github.com/nature/pa11y-dashboard/issues/milestones
[release-notes]: https://github.com/nature/pa11y-dashboard/releases
[semver]: http://semver.org/

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
module.exports = function (grunt) { module.exports = function (grunt) {
grunt.initConfig({ grunt.initConfig({
@@ -13,7 +28,7 @@ module.exports = function (grunt) {
es3: false, es3: false,
indent: 4, indent: 4,
latedef: false, latedef: false,
maxcomplexity: 4, maxcomplexity: 6,
maxdepth: 2, maxdepth: 2,
maxlen: 100, maxlen: 100,
maxparams: 4, maxparams: 4,
@@ -38,7 +53,8 @@ module.exports = function (grunt) {
functional: { functional: {
src: ['test/functional/**/*.js'], src: ['test/functional/**/*.js'],
options: { options: {
reporter: 'spec' reporter: 'spec',
timeout: 4000
} }
} }
}, },
@@ -75,7 +91,10 @@ module.exports = function (grunt) {
'public/js/vendor/bootstrap/js/alert.js', 'public/js/vendor/bootstrap/js/alert.js',
'public/js/vendor/bootstrap/js/dropdown.js', 'public/js/vendor/bootstrap/js/dropdown.js',
'public/js/vendor/bootstrap/js/tooltip.js', 'public/js/vendor/bootstrap/js/tooltip.js',
'public/js/vendor/bootstrap/js/transition.js',
'public/js/vendor/bootstrap/js/collapse.js',
'public/js/vendor/flot/jquery.flot.js', 'public/js/vendor/flot/jquery.flot.js',
'public/js/vendor/flot/jquery.flot.dashes.js',
'public/js/vendor/flot/jquery.flot.time.js', 'public/js/vendor/flot/jquery.flot.time.js',
'public/js/vendor/flot/jquery.flot.selection.js', 'public/js/vendor/flot/jquery.flot.selection.js',
'public/js/vendor/flot/jquery.flot.resize.js', 'public/js/vendor/flot/jquery.flot.resize.js',

View File

@@ -3,7 +3,7 @@ pa11y-dashboard
pa11y-dashboard is a web interface to the [pa11y][pa11y] accessibility reporter; allowing you to focus on *fixing* issues rather than hunting them down. pa11y-dashboard is a web interface to the [pa11y][pa11y] accessibility reporter; allowing you to focus on *fixing* issues rather than hunting them down.
**Current Version:** *1.2.0* **Current Version:** *1.7.0*
**Build Status:** [![Build Status][travis-img]][travis] **Build Status:** [![Build Status][travis-img]][travis]
**Node Version Support:** *0.10* **Node Version Support:** *0.10*

18
app.js
View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
var createClient = require('pa11y-webservice-client-node'); var createClient = require('pa11y-webservice-client-node');
@@ -49,6 +64,7 @@ function initApp (config, callback) {
// View helpers // View helpers
require('./view/helper/date')(hbs.registerHelper); require('./view/helper/date')(hbs.registerHelper);
require('./view/helper/string')(hbs.registerHelper);
require('./view/helper/url')(hbs.registerHelper); require('./view/helper/url')(hbs.registerHelper);
// Populate view locals // Populate view locals
@@ -79,6 +95,8 @@ function initApp (config, callback) {
require('./route/task/delete')(app); require('./route/task/delete')(app);
require('./route/task/run')(app); require('./route/task/run')(app);
require('./route/task/edit')(app); require('./route/task/edit')(app);
require('./route/task/ignore')(app);
require('./route/task/unignore')(app);
} }
// Error handling // Error handling

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
/* jshint maxlen: false */ /* jshint maxlen: false */
'use strict'; 'use strict';

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
var chalk = require('chalk'); var chalk = require('chalk');

View File

@@ -1,6 +1,6 @@
{ {
"name": "pa11y-dashboard", "name": "pa11y-dashboard",
"version": "1.2.0", "version": "1.7.0",
"private": true, "private": true,
"description": "pa11y-dashboard is a visual web interface to the pa11y accessibility reporter", "description": "pa11y-dashboard is a visual web interface to the pa11y accessibility reporter",
@@ -25,7 +25,7 @@
"express": "~3.4", "express": "~3.4",
"express-hbs": "~0.2", "express-hbs": "~0.2",
"moment": "~2.2", "moment": "~2.2",
"pa11y-webservice": "~1.3", "pa11y-webservice": "~1.6",
"pa11y-webservice-client-node": "~1.1", "pa11y-webservice-client-node": "~1.1",
"underscore": "~1.5" "underscore": "~1.5"
}, },

File diff suppressed because one or more lines are too long

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
$(document).ready(function(){ $(document).ready(function(){
var data = {}; var data = {};
@@ -9,9 +24,11 @@ $(document).ready(function(){
var zoomResetButton = $('[data-role="zoom-reset"]'); var zoomResetButton = $('[data-role="zoom-reset"]');
var graphContainer = $('[data-role="graph"]'); var graphContainer = $('[data-role="graph"]');
var dateSelectDropdownMenu = $('[data-role="date-select-dropdown-menu"]'); var dateSelectDropdownMenu = $('[data-role="date-select-dropdown-menu"]');
var legend = graphContainer.parent('.graph-container').find('.dashedLegend');
var graphOptions = { var graphOptions = {
series: { series: {
dashes: { show: false, lineWidth: 3 },
lines: { show: true }, lines: { show: true },
points: { show: true }, points: { show: true },
hoverable: true hoverable: true
@@ -28,6 +45,12 @@ $(document).ready(function(){
lines: { lines: {
lineWidth: 3 lineWidth: 3
}, },
points: {
fill: true,
radius:4,
lineWidth:3
},
shadowSize: 0,
grid: { grid: {
backgroundColor: '#fff', backgroundColor: '#fff',
borderColor: '#808080', borderColor: '#808080',
@@ -45,17 +68,38 @@ $(document).ready(function(){
} }
}; };
// have we declared a custom legend
if (legend.length === 1) {
$('body').addClass('custom-legend');
}
// Toggle appearance of lists of error/warnings/notices // Toggle appearance of lists of error/warnings/notices
expandLink.click( function(){ expandLink.click( function(){
$(this).parent().next().slideToggle('slow', function(){}); $(this).next().slideToggle('slow', function(){});
if ($(this).parent().hasClass('showing')) { if ($(this).hasClass('showing')) {
$(this).html('+'); $(this).find('span.expander').html('+');
$(this).attr('aria-expanded', false);
} }
else { else {
$(this).html('-'); $(this).find('span.expander').html('-');
$(this).attr('aria-expanded', true);
} }
$(this).parent().toggleClass('showing'); $(this).toggleClass('showing');
}); });
$(document).on('keydown.lists', '[data-role="expander"]', function (e) {
var $this = $(this);
var k = e.which || e.keyCode;
if (!/(13|32)/.test(k)) {
return;
}
if (k === 13 || k === 32) {
$this.click();
}
e.preventDefault();
e.stopPropagation();
});
// Back to top links // Back to top links
toTopLinks.click( function(e){ toTopLinks.click( function(e){
@@ -79,7 +123,7 @@ $(document).ready(function(){
target = $(this).attr('href'); target = $(this).attr('href');
animateSection($(target), -25); animateSection($(target), -25);
if (!$(target).hasClass('showing')) { if (!$(target).hasClass('showing')) {
$(target).children('[data-role="expander"]').click(); $(target).click();
} }
}); });
@@ -137,9 +181,25 @@ $(document).ready(function(){
function getData() { function getData() {
return [ return [
{ color: 'rgb(216, 61, 45)', label: 'Errors', data: data.error }, {
{ color: 'rgb(168, 103, 0)', label: 'Warnings', data: data.warning }, color: 'rgb(216, 61, 45)',
{ color: 'rgb(23, 123, 190)', label: 'Notices', data: data.notice } label: 'Errors',
data: data.error
},
{
color: 'rgb(168, 103, 0)',
label: 'Warnings',
data: data.warning,
lines: { show: false },
dashes: { show: true, dashLength: [10, 5] }
},
{
color: 'rgb(23, 123, 190)',
label: 'Notices',
data: data.notice,
lines: { show: false },
dashes: { show: true, dashLength: 5 }
}
]; ];
} }
@@ -177,8 +237,8 @@ $(document).ready(function(){
'<div class="series-checkbox-container">' + '<div class="series-checkbox-container">' +
'<input type="checkbox"' + '<input type="checkbox"' +
'name="' + key + '" ' + 'name="' + key + '" ' +
'checked="checked" ' + 'id="id' + key + '" ' +
'id="id' + key + '"' + 'data-stat-type="' + val.label.toLowerCase() + '"' +
'/>' + '/>' +
'<label for="id' + key + '">' + '<label for="id' + key + '">' +
'<span class="stat-type">' + val.label + '</span>' + '<span class="stat-type">' + val.label + '</span>' +
@@ -186,19 +246,33 @@ $(document).ready(function(){
'</div>' + '</div>' +
'</li>' '</li>'
); );
}); });
choiceContainer.find('input').click(plotAccordingToChoices); choiceContainer.find('input').click(plotAccordingToChoices);
choiceContainer.find('[data-stat-type=errors]').click();
function plotAccordingToChoices() { function plotAccordingToChoices() {
var data = []; var data = [];
var labels = [];
choiceContainer.find('input:checked').each(function () { choiceContainer.find('input:checked').each(function () {
var key = $(this).attr('name'); var key = $(this).attr('name');
if (key && datasets[key]) { if (key && datasets[key]) {
labels.push(datasets[key].label);
data.push(datasets[key]); data.push(datasets[key]);
} }
}); });
if (labels.length && legend.length === 1) {
legend.find('tr').hide();
$.each(labels, function (index, value) {
$('.legend' + value).parents('tr').show();
});
legend.show();
} else {
legend.hide();
}
if (data.length > -1) { if (data.length > -1) {
$.plot(graphContainer, data, graphOptions); $.plot(graphContainer, data, graphOptions);
} }
@@ -230,4 +304,70 @@ $(document).ready(function(){
previousPoint = null; previousPoint = null;
} }
}); });
// Task filter
function initTaskFilter (container) {
var tasks = initTaskFilterTasks(container);
var input = initTaskFilterInput(container, tasks);
}
function initTaskFilterTasks (container) {
var tasks = container.find('[data-role=task]');
return tasks;
}
function initTaskFilterInput (container, tasks) {
var input = container.find('[data-role=input]');
input.on('keyup', function () {
filterTasks(tasks, input.val());
});
return input;
}
function filterTasks (tasks, query) {
query = $.trim(query.replace(/[^a-z0-9\s]+/gi, ''));
tasks.removeClass('hidden');
if (/^\s*$/.test(query)) {
return;
}
var queryRegExp = new RegExp('(' + query.replace(/\s+/gi, '|') + ')', 'i');
tasks.filter(function () {
return !queryRegExp.test($(this).data('keywords'));
}).addClass('hidden');
}
var taskLists = $('[data-control=task-list]');
if (taskLists.length > 0) {
$('[data-control=task-list]').each(function () {
initTaskFilter($(this));
});
}
// Extend public/js/vendor/bootstrap/js/collapse.js
// Add keyboard control for filters
$.fn.collapse.Constructor.prototype.keydown = function (e) {
var $this = $(this);
var k = e.which || e.keyCode;
if (!/(13|32)/.test(k)) {
return;
}
if (k === 13 || k === 32) {
$this.click();
}
e.preventDefault();
e.stopPropagation();
};
$('[data-toggle="collapse"]').attr('role', 'button').attr('tabindex', 0);
$(document).on(
'keydown.collapse.data-api',
'[data-toggle="collapse"]',
$.fn.collapse.Constructor.prototype.keydown
);
}); });

12
public/js/site.min.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,228 @@
/*
* jQuery.flot.dashes
*
* options = {
* series: {
* dashes: {
*
* // show
* // default: false
* // Whether to show dashes for the series.
* show: <boolean>,
*
* // lineWidth
* // default: 2
* // The width of the dashed line in pixels.
* lineWidth: <number>,
*
* // dashLength
* // default: 10
* // Controls the length of the individual dashes and the amount of
* // space between them.
* // If this is a number, the dashes and spaces will have that length.
* // If this is an array, it is read as [ dashLength, spaceLength ]
* dashLength: <number> or <array[2]>
* }
* }
* }
*/
(function($){
function init(plot) {
plot.hooks.drawSeries.push(function(plot, ctx, series) {
if (!series.dashes.show) return;
var plotOffset = plot.getPlotOffset(),
axisx = series.xaxis,
axisy = series.yaxis;
function plotDashes(xoffset, yoffset) {
var points = series.datapoints.points,
ps = series.datapoints.pointsize,
prevx = null,
prevy = null,
dashRemainder = 0,
dashOn = true,
dashOnLength,
dashOffLength;
if (series.dashes.dashLength[0]) {
dashOnLength = series.dashes.dashLength[0];
if (series.dashes.dashLength[1]) {
dashOffLength = series.dashes.dashLength[1];
} else {
dashOffLength = dashOnLength;
}
} else {
dashOffLength = dashOnLength = series.dashes.dashLength;
}
ctx.beginPath();
for (var i = ps; i < points.length; i += ps) {
var x1 = points[i - ps],
y1 = points[i - ps + 1],
x2 = points[i],
y2 = points[i + 1];
if (x1 == null || x2 == null) continue;
// clip with ymin
if (y1 <= y2 && y1 < axisy.min) {
if (y2 < axisy.min) continue; // line segment is outside
// compute new intersection point
x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
y1 = axisy.min;
} else if (y2 <= y1 && y2 < axisy.min) {
if (y1 < axisy.min) continue;
x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
y2 = axisy.min;
}
// clip with ymax
if (y1 >= y2 && y1 > axisy.max) {
if (y2 > axisy.max) continue;
x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
y1 = axisy.max;
} else if (y2 >= y1 && y2 > axisy.max) {
if (y1 > axisy.max) continue;
x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
y2 = axisy.max;
}
// clip with xmin
if (x1 <= x2 && x1 < axisx.min) {
if (x2 < axisx.min) continue;
y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
x1 = axisx.min;
} else if (x2 <= x1 && x2 < axisx.min) {
if (x1 < axisx.min) continue;
y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
x2 = axisx.min;
}
// clip with xmax
if (x1 >= x2 && x1 > axisx.max) {
if (x2 > axisx.max) continue;
y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
x1 = axisx.max;
} else if (x2 >= x1 && x2 > axisx.max) {
if (x1 > axisx.max) continue;
y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
x2 = axisx.max;
}
if (x1 != prevx || y1 != prevy) {
ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);
}
var ax1 = axisx.p2c(x1) + xoffset,
ay1 = axisy.p2c(y1) + yoffset,
ax2 = axisx.p2c(x2) + xoffset,
ay2 = axisy.p2c(y2) + yoffset,
dashOffset;
function lineSegmentOffset(segmentLength) {
var c = Math.sqrt(Math.pow(ax2 - ax1, 2) + Math.pow(ay2 - ay1, 2));
if (c <= segmentLength) {
return {
deltaX: ax2 - ax1,
deltaY: ay2 - ay1,
distance: c,
remainder: segmentLength - c
}
} else {
var xsign = ax2 > ax1 ? 1 : -1,
ysign = ay2 > ay1 ? 1 : -1;
return {
deltaX: xsign * Math.sqrt(Math.pow(segmentLength, 2) / (1 + Math.pow((ay2 - ay1)/(ax2 - ax1), 2))),
deltaY: ysign * Math.sqrt(Math.pow(segmentLength, 2) - Math.pow(segmentLength, 2) / (1 + Math.pow((ay2 - ay1)/(ax2 - ax1), 2))),
distance: segmentLength,
remainder: 0
};
}
}
//-end lineSegmentOffset
do {
dashOffset = lineSegmentOffset(
dashRemainder > 0 ? dashRemainder :
dashOn ? dashOnLength : dashOffLength);
if (dashOffset.deltaX != 0 || dashOffset.deltaY != 0) {
if (dashOn) {
ctx.lineTo(ax1 + dashOffset.deltaX, ay1 + dashOffset.deltaY);
} else {
ctx.moveTo(ax1 + dashOffset.deltaX, ay1 + dashOffset.deltaY);
}
}
dashOn = !dashOn;
dashRemainder = dashOffset.remainder;
ax1 += dashOffset.deltaX;
ay1 += dashOffset.deltaY;
} while (dashOffset.distance > 0);
prevx = x2;
prevy = y2;
}
ctx.stroke();
}
//-end plotDashes
ctx.save();
ctx.translate(plotOffset.left, plotOffset.top);
ctx.lineJoin = 'round';
var lw = series.dashes.lineWidth,
sw = series.shadowSize;
// FIXME: consider another form of shadow when filling is turned on
if (lw > 0 && sw > 0) {
// draw shadow as a thick and thin line with transparency
ctx.lineWidth = sw;
ctx.strokeStyle = "rgba(0,0,0,0.1)";
// position shadow at angle from the mid of line
var angle = Math.PI/18;
plotDashes(Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2));
ctx.lineWidth = sw/2;
plotDashes(Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4));
}
ctx.lineWidth = lw;
ctx.strokeStyle = series.color;
if (lw > 0) {
plotDashes(0, 0);
}
ctx.restore();
});
//-end draw hook
}
//-end init
$.plot.plugins.push({
init: init,
options: {
series: {
dashes: {
show: false,
lineWidth: 2,
dashLength: 10
}
}
},
name: 'dashes',
version: '0.1'
});
})(jQuery)

93
public/less/ie8and.less Normal file
View File

@@ -0,0 +1,93 @@
// Making up for the non support of IE8 and IE7 in Bootstrap 3
// Amend the width of container if you want to here
@container-md-ie8: @container-md;
@grid-adjustment: percentage(@grid-gutter-width / @container-md-ie8);
.ie7, .ie8 {
* {
box-sizing: content-box;
}
.clearfix {
*zoom: 1;
}
ul, ol {
margin-left:0;
}
.container {
width: @container-md-ie8;
}
.col-md-1,
.col-md-2,
.col-md-3,
.col-md-4,
.col-md-5,
.col-md-6,
.col-md-7,
.col-md-8,
.col-md-9,
.col-md-10,
.col-md-11 {
float: left;
}
.col-md-1 { width: percentage((1 / @grid-columns)) - @grid-adjustment; }
.col-md-2 { width: percentage((2 / @grid-columns)) - @grid-adjustment; }
.col-md-3 { width: percentage((3 / @grid-columns)) - @grid-adjustment; }
.col-md-4 { width: percentage((4 / @grid-columns)) - @grid-adjustment; }
.col-md-5 { width: percentage((5 / @grid-columns)) - @grid-adjustment; }
.col-md-6 { width: percentage((6 / @grid-columns)) - @grid-adjustment; }
.col-md-7 { width: percentage((7 / @grid-columns)) - @grid-adjustment; }
.col-md-8 { width: percentage((8 / @grid-columns)) - @grid-adjustment; }
.col-md-9 { width: percentage((9 / @grid-columns)) - @grid-adjustment; }
.col-md-10 { width: percentage((10/ @grid-columns)) - @grid-adjustment; }
.col-md-11 { width: percentage((11/ @grid-columns)) - @grid-adjustment; }
.col-md-12 { width: 100% - @grid-adjustment; }
// Push and pull columns for source order changes
.col-md-push-0 { left: auto; }
.col-md-push-1 { left: percentage((1 / @grid-columns)); }
.col-md-push-2 { left: percentage((2 / @grid-columns)); }
.col-md-push-3 { left: percentage((3 / @grid-columns)); }
.col-md-push-4 { left: percentage((4 / @grid-columns)); }
.col-md-push-5 { left: percentage((5 / @grid-columns)); }
.col-md-push-6 { left: percentage((6 / @grid-columns)); }
.col-md-push-7 { left: percentage((7 / @grid-columns)); }
.col-md-push-8 { left: percentage((8 / @grid-columns)); }
.col-md-push-9 { left: percentage((9 / @grid-columns)); }
.col-md-push-10 { left: percentage((10/ @grid-columns)); }
.col-md-push-11 { left: percentage((11/ @grid-columns)); }
.col-md-pull-0 { right: auto; }
.col-md-pull-1 { right: percentage((1 / @grid-columns)); }
.col-md-pull-2 { right: percentage((2 / @grid-columns)); }
.col-md-pull-3 { right: percentage((3 / @grid-columns)); }
.col-md-pull-4 { right: percentage((4 / @grid-columns)); }
.col-md-pull-5 { right: percentage((5 / @grid-columns)); }
.col-md-pull-6 { right: percentage((6 / @grid-columns)); }
.col-md-pull-7 { right: percentage((7 / @grid-columns)); }
.col-md-pull-8 { right: percentage((8 / @grid-columns)); }
.col-md-pull-9 { right: percentage((9 / @grid-columns)); }
.col-md-pull-10 { right: percentage((10/ @grid-columns)); }
.col-md-pull-11 { right: percentage((11/ @grid-columns)); }
// Offsets
.col-md-offset-0 { margin-left: 0; }
.col-md-offset-1 { margin-left: percentage((1 / @grid-columns)); }
.col-md-offset-2 { margin-left: percentage((2 / @grid-columns)); }
.col-md-offset-3 { margin-left: percentage((3 / @grid-columns)); }
.col-md-offset-4 { margin-left: percentage((4 / @grid-columns)); }
.col-md-offset-5 { margin-left: percentage((5 / @grid-columns)); }
.col-md-offset-6 { margin-left: percentage((6 / @grid-columns)); }
.col-md-offset-7 { margin-left: percentage((7 / @grid-columns)); }
.col-md-offset-8 { margin-left: percentage((8 / @grid-columns)); }
.col-md-offset-9 { margin-left: percentage((9 / @grid-columns)); }
.col-md-offset-10 { margin-left: percentage((10/ @grid-columns)); }
.col-md-offset-11 { margin-left: percentage((11/ @grid-columns)); }
.clearfix {
*zoom: 1;
}
}

View File

@@ -58,4 +58,5 @@
@import "site-responsive.less"; @import "site-responsive.less";
// Stupid ie // Stupid ie
@import "ie8and.less";
@import "site-ie8and.less"; @import "site-ie8and.less";

View File

@@ -1,75 +1,20 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
// Making up for the non support of IE8 and IE7 in Bootstrap 3 // Making up for the non support of IE8 and IE7 in Bootstrap 3
.ie7, .ie8 { .ie7, .ie8 {
.container {
width: @container-md;
}
.col-md-1,
.col-md-2,
.col-md-3,
.col-md-4,
.col-md-5,
.col-md-6,
.col-md-7,
.col-md-8,
.col-md-9,
.col-md-10,
.col-md-11 {
float: left;
}
.col-md-1 { width: percentage((1 / @grid-columns)); }
.col-md-2 { width: percentage((2 / @grid-columns)); }
.col-md-3 { width: percentage((3 / @grid-columns)); }
.col-md-4 { width: percentage((4 / @grid-columns)); }
.col-md-5 { width: percentage((5 / @grid-columns)); }
.col-md-6 { width: percentage((6 / @grid-columns)); }
.col-md-7 { width: percentage((7 / @grid-columns)); }
.col-md-8 { width: percentage((8 / @grid-columns)); }
.col-md-9 { width: percentage((9 / @grid-columns)); }
.col-md-10 { width: percentage((10/ @grid-columns)); }
.col-md-11 { width: percentage((11/ @grid-columns)); }
.col-md-12 { width: 100%; }
// Push and pull columns for source order changes
.col-md-push-0 { left: auto; }
.col-md-push-1 { left: percentage((1 / @grid-columns)); }
.col-md-push-2 { left: percentage((2 / @grid-columns)); }
.col-md-push-3 { left: percentage((3 / @grid-columns)); }
.col-md-push-4 { left: percentage((4 / @grid-columns)); }
.col-md-push-5 { left: percentage((5 / @grid-columns)); }
.col-md-push-6 { left: percentage((6 / @grid-columns)); }
.col-md-push-7 { left: percentage((7 / @grid-columns)); }
.col-md-push-8 { left: percentage((8 / @grid-columns)); }
.col-md-push-9 { left: percentage((9 / @grid-columns)); }
.col-md-push-10 { left: percentage((10/ @grid-columns)); }
.col-md-push-11 { left: percentage((11/ @grid-columns)); }
.col-md-pull-0 { right: auto; }
.col-md-pull-1 { right: percentage((1 / @grid-columns)); }
.col-md-pull-2 { right: percentage((2 / @grid-columns)); }
.col-md-pull-3 { right: percentage((3 / @grid-columns)); }
.col-md-pull-4 { right: percentage((4 / @grid-columns)); }
.col-md-pull-5 { right: percentage((5 / @grid-columns)); }
.col-md-pull-6 { right: percentage((6 / @grid-columns)); }
.col-md-pull-7 { right: percentage((7 / @grid-columns)); }
.col-md-pull-8 { right: percentage((8 / @grid-columns)); }
.col-md-pull-9 { right: percentage((9 / @grid-columns)); }
.col-md-pull-10 { right: percentage((10/ @grid-columns)); }
.col-md-pull-11 { right: percentage((11/ @grid-columns)); }
// Offsets
.col-md-offset-0 { margin-left: 0; }
.col-md-offset-1 { margin-left: percentage((1 / @grid-columns)); }
.col-md-offset-2 { margin-left: percentage((2 / @grid-columns)); }
.col-md-offset-3 { margin-left: percentage((3 / @grid-columns)); }
.col-md-offset-4 { margin-left: percentage((4 / @grid-columns)); }
.col-md-offset-5 { margin-left: percentage((5 / @grid-columns)); }
.col-md-offset-6 { margin-left: percentage((6 / @grid-columns)); }
.col-md-offset-7 { margin-left: percentage((7 / @grid-columns)); }
.col-md-offset-8 { margin-left: percentage((8 / @grid-columns)); }
.col-md-offset-9 { margin-left: percentage((9 / @grid-columns)); }
.col-md-offset-10 { margin-left: percentage((10/ @grid-columns)); }
.col-md-offset-11 { margin-left: percentage((11/ @grid-columns)); }
.legend { .legend {
display: block; display: block;
width: 100%; width: 100%;
@@ -83,14 +28,11 @@
.tooltip-inner { .tooltip-inner {
background-color: #000000; background-color: #000000;
} }
.clearfix {
*zoom: 1;
}
.date { .date {
font-size:85%; font-size:85%;
} }
.task-card-link { .task-card-link {
min-height:190px; min-height:160px;
} }
.series-checkboxes li { .series-checkboxes li {
margin-right:1%; margin-right:1%;
@@ -98,34 +40,41 @@
.stat-type { .stat-type {
font-size:floor(@font-size-base * 0.65); // ~10px; font-size:floor(@font-size-base * 0.65); // ~10px;
} }
}
.ie7 {
ul {
margin-left:0;
}
.col-md-2 { width:14%; }
.col-md-3 { width:22%; }
.col-md-4 {
width: 32%;
padding:0 5px;
}
.col-md-9 { width:72%; }
.col-md-10 { width:80%; }
.col-md-12 { width: 97%; }
.aside .task-stats li {
width:31.5%;
}
.aside .action-buttons .btn { .aside .action-buttons .btn {
width:79%; width:79%;
} }
.date-selector { .pull-right.dropdown-menu {
zoom:1; right:134px;
}
.run-details .pull-right.dropdown-menu {
right:64px;
}
.date-selector .btn-full-width {
width:90%;
}
.filter-toggle {
&:before {
height:110%;
width:100%;
left:0;
top:0;
}
input {
width:92%;
}
.filter-trigger {
padding-bottom:0;
}
}
}
.ie7 {
.aside .task-stats li {
width:31.5%;
} }
.zfix { .zfix {
position:relative; position:relative;
z-index:100; z-index:1001;
} }
.list-group li .list-group-item { .list-group li .list-group-item {
margin:0; margin:0;
@@ -136,6 +85,44 @@
padding-bottom:90px; padding-bottom:90px;
} }
.date-selector { .date-selector {
margin-top:-155px; zoom:1;
.btn-full-width {
width:100%;
}
}
.sr-only {
position:relative;
}
.breadcrumb li {
vertical-align: top;
zoom: 1;
display: inline;
margin-right:10px;
}
.pull-right.dropdown-menu {
right:0px;
}
.run-details .pull-right.dropdown-menu {
right:82px;
}
.tasks-list li {
padding-right:105px;
}
.filter-toggle {
width:30%;
margin:0 35%;
margin-top:-10px;
background-color:lighten(@gray-lighter, 4%);
padding-bottom:10px;
.glyphicon {
display:none;
}
input {
width:80%;
margin-left:-25%;
}
} }
} }

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
/* No javascript */ /* No javascript */
.no-javascript { .no-javascript {
.graph-container, .expander { .graph-container, .expander {
@@ -26,4 +41,7 @@
.show-class { .show-class {
display:block; display:block;
} }
.no-js-hide {
display: none;
}
} }

View File

@@ -1,9 +1,19 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
/* Media queries */ /* Media queries */
@media (max-width:1199px) {
.task-card .task-card-link {
min-height:215px;
}
}
@media (max-width:991px) { @media (max-width:991px) {
.h1, h1 { .h1, h1 {
font-size:floor(@font-size-base * 2.15); // ~32px; font-size:floor(@font-size-base * 2.15); // ~32px;
@@ -11,9 +21,6 @@
.h2, h2 { .h2, h2 {
font-size:floor(@font-size-base * 1.9); // ~28px; font-size:floor(@font-size-base * 1.9); // ~28px;
} }
.task-card .task-card-link {
min-height:200px;
}
.task-header .h4 { .task-header .h4 {
font-size:floor(@font-size-base * 1.15); // ~17px; font-size:floor(@font-size-base * 1.15); // ~17px;
} }
@@ -40,6 +47,9 @@
.btn-full-width { .btn-full-width {
margin-bottom:0; margin-bottom:0;
} }
.task-card .task-stats {
margin-bottom:10px;
}
.action-buttons { .action-buttons {
margin-bottom:20px; margin-bottom:20px;
} }
@@ -88,6 +98,9 @@
text-align:left; text-align:left;
} }
} }
.task-card .task-card-link {
min-height:0;
}
} }
@media (max-width:640px) { @media (max-width:640px) {
body { body {

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
/* Site specific styling */ /* Site specific styling */
/* Helper Classes */ /* Helper Classes */
@@ -70,7 +85,7 @@
} }
.dropdown-toggle { .dropdown-toggle {
margin-top:0; margin-top:0;
margin-bottom:10px; margin-bottom:5px;
} }
.list-group { .list-group {
li .list-group-item { li .list-group-item {
@@ -179,7 +194,7 @@
} }
.task-card-link { .task-card-link {
color:@gray-dark; color:@gray-dark;
min-height:200px; min-height:190px;
display:block; display:block;
transition: background 0.5s; transition: background 0.5s;
-webkit-transition: background 0.5s; -webkit-transition: background 0.5s;
@@ -216,8 +231,6 @@
/* Badges */ /* Badges */
.badge { .badge {
border-radius:0.25em; border-radius:0.25em;
}
.badge {
display:inline-block; display:inline-block;
padding:10px; padding:10px;
font-size:ceil(@font-size-base * 0.85); // ~13px; font-size:ceil(@font-size-base * 0.85); // ~13px;
@@ -238,6 +251,9 @@
h2 { h2 {
word-wrap:break-word; word-wrap:break-word;
} }
.h4 {
margin-bottom:6px;
}
} }
.date { .date {
margin-top:5px; margin-top:5px;
@@ -253,10 +269,27 @@
li { li {
margin-bottom:20px; margin-bottom:20px;
padding-right:90px;
position:relative;
&:last-child { &:last-child {
margin-bottom:0; margin-bottom:0;
} }
form {
display:none;
position:absolute;
right:0;
top:0;
&:hover .btn {
color:@brand-primary;
}
}
&:hover form {
display:block;
}
} }
.rule-name { .rule-name {
@@ -264,6 +297,7 @@
font-style:italic; font-style:italic;
word-wrap:break-word; word-wrap:break-word;
} }
} }
.task-danger { .task-danger {
border-color:@brand-danger; border-color:@brand-danger;
@@ -313,19 +347,35 @@ ul.date-links {
z-index:10; z-index:10;
} }
.date-selector { .date-selector {
margin-top:-125px; margin-bottom:5px;
.btn-group > .btn { .show-stats {
float:none; margin-top: 0;
} }
&.single-result { h2 {
margin-top:-55px; margin-top: 0;
.show-stats {
display:none;
}
} }
.dates-list {
margin: 0;
padding: 0;
list-style-type: none;
}
.dates-list > li {
list-style-type: none;
padding: 0;
margin: 0;
}
.dates-list a {
color: #fff;
text-decoration: underline;
}
}
.single-result .date-selector-row {
display: none;
} }
/* Graph */ /* Graph */
@@ -334,11 +384,11 @@ ul.date-links {
width:100%; width:100%;
} }
.graph-spacer { .graph-spacer {
margin-bottom:60px; margin-bottom:30px;
padding-bottom:60px; padding-bottom:30px;
} }
.graph-table { .graph-table {
margin-bottom:50px; margin-bottom:0;
td { td {
width:25%; width:25%;
@@ -379,8 +429,7 @@ ul.date-links {
} }
} }
.btn-reset { .btn-reset {
margin-top:-24px; margin-top:12px;
margin-right:35px
} }
.flot-x-axis { .flot-x-axis {
.flot-tick-label { .flot-tick-label {
@@ -390,6 +439,68 @@ ul.date-links {
.tooltip-graph { .tooltip-graph {
font-size:12px; font-size:12px;
} }
.custom-legend .legend {
display:none !important;
}
.dashedLegend {
position:absolute;
top:17px;
right:40px;
font-size:smaller;
color:#545454;
background-color: #fff;
background-color: rgba(255, 255, 255, 0.75);
display:none;
}
.dashedContainer {
background: #fff;
border: 1px solid #808080;
margin: 5px;
padding-top: 5px;
}
.dashedLegend tr {
display: none;
}
.dashedLegend .legendColorBox > div:first-child {
border: 1px solid rgb(204, 204, 204);
padding: 3px;
}
.dashedLegend .legendIcon div {
height: 0px;
border-width: 3px 0px 0px;
border-top-style: solid;
overflow: hidden;
}
.dashedLegend .legendErrors div {
width: 25px;
border-top-color: rgb(216, 61, 45);
}
.dashedLegend .legendWarnings div {
width: 10px;
border-top-color: rgb(168, 103, 0);
float: left;
}
.dashedLegend .legendWarnings div:first-child {
margin-right: 5px;
}
.dashedLegend .legendNotices div {
width: 5px;
border-top-color: rgb(23, 123, 190);
float: left;
margin-left: 5px;
}
.dashedLegend .legendNotices div:first-child {
margin-left: 0;
}
.dashedLegend td.legendColorBox {
padding-right: 5px;
padding-bottom: 5px;
padding-left: 10px;
}
.dashedLegend td.legendLabel {
padding-right: 10px;
padding-bottom: 5px;
}
/* New task page */ /* New task page */
.standards-lists { .standards-lists {
@@ -413,3 +524,52 @@ ul.date-links {
} }
} }
} }
.filter-toggle {
top:-20px;
margin-top:-10px;
font-size:18px;
font-weight:bold;
.filter-trigger {
padding-bottom:20px;
cursor: pointer;
.glyphicon {
display:block;
margin:0 auto;
}
}
&:before {
position:absolute;
content:"";
height:90px;
width:90px;
left:50%;
top:-45px;
background-color:lighten(@gray-lighter, 4%);
transform: translateX(-50%) rotate(45deg);
-ms-transform: translateX(-50%) rotate(45deg);
-webkit-transform: translateX(-50%) rotate(45deg);
z-index:-1;
}
}
/* inline link list */
.inline-list {
display: inline-block;
margin: 0;
padding: 0;
}
.inline-list > li {
display: inline-block;
border-right: 1px solid @dropdown-fallback-border; // IE8 fallback
border-right: 1px solid @dropdown-border;
padding: 0 4px 0 0;
margin: 0 4px 0 0;
}
.inline-list + div.date {
display: inline-block;
}

View File

@@ -43,3 +43,11 @@
.affix { .affix {
position: fixed; position: fixed;
} }
// Cursors
// -------------------------
.pointer {
cursor: pointer;
}

View File

@@ -545,6 +545,7 @@
// Wells // Wells
// ------------------------- // -------------------------
@well-bg: #f5f5f5; @well-bg: #f5f5f5;
@well-bg-drk: #2c3e50;
// Badges // Badges

View File

@@ -27,3 +27,11 @@
padding: 9px; padding: 9px;
border-radius: @border-radius-small; border-radius: @border-radius-small;
} }
// Dark well
.dark-well {
background-color: @well-bg-drk;
border-color: darken(@well-bg-drk, 7%);
color: #fff;
}

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
var presentTask = require('../view/presenter/task'); var presentTask = require('../view/presenter/task');

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
var getStandards = require('../data/standards'); var getStandards = require('../data/standards');
@@ -25,7 +40,10 @@ function route (app) {
name: req.body.name, name: req.body.name,
url: req.body.url, url: req.body.url,
standard: req.body.standard, standard: req.body.standard,
ignore: req.body.ignore || [] ignore: req.body.ignore || [],
timeout: req.body.timeout,
username: req.body.username,
password: req.body.password
}; };
app.webservice.tasks.create(newTask, function (err, task) { app.webservice.tasks.create(newTask, function (err, task) {
if (err) { if (err) {

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
var moment = require('moment'); var moment = require('moment');
@@ -46,13 +61,13 @@ function route (app) {
app.express.get('/:id/:rid.csv', getTaskAndResult, function (req, res) { app.express.get('/:id/:rid.csv', getTaskAndResult, function (req, res) {
var task = res.locals.task; var task = res.locals.task;
var result = res.locals.result; var result = res.locals.result;
var rows = ['"code", "message", "type"']; var rows = ['"code","message","type"'];
result.results.forEach(function (msg) { result.results.forEach(function (msg) {
rows.push([ rows.push([
JSON.stringify(msg.code), JSON.stringify(msg.code),
JSON.stringify(msg.message), JSON.stringify(msg.message),
JSON.stringify(msg.type) JSON.stringify(msg.type)
].join(', ')); ].join(','));
}); });
res.attachment(getDownloadFileName(task, result, 'csv')); res.attachment(getDownloadFileName(task, result, 'csv'));
res.send(rows.join('\n')); res.send(rows.join('\n'));

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
var presentTask = require('../../view/presenter/task'); var presentTask = require('../../view/presenter/task');

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
var _ = require('underscore'); var _ = require('underscore');

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
var _ = require('underscore'); var _ = require('underscore');
@@ -45,6 +60,9 @@ function route (app) {
if (err) { if (err) {
task.name = req.body.name; task.name = req.body.name;
task.ignore = req.body.ignore; task.ignore = req.body.ignore;
task.timeout = req.body.timeout;
task.username = req.body.username;
task.password = req.body.password;
var standards = getStandards().map(function (standard) { var standards = getStandards().map(function (standard) {
if (standard.title === task.standard) { if (standard.title === task.standard) {
standard.selected = true; standard.selected = true;

30
route/task/ignore.js Normal file
View File

@@ -0,0 +1,30 @@
'use strict';
var _ = require('underscore');
var presentTask = require('../../view/presenter/task');
var getStandards = require('../../data/standards');
module.exports = route;
// Route definition
function route (app) {
app.express.post('/:id/ignore', function (req, res, next) {
app.webservice.task(req.params.id).get({}, function (err, task) {
if (err) {
return next();
}
var edit = {
name: task.name,
ignore: task.ignore
};
if (typeof req.body.rule === 'string') {
edit.ignore.push(req.body.rule);
}
app.webservice.task(req.params.id).edit(edit, function () {
res.redirect('/' + req.params.id + '?rule-ignored');
});
});
});
}

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
var presentTask = require('../../view/presenter/task'); var presentTask = require('../../view/presenter/task');
@@ -25,6 +40,8 @@ function route (app) {
mainResult: task.lastResult || null, mainResult: task.lastResult || null,
added: (typeof req.query.added !== 'undefined'), added: (typeof req.query.added !== 'undefined'),
running: (typeof req.query.running !== 'undefined'), running: (typeof req.query.running !== 'undefined'),
ruleIgnored: (typeof req.query['rule-ignored'] !== 'undefined'),
ruleUnignored: (typeof req.query['rule-unignored'] !== 'undefined'),
hasOneResult: (presentedResults.length < 2), hasOneResult: (presentedResults.length < 2),
isTaskPage: true isTaskPage: true
}); });

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
module.exports = route; module.exports = route;

31
route/task/unignore.js Normal file
View File

@@ -0,0 +1,31 @@
'use strict';
var _ = require('underscore');
var presentTask = require('../../view/presenter/task');
var getStandards = require('../../data/standards');
module.exports = route;
// Route definition
function route (app) {
app.express.post('/:id/unignore', function (req, res, next) {
app.webservice.task(req.params.id).get({}, function (err, task) {
if (err) {
return next();
}
var edit = {
name: task.name,
ignore: task.ignore
};
var indexOfRule = edit.ignore.indexOf(req.body.rule);
if (typeof req.body.rule === 'string' && indexOfRule !== -1) {
edit.ignore.splice(indexOfRule, 1);
}
app.webservice.task(req.params.id).edit(edit, function () {
res.redirect('/' + req.params.id + '?rule-unignored');
});
});
});
}

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
var jsdom = require('jsdom'); var jsdom = require('jsdom');

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
var createClient = require('pa11y-webservice-client-node'); var createClient = require('pa11y-webservice-client-node');

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
/* global beforeEach, describe, it */ /* global beforeEach, describe, it */
/* jshint maxlen: false, maxstatements: false */ /* jshint maxlen: false, maxstatements: false */
'use strict'; 'use strict';

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
/* global beforeEach, describe, it */ /* global beforeEach, describe, it */
/* jshint maxlen: false, maxstatements: false */ /* jshint maxlen: false, maxstatements: false */
'use strict'; 'use strict';
@@ -49,6 +64,20 @@ describe('GET /new', function () {
assert.strictEqual(field.getAttribute('value'), ''); assert.strictEqual(field.getAttribute('value'), '');
}); });
it('should have a "username" field', function () {
var field = this.form.querySelectorAll('input[name=username]')[0];
assert.isDefined(field);
assert.strictEqual(field.getAttribute('type'), 'text');
assert.strictEqual(field.getAttribute('value'), '');
});
it('should have a "password" field', function () {
var field = this.form.querySelectorAll('input[name=password]')[0];
assert.isDefined(field);
assert.strictEqual(field.getAttribute('type'), 'text');
assert.strictEqual(field.getAttribute('value'), '');
});
it('should have a "standard" field', function () { it('should have a "standard" field', function () {
var field = this.form.querySelectorAll('select[name=standard]')[0]; var field = this.form.querySelectorAll('select[name=standard]')[0];
assert.isDefined(field); assert.isDefined(field);

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
/* global beforeEach, describe, it */ /* global beforeEach, describe, it */
/* jshint maxlen: false, maxstatements: false */ /* jshint maxlen: false, maxstatements: false */
'use strict'; 'use strict';
@@ -20,7 +35,7 @@ describe('GET /<task-id>/<result-id>.csv', function () {
}); });
it('should output CSV results', function () { it('should output CSV results', function () {
assert.match(this.last.body, /^"code", "message", "type"/); assert.match(this.last.body, /^"code","message","type"/);
}); });
}); });

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
/* global beforeEach, describe, it */ /* global beforeEach, describe, it */
/* jshint maxlen: false, maxstatements: false */ /* jshint maxlen: false, maxstatements: false */
'use strict'; 'use strict';

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
/* global beforeEach, describe, it */ /* global beforeEach, describe, it */
/* jshint maxlen: false, maxstatements: false */ /* jshint maxlen: false, maxstatements: false */
'use strict'; 'use strict';

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
/* global beforeEach, describe, it */ /* global beforeEach, describe, it */
/* jshint maxlen: false, maxstatements: false */ /* jshint maxlen: false, maxstatements: false */
'use strict'; 'use strict';
@@ -56,6 +71,20 @@ describe('GET /<task-id>/edit', function () {
assert.isDefined(field.getAttribute('disabled')); assert.isDefined(field.getAttribute('disabled'));
}); });
it('should have a "username" field', function () {
var field = this.form.querySelectorAll('input[name=username]')[0];
assert.isDefined(field);
assert.strictEqual(field.getAttribute('type'), 'text');
assert.strictEqual(field.getAttribute('value'), 'user');
});
it('should have a "password" field', function () {
var field = this.form.querySelectorAll('input[name=password]')[0];
assert.isDefined(field);
assert.strictEqual(field.getAttribute('type'), 'text');
assert.strictEqual(field.getAttribute('value'), 'access');
});
it('should have "ignore" fields', function () { it('should have "ignore" fields', function () {
var fields = this.form.querySelectorAll('input[name="ignore[]"]'); var fields = this.form.querySelectorAll('input[name="ignore[]"]');
assert.isDefined(fields); assert.isDefined(fields);
@@ -74,6 +103,8 @@ describe('POST /<task-id>/edit', function () {
endpoint: '/abc000000000000000000001/edit', endpoint: '/abc000000000000000000001/edit',
body: { body: {
name: 'foo', name: 'foo',
username: 'newuser',
password: 'secure',
ignore: ['bar', 'baz'] ignore: ['bar', 'baz']
} }
}; };
@@ -87,6 +118,8 @@ describe('POST /<task-id>/edit', function () {
it('should edit the task', function (done) { it('should edit the task', function (done) {
this.webservice.task('abc000000000000000000001').get({}, function (err, task) { this.webservice.task('abc000000000000000000001').get({}, function (err, task) {
assert.strictEqual(task.name, 'foo'); assert.strictEqual(task.name, 'foo');
assert.strictEqual(task.username, 'newuser');
assert.strictEqual(task.password, 'secure');
assert.deepEqual(task.ignore, ['bar', 'baz']); assert.deepEqual(task.ignore, ['bar', 'baz']);
done(); done();
}); });

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
/* global beforeEach, describe, it */ /* global beforeEach, describe, it */
/* jshint maxlen: false, maxstatements: false */ /* jshint maxlen: false, maxstatements: false */
'use strict'; 'use strict';

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
/* global beforeEach, describe, it */ /* global beforeEach, describe, it */
/* jshint maxlen: false, maxstatements: false */ /* jshint maxlen: false, maxstatements: false */
'use strict'; 'use strict';

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
/* global afterEach, before */ /* global afterEach, before */
/* jshint maxlen: false, maxstatements: false */ /* jshint maxlen: false, maxstatements: false */
'use strict'; 'use strict';

View File

@@ -1,3 +1,19 @@
{{!
This file is part of pa11y-dashboard.
pa11y-dashboard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pa11y-dashboard 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
}}
<div class="col-md-8"> <div class="col-md-8">
<h1>Hmmm, this page indicates a 404 error.</h1> <h1>Hmmm, this page indicates a 404 error.</h1>
<p class="h2">That is techy babble for "We couldn't find the page you were looking for".</h2> <p class="h2">That is techy babble for "We couldn't find the page you were looking for".</h2>

View File

@@ -1,3 +1,19 @@
{{!
This file is part of pa11y-dashboard.
pa11y-dashboard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pa11y-dashboard 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
}}
<div class="col-md-8"> <div class="col-md-8">
<h1>Eeek! 500 error. This is serious.</h1> <h1>Eeek! 500 error. This is serious.</h1>
<p class="h2">There isn't much you can do about this.</h2> <p class="h2">There isn't much you can do about this.</h2>

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
var moment = require('moment'); var moment = require('moment');

12
view/helper/string.js Normal file
View File

@@ -0,0 +1,12 @@
'use strict';
module.exports = helper;
function helper (register) {
// Convert a string to lower-case
register('lowercase', function (context) {
return context.toLowerCase();
});
}

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
module.exports = helper; module.exports = helper;
@@ -6,7 +21,7 @@ function helper (register) {
// Simplify url by removing (eg http://, https://, trailing slashes) from url // Simplify url by removing (eg http://, https://, trailing slashes) from url
register('simplify-url', function (context) { register('simplify-url', function (context) {
return context.replace(/^https?:\/\//i, '').replace(/\/$/, ''); return context.replace(/^https?:\/\//i, '').replace(/\/$/, '').toLowerCase();
}); });
} }

View File

@@ -1,22 +1,52 @@
{{!
This file is part of pa11y-dashboard.
pa11y-dashboard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pa11y-dashboard 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
}}
{{#content "title"}}pa11y-dashboard{{/content}} {{#content "title"}}pa11y-dashboard{{/content}}
{{#if siteMessage}} <div data-control="task-list">
<div class="col-md-12 clearfix" data-test="alert">
<div class="alert alert-info site-message">
<h3 class="crunch-top"><span class="pull-left glyphicon glyphicon-exclamation-sign"></span> Important</h3>
<p class="h5">{{siteMessage}}</p>
</div>
</div>
{{/if}}
{{#deleted}} <div class="clearfix">
<div class="col-md-12 clearfix" data-test="alert"> <div class="col-md-6 col-md-offset-3 filter-toggle no-js-hide text-center">
<div class="alert alert-info"> <label for="filter-input" class="filter-trigger" data-toggle="collapse" data-target="#filter-input">Filter<span class="glyphicon glyphicon-filter"></span>
<button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button> </label>
<strong>Bye Bye URL</strong> <div id="filter-input" class="collapse">
<p>The URL you selected and its associated results have been deleted.</p> <input class="form-control" id="task-filter" type="text" data-role="input" placeholder="Type filter term (name or standard)"/>
</div> </div>
</div> </div>
{{/deleted}} </div>
{{> tasks}} {{#if siteMessage}}
<div class="col-md-12 clearfix" data-test="alert">
<div class="alert alert-info site-message">
<h3 class="crunch-top"><span class="pull-left glyphicon glyphicon-exclamation-sign"></span> Important</h3>
<p class="h5">{{siteMessage}}</p>
</div>
</div>
{{/if}}
{{#deleted}}
<div class="col-md-12 clearfix" data-test="alert">
<div class="alert alert-info">
<button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button>
<strong>Bye Bye URL</strong>
<p>The URL you selected and its associated results have been deleted.</p>
</div>
</div>
{{/deleted}}
{{> tasks}}
</div>

View File

@@ -1,3 +1,19 @@
{{!
This file is part of pa11y-dashboard.
pa11y-dashboard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pa11y-dashboard 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
}}
<!DOCTYPE html> <!DOCTYPE html>
<html lang="{{lang}}" class="no-javascript"> <html lang="{{lang}}" class="no-javascript">
<head> <head>

View File

@@ -1,3 +1,19 @@
{{!
This file is part of pa11y-dashboard.
pa11y-dashboard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pa11y-dashboard 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
}}
{{#content "title"}} {{#content "title"}}
Add a new URL Add a new URL
@@ -49,6 +65,33 @@
</div> </div>
</div> </div>
<div class="form-group clearfix">
<div class="row">
<div class="col-md-4 col-sm-4 col-xs-6">
<label class="control-label" for="new-task-timeout">Timeout (milliseconds)</label>
<input class="form-control" id="new-task-timeout" type="text" placeholder="E.g. 30000" name="timeout" value="{{task.timeout}}"/>
</div>
</div>
</div>
<div class="form-group clearfix">
<div class="row">
<div class="col-md-4 col-sm-4 col-xs-6">
<label class="control-label" for="new-task-username">Username</label>
<input class="form-control" id="new-task-username" type="text" name="username" value="{{task.username}}"/>
</div>
</div>
</div>
<div class="form-group clearfix">
<div class="row">
<div class="col-md-4 col-sm-4 col-xs-6">
<label class="control-label" for="new-task-password">Password</label>
<input class="form-control" id="new-task-password" type="text" name="password" value="{{task.password}}"/> <em>(Note: this will be stored and displayed in plain-text - only suitable for use in a secure environment)</em>
</div>
</div>
</div>
<p class="control-label"><b>Ignore these rules</b> <a target="_blank" href="https://github.com/nature/pa11y/wiki/HTML-CodeSniffer-Rules">(full list of rules here)</a></p> <p class="control-label"><b>Ignore these rules</b> <a target="_blank" href="https://github.com/nature/pa11y/wiki/HTML-CodeSniffer-Rules">(full list of rules here)</a></p>
<div class="standards-lists"> <div class="standards-lists">

View File

@@ -1,3 +1,19 @@
{{!
This file is part of pa11y-dashboard.
pa11y-dashboard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pa11y-dashboard 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
}}
{{#unless isHomePage}} {{#unless isHomePage}}
<div class="container"> <div class="container">
<div class="row"> <div class="row">

View File

@@ -1,8 +1,56 @@
{{!
This file is part of pa11y-dashboard.
pa11y-dashboard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pa11y-dashboard 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
}}
<div class="col-md-12 clearfix"> <div class="col-md-12 clearfix">
<div class="graph-container graph-spacer ruled"> <div class="graph-container graph-spacer ruled clearfix">
<div data-role="graph" class="graph"></div> <div data-role="graph" class="graph"></div>
<div class="row"> <div class="row">
<ul class="list-unstyled floated-list series-checkboxes clearfix crunch-bottom col-md-3 col-sm-6 col-xs-12" data-role="series-checkboxes"></ul> <ul class="list-unstyled floated-list series-checkboxes clearfix crunch-bottom col-md-3 col-sm-6 col-xs-12 pull-right" data-role="series-checkboxes"></ul>
</div>
<div class="dashedLegend">
<div class="dashedContainer">
<table>
<tbody>
<tr>
<td class="legendColorBox">
<div class="clearfix legendIcon legendErrors">
<div></div>
</div>
</td>
<td class="legendLabel">Errors</td>
</tr>
<tr>
<td class="legendColorBox">
<div class="clearfix legendIcon legendWarnings">
<div></div><div></div>
</div>
</td>
<td class="legendLabel">Warnings</td>
</tr>
<tr>
<td class="legendColorBox">
<div class="clearfix legendIcon legendNotices">
<div></div><div></div><div></div>
</div>
</td>
<td class="legendLabel">Notices</td>
</tr>
</tbody>
</table>
</div>
</div> </div>
<button data-role='zoom-reset' class="btn btn-xs btn-primary pull-right btn-reset hidden">Reset Zoom <i class="glyphicon glyphicon-zoom-out"></i></button> <button data-role='zoom-reset' class="btn btn-xs btn-primary pull-right btn-reset hidden">Reset Zoom <i class="glyphicon glyphicon-zoom-out"></i></button>
</div> </div>

View File

@@ -1,3 +1,19 @@
{{!
This file is part of pa11y-dashboard.
pa11y-dashboard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pa11y-dashboard 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
}}
<footer> <footer>
<div class="footer" role="contentinfo"> <div class="footer" role="contentinfo">
<div class="container"> <div class="container">

View File

@@ -1,3 +1,19 @@
{{!
This file is part of pa11y-dashboard.
pa11y-dashboard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pa11y-dashboard 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
}}
<header> <header>
<div role="banner" class="header"> <div role="banner" class="header">
<div class="container"> <div class="container">

View File

@@ -1,6 +1,22 @@
{{!
This file is part of pa11y-dashboard.
pa11y-dashboard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pa11y-dashboard 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
}}
<div class="col-md-12"> <div class="col-md-12">
<div class="ruled task-header"> <div class="ruled task-header">
<div class="row clearfix"> <div class="row clearfix task-header">
<div class="col-md-12"> <div class="col-md-12">
<div class="h3 crunch well-med well pull-right"><span class="glyphicon glyphicon-calendar"></span>&nbsp;{{date-format mainResult.date format="DD MMM YYYY"}}</div> <div class="h3 crunch well-med well pull-right"><span class="glyphicon glyphicon-calendar"></span>&nbsp;{{date-format mainResult.date format="DD MMM YYYY"}}</div>
<h1 class="h2 crunch-top">{{task.name}}</h1> <h1 class="h2 crunch-top">{{task.name}}</h1>

View File

@@ -1,19 +0,0 @@
<div class="col-md-12 zfix">
<div class="row">
<div class="col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3">
<div class="date-selector{{#if hasOneResult}} single-result{{/if}}">
<h4 class="show-stats text-center">Select a date to show stats for</h4>
<ul class="list-unstyled">
<li class="btn-group block-level clearfix">
<button data-toggle="dropdown" class="btn-full-width btn btn-primary dropdown-toggle" type="button">{{date-format task.lastResult.date format="DD MMM YYYY"}} <span class="glyphicon glyphicon-calendar"></span> <span class="caret"></span></button>
<ul role="navigation" class="date-links list-group hidden" data-role="date-select-dropdown-menu">
{{#results}}
<li><a class="list-group-item text-center" href="{{href}}">{{date-format date format="DD MMM YYYY"}}</a></li>
{{/results}}
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>

View File

@@ -1,6 +1,23 @@
{{!
This file is part of pa11y-dashboard.
pa11y-dashboard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pa11y-dashboard 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
}}
<div class="col-md-3 aside"> <div class="col-md-3 aside">
<div class="row"> <div class="row">
<div id="top" class="col-md-12 col-sm-6 col-xs-12"> <div class="col-md-12 col-sm-6 col-xs-12">
<ul data-role="task-list" class="clearfix list-unstyled floated-list task-stats"> <ul data-role="task-list" class="clearfix list-unstyled floated-list task-stats">
{{#mainResult}} {{#mainResult}}
<li class="danger"><a href="#errors" title="See errors">{{count.error}}<span class="stat-type">Errors</span></a></li> <li class="danger"><a href="#errors" title="See errors">{{count.error}}<span class="stat-type">Errors</span></a></li>
@@ -24,6 +41,25 @@
</div> </div>
</div> </div>
</div> </div>
<div class="row date-selector-row">
<div id="top" class="col-md-12 col-sm-12 clearfix">
<div class="well dark-well">
<div class="date-selector">
<div class="btn-group block-level clearfix">
<h2 class="h4">
<span class="glyphicon glyphicon-calendar"></span>&nbsp;&nbsp;{{date-format task.lastResult.date format="DD MMM YYYY"}}
</h2>
<h3 class="h5 show-stats">Select a date to show stats for:</h3>
<ul role="navigation" class="dates-list">
{{#results}}
<li><a class="" href="{{href}}">{{date-format date format="DD MMM YYYY"}}</a></li>
{{/results}}
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="row"> <div class="row">
<div class="col-md-12 col-sm-12 clearfix"> <div class="col-md-12 col-sm-12 clearfix">
<div class="well"> <div class="well">
@@ -34,19 +70,27 @@
</div> </div>
</div> </div>
<div class="col-md-9"> <div class="col-md-9" data-role="expandable-results" role="main">
{{#if mainResult.count.error}} {{#if mainResult.count.error}}
<div class="heading label-danger showing first" id="errors" data-test="task-errors"> <div class="heading label-danger pointer showing first" id="errors" data-test="task-errors" data-role="expander" role="button" tabindex="0" aria-expanded="true" aria-controls="errors-list">
<span data-role="expander" class="pull-right expander"> - </span> <span class="pull-right expander"> - <span class="hide">(close panel)</span></span>
Errors ( {{mainResult.count.error}} ) Errors ( {{mainResult.count.error}} )
</div> </div>
<div class="task-danger tasks-list collapse clearfix in"> <div class="task-danger tasks-list collapse clearfix in" id="errors-list">
<ul class="list-unstyled"> <ul class="list-unstyled">
{{#mainResult.errors}} {{#mainResult.errors}}
<li> <li>
<p class="crunch rule-name">{{code}} <span class="badge">{{count}}</span></p> <p class="crunch rule-name">{{code}} <span class="badge">{{count}}</span></p>
<p>{{message}}</p> <p>{{message}}</p>
{{#unless readonly}}
{{#if ../../isTaskPage}}
<form action="{{../../../task.hrefIgnore}}" method="post">
<input type="hidden" name="rule" value="{{code}}"/>
<input type="submit" class="btn btn-sm" value="Ignore rule"/>
</form>
{{/if}}
{{/unless}}
</li> </li>
{{/mainResult.errors}} {{/mainResult.errors}}
</ul> </ul>
@@ -57,16 +101,24 @@
{{/if}} {{/if}}
{{#if mainResult.count.warning}} {{#if mainResult.count.warning}}
<div class="heading label-warning" id="warnings" data-test="task-warnings"> <div class="heading label-warning pointer" id="warnings" data-test="task-warnings" data-role="expander" role="button" tabindex="0" aria-expanded="false" aria-controls="warnings-list">
<span data-role="expander" class="pull-right expander"> + </span> <span class="pull-right expander"> + <span class="hide">(open panel)</span></span>
Warnings ( {{mainResult.count.warning}} ) Warnings ( {{mainResult.count.warning}} )
</div> </div>
<div class="task-warning tasks-list collapse clearfix"> <div class="task-warning tasks-list collapse clearfix" id="warnings-list">
<ul class="list-unstyled"> <ul class="list-unstyled">
{{#mainResult.warnings}} {{#mainResult.warnings}}
<li> <li>
<p class="crunch rule-name">{{code}} <span class="badge">{{count}}</span></p> <p class="crunch rule-name">{{code}} <span class="badge">{{count}}</span></p>
<p>{{message}}</p> <p>{{message}}</p>
{{#unless readonly}}
{{#if ../../isTaskPage}}
<form action="{{../../../task.hrefIgnore}}" method="post">
<input type="hidden" name="rule" value="{{code}}"/>
<input type="submit" class="btn btn-sm" value="Ignore rule"/>
</form>
{{/if}}
{{/unless}}
</li> </li>
{{/mainResult.warnings}} {{/mainResult.warnings}}
</ul> </ul>
@@ -78,16 +130,24 @@
{{/if}} {{/if}}
{{#if mainResult.count.notice}} {{#if mainResult.count.notice}}
<div class="heading label-info" id="notices" data-test="task-notices"> <div class="heading label-info pointer" id="notices" data-test="task-notices" data-role="expander" role="button" tabindex="0" aria-expanded="false" aria-controls="notices-list">
<span data-role="expander" class="pull-right expander"> + </span> <span class="pull-right expander"> + <span class="hide">(open panel)</span></span>
Notices ( {{mainResult.count.notice}} ) Notices ( {{mainResult.count.notice}} )
</div> </div>
<div class="task-info tasks-list collapse clearfix"> <div class="task-info tasks-list collapse clearfix" id="notices-list">
<ul class="list-unstyled"> <ul class="list-unstyled">
{{#mainResult.notices}} {{#mainResult.notices}}
<li> <li>
<p class="crunch rule-name">{{code}} <span class="badge">{{count}}</span></p> <p class="crunch rule-name">{{code}} <span class="badge">{{count}}</span></p>
<p>{{message}}</p> <p>{{message}}</p>
{{#unless readonly}}
{{#if ../../isTaskPage}}
<form action="{{../../../task.hrefIgnore}}" method="post">
<input type="hidden" name="rule" value="{{code}}"/>
<input type="submit" class="btn btn-sm" value="Ignore rule"/>
</form>
{{/if}}
{{/unless}}
</li> </li>
{{/mainResult.notices}} {{/mainResult.notices}}
</ul> </ul>
@@ -97,21 +157,29 @@
<p class="heading label-info" id="notices">Well done! You have 0 notices. <span class="glyphicon glyphicon-ok pull-right"></span></p> <p class="heading label-info" id="notices">Well done! You have 0 notices. <span class="glyphicon glyphicon-ok pull-right"></span></p>
{{/if}} {{/if}}
{{#if task.ignore.length}} {{#if mainResult.ignore.length}}
<div class="heading label-default"> <div class="heading label-default pointer" id="ignore" data-role="expander" role="button" tabindex="0" aria-expanded="false" aria-controls="ignore-list">
<span data-role="expander" class="pull-right expander"> + </span> <span class="pull-right expander"> + <span class="hide">(open panel)</span></span>
Ignored Rules ( {{task.ignore.length}} ) Ignored Rules ( {{mainResult.ignore.length}} )
</div> </div>
<div class="task-default tasks-list collapse clearfix"> <div class="task-default tasks-list collapse clearfix" id="ignore-list">
<ul class="list-unstyled"> <ul class="list-unstyled">
{{#task.ignore}} {{#mainResult.ignore}}
<li> <li>
<p class="crunch rule-name">{{name}}</p> <p class="crunch rule-name">{{name}}</p>
{{#if description}} {{#if description}}
<p>{{description}}</p> <p>{{description}}</p>
{{/if}} {{/if}}
{{#unless readonly}}
{{#if ../../isTaskPage}}
<form action="{{../../../task.hrefUnignore}}" method="post">
<input type="hidden" name="rule" value="{{name}}"/>
<input type="submit" class="btn btn-sm" value="Unignore rule"/>
</form>
{{/if}}
{{/unless}}
</li> </li>
{{/task.ignore}} {{/mainResult.ignore}}
</ul> </ul>
<a class="pull-right" href="#top" data-role="top">Back to top</a> <a class="pull-right" href="#top" data-role="top">Back to top</a>
</div> </div>

View File

@@ -1,27 +1,41 @@
<div class="col-md-12"> {{!
This file is part of pa11y-dashboard.
pa11y-dashboard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pa11y-dashboard 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
}}
<div class="col-md-12 zfix">
<div class="ruled task-header"> <div class="ruled task-header">
<div class="row clearfix"> <div class="row clearfix">
<div class="col-md-9 col-sm-9"> <div class="col-md-12">
<h1 class="h2 crunch-top">{{task.name}}</h1> <h1 class="h2 crunch-top">{{task.name}}</h1>
<p class="h4">{{simplify-url task.url}}<span class="h5"> ({{task.standard}})</span></p> <p class="h4">{{simplify-url task.url}}<span class="h5"> ({{task.standard}})</span></p>
</div> </div>
<div class="col-md-3 col-sm-3 text-right run-details"> <div class="run-details task-header clearfix">
{{#unless readonly}} <div class="col-md-12 clearfix">
<div class="btn-group"> {{#unless readonly}}
<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown">Options <span class="caret"></span></button> <ul class="inline-list" role="menu">
<ul class="dropdown-menu pull-right" role="menu">
<li><a href="/{{task.id}}/edit">Edit this task</a></li> <li><a href="/{{task.id}}/edit">Edit this task</a></li>
<li><a href="/{{task.id}}/delete">Delete this task</a></li> <li><a href="/{{task.id}}/delete">Delete this task</a></li>
<li class="divider"></li>
<li><a href="{{task.hrefRun}}" data-test="run-task">Run pa11y</a></li> <li><a href="{{task.hrefRun}}" data-test="run-task">Run pa11y</a></li>
</ul> </ul>
</div> {{/unless}}
{{/unless}} {{#if mainResult}}
{{#if mainResult}} <div class="date">Last run: <strong>{{date-format mainResult.date format="DD MMM YYYY"}}</strong></div>
<div class="date">Last run : {{date-format mainResult.date format="DD MMM YYYY"}}</div> {{else}}
{{else}} <div class="date">Not yet run</div>
<div class="date">Not yet run</div> {{/if}}
{{/if}} </div>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -1,3 +1,19 @@
{{!
This file is part of pa11y-dashboard.
pa11y-dashboard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pa11y-dashboard 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
}}
<ul class="list-unstyled clearfix crunch-bottom"> <ul class="list-unstyled clearfix crunch-bottom">
<li class="col-md-4 col-sm-6 task-card add-task"> <li class="col-md-4 col-sm-6 task-card add-task">
@@ -14,7 +30,7 @@
{{/if}} {{/if}}
</li> </li>
{{#each tasks}} {{#each tasks}}
<li class="col-md-4 col-sm-6 task-card" data-test="task"> <li class="col-md-4 col-sm-6 task-card" data-test="task" data-role="task" data-keywords="{{lowercase name}} {{lowercase standard}} {{simplify-url url}}">
<a class="well task-card-link crunch-bottom" title="Details for URL {{simplify-url url}}" href="{{href}}"> <a class="well task-card-link crunch-bottom" title="Details for URL {{simplify-url url}}" href="{{href}}">
<p class="h3">{{name}}</p> <p class="h3">{{name}}</p>
<p class="h5">({{standard}})</p> <p class="h5">({{standard}})</p>
@@ -33,14 +49,14 @@
</a> </a>
{{#unless ../readonly}} {{#unless ../readonly}}
<div class="btn-group options-button text-right"> <div class="btn-group options-button text-right">
<button type="button" class="btn btn-info btn-xs dropdown-toggle" data-toggle="dropdown"><span class="sr-only">Options</span><span class="glyphicon glyphicon-cog"></span></button> <button type="button" class="btn btn-info btn-xs dropdown-toggle" data-toggle="dropdown"><span class="sr-only">Options</span><span class="glyphicon glyphicon-cog"></span></button>
<ul class="dropdown-menu pull-right" role="menu"> <ul class="dropdown-menu pull-right" role="menu">
<li><a href="{{href}}/edit">Edit this task</a></li> <li><a href="{{href}}/edit">Edit this task</a></li>
<li><a href="{{href}}/delete">Delete this task</a></li> <li><a href="{{href}}/delete">Delete this task</a></li>
<li class="divider"></li> <li class="divider"></li>
<li><a href="{{href}}/run" data-test="run-task">Run pa11y</a></li> <li><a href="{{href}}/run" data-test="run-task">Run pa11y</a></li>
</ul> </ul>
</div> </div>
{{/unless}} {{/unless}}
</li> </li>
{{/each}} {{/each}}

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
var standardsArray = require('../../data/standards')(); var standardsArray = require('../../data/standards')();

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
var _ = require('underscore'); var _ = require('underscore');

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
var _ = require('underscore'); var _ = require('underscore');

View File

@@ -1,3 +1,18 @@
// This file is part of pa11y-dashboard.
//
// pa11y-dashboard is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// pa11y-dashboard 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
var _ = require('underscore'); var _ = require('underscore');
@@ -14,6 +29,8 @@ function presentTask (task) {
task.hrefRun = '/' + task.id + '/run'; task.hrefRun = '/' + task.id + '/run';
task.hrefJson = '/' + task.id + '.json'; task.hrefJson = '/' + task.id + '.json';
task.hrefEdit = '/' + task.id + '/edit'; task.hrefEdit = '/' + task.id + '/edit';
task.hrefIgnore = '/' + task.id + '/ignore';
task.hrefUnignore = '/' + task.id + '/unignore';
// Enhance the ignored rules // Enhance the ignored rules
task.ignore = presentIgnoreRules(task.ignore); task.ignore = presentIgnoreRules(task.ignore);

View File

@@ -1,3 +1,19 @@
{{!
This file is part of pa11y-dashboard.
pa11y-dashboard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pa11y-dashboard 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
}}
{{#content "title"}} {{#content "title"}}
{{task.name}} - {{simplify-url task.url}} ({{task.standard}}) - {{date-format mainResult.date format="DD MMM YYYY"}} {{task.name}} - {{simplify-url task.url}} ({{task.standard}}) - {{date-format mainResult.date format="DD MMM YYYY"}}
@@ -5,4 +21,6 @@
{{> result-header}} {{> result-header}}
{{> result}} <div class="single-result">
{{> result}}
</div>

View File

@@ -1,3 +1,19 @@
{{!
This file is part of pa11y-dashboard.
pa11y-dashboard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pa11y-dashboard 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
}}
{{#content "title"}} {{#content "title"}}
Delete {{task.url}} ({{task.standard}}) Delete {{task.url}} ({{task.standard}})

View File

@@ -1,3 +1,19 @@
{{!
This file is part of pa11y-dashboard.
pa11y-dashboard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pa11y-dashboard 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
}}
{{#content "title"}} {{#content "title"}}
Edit URL Edit URL
@@ -61,6 +77,33 @@
</div> </div>
</div> </div>
<div class="form-group clearfix">
<div class="row">
<div class="col-md-4 col-sm-4 col-xs-6">
<label class="control-label" for="new-task-timeout">Timeout (milliseconds)</label>
<input class="form-control" id="new-task-timeout" type="text" placeholder="E.g. 30000" name="timeout" value="{{task.timeout}}"/>
</div>
</div>
</div>
<div class="form-group clearfix">
<div class="row">
<div class="col-md-4 col-sm-4 col-xs-6">
<label class="control-label" for="new-task-username">Username</label>
<input class="form-control" id="new-task-username" type="text" name="username" value="{{task.username}}"/>
</div>
</div>
</div>
<div class="form-group clearfix">
<div class="row">
<div class="col-md-4 col-sm-4 col-xs-6">
<label class="control-label" for="new-task-password">Password</label>
<input class="form-control" id="new-task-password" type="text" name="password" value="{{task.password}}"/> <em>(Note: this will be stored and displayed in plain-text - only suitable for use in a secure environment)</em>
</div>
</div>
</div>
<p class="control-label"><b>Ignore these rules</b> <a target="_blank" href="https://github.com/nature/pa11y/wiki/HTML-CodeSniffer-Rules">(full list of rules here)</a></p> <p class="control-label"><b>Ignore these rules</b> <a target="_blank" href="https://github.com/nature/pa11y/wiki/HTML-CodeSniffer-Rules">(full list of rules here)</a></p>
<div class="standards-lists"> <div class="standards-lists">

View File

@@ -1,3 +1,19 @@
{{!
This file is part of pa11y-dashboard.
pa11y-dashboard is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pa11y-dashboard 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with pa11y-dashboard. If not, see <http://www.gnu.org/licenses/>.
}}
{{#content "title"}} {{#content "title"}}
{{task.name}} - {{simplify-url task.url}} ({{task.standard}}) {{task.name}} - {{simplify-url task.url}} ({{task.standard}})
@@ -26,6 +42,32 @@
</div> </div>
{{/running}} {{/running}}
{{#ruleIgnored}}
<div class="col-md-12 clearfix" data-test="alert">
<div class="alert alert-success">
<button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button>
<strong>Rule ignored!</strong>
<p>
You've ignored an accessibility rule for this URL.
<a href="{{task.hrefRun}}">Click here to generate results with the ignored rule excluded</a>
</p>
</div>
</div>
{{/ruleIgnored}}
{{#ruleUnignored}}
<div class="col-md-12 clearfix" data-test="alert">
<div class="alert alert-success">
<button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button>
<strong>Rule unignored!</strong>
<p>
You've removed an ignored accessibility rule for this URL.
<a href="{{task.hrefRun}}">Click here to generate results with the ignored rule included again</a>
</p>
</div>
</div>
{{/ruleUnignored}}
{{> task-header}} {{> task-header}}
{{#if results}} {{#if results}}
@@ -34,8 +76,6 @@
{{> graph}} {{> graph}}
{{/unless}} {{/unless}}
{{> result-selector}}
{{/if}} {{/if}}
{{#if mainResult}} {{#if mainResult}}