Skip to content

Commit 1d89958

Browse files
author
Courtney Nguyen
committed
Added tests, and switched rule from erroring to warning
1 parent aa41427 commit 1d89958

File tree

3 files changed

+74
-26
lines changed

3 files changed

+74
-26
lines changed
+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/* eslint-env jest */
2+
/**
3+
* @fileoverview Enforce autoFocus prop is not used.
4+
* @author Courtney Nguyen <@courtyenn>
5+
*/
6+
7+
// -----------------------------------------------------------------------------
8+
// Requirements
9+
// -----------------------------------------------------------------------------
10+
11+
import { RuleTester } from 'eslint';
12+
import rule from '../../../src/rules/no-disabled';
13+
import parserOptionsMapper from '../../__util__/parserOptionsMapper';
14+
15+
// -----------------------------------------------------------------------------
16+
// Tests
17+
// -----------------------------------------------------------------------------
18+
19+
const ruleTester = new RuleTester();
20+
21+
const expectedWarning = {
22+
message: 'The disabled prop removes the element from being detected by screen readers.',
23+
type: 'JSXAttribute',
24+
};
25+
26+
ruleTester.run('no-disabled', rule, {
27+
valid: [
28+
{ code: '<div />' },
29+
{ code: '<div disabled />' },
30+
{ code: '<input />' },
31+
{ code: '<button />' },
32+
{ code: '<select />' },
33+
{ code: '<textarea />' },
34+
{ code: '<option />' },
35+
{ code: '<command />' },
36+
{ code: '<fieldset />' },
37+
{ code: '<keygen />' },
38+
{ code: '<optgroup />' },
39+
].map(parserOptionsMapper),
40+
invalid: [
41+
{ code: '<input disabled />', errors: [expectedWarning] },
42+
{ code: '<button disabled />', errors: [expectedWarning] },
43+
{ code: '<select disabled />', errors: [expectedWarning] },
44+
{ code: '<textarea disabled />', errors: [expectedWarning] },
45+
{ code: '<option disabled />', errors: [expectedWarning] },
46+
{ code: '<command disabled />', errors: [expectedWarning] },
47+
{ code: '<fieldset disabled />', errors: [expectedWarning] },
48+
{ code: '<keygen disabled />', errors: [expectedWarning] },
49+
{ code: '<optgroup disabled />', errors: [expectedWarning] },
50+
].map(parserOptionsMapper),
51+
});

src/index.js

+3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ module.exports = {
2626
'mouse-events-have-key-events': require('./rules/mouse-events-have-key-events'),
2727
'no-access-key': require('./rules/no-access-key'),
2828
'no-autofocus': require('./rules/no-autofocus'),
29+
'no-disabled': require('./rules/no-disabled'),
2930
'no-distracting-elements': require('./rules/no-distracting-elements'),
3031
'no-interactive-element-to-noninteractive-role': require('./rules/no-interactive-element-to-noninteractive-role'),
3132
'no-noninteractive-element-interactions': require('./rules/no-noninteractive-element-interactions'),
@@ -113,6 +114,7 @@ module.exports = {
113114
'jsx-a11y/mouse-events-have-key-events': 'error',
114115
'jsx-a11y/no-access-key': 'error',
115116
'jsx-a11y/no-autofocus': 'error',
117+
'jsx-a11y/no-disabled': 'warn',
116118
'jsx-a11y/no-distracting-elements': 'error',
117119
'jsx-a11y/no-interactive-element-to-noninteractive-role': [
118120
'error',
@@ -270,6 +272,7 @@ module.exports = {
270272
'jsx-a11y/mouse-events-have-key-events': 'error',
271273
'jsx-a11y/no-access-key': 'error',
272274
'jsx-a11y/no-autofocus': 'error',
275+
'jsx-a11y/no-disabled': 'warn',
273276
'jsx-a11y/no-distracting-elements': 'error',
274277
'jsx-a11y/no-interactive-element-to-noninteractive-role': 'error',
275278
'jsx-a11y/no-noninteractive-element-interactions': [

src/rules/no-disabled.js

+20-26
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,50 @@
11
/**
2-
* @fileoverview Enforce disabled prop is not used.
3-
* @author Courtney Nguyen <@courtyen>
2+
* @fileoverview Rule to flag 'disabled' prop
3+
* @author Courtney Nguyen <@courtyenn>
44
*/
55

66
// ----------------------------------------------------------------------------
77
// Rule Definition
88
// ----------------------------------------------------------------------------
99

10-
import { propName, elementType } from "jsx-ast-utils";
11-
import { generateObjSchema } from "../util/schemas";
10+
import { propName, elementType } from 'jsx-ast-utils';
1211

13-
const errorMessage = "The disabled prop should not be used, as it can reduce usability and accessibility for users.";
12+
const warningMessage = 'The disabled prop removes the element from being detected by screen readers.';
1413

1514
const DEFAULT_ELEMENTS = [
16-
"button",
17-
"command",
18-
"fieldset",
19-
"keygen",
20-
"optgroup",
21-
"option",
22-
"select",
23-
"textarea",
24-
"input",
15+
'button',
16+
'command',
17+
'fieldset',
18+
'keygen',
19+
'optgroup',
20+
'option',
21+
'select',
22+
'textarea',
23+
'input',
2524
];
2625

27-
const schema = generateObjSchema({
28-
ignoreNonDOM: {
29-
type: "boolean",
30-
default: false,
31-
},
32-
});
33-
3426
export default {
3527
meta: {
28+
type: 'suggestion',
3629
docs: {
37-
url: "https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-disabled.md",
30+
recommended: false,
31+
url: 'https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-disabled.md',
3832
},
39-
schema: [schema],
33+
schema: [],
4034
},
4135

4236
create: (context) => ({
4337
JSXAttribute: (attribute) => {
44-
// Only monitor elements with "disabled".
38+
// Only monitor eligible elements for "disabled".
4539
const type = elementType(attribute.parent);
4640
if (!DEFAULT_ELEMENTS.includes(type)) {
4741
return;
4842
}
4943

50-
if (propName(attribute) === "disabled") {
44+
if (propName(attribute) === 'disabled') {
5145
context.report({
5246
node: attribute,
53-
message: errorMessage,
47+
message: warningMessage,
5448
});
5549
}
5650
},

0 commit comments

Comments
 (0)