Compare commits

...

15 Commits
2.1.0 ... 2.2.1

Author SHA1 Message Date
Rowan Manning
f7c3b5e99a Version 2.2.1 2017-02-07 13:21:23 +00:00
Rowan Manning
2ec9139ab0 Fix task editing when no actions are specified (#178) 2017-02-07 13:20:36 +00:00
Rowan Manning
ce9219c01e Version 2.2.0 2017-01-27 11:14:26 +00:00
Rowan Manning
28a0a861f3 Add support for Pa11y actions (#176) 2017-01-27 10:58:48 +00:00
Rowan Manning
acba762a66 Update missed copyright reference (#174) 2017-01-19 13:45:25 +00:00
Rowan Manning
9b80bfa6ab Update the copyright notice and author (#173) 2017-01-19 13:32:17 +00:00
Jose Bolos
926cb5af3b Change support details for v1 of dashboard (#172) 2017-01-18 14:46:30 +00:00
Hollie Kay
503ed16265 Remove phantom reference (#170) 2017-01-10 11:36:19 +00:00
Rowan Manning
6d0c6e821b Version 2.1.2 2016-12-12 11:49:01 +00:00
Usman Iqbal
cc5b3f19e5 Remove Add new URL button when readonly is true (#166) 2016-12-12 11:47:04 +00:00
Rowan Manning
11e64e27c4 Add a contributing guide (#163) 2016-12-01 15:04:30 +00:00
Rowan Manning
ff4a9fa7b0 Use two spaces in package.json (#162) 2016-11-25 13:25:47 +00:00
Rowan Manning
5bc32fc68e Version 2.1.1 2016-11-20 18:56:21 +00:00
Frank van Gemeren
c2fbcf4fa1 Use arrows instead of plus and minus for collapsibles/expanders (#153) 2016-11-19 00:18:24 +00:00
Una Kravets
f60d1ca0ce more detailed 500 message (#159) 2016-11-19 00:17:34 +00:00
16 changed files with 196 additions and 88 deletions

View File

@@ -1,6 +1,26 @@
# Changelog # Changelog
## 2.2.1 (2017-02-07)
* Fix task editing when no actions are specified
## 2.2.0 (2017-01-27)
* Add support for Pa11y actions
* Update dependencies
* pa11y-webservice: ~2.1.2 to ^2.3.0
## 2.1.2 (2016-12-12)
* Hide the "add" button in readonly mode
* Add a contributing guide
## 2.1.1 (2016-11-20)
* Use arrows instead of plus and minus for collapsibles/expanders
* Supply more detailed 500 messages
## 2.1.0 (2016-11-07) ## 2.1.0 (2016-11-07)
* Allow for configuration files to be JavaScript rather than JSON * Allow for configuration files to be JavaScript rather than JSON

21
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,21 @@
Contributing Guide
==================
Thanks for getting involved :tada:
The Pa11y team loves to see new contributors, and we strive to provide a welcoming and inclusive environment. We ask that all contributors read and follow [our code of conduct][code-of-conduct] before joining. If you represent an organisation, then you might find our [guide for companies][companies] helpful.
Our website outlines the many ways that you can contribute to Pa11y:
- [Help us to talk to our users][communications]
- [Help us out with design][designers]
- [Help us with our code][developers]
[code-of-conduct]: http://pa11y.org/contributing/code-of-conduct/
[communications]: http://pa11y.org/contributing/communications/
[companies]: http://pa11y.org/contributing/companies/
[designers]: http://pa11y.org/contributing/designers/
[developers]: http://pa11y.org/contributing/developers/

View File

@@ -22,7 +22,7 @@ Pa11y Dashboard is a web interface to the [Pa11y][pa11y] accessibility reporter;
Setup Setup
----- -----
Pa11y Dashboard requires [Node.js][node] 4+ and [PhantomJS][phantom]. See the [Pa11y][pa11y] documentation for detailed instructions on how to install these dependencies on your operating system. Pa11y Dashboard requires [Node.js][node] 4+. See the [Pa11y][pa11y] documentation for detailed instructions on how to install this on your operating system.
You'll also need to have [MongoDB][mongo] installed and running. See the [MongoDB install guide][mongo-install] for more information on this. You'll also need to have [MongoDB][mongo] installed and running. See the [MongoDB install guide][mongo-install] for more information on this.
@@ -82,10 +82,12 @@ The boot configurations for Pa11y Dashboard are as follows. Look at the sample J
This can either be an object containing [Pa11y Webservice configurations][pa11y-webservice-config], or a string which is the base URL of a [Pa11y Webservice][pa11y-webservice] instance you are running separately. If using environment variables, prefix the webservice vars with `WEBSERVICE_`. This can either be an object containing [Pa11y Webservice configurations][pa11y-webservice-config], or a string which is the base URL of a [Pa11y Webservice][pa11y-webservice] instance you are running separately. If using environment variables, prefix the webservice vars with `WEBSERVICE_`.
Development Contributing
----------- ------------
To develop Pa11y Dashboard, you'll need to clone the repo and get set up as outlined in the [setup guide](#setup). There are many ways to contribute to Pa11y Dashboard, we cover these in the [contributing guide](CONTRIBUTING.md) for this repo.
If you're ready to contribute some code, you'll need to clone the repo and get set up as outlined in the [setup guide](#setup).
You'll need to start the application in test mode with: You'll need to start the application in test mode with:
@@ -126,7 +128,7 @@ We also maintain a [migration guide](MIGRATION.md) to help you migrate.
| :grey_question: | Major Version | Last Minor Release | Node.js Versions | Support End Date | | :grey_question: | Major Version | Last Minor Release | Node.js Versions | Support End Date |
| :-------------- | :------------ | :----------------- | :--------------- | :--------------- | | :-------------- | :------------ | :----------------- | :--------------- | :--------------- |
| :heart: | 2 | N/A | 4+ | N/A | | :heart: | 2 | N/A | 4+ | N/A |
| :hourglass: | 1 | 1.12 | 0.106 | 2016-12-05 | | :skull: | 1 | 1.12 | 0.106 | 2016-12-05 |
If you're opening issues related to these, please mention the version that the issue relates to. If you're opening issues related to these, please mention the version that the issue relates to.
@@ -134,8 +136,8 @@ If you're opening issues related to these, please mention the version that the i
License License
------- -------
Pa11y Dashboard is licensed under the [GNU General Public License 3.0][info-license]. Pa11y Dashboard is licensed under the [GNU General Public License 3.0][info-license].<br/>
Copyright &copy; 20132016, Springer Nature Copyright &copy; 20132017, Team Pa11y
@@ -157,5 +159,5 @@ Copyright &copy; 20132016, Springer Nature
[info-build]: https://travis-ci.org/pa11y/dashboard [info-build]: https://travis-ci.org/pa11y/dashboard
[shield-license]: https://img.shields.io/badge/license-GPL%203.0-blue.svg [shield-license]: https://img.shields.io/badge/license-GPL%203.0-blue.svg
[shield-node]: https://img.shields.io/badge/node.js%20support-46-brightgreen.svg [shield-node]: https://img.shields.io/badge/node.js%20support-46-brightgreen.svg
[shield-version]: https://img.shields.io/badge/version-2.1.0-blue.svg [shield-version]: https://img.shields.io/badge/version-2.2.1-blue.svg
[shield-build]: https://img.shields.io/travis/pa11y/dashboard/master.svg [shield-build]: https://img.shields.io/travis/pa11y/dashboard/master.svg

View File

@@ -1,15 +1,18 @@
{ {
"name": "pa11y-dashboard", "name": "pa11y-dashboard",
"version": "2.1.0", "version": "2.2.1",
"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",
"keywords": [ "accessibility", "analysis", "report" ], "keywords": [
"accessibility",
"analysis",
"report"
],
"author": "Team Pa11y",
"contributors": [ "contributors": [
"Perry Harlock (http://www.phwebs.co.uk/)", "Perry Harlock (http://www.phwebs.co.uk/)",
"Rowan Manning (http://rowanmanning.com/)" "Rowan Manning (http://rowanmanning.com/)"
], ],
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/pa11y/dashboard.git" "url": "https://github.com/pa11y/dashboard.git"
@@ -17,7 +20,6 @@
"homepage": "https://github.com/pa11y/dashboard", "homepage": "https://github.com/pa11y/dashboard",
"bugs": "https://github.com/pa11y/dashboard/issues", "bugs": "https://github.com/pa11y/dashboard/issues",
"license": "GPL-3.0", "license": "GPL-3.0",
"engines": { "engines": {
"node": ">=4" "node": ">=4"
}, },
@@ -29,7 +31,7 @@
"express-hbs": "~1.0", "express-hbs": "~1.0",
"http-headers": "^3.0.1", "http-headers": "^3.0.1",
"moment": "~2.13", "moment": "~2.13",
"pa11y-webservice": "^2.1.2", "pa11y-webservice": "^2.3.0",
"pa11y-webservice-client-node": "^1.2.1", "pa11y-webservice-client-node": "^1.2.1",
"underscore": "~1.8" "underscore": "~1.8"
}, },
@@ -44,7 +46,6 @@
"request": "^2.74", "request": "^2.74",
"uglify-js": "~2.6" "uglify-js": "~2.6"
}, },
"scripts": { "scripts": {
"start": "node index.js", "start": "node index.js",
"test": "make ci" "test": "make ci"

View File

@@ -77,11 +77,11 @@ $(document).ready(function(){
expandLink.click( function(){ expandLink.click( function(){
$(this).next().slideToggle('slow', function(){}); $(this).next().slideToggle('slow', function(){});
if ($(this).hasClass('showing')) { if ($(this).hasClass('showing')) {
$(this).find('span.expander').html('+'); $(this).find('span.expander').html('');
$(this).attr('aria-expanded', false); $(this).attr('aria-expanded', false);
} }
else { else {
$(this).find('span.expander').html('-'); $(this).find('span.expander').html('');
$(this).attr('aria-expanded', true); $(this).attr('aria-expanded', true);
} }
$(this).toggleClass('showing'); $(this).toggleClass('showing');

File diff suppressed because one or more lines are too long

View File

@@ -40,11 +40,21 @@ function route(app) {
app.express.post('/new', (req, res) => { app.express.post('/new', (req, res) => {
let parsedActions;
if (req.body.actions) {
parsedActions = req.body.actions.split(/[\r\n]+/)
.map(action => {
return action.trim();
})
.filter(action => {
return Boolean(action);
});
}
let parsedHeaders; let parsedHeaders;
if (req.body.headers) { if (req.body.headers) {
parsedHeaders = httpHeaders(req.body.headers, true); parsedHeaders = httpHeaders(req.body.headers, true);
} }
console.log(parsedHeaders);
const newTask = { const newTask = {
name: req.body.name, name: req.body.name,
@@ -53,6 +63,7 @@ function route(app) {
ignore: req.body.ignore || [], ignore: req.body.ignore || [],
timeout: req.body.timeout || undefined, timeout: req.body.timeout || undefined,
wait: req.body.wait || undefined, wait: req.body.wait || undefined,
actions: parsedActions,
username: req.body.username || undefined, username: req.body.username || undefined,
password: req.body.password || undefined, password: req.body.password || undefined,
headers: parsedHeaders, headers: parsedHeaders,
@@ -73,6 +84,8 @@ function route(app) {
}); });
return standard; return standard;
}); });
newTask.actions = req.body.actions;
newTask.headers = req.body.headers;
return res.render('new', { return res.render('new', {
error: err, error: err,
standards: standards, standards: standards,

View File

@@ -13,7 +13,7 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>. // along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
/*jshint maxcomplexity:10*/ /*jshint maxcomplexity:12*/
'use strict'; 'use strict';
@@ -43,6 +43,7 @@ function route(app) {
}); });
return standard; return standard;
}); });
task.actions = (task.actions ? task.actions.join('\n') : '');
res.render('task/edit', { res.render('task/edit', {
edited: (typeof req.query.edited !== 'undefined'), edited: (typeof req.query.edited !== 'undefined'),
standards: standards, standards: standards,
@@ -57,10 +58,23 @@ function route(app) {
if (err) { if (err) {
return next(); return next();
} }
const originalActions = req.body.actions;
const originalHeaders = req.body.headers; const originalHeaders = req.body.headers;
req.body.ignore = req.body.ignore || []; req.body.ignore = req.body.ignore || [];
req.body.timeout = req.body.timeout || undefined; req.body.timeout = req.body.timeout || undefined;
req.body.wait = req.body.wait || undefined; req.body.wait = req.body.wait || undefined;
if (req.body.actions) {
req.body.actions = req.body.actions.split(/[\r\n]+/)
.map(action => {
return action.trim();
})
.filter(action => {
return Boolean(action);
});
}
if (!req.body.actions) {
req.body.actions = [];
}
req.body.username = req.body.username || undefined; req.body.username = req.body.username || undefined;
req.body.password = req.body.password || undefined; req.body.password = req.body.password || undefined;
req.body.hideElements = req.body.hideElements || undefined; req.body.hideElements = req.body.hideElements || undefined;
@@ -71,6 +85,7 @@ function route(app) {
task.ignore = req.body.ignore; task.ignore = req.body.ignore;
task.timeout = req.body.timeout; task.timeout = req.body.timeout;
task.wait = req.body.wait; task.wait = req.body.wait;
task.actions = originalActions;
task.username = req.body.username; task.username = req.body.username;
task.password = req.body.password; task.password = req.body.password;
task.headers = originalHeaders; task.headers = originalHeaders;

View File

@@ -70,6 +70,11 @@ describe('GET /new', function() {
assert.strictEqual(field.attr('value'), ''); assert.strictEqual(field.attr('value'), '');
}); });
it('should have an "actions" field', function() {
const field = this.form.find('textarea[name=actions]').eq(0);
assert.isDefined(field);
});
it('should have a "username" field', function() { it('should have a "username" field', function() {
const field = this.form.find('input[name=username]').eq(0); const field = this.form.find('input[name=username]').eq(0);
assert.isDefined(field); assert.isDefined(field);

View File

@@ -71,6 +71,11 @@ describe('GET /<task-id>/edit', function() {
assert.strictEqual(field.attr('value'), '0'); assert.strictEqual(field.attr('value'), '0');
}); });
it('should have an "actions" field', function() {
const field = this.form.find('textarea[name=actions]').eq(0);
assert.isDefined(field);
});
it('should have a disabled "standard" field', function() { it('should have a disabled "standard" field', function() {
const field = this.form.find('select[name=standard]').eq(0); const field = this.form.find('select[name=standard]').eq(0);
assert.isDefined(field); assert.isDefined(field);

View File

@@ -15,9 +15,13 @@ You should have received a copy of the GNU General Public License
along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>. 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.</h1>
<p class="h2">There isn't much you can do about this.</h2> <p class="h2">Let's see what we can do here:</h2>
<p class="h4">Give it another go or try the <a href="/">home page</a>.</h4> <ul>
<li>Do you have <a href="https://www.mongodb.com/">MongoDB</a> installed and <code>mongod</code> running?</li>
<li>Check out the <a href="https://github.com/pa11y/dashboard/blob/master/TROUBLESHOOTING.md">Troubleshooting doc</a> for more information.</li>
<li>Search for a related <a href="https://github.com/pa11y/dashboard/issues">Github issue</a>, or open one yourself.</li>
</ul>
{{#if error}} {{#if error}}
<h2>Stack-Trace</h2> <h2>Stack-Trace</h2>
<pre>{{error.stack}}</pre> <pre>{{error.stack}}</pre>

View File

@@ -84,6 +84,19 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
</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-actions">
Task Actions
(<a href="https://github.com/pa11y/pa11y#actions">see Pa11y documentation</a>)
</label>
<textarea class="form-control" id="new-task-actions" name="actions" aria-describedby="action-detail" placeholder="E.g. Click element #login-button">{{task.actions}}</textarea>
<em id="action-detail">(one action per line)</em>
</div>
</div>
</div>
<div class="form-group clearfix"> <div class="form-group clearfix">
<div class="row"> <div class="row">
<div class="col-md-4 col-sm-4 col-xs-6"> <div class="col-md-4 col-sm-4 col-xs-6">

View File

@@ -18,7 +18,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
<div class="footer" role="contentinfo"> <div class="footer" role="contentinfo">
<div class="container"> <div class="container">
<div class="col-md-5"> <div class="col-md-5">
<small>&copy; {{year}} Springer Nature.<br/>Pa11y Dashboard is licensed under the GNU General Public License 3.0.<br/>Version {{version}}</small> <small>&copy; 2013{{year}} Team Pa11y.<br/>Pa11y Dashboard is licensed under the GNU General Public License 3.0.<br/>Version {{version}}</small>
</div> </div>
<div class="col-md-7 clearfix"> <div class="col-md-7 clearfix">
<ul class="crunch-bottom floated-list nav"> <ul class="crunch-bottom floated-list nav">

View File

@@ -73,7 +73,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
<div class="col-md-9" data-role="expandable-results" role="main"> <div class="col-md-9" data-role="expandable-results" role="main">
{{#if mainResult.count.error}} {{#if mainResult.count.error}}
<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"> <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 class="pull-right expander"> - <span class="hide">(close panel)</span></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" id="errors-list"> <div class="task-danger tasks-list collapse clearfix in" id="errors-list">
@@ -109,7 +109,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
{{#if mainResult.count.warning}} {{#if mainResult.count.warning}}
<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"> <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 class="pull-right expander"> + <span class="hide">(open panel)</span></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" id="warnings-list"> <div class="task-warning tasks-list collapse clearfix" id="warnings-list">
@@ -145,7 +145,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
{{#if mainResult.count.notice}} {{#if mainResult.count.notice}}
<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"> <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 class="pull-right expander"> + <span class="hide">(open panel)</span></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" id="notices-list"> <div class="task-info tasks-list collapse clearfix" id="notices-list">
@@ -180,7 +180,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
{{#if mainResult.ignore.length}} {{#if mainResult.ignore.length}}
<div class="heading label-default pointer" id="ignore" data-role="expander" role="button" tabindex="0" aria-expanded="false" aria-controls="ignore-list"> <div class="heading label-default pointer" id="ignore" data-role="expander" role="button" tabindex="0" aria-expanded="false" aria-controls="ignore-list">
<span class="pull-right expander"> + <span class="hide">(open panel)</span></span> <span class="pull-right expander"> <span class="hide">(open panel)</span></span>
Ignored Rules ( {{mainResult.ignore.length}} ) Ignored Rules ( {{mainResult.ignore.length}} )
</div> </div>
<div class="task-default tasks-list collapse clearfix" id="ignore-list"> <div class="task-default tasks-list collapse clearfix" id="ignore-list">

View File

@@ -16,19 +16,15 @@ 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">
{{#unless readonly}}
<li class="col-md-4 col-sm-6 task-card add-task"> <li class="col-md-4 col-sm-6 task-card add-task">
{{#if readonly}}
<span class="well task-card-link crunch-bottom">
<p class="h3 crunch">Add new URL</p>
<p class="supersize-me crunch">+</p>
</span>
{{else}}
<a class="well task-card-link crunch-bottom" data-role="add-task" href="/new" data-test="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="h3 crunch">Add new URL</p>
<p class="supersize-me crunch">+</p> <p class="supersize-me crunch">+</p>
</a> </a>
{{/if}}
</li> </li>
{{/unless}}
{{#each tasks}} {{#each tasks}}
<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}}"> <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}}">

View File

@@ -96,6 +96,19 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
</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-actions">
Task Actions
(<a href="https://github.com/pa11y/pa11y#actions">see Pa11y documentation</a>)
</label>
<textarea class="form-control" id="new-task-actions" name="actions" aria-describedby="action-detail" placeholder="E.g. Click element #login-button">{{task.actions}}</textarea>
<em id="action-detail">(one action per line)</em>
</div>
</div>
</div>
<div class="form-group clearfix"> <div class="form-group clearfix">
<div class="row"> <div class="row">
<div class="col-md-4 col-sm-4 col-xs-6"> <div class="col-md-4 col-sm-4 col-xs-6">