diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index d71b720b..24984e29 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -3,6 +3,7 @@ module.exports = {
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
+ "plugin:jsx-a11y/recommended",
'airbnb',
'airbnb-typescript',
],
@@ -15,7 +16,7 @@ module.exports = {
project: "./tsconfig.json",
sourceType: "module"
},
- plugins: ["react", "@typescript-eslint"],
+ plugins: ["react", "@typescript-eslint", "jsx-a11y"],
settings: {
react: {
pragma: "React",
@@ -26,7 +27,6 @@ module.exports = {
root: true,
ignorePatterns: ["public/injectEnv.js", "public/js/session.js"],
rules: {
- // Note: you must disable the base rule as it can report incorrect errors
"react/jsx-filename-extension": [1, { extensions: [".js", ".jsx", ".tsx", ".ts"] }],
"no-empty-function": "warn",
"@typescript-eslint/no-empty-function": "error",
@@ -36,7 +36,6 @@ module.exports = {
"react/display-name": "off",
"@typescript-eslint/comma-dangle": "off",
"import/prefer-default-export": "off",
- "jsx-a11y/anchor-is-valid": "off",
"comma-dangle": "off",
"max-len": "off",
"no-console": "warn",
diff --git a/package-lock.json b/package-lock.json
index bb6b8618..d5356bf5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,14 +21,10 @@
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
- "@types/jest": "^27.5.2",
- "@types/react": "^18.2.6",
- "@types/react-dom": "^18.2.4",
"data-model-navigator": "github:CBIIT/Data-Model-Navigator#CRDC-DH",
"dayjs": "^1.11.8",
"graphql": "^16.7.1",
"lodash": "^4.17.21",
- "nprogress": "^0.2.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-helmet-async": "^1.3.0",
@@ -42,8 +38,13 @@
"web-vitals": "^2.1.4"
},
"devDependencies": {
+ "@axe-core/react": "^4.8.1",
+ "@types/jest": "^29.5.11",
+ "@types/jest-axe": "^3.5.9",
"@types/lodash": "^4.14.198",
"@types/node": "^20.4.0",
+ "@types/react": "^18.2.42",
+ "@types/react-dom": "^18.2.17",
"@types/redux": "^3.6.0",
"@types/redux-logger": "^3.0.10",
"@types/redux-thunk": "^2.1.0",
@@ -53,6 +54,8 @@
"eslint": "^8.40.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-airbnb-typescript": "^17.0.0",
+ "eslint-plugin-jsx-a11y": "^6.8.0",
+ "jest-axe": "^8.0.0",
"typescript": "^5.0.4"
}
},
@@ -137,6 +140,16 @@
}
}
},
+ "node_modules/@axe-core/react": {
+ "version": "4.8.2",
+ "resolved": "https://registry.npmjs.org/@axe-core/react/-/react-4.8.2.tgz",
+ "integrity": "sha512-FwDtrUuKOyeorrpxhU9n1TK6Lh/LWeRuBk9Ym4JoH5cTISvifcqYfVV2fEc3vnUFABvsjBxfBGsfJdUiKTqE8w==",
+ "dev": true,
+ "dependencies": {
+ "axe-core": "~4.8.2",
+ "requestidlecallback": "^0.3.0"
+ }
+ },
"node_modules/@babel/cli": {
"version": "7.22.5",
"license": "MIT",
@@ -2841,6 +2854,25 @@
"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
}
},
+ "node_modules/@jest/expect-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
+ "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
+ "dependencies": {
+ "jest-get-type": "^29.6.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/expect-utils/node_modules/jest-get-type": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
"node_modules/@jest/fake-timers": {
"version": "27.5.1",
"license": "MIT",
@@ -4953,11 +4985,204 @@
}
},
"node_modules/@types/jest": {
- "version": "27.5.2",
- "license": "MIT",
+ "version": "29.5.11",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.11.tgz",
+ "integrity": "sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==",
+ "dependencies": {
+ "expect": "^29.0.0",
+ "pretty-format": "^29.0.0"
+ }
+ },
+ "node_modules/@types/jest-axe": {
+ "version": "3.5.9",
+ "resolved": "https://registry.npmjs.org/@types/jest-axe/-/jest-axe-3.5.9.tgz",
+ "integrity": "sha512-z98CzR0yVDalCEuhGXXO4/zN4HHuSebAukXDjTLJyjEAgoUf1H1i+sr7SUB/mz8CRS/03/XChsx0dcLjHkndoQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/jest": "*",
+ "axe-core": "^3.5.5"
+ }
+ },
+ "node_modules/@types/jest-axe/node_modules/axe-core": {
+ "version": "3.5.6",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.6.tgz",
+ "integrity": "sha512-LEUDjgmdJoA3LqklSTwKYqkjcZ4HKc4ddIYGSAiSkr46NTjzg2L9RNB+lekO9P7Dlpa87+hBtzc2Fzn/+GUWMQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@types/jest/node_modules/@jest/schemas": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "dependencies": {
+ "@sinclair/typebox": "^0.27.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/@jest/types": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+ "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/@sinclair/typebox": {
+ "version": "0.27.8",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="
+ },
+ "node_modules/@types/jest/node_modules/@types/yargs": {
+ "version": "17.0.32",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz",
+ "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/jest/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@types/jest/node_modules/diff-sequences": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
+ "dependencies": {
+ "@jest/expect-utils": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/jest-diff": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
+ "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^29.6.3",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/jest-get-type": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/jest-matcher-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
+ "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/jest-message-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
+ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^29.6.3",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/jest-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+ "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
"dependencies": {
- "jest-matcher-utils": "^27.0.0",
- "pretty-format": "^27.0.0"
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/@types/json-schema": {
@@ -5026,8 +5251,9 @@
"license": "MIT"
},
"node_modules/@types/react": {
- "version": "18.2.8",
- "license": "MIT",
+ "version": "18.2.42",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.42.tgz",
+ "integrity": "sha512-c1zEr96MjakLYus/wPnuWDo1/zErfdU9rNsIGmE+NV71nx88FG9Ttgo5dqorXTu/LImX2f63WBP986gJkMPNbA==",
"dependencies": {
"@types/prop-types": "*",
"@types/scheduler": "*",
@@ -5035,8 +5261,9 @@
}
},
"node_modules/@types/react-dom": {
- "version": "18.2.4",
- "license": "MIT",
+ "version": "18.2.17",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.17.tgz",
+ "integrity": "sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==",
"dependencies": {
"@types/react": "*"
}
@@ -5742,10 +5969,11 @@
"license": "Python-2.0"
},
"node_modules/aria-query": {
- "version": "5.1.3",
- "license": "Apache-2.0",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
+ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
"dependencies": {
- "deep-equal": "^2.0.5"
+ "dequal": "^2.0.3"
}
},
"node_modules/array-buffer-byte-length": {
@@ -5764,13 +5992,14 @@
"license": "MIT"
},
"node_modules/array-includes": {
- "version": "3.1.6",
- "license": "MIT",
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz",
+ "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==",
"dependencies": {
"call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "get-intrinsic": "^1.1.3",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
"is-string": "^1.0.7"
},
"engines": {
@@ -5804,12 +6033,13 @@
}
},
"node_modules/array.prototype.flatmap": {
- "version": "1.3.1",
- "license": "MIT",
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
+ "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
"dependencies": {
"call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
"es-shim-unscopables": "^1.0.0"
},
"engines": {
@@ -5871,13 +6101,22 @@
"license": "MIT"
},
"node_modules/ast-types-flow": {
- "version": "0.0.7",
- "license": "ISC"
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="
},
"node_modules/async": {
"version": "3.2.4",
"license": "MIT"
},
+ "node_modules/asynciterator.prototype": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz",
+ "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ }
+ },
"node_modules/asynckit": {
"version": "0.4.0",
"license": "MIT"
@@ -5942,8 +6181,10 @@
}
},
"node_modules/axe-core": {
- "version": "4.7.2",
- "license": "MPL-2.0",
+ "version": "4.8.2",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz",
+ "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==",
+ "dev": true,
"engines": {
"node": ">=4"
}
@@ -5982,10 +6223,11 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/axobject-query": {
- "version": "3.1.1",
- "license": "Apache-2.0",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz",
+ "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==",
"dependencies": {
- "deep-equal": "^2.0.5"
+ "dequal": "^2.0.3"
}
},
"node_modules/babel-jest": {
@@ -7724,33 +7966,6 @@
"version": "0.3.8",
"license": "MIT"
},
- "node_modules/deep-equal": {
- "version": "2.2.1",
- "license": "MIT",
- "dependencies": {
- "array-buffer-byte-length": "^1.0.0",
- "call-bind": "^1.0.2",
- "es-get-iterator": "^1.1.3",
- "get-intrinsic": "^1.2.0",
- "is-arguments": "^1.1.1",
- "is-array-buffer": "^3.0.2",
- "is-date-object": "^1.0.5",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.2",
- "isarray": "^2.0.5",
- "object-is": "^1.1.5",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.4",
- "regexp.prototype.flags": "^1.5.0",
- "side-channel": "^1.0.4",
- "which-boxed-primitive": "^1.0.2",
- "which-collection": "^1.0.1",
- "which-typed-array": "^1.1.9"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/deep-is": {
"version": "0.1.4",
"license": "MIT"
@@ -8184,22 +8399,25 @@
"version": "1.0.0",
"license": "MIT"
},
- "node_modules/es-get-iterator": {
- "version": "1.1.3",
- "license": "MIT",
+ "node_modules/es-iterator-helpers": {
+ "version": "1.0.15",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz",
+ "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==",
"dependencies": {
+ "asynciterator.prototype": "^1.0.0",
"call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.1",
+ "es-set-tostringtag": "^2.0.1",
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.2.1",
+ "globalthis": "^1.0.3",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
- "is-arguments": "^1.1.1",
- "is-map": "^2.0.2",
- "is-set": "^2.0.2",
- "is-string": "^1.0.7",
- "isarray": "^2.0.5",
- "stop-iteration-iterator": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "internal-slot": "^1.0.5",
+ "iterator.prototype": "^1.1.2",
+ "safe-array-concat": "^1.0.1"
}
},
"node_modules/es-module-lexer": {
@@ -8611,25 +8829,26 @@
}
},
"node_modules/eslint-plugin-jsx-a11y": {
- "version": "6.7.1",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.20.7",
- "aria-query": "^5.1.3",
- "array-includes": "^3.1.6",
- "array.prototype.flatmap": "^1.3.1",
- "ast-types-flow": "^0.0.7",
- "axe-core": "^4.6.2",
- "axobject-query": "^3.1.1",
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz",
+ "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.2",
+ "aria-query": "^5.3.0",
+ "array-includes": "^3.1.7",
+ "array.prototype.flatmap": "^1.3.2",
+ "ast-types-flow": "^0.0.8",
+ "axe-core": "=4.7.0",
+ "axobject-query": "^3.2.1",
"damerau-levenshtein": "^1.0.8",
"emoji-regex": "^9.2.2",
- "has": "^1.0.3",
- "jsx-ast-utils": "^3.3.3",
- "language-tags": "=1.0.5",
+ "es-iterator-helpers": "^1.0.15",
+ "hasown": "^2.0.0",
+ "jsx-ast-utils": "^3.3.5",
+ "language-tags": "^1.0.9",
"minimatch": "^3.1.2",
- "object.entries": "^1.1.6",
- "object.fromentries": "^2.0.6",
- "semver": "^6.3.0"
+ "object.entries": "^1.1.7",
+ "object.fromentries": "^2.0.7"
},
"engines": {
"node": ">=4.0"
@@ -8638,11 +8857,12 @@
"eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
}
},
- "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": {
- "version": "6.3.0",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
+ "node_modules/eslint-plugin-jsx-a11y/node_modules/axe-core": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz",
+ "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==",
+ "engines": {
+ "node": ">=4"
}
},
"node_modules/eslint-plugin-react": {
@@ -9847,6 +10067,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/hasown": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+ "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/hast-util-whitespace": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz",
@@ -10287,20 +10518,6 @@
"node": ">= 10"
}
},
- "node_modules/is-arguments": {
- "version": "1.1.1",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-array-buffer": {
"version": "3.0.2",
"license": "MIT",
@@ -10317,6 +10534,20 @@
"version": "0.2.1",
"license": "MIT"
},
+ "node_modules/is-async-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
+ "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-bigint": {
"version": "1.0.4",
"license": "MIT",
@@ -10404,6 +10635,17 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-finalizationregistry": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
+ "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"license": "MIT",
@@ -10418,6 +10660,20 @@
"node": ">=6"
}
},
+ "node_modules/is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-glob": {
"version": "4.0.3",
"license": "MIT",
@@ -10434,7 +10690,8 @@
},
"node_modules/is-map": {
"version": "2.0.2",
- "license": "MIT",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
+ "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -10531,7 +10788,8 @@
},
"node_modules/is-set": {
"version": "2.0.2",
- "license": "MIT",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
+ "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -10606,7 +10864,8 @@
},
"node_modules/is-weakmap": {
"version": "2.0.1",
- "license": "MIT",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
+ "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -10623,7 +10882,8 @@
},
"node_modules/is-weakset": {
"version": "2.0.2",
- "license": "MIT",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
+ "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
"dependencies": {
"call-bind": "^1.0.2",
"get-intrinsic": "^1.1.1"
@@ -10720,6 +10980,18 @@
"node": ">=8"
}
},
+ "node_modules/iterator.prototype": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz",
+ "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "reflect.getprototypeof": "^1.0.4",
+ "set-function-name": "^2.0.1"
+ }
+ },
"node_modules/jake": {
"version": "10.8.7",
"license": "Apache-2.0",
@@ -10773,6 +11045,138 @@
}
}
},
+ "node_modules/jest-axe": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/jest-axe/-/jest-axe-8.0.0.tgz",
+ "integrity": "sha512-4kNcNn7J0jPO4jANEYZOHeQ/tSBvkXS+MxTbX1CKbXGd0+ZbRGDn/v/8IYWI/MmYX15iLVyYRnRev9X3ksePWA==",
+ "dev": true,
+ "dependencies": {
+ "axe-core": "4.7.2",
+ "chalk": "4.1.2",
+ "jest-matcher-utils": "29.2.2",
+ "lodash.merge": "4.6.2"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/jest-axe/node_modules/@jest/schemas": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "dev": true,
+ "dependencies": {
+ "@sinclair/typebox": "^0.27.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-axe/node_modules/@sinclair/typebox": {
+ "version": "0.27.8",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
+ "dev": true
+ },
+ "node_modules/jest-axe/node_modules/axe-core": {
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz",
+ "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/jest-axe/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jest-axe/node_modules/diff-sequences": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+ "dev": true,
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-axe/node_modules/jest-diff": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
+ "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^29.6.3",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-axe/node_modules/jest-get-type": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
+ "dev": true,
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-axe/node_modules/jest-matcher-utils": {
+ "version": "29.2.2",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.2.2.tgz",
+ "integrity": "sha512-4DkJ1sDPT+UX2MR7Y3od6KtvRi9Im1ZGLGgdLFLm4lPexbTaCgJW5NN3IOXlQHF7NSHY/VHhflQ+WoKtD/vyCw==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^29.2.1",
+ "jest-get-type": "^29.2.0",
+ "pretty-format": "^29.2.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-axe/node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-axe/node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
"node_modules/jest-changed-files": {
"version": "27.5.1",
"license": "MIT",
@@ -11973,11 +12377,14 @@
}
},
"node_modules/jsx-ast-utils": {
- "version": "3.3.3",
- "license": "MIT",
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
"dependencies": {
- "array-includes": "^3.1.5",
- "object.assign": "^4.1.3"
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
},
"engines": {
"node": ">=4.0"
@@ -12041,13 +12448,18 @@
},
"node_modules/language-subtag-registry": {
"version": "0.3.22",
- "license": "CC0-1.0"
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
+ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w=="
},
"node_modules/language-tags": {
- "version": "1.0.5",
- "license": "MIT",
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
"dependencies": {
- "language-subtag-registry": "~0.3.2"
+ "language-subtag-registry": "^0.3.20"
+ },
+ "engines": {
+ "node": ">=0.10"
}
},
"node_modules/launch-editor": {
@@ -13088,10 +13500,6 @@
"node": ">=8"
}
},
- "node_modules/nprogress": {
- "version": "0.2.0",
- "license": "MIT"
- },
"node_modules/nth-check": {
"version": "2.1.1",
"license": "BSD-2-Clause",
@@ -13127,20 +13535,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/object-is": {
- "version": "1.1.5",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/object-keys": {
"version": "1.1.1",
"license": "MIT",
@@ -13165,24 +13559,26 @@
}
},
"node_modules/object.entries": {
- "version": "1.1.6",
- "license": "MIT",
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
+ "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
"dependencies": {
"call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/object.fromentries": {
- "version": "2.0.6",
- "license": "MIT",
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
+ "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
"dependencies": {
"call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
},
"engines": {
"node": ">= 0.4"
@@ -15336,6 +15732,25 @@
"redux": "^4"
}
},
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz",
+ "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "globalthis": "^1.0.3",
+ "which-builtin-type": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/regenerate": {
"version": "1.4.2",
"license": "MIT"
@@ -15458,6 +15873,12 @@
"strip-ansi": "^6.0.1"
}
},
+ "node_modules/requestidlecallback": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/requestidlecallback/-/requestidlecallback-0.3.0.tgz",
+ "integrity": "sha512-TWHFkT7S9p7IxLC5A1hYmAYQx2Eb9w1skrXmQ+dS1URyvR8tenMLl4lHbqEOUnpEYxNKpkVMXUgknVpBZWXXfQ==",
+ "dev": true
+ },
"node_modules/require-directory": {
"version": "2.1.1",
"license": "MIT",
@@ -16235,16 +16656,6 @@
"node": ">= 0.8"
}
},
- "node_modules/stop-iteration-iterator": {
- "version": "1.0.0",
- "license": "MIT",
- "dependencies": {
- "internal-slot": "^1.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/string_decoder": {
"version": "1.1.1",
"license": "MIT",
@@ -18094,9 +18505,35 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/which-builtin-type": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz",
+ "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==",
+ "dependencies": {
+ "function.prototype.name": "^1.1.5",
+ "has-tostringtag": "^1.0.0",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.0.5",
+ "is-finalizationregistry": "^1.0.2",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.1.4",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.0.2",
+ "which-collection": "^1.0.1",
+ "which-typed-array": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/which-collection": {
"version": "1.0.1",
- "license": "MIT",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
+ "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
"dependencies": {
"is-map": "^2.0.1",
"is-set": "^2.0.1",
diff --git a/package.json b/package.json
index e1c3e9b2..9f93053c 100644
--- a/package.json
+++ b/package.json
@@ -16,14 +16,10 @@
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
- "@types/jest": "^27.5.2",
- "@types/react": "^18.2.6",
- "@types/react-dom": "^18.2.4",
"data-model-navigator": "github:CBIIT/Data-Model-Navigator#CRDC-DH",
"dayjs": "^1.11.8",
"graphql": "^16.7.1",
"lodash": "^4.17.21",
- "nprogress": "^0.2.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-helmet-async": "^1.3.0",
@@ -69,8 +65,13 @@
]
},
"devDependencies": {
+ "@axe-core/react": "^4.8.1",
+ "@types/jest": "^29.5.11",
+ "@types/jest-axe": "^3.5.9",
"@types/lodash": "^4.14.198",
"@types/node": "^20.4.0",
+ "@types/react": "^18.2.42",
+ "@types/react-dom": "^18.2.17",
"@types/redux": "^3.6.0",
"@types/redux-logger": "^3.0.10",
"@types/redux-thunk": "^2.1.0",
@@ -80,6 +81,8 @@
"eslint": "^8.40.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-airbnb-typescript": "^17.0.0",
+ "eslint-plugin-jsx-a11y": "^6.8.0",
+ "jest-axe": "^8.0.0",
"typescript": "^5.0.4"
}
}
diff --git a/public/index.html b/public/index.html
index d2b83393..08497b3e 100644
--- a/public/index.html
+++ b/public/index.html
@@ -20,7 +20,7 @@
-
+
diff --git a/src/components/DataSubmissions/DataSubmissionBatchTable.tsx b/src/components/DataSubmissions/DataSubmissionBatchTable.tsx
index 16c7191e..6f25ffe2 100644
--- a/src/components/DataSubmissions/DataSubmissionBatchTable.tsx
+++ b/src/components/DataSubmissions/DataSubmissionBatchTable.tsx
@@ -1,7 +1,5 @@
/* eslint-disable react/no-array-index-key */
import {
- Box,
- CircularProgress,
Table,
TableBody,
TableCell,
@@ -17,6 +15,7 @@ import {
import { ElementType, forwardRef, useEffect, useImperativeHandle, useMemo, useState } from "react";
import { useAuthContext } from "../Contexts/AuthContext";
import PaginationActions from "./PaginationActions";
+import SuspenseLoader from '../SuspenseLoader';
const StyledTableContainer = styled(TableContainer)({
borderRadius: "8px",
@@ -215,23 +214,7 @@ const DataSubmissionBatchTable = ({
return (
- {loading && (
-
-
-
- )}
+ {loading && ()}
@@ -309,7 +292,8 @@ const DataSubmissionBatchTable = ({
|| total <= (page + 1) * perPage
|| emptyRows > 0
|| loading
- }}
+ }}
+ SelectProps={{ inputProps: { "aria-label": "rows per page" }, native: true }}
backIconButtonProps={{ disabled: page === 0 || loading }}
ActionsComponent={PaginationActions}
/>
diff --git a/src/components/DataSubmissions/DataSubmissionUpload.tsx b/src/components/DataSubmissions/DataSubmissionUpload.tsx
index cc0f73af..bf09ccb6 100644
--- a/src/components/DataSubmissions/DataSubmissionUpload.tsx
+++ b/src/components/DataSubmissions/DataSubmissionUpload.tsx
@@ -311,6 +311,7 @@ const DataSubmissionUpload = ({ submitterID, readOnly, onUpload }: Props) => {
ref={uploadMetatadataInputRef}
type="file"
accept={acceptedExtensions.toString()}
+ aria-label="Upload metadata files"
onChange={handleChooseFiles}
readOnly={readOnly}
multiple
diff --git a/src/components/Footer/FooterDesktop.tsx b/src/components/Footer/FooterDesktop.tsx
index b217fa20..ea468e31 100644
--- a/src/components/Footer/FooterDesktop.tsx
+++ b/src/components/Footer/FooterDesktop.tsx
@@ -2,7 +2,7 @@ import React, { useState, useRef } from 'react';
import styled from 'styled-components';
import FooterData from '../../config/globalFooterData';
-const FooterStyled = styled.footer`
+const FooterStyled = styled.div`
background-color: #1B496E;
border-top: 1px solid #6C727B;
bottom: 0;
@@ -15,7 +15,7 @@ const FooterContainer = styled.div`
padding: 2rem 2rem 2rem 2rem;
max-width: 1400px;
margin-left: auto;
- margin-right: auto;
+ margin-right: auto;
display: flex;
justify-content: space-between;
@@ -215,18 +215,13 @@ const BottomFooter = styled.div`
font-family: 'Open Sans';
font-style: normal;
font-weight: 400;
- font-size: 14px;
+ font-size: 14px;
line-height: 1.6;
text-align: right;
color: #FFFFFF;
}
`;
-const StyledAsterisk = styled("span")(() => ({
- color: "#D54309",
- marginLeft: "2px",
-}));
-
const FooterDesktop = () => {
const [emailContent, setEmailContent] = useState("");
const emailForm = useRef(null);
@@ -288,7 +283,6 @@ const FooterDesktop = () => {
diff --git a/src/components/Footer/FooterMobile.tsx b/src/components/Footer/FooterMobile.tsx
index e6f1b2fa..cfbea842 100644
--- a/src/components/Footer/FooterMobile.tsx
+++ b/src/components/Footer/FooterMobile.tsx
@@ -74,7 +74,7 @@ const FooterLinksContainer = styled.div`
display: flex;
flex-direction: column;
.footItem {
- width: 253px;
+ width: 253px;
}
.footItemTitle {
@@ -151,7 +151,7 @@ const FooterLinksContainer = styled.div`
margin-right: 0.25rem;
}
.rotate{
- transform: rotate(90deg);
+ transform: rotate(90deg);
}
`;
@@ -283,11 +283,6 @@ const BottomFooter = styled.div`
}
`;
-const StyledAsterisk = styled("span")(() => ({
- color: "#D54309",
- marginLeft: "2px",
-}));
-
const FooterMobile = () => {
const [emailContent, setEmailContent] = useState("");
const emailForm = useRef(null);
@@ -358,7 +353,6 @@ const FooterMobile = () => {
diff --git a/src/components/Footer/FooterTablet.tsx b/src/components/Footer/FooterTablet.tsx
index 7fd9ab61..512a9fd1 100644
--- a/src/components/Footer/FooterTablet.tsx
+++ b/src/components/Footer/FooterTablet.tsx
@@ -15,7 +15,7 @@ const FooterContainer = styled.div`
padding: 2rem 1rem 0 1rem;
max-width: 1420px;
margin-left: auto;
- margin-right: auto;
+ margin-right: auto;
display: flex;
justify-content: space-between;
@@ -237,11 +237,6 @@ const BottomFooter = styled.div`
}
`;
-const StyledAsterisk = styled("span")(() => ({
- color: "#D54309",
- marginLeft: "2px",
-}));
-
const FooterTablet = () => {
const [emailContent, setEmailContent] = useState("");
const emailForm = useRef(null);
@@ -304,7 +299,6 @@ const FooterTablet = () => {
diff --git a/src/components/Footer/index.test.tsx b/src/components/Footer/index.test.tsx
new file mode 100644
index 00000000..4c0515f3
--- /dev/null
+++ b/src/components/Footer/index.test.tsx
@@ -0,0 +1,12 @@
+import 'jest-axe/extend-expect';
+
+import { axe } from 'jest-axe';
+import { render } from '@testing-library/react';
+import Footer from './index';
+
+it('should not have any accessibility violations', async () => {
+ const { container } = render();
+ const results = await axe(container);
+
+ expect(results).toHaveNoViolations();
+});
diff --git a/src/components/Footer/index.tsx b/src/components/Footer/index.tsx
index 018ffc14..c0dd1bcc 100644
--- a/src/components/Footer/index.tsx
+++ b/src/components/Footer/index.tsx
@@ -1,59 +1,21 @@
-import React from 'react';
-import styled from 'styled-components';
+import { useMediaQuery } from '@mui/material';
import FooterDesktop from './FooterDesktop';
import FooterTablet from './FooterTablet';
import FooterMobile from './FooterMobile';
-const FooterContainer = styled.div`
- @media (min-width: 1024px) {
- .desktop {
- display: block;
- }
- .tablet {
- display: none;
- }
- .mobile {
- display: none;
- }
- }
+const Footer = () => {
+ const tablet = useMediaQuery("(min-width: 768px) and (max-width: 1024px)");
+ const mobile = useMediaQuery("(max-width: 767px)");
- @media (min-width:768px) and (max-width: 1024px) {
- .desktop {
- display: none;
- }
- .tablet {
- display: block;
- }
- .mobile {
- display: none;
- }
+ if (mobile) {
+ return ;
}
- @media (max-width: 768px) {
- .desktop {
- display: none;
- }
- .tablet {
- display: none;
- }
- .mobile {
- display: block;
- }
+ if (tablet) {
+ return ;
}
-`;
-const Footer = () => (
-
-
-
-
-
-
-
-
-
-
-
- );
+ return ;
+};
export default Footer;
diff --git a/src/components/Header/HeaderDesktop.tsx b/src/components/Header/HeaderDesktop.tsx
index bc2eceb1..02f35b4f 100644
--- a/src/components/Header/HeaderDesktop.tsx
+++ b/src/components/Header/HeaderDesktop.tsx
@@ -15,12 +15,12 @@ const HeaderContainer = styled.div`
`;
const Header = () => (
-
+
- );
+);
export default Header;
diff --git a/src/components/Header/HeaderTabletAndMobile.tsx b/src/components/Header/HeaderTabletAndMobile.tsx
index c93d0bde..3259d0d7 100644
--- a/src/components/Header/HeaderTabletAndMobile.tsx
+++ b/src/components/Header/HeaderTabletAndMobile.tsx
@@ -254,7 +254,7 @@ const Header = () => {
You have been logged out.
-
+
diff --git a/src/components/Header/components/NavbarDesktop.tsx b/src/components/Header/components/NavbarDesktop.tsx
index b490955b..688c50c3 100644
--- a/src/components/Header/components/NavbarDesktop.tsx
+++ b/src/components/Header/components/NavbarDesktop.tsx
@@ -64,6 +64,8 @@ const UlContainer = styled.ul`
margin: 0;
padding-top: 17px;
padding-left: 11px;
+ display: flex;
+ width: 100%;
`;
const LiSection = styled.li`
@@ -82,12 +84,20 @@ const LiSection = styled.li`
.displayName {
color: #007BBD;
font-size: 14px;
- line-height: 21px;
+ line-height: 20px;
padding: 10px 0px;
text-align: right;
width: fit-content;
}
+ &.name-dropdown-li {
+ margin-left: auto;
+ }
+
+ &.login-button {
+ line-height: 48px;
+ }
+
.navTitle {
display: block;
color: #585C65;
@@ -332,7 +342,7 @@ const NameDropdown = styled.div`
`;
const StyledLoginLink = styled(Link)`
- color: #007BBD;
+ color: #007BBD !important;
text-align: right;
font-size: 14px;
font-family: Poppins;
@@ -496,27 +506,26 @@ const NavBar = () => {
);
})
}
-
- {authData.isLoggedIn
- ? (
-
-
-
- {displayName}
-
+
+ {authData.isLoggedIn ? (
+
) : (
)}
+
+
diff --git a/src/components/Header/index.test.tsx b/src/components/Header/index.test.tsx
new file mode 100644
index 00000000..adfbfecf
--- /dev/null
+++ b/src/components/Header/index.test.tsx
@@ -0,0 +1,43 @@
+import 'jest-axe/extend-expect';
+
+import { FC, useMemo } from 'react';
+import { BrowserRouter } from 'react-router-dom';
+import { axe } from 'jest-axe';
+import { render } from '@testing-library/react';
+import { MockedProvider } from '@apollo/client/testing';
+import Header from './index';
+import { ContextState, Context, Status } from '../Contexts/AuthContext';
+
+const Parent: FC<{ children: React.ReactElement, loggedIn: boolean }> = ({ children, loggedIn }) => {
+ const value: ContextState = useMemo(() => ({
+ isLoggedIn: loggedIn,
+ status: Status.LOADED,
+ user: null,
+ }), [loggedIn]);
+
+ return (
+
+
+
+ {children}
+
+
+
+ );
+};
+
+describe('should not have any accessibility violations', () => {
+ it('when logged in', async () => {
+ const { container } = render();
+ const results = await axe(container);
+
+ expect(results).toHaveNoViolations();
+ });
+
+ it('when logged out', async () => {
+ const { container } = render();
+ const results = await axe(container);
+
+ expect(results).toHaveNoViolations();
+ });
+});
diff --git a/src/components/Header/index.tsx b/src/components/Header/index.tsx
index 934b8fbb..8cfd2d6c 100644
--- a/src/components/Header/index.tsx
+++ b/src/components/Header/index.tsx
@@ -1,35 +1,17 @@
import { useState, useEffect } from 'react';
-import styled from 'styled-components';
+import { useMediaQuery } from '@mui/material';
import HeaderDesktop from './HeaderDesktop';
import HeaderTabletAndMobile from './HeaderTabletAndMobile';
import USABanner from './USABanner';
import GenericAlert from '../GenericAlert';
import { useAuthContext } from '../Contexts/AuthContext';
-const HeaderContainer = styled.div`
- @media (min-width: 1024px) {
- .desktop {
- display: block;
- }
- .tabletAndMobile {
- display: none;
- }
- }
-
- @media (max-width: 1024px) {
- .desktop {
- display: none;
- }
- .tabletAndMobile {
- display: block;
- }
- }
-
-`;
-
const Header = () => {
+ const tabletAndMobile = useMediaQuery("(max-width: 1024px)");
+
const [showLoginError, setShowLoginError] = useState(false);
const authContext = useAuthContext();
+
useEffect(() => {
if (authContext.error !== undefined) {
setShowLoginError(true);
@@ -42,15 +24,10 @@ const Header = () => {
{authContext.error}
-
+
+ {tabletAndMobile ? : }
+
>
);
};
diff --git a/src/components/PageBanner/index.test.tsx b/src/components/PageBanner/index.test.tsx
new file mode 100644
index 00000000..a0135cf3
--- /dev/null
+++ b/src/components/PageBanner/index.test.tsx
@@ -0,0 +1,16 @@
+import 'jest-axe/extend-expect';
+
+import { axe } from 'jest-axe';
+import { render } from '@testing-library/react';
+import { HelmetProvider } from 'react-helmet-async';
+import Banner from './index';
+
+it('should not have any accessibility violations', async () => {
+ const { container } = render(, {
+ wrapper: HelmetProvider,
+ });
+
+ const results = await axe(container);
+
+ expect(results).toHaveNoViolations();
+});
diff --git a/src/components/PageBanner/index.tsx b/src/components/PageBanner/index.tsx
index a2248d33..a7fdb2b8 100644
--- a/src/components/PageBanner/index.tsx
+++ b/src/components/PageBanner/index.tsx
@@ -22,7 +22,7 @@ const StyledBannerContentContainer = styled(Container)(({ padding } : { padding?
},
}));
-const StyledBannerTitle = styled("h2")({
+const StyledBannerTitle = styled("h1")({
maxWidth: "611px",
height: "79px",
display: "flex",
@@ -38,7 +38,7 @@ const StyledBannerTitle = styled("h2")({
margin: 0,
});
-const StyledBannerSubtitle = styled("h6")({
+const StyledBannerSubtitle = styled("h2")({
display: "flex",
maxWidth: "565px",
height: "59px",
@@ -76,9 +76,7 @@ const PageBanner: FC = ({
{title}
-
- {subTitle}
-
+ {subTitle && ({subTitle})}
{body}
diff --git a/src/components/ProgressBar/ProgressBar.test.tsx b/src/components/ProgressBar/ProgressBar.test.tsx
index 9910c520..5abb5314 100644
--- a/src/components/ProgressBar/ProgressBar.test.tsx
+++ b/src/components/ProgressBar/ProgressBar.test.tsx
@@ -1,7 +1,10 @@
-import React, { FC, useMemo } from 'react';
+import '@testing-library/jest-dom';
+import 'jest-axe/extend-expect';
+
+import { FC, useMemo } from 'react';
import { BrowserRouter } from 'react-router-dom';
import { render } from '@testing-library/react';
-import '@testing-library/jest-dom';
+import { axe } from 'jest-axe';
import config from '../../config/SectionConfig';
import ProgressBar from './ProgressBar';
import {
@@ -43,6 +46,58 @@ const BaseComponent: FC = ({ section, data = {} } : Props) => {
);
};
+describe("ProgressBar Accessibility Tests", () => {
+ const keys = Object.keys(config);
+
+ it("has no base accessibility violations", async () => {
+ const { container } = render();
+ const results = await axe(container);
+
+ expect(results).toHaveNoViolations();
+ });
+
+ it("has no accessibility violations when all sections are completed", async () => {
+ const data = {
+ questionnaireData: {
+ sections: keys.map((s) => ({ name: s, status: "Completed" })),
+ },
+ };
+
+ const { container } = render();
+ const results = await axe(container);
+
+ expect(results).toHaveNoViolations();
+ });
+
+ it("has no accessibility violations when the review section is accessible", async () => {
+ const data = {
+ status: "Approved",
+ questionnaireData: {
+ sections: keys.map((s) => ({ name: s, status: "Completed" })),
+ },
+ };
+
+ const { container } = render();
+ const results = await axe(container);
+
+ expect(results).toHaveNoViolations();
+ });
+
+ it("has no accessibility violations when the review section is inaccessible", async () => {
+ const data = {
+ status: "New",
+ questionnaireData: {
+ sections: keys.map((s) => ({ name: s, status: "Completed" })),
+ },
+ };
+
+ const { container } = render();
+ const results = await axe(container);
+
+ expect(results).toHaveNoViolations();
+ });
+});
+
describe("ProgressBar General Tests", () => {
const keys = Object.keys(config);
const sections = Object.values(config);
@@ -62,7 +117,7 @@ describe("ProgressBar General Tests", () => {
it("renders the currently active section as highlighted", () => {
const { container, getByTestId } = render();
- const activeLinks = container.querySelectorAll("a[aria-selected='true']");
+ const activeLinks = container.querySelectorAll("a[data-selected='true']");
expect(activeLinks.length).toBe(1);
expect(activeLinks[0]).toBe(getByTestId("progress-bar-section-1"));
diff --git a/src/components/ProgressBar/ProgressBar.tsx b/src/components/ProgressBar/ProgressBar.tsx
index d1ac2ddb..ff120d26 100644
--- a/src/components/ProgressBar/ProgressBar.tsx
+++ b/src/components/ProgressBar/ProgressBar.tsx
@@ -1,7 +1,7 @@
import React, { FC, useEffect, useState } from 'react';
import { Link } from 'react-router-dom';
import {
- List, ListItemText, ListItemButton,
+ List, ListItem, ListItemText, ListItemButton,
Stack, ListItemAvatar, styled
} from '@mui/material';
import config from '../../config/SectionConfig';
@@ -25,12 +25,7 @@ type ProgressSection = {
const StyledList = styled(List)({
marginTop: "22px",
width: '250px',
- "& a": {
- color: "inherit",
- textDecoration: "none",
- cursor: "unset",
- },
- "& a:not(:first-of-type) .MuiStack-root": {
+ "& li:not(:first-of-type) .MuiStack-root": {
marginTop: "24px",
},
"& .MuiListItemText-root": {
@@ -45,6 +40,16 @@ const StyledList = styled(List)({
},
});
+const StyledListItem = styled(ListItem)({
+ padding: 0,
+ "& a": {
+ width: "100%",
+ color: "inherit",
+ textDecoration: "none",
+ cursor: "unset",
+ },
+});
+
const StyledAvatar = styled(ListItemAvatar)({
minWidth: "43px",
});
@@ -117,24 +122,25 @@ const ProgressBar: FC = ({ section }) => {
return (
{sections.map(({ url, id, icon, title, disabled, selected }, idx) => (
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
))}
);
diff --git a/src/components/Questionnaire/AutocompleteInput.tsx b/src/components/Questionnaire/AutocompleteInput.tsx
index 8f1f77c7..deaee21d 100644
--- a/src/components/Questionnaire/AutocompleteInput.tsx
+++ b/src/components/Questionnaire/AutocompleteInput.tsx
@@ -158,7 +158,7 @@ const AutocompleteInput = ({
readOnly,
...rest
}: Props) => {
- const id = useId();
+ const id = rest.id || useId();
const [val, setVal] = useState(value);
const [error, setError] = useState(false);
@@ -249,6 +249,7 @@ const AutocompleteInput = ({
name={name}
required={required}
placeholder={placeholder}
+ id={id}
/>
)}
{...rest}
diff --git a/src/components/Questionnaire/DatePickerInput.tsx b/src/components/Questionnaire/DatePickerInput.tsx
index d6ade714..cd3770c9 100644
--- a/src/components/Questionnaire/DatePickerInput.tsx
+++ b/src/components/Questionnaire/DatePickerInput.tsx
@@ -139,7 +139,7 @@ const DatePickerInput: FC = ({
readOnly,
...rest
}) => {
- const id = useId();
+ const id = inputID || useId();
const [val, setVal] = useState(dayjs(initialValue || null));
const [error, setError] = useState(false);
@@ -205,7 +205,7 @@ const DatePickerInput: FC = ({
slots={{ openPickerIcon: CalendarIcon }}
slotProps={{
textField: {
- id: inputID,
+ id,
name,
required,
error,
diff --git a/src/components/Questionnaire/FormGroupCheckbox.tsx b/src/components/Questionnaire/FormGroupCheckbox.tsx
index d8ecda1c..9703d02e 100644
--- a/src/components/Questionnaire/FormGroupCheckbox.tsx
+++ b/src/components/Questionnaire/FormGroupCheckbox.tsx
@@ -129,7 +129,7 @@ const FormGroupCheckbox: FC = ({
{!hideLabel && (
-
+
{label}
{required ? * : ""}
{tooltipText && }
@@ -141,6 +141,7 @@ const FormGroupCheckbox: FC = ({
return (
= ({
data-type="boolean"
value={isChecked ? "true" : "false"}
onChange={() => { }}
+ aria-labelledby={`${id}-label`}
checked
hidden
/>
diff --git a/src/components/Questionnaire/SelectInput.tsx b/src/components/Questionnaire/SelectInput.tsx
index 48971a08..95f059ce 100644
--- a/src/components/Questionnaire/SelectInput.tsx
+++ b/src/components/Questionnaire/SelectInput.tsx
@@ -162,7 +162,7 @@ const SelectInput: FC = ({
readOnly,
...rest
}) => {
- const id = useId();
+ const id = rest.id || useId();
const [val, setVal] = useState(multiple ? [] : "");
const [error, setError] = useState(false);
@@ -215,7 +215,7 @@ const SelectInput: FC = ({
return (
-
+
{label}
{required ? * : ""}
{tooltipText && }
@@ -233,6 +233,7 @@ const SelectInput: FC = ({
readOnly={readOnly}
inputRef={inputRef}
{...rest}
+ id={id}
>
{options.map((option) => (