mirror of
https://github.com/pa11y/pa11y-dashboard.git
synced 2025-09-25 06:41:21 +00:00
Compare commits
36 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
75497ff95f | ||
![]() |
c481f8dbb5 | ||
![]() |
716151e696 | ||
![]() |
b1de71f59c | ||
![]() |
4e19b125e0 | ||
![]() |
d3148d4194 | ||
![]() |
1ad95627ee | ||
![]() |
4296effbc1 | ||
![]() |
917057a109 | ||
![]() |
c8b97df4ee | ||
![]() |
724175ef66 | ||
![]() |
b2273234ce | ||
![]() |
0546175809 | ||
![]() |
52a923ace3 | ||
![]() |
786922e592 | ||
![]() |
4ff53093f4 | ||
![]() |
ce77e57659 | ||
![]() |
4a7800e288 | ||
![]() |
5b1963599b | ||
![]() |
1b36dc12ea | ||
![]() |
963ab33cce | ||
![]() |
b95238645a | ||
![]() |
8657138e13 | ||
![]() |
f580f00d4c | ||
![]() |
fdc631e3ca | ||
![]() |
98dafba137 | ||
![]() |
fd32a5d894 | ||
![]() |
68a3e26472 | ||
![]() |
bb197744fd | ||
![]() |
ae6b551f54 | ||
![]() |
16231a3609 | ||
![]() |
74dd5b18c9 | ||
![]() |
5c10261c56 | ||
![]() |
e13de45e4a | ||
![]() |
9383de3410 | ||
![]() |
7c2647653d |
13
.editorconfig
Normal file
13
.editorconfig
Normal file
@@ -0,0 +1,13 @@
|
||||
# http://editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
indent_style = tab
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
@@ -76,7 +76,7 @@ module.exports = function (grunt) {
|
||||
'public/js/vendor/bootstrap/js/dropdown.js',
|
||||
'public/js/vendor/bootstrap/js/tooltip.js',
|
||||
'public/js/vendor/flot/jquery.flot.js',
|
||||
'public/js/vendor/flot/jquery.flot.categories.js',
|
||||
'public/js/vendor/flot/jquery.flot.time.js',
|
||||
'public/js/vendor/flot/jquery.flot.selection.js',
|
||||
'public/js/vendor/flot/jquery.flot.resize.js',
|
||||
'public/js/site.js'
|
||||
|
@@ -3,7 +3,7 @@ pa11y-dashboard
|
||||
|
||||
pa11y-dashboard is a web interface to the [pa11y][pa11y] accessibility reporter; allowing you to focus on *fixing* issues rather than hunting them down.
|
||||
|
||||
**Current Version:** *1.1.0*
|
||||
**Current Version:** *1.2.1*
|
||||
**Build Status:** [![Build Status][travis-img]][travis]
|
||||
**Node Version Support:** *0.10*
|
||||
|
||||
|
1
app.js
1
app.js
@@ -78,6 +78,7 @@ function initApp (config, callback) {
|
||||
require('./route/new')(app);
|
||||
require('./route/task/delete')(app);
|
||||
require('./route/task/run')(app);
|
||||
require('./route/task/edit')(app);
|
||||
}
|
||||
|
||||
// Error handling
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "pa11y-dashboard",
|
||||
"version": "1.1.0",
|
||||
"version": "1.2.1",
|
||||
"private": true,
|
||||
|
||||
"description": "pa11y-dashboard is a visual web interface to the pa11y accessibility reporter",
|
||||
@@ -25,8 +25,8 @@
|
||||
"express": "~3.4",
|
||||
"express-hbs": "~0.2",
|
||||
"moment": "~2.2",
|
||||
"pa11y-webservice": "~1.1",
|
||||
"pa11y-webservice-client-node": "~1.0",
|
||||
"pa11y-webservice": "~1.3",
|
||||
"pa11y-webservice-client-node": "~1.1",
|
||||
"underscore": "~1.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
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
@@ -17,8 +17,13 @@ $(document).ready(function(){
|
||||
hoverable: true
|
||||
},
|
||||
xaxis: {
|
||||
mode: 'categories',
|
||||
tickLength: 0
|
||||
mode: 'time',
|
||||
tickLength: 0,
|
||||
minTickSize: [1, 'day'],
|
||||
timeformat: '%d %b'
|
||||
},
|
||||
yaxis: {
|
||||
tickDecimals: 0
|
||||
},
|
||||
lines: {
|
||||
lineWidth: 3
|
||||
@@ -112,7 +117,7 @@ $(document).ready(function(){
|
||||
}
|
||||
|
||||
function getXAxisLabel (el) {
|
||||
return el.find('[data-role="category"]').html();
|
||||
return el.find('[data-role="date"]').attr('data-value');
|
||||
}
|
||||
|
||||
function storeDatum (el, label) {
|
||||
@@ -200,7 +205,7 @@ $(document).ready(function(){
|
||||
}
|
||||
|
||||
function showTooltip(x, y, contents) {
|
||||
$('<div data-role="tooltip" class="tooltip in"><div class="tooltip-inner">' +
|
||||
$('<div data-role="tooltip" class="tooltip tooltip-graph in"><div class="tooltip-inner">' +
|
||||
contents +
|
||||
'</div></div>').css({top: y + 5,left: x + 5}).appendTo('body').fadeIn(200);
|
||||
}
|
||||
@@ -211,8 +216,13 @@ $(document).ready(function(){
|
||||
if (previousPoint != item.dataIndex) {
|
||||
previousPoint = item.dataIndex;
|
||||
$('[data-role="tooltip"]').remove();
|
||||
var y = item.datapoint[1].toFixed(0);
|
||||
var contents = '<h6 class="crunch">' + y + ' ' + item.series.label + '</h6>';
|
||||
var count = item.datapoint[1].toFixed(0);
|
||||
var date = $.plot.formatDate(new Date(item.datapoint[0]), '%d %b' +
|
||||
'<small> (%H:%M)</small>');
|
||||
var contents = '<p class="crunch">' +
|
||||
date + '<br/>' +
|
||||
count + ' ' + item.series.label +
|
||||
'</[h6]>';
|
||||
showTooltip(item.pageX, item.pageY, contents);
|
||||
}
|
||||
} else {
|
||||
|
4
public/js/site.min.js
vendored
4
public/js/site.min.js
vendored
File diff suppressed because one or more lines are too long
93
public/less/ie8and.less
Normal file
93
public/less/ie8and.less
Normal file
@@ -0,0 +1,93 @@
|
||||
// Making up for the non support of IE8 and IE7 in Bootstrap 3
|
||||
|
||||
// Amend the width of container if you want to here
|
||||
@container-md-ie8: @container-md;
|
||||
|
||||
@grid-adjustment: percentage(@grid-gutter-width / @container-md-ie8);
|
||||
|
||||
.ie7, .ie8 {
|
||||
* {
|
||||
box-sizing: content-box;
|
||||
}
|
||||
.clearfix {
|
||||
*zoom: 1;
|
||||
}
|
||||
ul, ol {
|
||||
margin-left:0;
|
||||
}
|
||||
|
||||
.container {
|
||||
width: @container-md-ie8;
|
||||
}
|
||||
|
||||
.col-md-1,
|
||||
.col-md-2,
|
||||
.col-md-3,
|
||||
.col-md-4,
|
||||
.col-md-5,
|
||||
.col-md-6,
|
||||
.col-md-7,
|
||||
.col-md-8,
|
||||
.col-md-9,
|
||||
.col-md-10,
|
||||
.col-md-11 {
|
||||
float: left;
|
||||
}
|
||||
.col-md-1 { width: percentage((1 / @grid-columns)) - @grid-adjustment; }
|
||||
.col-md-2 { width: percentage((2 / @grid-columns)) - @grid-adjustment; }
|
||||
.col-md-3 { width: percentage((3 / @grid-columns)) - @grid-adjustment; }
|
||||
.col-md-4 { width: percentage((4 / @grid-columns)) - @grid-adjustment; }
|
||||
.col-md-5 { width: percentage((5 / @grid-columns)) - @grid-adjustment; }
|
||||
.col-md-6 { width: percentage((6 / @grid-columns)) - @grid-adjustment; }
|
||||
.col-md-7 { width: percentage((7 / @grid-columns)) - @grid-adjustment; }
|
||||
.col-md-8 { width: percentage((8 / @grid-columns)) - @grid-adjustment; }
|
||||
.col-md-9 { width: percentage((9 / @grid-columns)) - @grid-adjustment; }
|
||||
.col-md-10 { width: percentage((10/ @grid-columns)) - @grid-adjustment; }
|
||||
.col-md-11 { width: percentage((11/ @grid-columns)) - @grid-adjustment; }
|
||||
.col-md-12 { width: 100% - @grid-adjustment; }
|
||||
|
||||
// Push and pull columns for source order changes
|
||||
.col-md-push-0 { left: auto; }
|
||||
.col-md-push-1 { left: percentage((1 / @grid-columns)); }
|
||||
.col-md-push-2 { left: percentage((2 / @grid-columns)); }
|
||||
.col-md-push-3 { left: percentage((3 / @grid-columns)); }
|
||||
.col-md-push-4 { left: percentage((4 / @grid-columns)); }
|
||||
.col-md-push-5 { left: percentage((5 / @grid-columns)); }
|
||||
.col-md-push-6 { left: percentage((6 / @grid-columns)); }
|
||||
.col-md-push-7 { left: percentage((7 / @grid-columns)); }
|
||||
.col-md-push-8 { left: percentage((8 / @grid-columns)); }
|
||||
.col-md-push-9 { left: percentage((9 / @grid-columns)); }
|
||||
.col-md-push-10 { left: percentage((10/ @grid-columns)); }
|
||||
.col-md-push-11 { left: percentage((11/ @grid-columns)); }
|
||||
|
||||
.col-md-pull-0 { right: auto; }
|
||||
.col-md-pull-1 { right: percentage((1 / @grid-columns)); }
|
||||
.col-md-pull-2 { right: percentage((2 / @grid-columns)); }
|
||||
.col-md-pull-3 { right: percentage((3 / @grid-columns)); }
|
||||
.col-md-pull-4 { right: percentage((4 / @grid-columns)); }
|
||||
.col-md-pull-5 { right: percentage((5 / @grid-columns)); }
|
||||
.col-md-pull-6 { right: percentage((6 / @grid-columns)); }
|
||||
.col-md-pull-7 { right: percentage((7 / @grid-columns)); }
|
||||
.col-md-pull-8 { right: percentage((8 / @grid-columns)); }
|
||||
.col-md-pull-9 { right: percentage((9 / @grid-columns)); }
|
||||
.col-md-pull-10 { right: percentage((10/ @grid-columns)); }
|
||||
.col-md-pull-11 { right: percentage((11/ @grid-columns)); }
|
||||
|
||||
// Offsets
|
||||
.col-md-offset-0 { margin-left: 0; }
|
||||
.col-md-offset-1 { margin-left: percentage((1 / @grid-columns)); }
|
||||
.col-md-offset-2 { margin-left: percentage((2 / @grid-columns)); }
|
||||
.col-md-offset-3 { margin-left: percentage((3 / @grid-columns)); }
|
||||
.col-md-offset-4 { margin-left: percentage((4 / @grid-columns)); }
|
||||
.col-md-offset-5 { margin-left: percentage((5 / @grid-columns)); }
|
||||
.col-md-offset-6 { margin-left: percentage((6 / @grid-columns)); }
|
||||
.col-md-offset-7 { margin-left: percentage((7 / @grid-columns)); }
|
||||
.col-md-offset-8 { margin-left: percentage((8 / @grid-columns)); }
|
||||
.col-md-offset-9 { margin-left: percentage((9 / @grid-columns)); }
|
||||
.col-md-offset-10 { margin-left: percentage((10/ @grid-columns)); }
|
||||
.col-md-offset-11 { margin-left: percentage((11/ @grid-columns)); }
|
||||
|
||||
.clearfix {
|
||||
*zoom: 1;
|
||||
}
|
||||
}
|
@@ -58,4 +58,5 @@
|
||||
@import "site-responsive.less";
|
||||
|
||||
// Stupid ie
|
||||
@import "ie8and.less";
|
||||
@import "site-ie8and.less";
|
@@ -1,75 +1,5 @@
|
||||
// Making up for the non support of IE8 and IE7 in Bootstrap 3
|
||||
.ie7, .ie8 {
|
||||
.container {
|
||||
width: @container-md;
|
||||
}
|
||||
.col-md-1,
|
||||
.col-md-2,
|
||||
.col-md-3,
|
||||
.col-md-4,
|
||||
.col-md-5,
|
||||
.col-md-6,
|
||||
.col-md-7,
|
||||
.col-md-8,
|
||||
.col-md-9,
|
||||
.col-md-10,
|
||||
.col-md-11 {
|
||||
float: left;
|
||||
}
|
||||
.col-md-1 { width: percentage((1 / @grid-columns)); }
|
||||
.col-md-2 { width: percentage((2 / @grid-columns)); }
|
||||
.col-md-3 { width: percentage((3 / @grid-columns)); }
|
||||
.col-md-4 { width: percentage((4 / @grid-columns)); }
|
||||
.col-md-5 { width: percentage((5 / @grid-columns)); }
|
||||
.col-md-6 { width: percentage((6 / @grid-columns)); }
|
||||
.col-md-7 { width: percentage((7 / @grid-columns)); }
|
||||
.col-md-8 { width: percentage((8 / @grid-columns)); }
|
||||
.col-md-9 { width: percentage((9 / @grid-columns)); }
|
||||
.col-md-10 { width: percentage((10/ @grid-columns)); }
|
||||
.col-md-11 { width: percentage((11/ @grid-columns)); }
|
||||
.col-md-12 { width: 100%; }
|
||||
|
||||
// Push and pull columns for source order changes
|
||||
.col-md-push-0 { left: auto; }
|
||||
.col-md-push-1 { left: percentage((1 / @grid-columns)); }
|
||||
.col-md-push-2 { left: percentage((2 / @grid-columns)); }
|
||||
.col-md-push-3 { left: percentage((3 / @grid-columns)); }
|
||||
.col-md-push-4 { left: percentage((4 / @grid-columns)); }
|
||||
.col-md-push-5 { left: percentage((5 / @grid-columns)); }
|
||||
.col-md-push-6 { left: percentage((6 / @grid-columns)); }
|
||||
.col-md-push-7 { left: percentage((7 / @grid-columns)); }
|
||||
.col-md-push-8 { left: percentage((8 / @grid-columns)); }
|
||||
.col-md-push-9 { left: percentage((9 / @grid-columns)); }
|
||||
.col-md-push-10 { left: percentage((10/ @grid-columns)); }
|
||||
.col-md-push-11 { left: percentage((11/ @grid-columns)); }
|
||||
|
||||
.col-md-pull-0 { right: auto; }
|
||||
.col-md-pull-1 { right: percentage((1 / @grid-columns)); }
|
||||
.col-md-pull-2 { right: percentage((2 / @grid-columns)); }
|
||||
.col-md-pull-3 { right: percentage((3 / @grid-columns)); }
|
||||
.col-md-pull-4 { right: percentage((4 / @grid-columns)); }
|
||||
.col-md-pull-5 { right: percentage((5 / @grid-columns)); }
|
||||
.col-md-pull-6 { right: percentage((6 / @grid-columns)); }
|
||||
.col-md-pull-7 { right: percentage((7 / @grid-columns)); }
|
||||
.col-md-pull-8 { right: percentage((8 / @grid-columns)); }
|
||||
.col-md-pull-9 { right: percentage((9 / @grid-columns)); }
|
||||
.col-md-pull-10 { right: percentage((10/ @grid-columns)); }
|
||||
.col-md-pull-11 { right: percentage((11/ @grid-columns)); }
|
||||
|
||||
// Offsets
|
||||
.col-md-offset-0 { margin-left: 0; }
|
||||
.col-md-offset-1 { margin-left: percentage((1 / @grid-columns)); }
|
||||
.col-md-offset-2 { margin-left: percentage((2 / @grid-columns)); }
|
||||
.col-md-offset-3 { margin-left: percentage((3 / @grid-columns)); }
|
||||
.col-md-offset-4 { margin-left: percentage((4 / @grid-columns)); }
|
||||
.col-md-offset-5 { margin-left: percentage((5 / @grid-columns)); }
|
||||
.col-md-offset-6 { margin-left: percentage((6 / @grid-columns)); }
|
||||
.col-md-offset-7 { margin-left: percentage((7 / @grid-columns)); }
|
||||
.col-md-offset-8 { margin-left: percentage((8 / @grid-columns)); }
|
||||
.col-md-offset-9 { margin-left: percentage((9 / @grid-columns)); }
|
||||
.col-md-offset-10 { margin-left: percentage((10/ @grid-columns)); }
|
||||
.col-md-offset-11 { margin-left: percentage((11/ @grid-columns)); }
|
||||
|
||||
.legend {
|
||||
display: block;
|
||||
width: 100%;
|
||||
@@ -83,9 +13,6 @@
|
||||
.tooltip-inner {
|
||||
background-color: #000000;
|
||||
}
|
||||
.clearfix {
|
||||
*zoom: 1;
|
||||
}
|
||||
.date {
|
||||
font-size:85%;
|
||||
}
|
||||
@@ -98,34 +25,30 @@
|
||||
.stat-type {
|
||||
font-size:floor(@font-size-base * 0.65); // ~10px;
|
||||
}
|
||||
.aside .action-buttons .btn {
|
||||
width:79%;
|
||||
}
|
||||
.pull-right.dropdown-menu {
|
||||
right:134px;
|
||||
}
|
||||
.run-details .pull-right.dropdown-menu {
|
||||
right:64px;
|
||||
}
|
||||
.date-selector .btn-full-width {
|
||||
width:90%;
|
||||
}
|
||||
}
|
||||
|
||||
.ie7 {
|
||||
ul {
|
||||
margin-left:0;
|
||||
}
|
||||
.col-md-2 { width:14%; }
|
||||
.col-md-3 { width:22%; }
|
||||
.col-md-4 {
|
||||
width: 32%;
|
||||
padding:0 5px;
|
||||
}
|
||||
.col-md-9 { width:72%; }
|
||||
.col-md-10 { width:80%; }
|
||||
.col-md-12 { width: 97%; }
|
||||
|
||||
.aside .task-stats li {
|
||||
width:31.5%;
|
||||
}
|
||||
.aside .action-buttons .btn {
|
||||
width:79%;
|
||||
}
|
||||
.date-selector {
|
||||
zoom:1;
|
||||
}
|
||||
.zfix {
|
||||
position:relative;
|
||||
z-index:100;
|
||||
z-index:1001;
|
||||
}
|
||||
.list-group li .list-group-item {
|
||||
margin:0;
|
||||
@@ -137,5 +60,24 @@
|
||||
}
|
||||
.date-selector {
|
||||
margin-top:-155px;
|
||||
|
||||
.btn-full-width {
|
||||
width:100%;
|
||||
}
|
||||
}
|
||||
.sr-only {
|
||||
position:relative;
|
||||
}
|
||||
.breadcrumb li {
|
||||
vertical-align: top;
|
||||
zoom: 1;
|
||||
display: inline;
|
||||
margin-right:10px;
|
||||
}
|
||||
.pull-right.dropdown-menu {
|
||||
right:0px;
|
||||
}
|
||||
.run-details .pull-right.dropdown-menu {
|
||||
right:82px;
|
||||
}
|
||||
}
|
@@ -10,7 +10,7 @@
|
||||
.date-links.hidden {
|
||||
display:none !important;
|
||||
}
|
||||
.date-selector .btn-group:hover ul.date-links {
|
||||
.btn-group:hover ul {
|
||||
display:block !important;
|
||||
}
|
||||
table.hidden {
|
||||
|
@@ -36,11 +36,13 @@
|
||||
.other-tasks {
|
||||
.sr-only();
|
||||
}
|
||||
.action-buttons,
|
||||
.task-stats,
|
||||
.btn-full-width {
|
||||
margin-bottom:0;
|
||||
}
|
||||
.action-buttons {
|
||||
margin-bottom:20px;
|
||||
}
|
||||
.aside {
|
||||
margin-bottom:15px;
|
||||
}
|
||||
@@ -54,7 +56,7 @@
|
||||
float:none;
|
||||
|
||||
li {
|
||||
width:33%;
|
||||
width:25%;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -75,6 +77,7 @@
|
||||
}
|
||||
.action-buttons {
|
||||
margin-top:10px;
|
||||
margin-bottom:0;
|
||||
|
||||
.btn-full-width {
|
||||
margin-bottom:10px;
|
||||
@@ -126,6 +129,11 @@
|
||||
margin-bottom:20px;
|
||||
}
|
||||
}
|
||||
.footer .nav {
|
||||
li {
|
||||
width:50%;
|
||||
}
|
||||
}
|
||||
}
|
||||
@media (max-width:479px) {
|
||||
.graph {
|
||||
|
@@ -87,14 +87,10 @@
|
||||
margin-bottom:0;
|
||||
}
|
||||
}
|
||||
.delete-button {
|
||||
.options-button {
|
||||
position:absolute;
|
||||
top:5px;
|
||||
right:20px;
|
||||
color:@brand-danger;
|
||||
}
|
||||
.delete-button:hover {
|
||||
color:lighten(@brand-danger, 8%);
|
||||
}
|
||||
.footer a, .breadcrumb a {
|
||||
text-decoration:underline;
|
||||
@@ -188,10 +184,10 @@
|
||||
transition: background 0.5s;
|
||||
-webkit-transition: background 0.5s;
|
||||
}
|
||||
.delete-button {
|
||||
.options-button {
|
||||
display:none;
|
||||
}
|
||||
&:hover .delete-button {
|
||||
&:hover .options-button {
|
||||
display:block;
|
||||
}
|
||||
.task-card-link:hover,
|
||||
@@ -211,6 +207,9 @@
|
||||
text-align:center;
|
||||
color:@badge-color;
|
||||
}
|
||||
.dropdown-menu {
|
||||
top:25px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -383,6 +382,14 @@ ul.date-links {
|
||||
margin-top:-24px;
|
||||
margin-right:35px
|
||||
}
|
||||
.flot-x-axis {
|
||||
.flot-tick-label {
|
||||
max-width:45px !important;
|
||||
}
|
||||
}
|
||||
.tooltip-graph {
|
||||
font-size:12px;
|
||||
}
|
||||
|
||||
/* New task page */
|
||||
.standards-lists {
|
||||
@@ -406,8 +413,3 @@ ul.date-links {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Sidebar */
|
||||
.action-buttons {
|
||||
margin-bottom:30px;
|
||||
}
|
||||
|
@@ -15,7 +15,7 @@ function route (app) {
|
||||
}
|
||||
res.render('task/delete', {
|
||||
task: presentTask(task),
|
||||
isTaskPage: true
|
||||
isTaskSubPage: true
|
||||
});
|
||||
});
|
||||
});
|
||||
|
72
route/task/edit.js
Normal file
72
route/task/edit.js
Normal file
@@ -0,0 +1,72 @@
|
||||
'use strict';
|
||||
|
||||
var _ = require('underscore');
|
||||
var presentTask = require('../../view/presenter/task');
|
||||
var getStandards = require('../../data/standards');
|
||||
|
||||
module.exports = route;
|
||||
|
||||
// Route definition
|
||||
function route (app) {
|
||||
|
||||
app.express.get('/:id/edit', function (req, res, next) {
|
||||
app.webservice.task(req.params.id).get({}, function (err, task) {
|
||||
if (err) {
|
||||
return next();
|
||||
}
|
||||
var standards = getStandards().map(function (standard) {
|
||||
if (standard.title === task.standard) {
|
||||
standard.selected = true;
|
||||
}
|
||||
standard.rules = standard.rules.map(function (rule) {
|
||||
if (task.ignore.indexOf(rule.name) !== -1) {
|
||||
rule.ignored = true;
|
||||
}
|
||||
return rule;
|
||||
});
|
||||
return standard;
|
||||
});
|
||||
res.render('task/edit', {
|
||||
edited: (typeof req.query.edited !== 'undefined'),
|
||||
standards: standards,
|
||||
task: presentTask(task),
|
||||
isTaskSubPage: true
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
app.express.post('/:id/edit', function (req, res, next) {
|
||||
app.webservice.task(req.params.id).get({}, function (err, task) {
|
||||
if (err) {
|
||||
return next();
|
||||
}
|
||||
req.body.ignore = req.body.ignore || [];
|
||||
app.webservice.task(req.params.id).edit(req.body, function (err) {
|
||||
if (err) {
|
||||
task.name = req.body.name;
|
||||
task.ignore = req.body.ignore;
|
||||
var standards = getStandards().map(function (standard) {
|
||||
if (standard.title === task.standard) {
|
||||
standard.selected = true;
|
||||
}
|
||||
standard.rules = standard.rules.map(function (rule) {
|
||||
if (task.ignore.indexOf(rule.name) !== -1) {
|
||||
rule.ignored = true;
|
||||
}
|
||||
return rule;
|
||||
});
|
||||
return standard;
|
||||
});
|
||||
return res.render('task/edit', {
|
||||
error: err,
|
||||
standards: standards,
|
||||
task: task,
|
||||
isTaskSubPage: true
|
||||
});
|
||||
}
|
||||
res.redirect('/' + req.params.id + '/edit?edited');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
}
|
@@ -39,13 +39,27 @@ describe('GET /', function () {
|
||||
assert.strictEqual(tasks[2].querySelectorAll('[href="/abc000000000000000000003"]').length, 1);
|
||||
});
|
||||
|
||||
it('should display a delete button for each task', function () {
|
||||
it('should display an "Edit" button for each task', function () {
|
||||
var tasks = this.last.dom.querySelectorAll('[data-test=task]');
|
||||
assert.strictEqual(tasks[0].querySelectorAll('[href="/abc000000000000000000001/edit"]').length, 1);
|
||||
assert.strictEqual(tasks[1].querySelectorAll('[href="/abc000000000000000000002/edit"]').length, 1);
|
||||
assert.strictEqual(tasks[2].querySelectorAll('[href="/abc000000000000000000003/edit"]').length, 1);
|
||||
});
|
||||
|
||||
it('should display a "Delete" button for each task', function () {
|
||||
var tasks = this.last.dom.querySelectorAll('[data-test=task]');
|
||||
assert.strictEqual(tasks[0].querySelectorAll('[href="/abc000000000000000000001/delete"]').length, 1);
|
||||
assert.strictEqual(tasks[1].querySelectorAll('[href="/abc000000000000000000002/delete"]').length, 1);
|
||||
assert.strictEqual(tasks[2].querySelectorAll('[href="/abc000000000000000000003/delete"]').length, 1);
|
||||
});
|
||||
|
||||
it('should display a "Run" button for each task', function () {
|
||||
var tasks = this.last.dom.querySelectorAll('[data-test=task]');
|
||||
assert.strictEqual(tasks[0].querySelectorAll('[href="/abc000000000000000000001/run"]').length, 1);
|
||||
assert.strictEqual(tasks[1].querySelectorAll('[href="/abc000000000000000000002/run"]').length, 1);
|
||||
assert.strictEqual(tasks[2].querySelectorAll('[href="/abc000000000000000000003/run"]').length, 1);
|
||||
});
|
||||
|
||||
it('should display the task result counts if the task has been run', function () {
|
||||
var tasks = this.last.dom.querySelectorAll('[data-test=task]');
|
||||
assert.match(tasks[0].textContent, /1\s*errors/i);
|
||||
|
@@ -25,6 +25,10 @@ describe('GET /<task-id>/delete', function () {
|
||||
assert.strictEqual(form.getAttribute('method'), 'post');
|
||||
});
|
||||
|
||||
it('should display a link back to the task page', function () {
|
||||
assert.greaterThan(this.last.dom.querySelectorAll('[href="/abc000000000000000000001"]').length, 0);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
describe('POST /<task-id>/delete', function () {
|
||||
|
102
test/functional/route/task/edit.js
Normal file
102
test/functional/route/task/edit.js
Normal file
@@ -0,0 +1,102 @@
|
||||
/* global beforeEach, describe, it */
|
||||
/* jshint maxlen: false, maxstatements: false */
|
||||
'use strict';
|
||||
|
||||
var assert = require('proclaim');
|
||||
|
||||
describe('GET /<task-id>/edit', function () {
|
||||
|
||||
beforeEach(function (done) {
|
||||
var req = {
|
||||
method: 'GET',
|
||||
endpoint: '/abc000000000000000000001/edit'
|
||||
};
|
||||
this.navigate(req, done);
|
||||
});
|
||||
|
||||
it('should send a 200 status', function () {
|
||||
assert.strictEqual(this.last.status, 200);
|
||||
});
|
||||
|
||||
it('should have an "Edit URL" form', function () {
|
||||
var form = this.last.dom.querySelectorAll('[data-test=edit-url-form]')[0];
|
||||
assert.isDefined(form);
|
||||
assert.strictEqual(form.getAttribute('action'), '/abc000000000000000000001/edit');
|
||||
assert.strictEqual(form.getAttribute('method'), 'post');
|
||||
});
|
||||
|
||||
it('should display a link back to the task page', function () {
|
||||
assert.greaterThan(this.last.dom.querySelectorAll('[href="/abc000000000000000000001"]').length, 0);
|
||||
});
|
||||
|
||||
describe('"Edit URL" form', function () {
|
||||
|
||||
beforeEach(function () {
|
||||
this.form = this.last.dom.querySelectorAll('[data-test=edit-url-form]')[0];
|
||||
});
|
||||
|
||||
it('should have a "name" field', function () {
|
||||
var field = this.form.querySelectorAll('input[name=name]')[0];
|
||||
assert.isDefined(field);
|
||||
assert.strictEqual(field.getAttribute('type'), 'text');
|
||||
assert.strictEqual(field.getAttribute('value'), 'NPG Home');
|
||||
});
|
||||
|
||||
it('should have a disabled "url" field', function () {
|
||||
var field = this.form.querySelectorAll('input[name=url]')[0];
|
||||
assert.isDefined(field);
|
||||
assert.strictEqual(field.getAttribute('type'), 'url');
|
||||
assert.strictEqual(field.getAttribute('value'), 'nature.com');
|
||||
assert.isDefined(field.getAttribute('disabled'));
|
||||
});
|
||||
|
||||
it('should have a disabled "standard" field', function () {
|
||||
var field = this.form.querySelectorAll('select[name=standard]')[0];
|
||||
assert.isDefined(field);
|
||||
assert.isDefined(field.getAttribute('disabled'));
|
||||
});
|
||||
|
||||
it('should have "ignore" fields', function () {
|
||||
var fields = this.form.querySelectorAll('input[name="ignore[]"]');
|
||||
assert.isDefined(fields);
|
||||
assert.notStrictEqual(fields.length, 0);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
describe('POST /<task-id>/edit', function () {
|
||||
|
||||
beforeEach(function (done) {
|
||||
var req = {
|
||||
method: 'POST',
|
||||
endpoint: '/abc000000000000000000001/edit',
|
||||
body: {
|
||||
name: 'foo',
|
||||
ignore: ['bar', 'baz']
|
||||
}
|
||||
};
|
||||
this.navigate(req, done);
|
||||
});
|
||||
|
||||
it('should send a 200 status', function () {
|
||||
assert.strictEqual(this.last.status, 200);
|
||||
});
|
||||
|
||||
it('should edit the task', function (done) {
|
||||
this.webservice.task('abc000000000000000000001').get({}, function (err, task) {
|
||||
assert.strictEqual(task.name, 'foo');
|
||||
assert.deepEqual(task.ignore, ['bar', 'baz']);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('should display a success message', function () {
|
||||
var alert = this.last.dom.querySelectorAll('[data-test=alert]')[0];
|
||||
assert.isDefined(alert);
|
||||
assert.match(alert.textContent, /been saved/i);
|
||||
});
|
||||
|
||||
});
|
||||
|
@@ -20,22 +20,24 @@ describe('GET /<task-id>', function () {
|
||||
assert.strictEqual(this.last.status, 200);
|
||||
});
|
||||
|
||||
it('should display an "Edit" button', function () {
|
||||
assert.strictEqual(this.last.dom.querySelectorAll('[href="/abc000000000000000000001/edit"]').length, 1);
|
||||
});
|
||||
|
||||
it('should display a "Delete" button', function () {
|
||||
assert.strictEqual(this.last.dom.querySelectorAll('[href="/abc000000000000000000001/delete"]').length, 1);
|
||||
});
|
||||
|
||||
it('should display a "Run" button', function () {
|
||||
var elem = this.last.dom.querySelectorAll('[data-test=run-task]');
|
||||
assert.strictEqual(elem.length, 1);
|
||||
assert.strictEqual(elem[0].getAttribute('href'), '/abc000000000000000000001/run');
|
||||
assert.strictEqual(this.last.dom.querySelectorAll('[href="/abc000000000000000000001/run"]').length, 1);
|
||||
});
|
||||
|
||||
it('should display a "Download CSV" button for the latest result', function () {
|
||||
var elem = this.last.dom.querySelectorAll('[data-test=download-csv]');
|
||||
assert.strictEqual(elem.length, 1);
|
||||
assert.strictEqual(elem[0].getAttribute('href'), '/abc000000000000000000001/def000000000000000000001.csv');
|
||||
assert.strictEqual(this.last.dom.querySelectorAll('[href="/abc000000000000000000001/def000000000000000000001.csv"]').length, 1);
|
||||
});
|
||||
|
||||
it('should display a "Download JSON" button for the latest result', function () {
|
||||
var elem = this.last.dom.querySelectorAll('[data-test=download-json]');
|
||||
assert.strictEqual(elem.length, 1);
|
||||
assert.strictEqual(elem[0].getAttribute('href'), '/abc000000000000000000001/def000000000000000000001.json');
|
||||
assert.strictEqual(this.last.dom.querySelectorAll('[href="/abc000000000000000000001/def000000000000000000001.json"]').length, 1);
|
||||
});
|
||||
|
||||
it('should display links to all results', function () {
|
||||
|
@@ -17,4 +17,9 @@ function helper (register) {
|
||||
return moment(context).fromNow();
|
||||
});
|
||||
|
||||
register('date-timestamp', function (context) {
|
||||
return moment(context).valueOf();
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
@@ -17,7 +17,7 @@
|
||||
<meta name="viewport" content="width=device-width"/>
|
||||
|
||||
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Lato:400,700,900,400italic"/>
|
||||
<link rel="stylesheet" href="/css/site.min.css"/>
|
||||
<link rel="stylesheet" href="/css/site.min.css?v={{version}}"/>
|
||||
|
||||
</head>
|
||||
<!--[if IE 7]><body class="ie7"><![endif]-->
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
{{> page-footer}}
|
||||
|
||||
<script type="text/javascript" src="/js/site.min.js"></script>
|
||||
<script type="text/javascript" src="/js/site.min.js?v={{version}}"></script>
|
||||
<!--[if lte IE 8]><script language="javascript" type="text/javascript" src="/js/vendor/flot/excanvas.min.js"></script><![endif]-->
|
||||
|
||||
</body>
|
||||
|
@@ -7,13 +7,16 @@
|
||||
{{#if isNewTaskPage}}
|
||||
<li class="active">Add URL</li>
|
||||
{{/if}}
|
||||
{{#if isTaskPage}}
|
||||
{{#if isTaskPage}}
|
||||
<li class="active">{{task.name}}</li>
|
||||
{{/if}}
|
||||
{{#if isTaskSubPage}}
|
||||
<li><a href="{{task.href}}">{{task.name}}</a></li>
|
||||
{{/if}}
|
||||
{{#if isResultPage}}
|
||||
<li><a href="{{task.href}}">{{task.name}}</a></li>
|
||||
<li class="active">Results for {{date-format mainResult.date format="DD MMM YYYY"}}</li>
|
||||
{{/if}}
|
||||
<li class="active">Results for {{date-format mainResult.date format="DD MMM YYYY"}}</li>
|
||||
{{/if}}
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -23,7 +23,7 @@
|
||||
<tbody>
|
||||
{{#results}}
|
||||
<tr data-role="url-stats">
|
||||
<td data-role="category">{{date-format date format="DD MMM YYYY"}}</td>
|
||||
<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>
|
||||
|
@@ -1,10 +1,10 @@
|
||||
<footer>
|
||||
<div class="footer" role="contentinfo">
|
||||
<div class="container">
|
||||
<div class="col-md-7">
|
||||
<div class="col-md-5">
|
||||
<small>© {{year}} Nature Publishing Group.<br/>pa11y dashboard is licensed under the GNU General Public License 3.0.<br/>Version {{version}}</small>
|
||||
</div>
|
||||
<div class="col-md-5 clearfix">
|
||||
<div class="col-md-7 clearfix">
|
||||
<ul class="crunch-bottom floated-list nav">
|
||||
<li>
|
||||
<a href="{{repo}}">GitHub Repo</a>
|
||||
@@ -15,6 +15,9 @@
|
||||
<li>
|
||||
<a href="http://www.w3.org/TR/WCAG20/">WCAG 2.0 spec</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="http://squizlabs.github.io/HTML_CodeSniffer/">HTML_CodeSniffer</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -22,21 +22,16 @@
|
||||
</a>
|
||||
</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>
|
||||
<!-- ########### Functionality to be done ############# -->
|
||||
<!-- List of other URLs -->
|
||||
<!-- <div class="other-tasks well">
|
||||
<h4 class="crunch-top ruled-sm">Your other tracked URLs</h4>
|
||||
<p>No other URLs</p>
|
||||
|
||||
|
||||
<ul class="list-unstyled crunch-bottom">
|
||||
<li><a href="empty-task">rowanmanning.com</a></li>
|
||||
<li><a href="task">nature.com</a></li>
|
||||
</ul>
|
||||
</div> -->
|
||||
<!-- ##################### End ######################## -->
|
||||
</div>
|
||||
|
||||
<div class="col-md-9">
|
||||
@@ -105,7 +100,7 @@
|
||||
{{#if task.ignore.length}}
|
||||
<div class="heading label-default">
|
||||
<span data-role="expander" class="pull-right expander"> + </span>
|
||||
Ignored Rules
|
||||
Ignored Rules ( {{task.ignore.length}} )
|
||||
</div>
|
||||
<div class="task-default tasks-list collapse clearfix">
|
||||
<ul class="list-unstyled">
|
||||
|
@@ -1,4 +1,4 @@
|
||||
<div class="col-md-12">
|
||||
<div class="col-md-12 zfix">
|
||||
<div class="ruled task-header">
|
||||
<div class="row clearfix">
|
||||
<div class="col-md-9 col-sm-9">
|
||||
@@ -7,9 +7,15 @@
|
||||
</div>
|
||||
<div class="col-md-3 col-sm-3 text-right run-details">
|
||||
{{#unless readonly}}
|
||||
<a href="{{task.hrefRun}}" class="btn btn-success" data-test="run-task">
|
||||
Run <span class="glyphicon glyphicon-play"></span>
|
||||
</a>
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown">Options <span class="caret"></span></button>
|
||||
<ul class="dropdown-menu pull-right" role="menu">
|
||||
<li><a href="/{{task.id}}/edit">Edit this task</a></li>
|
||||
<li><a href="/{{task.id}}/delete">Delete this task</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="{{task.hrefRun}}" data-test="run-task">Run pa11y</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
{{/unless}}
|
||||
{{#if mainResult}}
|
||||
<div class="date">Last run : {{date-format mainResult.date format="DD MMM YYYY"}}</div>
|
||||
|
@@ -2,7 +2,6 @@
|
||||
<ul class="list-unstyled clearfix crunch-bottom">
|
||||
<li class="col-md-4 col-sm-6 task-card add-task">
|
||||
{{#if readonly}}
|
||||
{{! TODO PERRY: make this look disabled }}
|
||||
<span class="well task-card-link crunch-bottom">
|
||||
<p class="h3 crunch">Add new URL</p>
|
||||
<p class="supersize-me crunch">+</p>
|
||||
@@ -33,7 +32,15 @@
|
||||
{{/if}}
|
||||
</a>
|
||||
{{#unless ../readonly}}
|
||||
<a title="Delete this URL" class="delete-button" href="{{hrefDelete}}"><span class="sr-only">Delete </span><span class="glyphicon glyphicon-remove"></span></a>
|
||||
<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>
|
||||
<ul class="dropdown-menu pull-right" role="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>
|
||||
<li><a href="{{href}}/run" data-test="run-task">Run pa11y</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
{{/unless}}
|
||||
</li>
|
||||
{{/each}}
|
||||
|
25
view/presenter/ignore.js
Normal file
25
view/presenter/ignore.js
Normal file
@@ -0,0 +1,25 @@
|
||||
'use strict';
|
||||
|
||||
var standardsArray = require('../../data/standards')();
|
||||
var rules = createStandardDescriptionMap(standardsArray);
|
||||
|
||||
module.exports = presentIgnoreRules;
|
||||
|
||||
function presentIgnoreRules (ignore) {
|
||||
return ignore.map(function (name) {
|
||||
return {
|
||||
name: name,
|
||||
description: rules[name]
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
function createStandardDescriptionMap (standards) {
|
||||
var map = {};
|
||||
standards.forEach(function (standard) {
|
||||
standard.rules.forEach(function (rule) {
|
||||
map[rule.name] = rule.description;
|
||||
});
|
||||
});
|
||||
return map;
|
||||
}
|
@@ -1,6 +1,7 @@
|
||||
'use strict';
|
||||
|
||||
var _ = require('underscore');
|
||||
var presentIgnoreRules = require('./ignore');
|
||||
|
||||
module.exports = presentResult;
|
||||
|
||||
@@ -14,6 +15,9 @@ function presentResult (result) {
|
||||
// Parse date
|
||||
result.date = new Date(result.date);
|
||||
|
||||
// Enhance the ignored rules
|
||||
result.ignore = presentIgnoreRules(result.ignore);
|
||||
|
||||
// Split out message types
|
||||
if (result.results) {
|
||||
var groupedByType = _.groupBy(result.results, 'type');
|
||||
|
@@ -1,9 +1,8 @@
|
||||
'use strict';
|
||||
|
||||
var _ = require('underscore');
|
||||
var presentIgnoreRules = require('./ignore');
|
||||
var presentResult = require('./result');
|
||||
var standardsArray = require('../../data/standards')();
|
||||
var rules = createStandardDescriptionMap(standardsArray);
|
||||
|
||||
module.exports = presentTask;
|
||||
|
||||
@@ -14,14 +13,10 @@ function presentTask (task) {
|
||||
task.hrefDelete = '/' + task.id + '/delete';
|
||||
task.hrefRun = '/' + task.id + '/run';
|
||||
task.hrefJson = '/' + task.id + '.json';
|
||||
task.hrefEdit = '/' + task.id + '/edit';
|
||||
|
||||
// Enhance the ignored rules
|
||||
task.ignore = task.ignore.map(function (name) {
|
||||
return {
|
||||
name: name,
|
||||
description: rules[name]
|
||||
};
|
||||
});
|
||||
task.ignore = presentIgnoreRules(task.ignore);
|
||||
|
||||
// Present the last result if present
|
||||
if (task.last_result) {
|
||||
@@ -31,13 +26,3 @@ function presentTask (task) {
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
function createStandardDescriptionMap (standards) {
|
||||
var map = {};
|
||||
standards.forEach(function (standard) {
|
||||
standard.rules.forEach(function (rule) {
|
||||
map[rule.name] = rule.description;
|
||||
});
|
||||
});
|
||||
return map;
|
||||
}
|
||||
|
87
view/task/edit.html
Normal file
87
view/task/edit.html
Normal file
@@ -0,0 +1,87 @@
|
||||
|
||||
{{#content "title"}}
|
||||
Edit URL
|
||||
{{/content}}
|
||||
|
||||
{{#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>
|
||||
<strong>Success!</strong>
|
||||
<p>Your changes have been saved.</p>
|
||||
</div>
|
||||
</div>
|
||||
{{/edited}}
|
||||
|
||||
<form role="form" class="col-md-12" action="/{{task.id}}/edit" method="post" data-test="edit-url-form">
|
||||
|
||||
<div class="legend">
|
||||
<h1 class="h2 crunch-top">Edit URL</h1>
|
||||
</div>
|
||||
|
||||
{{#error}}
|
||||
<div class="col-md-12 clearfix" data-test="error">
|
||||
<div class="row">
|
||||
<div class="alert alert-danger">
|
||||
<strong>Oh my gosh!</strong>
|
||||
<p>{{.}}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{/error}}
|
||||
|
||||
<div class="form-group clearfix">
|
||||
<div class="row">
|
||||
<div class="col-md-8 col-sm-8 col-xs-10">
|
||||
<label class="control-label" for="new-task-name">Name</label>
|
||||
<input class="form-control" id="new-task-name" type="text" placeholder="E.g. My Home Page" name="name" value="{{task.name}}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group clearfix">
|
||||
<div class="row">
|
||||
<div class="col-md-8 col-sm-8 col-xs-10">
|
||||
<label class="control-label" for="new-task-url">URL</label>
|
||||
<input class="form-control" id="new-task-url" type="url" placeholder="E.g. http://mysite.com/" name="url" value="{{task.url}}" disabled/>
|
||||
</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-standard">Standard</label>
|
||||
<select data-role="new-task-select" class="form-control" id="new-task-standard" name="standard" disabled>
|
||||
{{#standards}}
|
||||
<option {{#selected}}selected{{/selected}}>{{title}}</option>
|
||||
{{/standards}}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="control-label"><b>Ignore these rules</b> <a target="_blank" href="https://github.com/nature/pa11y/wiki/HTML-CodeSniffer-Rules">(full list of rules here)</a></p>
|
||||
|
||||
<div class="standards-lists">
|
||||
{{#standards}}
|
||||
<div data-role="standards-list" data-attr="{{title}}" class="form-group">
|
||||
<p class="control-label rules-list-title ruled"><b>{{title}} Rules</b></p>
|
||||
<ul class="list-unstyled">
|
||||
{{#rules}}
|
||||
<li>
|
||||
<input class="pull-left" id="{{name}}" type="checkbox" name="ignore[]" value="{{name}}" {{#ignored}}checked{{/ignored}}/>
|
||||
<label for="{{name}}" title="{{description}}" data-role="rules-tooltip" class="checkbox">
|
||||
{{name}}
|
||||
</label>
|
||||
</li>
|
||||
{{/rules}}
|
||||
</ul>
|
||||
</div>
|
||||
{{/standards}}
|
||||
</div>
|
||||
|
||||
<button type="submit" 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>
|
Reference in New Issue
Block a user