Compare commits

..

20 Commits

Author SHA1 Message Date
Sangita Mane
6090a126d5 Spacing change done 2021-11-01 16:22:59 +01:00
Sangita Mane
bb0491858b First draft of layout changes for results page on pa11y dashboard. 2021-10-28 18:01:23 +02:00
Sangita Mane
4c0bd924ab Fixed the a11y errors on Pa11y dashboard results and add new url page (#285)
* Fixed the a11y errors on Pa11y dashboard results page and add new url page.

* Removed few more unnecessary roles along with Holli's suggestions implemented.

* Added close button ARIA label

Co-authored-by: Hollie Kay <1948361+hollsk@users.noreply.github.com>

Co-authored-by: Hollie Kay <1948361+hollsk@users.noreply.github.com>
2021-05-26 16:38:38 +02:00
Jose Bolos
6d4b8c9676 Add mongo version to brew start command 2021-05-18 14:32:35 +01:00
Jose Bolos
0654790289 Improve installation instructions
* Clarify the requirements for running Pa11y Dashboard, and specifically the versions of MongoDB supported
* Split the installation process in sections so it's easy to follow
* Instead of trying to cover the MongoDB installation on the Readme, refer to the MongoDB docs, but still including a macOS example for easy reference
* Clarify the use of the config files and how they relate to the NODE_ENV variable
* Use a slightly less informal language in a few places
2021-05-18 14:32:35 +01:00
Jose Bolos
1d931671ff Version 3.3.0 2021-04-27 15:03:22 +01:00
Jose Bolos
9d95c79625 Version 3.2.1 2021-04-27 15:53:29 +02:00
Jose Bolos
b8029c56f7 Fix security vuln by bumping express-hbs
Also bumps pa11y-webservice to the latest version.
2021-04-27 15:53:29 +02:00
Sangita Mane
9a23b79d89 #165 - Added list view option for the dashboard. (#279)
* Added list view & grid view buttons on the dashboard, on click of which switches the view and avoids truncation of title of the page.

* Indentation fixed.
2021-04-20 09:58:33 +02:00
Jose Bolos
b7d45c0913 Reorder the routes to avoid MongoDB ObjectID error
When trying to add a new URL, the Node.js MongoDB driver complains with the following error:
```
ObjectID generation failed. Argument passed in must be a single String of 12 bytes or a string of 24 hex characters
```

This is because the `/new` url gets captured by the `/:id` route defined in `/route/task/index.js`. It's another instance of #244 that I missed when fixing it.
2021-04-09 11:30:35 +02:00
Jose Bolos
9ae73dc446 Replace Travis with GH actions 2021-04-09 11:04:12 +02:00
Jose Bolos
ff8142b4e4 Version 3.2.0 (#270) 2020-10-05 17:35:43 +01:00
Jose Bolos
2f7e8ae451 Update dependencies (#269) 2020-10-05 17:04:12 +01:00
Sam Clulow
a2cc2c7942 Replace Chalk with Kleur (#264)
- Remove Chalk
- Add Kleur
- Update index.js
- Update copyright in README

Fixes #256
2020-06-29 16:27:44 +01:00
Jose Bolos
59f657b422 Update all devdependencies to the latest versions (#258) 2020-04-28 12:33:36 +01:00
Jose Bolos
ea3183791c Version 3.1.0 (#246)
* Version 3.1.0

Also minor bump to pa11y-webservice

* Bump webservice so it includes data fixtures
2019-09-27 11:44:24 +01:00
Jose Bolos
102a237d2e Bump webservice version and other deps (#245) 2019-09-20 15:59:21 +01:00
Jose Bolos
7c77467dcf Fix incorrect values being passed to ObjectID (#244)
Due to the routes being defined in the wrong order, certain urls (e.g. `/tasks/:taskid:/edit`) are being captured by the results route instead (e.g. `/tasks/:taskid:/:resultid:`). This is causing the wrong method to being called with parts of the path like `edit`, `run`, etc. being passed as an argument to ObjectID(). As these are not valid MongoDB IDs, the method displays instead an error message:

> Argument passed in must be a single String of 12 bytes or a string of 24 hex characters

Also change the path to the favicon image to be not relative, as this is causing a `favicon.png` string to be sent as an argument to ObjectID() when visiting certain pages due to the previous issue.
2019-09-20 14:57:15 +01:00
Jose Bolos
2de7e59f44 Bump webservice to 3.0.1 (#243)
Fixes a problem with tests not running when cron jobs are triggered.
2019-09-13 15:14:36 +01:00
Jeremy Englert
c7bd2a53b6 Adds new images to Readme (#239) 2019-08-01 09:20:02 +01:00
27 changed files with 992 additions and 842 deletions

50
.github/workflows/tests.yml vendored Normal file
View File

@@ -0,0 +1,50 @@
# 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
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
strategy:
matrix:
include:
- node-version: 8.x
lint: true # Linter is run only once to shorten the total build time
- node-version: 10.x
- node-version: 12.x
steps:
- name: Checkout code from ${{ github.repository }}
uses: actions/checkout@v2
- name: Setup node
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- name: MongoDB in GitHub Actions
uses: supercharge/mongodb-github-action@1.3.0
with:
mongodb-version: 3.4
- name: Install dependencies
run: npm i
- name: Run linter
if: ${{ matrix.lint }}
run: make lint
- name: Create test config
run: cp config/test.sample.json config/test.json
- name: Start test app
run: NODE_ENV=test node index.js &
- name: Wait / Sleep
uses: jakejarvis/wait-action@v0.1.0
with:
time: '10s'
- name: Run tests
run: make ci

View File

@@ -1,24 +0,0 @@
# Language/versions
language: node_js
matrix:
include:
- node_js: '8'
- node_js: '10'
- node_js: '12'
# Build only master (and pull-requests)
branches:
only:
- master
# Services setup
services:
- mongodb
# Build script
before_script:
- cp config/test.sample.json config/test.json
- NODE_ENV=test node index.js &
- sleep 5 # give server time to start
script: 'make ci'

View File

@@ -1,6 +1,25 @@
# Changelog # Changelog
## 3.3.0 (2021-04-27)
* Add new list view to the dashboard (thanks @sangitamane)
* Upgrade express-hbs to the latest version in order to address several potential vulnerabilities
* Fixes a MongoDB "ObjectID generation failed" error.
* Update pa11y-webservice to version 3.2.1 and pa11y to version 5.3.1
## 3.2.0 (2020-10-05)
* Update pa11y to version 5.3.0, which means better compatibility with sites using AMD modules
* Update pa11y-webservice to version 3.2.0, which adds the ability to configure the number of workers running pa11y tests
* Update several dependencies
* Replace chalk with kleur
## 3.1.0 (2019-09-27)
* Display the task ID before each line of output, so it's clear to which task a line of output belongs to when they run in parallel.
* Bump pa11y-webservice version, which fixes an issue with some pages failing to run.
* Fix incorrect routes passing an invalid value to Mongo's ObjectID.
## 3.0.0 (2019-07-16) ## 3.0.0 (2019-07-16)
* Update pa11y to v5, which replaces Phantomjs with Headless Chrome * Update pa11y to v5, which replaces Phantomjs with Headless Chrome

View File

@@ -7,8 +7,8 @@ Pa11y Dashboard is a web interface to the [Pa11y][pa11y] accessibility reporter;
[![Build status][shield-build]][info-build] [![Build status][shield-build]][info-build]
[![GPL-3.0 licensed][shield-license]][info-license] [![GPL-3.0 licensed][shield-license]][info-license]
![dashboard](https://f.cloud.github.com/assets/1225142/1549567/f0361e72-4de8-11e3-8d14-3fe6900cc15d.jpg) ![dashboard](https://user-images.githubusercontent.com/6110968/61603347-0bce1000-abf2-11e9-87b2-a53f91d315bb.jpg)
![results-page](https://f.cloud.github.com/assets/1225142/1549568/f225aa54-4de8-11e3-8b25-ef2f405997a3.jpg) ![results-page](https://user-images.githubusercontent.com/6110968/62183438-05851580-b30f-11e9-9bc4-b6a4823ae9e8.jpg)
--- ---
@@ -16,13 +16,11 @@ Pa11y Dashboard is a web interface to the [Pa11y][pa11y] accessibility reporter;
Pa11y Dashboard is a [Node.js][node] application and requires a stable or LTS version of Node, currently version 8 or greater. Pa11y Dashboard is a [Node.js][node] application and requires a stable or LTS version of Node, currently version 8 or greater.
Pa11y Dashboard also requires a [MongoDB][mongo] database to be available so it can store the results of the tests. The database doesn't have to be in the same server or computer where Pa11y Dashboard is running from. Pa11y Dashboard uses a [MongoDB][mongo] database to store the results of the tests. The database doesn't have to be in the same server or computer where Pa11y Dashboard is running from.
Since version 3, Pa11y Dashboard uses Headless Chrome in order to run the tests. This means that additional dependencies maybe be required. Pa11y Dashboard uses [puppeteer](https://www.npmjs.com/package/puppeteer) to create a headless instance of the Chromium browser in order to run the tests. On certain environments this may require additional dependencies to be installed. For example, in Debian/Ubuntu systems you may need to install the `libnss3` and `libgconf-2-4` libraries in order to be able to run tests on Pa11y Dashboard. Please refer to the documentation from your provider for details on how to do this.
In [Unix-like](https://en.wikipedia.org/wiki/Unix-like) systems you may need to install the `libnss3` and `libgconf-2-4` libraries in order to be able to run Chrome. If you're trying to run the app in a headless environment (e.g. the cloud, or a headless server), you may also need to configure Xvfb before. Please refer to the documentation from your provider for details on how to do this. ## Setting up Pa11y Dashboard
## Setup
In order to run Pa11y Dashboard, we recommend cloning this repository locally: In order to run Pa11y Dashboard, we recommend cloning this repository locally:
@@ -37,11 +35,43 @@ cd pa11y-dashboard
npm install npm install
``` ```
You'll also need to have [MongoDB][mongo] installed and running. For quick access, you can install via a package manager such as on Mac OS `brew install mongodb` or on Linux (Debian) it would be `apt-get install mongodb`. To run MongoDB, you can run `mongod` in the command line. See the [MongoDB install guide][mongo-install] for more detailed information. ### Installing MongoDB
The last step before being able to run the application is to define a configuration for it. This can be done in two ways: Instructions for installing and running MongoDB are outside the scope of this document. When in doubt, please refer to the [MongoDB installation instructions](https://docs.mongodb.com/manual/installation/) for details of how to install and run MongoDB on your specific operating system. An example of the installation and configuration process for macOS follows.
### Option 1: Using Environment Variables Pa11y Dashboard currently uses version `2.2` of the Node.js MongoDB driver, which means that [only MongoDB servers of versions 3.4 or older are supported](https://docs.mongodb.com/drivers/node/compatibility/). Please ensure that your MongoDB server fills the requirements before trying to run Pa11y Dashboard.
#### Example MongoDB installation for macOS
On recent versions of macOS (10.13 or later), you can use [Homebrew](https://brew.sh/) to install MongoDB 3.4 Community Edition. More recent versions of MongoDB are untested and unsupported.
Tap the MongoDB Homebrew Tap:
```sh
brew tap mongodb/brew
```
Install the Community version of MongoDB:
```sh
brew install mongodb-community@3.4
```
Start the MongoDB server:
```sh
brew services start mongodb/brew/mongodb-community@3.4
```
Check that the service has started properly:
```sh
$ brew services list
Name Status User Plist
mongodb-community started pa11y /Users/pa11y/Library/LaunchAgents/homebrew.mxcl.mongodb-community.plist
```
### Configuring Pa11y Dashboard
The last step before being able to run Pa11y Dashboard is to define a configuration for it. This can be done in two ways:
#### Option 1: Using environment variables
Each configuration can be set with an environment variable rather than a config file. For example to run the application on port `8080` you can use the following: Each configuration can be set with an environment variable rather than a config file. For example to run the application on port `8080` you can use the following:
@@ -49,11 +79,17 @@ Each configuration can be set with an environment variable rather than a config
PORT=8080 node index.js PORT=8080 node index.js
``` ```
The [available configurations are documented here](#configurations). The [available configurations](#configurations) are documented in the next section.
### Option 2: Using Config Files #### Option 2: Using config files
You'll need to copy and modify different config files depending on your environment (set with `NODE_ENV`): You can store the configuration for Pa11y Dashboard on a JSON file. You can use a different configuration file for each environment you're planning to run Pa11y Dashboard on. You can choose a specific environment to run the application from by setting the `NODE_ENV` environment variable:
```sh
NODE_ENV=development node index.js
```
Three example files are provided in this repository, you can copy and customise them to your liking:
```sh ```sh
cp config/development.sample.json config/development.json cp config/development.sample.json config/development.json
@@ -61,35 +97,32 @@ cp config/production.sample.json config/production.json
cp config/test.sample.json config/test.json cp config/test.sample.json config/test.json
``` ```
Each of these files defines configurations for a different environment. If you're just running the application locally, then you should be OK with just development and test configurations. The [available configurations are documented here](#configurations). The [available configurations](#configurations) are documented in the next section.
Now that you've got your application configured, make sure you have a MongoDB server running with the `mongod` command in another terminal window. You can run in each mode by changing the `NODE_ENV` environment variable: If you run into problems, check the [troubleshooting guide][TROUBLESHOOTING.md].
```sh
NODE_ENV=development node index.js
```
See [Contributing](#contributing) for more information about running locally (and restarting automatically when files change).
If you run into problems, check the [troubleshooting guide][troubleshooting].
## Configurations ## Configurations
The boot configurations for Pa11y Dashboard are as follows. Look at the sample JSON files in the repo for example usage. The boot configurations for Pa11y Dashboard are as follows. Look at the sample JSON files in the repo for example usage.
### port ### port
*(number)* The port to run the application on. Set via a config file or the `PORT` environment variable. *(number)* The port to run the application on. Set via a config file or the `PORT` environment variable.
### noindex ### noindex
*(boolean)* If set to `true` (default), the dashboard will not be indexed by search engines. Set to `false` to allow indexing. Set via a config file or the `NOINDEX` environment variable. *(boolean)* If set to `true` (default), the dashboard will not be indexed by search engines. Set to `false` to allow indexing. Set via a config file or the `NOINDEX` environment variable.
### readonly ### readonly
*(boolean)* If set to `true`, users will not be able to add, delete or run URLs (defaults to `false`). Set via a config file or the `READONLY` environment variable. *(boolean)* If set to `true`, users will not be able to add, delete or run URLs (defaults to `false`). Set via a config file or the `READONLY` environment variable.
### siteMessage ### siteMessage
*(string)* A message to display prominently on the site home page. Defaults to `null`. *(string)* A message to display prominently on the site home page. Defaults to `null`.
### webservice ### 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_`. 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_`.
## Contributing ## Contributing
@@ -139,19 +172,15 @@ 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].<br/> Pa11y Dashboard is licensed under the [GNU General Public License 3.0][info-license].<br/>
Copyright &copy; 20132019, Team Pa11y and contributors Copyright &copy; 20132020, Team Pa11y and contributors
[gpl]: http://www.gnu.org/licenses/gpl-3.0.html [gpl]: http://www.gnu.org/licenses/gpl-3.0.html
[mongo]: http://www.mongodb.org/ [mongo]: http://www.mongodb.org/
[mongo-install]: https://docs.mongodb.org/manual/installation/
[node]: http://nodejs.org/ [node]: http://nodejs.org/
[pa11y]: https://github.com/pa11y/pa11y [pa11y]: https://github.com/pa11y/pa11y
[pa11y-webservice-config]: https://github.com/pa11y/webservice#configurations [pa11y-webservice-config]: https://github.com/pa11y/webservice#configurations
[phantom]: http://phantomjs.org/
[sidekick-proposal]: https://github.com/pa11y/sidekick/blob/master/PROPOSAL.md
[travis]: https://travis-ci.org/pa11y/dashboard [travis]: https://travis-ci.org/pa11y/dashboard
[travis-img]: https://travis-ci.org/pa11y/dashboard.png?branch=master [travis-img]: https://travis-ci.org/pa11y/dashboard.png?branch=master
[troubleshooting]: https://github.com/pa11y/dashboard/blob/master/TROUBLESHOOTING.md
[info-node]: package.json [info-node]: package.json
[info-build]: https://travis-ci.org/pa11y/pa11y-dashboard [info-build]: https://travis-ci.org/pa11y/pa11y-dashboard

6
app.js
View File

@@ -92,8 +92,6 @@ function initApp(config, callback) {
// Load routes // Load routes
require('./route/index')(app); require('./route/index')(app);
require('./route/task/index')(app);
require('./route/result/index')(app);
require('./route/result/download')(app); require('./route/result/download')(app);
if (!config.readonly) { if (!config.readonly) {
require('./route/new')(app); require('./route/new')(app);
@@ -103,6 +101,10 @@ function initApp(config, callback) {
require('./route/task/ignore')(app); require('./route/task/ignore')(app);
require('./route/task/unignore')(app); require('./route/task/unignore')(app);
} }
// Needs to be loaded after `/route/new`
require('./route/task/index')(app);
// Needs to be loaded after `/route/task/edit`
require('./route/result/index')(app);
// Error handling // Error handling
app.express.get('*', (request, response) => { app.express.get('*', (request, response) => {

View File

@@ -14,7 +14,7 @@
// along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>. // along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
'use strict'; 'use strict';
const chalk = require('chalk'); const kleur = require('kleur');
const config = require('./config'); const config = require('./config');
process.on('SIGINT', () => { process.on('SIGINT', () => {
@@ -29,16 +29,16 @@ require('./app')(config, (error, app) => {
} }
console.log(''); console.log('');
console.log(chalk.underline.magenta('Pa11y Dashboard started')); console.log(kleur.underline().magenta('Pa11y Dashboard started'));
console.log(chalk.grey('mode: %s'), process.env.NODE_ENV); console.log(kleur.grey('mode: %s'), process.env.NODE_ENV);
console.log(chalk.grey('uri: %s'), app.address); console.log(kleur.grey('uri: %s'), app.address);
app.on('route-error', error => { app.on('route-error', error => {
const stack = (error.stack ? error.stack.split('\n') : [error.message]); const stack = (error.stack ? error.stack.split('\n') : [error.message]);
const msg = chalk.red(stack.shift()); const msg = kleur.red(stack.shift());
console.error(''); console.error('');
console.error(msg); console.error(msg);
console.error(chalk.grey(stack.join('\n'))); console.error(kleur.grey(stack.join('\n')));
}); });
// Start the webservice if required // Start the webservice if required
@@ -50,11 +50,11 @@ require('./app')(config, (error, app) => {
} }
console.log(''); console.log('');
console.log(chalk.underline.cyan('Pa11y Webservice started')); console.log(kleur.underline().cyan('Pa11y Webservice started'));
console.log(chalk.grey('mode: %s'), process.env.NODE_ENV); console.log(kleur.grey('mode: %s'), process.env.NODE_ENV);
console.log(chalk.grey('uri: %s'), webservice.server.info.uri); console.log(kleur.grey('uri: %s'), webservice.server.info.uri);
console.log(chalk.grey('database: %s'), config.webservice.database); console.log(kleur.grey('database: %s'), config.webservice.database);
console.log(chalk.grey('cron: %s'), config.webservice.cron); console.log(kleur.grey('cron: %s'), config.webservice.cron);
}); });
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "pa11y-dashboard", "name": "pa11y-dashboard",
"version": "3.0.0", "version": "3.3.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",
"keywords": [ "keywords": [
@@ -26,26 +26,26 @@
}, },
"dependencies": { "dependencies": {
"body-parser": "~1.19.0", "body-parser": "~1.19.0",
"chalk": "~2.4.2",
"compression": "~1.7.4", "compression": "~1.7.4",
"express-hbs": "~2.1.2",
"express": "~4.17.1", "express": "~4.17.1",
"express-hbs": "~2.4.0",
"http-headers": "~3.0.2", "http-headers": "~3.0.2",
"moment": "~2.24.0", "kleur": "~4.1.2",
"moment": "~2.29.0",
"pa11y-webservice": "~3.2.1",
"pa11y-webservice-client-node": "~2.0.0", "pa11y-webservice-client-node": "~2.0.0",
"pa11y-webservice": "~3.0.0", "underscore": "~1.11.0"
"underscore": "~1.9.1"
}, },
"devDependencies": { "devDependencies": {
"bower": "^1.8.8", "bower": "^1.8.8",
"cheerio": "^1.0.0-rc.3", "cheerio": "^1.0.0-rc.3",
"eslint": "^6.0.1", "eslint": "^6.8.0",
"less": "^3.9.0", "less": "^3.11.1",
"mocha": "^6.1.4", "mocha": "^7.2.0",
"pa11y-lint-config": "^1.2.1", "pa11y-lint-config": "^1.2.1",
"proclaim": "^3.6.0", "proclaim": "^3.6.0",
"request": "^2.88.0", "request": "^2.88.2",
"uglify-js": "^3.6.0" "uglify-js": "^3.11.0"
}, },
"scripts": { "scripts": {
"start": "node index.js", "start": "node index.js",

File diff suppressed because one or more lines are too long

View File

@@ -26,7 +26,9 @@ $(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 legend = graphContainer.parents('.graph-container').find('.dashedLegend');
var list = localStorage.getItem("listview") || ""; // get choice or nothing
var graphOptions = { var graphOptions = {
series: { series: {
@@ -397,4 +399,38 @@ $(document).ready(function(){
$.fn.collapse.Constructor.prototype.keydown $.fn.collapse.Constructor.prototype.keydown
); );
// List View
$('.btn-list').click(function () {
var elements = $("#grid-container .task-card");
for (i = 0; i < elements.length; i++) {
$(elements[i]).removeClass('col-md-4 col-sm-6');
$(elements[i]).addClass('col-md-12');
$(elements[i]).find('.gridview:nth-child(1)').addClass('listview col-md-9 col-sm-8');
$(elements[i]).find('.gridview:nth-child(2)').addClass('listview col-md-3 col-sm-4 task-actions clearfix');
$(elements[i]).find('.gridview').removeClass('gridview');
};
$('.view-btn').removeClass('btn-default')
$(this).addClass('btn-default');
localStorage.setItem("listview", "yes") //save the choice
});
// Grid View
$('.btn-grid').click(function () {
var elements = $("#grid-container .task-card");
for (i = 0; i < elements.length; i++) {
$(elements[i]).removeClass('col-md-12');
$(elements[i]).addClass('col-md-4 col-sm-6');
$(elements[i]).find('.listview').addClass('gridview')
$(elements[i]).find('.listview:nth-child(1)').removeClass('listview col-md-9 col-sm-8');
$(elements[i]).find('.listview:nth-child(2)').removeClass('listview col-md-3 col-sm-4 task-actions clearfix');
};
$('.view-btn').removeClass('btn-default')
$(this).addClass('btn-default')
localStorage.setItem("listview", "") //clears the choice
});
//load the view as per user's choice
if (list === 'yes') {
$('.btn-list').trigger('click');
}
}); });

File diff suppressed because one or more lines are too long

View File

@@ -3,7 +3,7 @@
// Amend the width of container if you want to here // Amend the width of container if you want to here
@container-md-ie8: @container-md; @container-md-ie8: @container-md;
@grid-adjustment: percentage(@grid-gutter-width / @container-md-ie8); @grid-adjustment: percentage((@grid-gutter-width / @container-md-ie8));
.ie7, .ie8 { .ie7, .ie8 {
* { * {

View File

@@ -71,6 +71,14 @@
} }
} }
main section {
margin: 5em 0;
}
.results-download {
margin: 1.5em 0;
}
.supersize-me { .supersize-me {
text-align: center; text-align: center;
font-size: 112px; font-size: 112px;
@@ -175,7 +183,6 @@
text-transform: uppercase; text-transform: uppercase;
display: block; display: block;
line-height: 1.4; line-height: 1.4;
.opacity(.8);
} }
// Stats box colours // Stats box colours
@@ -221,12 +228,6 @@
text-decoration: none; text-decoration: none;
background-color: darken(@gray-lighter, 2%); background-color: darken(@gray-lighter, 2%);
} }
.h3 {
text-overflow: ellipsis;
overflow: hidden;
width: 100%;
white-space: nowrap;
}
.task-stats li { .task-stats li {
padding: 7px 0 6px 0; padding: 7px 0 6px 0;
text-align: center; text-align: center;
@@ -235,6 +236,23 @@
.dropdown-menu { .dropdown-menu {
top: 25px; top: 25px;
} }
.gridview {
.h3 {
text-overflow: ellipsis;
overflow: hidden;
width: 100%;
white-space: nowrap;
}
.h4 {
display: none;
}
}
.listview {
padding-left: 0;
}
.last-run {
clear: both;
}
} }
/* Badges */ /* Badges */
@@ -575,9 +593,9 @@ ul.date-links {
} }
.dashedLegend { .dashedLegend {
position: absolute; position: relative;
top: 70px; top: 55px;
right: 40px; right: 20px;
font-size: smaller; font-size: smaller;
color: #545454; color: #545454;
background-color: #fff; background-color: #fff;
@@ -723,3 +741,30 @@ ul.date-links {
.popover-content { .popover-content {
overflow-x: auto; overflow-x: auto;
} }
/*list and grid view buttons */
.view-btn {
&.btn-default, &.btn-default:hover, &.btn-default:focus {
color: #ffffff;
}
&:hover {
color: #000000;
}
&:last-child:not(:first-child) {
border-bottom-left-radius: 0;
border-top-left-radius: 0;
margin-left: -3px;
}
&:first-child:not(:last-child) {
border-bottom-right-radius: 0;
border-top-right-radius: 0;
}
}
/*close button on success alert*/
.alert-success {
.close {
color: #fff;
opacity: 1;
};
}

View File

@@ -18,9 +18,9 @@
// ------------------------- // -------------------------
@brand-primary: #2C3E50; @brand-primary: #2C3E50;
@brand-success: #00806F; @brand-success: #006053;
@brand-warning: #A86700; @brand-warning: #b24d04;
@brand-danger: #D83D2D; @brand-danger: #c92a2a;
@brand-info: #177BBE; @brand-info: #177BBE;
// Scaffolding // Scaffolding
@@ -233,7 +233,7 @@
@navbar-default-bg: @brand-primary; @navbar-default-bg: @brand-primary;
@navbar-default-border: darken(@navbar-default-bg, 6.5%); @navbar-default-border: darken(@navbar-default-bg, 6.5%);
@navbar-border-radius: @border-radius-base; @navbar-border-radius: @border-radius-base;
@navbar-padding-horizontal: floor(@grid-gutter-width / 2); // ~15px @navbar-padding-horizontal: floor((@grid-gutter-width / 2)); // ~15px
@navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2); @navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2);
// Navbar links // Navbar links

View File

@@ -247,7 +247,7 @@
@navbar-height: 50px; @navbar-height: 50px;
@navbar-margin-bottom: @line-height-computed; @navbar-margin-bottom: @line-height-computed;
@navbar-border-radius: @border-radius-base; @navbar-border-radius: @border-radius-base;
@navbar-padding-horizontal: floor(@grid-gutter-width / 2); @navbar-padding-horizontal: floor((@grid-gutter-width / 2));
@navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2); @navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2);
@navbar-default-color: #777; @navbar-default-color: #777;

View File

@@ -41,10 +41,18 @@ describe.only('GET /', function() {
it('should display all of the expected tasks', function() { it('should display all of the expected tasks', function() {
const tasks = this.last.dom('[data-test=task]'); const tasks = this.last.dom('[data-test=task]');
assert.strictEqual(tasks.length, 4); assert.strictEqual(tasks.length, 4);
assert.match(tasks.eq(0).text(), /npg home\s+\(wcag2aa\)/i); assert.equal(tasks.eq(0).find('.h3').text(), 'NPG Home');
assert.match(tasks.eq(1).text(), /npg home\s+\(wcag2aaa\)/i); assert.equal(tasks.eq(0).find('.h4').text(), 'nature.com');
assert.match(tasks.eq(2).text(), /nature news\s+\(section508\)/i); assert.equal(tasks.eq(0).find('.h5').text(), '(WCAG2AA)');
assert.match(tasks.eq(3).text(), /z integration test\s+\(wcag2aa\)/i); assert.equal(tasks.eq(1).find('.h3').text(), 'NPG Home');
assert.equal(tasks.eq(1).find('.h4').text(), 'nature.com');
assert.equal(tasks.eq(1).find('.h5').text(), '(WCAG2AAA)');
assert.equal(tasks.eq(2).find('.h3').text(), 'Nature News');
assert.equal(tasks.eq(2).find('.h4').text(), 'nature.com/news');
assert.equal(tasks.eq(2).find('.h5').text(), '(Section508)');
assert.equal(tasks.eq(3).find('.h3').text(), 'Z Integration Test');
assert.equal(tasks.eq(3).find('.h4').text(), 'localhost:8132');
assert.equal(tasks.eq(3).find('.h5').text(), '(WCAG2AA)');
}); });
it('should have links to each task', function() { it('should have links to each task', function() {

View File

@@ -40,7 +40,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
{{#deleted}} {{#deleted}}
<div class="col-md-12 clearfix" data-test="alert"> <div class="col-md-12 clearfix" data-test="alert">
<div class="alert alert-info"> <div class="alert alert-info">
<button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button> <button data-dismiss="alert" class="close" type="button" aria-label="Close">×</button>
<strong>Bye Bye URL</strong> <strong>Bye Bye URL</strong>
<p>The URL you selected and its associated results have been deleted.</p> <p>The URL you selected and its associated results have been deleted.</p>
</div> </div>

View File

@@ -27,7 +27,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
{{#if noindex}}<meta name="robots" content="noindex"/>{{/if}} {{#if noindex}}<meta name="robots" content="noindex"/>{{/if}}
<link rel="icon" type="image/png" href="favicon.png" /> <link rel="icon" type="image/png" href="/favicon.png" />
<!-- For mobile devices. --> <!-- For mobile devices. -->
<meta name="viewport" content="width=device-width"/> <meta name="viewport" content="width=device-width"/>

View File

@@ -19,7 +19,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
Add a new URL Add a new URL
{{/content}} {{/content}}
<form role="form" class="col-md-12" action="/new" method="post" data-test="new-url-form"> <form class="col-md-12" action="/new" method="post" data-test="new-url-form">
<div class="legend"> <div class="legend">
<h1 class="h2 crunch-top">Add a new URL</h1> <h1 class="h2 crunch-top">Add a new URL</h1>

View File

@@ -14,11 +14,14 @@ GNU General Public License for more details.
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/>.
}} }}
<div class="col-md-12 clearfix"> <section class="col-md-12 clearfix">
<div class="graph-container graph-spacer ruled clearfix"> <h2>Results Overview</h2>
<div class="col-md-12 graph-container graph-spacer ruled clearfix">
<div class="col-md-10">
<div class="row"> <div class="row">
<div class="col-md-3 col-sm-4 col-xs-3"> <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">Export graph</button>
</div> </div>
<div class="col-md-5 col-sm-6 col-xs-9 pull-right"> <div class="col-md-5 col-sm-6 col-xs-9 pull-right">
@@ -26,7 +29,8 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
</div> </div>
</div> </div>
<div data-role="graph" class="graph"></div> <div data-role="graph" class="graph"></div>
<div class="dashedLegend"> </div>
<div class="col-md-2 dashedLegend">
<div class="dashedContainer"> <div class="dashedContainer">
<table> <table>
<tbody> <tbody>
@@ -60,12 +64,11 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
</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>
</div>
<div class="col-md-12 hidden">
<div class="graph-spacer ruled"> <div class="ruled col-md-12 graph-spacer">
<table id="graph-data" class="table graph-table" summary="Accessibility results from Pa11y for this page"> <table id="graph-data" class="table graph-table" summary="Accessibility results from Pa11y for this page">
<caption>Pa11y results for this URL</caption> <caption>Results for {{simplify-url task.url}}</caption>
<thead> <thead>
<tr> <tr>
<th>Date</th> <th>Date</th>
@@ -77,7 +80,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
<tbody> <tbody>
{{#results}} {{#results}}
<tr data-role="url-stats"> <tr data-role="url-stats">
<td data-value="{{date-timestamp date}}" data-role="date">{{date-format date format="DD MMM YYYY"}}</td> <td data-value="{{date-timestamp date}}" data-role="date"><a href="{{href}}">{{date-format date format="DD MMM YYYY"}}</a></td>
<td class="text-center" data-label="error">{{count.error}}</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="warning">{{count.warning}}</td>
<td class="text-center" data-label="notice">{{count.notice}}</td> <td class="text-center" data-label="notice">{{count.notice}}</td>
@@ -86,4 +89,4 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </section>

View File

@@ -15,7 +15,7 @@ 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/>.
}} }}
<footer> <footer>
<div class="footer" role="contentinfo"> <div class="footer">
<div class="container"> <div class="container">
<div class="col-md-5"> <div class="col-md-5">
<small>&copy; 2013{{year}} Team Pa11y.<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>

View File

@@ -15,7 +15,7 @@ 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/>.
}} }}
<header> <header>
<div role="banner" class="header"> <div class="header">
<div class="container"> <div class="container">
{{#if isHomePage}}<h1>{{else}}<div class="h1">{{/if}} {{#if isHomePage}}<h1>{{else}}<div class="h1">{{/if}}
<a href="/">Pa11y Dashboard</a> - <a href="/">Pa11y Dashboard</a> -

View File

@@ -15,54 +15,18 @@ 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-3 aside"> <section class="col-md-12">
<div class="row"> <h2 id="tabSectionHeading">Results for {{date-format task.lastResult.date format="DD MMM YYYY"}}</h2>
<div class="action-buttons col-md-12 col-sm-6"> <div class="results-download">
<div class="row"> <a href="{{mainResult.hrefCsv}}" class="btn btn-default" data-test="download-csv">
<div class="col-md-12 col-sm-6 col-xs-12">
<a href="{{mainResult.hrefCsv}}" class="btn-full-width btn btn-default" data-test="download-csv">
Download CSV <span class="glyphicon glyphicon-download" aria-hidden="true"></span> Download CSV <span class="glyphicon glyphicon-download" aria-hidden="true"></span>
</a> </a>
</div> <a href="{{mainResult.hrefJson}}" class="btn btn-default" data-test="download-json">
<div class="col-md-12 col-sm-6 col-xs-12">
<a href="{{mainResult.hrefJson}}" class="btn-full-width btn btn-default" data-test="download-json">
Download JSON <span class="glyphicon glyphicon-download" aria-hidden="true"></span> Download JSON <span class="glyphicon glyphicon-download" aria-hidden="true"></span>
</a> </a>
</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" aria-hidden="true"></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="col-md-12 col-sm-12 clearfix">
<div class="well">
<h4 class="crunch-top">View results in browser</h4>
<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" role="main"> <ul id="top" class="nav nav-tabs category-list">
<ul class="nav nav-tabs category-list" role="tablist">
<li class="category-list__item category-list__item_type_error active" role="presentation"> <li class="category-list__item category-list__item_type_error active" 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"> <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}} ) Errors ( {{mainResult.count.error}} )
@@ -116,10 +80,10 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
<div class="task-details collapse" id="error-index-{{@index}}"> <div class="task-details collapse" id="error-index-{{@index}}">
{{#if solutions.length}} {{#if solutions.length}}
<div class="subtitle" id="error-solutions">Solutions:</div> <div class="subtitle">Solutions:</div>
<ul class="list-unstyled solutions-list" role="list" aria-labelledby="error-solutions"> <ul class="list-unstyled solutions-list">
{{#each solutions}} {{#each solutions}}
<li class="list-unstyled__item" role="listitem"> <li class="list-unstyled__item">
<a class="link" href="{{url}}" target="_blank"> <a class="link" href="{{url}}" target="_blank">
<span class="glyphicon glyphicon-share" aria-hidden="true"></span>&nbsp;{{title}} <span class="glyphicon glyphicon-share" aria-hidden="true"></span>&nbsp;{{title}}
</a> </a>
@@ -129,10 +93,10 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
{{/if}} {{/if}}
{{#if items.length}} {{#if items.length}}
<div class="subtitle" id="error-selectors">Selectors:</div> <div class="subtitle">Selectors:</div>
<ul class="list-unstyled selectors-list" role="list" aria-labelledby="error-selectors"> <ul class="list-unstyled selectors-list">
{{#each items}} {{#each items}}
<li class="list-unstyled__item" role="listitem"> <li class="list-unstyled__item">
<span title="Context" data-role="context-popover" data-toggle="popover" data-content="{{context}}"> <span title="Context" data-role="context-popover" data-toggle="popover" data-content="{{context}}">
<code class="code">{{selector}}</code> <code class="code">{{selector}}</code>
</span> </span>
@@ -182,10 +146,10 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
<div class="task-details collapse" id="warning-index-{{@index}}"> <div class="task-details collapse" id="warning-index-{{@index}}">
{{#if solutions.length}} {{#if solutions.length}}
<div class="subtitle" id="warning-solutions">Solutions:</div> <div class="subtitle">Solutions:</div>
<ul class="list-unstyled solutions-list" role="list" aria-labelledby="warning-solutions"> <ul class="list-unstyled solutions-list">
{{#each solutions}} {{#each solutions}}
<li class="list-unstyled__item" role="listitem"> <li class="list-unstyled__item">
<a class="link" href="{{url}}" target="_blank"> <a class="link" href="{{url}}" target="_blank">
<span class="glyphicon glyphicon-share" aria-hidden="true"></span>&nbsp;{{title}} <span class="glyphicon glyphicon-share" aria-hidden="true"></span>&nbsp;{{title}}
</a> </a>
@@ -195,10 +159,10 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
{{/if}} {{/if}}
{{#if items.length}} {{#if items.length}}
<div class="subtitle" id="warning-selectors">Selectors:</div> <div class="subtitle">Selectors:</div>
<ul class="list-unstyled selectors-list" role="list" aria-labelledby="warning-selectors"> <ul class="list-unstyled selectors-list">
{{#each items}} {{#each items}}
<li class="list-unstyled__item" role="listitem"> <li class="list-unstyled__item">
<span title="Context" data-role="context-popover" data-toggle="popover" data-content="{{context}}"> <span title="Context" data-role="context-popover" data-toggle="popover" data-content="{{context}}">
<code class="code">{{selector}}</code> <code class="code">{{selector}}</code>
</span> </span>
@@ -248,10 +212,10 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
<div class="task-details collapse" id="notice-index-{{@index}}"> <div class="task-details collapse" id="notice-index-{{@index}}">
{{#if solutions.length}} {{#if solutions.length}}
<div class="subtitle" id="notice-solutions">Solutions:</div> <div class="subtitle">Solutions:</div>
<ul class="list-unstyled solutions-list" role="list" aria-labelledby="notice-solutions"> <ul class="list-unstyled solutions-list">
{{#each solutions}} {{#each solutions}}
<li class="list-unstyled__item" role="listitem"> <li class="list-unstyled__item">
<a class="link" href="{{url}}" target="_blank"> <a class="link" href="{{url}}" target="_blank">
<span class="glyphicon glyphicon-share" aria-hidden="true"></span>&nbsp;{{title}} <span class="glyphicon glyphicon-share" aria-hidden="true"></span>&nbsp;{{title}}
</a> </a>
@@ -261,10 +225,10 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
{{/if}} {{/if}}
{{#if items.length}} {{#if items.length}}
<div class="subtitle" id="notice-selectors">Selectors:</div> <div class="subtitle">Selectors:</div>
<ul class="list-unstyled selectors-list" role="list" aria-labelledby="notice-selectors"> <ul class="list-unstyled selectors-list">
{{#each items}} {{#each items}}
<li class="list-unstyled__item" role="listitem"> <li class="list-unstyled__item">
<span title="Context" data-role="context-popover" data-toggle="popover" data-content="{{context}}"> <span title="Context" data-role="context-popover" data-toggle="popover" data-content="{{context}}">
<code class="code">{{selector}}</code> <code class="code">{{selector}}</code>
</span> </span>
@@ -321,4 +285,8 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
{{/if}} {{/if}}
</div> </div>
</div> </div>
<div class="well">
<h3 class="crunch-top h3">View results in browser</h3>
<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>
</section>

View File

@@ -24,11 +24,13 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
<div class="run-details task-header clearfix"> <div class="run-details task-header clearfix">
<div class="col-md-12 clearfix"> <div class="col-md-12 clearfix">
{{#unless readonly}} {{#unless readonly}}
<ul class="inline-list" role="menu"> <nav aria-label="task tools">
<ul class="inline-list">
<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><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>
</nav>
{{/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: <strong>{{date-format mainResult.date format="DD MMM YYYY"}}</strong></div>

View File

@@ -14,8 +14,12 @@ GNU General Public License for more details.
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/>.
}} }}
<div class="col-md-12 task-card clearfix">
<button class="btn view-btn btn-grid btn-default"><i class="glyphicon glyphicon-th"></i> Grid</button>
<button class="btn view-btn btn-list"><i class="glyphicon glyphicon-align-justify "></i> List</button>
<ul class="list-unstyled clearfix crunch-bottom"> </div>
<ul class="list-unstyled clearfix crunch-bottom" id="grid-container">
{{#unless readonly}} {{#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">
@@ -28,9 +32,14 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
{{#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}}">
<div class="gridview">
<p class="h3">{{name}}</p> <p class="h3">{{name}}</p>
<p class="h4">{{simplify-url url}}</p>
<p class="h5">({{standard}})</p> <p class="h5">({{standard}})</p>
</div>
{{#if lastResult}} {{#if lastResult}}
<div class="gridview">
<ul class="clearfix list-unstyled floated-list task-stats"> <ul class="clearfix list-unstyled floated-list task-stats">
{{#lastResult}} {{#lastResult}}
<li class="danger" title="Number of errors ({{count.error}})">{{count.error}}<span class="stat-type">Errors</span></li> <li class="danger" title="Number of errors ({{count.error}})">{{count.error}}<span class="stat-type">Errors</span></li>
@@ -38,7 +47,8 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
<li class="info last" title="Number of notices ({{count.notice}})">{{count.notice}}<span class="stat-type">Notices</span></li> <li class="info last" title="Number of notices ({{count.notice}})">{{count.notice}}<span class="stat-type">Notices</span></li>
{{/lastResult}} {{/lastResult}}
</ul> </ul>
Last run {{date-format lastResult.date format="DD MMM YYYY"}} </div>
<div class="last-run">Last run {{date-format lastResult.date format="DD MMM YYYY"}}</div>
{{else}} {{else}}
<p class="no-results">No results</p> <p class="no-results">No results</p>
{{/if}} {{/if}}
@@ -46,12 +56,14 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
{{#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"> <nav aria-label="task tools">
<ul class="dropdown-menu pull-right">
<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>
</nav>
</div> </div>
{{/unless}} {{/unless}}
</li> </li>

View File

@@ -29,7 +29,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
</div> </div>
{{/edited}} {{/edited}}
<form role="form" class="col-md-12" action="/{{task.id}}/edit" method="post" data-test="edit-url-form"> <form class="col-md-12" action="/{{task.id}}/edit" method="post" data-test="edit-url-form">
<div class="legend"> <div class="legend">
<h1 class="h2 crunch-top">Edit URL</h1> <h1 class="h2 crunch-top">Edit URL</h1>

View File

@@ -22,7 +22,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
{{#added}} {{#added}}
<div class="col-md-12 clearfix" data-test="alert"> <div class="col-md-12 clearfix" data-test="alert">
<div class="alert alert-success"> <div class="alert alert-success">
<button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button> <button data-dismiss="alert" class="close" type="button">×</button>
<strong>Whoop whoop!</strong> <strong>Whoop whoop!</strong>
<p>Your new URL has been added.</p> <p>Your new URL has been added.</p>
</div> </div>
@@ -32,7 +32,7 @@ along with Pa11y Dashboard. If not, see <http://www.gnu.org/licenses/>.
{{#running}} {{#running}}
<div class="col-md-12 clearfix" data-test="alert"> <div class="col-md-12 clearfix" data-test="alert">
<div class="alert alert-success"> <div class="alert alert-success">
<button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button> <button data-dismiss="alert" class="close" type="button">×</button>
<strong>New results incoming!</strong> <strong>New results incoming!</strong>
<p> <p>
New results are being generated for this URL in the background. 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}} {{#ruleIgnored}}
<div class="col-md-12 clearfix" data-test="alert"> <div class="col-md-12 clearfix" data-test="alert">
<div class="alert alert-success"> <div class="alert alert-success">
<button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button> <button data-dismiss="alert" class="close" type="button">×</button>
<strong>Rule ignored!</strong> <strong>Rule ignored!</strong>
<p> <p>
You've ignored an accessibility rule for this URL. 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}} {{#ruleUnignored}}
<div class="col-md-12 clearfix" data-test="alert"> <div class="col-md-12 clearfix" data-test="alert">
<div class="alert alert-success"> <div class="alert alert-success">
<button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button> <button data-dismiss="alert" class="close" type="button">×</button>
<strong>Rule unignored!</strong> <strong>Rule unignored!</strong>
<p> <p>
You've removed an ignored accessibility rule for this URL. You've removed an ignored accessibility rule for this URL.