AuditFilter.js (2248B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 const React = require("resource://devtools/client/shared/vendor/react.mjs"); 8 const PropTypes = require("resource://devtools/client/shared/vendor/react-prop-types.mjs"); 9 const { 10 connect, 11 } = require("resource://devtools/client/shared/vendor/react-redux.js"); 12 13 const { 14 isFiltered, 15 } = require("resource://devtools/client/accessibility/utils/audit.js"); 16 const { 17 FILTERS, 18 } = require("resource://devtools/client/accessibility/constants.js"); 19 const { 20 accessibility: { 21 AUDIT_TYPE, 22 SCORES: { BEST_PRACTICES, FAIL, WARNING }, 23 }, 24 } = require("resource://devtools/shared/constants.js"); 25 26 function validateCheck({ error, score }) { 27 return !error && [BEST_PRACTICES, FAIL, WARNING].includes(score); 28 } 29 30 const AUDIT_TYPE_TO_FILTER = { 31 [AUDIT_TYPE.CONTRAST]: { 32 filterKey: FILTERS.CONTRAST, 33 validator: validateCheck, 34 }, 35 [AUDIT_TYPE.KEYBOARD]: { 36 filterKey: FILTERS.KEYBOARD, 37 validator: validateCheck, 38 }, 39 [AUDIT_TYPE.TEXT_LABEL]: { 40 filterKey: FILTERS.TEXT_LABEL, 41 validator: validateCheck, 42 }, 43 }; 44 45 class AuditFilter extends React.Component { 46 static get propTypes() { 47 return { 48 checks: PropTypes.object, 49 children: PropTypes.any, 50 filters: PropTypes.object.isRequired, 51 }; 52 } 53 54 isVisible(filters) { 55 return !isFiltered(filters); 56 } 57 58 shouldHide() { 59 const { filters, checks } = this.props; 60 if (this.isVisible(filters)) { 61 return false; 62 } 63 64 if (!checks || Object.values(checks).every(check => check == null)) { 65 return true; 66 } 67 68 for (const type in checks) { 69 if ( 70 AUDIT_TYPE_TO_FILTER[type] && 71 checks[type] && 72 filters[AUDIT_TYPE_TO_FILTER[type].filterKey] && 73 AUDIT_TYPE_TO_FILTER[type].validator(checks[type]) 74 ) { 75 return false; 76 } 77 } 78 79 return true; 80 } 81 82 render() { 83 return this.shouldHide() ? null : this.props.children; 84 } 85 } 86 87 const mapStateToProps = ({ audit: { filters } }) => { 88 return { filters }; 89 }; 90 91 module.exports = connect(mapStateToProps)(AuditFilter);