forked from external-repos/pa11y-dashboard
Compare commits
5 Commits
4.2.0
...
dependabot
Author | SHA1 | Date | |
---|---|---|---|
![]() |
ee6c79f70a | ||
![]() |
e55cae4786 | ||
![]() |
5202f59008 | ||
![]() |
b9b049ec2b | ||
![]() |
0e7849dd07 |
20
.github/issue_template.md
vendored
Normal file
20
.github/issue_template.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
**This repository's issues are reserved for feature requests, bug reports, and other issues with Pa11y Dashboard itself.**
|
||||
|
||||
If you need help using Pa11y Dashboard, we recommend using [Stack Overflow](https://stackoverflow.com/questions/tagged/pa11y).
|
||||
|
||||
For a bug report, please use the template below. To keep the backlog clean and actionable, issues may be immediately closed if they do not follow one this template.
|
||||
|
||||
---
|
||||
|
||||
## Expected behaviour
|
||||
|
||||
|
||||
## Actual behaviour
|
||||
|
||||
|
||||
## Steps to reproduce
|
||||
|
||||
|
||||
## Environment
|
||||
|
||||
_Please specify the versions of Pa11y Dashboard, MongoDB, and Node.js that can be sued to reproduce this issue._
|
11
.github/workflows/tests.yml
vendored
11
.github/workflows/tests.yml
vendored
@@ -1,19 +1,14 @@
|
||||
# This workflow will do a clean install of node dependencies, build the source code and run tests.
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||
|
||||
name: Build and lint
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: # Run actions when code is committed to these branches
|
||||
- master
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
branches: # Run actions when a PR is pushed based on one of these branches
|
||||
- master
|
||||
|
||||
jobs:
|
||||
checkout_and_test:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
|
@@ -805,7 +805,7 @@ function getStandards() {
|
||||
description: 'This element\'s text is placed on a background image. Ensure the contrast ratio between the text and all covered parts of the image are at least 4.5:1.'
|
||||
},
|
||||
{
|
||||
name: 'WCAG2AA.Principle1.Guideline1_4.1_4_3.G145 ',
|
||||
name: 'WCAG2AA.Principle1.Guideline1_4.1_4_3.G1451',
|
||||
description: 'This element\'s text is placed on a background image. Ensure the contrast ratio between the text and all covered parts of the image are at least 3:1.'
|
||||
},
|
||||
{
|
||||
@@ -1430,11 +1430,11 @@ function getStandards() {
|
||||
description: 'This element has insufficient contrast at this conformance level. Expected a contrast ratio of at least 4.5:1, but text in this element has a contrast ratio of /{value/}. Recommendation: /{colour recommendations/}.'
|
||||
},
|
||||
{
|
||||
name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_6.G17 ',
|
||||
name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_6.G17-1',
|
||||
description: 'This element\'s text is placed on a background image. Ensure the contrast ratio between the text and all covered parts of the image are at least 7:1.'
|
||||
},
|
||||
{
|
||||
name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_6.G18 ',
|
||||
name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_6.G18-1',
|
||||
description: 'This element\'s text is placed on a background image. Ensure the contrast ratio between the text and all covered parts of the image are at least 4.5:1.'
|
||||
},
|
||||
{
|
||||
|
10
index.js
10
index.js
@@ -33,8 +33,8 @@ require('./app')(config, (error, app) => {
|
||||
console.log(kleur.grey('mode: %s'), process.env.NODE_ENV);
|
||||
console.log(kleur.grey('uri: %s'), app.address);
|
||||
|
||||
app.on('route-error', error => {
|
||||
const stack = (error.stack ? error.stack.split('\n') : [error.message]);
|
||||
app.on('route-error', routeError => {
|
||||
const stack = (routeError.stack ? routeError.stack.split('\n') : [routeError.message]);
|
||||
const msg = kleur.red(stack.shift());
|
||||
console.error('');
|
||||
console.error(msg);
|
||||
@@ -43,9 +43,9 @@ require('./app')(config, (error, app) => {
|
||||
|
||||
// Start the webservice if required
|
||||
if (typeof config.webservice === 'object') {
|
||||
require('pa11y-webservice')(config.webservice, (error, webservice) => {
|
||||
if (error) {
|
||||
console.error(error.stack);
|
||||
require('pa11y-webservice')(config.webservice, (webserviceError, webservice) => {
|
||||
if (webserviceError) {
|
||||
console.error(webserviceError.stack);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
|
8438
package-lock.json
generated
Normal file
8438
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -42,7 +42,7 @@
|
||||
"cheerio": "^1.0.0-rc.10",
|
||||
"eslint": "^7.27.0",
|
||||
"less": "^3.11.1",
|
||||
"mocha": "^8.4.0",
|
||||
"mocha": "^10.2.0",
|
||||
"pa11y-lint-config": "^2.0.0",
|
||||
"proclaim": "^3.6.0",
|
||||
"request": "^2.88.2",
|
||||
|
2
public/css/site.min.css
vendored
2
public/css/site.min.css
vendored
File diff suppressed because one or more lines are too long
2
public/js/site.min.js
vendored
2
public/js/site.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -43,9 +43,9 @@
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-9" role="main">
|
||||
<main class="col-md-9" role="main">
|
||||
{{ content }}
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
2
public/js/vendor/bootstrap/js/tab.js
vendored
2
public/js/vendor/bootstrap/js/tab.js
vendored
@@ -68,10 +68,12 @@
|
||||
function next() {
|
||||
$active
|
||||
.removeClass('active')
|
||||
.attr('aria-selected', false)
|
||||
.find('> .dropdown-menu > .active')
|
||||
.removeClass('active')
|
||||
|
||||
element.addClass('active')
|
||||
element.attr('aria-selected', true)
|
||||
|
||||
if (transition) {
|
||||
element[0].offsetWidth // reflow for transition
|
||||
|
@@ -32,7 +32,7 @@ $(function () {
|
||||
$.support.transition = false
|
||||
|
||||
var alertHTML = '<div class="alert-message warning fade in">'
|
||||
+ '<a class="close" href="#" data-dismiss="alert">×</a>'
|
||||
+ '<a class="close" href="#" data-dismiss="alert" aria-label="Close">×</a>'
|
||||
+ '<p><strong>Holy guacamole!</strong> Best check yo self, you\'re not looking too good.</p>'
|
||||
+ '</div>'
|
||||
, alert = $(alertHTML).appendTo('#qunit-fixture').alert()
|
||||
|
@@ -95,6 +95,11 @@
|
||||
li a {
|
||||
text-indent: -20px;
|
||||
}
|
||||
ul.options-menu {
|
||||
list-style: none;
|
||||
padding: 5px 0;
|
||||
margin: 2px 10px 0 0;
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown-toggle {
|
||||
@@ -262,6 +267,7 @@
|
||||
}
|
||||
|
||||
/* Task details page*/
|
||||
|
||||
.task-header {
|
||||
margin-bottom: 30px;
|
||||
|
||||
@@ -502,6 +508,10 @@ ul.date-links {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
.dates-list > li:first-child a {
|
||||
font-weight: bold;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.dates-list a {
|
||||
color: #fff;
|
||||
@@ -709,6 +719,16 @@ ul.date-links {
|
||||
}
|
||||
}
|
||||
|
||||
/* Edit task page */
|
||||
|
||||
#skipRules {
|
||||
position: absolute;
|
||||
left: -999px;
|
||||
}
|
||||
#skipRules:focus {
|
||||
position: static;
|
||||
}
|
||||
|
||||
/* inline link list */
|
||||
|
||||
.inline-list {
|
||||
@@ -760,3 +780,7 @@ ul.date-links {
|
||||
opacity: 1;
|
||||
};
|
||||
}
|
||||
|
||||
section {
|
||||
margin: 1em 0;
|
||||
}
|
63
route/new.js
63
route/new.js
@@ -1,3 +1,4 @@
|
||||
/* eslint-disable complexity */
|
||||
// This file is part of Pa11y Dashboard.
|
||||
//
|
||||
// Pa11y Dashboard is free software: you can redistribute it and/or modify
|
||||
@@ -30,42 +31,21 @@ function route(app) {
|
||||
return standard;
|
||||
});
|
||||
response.render('new', {
|
||||
standards: standards,
|
||||
standards,
|
||||
isNewTaskPage: true
|
||||
});
|
||||
});
|
||||
|
||||
app.express.post('/new', (request, response) => {
|
||||
|
||||
let parsedActions;
|
||||
if (request.body.actions) {
|
||||
parsedActions = request.body.actions.split(/[\r\n]+/)
|
||||
.map(action => {
|
||||
return action.trim();
|
||||
})
|
||||
.filter(action => {
|
||||
return Boolean(action);
|
||||
});
|
||||
}
|
||||
|
||||
const parsedActions = parseActions(request.body.actions);
|
||||
let parsedHeaders;
|
||||
|
||||
if (request.body.headers) {
|
||||
parsedHeaders = httpHeaders(request.body.headers, true);
|
||||
}
|
||||
|
||||
const newTask = {
|
||||
name: request.body.name,
|
||||
url: request.body.url,
|
||||
standard: request.body.standard,
|
||||
ignore: request.body.ignore || [],
|
||||
timeout: request.body.timeout || undefined,
|
||||
wait: request.body.wait || undefined,
|
||||
actions: parsedActions,
|
||||
username: request.body.username || undefined,
|
||||
password: request.body.password || undefined,
|
||||
headers: parsedHeaders,
|
||||
hideElements: request.body.hideElements || undefined
|
||||
};
|
||||
const newTask = createNewTask(request, parsedActions, parsedHeaders);
|
||||
|
||||
app.webservice.tasks.create(newTask, (error, task) => {
|
||||
if (error) {
|
||||
@@ -84,8 +64,8 @@ function route(app) {
|
||||
newTask.actions = request.body.actions;
|
||||
newTask.headers = request.body.headers;
|
||||
return response.render('new', {
|
||||
error: error,
|
||||
standards: standards,
|
||||
error,
|
||||
standards,
|
||||
task: newTask
|
||||
});
|
||||
}
|
||||
@@ -94,3 +74,32 @@ function route(app) {
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function parseActions(actions) {
|
||||
if (actions) {
|
||||
return actions.split(/[\r\n]+/)
|
||||
.map(action => {
|
||||
return action.trim();
|
||||
})
|
||||
.filter(action => {
|
||||
return Boolean(action);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/* eslint-disable complexity */
|
||||
function createNewTask(request, actions, headers) {
|
||||
return {
|
||||
name: request.body.name,
|
||||
url: request.body.url,
|
||||
standard: request.body.standard,
|
||||
ignore: request.body.ignore || [],
|
||||
timeout: request.body.timeout || undefined,
|
||||
wait: request.body.wait || undefined,
|
||||
actions,
|
||||
username: request.body.username || undefined,
|
||||
password: request.body.password || undefined,
|
||||
headers,
|
||||
hideElements: request.body.hideElements || undefined
|
||||
};
|
||||
}
|
||||
|
@@ -29,8 +29,8 @@ function route(app) {
|
||||
app.webservice
|
||||
.task(request.params.id)
|
||||
.result(request.params.rid)
|
||||
.get({full: true}, (error, result) => {
|
||||
if (error) {
|
||||
.get({full: true}, (webserviceError, result) => {
|
||||
if (webserviceError) {
|
||||
return next('route');
|
||||
}
|
||||
response.locals.task = task;
|
||||
|
@@ -30,8 +30,8 @@ function route(app) {
|
||||
app.webservice
|
||||
.task(request.params.id)
|
||||
.result(request.params.rid)
|
||||
.get({full: true}, (error, result) => {
|
||||
if (error) {
|
||||
.get({full: true}, (webserviceError, result) => {
|
||||
if (webserviceError) {
|
||||
return next();
|
||||
}
|
||||
response.render('result', {
|
||||
|
@@ -43,13 +43,15 @@ function route(app) {
|
||||
task.actions = (task.actions ? task.actions.join('\n') : '');
|
||||
response.render('task/edit', {
|
||||
edited: (typeof request.query.edited !== 'undefined'),
|
||||
standards: standards,
|
||||
standards,
|
||||
task: presentTask(task),
|
||||
isTaskSubPage: true
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
/* eslint-disable complexity */
|
||||
/* eslint-disable max-statements */
|
||||
app.express.post('/:id/edit', (request, response, next) => {
|
||||
app.webservice.task(request.params.id).get({}, (error, task) => {
|
||||
if (error) {
|
||||
@@ -57,9 +59,11 @@ function route(app) {
|
||||
}
|
||||
const originalActions = request.body.actions;
|
||||
const originalHeaders = request.body.headers;
|
||||
|
||||
request.body.ignore = request.body.ignore || [];
|
||||
request.body.timeout = request.body.timeout || undefined;
|
||||
request.body.wait = request.body.wait || undefined;
|
||||
|
||||
if (request.body.actions) {
|
||||
request.body.actions = request.body.actions.split(/[\r\n]+/)
|
||||
.map(action => {
|
||||
@@ -69,15 +73,18 @@ function route(app) {
|
||||
return Boolean(action);
|
||||
});
|
||||
}
|
||||
|
||||
if (!request.body.actions) {
|
||||
request.body.actions = [];
|
||||
}
|
||||
|
||||
request.body.username = request.body.username || undefined;
|
||||
request.body.password = request.body.password || undefined;
|
||||
request.body.hideElements = request.body.hideElements || undefined;
|
||||
request.body.headers = httpHeaders(request.body.headers || '', true);
|
||||
app.webservice.task(request.params.id).edit(request.body, error => {
|
||||
if (error) {
|
||||
|
||||
app.webservice.task(request.params.id).edit(request.body, webserviceError => {
|
||||
if (webserviceError) {
|
||||
task.name = request.body.name;
|
||||
task.ignore = request.body.ignore;
|
||||
task.timeout = request.body.timeout;
|
||||
@@ -100,9 +107,9 @@ function route(app) {
|
||||
return standard;
|
||||
});
|
||||
return response.render('task/edit', {
|
||||
error: error,
|
||||
standards: standards,
|
||||
task: task,
|
||||
webserviceError,
|
||||
standards,
|
||||
task,
|
||||
isTaskSubPage: true
|
||||
});
|
||||
}
|
||||
|
@@ -28,9 +28,9 @@ function route(app) {
|
||||
if (error) {
|
||||
return next();
|
||||
}
|
||||
app.webservice.task(request.params.id).results({}, (error, results) => {
|
||||
if (error) {
|
||||
return next(error);
|
||||
app.webservice.task(request.params.id).results({}, (webserviceError, results) => {
|
||||
if (webserviceError) {
|
||||
return next(webserviceError);
|
||||
}
|
||||
const presentedResults = presentResultList(results.map(presentResult));
|
||||
response.render('task', {
|
||||
|
@@ -47,19 +47,17 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
{{> breadcrumb}}
|
||||
|
||||
<div class="container">
|
||||
<main class="container" >
|
||||
{{#if readonly}}
|
||||
<div class="row readonly-mode">
|
||||
{{else}}
|
||||
<div class="row">
|
||||
{{/if}}
|
||||
<section>
|
||||
<div class="section" role="main">
|
||||
{{{body}}}
|
||||
</div>
|
||||
</section>
|
||||
<div class="section">
|
||||
{{{body}}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
{{> page-footer}}
|
||||
|
||||
|
@@ -78,8 +78,8 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
<div class="row">
|
||||
<div class="col-md-4 col-sm-4 col-xs-6">
|
||||
<label class="control-label" for="new-task-wait">Wait (milliseconds)</label>
|
||||
<input class="form-control" id="new-task-wait" type="text" placeholder="E.g. 3000" name="wait" value="{{task.wait}}"/>
|
||||
<em>(Note: default wait time is 0ms)</em>
|
||||
<input class="form-control" id="new-task-wait" type="text" placeholder="E.g. 3000" name="wait" value="{{task.wait}}" aria-describedby="int3"/>
|
||||
<em id="int3">(Note: default wait time is 0ms)</em>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -110,7 +110,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
<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>
|
||||
<input class="form-control" id="new-task-password" type="text" name="password" value="{{task.password}}" aria-describedby="pwd"/> <span id="pwd"><em>(Note: this will be stored and displayed in plain-text - only suitable for use in a secure environment)</em></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -119,8 +119,8 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
<div class="row">
|
||||
<div class="col-md-4 col-sm-4 col-xs-6">
|
||||
<label class="control-label" for="new-task-headers">HTTP Headers</label>
|
||||
<textarea class="form-control" id="new-task-headers" name="headers" placeholder="Cookie: foo=bar">{{task.headers}}</textarea>
|
||||
<em>(As key/value pairs, separated by newlines/colons)</em>
|
||||
<textarea class="form-control" id="new-task-headers" name="headers" placeholder="Cookie: foo=bar" aria-describedby="int1">{{task.headers}}</textarea>
|
||||
<em id="int1">(As key/value pairs, separated by newlines/colons)</em>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -129,7 +129,8 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
<div class="row">
|
||||
<div class="col-md-4 col-sm-4 col-xs-6">
|
||||
<label class="control-label" for="new-task-hide-elements">Hide Elements</label>
|
||||
<input class="form-control" id="new-task-hide-elements" type="text" name="hideElements" value="{{task.hideElements}}" placeholder=".advert, #modal, div[aria-role=presentation]"/> <em>(CSS selector)</em>
|
||||
<input class="form-control" id="new-task-hide-elements" type="text" name="hideElements" value="{{task.hideElements}}" placeholder=".advert, #modal, div[aria-role=presentation]" aria-describedby="int2"/>
|
||||
<em id="int2">(CSS selector)</em>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -15,16 +15,17 @@ 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}}
|
||||
<div class="container">
|
||||
<nav class="container" aria-labelledby="breadcrumb">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h2 id="breadcrumb" class="sr-only">Breadcrumb Navigation</h2>
|
||||
<ol class="breadcrumb">
|
||||
<li><a href="/">Dashboard</a></li>
|
||||
{{#if isNewTaskPage}}
|
||||
<li class="active">Add URL</li>
|
||||
{{/if}}
|
||||
{{#if isTaskPage}}
|
||||
<li class="active">{{task.name}}</li>
|
||||
<li class="active">{{task.name}}</li>
|
||||
{{/if}}
|
||||
{{#if isTaskSubPage}}
|
||||
<li><a href="{{task.href}}">{{task.name}}</a></li>
|
||||
@@ -36,5 +37,5 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
{{/unless}}
|
@@ -18,9 +18,8 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
<div class="graph-container graph-spacer ruled clearfix">
|
||||
<div class="row">
|
||||
<div class="col-md-3 col-sm-4 col-xs-3">
|
||||
<span class="btn btn-sm btn-default btn-full-width btn_action_export">Export graph</span>
|
||||
<button class="btn btn-sm btn-default btn-full-width btn_action_export" type="button">Export graph</button>
|
||||
</div>
|
||||
|
||||
<div class="col-md-5 col-sm-6 col-xs-9 pull-right">
|
||||
<ul class="list-unstyled floated-list series-checkboxes clearfix" data-role="series-checkboxes"></ul>
|
||||
</div>
|
||||
@@ -28,62 +27,63 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
<div data-role="graph" class="graph"></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>
|
||||
<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>
|
||||
<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>
|
||||
|
||||
<div class="col-md-12 hidden">
|
||||
<div class="graph-spacer ruled">
|
||||
<table id="graph-data" class="table graph-table" summary="Accessibility results from Pa11y for this page">
|
||||
<caption>Pa11y results for this URL</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Date</th>
|
||||
<th class="text-center">Errors</th>
|
||||
<th class="text-center">Warnings</th>
|
||||
<th class="text-center">Notices</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#results}}
|
||||
<tr data-role="url-stats">
|
||||
<td data-value="{{date-timestamp date}}" data-role="date">{{date-format date format="DD MMM YYYY"}}</td>
|
||||
<td class="text-center" data-label="error">{{count.error}}</td>
|
||||
<td class="text-center" data-label="warning">{{count.warning}}</td>
|
||||
<td class="text-center" data-label="notice">{{count.notice}}</td>
|
||||
</tr>
|
||||
{{/results}}
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="col-md-12 hidden">
|
||||
<div class="graph-spacer ruled">
|
||||
<table id="graph-data" class="table graph-table" summary="Accessibility results from Pa11y for this page">
|
||||
<caption>Pa11y results for this URL</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Date</th>
|
||||
<th class="text-center">Errors</th>
|
||||
<th class="text-center">Warnings</th>
|
||||
<th class="text-center">Notices</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{#results}}
|
||||
<tr data-role="url-stats">
|
||||
<td data-value="{{date-timestamp date}}" data-role="date">{{date-format date format="DD MMM YYYY"}}</td>
|
||||
<td class="text-center" data-label="error">{{count.error}}</td>
|
||||
<td class="text-center" data-label="warning">{{count.warning}}</td>
|
||||
<td class="text-center" data-label="notice">{{count.notice}}</td>
|
||||
</tr>
|
||||
{{/results}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
@@ -32,15 +32,14 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row date-selector-row">
|
||||
<div id="top" class="col-md-12 col-sm-12 clearfix">
|
||||
<div 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" aria-hidden="true"></span> {{date-format task.lastResult.date format="DD MMM YYYY"}}
|
||||
</h2>
|
||||
<h3 class="h5 show-stats" id="dates-navigation">Select a date to show stats for:</h3>
|
||||
|
||||
<h2 class="h3" id="dates-navigation">Select a date to show stats for: <span class="glyphicon glyphicon-calendar"></span></h2>
|
||||
<nav aria-labelledby="dates-navigation">
|
||||
<ul class="dates-list">
|
||||
{{#results}}
|
||||
@@ -56,31 +55,32 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
<div class="row">
|
||||
<div class="col-md-12 col-sm-12 clearfix">
|
||||
<div class="well">
|
||||
<h4 class="crunch-top">View results in browser</h4>
|
||||
<h2 class="crunch-top h3">View results in browser</h2>
|
||||
<p class="crunch-bottom">Pa11y uses HTML_CodeSniffer to find accessibility issues. <a href="http://squizlabs.github.io/HTML_CodeSniffer/">Use their bookmarklet</a> to view results on the page you are testing.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-9">
|
||||
<ul class="nav nav-tabs category-list" role="tablist">
|
||||
<li class="category-list__item category-list__item_type_error active" role="presentation">
|
||||
<section class="col-md-9" id="top">
|
||||
<h2 id="tabSectionHeading" class="crunch-top">Results</h2>
|
||||
<ul class="nav nav-tabs category-list" aria-labelledby="tabSectionHeading" role="tablist">
|
||||
<li class="category-list__item category-list__item_type_error active" aria-selected="true" role="presentation">
|
||||
<a class="category-list__link" id="errors" href="#errors-list" aria-controls="errors-list" role="tab" data-toggle="tab" data-test="task-errors">
|
||||
Errors ( {{mainResult.count.error}} )
|
||||
</a>
|
||||
</li>
|
||||
<li class="category-list__item category-list__item_type_warning" role="presentation">
|
||||
<li class="category-list__item category-list__item_type_warning" aria-selected="false" role="presentation">
|
||||
<a class="category-list__link" id="warnings" href="#warnings-list" aria-controls="warnings-list" role="tab" data-toggle="tab" data-test="task-warnings">
|
||||
Warnings ( {{mainResult.count.warning}} )
|
||||
</a>
|
||||
</li>
|
||||
<li class="category-list__item category-list__item_type_notice" role="presentation">
|
||||
<li class="category-list__item category-list__item_type_notice" aria-selected="false" role="presentation">
|
||||
<a class="category-list__link" id="notices" href="#notices-list" aria-controls="notices-list" role="tab" data-toggle="tab" data-test="task-notices">
|
||||
Notices ( {{mainResult.count.notice}} )
|
||||
</a>
|
||||
</li>
|
||||
<li class="category-list__item category-list__item_type_ignore" role="presentation">
|
||||
<li class="category-list__item category-list__item_type_ignore" aria-selected="false" role="presentation">
|
||||
<a class="category-list__link" id="ignore" href="#ignore-list" aria-controls="ignore-list" role="tab" data-toggle="tab">
|
||||
Ignored rules ( {{mainResult.ignore.length}} )
|
||||
</a>
|
||||
@@ -88,7 +88,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
<div id="errors-list" role="tabpanel" class="tab-pane tasks-list fade in active">
|
||||
<div id="errors-list" role="tabpanel" class="tab-pane tasks-list fade in active" aria-labelledby="errors">
|
||||
{{#if mainResult.count.error}}
|
||||
{{#mainResult.errors}}
|
||||
<div class="panel panel-default task task_type_error">
|
||||
@@ -147,14 +147,14 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
{{/mainResult.errors}}
|
||||
<div class="to-top">
|
||||
<a class="link" href="#top" data-role="top"><span class="glyphicon glyphicon-chevron-up" aria-hidden="true"></span>Back to top</a>
|
||||
<a class="link" href="#top"><span class="glyphicon glyphicon-chevron-up" aria-hidden="true"></span>Back to top</a>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="text">Well done! You have 0 errors. <span class="glyphicon glyphicon-ok pull-right" aria-hidden="true"></span></div>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
<div id="warnings-list" role="tabpanel" class="tab-pane tasks-list fade">
|
||||
<div id="warnings-list" role="tabpanel" class="tab-pane tasks-list fade" aria-labelledby="warning">
|
||||
{{#if mainResult.count.warning}}
|
||||
{{#mainResult.warnings}}
|
||||
<div class="panel panel-default task task_type_warning">
|
||||
@@ -213,14 +213,14 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
{{/mainResult.warnings}}
|
||||
<div class="to-top">
|
||||
<a class="link" href="#top" data-role="top"><span class="glyphicon glyphicon-chevron-up" aria-hidden="true"></span>Back to top</a>
|
||||
<a class="link" href="#top"><span class="glyphicon glyphicon-chevron-up" aria-hidden="true"></span>Back to top</a>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="text">Well done! You have 0 warnings. <span class="glyphicon glyphicon-ok pull-right" aria-hidden="true"></span></div>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
<div id="notices-list" role="tabpanel" class="tab-pane tasks-list fade">
|
||||
<div id="notices-list" role="tabpanel" class="tab-pane tasks-list fade" aria-labelledby="notices">
|
||||
{{#if mainResult.count.notice}}
|
||||
{{#mainResult.notices}}
|
||||
<div class="panel panel-default task task_type_notice">
|
||||
@@ -279,14 +279,14 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
{{/mainResult.notices}}
|
||||
<div class="to-top">
|
||||
<a class="link" href="#top" data-role="top"><span class="glyphicon glyphicon-chevron-up" aria-hidden="true"></span>Back to top</a>
|
||||
<a class="link" href="#top"><span class="glyphicon glyphicon-chevron-up" aria-hidden="true"></span>Back to top</a>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="text">Well done! You have 0 notices. <span class="glyphicon glyphicon-ok pull-right" aria-hidden="true"></span></div>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
<div id="ignore-list" role="tabpanel" class="tab-pane tasks-list fade">
|
||||
<div id="ignore-list" role="tabpanel" class="tab-pane tasks-list fade" aria-labelledby="ignore">
|
||||
{{#if mainResult.ignore.length}}
|
||||
{{#mainResult.ignore}}
|
||||
<div class="panel panel-default task task_type_ignore">
|
||||
@@ -316,11 +316,11 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
{{/mainResult.ignore}}
|
||||
<div class="to-top">
|
||||
<a class="link" href="#top" data-role="top"><span class="glyphicon glyphicon-chevron-up" aria-hidden="true"></span>Back to top</a>
|
||||
<a class="link" href="#top"><span class="glyphicon glyphicon-chevron-up" aria-hidden="true"></span>Back to top</a>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="text">You have no ignored rules.</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
@@ -14,7 +14,7 @@ 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">
|
||||
<section class="col-md-12 zfix">
|
||||
<div class="ruled task-header">
|
||||
<div class="row clearfix">
|
||||
<div class="col-md-12">
|
||||
@@ -41,4 +41,4 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
@@ -25,7 +25,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
<li class="col-md-4 col-sm-6 task-card add-task">
|
||||
<a class="well task-card-link crunch-bottom" data-role="add-task" href="/new" data-test="add-task">
|
||||
<p class="h3 crunch">Add new URL</p>
|
||||
<p class="supersize-me crunch">+</p>
|
||||
<p class="supersize-me crunch" aria-hidden="true">+</p>
|
||||
</a>
|
||||
</li>
|
||||
{{/unless}}
|
||||
@@ -56,8 +56,8 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
{{#unless ../readonly}}
|
||||
<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>
|
||||
<nav aria-label="task tools">
|
||||
<ul class="dropdown-menu pull-right">
|
||||
<nav class="dropdown-menu pull-right" aria-label="task tools">
|
||||
<ul class="options-menu">
|
||||
<li><a href="{{href}}/edit">Edit this task</a></li>
|
||||
<li><a href="{{href}}/delete">Delete this task</a></li>
|
||||
<li class="divider"></li>
|
||||
|
@@ -22,7 +22,7 @@ module.exports = presentIgnoreRules;
|
||||
function presentIgnoreRules(ignore) {
|
||||
return ignore.map(name => {
|
||||
return {
|
||||
name: name,
|
||||
name,
|
||||
description: rules[name]
|
||||
};
|
||||
});
|
||||
|
@@ -16,7 +16,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
}}
|
||||
|
||||
{{#content "title"}}
|
||||
{{task.name}} - {{simplify-url task.url}} ({{task.standard}}) - {{date-format mainResult.date format="DD MMM YYYY"}}
|
||||
Pa11y Dashboard Results - {{task.name}} - {{date-format mainResult.date format="DD MMM YYYY"}}
|
||||
{{/content}}
|
||||
|
||||
{{> result-header}}
|
||||
|
@@ -22,7 +22,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
{{#edited}}
|
||||
<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>
|
||||
<button aria-hidden="true" data-dismiss="alert" class="close" type="button" aria-label="Close">×</button>
|
||||
<strong>Success!</strong>
|
||||
<p>Your changes have been saved.</p>
|
||||
</div>
|
||||
@@ -146,7 +146,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="control-label"><b>Ignore these rules</b> <a target="_blank" href="https://github.com/pa11y/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/pa11y/pa11y/wiki/HTML-CodeSniffer-Rules">full list of rules here</a>) <a href="#submitEditBtn" id="skipRules">Skip list of rules</a></p>
|
||||
|
||||
<div class="standards-lists">
|
||||
{{#standards}}
|
||||
@@ -166,7 +166,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
{{/standards}}
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-success">Save changes <span class="glyphicon glyphicon-save"></span></button>
|
||||
<button type="submit" id="submitEditBtn" class="btn btn-success">Save changes <span class="glyphicon glyphicon-save"></span></button>
|
||||
<a href="/{{task.id}}/edit" class="btn btn-primary">Undo <span class="glyphicon glyphicon-refresh"></span></a>
|
||||
|
||||
</form>
|
||||
|
@@ -16,13 +16,13 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
}}
|
||||
|
||||
{{#content "title"}}
|
||||
{{task.name}} - {{simplify-url task.url}} ({{task.standard}})
|
||||
Pa11y Dashboard Results for {{task.name}} - ({{task.standard}})
|
||||
{{/content}}
|
||||
|
||||
{{#added}}
|
||||
<div class="col-md-12 clearfix" data-test="alert">
|
||||
<div class="alert alert-success">
|
||||
<button data-dismiss="alert" class="close" type="button">×</button>
|
||||
<button data-dismiss="alert" class="close" type="button" aria-label="Close">×</button>
|
||||
<strong>Whoop whoop!</strong>
|
||||
<p>Your new URL has been added.</p>
|
||||
</div>
|
||||
@@ -32,7 +32,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
{{#running}}
|
||||
<div class="col-md-12 clearfix" data-test="alert">
|
||||
<div class="alert alert-success">
|
||||
<button data-dismiss="alert" class="close" type="button">×</button>
|
||||
<button data-dismiss="alert" class="close" type="button" aria-label="Close">×</button>
|
||||
<strong>New results incoming!</strong>
|
||||
<p>
|
||||
New results are being generated for this URL in the background.
|
||||
@@ -45,7 +45,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
{{#ruleIgnored}}
|
||||
<div class="col-md-12 clearfix" data-test="alert">
|
||||
<div class="alert alert-success">
|
||||
<button data-dismiss="alert" class="close" type="button">×</button>
|
||||
<button data-dismiss="alert" class="close" type="button" aria-label="Close">×</button>
|
||||
<strong>Rule ignored!</strong>
|
||||
<p>
|
||||
You've ignored an accessibility rule for this URL.
|
||||
@@ -58,7 +58,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
|
||||
{{#ruleUnignored}}
|
||||
<div class="col-md-12 clearfix" data-test="alert">
|
||||
<div class="alert alert-success">
|
||||
<button data-dismiss="alert" class="close" type="button">×</button>
|
||||
<button data-dismiss="alert" class="close" type="button" aria-label="Close">×</button>
|
||||
<strong>Rule unignored!</strong>
|
||||
<p>
|
||||
You've removed an ignored accessibility rule for this URL.
|
||||
|
Reference in New Issue
Block a user