From 65a776d675074dd45217bdf49d515739bb0d0c69 Mon Sep 17 00:00:00 2001 From: Jake Low Date: Mon, 30 Dec 2024 16:15:09 -0800 Subject: [PATCH 01/11] Add biome code formatter --- biome.json | 31 ++++++++++++++++++++++++++++++ package.json | 2 ++ yarn.lock | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 biome.json diff --git a/biome.json b/biome.json new file mode 100644 index 000000000..0a09e4178 --- /dev/null +++ b/biome.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false, + "ignore": [] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "lineWidth": 100 + }, + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + } +} diff --git a/package.json b/package.json index 6eb1aa01a..5270171b3 100644 --- a/package.json +++ b/package.json @@ -95,6 +95,7 @@ "xmltojson": "^1.3.5" }, "devDependencies": { + "@biomejs/biome": "1.9.4", "@eslint/js": "^9.9.0", "@openstreetmap/id-tagging-schema": "^3.0.0", "@testing-library/jest-dom": "^6.4.6", @@ -145,6 +146,7 @@ "test": "vitest", "test:cov": "vitest run --coverage", "lint": "eslint src/", + "format": "biome format --write src/", "explore": "source-map-explorer --only-mapped --no-border-checks 'dist/**/*.js'" }, "browserslist": [ diff --git a/yarn.lock b/yarn.lock index c652c4a88..1b5c10b1c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -297,6 +297,60 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@biomejs/biome@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.9.4.tgz#89766281cbc3a0aae865a7ff13d6aaffea2842bf" + integrity sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog== + optionalDependencies: + "@biomejs/cli-darwin-arm64" "1.9.4" + "@biomejs/cli-darwin-x64" "1.9.4" + "@biomejs/cli-linux-arm64" "1.9.4" + "@biomejs/cli-linux-arm64-musl" "1.9.4" + "@biomejs/cli-linux-x64" "1.9.4" + "@biomejs/cli-linux-x64-musl" "1.9.4" + "@biomejs/cli-win32-arm64" "1.9.4" + "@biomejs/cli-win32-x64" "1.9.4" + +"@biomejs/cli-darwin-arm64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz#dfa376d23a54a2d8f17133c92f23c1bf2e62509f" + integrity sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw== + +"@biomejs/cli-darwin-x64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz#eafc2ce3849d385fc02238aad1ca4a73395a64d9" + integrity sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg== + +"@biomejs/cli-linux-arm64-musl@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz#d780c3e01758fc90f3268357e3f19163d1f84fca" + integrity sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA== + +"@biomejs/cli-linux-arm64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz#8ed1dd0e89419a4b66a47f95aefb8c46ae6041c9" + integrity sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g== + +"@biomejs/cli-linux-x64-musl@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz#f36982b966bd671a36671e1de4417963d7db15fb" + integrity sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg== + +"@biomejs/cli-linux-x64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz#a0a7f56680c76b8034ddc149dbf398bdd3a462e8" + integrity sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg== + +"@biomejs/cli-win32-arm64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz#e2ef4e0084e76b7e26f0fc887c5ef1265ea56200" + integrity sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg== + +"@biomejs/cli-win32-x64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz#4c7afa90e3970213599b4095e62f87e5972b2340" + integrity sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA== + "@changey/react-leaflet-markercluster@^4.0.0-rc1": version "4.0.0-rc1" resolved "https://registry.yarnpkg.com/@changey/react-leaflet-markercluster/-/react-leaflet-markercluster-4.0.0-rc1.tgz#88d76c74e9014ca2f669900dded8e2ccdd6dd545" From 5c4227267a058d5621501629def5b7d3dbd3c5d8 Mon Sep 17 00:00:00 2001 From: Jake Low Date: Mon, 30 Dec 2024 16:16:24 -0800 Subject: [PATCH 02/11] Fix SCSS syntax errors for Biome --- src/styles/components/buttons.css | 1 - src/styles/components/dropdown.css | 20 +++++++++----------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/styles/components/buttons.css b/src/styles/components/buttons.css index f137e85f6..c1fb32e22 100644 --- a/src/styles/components/buttons.css +++ b/src/styles/components/buttons.css @@ -94,7 +94,6 @@ &--green-fill { @apply mr-bg-green-light-60 mr-border-0 mr-text-white mr-py-1 mr-px-8; - ; &:hover { @apply mr-bg-green-light; diff --git a/src/styles/components/dropdown.css b/src/styles/components/dropdown.css index 62ed7592e..5fcc825db 100644 --- a/src/styles/components/dropdown.css +++ b/src/styles/components/dropdown.css @@ -1,6 +1,4 @@ -$self-dropdown: .mr-dropdown; - -$(self-dropdown) { +.mr-dropdown { @apply mr-relative mr-inline-block; &__button { @@ -11,11 +9,11 @@ $(self-dropdown) { @apply mr-absolute mr-z-200 mr-top-100 mr-left-0; @screen md { - $(self-dropdown)--right & { + .mr-dropdown--right & { @apply mr-inset-auto mr-top-100 mr-right-0; } - $(self-dropdown)--offsetright & { + .mr-dropdown--offsetright & { @apply mr-inset-auto mr-top-100 mr-right-screen20; } } @@ -24,11 +22,11 @@ $(self-dropdown) { &__main { @apply mr-pt-3; - $(self-dropdown)--flush & { + .mr-dropdown--flush & { @apply mr-pt-0; } - $(self-dropdown)--fixed & { + .mr-dropdown--fixed & { @apply mr-fixed; } } @@ -36,7 +34,7 @@ $(self-dropdown) { &__inner { @apply mr-relative mr-rounded-sm mr-shadow mr-bg-blue-dark mr-pl-4 mr-pr-0 mr-py-4 mr-text-white mr-font-normal; - $(self-dropdown)--flush & { + .mr-dropdown--flush & { @apply mr-rounded-t-none; } } @@ -44,15 +42,15 @@ $(self-dropdown) { &__arrow { @apply mr-absolute mr-bottom-100 mr-ml-2 mr-left-0 mr-h-2 mr-fill-blue-dark; - $(self-dropdown)--flush & { + .mr-dropdown--flush & { @apply mr-hidden; } - $(self-dropdown)--right & { + .mr-dropdown--right & { @apply mr-ml-0 mr-mr-2 mr-inset-auto mr-bottom-100 mr-right-0; } - $(self-dropdown)--offsetright & { + .mr-dropdown--offsetright & { @apply mr-ml-0 mr-mr-2 mr-inset-auto mr-bottom-100 mr-right-screen20; } } From fcd4113c7c5c0532cfef5690e52928a160d982e6 Mon Sep 17 00:00:00 2001 From: Jake Low Date: Mon, 30 Dec 2024 16:30:09 -0800 Subject: [PATCH 03/11] Fix unused variable warnings --- eslint.config.js | 2 +- src/components/EnhancedMap/OSMDataLayer/OSMDataLayer.jsx | 2 +- .../TestEnvironmentBanner/TestEnvironmentBanner.jsx | 2 +- .../Widgets/TaskMapWidget/RapidEditor/RapidEditor.jsx | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index cccc22ff1..6483d1c27 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -25,7 +25,7 @@ export default [ }, }, rules: { - "no-unused-vars": "warn", + "no-unused-vars": ["warn", { "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" }], "react/jsx-uses-react": "error", "react/jsx-uses-vars": "error", "unused-imports/no-unused-imports": "error", diff --git a/src/components/EnhancedMap/OSMDataLayer/OSMDataLayer.jsx b/src/components/EnhancedMap/OSMDataLayer/OSMDataLayer.jsx index cc69b900d..c38137896 100644 --- a/src/components/EnhancedMap/OSMDataLayer/OSMDataLayer.jsx +++ b/src/components/EnhancedMap/OSMDataLayer/OSMDataLayer.jsx @@ -14,7 +14,7 @@ import { useMap } from 'react-leaflet' const colors = resolveConfig(tailwindConfig).theme.colors -const generateLayer = (props, map, leaflet) => { +const generateLayer = (props, map, _leaflet) => { const HIGHLIGHT_STYLE = { color: colors.gold, fillColor: colors.gold, diff --git a/src/components/TestEnvironmentBanner/TestEnvironmentBanner.jsx b/src/components/TestEnvironmentBanner/TestEnvironmentBanner.jsx index 7350b1312..a59682c77 100644 --- a/src/components/TestEnvironmentBanner/TestEnvironmentBanner.jsx +++ b/src/components/TestEnvironmentBanner/TestEnvironmentBanner.jsx @@ -2,7 +2,7 @@ import React from "react"; import { FormattedMessage, injectIntl } from 'react-intl'; import messages from "./Messages"; -const TestEnvironmentBanner = (props) => { +const TestEnvironmentBanner = (_props) => { // Check the current environment const environment = window.env.REACT_APP_ENVIRONMENT; diff --git a/src/components/Widgets/TaskMapWidget/RapidEditor/RapidEditor.jsx b/src/components/Widgets/TaskMapWidget/RapidEditor/RapidEditor.jsx index b330f461e..dd95673da 100644 --- a/src/components/Widgets/TaskMapWidget/RapidEditor/RapidEditor.jsx +++ b/src/components/Widgets/TaskMapWidget/RapidEditor/RapidEditor.jsx @@ -8,7 +8,7 @@ import { DEFAULT_ZOOM } from '../../../../services/Challenge/ChallengeZoom/Chall import WithSearch from '../../../HOCs/WithSearch/WithSearch'; import useHash from '../../../../hooks/UseHash'; import { SET_RAPIDEDITOR } from '../../../../services/RapidEditor/RapidEditor'; -import BusySpinner from '../../../BusySpinner/BusySpinner'; +// import BusySpinner from '../../../BusySpinner/BusySpinner'; import { FormattedMessage } from 'react-intl'; import messages from './../Messages'; @@ -41,7 +41,7 @@ function generateStartingHash({ mapBounds, task, comment }) { const RapidEditor = ({ token, task, mapBounds, comment }) => { const dispatch = useDispatch(); - const [isLoading, setIsLoading] = useState(true); + const [_isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const iframeRef = useRef(null); // Create a ref for the iframe let initialHash = generateStartingHash({ task, mapBounds, comment }); From e5fe4822e035b44ee39f4ab25b38b357b4e34b0d Mon Sep 17 00:00:00 2001 From: Jake Low Date: Mon, 30 Dec 2024 16:58:49 -0800 Subject: [PATCH 04/11] Reorganize package.json --- package.json | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 5270171b3..dcadb280d 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,27 @@ "version": "3.16.1", "type": "module", "private": true, + "scripts": { + "build-intl": "NODE_ENV=production extract-messages -l=en-US -o lang/ -d en-US --flat -f json 'src/**/!(*.test).js'", + "update-layers": "node scripts/update_layers.js", + "update-layers-prod": "NODE_ENV=production node scripts/update_layers.js", + "start-js": "vite", + "start": "npm-run-all -p build-env update-layers start-js", + "build-env": "dotenv -c -- jq -n 'env | with_entries(select(.key | startswith(\"REACT_APP_\")))' > public/env.json", + "build-js": "vite build", + "build": "yarn run build-env && yarn run build-intl && yarn run update-layers-prod && yarn run build-js", + "test": "vitest", + "test:cov": "vitest run --coverage", + "lint": "eslint src/", + "format": "biome format --write src/", + "explore": "source-map-explorer --only-mapped --no-border-checks 'dist/**/*.js'" + }, + "browserslist": [ + ">0.2%", + "not dead", + "not ie <= 11", + "not op_mini all" + ], "dependencies": { "@apollo/client": "^3.5.4", "@changey/react-leaflet-markercluster": "^4.0.0-rc1", @@ -134,27 +155,6 @@ "vite": "^5.4.8", "vitest": "^2.1.2" }, - "scripts": { - "build-intl": "NODE_ENV=production extract-messages -l=en-US -o lang/ -d en-US --flat -f json 'src/**/!(*.test).js'", - "update-layers": "node scripts/update_layers.js", - "update-layers-prod": "NODE_ENV=production node scripts/update_layers.js", - "start-js": "vite", - "start": "npm-run-all -p build-env update-layers start-js", - "build-env": "dotenv -c -- jq -n 'env | with_entries(select(.key | startswith(\"REACT_APP_\")))' > public/env.json", - "build-js": "vite build", - "build": "yarn run build-env && yarn run build-intl && yarn run update-layers-prod && yarn run build-js", - "test": "vitest", - "test:cov": "vitest run --coverage", - "lint": "eslint src/", - "format": "biome format --write src/", - "explore": "source-map-explorer --only-mapped --no-border-checks 'dist/**/*.js'" - }, - "browserslist": [ - ">0.2%", - "not dead", - "not ie <= 11", - "not op_mini all" - ], "resolutions": { "react-error-overlay": "6.0.9" } From 40ec714bd10a541ebc33e47e7dfb85ade4fe890c Mon Sep 17 00:00:00 2001 From: Jake Low Date: Mon, 30 Dec 2024 17:00:14 -0800 Subject: [PATCH 05/11] Format all source files with Biome --- src/App.jsx | 277 +-- src/App.test.jsx | 6 +- src/PersistedStore.js | 98 +- .../AcheivementBadge.test.jsx | 6 +- .../AchievementBadge/AchievementBadge.jsx | 304 ++-- src/components/AchievementBadge/Messages.js | 66 +- .../ActivityListing/ActivityDescription.jsx | 106 +- .../ActivityListing/ActivityListing.jsx | 111 +- .../ActivityListing/ActivityTime.jsx | 49 +- src/components/ActivityListing/Messages.js | 4 +- src/components/ActivityMap/ActivityMap.jsx | 94 +- src/components/ActivityMap/Messages.js | 4 +- .../ChallengeActivityTimeline.jsx | 125 +- .../ChallengeActivityTimeline.test.jsx | 23 +- .../UserActivityTimeline/Messages.js | 5 +- .../UserActivityTimelineWidget.jsx | 195 +- src/components/AdminPane/AdminPane.jsx | 48 +- src/components/AdminPane/AdminPane.test.jsx | 10 +- .../WithChallengeManagement.js | 170 +- .../WithChallengeMetrics.jsx | 236 +-- .../WithChallengeResultParents.jsx | 52 +- .../WithChallengeReviewMetrics.jsx | 113 +- .../WithChallengeSnapshots.jsx | 122 +- .../WithChallengeTagMetrics.jsx | 85 +- .../HOCs/WithComboSearch/WithComboSearch.js | 21 +- .../WithComputedMetrics.jsx | 127 +- .../WithCurrentChallenge.jsx | 166 +- .../WithCurrentProject/WithCurrentProject.jsx | 292 +-- .../WithCurrentProject.test.jsx | 51 +- .../HOCs/WithCurrentTask/WithCurrentTask.jsx | 40 +- .../WithDashboardEntityFilter.jsx | 110 +- .../WithManageableProjects.jsx | 238 +-- .../WithPermittedChallenges.jsx | 33 +- .../AdminPane/HOCs/WithPinned/WithPinned.jsx | 49 +- .../WithProjectManagement.js | 22 +- .../WithProjectReviewMetrics.jsx | 87 +- .../HOCs/WithTallied/WithTallied.jsx | 115 +- .../HOCs/WithTaskInspect/WithTaskInspect.js | 62 +- .../WithTaskPropertyStyleRules.jsx | 212 +-- .../Manage/BurndownChart/BurndownChart.jsx | 169 +- .../Manage/BurndownChart/Messages.js | 5 +- .../CalendarHeatmap/CalendarHeatmap.jsx | 85 +- .../Manage/CalendarHeatmap/Messages.js | 4 +- .../Manage/ChallengeCard/ChallengeCard.jsx | 203 ++- .../ChallengeCard/ChallengeControls.jsx | 72 +- .../Manage/ChallengeCard/Messages.js | 8 +- .../ChallengeDashboard/ChallengeDashboard.jsx | 84 +- .../ChallengeFilterGroup.jsx | 6 +- .../ChallengeKeywords/ChallengeKeywords.jsx | 45 +- .../Manage/ChallengeList/ChallengeList.jsx | 47 +- .../Manage/ChallengeList/Messages.js | 4 +- .../ChallengeOwnerLeaderboard.jsx | 137 +- .../ChallengeOwnerLeaderboard/Messages.js | 4 +- .../ChallengeProgressBorder.jsx | 134 +- .../ChallengeProgressBorder/Messages.js | 6 +- .../CompletionRadar/CompletionRadar.jsx | 66 +- .../Manage/CompletionRadar/Messages.js | 4 +- .../DashboardFilterToggle.jsx | 13 +- .../Manage/EditProject/EditProject.jsx | 40 +- .../Manage/EditProject/EditProjectSchema.jsx | 28 +- .../AdminPane/Manage/EditProject/Messages.js | 55 +- .../EmailRequirementNotice.jsx | 2 +- .../Manage/InspectTask/InspectTask.jsx | 57 +- .../AdminPane/Manage/InspectTask/Messages.js | 4 +- .../ManageChallengeSnapshots.jsx | 46 +- .../ManageChallengeSnapshots/Messages.js | 4 +- .../EditChallenge/BulkEditSteps.jsx | 187 +- .../BulkSchemas/BasemapSchema.js | 86 +- .../BulkSchemas/DataSourceSchema.js | 12 +- .../BulkSchemas/DiscoverabilitySchema.js | 26 +- .../BulkSchemas/InstructionsSchema.js | 18 +- .../BulkSchemas/PrioritiesSchema.js | 111 +- .../BulkSchemas/PropertiesSchema.js | 12 +- .../EditChallenge/BulkSchemas/TagsSchema.js | 33 +- .../EditChallenge/EditChallenge.jsx | 240 ++- .../EditChallenge/EditChallenges.jsx | 370 ++-- .../EditChallenge/EditChallenges.test.jsx | 7 +- .../EditChallenge/MenuStep.jsx | 46 +- .../EditChallenge/Messages.js | 65 +- .../ManageChallenges/EditChallenge/Presets.js | 110 +- .../EditChallenge/Presets.test.js | 105 +- .../EditChallenge/PriorityRuleGroup.js | 177 +- .../EditChallenge/PriorityRuleGroup.test.js | 256 ++- .../AutomatedEditsCodeAgreementSchema.js | 37 +- .../EditChallenge/Schemas/BasemapSchema.js | 88 +- .../EditChallenge/Schemas/DataSourceSchema.js | 41 +- .../Schemas/DescriptionSchema.js | 37 +- .../Schemas/DiscoverabilitySchema.js | 56 +- .../EditChallenge/Schemas/EditorSchema.js | 186 +- .../Schemas/InstructionsSchema.js | 53 +- .../EditChallenge/Schemas/OSMCommitSchema.js | 34 +- .../EditChallenge/Schemas/PrioritiesSchema.js | 111 +- .../EditChallenge/Schemas/PropertiesSchema.js | 24 +- .../EditChallenge/Schemas/TagsSchema.js | 41 +- .../EditChallenge/Schemas/ZoomSchema.js | 56 +- .../EditChallenge/WorkflowSteps.jsx | 440 +++-- .../Manage/ManageTasks/EditTask/EditTask.jsx | 172 +- .../ManageTasks/EditTask/EditTaskSchema.js | 32 +- .../Manage/ManageTasks/EditTask/Messages.js | 52 +- src/components/AdminPane/Manage/Messages.js | 11 +- .../Manage/ProgressStatus/ProgressStatus.jsx | 23 +- .../Manage/ProjectCard/ProjectCard.jsx | 57 +- .../ProjectDashboard/ProjectDashboard.jsx | 45 +- .../ProjectDashboard.test.jsx | 12 +- .../ProjectFilterGroup/ProjectFilterGroup.jsx | 6 +- .../Manage/ProjectList/ProjectList.jsx | 57 +- .../Manage/ProjectOverview/Messages.js | 5 +- .../ProjectOverview/ProjectOverview.jsx | 78 +- .../Manage/ProjectPickerModal/Messages.js | 8 +- .../ProjectPickerModal/ProjectPickerModal.jsx | 148 +- .../Manage/ProjectsDashboard/Messages.js | 16 +- .../ProjectsDashboard/ProjectsDashboard.jsx | 103 +- .../Manage/RebuildTasksControl/Messages.js | 29 +- .../RebuildTasksControl.jsx | 123 +- .../RebuildTasksControl.test.jsx | 198 +-- .../Manage/StepNavigation/Messages.js | 5 +- .../Manage/StepNavigation/StepNavigation.jsx | 83 +- .../Manage/TaskDeletingProgress/Messages.js | 8 +- .../TaskDeletingProgress.jsx | 6 +- .../Manage/TaskPropertyStyleRules/Messages.js | 26 +- .../TaskPropertyStyleRules.jsx | 74 +- .../Manage/TaskUploadingProgress/Messages.js | 8 +- .../TaskUploadingProgress.jsx | 6 +- .../Manage/TestEnvironmentNotice/Messages.js | 13 +- .../TestEnvironmentNotice.jsx | 10 +- .../GeographicIndexingNotice.jsx | 28 +- .../Manage/ViewChallengeTasks/Messages.js | 21 +- .../ViewChallengeTasks/TaskBuildProgress.jsx | 147 +- .../ViewChallengeTasks/ViewChallengeTasks.jsx | 444 ++--- .../AssociatedChallengeList.jsx | 91 +- .../VirtualProjects/ChallengeIdResult.jsx | 41 +- .../VirtualProjects/ManageChallengeList.jsx | 150 +- .../Manage/VirtualProjects/Messages.js | 20 +- .../VisibilitySwitch/VisibilitySwitch.jsx | 33 +- .../VisibilitySwitch.test.jsx | 10 +- .../BurndownChartWidget.jsx | 70 +- .../Widgets/BurndownChartWidget/Messages.js | 6 +- .../CalendarHeatmapWidget.jsx | 46 +- .../Widgets/CalendarHeatmapWidget/Messages.js | 4 +- .../ChallengeListWidget.jsx | 340 ++-- .../ChallengeListWidget.test.jsx | 13 +- .../Widgets/ChallengeListWidget/Messages.js | 4 +- .../ChallengeOverviewWidget.jsx | 149 +- .../ChallengeOverviewWidget/Messages.js | 4 +- .../ChallengeTasksWidget.jsx | 34 +- .../Widgets/ChallengeTasksWidget/Messages.js | 4 +- .../Widgets/CommentsWidget/CommentsWidget.jsx | 57 +- .../Manage/Widgets/CommentsWidget/Messages.js | 4 +- .../LeaderboardWidget/LeaderboardWidget.jsx | 123 +- .../Widgets/LeaderboardWidget/Messages.js | 4 +- .../Widgets/ProjectAboutWidget/Messages.js | 7 +- .../ProjectAboutWidget/ProjectAboutWidget.jsx | 21 +- .../Widgets/ProjectListWidget/Messages.js | 4 +- .../ProjectListWidget/ProjectListWidget.jsx | 190 +- .../Widgets/ProjectManagersWidget/Messages.js | 26 +- .../ProjectManagersWidget.jsx | 406 ++--- .../Widgets/ProjectOverviewWidget/Messages.js | 4 +- .../ProjectOverviewWidget.jsx | 21 +- .../Widgets/RecentActivityWidget/Messages.js | 4 +- .../RecentActivityWidget.jsx | 38 +- .../Widgets/StatusRadarWidget/Messages.js | 4 +- .../StatusRadarWidget/StatusRadarWidget.jsx | 56 +- .../Widgets/TagMetricsWidget/Messages.js | 6 +- .../TagMetricsWidget/TagMetricsWidget.jsx | 30 +- .../Manage/Widgets/widget_registry.js | 49 +- src/components/AreaSelect/AreaSelect.js | 32 +- .../AreaSelect/leaflet-areaselect.js | 460 ++--- .../AutosuggestMentionTextArea.jsx | 247 +-- .../AutosuggestTextBox/AutosuggestTextBox.jsx | 229 +-- src/components/AutosuggestTextBox/Messages.js | 6 +- src/components/BasicDialog/BasicDialog.jsx | 92 +- .../BoundsSelectorModal.jsx | 85 +- .../BoundsSelectorModal/Messages.js | 10 +- src/components/Bungee/Bungee.jsx | 34 +- src/components/BusySpinner/BusySpinner.jsx | 44 +- src/components/Button/Button.jsx | 14 +- .../CardChallenge/CardChallenge.jsx | 253 +-- src/components/CardChallenge/Messages.js | 12 +- src/components/CardProject/CardProject.jsx | 79 +- src/components/CardProject/Messages.js | 4 +- .../ChallengeDetail/ChallengeCommentsPane.jsx | 63 +- .../ChallengeDetail/ChallengeDetail.jsx | 463 +++-- .../ChallengeDetail/ChallengeDetail.test.jsx | 56 +- .../ChallengeDetail/FlagCommentInput.jsx | 93 +- src/components/ChallengeDetail/FlagModal.jsx | 17 +- src/components/ChallengeDetail/Messages.js | 65 +- .../ChallengeEndModal/ChallengeEndModal.jsx | 24 +- .../ChallengeEndModal.test.jsx | 6 +- src/components/ChallengeEndModal/Messages.js | 13 +- .../ChallengeInfoSummary.jsx | 19 +- .../ChallengeNameLink/ChallengeNameLink.jsx | 90 +- .../ChallengeOwnerContactLink.jsx | 74 +- .../ChallengeOwnerContactLink.test.jsx | 42 +- .../ChallengeOwnerContactLink/Messages.js | 22 +- .../ChallengeFilterSubnav/ButtonFilter.jsx | 23 +- .../ChallengeFilterSubnav.jsx | 51 +- .../ClearFiltersControl.jsx | 10 +- .../FilterByCategorizationKeywords.jsx | 146 +- .../FilterByDifficulty.jsx | 82 +- .../ChallengeFilterSubnav/FilterByKeyword.jsx | 126 +- .../FilterByLocation.jsx | 49 +- .../ChallengeFilterSubnav/Messages.js | 32 +- .../OtherKeywordsOption.jsx | 14 +- .../ProjectFilterSubnav.jsx | 37 +- .../SortChallengesSelector.jsx | 60 +- .../ChallengePane/ChallengePane.jsx | 226 +-- .../ChallengePane/ChallengePane.test.jsx | 6 +- .../ChallengeResultItem.jsx | 104 +- .../ChallengeResultItem/Messages.js | 22 +- .../ChallengeResultList.jsx | 301 ++-- .../ChallengeResultList/Messages.js | 12 +- .../ChallengeResultList/PageResultsButton.jsx | 27 +- src/components/ChallengePane/Messages.js | 24 +- .../ProjectResultItem/ProjectResultItem.jsx | 33 +- .../StartVirtualChallenge/Messages.js | 10 +- .../StartVirtualChallenge.jsx | 102 +- .../TaskChallengeMarkerContent.jsx | 54 +- .../ChallengeProgress/ChallengeProgress.jsx | 392 ++-- .../ChallengeProgress.test.jsx | 8 +- .../ChallengeSnapshotProgress.jsx | 27 +- src/components/ChallengeProgress/Messages.js | 22 +- .../CheckForToken/CheckForToken.jsx | 60 +- .../CommentCountBadge/CommentCountBadge.jsx | 29 +- src/components/CommentList/CommentList.jsx | 128 +- src/components/CommentList/Messages.js | 8 +- .../ConfigureColumnsModal.jsx | 126 +- .../ConfigureColumnsModal/Messages.js | 4 +- .../ConfirmAction/ConfirmAction.jsx | 18 +- src/components/ConfirmAction/Messages.js | 4 +- .../CongratulateModal/CongratulateModal.jsx | 37 +- .../CongratulateModal.test.jsx | 6 +- src/components/CongratulateModal/Messages.js | 11 +- .../CountrySelector/CountrySelector.jsx | 92 +- src/components/CountrySelector/Messages.js | 352 ++-- .../Custom/RJSFFormFieldAdapter/Messages.js | 16 +- .../RJSFFormFieldAdapter.jsx | 538 +++--- src/components/Custom/TriStateCheckbox.jsx | 16 +- .../CustomUrlList/CustomUrlList.jsx | 96 +- .../CustomUrlList/EditCustomUrl.jsx | 26 +- src/components/CustomUrlList/Messages.js | 7 +- src/components/CustomUrlList/UrlSchema.jsx | 14 +- src/components/Dropdown/Dropdown.jsx | 51 +- src/components/Dropdown/Dropdown.test.jsx | 8 +- .../DirectionalIndicationMarker.jsx | 73 +- .../FitBoundsControl/FitBoundsControl.jsx | 116 +- .../EnhancedMap/FitBoundsControl/Messages.js | 7 +- .../FitWorldControl/FitWorldControl.jsx | 28 +- .../EnhancedMap/FitWorldControl/Messages.js | 7 +- .../ImageMarkerLayer/ImageMarkerLayer.jsx | 160 +- .../ImageMarkerLayer.test.jsx | 36 +- .../EnhancedMap/ImageMarkerLayer/Messages.js | 7 +- .../LassoSelectionControl.jsx | 132 +- .../EnhancedMap/LayerToggle/LayerToggle.jsx | 330 ++-- .../EnhancedMap/LayerToggle/Messages.js | 18 +- .../EnhancedMap/MapAnimator/MapAnimator.js | 24 +- .../EnhancedMap/MapPane/MapPane.jsx | 31 +- .../EnhancedMap/OSMDataLayer/OSMDataLayer.jsx | 254 +-- .../EnhancedMap/PropertyList/Messages.js | 4 +- .../EnhancedMap/PropertyList/PropertyList.jsx | 103 +- .../SearchControl/LocationSearchBox.jsx | 129 +- .../EnhancedMap/SearchControl/Messages.js | 10 +- .../SearchControl/SearchContent.jsx | 82 +- .../SearchControl/SearchControl.jsx | 50 +- .../SelectMarkersInViewControl/Messages.js | 6 +- .../SelectMarkersInViewControl.jsx | 67 +- .../SourcedTileLayer/SourcedTileLayer.jsx | 68 +- .../TaskFeatureLayer/TaskFeatureLayer.jsx | 150 +- src/components/ErrorModal/ErrorModal.jsx | 40 +- src/components/ErrorModal/Messages.js | 4 +- .../ErrorTagComment/ErrorTagComment.js | 13 +- .../ErrorTagDropdown/ErrorTagDropdown.jsx | 106 +- src/components/ErrorTagDropdown/Messages.js | 6 +- src/components/External/External.js | 24 +- .../FeatureStyleLegend/FeatureStyleLegend.jsx | 98 +- src/components/FeatureStyleLegend/Messages.js | 4 +- .../FeaturedChallengesWidget.jsx | 93 +- src/components/FeaturedChallenges/Messages.js | 8 +- .../Following/Activity/Activity.jsx | 117 +- src/components/Following/Activity/Messages.js | 4 +- .../Following/FollowItem/FollowItem.jsx | 58 +- .../Following/FollowList/FollowList.jsx | 22 +- src/components/Following/FollowingQueries.js | 18 +- .../Following/StartFollowing/Messages.js | 7 +- .../StartFollowing/StartFollowing.jsx | 63 +- .../Following/ViewFollowers/Messages.js | 4 +- .../Following/ViewFollowers/ViewFollowers.jsx | 175 +- .../Following/ViewFollowing/Messages.js | 4 +- .../Following/ViewFollowing/ViewFollowing.jsx | 78 +- src/components/Footer/Footer.jsx | 81 +- src/components/Footer/Messages.js | 4 +- .../FundraisingNotices/FundraisingNotices.jsx | 48 +- .../WithBoundedTasks/WithBoundedTasks.jsx | 98 +- .../WithBrowsedChallenge.jsx | 223 +-- .../WithBrowsedChallenge.test.jsx | 76 +- .../HOCs/WithChallenge/WithChallenge.jsx | 120 +- .../HOCs/WithChallenge/WithChallenge.test.js | 49 +- .../WithChallengePreferences.js | 112 +- .../WithChallengePreferences.test.js | 315 ++-- .../WithChallengeTaskClusters.jsx | 396 +++-- .../HOCs/WithChallenges/WithChallenges.js | 50 +- .../WithChallenges/WithChallenges.test.js | 95 +- .../WithClusteredTasks/WithClusteredTasks.js | 26 +- .../WithCommandInterpreter.jsx | 355 ++-- .../WithCommandInterpreter.test.js | 55 +- .../WithConfigurableColumns.jsx | 204 ++- .../WithCooperativeWork.jsx | 164 +- .../HOCs/WithCurrentTask/WithCurrentTask.jsx | 423 ++--- .../WithCurrentTask/WithCurrentTask.test.js | 365 ++-- .../HOCs/WithCurrentUser/WithCurrentUser.js | 30 +- .../WithCurrentUser/WithCurrentUser.test.js | 178 +- .../WithDeactivateOnOutsideClick.jsx | 53 +- src/components/HOCs/WithEditor/WithEditor.js | 77 +- .../HOCs/WithEditor/WithEditor.test.js | 50 +- src/components/HOCs/WithErrors/WithErrors.js | 38 +- .../HOCs/WithErrors/WithErrors.test.js | 49 +- .../WithExternalError/WithExternalError.jsx | 41 +- .../HOCs/WithFeatured/WithFeatured.jsx | 68 +- .../WithFilterCriteria/WithFilterCriteria.jsx | 687 +++---- .../WithFilteredChallenges.jsx | 65 +- .../WithFilteredClusteredTasks.jsx | 573 +++--- .../WithFundraisingNotices.jsx | 14 +- .../WithIntersectingOverlays.jsx | 51 +- .../WithKeyboardShortcuts.js | 75 +- .../WithKeywordSearch/WithKeywordSearch.jsx | 113 +- .../HOCs/WithLayerSources/Messages.js | 5 +- .../WithLayerSources/WithLayerSources.jsx | 25 +- .../HOCs/WithLeaderboard/WithLeaderboard.jsx | 366 ++-- .../HOCs/WithLoadedTask/WithLoadedTask.jsx | 90 +- .../HOCs/WithLockedTask/WithLockedTask.jsx | 139 +- .../WithMapBoundedTasks.jsx | 164 +- .../WithMapillaryImages.jsx | 89 +- .../WithNearbyReviewTasks.jsx | 81 +- .../HOCs/WithNearbyTasks/WithNearbyTasks.jsx | 102 +- .../WithNominatimSearch.jsx | 62 +- .../WithOSMUserSearch/WithOSMUserSearch.jsx | 115 +- .../WithOpenStreetCamImages.jsx | 86 +- .../WithOptionalManagement.jsx | 46 +- .../WithPagedChallenges.jsx | 53 +- .../WithPagedProjects/WithPagedProjects.jsx | 110 +- .../HOCs/WithProgress/WithProgress.jsx | 32 +- .../HOCs/WithProject/WithProject.jsx | 142 +- .../WithPublicWidgetWorkspaces.jsx | 104 +- .../WithPublicWidgetWorkspaces.test.jsx | 12 +- .../WithReviewChallenges.jsx | 99 +- .../WithReviewMetrics/WithReviewMetrics.jsx | 77 +- .../WithReviewTagMetrics.jsx | 72 +- .../WithReviewTaskClusters.jsx | 98 +- .../HOCs/WithReviewTasks/WithReviewTasks.jsx | 381 ++-- .../WithSavedFilters/WithSavedFilters.jsx | 206 +-- .../HOCs/WithSearch/WithChallengeSearch.js | 17 +- src/components/HOCs/WithSearch/WithSearch.jsx | 280 +-- .../HOCs/WithSearch/WithSearch.test.jsx | 348 ++-- .../WithSearchResults/WithSearchResults.jsx | 111 +- .../WithSearchResults.test.jsx | 68 +- .../HOCs/WithSearchRoute/WithSearchRoute.jsx | 256 +-- .../WithSearchRoute/WithSearchRoute.test.jsx | 127 +- .../WithSelectedClusteredTasks.jsx | 194 +- .../WithSortedChallenges.jsx | 138 +- .../WithSortedChallenges.test.js | 118 +- .../WithStartChallenge/WithStartChallenge.jsx | 203 ++- .../WithStartChallenge.test.js | 86 +- src/components/HOCs/WithStatus/WithStatus.js | 19 +- .../HOCs/WithStatus/WithStatus.test.js | 52 +- .../WithSystemNotices/WithSystemNotices.jsx | 67 +- .../HOCs/WithTargetUser/WithTargetUser.jsx | 188 +- .../HOCs/WithTaskBundle/WithTaskBundle.jsx | 319 ++-- .../WithTaskCenterPoint.jsx | 17 +- .../WithTaskCenterPoint.test.jsx | 50 +- .../WithTaskClusterMarkers.jsx | 67 +- .../WithTaskComments/WithTaskComments.jsx | 79 +- .../WithTaskFeatureProperties.jsx | 23 +- .../HOCs/WithTaskHistory/WithTaskHistory.jsx | 65 +- .../HOCs/WithTaskMarkers/WithTaskMarkers.jsx | 66 +- .../WithTaskPropertyKeys.jsx | 108 +- .../HOCs/WithTaskReview/WithTaskReview.jsx | 320 ++-- .../HOCs/WithTaskTags/WithTaskTags.jsx | 65 +- .../HOCs/WithTeamSearch/WithTeamSearch.jsx | 75 +- .../HOCs/WithUserLocale/WithUserLocale.jsx | 41 +- .../WithUserLocation/WithUserLocation.jsx | 85 +- .../HOCs/WithUserMetrics/WithUserMetrics.jsx | 226 ++- .../WithUserNotifications.jsx | 63 +- .../WithVirtualChallenge.jsx | 85 +- .../HOCs/WithVisibleLayer/WithVisibleLayer.js | 118 +- .../WithVisibleLayer/WithVisibleLayer.test.js | 263 +-- .../WithWebSocketSubscriptions.jsx | 37 +- .../WithWidgetManagement.jsx | 136 +- .../WithWidgetWorkspaces.jsx | 419 +++-- .../WithWidgetWorkspaces.test.jsx | 207 ++- src/components/Head/Head.jsx | 88 +- src/components/Head/Head.test.js | 24 +- src/components/Header/Header.jsx | 10 +- .../ImportFileModal/ImportFileModal.jsx | 17 +- src/components/ImportFileModal/Messages.js | 4 +- src/components/InsetMap/InsetMap.jsx | 33 +- .../InspectTaskControls.jsx | 157 +- .../InspectTaskControls/Messages.js | 6 +- .../IntervalRender/IntervalRender.js | 28 +- .../IntlDatePicker/IntlDatePicker.jsx | 58 +- src/components/IntlTable/IntlTable.js | 6 +- .../IntlTable/IntlTablePagination.jsx | 149 +- src/components/IntlTable/Messages.js | 24 +- .../InTableTagFilter.jsx | 74 +- .../KeywordAutosuggestInput.jsx | 87 +- .../KeywordAutosuggestInput/Messages.js | 12 +- .../LoadMoreButton/LoadMoreButton.jsx | 28 +- src/components/LoadMoreButton/Messages.js | 4 +- .../LoadMoreButton/PageResultsButton.jsx | 32 +- .../LoadRandomChallengeTask.jsx | 47 +- .../LoadRandomVirtualChallengeTask.jsx | 47 +- .../LockedTasks/LockedTasksWidget.jsx | 74 +- src/components/LockedTasks/Messages.js | 9 +- .../MapillaryViewer/MapillaryViewer.jsx | 16 +- .../MapillaryViewer/MapillaryViewer.test.jsx | 32 +- .../MarkdownContent/MarkdownContent.jsx | 76 +- src/components/MobileNotSupported/Messages.js | 14 +- .../MobileNotSupported/MobileNotSupported.jsx | 38 +- src/components/Modal/Modal.jsx | 78 +- src/components/Modal/Modal.test.jsx | 38 +- src/components/Navbar/Messages.js | 38 +- src/components/Navbar/Navbar.jsx | 223 ++- src/components/Navbar/Navbar.test.jsx | 45 +- src/components/OSMElementHistory/Messages.js | 4 +- .../OSMElementHistory/OSMElementHistory.jsx | 283 ++- .../OSMElementReference.jsx | 46 +- src/components/OSMElementTags/Messages.js | 4 +- .../OSMElementTags/OSMElementTags.jsx | 157 +- .../OSMViewportReference.jsx | 32 +- .../OpenStreetCamViewer.jsx | 46 +- .../OpenStreetCamViewer.test.jsx | 26 +- src/components/PageNotFound/Messages.js | 12 +- src/components/PageNotFound/PageNotFound.jsx | 12 +- src/components/PagePicker/PagePicker.jsx | 16 +- .../PastDurationSelector/Messages.js | 4 +- .../PastDurationSelector.jsx | 143 +- src/components/PointsTicker/Messages.js | 4 +- src/components/PointsTicker/PointsTicker.jsx | 33 +- src/components/PopularChallenges/Messages.js | 4 +- .../PopularChallengesWidget.jsx | 81 +- src/components/ProjectDetail/Messages.js | 20 +- .../ProjectDetail/ProjectDetail.jsx | 149 +- .../ProjectDetail/ProjectDetail.test.jsx | 12 +- .../PublicWidgetGrid/PublicWidgetGrid.jsx | 57 +- src/components/QuickTextBox/Messages.js | 4 +- src/components/QuickTextBox/QuickTextBox.jsx | 45 +- src/components/QuickWidget/MenuControl.jsx | 6 +- src/components/QuickWidget/Messages.js | 4 +- src/components/QuickWidget/QuickWidget.jsx | 87 +- src/components/ReviewTaskControls/Messages.js | 15 +- .../ReviewTaskControls/ReviewTaskControls.jsx | 387 ++-- src/components/ReviewTaskPane/Messages.js | 4 +- .../ReviewTaskPane/ReviewTaskPane.jsx | 185 +- src/components/RolePicker/Messages.js | 4 +- src/components/RolePicker/RolePicker.jsx | 24 +- src/components/SavedChallenges/Messages.js | 4 +- .../SavedChallenges/SavedChallengesWidget.jsx | 95 +- .../SavedFilters/ManageSavedFilters.jsx | 79 +- src/components/SavedFilters/Messages.js | 20 +- .../SavedFilters/SavedFiltersList.jsx | 64 +- src/components/SavedTasks/Messages.js | 4 +- .../SavedTasks/SavedTasksWidget.jsx | 126 +- src/components/ScreenTooNarrow/Messages.js | 9 +- .../ScreenTooNarrow/ScreenTooNarrow.jsx | 18 +- src/components/SearchBox/SearchBox.jsx | 114 +- src/components/SearchTypeFilter/Messages.js | 10 +- .../SearchTypeFilter/SearchTypeFilter.jsx | 78 +- src/components/ShareLink/Messages.js | 6 +- src/components/ShareLink/ShareLink.jsx | 83 +- src/components/SignInButton/Messages.js | 8 +- src/components/SignInButton/SignInButton.jsx | 77 +- src/components/Sprites/Sprites.jsx | 47 +- src/components/SuperAdmin/Messages.js | 52 +- src/components/SuperAdmin/MetricsData.jsx | 171 +- src/components/SuperAdmin/MetricsHeader.jsx | 66 +- src/components/SuperAdmin/MetricsTable.jsx | 66 +- .../SuperAdmin/SortProjectsSelector.jsx | 48 +- .../SuperAdmin/SortUsersSelector.jsx | 48 +- src/components/SuperAdmin/SuperAdmin.jsx | 174 +- src/components/SuperAdmin/SuperAdmin.test.jsx | 84 +- .../SuperAdmin/SuperAdminContainer.jsx | 82 +- src/components/SuperAdmin/SuperUserToggle.jsx | 50 +- src/components/SuperAdmin/WithExportCsv.jsx | 144 +- .../SuperAdmin/WithMetricsFilter.jsx | 154 +- .../SuperAdmin/WithMetricsSearch.js | 14 +- .../SuperAdmin/WithMetricsSearchResults.jsx | 79 +- .../SuperAdmin/WithSortedProjects.jsx | 56 +- src/components/SuperAdmin/WithSortedUsers.jsx | 58 +- .../SuperAdmin/internalFilterToggle.jsx | 16 +- .../SupplementalMap/SupplementalMap.jsx | 109 +- src/components/SvgSymbol/SvgSymbol.jsx | 10 +- .../SystemNotices/SystemNotices.jsx | 44 +- .../TagDiffVisualization/Messages.js | 4 +- .../TagDiffVisualization/TagDiffModal.jsx | 24 +- .../TagDiffVisualization.jsx | 589 +++--- src/components/TagMetrics/Messages.js | 4 +- src/components/TagMetrics/TagMetrics.jsx | 89 +- src/components/TaskAnalysisTable/Messages.js | 7 +- .../TaskAnalysisTable/TaskAnalysisTable.jsx | 871 ++++----- .../TaskAnalysisTable.test.jsx | 20 +- .../TaskAnalysisTableHeader.jsx | 437 +++-- .../TaskAnalysisTable/TaskTableHelpers.jsx | 79 +- src/components/TaskClusterMap/MapMarkers.jsx | 217 ++- src/components/TaskClusterMap/Messages.js | 16 +- .../TaskClusterMap/TaskClusterMap.jsx | 474 ++--- .../TaskClusterMap/TaskClusterMap.test.jsx | 37 +- .../TaskClusterMap/ZoomInMessage.jsx | 94 +- src/components/TaskCommentInput/Messages.js | 13 +- .../TaskCommentInput/TaskCommentInput.jsx | 27 +- src/components/TaskCommentsModal/Messages.js | 6 +- .../TaskCommentsModal/TaskCommentsModal.jsx | 81 +- .../AdjustFiltersOverlay.jsx | 195 +- .../InstructionsOverlay.jsx | 15 +- .../TaskConfirmationModal/Messages.js | 85 +- .../TaskConfirmationModal.jsx | 642 ++++--- src/components/TaskFilters/FilterDropdown.jsx | 32 +- src/components/TaskFilters/Messages.js | 4 +- .../TaskFilters/TaskFilterIndicator.jsx | 6 +- .../TaskFilters/TaskPriorityFilter.jsx | 41 +- .../TaskFilters/TaskPropertyFilter.jsx | 64 +- .../TaskFilters/TaskReviewStatusFilter.jsx | 110 +- .../TaskFilters/TaskStatusFilter.jsx | 62 +- src/components/TaskHistoryList/Messages.js | 21 +- .../TaskHistoryList/TaskHistoryList.jsx | 502 +++--- .../ActiveTaskControls/ActiveTaskControls.jsx | 660 +++---- .../CooperativeWorkControls.jsx | 85 +- .../CooperativeWorkControls/Messages.js | 4 +- .../ActiveTaskControls/Messages.js | 17 +- .../TaskAlreadyFixedControl/Messages.js | 8 +- .../TaskAlreadyFixedControl.jsx | 24 +- .../TaskCompletionStep/Messages.js | 18 +- .../TaskCompletionStep/TaskCompletionStep.jsx | 98 +- .../TaskCompletionStep.test.jsx | 7 +- .../TaskFalsePositiveControl/Messages.js | 13 +- .../TaskFalsePositiveControl.jsx | 37 +- .../TaskFixedControl/Messages.js | 10 +- .../TaskFixedControl/TaskFixedControl.jsx | 40 +- .../TaskNextControl/Messages.js | 17 +- .../TaskNextControl/TaskNextControl.jsx | 61 +- .../TaskRevisedControl/Messages.js | 18 +- .../TaskRevisedControl/TaskRevisedControl.jsx | 78 +- .../TaskSkipControl/Messages.js | 13 +- .../TaskSkipControl/TaskSkipControl.jsx | 23 +- .../TaskTooHardControl/Messages.js | 9 +- .../TaskTooHardControl/TaskTooHardControl.jsx | 24 +- .../KeyboardShortcutList.jsx | 37 +- .../KeyboardShortcutList.test.jsx | 33 +- .../ChallengeShareControls.jsx | 32 +- src/components/TaskPane/Messages.js | 8 +- .../TaskPane/MobileTaskDetails/Messages.js | 8 +- .../MobileTaskDetails/MobileTaskDetails.jsx | 235 +-- .../PlaceDescription/PlaceDescription.jsx | 49 +- .../PlaceDescription.test.jsx | 2 +- src/components/TaskPane/PublicTaskPane.jsx | 102 +- .../TaskInstructions/TaskInstructions.jsx | 68 +- .../TaskPane/TaskLatLon/Messages.js | 12 +- .../TaskPane/TaskLatLon/TaskLatLon.jsx | 38 +- .../TaskLocationMap/TaskLocationMap.jsx | 32 +- src/components/TaskPane/TaskMap/Messages.js | 6 +- src/components/TaskPane/TaskMap/TaskMap.jsx | 525 +++--- .../TaskPane/TaskMap/TaskMap.test.jsx | 43 +- .../TaskPane/TaskMap/helperFunctions.js | 156 +- .../TaskPane/TaskNearbyList/Messages.js | 4 +- .../TaskNearbyList/TaskNearbyList.jsx | 18 +- .../TaskPane/TaskNearbyList/TaskNearbyMap.jsx | 220 +-- .../TaskNearbyList/TaskReviewNearbyList.jsx | 32 +- src/components/TaskPane/TaskPane.jsx | 516 +++--- .../TaskRandomnessControl/Messages.js | 6 +- .../TaskRandomnessControl.jsx | 49 +- .../TaskPane/TaskTrackControls/Messages.js | 4 +- .../TaskTrackControls/TaskTrackControls.jsx | 34 +- .../TaskPropertyQueryBuilder/Messages.js | 4 +- .../TaskPropertiesSchema.jsx | 156 +- .../TaskPropertyQueryBuilder.jsx | 257 +-- .../TaskPropertyRules.js | 209 ++- .../TaskStatusIndicator/Messages.js | 12 +- .../TaskStatusIndicator.jsx | 42 +- src/components/TaskTags/Messages.js | 6 +- src/components/TaskTags/TaskTags.jsx | 176 +- src/components/Taxonomy/Messages.js | 4 +- src/components/Taxonomy/Taxonomy.jsx | 84 +- .../Teams/AddTeamMember/AddTeamMember.jsx | 63 +- .../Teams/AddTeamMember/Messages.js | 7 +- src/components/Teams/EditTeam/EditTeam.jsx | 97 +- src/components/Teams/EditTeam/Messages.js | 4 +- src/components/Teams/EditTeam/TeamSchema.js | 12 +- .../AcceptInviteControlItem.jsx | 39 +- .../DeclineInviteControlItem.jsx | 39 +- .../Teams/MemberControls/MemberControls.jsx | 32 +- .../Teams/MemberControls/Messages.js | 6 +- .../RemoveMemberControlItem.jsx | 54 +- .../Teams/MemberItem/MemberItem.jsx | 130 +- src/components/Teams/MemberItem/Messages.js | 4 +- src/components/Teams/MyTeams/Messages.js | 4 +- src/components/Teams/MyTeams/MyTeams.jsx | 145 +- src/components/Teams/TeamControls/Messages.js | 4 +- .../Teams/TeamControls/TeamControls.jsx | 121 +- src/components/Teams/TeamQueries.js | 24 +- src/components/Teams/ViewTeam/Messages.js | 4 +- src/components/Teams/ViewTeam/ViewTeam.jsx | 130 +- .../TestEnvironmentBanner/Messages.js | 10 +- .../TestEnvironmentBanner.jsx | 12 +- .../TimezonePicker/TimezonePicker.jsx | 20 +- src/components/TopUserChallenges/Messages.js | 5 +- .../TopUserChallengesWidget.jsx | 38 +- src/components/UserEditorSelector/Messages.js | 12 +- .../UserEditorSelector/UserEditorSelector.jsx | 200 ++- src/components/ViewTask/ViewTask.jsx | 22 +- .../VirtualChallengeNameLink.jsx | 27 +- src/components/WidgetGrid/WidgetGrid.jsx | 171 +- src/components/WidgetPicker/Messages.js | 4 +- src/components/WidgetPicker/WidgetPicker.jsx | 75 +- .../WidgetWorkspace/ExportLayoutModal.jsx | 8 +- src/components/WidgetWorkspace/Messages.js | 6 +- .../WidgetWorkspace/WidgetWorkspace.jsx | 324 ++-- .../ActivityListingWidget.jsx | 51 +- .../Widgets/ActivityListingWidget/Messages.js | 4 +- .../ActivityMapWidget/ActivityMapWidget.jsx | 32 +- .../Widgets/ActivityMapWidget/Messages.js | 4 +- .../ChallengeShareWidget.jsx | 40 +- .../Widgets/ChallengeShareWidget/Messages.js | 4 +- .../CompletionProgressWidget.jsx | 72 +- .../CompletionProgressWidget/Messages.js | 4 +- .../CustomUrlWidget/CustomUrlWidget.jsx | 185 +- .../Widgets/CustomUrlWidget/Messages.js | 4 +- .../FeatureStyleLegendWidget.jsx | 21 +- .../FeatureStyleLegendWidget/Messages.js | 4 +- .../FollowingWidget/FollowingWidget.jsx | 146 +- .../Widgets/FollowingWidget/Messages.js | 4 +- .../KeyboardShortcutsWidget.jsx | 30 +- .../KeyboardShortcutsWidget/Messages.js | 4 +- .../Widgets/OSMElementTags/Messages.js | 4 +- .../OSMElementTags/OSMElementTagsWidget.jsx | 21 +- .../Widgets/OSMHistoryWidget/Messages.js | 4 +- .../OSMHistoryWidget/OSMHistoryWidget.jsx | 21 +- .../ReviewNearbyTasksWidget/Messages.js | 6 +- .../ReviewNearbyTasksWidget.jsx | 202 +-- .../TaskMarkerContent.jsx | 58 +- .../ReviewStatusMetricsWidget/Messages.js | 6 +- .../MetaReviewStatusMetricsWidget.jsx | 96 +- .../ReviewStatusMetricsWidget.jsx | 82 +- .../Widgets/ReviewTableWidget/Messages.js | 4 +- .../ReviewTableWidget/ReviewTableWidget.jsx | 34 +- .../ReviewTagMetricsWidget/Messages.js | 6 +- .../ReviewTagMetricsWidget.jsx | 29 +- .../SnapshotProgressWidget/Messages.js | 8 +- .../SnapshotProgressWidget.jsx | 188 +- .../Widgets/SupplementalMapWidget/Messages.js | 4 +- .../SupplementalMapWidget.jsx | 55 +- .../Widgets/TagDiffWidget/Messages.js | 7 +- .../Widgets/TagDiffWidget/TagDiffWidget.jsx | 107 +- .../Widgets/TaskBundleWidget/Messages.js | 20 +- .../TaskBundleWidget/TaskBundleWidget.jsx | 602 ++++--- .../TaskBundleWidget/TaskMarkerContent.jsx | 96 +- .../Widgets/TaskCompletionWidget/Messages.js | 4 +- .../TaskCompletionWidget.jsx | 87 +- .../Widgets/TaskHistoryWidget/Messages.js | 4 +- .../TaskHistoryWidget/TaskHistoryWidget.jsx | 171 +- .../TaskInstructionsWidget/Messages.js | 4 +- .../PublicTaskInstructionsWidget.jsx | 25 +- .../TaskInstructionsWidget.jsx | 41 +- .../Widgets/TaskLocationWidget/Messages.js | 4 +- .../TaskLocationWidget/TaskLocationWidget.jsx | 62 +- .../Widgets/TaskMapWidget/Messages.js | 4 +- .../TaskMapWidget/RapidEditor/EditSwitch.jsx | 24 +- .../TaskMapWidget/RapidEditor/RapidEditor.jsx | 44 +- .../Widgets/TaskMapWidget/TaskMapWidget.jsx | 159 +- .../Widgets/TaskMoreOptionsWidget/Messages.js | 4 +- .../TaskMoreOptionsWidget.jsx | 21 +- .../Widgets/TaskPropertiesWidget/Messages.js | 4 +- .../TaskPropertiesWidget.jsx | 93 +- .../Widgets/TaskReviewWidget/Messages.js | 4 +- .../TaskReviewWidget/TaskReviewWidget.jsx | 61 +- .../Widgets/TaskStatusWidget/Messages.js | 4 +- .../TaskStatusWidget/TaskStatusWidget.jsx | 29 +- .../Widgets/TeamsWidget/Messages.js | 4 +- .../Widgets/TeamsWidget/TeamsWidget.jsx | 93 +- src/components/Widgets/widget_registry.js | 132 +- src/hooks/UseErrorTagOptions/index.js | 12 +- src/hooks/UseEventListener/index.js | 4 +- src/hooks/UseHash.js | 6 +- src/hooks/UseMRProperties/UseMRProperties.js | 58 +- .../UsePropertyReplacement.js | 40 +- src/hooks/UseRouter/UseRouter.js | 9 +- src/index.jsx | 141 +- src/interactions/Activity/AsUserActivity.js | 20 +- .../Challenge/AsBrowsableChallenge.js | 11 +- .../Challenge/AsEditableChallenge.js | 65 +- .../Challenge/AsEditableChallenge.test.js | 112 +- .../Challenge/AsManageableChallenge.js | 92 +- .../Challenge/AsManageableChallenge.test.js | 88 +- .../Challenge/AsMappableChallenge.js | 15 +- src/interactions/File/AsLineReadableFile.js | 85 +- .../File/AsLineReadableFile.test.js | 266 +-- .../GeoJSON/AsValidatableGeoJSON.js | 126 +- src/interactions/GeoJSON/Messages.js | 10 +- .../Hashable/AsColoredHashable.js | 161 +- .../LeafletLayer/AsStyleableLayer.js | 39 +- .../Message/AsTaskActivityMessage.js | 36 +- .../Overpass/AsValidatableOverpass.js | 16 +- src/interactions/Overpass/Messages.js | 8 +- .../Project/AsManageableProject.js | 25 +- src/interactions/Task/AsCooperativeWork.js | 270 +-- src/interactions/Task/AsMappableTask.js | 197 +- src/interactions/Task/AsMappableTask.test.js | 157 +- .../TaskBundle/AsMappableBundle.js | 35 +- .../TaskCluster/AsMappableCluster.jsx | 217 ++- .../TaskCluster/AsSpiderableMarkers.js | 74 +- .../TaskFeature/AsFilterableFeature.js | 102 +- .../TaskFeature/AsFilterableFeature.test.js | 360 ++-- .../TaskFeature/AsIdentifiableFeature.js | 133 +- .../TaskFeature/AsIdentifiableFeature.test.js | 199 +-- .../TaskFeature/AsSimpleStyleableFeature.js | 304 ++-- src/interactions/TeamMember/AsTeamMember.js | 32 +- src/interactions/User/AsAvatarUser.js | 18 +- src/interactions/User/AsAvatarUser.test.js | 22 +- src/interactions/User/AsEditableUser.js | 44 +- src/interactions/User/AsEndUser.js | 33 +- src/interactions/User/AsEndUser.test.js | 72 +- src/interactions/User/AsManager.js | 122 +- src/interactions/User/AsManager.test.js | 391 ++-- src/interactions/User/AsMappingUser.js | 37 +- src/pages/Achievements/Achievements.jsx | 115 +- src/pages/Achievements/Messages.js | 13 +- src/pages/Dashboard/Dashboard.jsx | 72 +- src/pages/Dashboard/DashboardHeader.jsx | 124 +- src/pages/Dashboard/Messages.js | 6 +- src/pages/GlobalActivity/GlobalActivity.jsx | 139 +- src/pages/GlobalActivity/Messages.js | 4 +- src/pages/Home/Featured.jsx | 55 +- src/pages/Home/Hero.jsx | 12 +- src/pages/Home/Home.jsx | 15 +- src/pages/Home/Instructions.jsx | 12 +- src/pages/Home/Messages.js | 17 +- src/pages/Inbox/HeaderNotifications.jsx | 40 +- src/pages/Inbox/Inbox.jsx | 530 +++--- src/pages/Inbox/Messages.js | 30 +- src/pages/Inbox/Notification.jsx | 284 ++- src/pages/Inbox/NotificationHooks.js | 119 +- src/pages/Leaderboard/CardLeaderboard.jsx | 97 +- .../Leaderboard/ChallengeLeaderboard.jsx | 30 +- src/pages/Leaderboard/CountryLeaderboard.jsx | 27 +- src/pages/Leaderboard/Leaderboard.jsx | 188 +- src/pages/Leaderboard/Leaderboard.test.jsx | 106 +- src/pages/Leaderboard/LeaderboardMap.jsx | 52 +- src/pages/Leaderboard/Messages.js | 6 +- src/pages/Leaderboard/ProjectLeaderboard.jsx | 20 +- src/pages/Leaderboard/RowLeaderboard.jsx | 103 +- src/pages/Metrics/Messages.js | 58 +- src/pages/Metrics/MessagesAsReviewer.js | 28 +- src/pages/Metrics/Metrics.jsx | 196 +- src/pages/Metrics/blocks/LeaderboardStats.jsx | 20 +- src/pages/Metrics/blocks/ReviewStats.jsx | 99 +- src/pages/Metrics/blocks/TaskStats.jsx | 43 +- src/pages/Profile/ApiKey.jsx | 18 +- src/pages/Profile/Messages.js | 63 +- src/pages/Profile/Profile.jsx | 47 +- .../NotificationSettingsSchema.jsx | 83 +- .../Profile/UserSettings/UserSettings.jsx | 187 +- .../UserSettings/UserSettingsSchema.jsx | 152 +- src/pages/Review/Messages.js | 4 +- src/pages/Review/Metrics/Messages.js | 16 +- .../Review/Metrics/ReviewStatusMetrics.jsx | 336 ++-- src/pages/Review/Review.jsx | 341 ++-- .../TasksReview/FilterSuggestTextBox.jsx | 66 +- src/pages/Review/TasksReview/Messages.js | 35 +- .../TasksReview/TasksReviewChallenges.jsx | 107 +- .../Review/TasksReview/TasksReviewTable.jsx | 1540 +++++++++------- .../TasksReview/TasksReviewTable.test.jsx | 47 +- src/pages/Sent/HeaderSent.jsx | 33 +- src/pages/Sent/Messages.js | 6 +- src/pages/Sent/Notification.jsx | 70 +- src/pages/Sent/Sent.jsx | 233 ++- src/pages/Sent/SentCommentsHooks.js | 24 +- src/pages/SignIn/Messages.js | 8 +- src/pages/SignIn/SignIn.jsx | 21 +- src/pages/Social/Messages.js | 4 +- src/pages/Social/Social.jsx | 146 +- src/pages/Teams/Teams.jsx | 101 +- .../ActivityActionTypes.js | 37 +- .../ActivityActionTypes.test.js | 2 +- .../Activity/ActivityActionTypes/Messages.js | 20 +- .../ActivityItemTypes/ActivityItemTypes.js | 41 +- .../Activity/ActivityItemTypes/Messages.js | 24 +- src/services/AdminContext/AdminContext.js | 94 +- src/services/Challenge/Challenge.js | 378 ++-- src/services/Challenge/Challenge.test.js | 43 +- src/services/Challenge/ChallengeActions.js | 6 +- .../ChallengeArchived/ChallengeArchived.js | 8 +- .../ChallengeBasemap/ChallengeBasemap.js | 53 +- .../Challenge/ChallengeBasemap/Messages.js | 4 +- .../ChallengeCategorizationKeywords.js | 25 +- src/services/Challenge/ChallengeComments.js | 6 +- .../ChallengeDifficulty.js | 33 +- .../Challenge/ChallengeDifficulty/Messages.js | 7 +- .../ChallengeGlobal/ChallengeGlobal.js | 8 +- .../ChallengeKeywords/ChallengeKeywords.js | 129 +- .../Challenge/ChallengeKeywords/Messages.js | 4 +- .../ChallengeLocation/ChallengeLocation.js | 84 +- .../Challenge/ChallengeLocation/Messages.js | 4 +- .../ChallengeProject/ChallengeProject.js | 31 +- .../ChallengeReviewSetting.js | 6 +- src/services/Challenge/ChallengeSnapshot.js | 78 +- .../ChallengeStatus/ChallengeStatus.js | 51 +- .../Challenge/ChallengeStatus/Messages.js | 18 +- .../Challenge/ChallengeZoom/ChallengeZoom.js | 10 +- .../CooperativeType/CooperativeType.js | 34 +- .../CooperativeType/CooperativeType.test.js | 22 +- .../Challenge/CooperativeType/Messages.js | 4 +- src/services/Comment/Comment.js | 42 +- src/services/Comment/CommentType.js | 6 +- src/services/Editor/Editor.js | 301 +--- src/services/Editor/Editor.test.js | 656 +++---- src/services/Editor/Messages.js | 20 +- src/services/Error/AppErrors.js | 4 +- src/services/Error/Error.js | 116 +- src/services/Error/Messages.js | 27 +- .../FundraisingNotices/FundraisingNotices.js | 26 +- src/services/Grant/GranteeType.js | 7 +- src/services/Grant/Messages.js | 4 +- src/services/Grant/Role.js | 39 +- src/services/Grant/TargetType.js | 9 +- src/services/KeyboardShortcuts/KeyMappings.js | 46 +- .../KeyboardShortcuts/KeyboardShortcuts.js | 134 +- src/services/KeyboardShortcuts/Messages.js | 6 +- .../Leaderboard/CountryBoundingBoxes.js | 32 +- src/services/Leaderboard/Leaderboard.js | 233 ++- src/services/Leaderboard/Leaderboard.test.js | 46 +- src/services/MapBounds/MapBounds.js | 125 +- src/services/MapBounds/MapBounds.test.js | 78 +- src/services/Mapillary/Mapillary.js | 118 +- src/services/Mapillary/Mapillary.test.js | 136 +- .../NotificationSubscription.js | 24 +- .../Notification/NotificationType/Messages.js | 2 +- .../NotificationType/NotificationType.js | 24 +- src/services/OSM/OSM.js | 136 +- src/services/OSM/OSM.test.jsx | 439 ++--- src/services/OSMCha/OSMCha.js | 36 +- src/services/OpenStreetCam/OpenStreetCam.js | 107 +- .../OpenStreetCam/OpenStreetCam.test.js | 42 +- src/services/Overpass/Overpass.js | 78 +- src/services/Place/Place.js | 70 +- src/services/Preferences/Preferences.js | 67 +- src/services/Preferences/Preferences.test.js | 101 +- src/services/Project/Project.js | 128 +- src/services/Project/VirtualProject.js | 85 +- src/services/RapidEditor/RapidEditor.js | 6 +- src/services/Search/Messages.js | 6 +- src/services/Search/Search.js | 724 ++++---- src/services/SearchCriteria/SearchCriteria.js | 126 +- src/services/Server/APIRoutes.js | 46 +- src/services/Server/Endpoint.js | 54 +- src/services/Server/GenericEntityReducer.js | 59 +- src/services/Server/RequestCache.js | 8 +- src/services/Server/RequestStatus.js | 10 +- src/services/Server/Route.js | 26 +- src/services/Server/Route.test.js | 49 +- src/services/Server/RouteFactory.js | 20 +- src/services/Server/Server.js | 301 ++-- src/services/Server/WebSocketClient.js | 110 +- src/services/Status/Status.js | 90 +- .../SuperAdmin/SuperAdminChallenges.js | 28 +- src/services/SuperAdmin/SuperAdminProjects.js | 37 +- src/services/SuperAdmin/SuperAdminUsers.js | 35 +- src/services/SystemNotices/SystemNotices.js | 35 +- src/services/Task/BoundedTask.js | 346 ++-- src/services/Task/ClusteredTask.js | 155 +- src/services/Task/Task.js | 1580 +++++++++-------- src/services/Task/TaskAction/TaskAction.js | 25 +- .../Task/TaskAction/TaskAction.test.js | 4 +- src/services/Task/TaskClusters.js | 146 +- src/services/Task/TaskHistory/TaskHistory.js | 12 +- src/services/Task/TaskLoadMethod/Messages.js | 8 +- .../Task/TaskLoadMethod/TaskLoadMethod.js | 16 +- .../TaskLoadMethod/TaskLoadMethod.test.js | 2 +- src/services/Task/TaskPriority/Messages.js | 10 +- .../Task/TaskPriority/TaskPriority.js | 41 +- .../Task/TaskPriority/TaskPriority.test.js | 2 +- src/services/Task/TaskProperty/Messages.js | 18 +- .../Task/TaskProperty/TaskProperty.js | 65 +- .../Task/TaskProperty/TaskProperty.test.js | 2 +- src/services/Task/TaskReview/Messages.js | 42 +- src/services/Task/TaskReview/TaskReview.js | 999 ++++++----- .../Task/TaskReview/TaskReviewLoadMethod.js | 20 +- .../TaskReview/TaskReviewLoadMethod.test.js | 2 +- .../Task/TaskReview/TaskReviewNeeded.js | 100 +- .../Task/TaskReview/TaskReviewStatus.js | 93 +- .../Task/TaskReview/TaskReviewStatus.test.js | 4 +- src/services/Task/TaskReview/TaskReviewed.js | 151 +- src/services/Task/TaskStatus/Messages.js | 20 +- src/services/Task/TaskStatus/TaskStatus.js | 183 +- .../Task/TaskStatus/TaskStatus.test.js | 4 +- src/services/Team/Messages.js | 4 +- src/services/Team/Status.js | 21 +- src/services/Team/Team.js | 63 +- .../Handlers/CheckboxFormHandler.jsx | 34 +- .../Handlers/CopyableTextHandler.jsx | 29 +- .../Templating/Handlers/OSMElementHandler.jsx | 42 +- .../Handlers/OSMViewportHandler.jsx | 28 +- .../Templating/Handlers/SelectFormHandler.jsx | 55 +- .../Handlers/UserMentionHandler.jsx | 25 +- src/services/Templating/Templating.jsx | 133 +- src/services/User/Achievement/Achievement.js | 3 +- src/services/User/Locale/Locale.js | 4 + src/services/User/User.js | 1190 +++++++------ .../VirtualChallenge/VirtualChallenge.js | 199 ++- src/services/VisibleLayer/LayerSources.js | 204 +-- .../VisibleLayer/LayerSources.test.js | 89 +- src/services/VisibleLayer/VisibleLayer.js | 32 +- src/services/VisibleLayer/VisibleOverlays.js | 44 +- .../Widget/ChallengeFilter/ChallengeFilter.js | 9 +- .../ChallengeFilter/ChallengeFilter.test.js | 2 +- src/services/Widget/GridMigrations.js | 26 +- src/services/Widget/GridMigrations.test.js | 2 +- .../Widget/ProjectFilter/ProjectFilter.js | 9 +- .../ProjectFilter/ProjectFilter.test.js | 2 +- src/services/Widget/Widget.js | 389 ++-- src/setupTests.jsx | 57 +- src/styles/base.css | 1 - src/styles/components/buttons.css | 10 +- src/styles/components/cards/widget.css | 6 +- src/styles/components/forms.css | 83 +- src/styles/components/lists.css | 4 +- src/styles/components/sections.css | 3 +- src/styles/components/timeline.css | 2 +- src/styles/index.css | 54 +- src/styles/pages/leaderboard-row.css | 2 - src/styles/utilities/backgrounds.css | 43 +- src/styles/utilities/typography.css | 10 +- src/styles/vendor/leaflet-areaselect.css | 22 +- src/styles/vendor/react-datepicker.css | 15 +- src/styles/vendor/react-table.css | 13 +- src/tailwind.config.js | 914 +++++----- src/utils/bundleByTaskBundleId.js | 2 +- src/utils/bundleByTaskBundleId.test.js | 4 +- src/utils/constructChangesetUrl.js | 23 +- src/utils/constructChangesetUrl.test.js | 21 +- src/utils/createBlob.test.js | 2 +- src/utils/errorTagUtils.js | 6 +- src/utils/errorTagUtils.test.js | 2 +- src/utils/setupCustomCache.js | 16 +- 939 files changed, 41167 insertions(+), 39454 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index a0edb1afe..db9c426ab 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,77 +1,71 @@ -import { Fragment, Component } from 'react' -import { Switch, Route, Redirect } from 'react-router-dom' -import { withRouter } from 'react-router' -import Home from './pages/Home/Home' -import Profile from './pages/Profile/Profile' -import Metrics from './pages/Metrics/Metrics' -import Dashboard from './pages/Dashboard/Dashboard.jsx' -import Leaderboard from './pages/Leaderboard/Leaderboard' -import ChallengeLeaderboard from './pages/Leaderboard/ChallengeLeaderboard' -import ProjectLeaderboard from './pages/Leaderboard/ProjectLeaderboard' +import { Component, Fragment } from "react"; +import { withRouter } from "react-router"; +import { Redirect, Route, Switch } from "react-router-dom"; +import AdminPane from "./components/AdminPane/AdminPane"; +import InspectTask from "./components/AdminPane/Manage/InspectTask/InspectTask"; +import ChallengeDetail from "./components/ChallengeDetail/ChallengeDetail"; // import CountryLeaderboard from './pages/Leaderboard/CountryLeaderboard' -import ChallengePane from './components/ChallengePane/ChallengePane' -import ChallengeDetail from './components/ChallengeDetail/ChallengeDetail' -import ProjectDetail from './components/ProjectDetail/ProjectDetail' -import TaskPane from './components/TaskPane/TaskPane' -import PublicTaskPane from './components/TaskPane/PublicTaskPane' -import ReviewTaskPane from './components/ReviewTaskPane/ReviewTaskPane' -import AdminPane from './components/AdminPane/AdminPane' -import InspectTask from './components/AdminPane/Manage/InspectTask/InspectTask' -import Review from './pages/Review/Review' -import Inbox from './pages/Inbox/Inbox' -import Sent from './pages/Sent/Sent' -import Teams from './pages/Teams/Teams' -import Achievements from './pages/Achievements/Achievements' -import Social from './pages/Social/Social' -import GlobalActivity from './pages/GlobalActivity/GlobalActivity' -import PageNotFound from './components/PageNotFound/PageNotFound' -import { resetCache } from './services/Server/RequestCache' -import WithCurrentUser from './components/HOCs/WithCurrentUser/WithCurrentUser' -import WithCurrentTask from './components/HOCs/WithCurrentTask/WithCurrentTask' -import WithExternalError - from './components/HOCs/WithExternalError/WithExternalError' -import WithVirtualChallenge - from './components/HOCs/WithVirtualChallenge/WithVirtualChallenge' -import LoadRandomChallengeTask - from './components/LoadRandomChallengeTask/LoadRandomChallengeTask' -import LoadRandomVirtualChallengeTask - from './components/LoadRandomVirtualChallengeTask/LoadRandomVirtualChallengeTask' -import HeadTitle from './components/Head/Head' -import Navbar from './components/Navbar/Navbar' -import SystemNotices from './components/SystemNotices/SystemNotices' -import FundraisingNotices from './components/FundraisingNotices/FundraisingNotices' -import Footer from './components/Footer/Footer' -import ErrorModal from './components/ErrorModal/ErrorModal' -import Sprites from './components/Sprites/Sprites' -import SuperAdminContainer from './components/SuperAdmin/SuperAdminContainer' -import MobileNotSupported - from './components/MobileNotSupported/MobileNotSupported' -import CheckForToken from './components/CheckForToken/CheckForToken' -import './components/Widgets/widget_registry' -import './App.scss' -import TestEnvironmentBanner from './components/TestEnvironmentBanner/TestEnvironmentBanner.jsx' +import ChallengePane from "./components/ChallengePane/ChallengePane"; +import CheckForToken from "./components/CheckForToken/CheckForToken"; +import ErrorModal from "./components/ErrorModal/ErrorModal"; +import Footer from "./components/Footer/Footer"; +import FundraisingNotices from "./components/FundraisingNotices/FundraisingNotices"; +import WithCurrentTask from "./components/HOCs/WithCurrentTask/WithCurrentTask"; +import WithCurrentUser from "./components/HOCs/WithCurrentUser/WithCurrentUser"; +import WithExternalError from "./components/HOCs/WithExternalError/WithExternalError"; +import WithVirtualChallenge from "./components/HOCs/WithVirtualChallenge/WithVirtualChallenge"; +import HeadTitle from "./components/Head/Head"; +import LoadRandomChallengeTask from "./components/LoadRandomChallengeTask/LoadRandomChallengeTask"; +import LoadRandomVirtualChallengeTask from "./components/LoadRandomVirtualChallengeTask/LoadRandomVirtualChallengeTask"; +import MobileNotSupported from "./components/MobileNotSupported/MobileNotSupported"; +import Navbar from "./components/Navbar/Navbar"; +import PageNotFound from "./components/PageNotFound/PageNotFound"; +import ProjectDetail from "./components/ProjectDetail/ProjectDetail"; +import ReviewTaskPane from "./components/ReviewTaskPane/ReviewTaskPane"; +import Sprites from "./components/Sprites/Sprites"; +import SuperAdminContainer from "./components/SuperAdmin/SuperAdminContainer"; +import SystemNotices from "./components/SystemNotices/SystemNotices"; +import PublicTaskPane from "./components/TaskPane/PublicTaskPane"; +import TaskPane from "./components/TaskPane/TaskPane"; +import Achievements from "./pages/Achievements/Achievements"; +import Dashboard from "./pages/Dashboard/Dashboard.jsx"; +import GlobalActivity from "./pages/GlobalActivity/GlobalActivity"; +import Home from "./pages/Home/Home"; +import Inbox from "./pages/Inbox/Inbox"; +import ChallengeLeaderboard from "./pages/Leaderboard/ChallengeLeaderboard"; +import Leaderboard from "./pages/Leaderboard/Leaderboard"; +import ProjectLeaderboard from "./pages/Leaderboard/ProjectLeaderboard"; +import Metrics from "./pages/Metrics/Metrics"; +import Profile from "./pages/Profile/Profile"; +import Review from "./pages/Review/Review"; +import Sent from "./pages/Sent/Sent"; +import Social from "./pages/Social/Social"; +import Teams from "./pages/Teams/Teams"; +import { resetCache } from "./services/Server/RequestCache"; +import "./components/Widgets/widget_registry"; +import "./App.scss"; +import TestEnvironmentBanner from "./components/TestEnvironmentBanner/TestEnvironmentBanner.jsx"; // Setup child components with necessary HOCs -const TopNav = withRouter(WithCurrentUser(Navbar)) +const TopNav = withRouter(WithCurrentUser(Navbar)); const CurrentTaskPaneInternal = (props) => { - const loggedIn = localStorage.getItem('isLoggedIn') - return loggedIn ? : -} -const CurrentTaskPane = WithCurrentTask(CurrentTaskPaneInternal) + const loggedIn = localStorage.getItem("isLoggedIn"); + return loggedIn ? : ; +}; +const CurrentTaskPane = WithCurrentTask(CurrentTaskPaneInternal); -const CurrentReviewTaskPane = WithCurrentTask(ReviewTaskPane, true) -const CurrentMetaReviewTaskPane = WithCurrentTask(ReviewTaskPane, true) -const CurrentVirtualChallengeTaskPane = - WithVirtualChallenge(WithCurrentTask(TaskPane)) -const VirtualChallengePane = WithVirtualChallenge(ChallengeDetail) -const ErrorPane = WithExternalError(ChallengePane) +const CurrentReviewTaskPane = WithCurrentTask(ReviewTaskPane, true); +const CurrentMetaReviewTaskPane = WithCurrentTask(ReviewTaskPane, true); +const CurrentVirtualChallengeTaskPane = WithVirtualChallenge(WithCurrentTask(TaskPane)); +const VirtualChallengePane = WithVirtualChallenge(ChallengeDetail); +const ErrorPane = WithExternalError(ChallengePane); const HomeOrDashboard = () => { - const goHome = sessionStorage.getItem('goHome') - const loggedIn = localStorage.getItem('isLoggedIn') - sessionStorage.removeItem('goHome') - return (loggedIn && !goHome) ? : -} + const goHome = sessionStorage.getItem("goHome"); + const loggedIn = localStorage.getItem("isLoggedIn"); + sessionStorage.removeItem("goHome"); + return loggedIn && !goHome ? : ; +}; /** * App represents the top level component of the application. It renders a @@ -83,20 +77,24 @@ const HomeOrDashboard = () => { export class App extends Component { state = { firstTimeModalDismissed: false, - shouldDisplayError: true - } + shouldDisplayError: true, + }; dismissModal = () => { - this.setState({firstTimeModalDismissed: true}) - } + this.setState({ firstTimeModalDismissed: true }); + }; render() { // We don't currently support mobile devices. Unless the mobile feature // is explicitly enabled, inform user that mobile is not supported. - if (window.env.REACT_APP_FEATURE_MOBILE_DEVICES !== 'enabled') { + if (window.env.REACT_APP_FEATURE_MOBILE_DEVICES !== "enabled") { // This is a pretty simplistic check, but it should catch most cases. - if (/iPhone|iPad|iPod|BlackBerry|IEMobile|Fennec|Android|Mobile|Tablet/i.test(navigator.userAgent)) { - return + if ( + /iPhone|iPad|iPod|BlackBerry|IEMobile|Fennec|Android|Mobile|Tablet/i.test( + navigator.userAgent, + ) + ) { + return ; } } @@ -107,48 +105,77 @@ export class App extends Component { -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {/* */} - - - - - - - -
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/* */} + + + + + + + +