From ff468ec9718659de9a18908120bcb7d36572ce5b Mon Sep 17 00:00:00 2001 From: Francesco Frassinelli Date: Wed, 2 Dec 2020 21:15:58 +0100 Subject: [PATCH 01/22] Allow empty SMTP credentials --- backend/services/messaging/smtp_service.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/services/messaging/smtp_service.py b/backend/services/messaging/smtp_service.py index cf664f56a2..2e50e7fb79 100644 --- a/backend/services/messaging/smtp_service.py +++ b/backend/services/messaging/smtp_service.py @@ -124,7 +124,8 @@ def _init_smtp_client(): smtp_settings = current_app.config["SMTP_SETTINGS"] sender = smtplib.SMTP(smtp_settings["host"], port=smtp_settings["smtp_port"]) sender.starttls() - sender.login(smtp_settings["smtp_user"], smtp_settings["smtp_password"]) + if smtp_settings["smtp_user"] and smtp_settings["smtp_password"]: + sender.login(smtp_settings["smtp_user"], smtp_settings["smtp_password"]) return sender From 83b2621bda7307664705b4a7f46350a237da4af8 Mon Sep 17 00:00:00 2001 From: Wille Marcel Date: Thu, 3 Dec 2020 07:03:52 -0300 Subject: [PATCH 02/22] Update translations --- frontend/src/locales/cs.json | 14 ++-- frontend/src/locales/he.json | 2 +- frontend/src/locales/nl_NL.json | 2 +- frontend/src/locales/sv.json | 112 ++++++++++++++++---------------- 4 files changed, 65 insertions(+), 65 deletions(-) diff --git a/frontend/src/locales/cs.json b/frontend/src/locales/cs.json index 0e089a84bb..ac502bbb6c 100644 --- a/frontend/src/locales/cs.json +++ b/frontend/src/locales/cs.json @@ -431,8 +431,8 @@ "projects.formInputs.custom_editor.name": "Název", "projects.formInputs.custom_editor.description": "Popis", "projects.formInputs.custom_editor.url": "URL", - "projects.formInputs.custom_editor.enabled.mapping": "", - "projects.formInputs.custom_editor.enabled.validation": "", + "projects.formInputs.custom_editor.enabled.mapping": "Povoleno pro mapování", + "projects.formInputs.custom_editor.enabled.validation": "Povoleno pro ověření", "projects.formInputs.custom_editor.delete": "Odstranit vlastní editor", "projects.formInputs.custom_editor.remove": "Odebrat vlastní editor", "projects.formInputs.custom_editor.delete.confirm": "Tím se odstraní vlastní editor z projektu. Opravdu nechcete zakázat vlastní editor přepínáním zaškrtávacího políčka „Povoleno“ výše?", @@ -443,7 +443,7 @@ "project.nav.showMapToggle": "Zobrazit mapu", "project.nav.listViewToggle": "Zobrazení jako seznam", "project.navFilters.typesOfMapping": "Druhy mapování", - "project.navFilters.typesOfMapping.exactMatch": "", + "project.navFilters.typesOfMapping.exactMatch": "Přesná shoda", "project.navFilters.campaigns": "Všechny kampaně", "project.navFilters.showAllXTags": "Zobrazit {typeOfTag}", "project.inputs.placeholders.search": "Vyhledat projekt", @@ -899,12 +899,12 @@ "pages.learn.validate.steps.identify.title": "Zjistěte, zda se stát validátorem je pro vás to pravé", "pages.learn.validate.steps.identify.description": "Validace vyžaduje trpělivost a pozornost k detailům. Mapování některých zkušeností v OpenStreetMap je nutností, ale nemyslete si, že musíte být odborníkem, abyste mohli začít.", "pages.learn.validate.steps.build.title": "Budujte své dovednosti", - "pages.learn.validate.steps.build.description": "", + "pages.learn.validate.steps.build.description": "Stát se kvalifikovaným mapovačem je zásadní pro zahájení ověřování projektů. Vybudujte si zkušenosti s mapováním všech druhů prvků. Ujistěte se, že jste obeznámeni s {taggingLink}. Nakonec se podívejte na JOSM Editor, přizpůsobitelný editor pro OpenStreetMap s řadou nástrojů a pluginů, které usnadňují mapování a ověřování!", "pages.learn.validate.steps.collaborate.title": "Spolupracujte jako součást komunity", "pages.learn.validate.steps.collaborate.description": "Různí validátoři mají různé techniky ověřování. Připojte se ke konverzaci na {mailingListLink} nebo {forumLink}. Přispějte zkušenostmi, které považujete za užitečné a podpoříte jimi komunitu!", - "pages.learn.validate.mailing_lists": "", - "pages.learn.validate.forum": "", - "pages.learn.validate.tagging_schema": "", + "pages.learn.validate.mailing_lists": "e-mailová konference", + "pages.learn.validate.forum": "fórum", + "pages.learn.validate.tagging_schema": "Schéma tagování OpenStreetMap", "pages.learn.validate.note": "Jakmile se v komunitě OpenStreetMap stanete zkušeným mapovačem, získáte jistotu, že jste připraveni se stát validátorem. Můžete se přihlásit do některého z ověřovacích týmů nebo najít projekt, na kterém chcete ověřit. Připojte se k týmu, který vám dá oprávnění k ověření úloh. Nyní máte příležitost udělat krok vpřed a pomoci ostatním mapovačům na jejich cestě", "pages.learn.manage_title": "Naučte se řídit", "pages.learn.manage.intro": "Schopnost organizovat mapovací úsilí je obrovskou příležitostí pro rychlý a koordinovaný sběr dat. Abyste byli úspěšní, musíte být schopni motivovat komunitu mapovačů.", diff --git a/frontend/src/locales/he.json b/frontend/src/locales/he.json index be5db1fecb..4e3b7e3f64 100644 --- a/frontend/src/locales/he.json +++ b/frontend/src/locales/he.json @@ -443,7 +443,7 @@ "project.nav.showMapToggle": "הצגת המפה", "project.nav.listViewToggle": "תצוגת רשימה", "project.navFilters.typesOfMapping": "סוגי המיפוי", - "project.navFilters.typesOfMapping.exactMatch": "", + "project.navFilters.typesOfMapping.exactMatch": "תוצאה מדויקת", "project.navFilters.campaigns": "כל מסעות הפרסום", "project.navFilters.showAllXTags": "הצגת {typeOfTag}", "project.inputs.placeholders.search": "חיפוש מיזם", diff --git a/frontend/src/locales/nl_NL.json b/frontend/src/locales/nl_NL.json index 7eb3c2626f..b3d77ffa32 100644 --- a/frontend/src/locales/nl_NL.json +++ b/frontend/src/locales/nl_NL.json @@ -443,7 +443,7 @@ "project.nav.showMapToggle": "Kaart weergeven", "project.nav.listViewToggle": "Lijstweergave", "project.navFilters.typesOfMapping": "Typen in kaart brengen", - "project.navFilters.typesOfMapping.exactMatch": "", + "project.navFilters.typesOfMapping.exactMatch": "Exacte overeenkomst", "project.navFilters.campaigns": "Alle campagnes", "project.navFilters.showAllXTags": "Weergeven {typeOfTag}", "project.inputs.placeholders.search": "Project zoeken", diff --git a/frontend/src/locales/sv.json b/frontend/src/locales/sv.json index fcbc7c37b9..658683da7b 100644 --- a/frontend/src/locales/sv.json +++ b/frontend/src/locales/sv.json @@ -1,5 +1,5 @@ { - "banner.title": "", + "banner.title": "Om informationen vi samlar in", "banner.button.disagree": "", "banner.button.agree": "", "banner.privacyPolicy": "", @@ -75,7 +75,7 @@ "input.placeholder.Name": "Ditt namn", "header.topBar.slogan": "Kartläggning av vår värld tillsammans", "header.nav.settings": "Inställningar", - "header.nav.my_teams": "Mina lag", + "header.nav.my_teams": "Mina team", "header.nav.logout": "Logga ut", "signup.modal.email": "E-post", "signup.button.submit": "Nästa", @@ -88,7 +88,7 @@ "emailUpdate.modal.text2": "Vi kartlägger tillsammans! Att tillhandahålla din e-postadress är nödvändigt för att kartlägga feedback och direktmeddelanden för att nå dig.", "emailUpdate.modal.privacy_policy": "Läs vår sekretesspolicy för mer information om hur vi skyddar användarnas personuppgifter.", "home.mainSection.title": "Karta för behövande", - "home.mainSection.lead": "", + "home.mainSection.lead": "Gå med i ett globalt community som kartlägger platser utsatta för katastrofer och fattigdom för att stötta humanitärt bistånd och hållbar utveckling över hela världen.", "home.callToAction.title": "Vi kan inte göra det utan dig", "home.callToAction.firstLeadLine": "Vem som helst kan bidra till kartan. Om du aldrig har kartlagt tidigare och vill komma igång, besök vår {link} sida.", "home.callToAction.secondLeadLine": "Är du en erfaren karterare? Klicka nedan för att se vilka projekt som är tillgängliga för kartläggning.", @@ -102,7 +102,7 @@ "home.stats.community": "Totalt karterare", "home.stats.mappers": "Kartor Online", "home.mappingFlow.title": "Varje år dödar katastrofer runt om i världen nästan {number} och drabbar eller förskjuter 200 miljoner människor. Mappning kan hjälpa till att ändra detta.", - "home.mappingFlow.headLine": "", + "home.mappingFlow.headLine": "Organisationer använder Tasking Manager för att skapa kartläggningsprojekt för områden runt om i världen där data behövs för att rädda eller förbättra liv.", "home.mappingFlow.cards.mapping.title": "Kartläggning", "home.mappingFlow.cards.validation.title": "Validering", "home.mappingFlow.cards.usingData.title": "Använda data", @@ -121,13 +121,13 @@ "home.contact.contacterHeadText": "Vill du diskutera att arbeta med oss? Eller har du en fråga eller feedback som du vill dela med dig av? Fyll i formuläret nedan för att kontakta vårt team.", "home.contact.submit": "Skicka", "home.testimonials.title": "Du kan göra skillnad", - "home.testimonials.ifrc.citation": "I början av cyklonen Idais svar letade IFRC efter detaljerade kartor för att få en känsla av omfattningen av översvämningarna, som också användes för sök- och räddningsinsatser. Senare fick vi önskemål om att identifiera var vissa byggnader, såsom vårdcentraler eller sjukhus, fanns så att vårt vårdteam kunde bedöma patienternas skador och medicinska behov.", - "home.testimonials.ifrc.bio": "Fjärrkoordinator för IFRC-informationshanteringsgruppen för Cyclone Idai", + "home.testimonials.ifrc.citation": "I början av insatsen efter cyklonen Idai letade IFRC efter detaljerade kartor för att få en känsla av omfattningen av översvämningarna, som också användes för sök- och räddningsinsatser. Senare fick vi önskemål om att identifiera var vissa byggnader, såsom vårdcentraler eller sjukhus, fanns så att vårt vårdteam kunde bedöma patienternas skador och medicinska behov.", + "home.testimonials.ifrc.bio": "Fjärrkoordinator för IFRC:s -informationshanteringsgrupp för cyklonen Idai", "localeSelect.language": "Språk", "formInputs.organisation.select": "Välj organisation", "formInputs.country.select": "Land", - "foooter.definition": "", - "footer.credits": "", + "foooter.definition": "Tasking Manager är en plattform där individer kan samarbeta för att kartlägga i OpenStreetMap.", + "footer.credits": "Fri programvara med öppen källkod, från Humanitarian OpenStreetMap Team.", "footer.learn": "Läs mer om OpenStreetMap.", "footer.privacyPolicy": "", "mapping.level.all": "Alla nivåer", @@ -145,7 +145,7 @@ "notifications.filter.messages": "Meddelanden", "notifications.bodytitle.message": "Meddelande", "notifications.filter.tasks": "Uppgifter", - "notifications.filter.teams": "Lag", + "notifications.filter.teams": "Team", "notifications.filter.projects": "Projekt", "notifications.filter.clear": "Rensa filter", "notifications.markAsRead": "", @@ -168,11 +168,11 @@ "notifications.refresh": "Uppdatera", "notifications.message.type.system": "", "notifications.message.type.broadcast": "", - "notifications.message.type.team": "", + "notifications.message.type.team": "Teammeddelande", "notifications.message.type.mention_notification": "", "notifications.message.type.validation_notification": "Validering", "notifications.message.type.invalidation_notification": "", - "notifications.message.type.request_team_notification": "", + "notifications.message.type.request_team_notification": "Teamförfrågan", "notifications.message.type.invitation_notification": "", "notifications.message.type.task_comment_notification": "", "notifications.message.type.project_chat_notification": "", @@ -203,7 +203,7 @@ "management.projects.create.steps.1": "Steg 1: definiera område", "management.projects.create.steps.2": "Steg 2: ange uppgifternas storlek", "management.projects.create.steps.3": "Steg 3: trimma rutnät för uppgift", - "management.projects.create.steps.4": "Steg 4: granskning", + "management.projects.create.steps.4": "Steg 4: granska", "management.projects.create.review_tasks.name": "Namn", "management.projects.create.review_tasks.failure.message": "Det gick inte att spara projektet på grund av ett fel: {error}", "management.projects.create.review_tasks.button.create": "Skapa", @@ -236,7 +236,7 @@ "management.projects.create.arbitrary_tasks": "", "management.projects.create.draw.description": "", "management.projects.create.upload.description": "", - "project.detail.teams.empty": "Detta projekt har inga lag associerade med.", + "project.detail.teams.empty": "Detta projekt har inga associerade team.", "project.detail.coordination": "", "project.detail.coordination.description": "", "project.detail.createdBy": "", @@ -267,9 +267,9 @@ "project.detail.questionsAndComments.none": "Det finns för närvarande inga frågor eller kommentarer om detta projekt. Bli den första att posta en!", "project.detail.questionsAndComments.button": "Post", "project.detail.share": "Dela", - "project.detail.team": "Lag", - "project.detail.validation_team": "Valideringslag", - "project.detail.teams_permissions": "Lag & behörigheter", + "project.detail.team": "Team", + "project.detail.validation_team": "Valideringsteam", + "project.detail.teams_permissions": "Team & Behörigheter", "project.detail.author": "", "project.detail.mapping_permissions": "Vem kan kartlägga?", "project.detail.validation_permissions": "Vem kan validera?", @@ -305,8 +305,8 @@ "project.share.linkedin": "", "projects.formInputs.privacy.title": "Integritet", "projects.formInputs.privacy.field": "", - "projects.formInputs.privacy.description": "Privat innebär att endast de användare som är projektlagmedlemmar kan komma åt, kartlägga eller validera det här projektet. Det här alternativet åsidosätter behörigheterna för mappning och validering.", - "projects.formInputs.teams.title": "Lag", + "projects.formInputs.privacy.description": "Privat innebär att endast de användare som är teammedlemmar i projektet kan komma åt, kartlägga eller validera det här projektet. Det här alternativet åsidosätter behörigheterna för kartering och validering.", + "projects.formInputs.teams.title": "Team", "projects.formInputs.organisation.title": "Organisation", "projects.formInputs.campaign.title": "Kampanj", "projects.formInputs.categories.title": "Kategorier", @@ -316,7 +316,7 @@ "projects.formInputs.campaign.select": "", "projects.formInputs.permissions.any": "Alla användare", "projects.formInputs.permissions.level": "Endast användare med medel eller avancerad nivå", - "projects.formInputs.permissions.teams": "Endast gruppmedlemmar", + "projects.formInputs.permissions.teams": "Endast teammedlemmar", "projects.formInputs.permissions.teamsAndLevel": "Endast medel och avancerade teammedlemmar", "projects.formInputs.permissions.mapping.description": "Definiera vilka användare som kan kartera projektet.", "projects.formInputs.permissions.validation.description": "Definiera vilka användare som kan validera projektet.", @@ -394,7 +394,7 @@ "projects.formInputs.shortDescription": "", "projects.formInputs.instructions": "", "projects.formInputs.osmcha_filter_id": "", - "projects.formInputs.osmcha_filter_id.description": "", + "projects.formInputs.osmcha_filter_id.description": "Valfritt id för ett sparat OSMCha-filter som ska tillämpas när du visar projektet i OSMCha, om du önskar anpassad filtrering. Observera att detta ersätter alla standardfilter. Exempel: 095e8b31-b3cb-4b36-a106-02826fb6a109 (för enkelhet kan du också klistra in en OSMCha-URL här som använder ett sparat filter, så extraheras filter-id:t åt dig).", "projects.formInputs.priority_areas.description": "", "projects.formInputs.mapping_types": "Typer av kartläggning", "projects.formInputs.id_presets": "", @@ -470,7 +470,7 @@ "project.sortby.id.descending": "Nya projekt", "project.sortby.id.ascending": "Gamla projekt", "project.sortby.priority": "Brådskande projekt", - "project.sortby.difficulty.beginner": "Nybörjare projekt", + "project.sortby.difficulty.beginner": "Nybörjarprojekt", "project.sortby.difficulty.advanced": "Avancerade projekt", "project.sortby.more_active": "Aktiva projekt", "project.nav.apply": "Applicera", @@ -636,24 +636,24 @@ "project.permissions.error.title": "", "project.permissions.error.userLevelToValidate": "", "project.permissions.error.userLevelToMap": "", - "project.permissions.error.userIsNotValidationTeamMember": "", - "project.permissions.error.userIsNotMappingTeamMember": "", + "project.permissions.error.userIsNotValidationTeamMember": "Du måste vara medlem i ett av valideringsteamen för att kunna validera detta projekt.", + "project.permissions.error.userIsNotMappingTeamMember": "Du måste vara medlem i ett av kartläggningsteamen för att kunna kartera detta projekt.", "management.messages.notAllowed": "", "management.messages.imageUpload.error": "", "management.fields.managers": "Hanterare", "management.link.manage": "Hantera {entity}", - "management.link.edit.team": "", + "management.link.edit.team": "Redigera team", "management.members": "Medlemmar", - "management.teams.mapping": "Kartläggnings lag", - "management.teams.validation": "Valideringslag", - "management.teams.members": "Medlemmar i laget", - "management.teams.members.send_message": "", + "management.teams.mapping": "Kartläggningsteam", + "management.teams.validation": "Valideringsteam", + "management.teams.members": "Teammedlemmar", + "management.teams.members.send_message": "Teamkommunikation", "management.teams.members.send_message.button": "Skicka", "management.teams.members.send_message.subject": "Ämne", "management.teams.join_requests": "Gå med i förfrågningar", - "management.teams.join_requests.empty": "", - "management.teams": "Lag", - "management.team": "Laget", + "management.teams.join_requests.empty": "Det finns inga förfrågningar att gå med i teamet.", + "management.teams": "Team", + "management.team": "Team", "management.projects": "Projekt", "management.campaigns": "", "management.campaign": "Kampanj", @@ -663,10 +663,10 @@ "management.user": "", "management.category": "", "management.titles.category_information": "Information om kategori", - "management.edit_members": "", + "management.edit_members": "Du kan lägga till fler användare efter att du sparat första gången.", "management.filter.buttons.myOrganisations": "", "management.filter.buttons.all": "Alla", - "management.myTeams": "Mina lag", + "management.myTeams": "Mina team", "management.buttons.add": "Lägg till", "management.buttons.delete": "Radera", "management.buttons.accept": "Acceptera", @@ -698,9 +698,9 @@ "management.teams.visibility.public": "Offentlig", "management.teams.visibility.private": "Privat", "management.teams.invite_only.description": "Chefer måste godkänna en medlems begäran att gå med.", - "teamsAndOrgs.management.teams.messages.waiting_approval": "Din begäran om att gå med i detta team väntar på godkännande.", + "teamsAndOrgs.management.teams.messages.waiting_approval": "Din förfrågan om att gå med i detta team väntar på godkännande.", "management.projects.no_found": "Denna {entity} har inte några projekt ännu.", - "management.organisation.teams.no_found": "Inga lag hittades.", + "management.organisation.teams.no_found": "Inga team hittades.", "user.nextLevel": "", "user.personalInfo": "Personlig information", "user.name": "Namn", @@ -729,8 +729,8 @@ "user.settings.become_validator.description": "", "user.notifications.mentions": "", "user.notifications.mentions.description": "", - "user.notifications.teams": "", - "user.notifications.teams.description": "", + "user.notifications.teams": "Teammeddelanden via e-post", + "user.notifications.teams.description": "Få e-post med meddelanden från teamadministratörer.", "user.notifications.projects": "", "user.notifications.tasks": "", "user.settings.required": "", @@ -751,7 +751,7 @@ "user.completeness.button": "Slutför min profil", "user.help.card.title": "Behöver du hjälp?", "user.help.card.howToMap": "Hur man kartlägger?", - "user.help.card.quickStart": "", + "user.help.card.quickStart": "Snabbstartsguide", "user.help.card.whatIsOSM": "Vad är OpenStreetMap?", "user.welcome.firstProject.title": "Bidra till ditt första projekt", "user.welcome.firstProject.text1": "Ser ut som du inte har kartlagt några uppgifter ännu.", @@ -769,7 +769,7 @@ "user.settings.email.resend": "", "users.detail.MyProjects": "Mina projekt", "users.detail.MyTasks": "Mina uppgifter", - "users.detail.MyTeams": "Mina lag", + "users.detail.MyTeams": "Mina team", "users.detail.MyContribs": "Mina bidrag", "users.detail.MyStats": "Min statistik", "users.list.search.username": "Sök efter användarnamn", @@ -814,7 +814,7 @@ "users.detail.heatmapLegendMore": "mer", "users.detail.heatmapLegendLess": "mindre", "users.detail.delay_popup": "", - "users.detail.teams": "Lag", + "users.detail.teams": "Team", "error.page.title": "", "error.page.description": "", "error.page.link": "", @@ -824,23 +824,23 @@ "project.stats.timeline": "", "management.forbiddenAccess.title": "", "teamsAndOrgs.management.project.forbidden": "", - "teamsAndOrgs.management.team.forbidden": "", + "teamsAndOrgs.management.team.forbidden": "Du har inte behörighet att redigera detta team.", "loginPage.title": "Logga in eller registrera ett konto", "management.users.title": "Hantera användare", "teamsAndOrgs.management.organisation.creation": "", - "teamsAndOrgs.management.team.creation": "", + "teamsAndOrgs.management.team.creation": "Skapa nytt team", "teamsAndOrgs.management.campaign.creation": "Skapa ny kampanj", "teamsAndOrgs.management.organisation.button.create": "Skapa organisation", - "teamsAndOrgs.management.team.button.create": "", + "teamsAndOrgs.management.team.button.create": "Skapa team", "teamsAndOrgs.management.campaign.button.create": "", - "teamsAndOrgs.management.button.my_teams": "Mina lag", - "teamsAndOrgs.management.button.join_team": "Gå med i laget", + "teamsAndOrgs.management.button.my_teams": "Mina team", + "teamsAndOrgs.management.button.join_team": "Gå med i teamet", "teamsAndOrgs.management.button.cancel_request": "Avbryt begäran", - "teamsAndOrgs.management.button.leave_team": "Lämna laget", + "teamsAndOrgs.management.button.leave_team": "Lämna teamet", "teamsAndOrgs.management.button.cancel": "Avbryt", "teamsAndOrgs.management.organisation.manage.error": "", "teamsAndOrgs.management.organisation.manage": "Hantera organisation", - "teamsAndOrgs.management.team.manage": "Hantera lag", + "teamsAndOrgs.management.team.manage": "Hantera team", "teamsAndOrgs.management.campaign.manage": "Hantera kampanj", "teamsAndOrgs.management.titles.team_information": "Information om teamet", "teamsAndOrgs.management.titles.campaign_information": "Information om kampanjen", @@ -869,11 +869,11 @@ "pages.learn.map.description": "", "pages.learn.videos.title": "", "pages.learn.manuals.title": "", - "pages.learn.tutorials.quick_start.title": "", - "pages.learn.tutorials.quick_start.description": "Steg för steg instruktioner för att få dig kartläggning så fort som möjligt.", + "pages.learn.tutorials.quick_start.title": "Snabbstartsguide", + "pages.learn.tutorials.quick_start.description": "Steg för steg-instruktioner så att du kan börja kartlägga så fort som möjligt.", "pages.learn.tutorials.tm_manual.title": "Användarhandbok för Tasking Manager", "pages.learn.tutorials.tm_manual.description": "", - "pages.learn.tutorials.osm_step_by_step.title": "Lär OpenStreetMap steg för steg", + "pages.learn.tutorials.osm_step_by_step.title": "Lär dig OpenStreetMap steg för steg", "pages.learn.tutorials.osm_step_by_step.description": "", "pages.learn.tutorials.learnosm.title": "", "pages.learn.tutorials.learnosm.description": "", @@ -895,7 +895,7 @@ "pages.learn.validate.training.video.description": "", "pages.learn.validate_title": "", "pages.learn.validate.intro": "", - "pages.learn.validate.description": "", + "pages.learn.validate.description": "Att få ett andra, tredje eller fjärde par ögon på karterade objekt är ett viktigt steg för att säkerställa kvaliteten på data som läggs till i OpenStreetMap och sedan används över hela världen.", "pages.learn.validate.steps.identify.title": "", "pages.learn.validate.steps.identify.description": "", "pages.learn.validate.steps.build.title": "", @@ -915,10 +915,10 @@ "pages.learn.manage.steps.create.description": "", "pages.learn.manage.steps.data.title": "", "pages.learn.manage.steps.data.description": "", - "pages.quickstart.title": "", - "pages.quickstart.intro": "", + "pages.quickstart.title": "Snabbstartsguide", + "pages.quickstart.intro": "Dessa steg för steg-instruktioner hjälper dig komma igång att kartera med Tasking Manager på OpenStreetMap.", "pages.quickstart.quickstartStep1": "", - "pages.quickstart.quickstartStep1Note": "", + "pages.quickstart.quickstartStep1Note": "Har du redan ett OpenStreetMap-konto? Då kan du hoppa till steg 4.", "pages.quickstart.quickstartStep2": "", "pages.quickstart.quickstartStep3": "", "pages.quickstart.quickstartStep4": "", @@ -928,8 +928,8 @@ "pages.quickstart.quickstartStep7Note": "", "pages.quickstart.quickstartStep8": "", "pages.quickstart.quickstartStep8Note": "", - "pages.quickstart.quickstartStep9": "", - "pages.quickstart.quickstartStep9Note": "", + "pages.quickstart.quickstartStep9": "När du är färdig med kartläggningen, spara dina ändringar och klicka {submitTask}.", + "pages.quickstart.quickstartStep9Note": "Efter detta kan du gå tillbaka till steg 7 och välja en ny uppgift att kartera. Tack för att du bidrar till OpenStreetMap!", "pages.concact.title": "", "home.contact.thanksTitle": "", "home.contact.thanksError": "", From 52b95aa6f7acfa447b29964d1fa71e6679f43fee Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 6 Dec 2020 11:58:44 +0000 Subject: [PATCH 03/22] Bump @testing-library/react-hooks from 3.4.2 to 3.5.0 in /frontend Bumps [@testing-library/react-hooks](https://github.com/testing-library/react-hooks-testing-library) from 3.4.2 to 3.5.0. - [Release notes](https://github.com/testing-library/react-hooks-testing-library/releases) - [Changelog](https://github.com/testing-library/react-hooks-testing-library/blob/master/CHANGELOG.md) - [Commits](https://github.com/testing-library/react-hooks-testing-library/compare/v3.4.2...v3.5.0) Signed-off-by: dependabot-preview[bot] --- frontend/package.json | 2 +- frontend/yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 314701ec3c..b8a3f22a08 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -95,7 +95,7 @@ "devDependencies": { "@testing-library/jest-dom": "^5.11.6", "@testing-library/react": "^11.2.2", - "@testing-library/react-hooks": "^3.4.2", + "@testing-library/react-hooks": "^3.5.0", "combine-react-intl-messages": "^4.0.0", "jest-canvas-mock": "^2.3.0", "msw": "^0.24.1", diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 2b72d9b4d4..5a1ff91cd5 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -1000,7 +1000,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== @@ -1873,12 +1873,12 @@ lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react-hooks@^3.4.2": - version "3.4.2" - resolved "https://registry.yarnpkg.com/@testing-library/react-hooks/-/react-hooks-3.4.2.tgz#8deb94f7684e0d896edd84a4c90e5b79a0810bc2" - integrity sha512-RfPG0ckOzUIVeIqlOc1YztKgFW+ON8Y5xaSPbiBkfj9nMkkiLhLeBXT5icfPX65oJV/zCZu4z8EVnUc6GY9C5A== +"@testing-library/react-hooks@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@testing-library/react-hooks/-/react-hooks-3.5.0.tgz#8d728f2d56d615935116385f3ff9335e3402e46b" + integrity sha512-PpztMzQ+h8hXwd9TtSx6H+D5sKv7sW0sRr0dOW3x9O5yNOHlg5Yi4uCMhYBuGYAHM7XJyceb+u4D3CgT8LotKg== dependencies: - "@babel/runtime" "^7.5.4" + "@babel/runtime" "^7.12.5" "@types/testing-library__react-hooks" "^3.4.0" "@testing-library/react@^11.2.2": From 27f63d61acefa3878f79b99671d7bed6e3ad8cbd Mon Sep 17 00:00:00 2001 From: Wille Marcel Date: Mon, 7 Dec 2020 07:11:21 -0300 Subject: [PATCH 04/22] Use .contains instead of .ilike on user filtering (#3950) * Use contains instead of ilike on user filtering * Improve user search: - implement pattern match using ilike for usernames Co-authored-by: Diana Rita Nanyanzi <31903212+d-rita@users.noreply.github.com> --- backend/models/postgis/user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/models/postgis/user.py b/backend/models/postgis/user.py index 179e2fba12..4c910de3c7 100644 --- a/backend/models/postgis/user.py +++ b/backend/models/postgis/user.py @@ -151,7 +151,7 @@ def get_all_users(query: UserSearchQuery) -> UserSearchDTO: ] base = base.filter(User.mapping_level.in_(mapping_level_array)) if query.username: - base = base.filter(User.username.ilike(query.username.lower() + "%")) + base = base.filter(User.username.ilike(("%" + query.username + "%"))) if query.role: roles = query.role.split(",") From 51513345e42ac6ced9d92f8c9460227d13ab050a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 7 Dec 2020 11:45:28 +0000 Subject: [PATCH 05/22] Bump @testing-library/react-hooks from 3.5.0 to 3.6.0 in /frontend Bumps [@testing-library/react-hooks](https://github.com/testing-library/react-hooks-testing-library) from 3.5.0 to 3.6.0. - [Release notes](https://github.com/testing-library/react-hooks-testing-library/releases) - [Changelog](https://github.com/testing-library/react-hooks-testing-library/blob/master/CHANGELOG.md) - [Commits](https://github.com/testing-library/react-hooks-testing-library/compare/v3.5.0...v3.6.0) Signed-off-by: dependabot-preview[bot] --- frontend/package.json | 2 +- frontend/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index b8a3f22a08..66dad477bf 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -95,7 +95,7 @@ "devDependencies": { "@testing-library/jest-dom": "^5.11.6", "@testing-library/react": "^11.2.2", - "@testing-library/react-hooks": "^3.5.0", + "@testing-library/react-hooks": "^3.6.0", "combine-react-intl-messages": "^4.0.0", "jest-canvas-mock": "^2.3.0", "msw": "^0.24.1", diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 5a1ff91cd5..6ba6b7ef10 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -1873,10 +1873,10 @@ lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react-hooks@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@testing-library/react-hooks/-/react-hooks-3.5.0.tgz#8d728f2d56d615935116385f3ff9335e3402e46b" - integrity sha512-PpztMzQ+h8hXwd9TtSx6H+D5sKv7sW0sRr0dOW3x9O5yNOHlg5Yi4uCMhYBuGYAHM7XJyceb+u4D3CgT8LotKg== +"@testing-library/react-hooks@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@testing-library/react-hooks/-/react-hooks-3.6.0.tgz#37e595eb1111e71b39ef0597b390850b9af3660d" + integrity sha512-7TbqFN4CqEmfR6bC50XOtXbM3A5sizzEOmcH7IBVdm0oFnqmlkPTnu4sMt9BfepsYDvVpF8Y2CaoMJlfmyLYuQ== dependencies: "@babel/runtime" "^7.12.5" "@types/testing-library__react-hooks" "^3.4.0" From bbd03ffbdd8e5925466d73a3820e71ac4af3d918 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 10 Dec 2020 18:59:54 +0000 Subject: [PATCH 06/22] [Security] Bump ini from 1.3.5 to 1.3.7 in /frontend Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.7. **This update includes a security fix.** - [Release notes](https://github.com/isaacs/ini/releases) - [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.7) Signed-off-by: dependabot-preview[bot] --- frontend/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 6ba6b7ef10..43e0305a63 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -6520,9 +6520,9 @@ inherits@2.0.3: integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= ini@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + version "1.3.7" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" + integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== inquirer@7.0.4: version "7.0.4" From 40a7983ff558a14f5f993103f4fd6846f262147e Mon Sep 17 00:00:00 2001 From: Wille Marcel Date: Tue, 8 Dec 2020 10:09:51 -0300 Subject: [PATCH 07/22] Add Intl.Locale polyfill --- frontend/package.json | 1 + frontend/src/utils/internationalization.js | 22 ++++++++++++++------- frontend/yarn.lock | 23 ++++++++++++++++++++++ 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 66dad477bf..6764523c89 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -4,6 +4,7 @@ "license": "BSD-2-Clause", "private": false, "dependencies": { + "@formatjs/intl-locale": "^2.4.8", "@formatjs/intl-pluralrules": "^4.0.0", "@formatjs/intl-relativetimeformat": "^8.0.0", "@formatjs/intl-utils": "^3.8.4", diff --git a/frontend/src/utils/internationalization.js b/frontend/src/utils/internationalization.js index f99011654e..e8039ea115 100644 --- a/frontend/src/utils/internationalization.js +++ b/frontend/src/utils/internationalization.js @@ -1,6 +1,7 @@ import React, { useEffect } from 'react'; import { connect } from 'react-redux'; import { IntlProvider } from 'react-intl'; +import { shouldPolyfill } from '@formatjs/intl-locale/should-polyfill'; import ar from '../locales/ar.json'; import cs from '../locales/cs.json'; @@ -31,14 +32,21 @@ import zh_TW from '../locales/zh_TW.json'; import { setLocale } from '../store/actions/userPreferences'; import * as config from '../config'; -/* Safari 12- and IE */ -if (!Intl.PluralRules) { - require('@formatjs/intl-pluralrules/polyfill-locales'); -} -/* Safari 13- and IE */ -if (!Intl.RelativeTimeFormat) { - require('@formatjs/intl-relativetimeformat/polyfill-locales'); +async function polyfill() { + // This platform already supports Intl.Locale + if (shouldPolyfill()) { + await import('@formatjs/intl-locale/polyfill'); + } + /* Safari 12- and IE */ + if (!Intl.PluralRules) { + require('@formatjs/intl-pluralrules/polyfill-locales'); + } + /* Safari 13- and IE */ + if (!Intl.RelativeTimeFormat) { + require('@formatjs/intl-relativetimeformat/polyfill-locales'); + } } +polyfill(); const translatedMessages = { ar: ar, diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 43e0305a63..c6b7b01bb9 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -1158,6 +1158,14 @@ "@formatjs/ecma402-abstract" "1.5.0" tslib "^2.0.1" +"@formatjs/intl-getcanonicallocales@1.5.2": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@formatjs/intl-getcanonicallocales/-/intl-getcanonicallocales-1.5.2.tgz#64b33bc80275d8b9056a4ba80da57a5719d60130" + integrity sha512-oOtLAHSocSaJUtqEXnt2gYvZyxfjBkM2r7JKkoij2K91v02zE1Wc//Wvs3eq08xiMxhC5OlkCflbngZirmBm/w== + dependencies: + cldr-core "37.0.0" + tslib "^2.0.1" + "@formatjs/intl-listformat@5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-5.0.1.tgz#25994d06acc81a2a0eaae9ac59e7a2fa851be8f0" @@ -1166,6 +1174,16 @@ "@formatjs/ecma402-abstract" "1.5.0" tslib "^2.0.1" +"@formatjs/intl-locale@^2.4.8": + version "2.4.8" + resolved "https://registry.yarnpkg.com/@formatjs/intl-locale/-/intl-locale-2.4.8.tgz#9ce862484dfff66a03de1e0176e47fd6894a2f4f" + integrity sha512-AH41FTHJ+jPx/QYZQxfTy8Yfs480nidsPb7/VMFY7JRIjDG/PXFJBHqFUXV/rKwduTETc05+s9jFBieeNDTIrA== + dependencies: + "@formatjs/ecma402-abstract" "1.5.0" + "@formatjs/intl-getcanonicallocales" "1.5.2" + cldr-core "^37.0.0" + tslib "^2.0.1" + "@formatjs/intl-pluralrules@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@formatjs/intl-pluralrules/-/intl-pluralrules-4.0.0.tgz#c5fe276d589666624ab49310714932512803cb7f" @@ -3707,6 +3725,11 @@ classnames@^2.2.6: resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== +cldr-core@37.0.0, cldr-core@^37.0.0: + version "37.0.0" + resolved "https://registry.yarnpkg.com/cldr-core/-/cldr-core-37.0.0.tgz#f148d6faebed52a7fb8a17cccc4ac858770f663a" + integrity sha512-tNH5lbfsE9xzsjjXQjq1tlpMFcmnQYfssDy0zYIZKVtAY18MeQy0+1qlLxB2Z9dwCixGJV8cdhtFjBOub077Gw== + clean-css@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" From 54eed2377f93390d8bb18de8524065c84a17c19f Mon Sep 17 00:00:00 2001 From: Wille Marcel Date: Thu, 10 Dec 2020 17:13:01 -0300 Subject: [PATCH 08/22] update frontend dependencies --- frontend/package.json | 12 ++-- frontend/yarn.lock | 137 ++++++++++++++++++++++-------------------- 2 files changed, 77 insertions(+), 72 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 6764523c89..843e51f4e7 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -17,8 +17,8 @@ "@mapbox/mapbox-gl-language": "^0.10.1", "@mapbox/togeojson": "^0.16.0", "@reach/router": "^1.3.4", - "@sentry/react": "^5.28.0", - "@sentry/tracing": "^5.28.0", + "@sentry/react": "^5.29.0", + "@sentry/tracing": "^5.29.0", "@turf/area": "^6.0.1", "@turf/bbox": "^6.0.1", "@turf/bbox-polygon": "^6.0.1", @@ -29,15 +29,15 @@ "@webscopeio/react-textarea-autocomplete": "^4.7.2", "axios": "^0.21.0", "chart.js": "^2.9.4", - "dompurify": "^2.2.2", + "dompurify": "^2.2.3", "downshift-hooks": "^0.8.1", "final-form": "^4.20.1", "fromentries": "^1.3.2", - "humanize-duration": "^3.24.0", + "humanize-duration": "^3.25.0", "immutable": "^4.0.0-rc.12", "mapbox-gl": "^1.13.0", "mapbox-gl-draw-rectangle-mode": "^1.0.4", - "marked": "^1.2.5", + "marked": "^1.2.6", "node-sass": "^4.14.1", "osmtogeojson": "^3.0.0-beta.3", "query-string": "^6.13.7", @@ -96,7 +96,7 @@ "devDependencies": { "@testing-library/jest-dom": "^5.11.6", "@testing-library/react": "^11.2.2", - "@testing-library/react-hooks": "^3.6.0", + "@testing-library/react-hooks": "^3.7.0", "combine-react-intl-messages": "^4.0.0", "jest-canvas-mock": "^2.3.0", "msw": "^0.24.1", diff --git a/frontend/yarn.lock b/frontend/yarn.lock index c6b7b01bb9..bf74c80009 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -1685,79 +1685,79 @@ prop-types "^15.6.1" react-lifecycles-compat "^3.0.4" -"@sentry/browser@5.28.0": - version "5.28.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.28.0.tgz#f4c094bb97070442d95d51966a5e4dc8b92f586f" - integrity sha512-u1W47fgYFGWTV+RRQtNBzPZMXfR4MqCYSpuUVSpWQ+riITH7pvjG1cnBYDGT7+Q1s1wGrAL/9ElJfF795VVT9g== - dependencies: - "@sentry/core" "5.28.0" - "@sentry/types" "5.28.0" - "@sentry/utils" "5.28.0" +"@sentry/browser@5.29.0": + version "5.29.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.29.0.tgz#a8cab91729c759c456bd2254cef65bafa5cdc4ea" + integrity sha512-kRlt1mE2wrYjspnIupNnPxqsUrRuy02SuXhbpP7J6uu8QasoEmJ78hk0hHz4jOZRmuWwfs2zIXD4tLGgWOKq8A== + dependencies: + "@sentry/core" "5.29.0" + "@sentry/types" "5.29.0" + "@sentry/utils" "5.29.0" tslib "^1.9.3" -"@sentry/core@5.28.0": - version "5.28.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.28.0.tgz#2b5ee2b76f0ccd73545eac61c3c2d72d7c76f531" - integrity sha512-hLAUFauqX+v/ap8ATJFdp392ZvfFoR0Gb4pyRkzOeWWs5ZYuqyb9Dsjtwsb61HH/XHQGW/BKZJR2dgIjQq4JGA== +"@sentry/core@5.29.0": + version "5.29.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.29.0.tgz#4410ca0dc5785abf3df02fa23c18e83ad90d7cda" + integrity sha512-a1sZBJ2u3NG0YDlGvOTwUCWiNjhfmDtAQiKK1o6RIIbcrWy9TlSps7CYDkBP239Y3A4pnvohjEEKEP3v3L3LZQ== dependencies: - "@sentry/hub" "5.28.0" - "@sentry/minimal" "5.28.0" - "@sentry/types" "5.28.0" - "@sentry/utils" "5.28.0" + "@sentry/hub" "5.29.0" + "@sentry/minimal" "5.29.0" + "@sentry/types" "5.29.0" + "@sentry/utils" "5.29.0" tslib "^1.9.3" -"@sentry/hub@5.28.0": - version "5.28.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.28.0.tgz#6a00b1011c0492b6acbaf0e24961fbd1c7edd1c1" - integrity sha512-1k19yJJcKoHbw12FET35t0m86lx/X6eJ6r4qM13eb2WN/OpoFtsgs1IjQOhGFL3OfVMcfh800Lc57ga04RLjLA== +"@sentry/hub@5.29.0": + version "5.29.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.29.0.tgz#d018b978fdffc6c8261744b0d08e8d25a3f4dc58" + integrity sha512-kcDPQsRG4cFdmqDh+TzjeO7lWYxU8s1dZYAbbl1J4uGKmhNB0J7I4ak4SGwTsXLY6fhbierxr6PRaoNojCxjPw== dependencies: - "@sentry/types" "5.28.0" - "@sentry/utils" "5.28.0" + "@sentry/types" "5.29.0" + "@sentry/utils" "5.29.0" tslib "^1.9.3" -"@sentry/minimal@5.28.0": - version "5.28.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.28.0.tgz#bfa63f5961988e6652207c77b3ea46d89f2d52bf" - integrity sha512-HzFrJx0xe5KETEZc7RxlH+1TfmH3q8w35ILOP5HGvk3+lG1DR25wHbMFmuUqNqVXrl26t0z32UBI30G1MxmTfA== +"@sentry/minimal@5.29.0": + version "5.29.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.29.0.tgz#bd8b52f388abcec2234dbbc6d6721ff65aa30e35" + integrity sha512-nhXofdjtO41/caiF1wk1oT3p/QuhOZDYdF/b29DoD2MiAMK9IjhhOXI/gqaRpDKkXlDvd95fDTcx4t/MqqcKXA== dependencies: - "@sentry/hub" "5.28.0" - "@sentry/types" "5.28.0" + "@sentry/hub" "5.29.0" + "@sentry/types" "5.29.0" tslib "^1.9.3" -"@sentry/react@^5.28.0": - version "5.28.0" - resolved "https://registry.yarnpkg.com/@sentry/react/-/react-5.28.0.tgz#75c7ac3b9af1c34997ff9304c7bea46edc8f17f2" - integrity sha512-WWUhnnAlAIHj5gwP4qRg440TA7s/VRu19zh+59wrTzc2x9LrxiCe0jLs21jcKKVDCW6u8UPVIkrmSYEPT9/gcw== +"@sentry/react@^5.29.0": + version "5.29.0" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-5.29.0.tgz#367bf4113c4abc6477385383013aaaa381668baa" + integrity sha512-caSdAf+XqNrFw5xAj4gyOSd/33IccVhMlu60MuOOs6B6C3YxbMWUBTSuHeyxgK671ufIA+sxvipzMSVYr4VRAQ== dependencies: - "@sentry/browser" "5.28.0" - "@sentry/minimal" "5.28.0" - "@sentry/types" "5.28.0" - "@sentry/utils" "5.28.0" + "@sentry/browser" "5.29.0" + "@sentry/minimal" "5.29.0" + "@sentry/types" "5.29.0" + "@sentry/utils" "5.29.0" hoist-non-react-statics "^3.3.2" tslib "^1.9.3" -"@sentry/tracing@^5.28.0": - version "5.28.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.28.0.tgz#c61338f7766e17f0d3a9262b1f895f5a66c6d64f" - integrity sha512-7UOgwpMTcSDrWDORY5PpOgw+yzJ9GcyKfqWK7eBqn2NqMdjVNvkZ51eOCSrNUuQ6Nrk7Q7uoPe/hW32Ch/zxvA== +"@sentry/tracing@^5.29.0": + version "5.29.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.29.0.tgz#8ed515b3f9d409137357c38c8622858f9e684e4a" + integrity sha512-2ZITUH7Eur7IkmRAd5gw8Xt2Sfc28btCnT7o2P2J8ZPD65e99ATqjxXPokx0+6zEkTsstIDD3mbyuwkpbuvuTA== dependencies: - "@sentry/hub" "5.28.0" - "@sentry/minimal" "5.28.0" - "@sentry/types" "5.28.0" - "@sentry/utils" "5.28.0" + "@sentry/hub" "5.29.0" + "@sentry/minimal" "5.29.0" + "@sentry/types" "5.29.0" + "@sentry/utils" "5.29.0" tslib "^1.9.3" -"@sentry/types@5.28.0": - version "5.28.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.28.0.tgz#242131fef910bded53350a36ffd7df240cfb8dcf" - integrity sha512-nNhoZEXdqM2xivxJBrLhxtJ2+s6FfKXUw5yBf0Jf/RBrBnH5fggPNImmyfpOoysl72igWcMWk4nnfyP5iDrriQ== +"@sentry/types@5.29.0": + version "5.29.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.29.0.tgz#af5cec98cde54316c14df3121f0e8106e56b578e" + integrity sha512-iDkxT/9sT3UF+Xb+JyLjZ5caMXsgLfRyV9VXQEiR2J6mgpMielj184d9jeF3bm/VMuAf/VFFqrHlcVsVgmrrMw== -"@sentry/utils@5.28.0": - version "5.28.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.28.0.tgz#a30e36afd7094ced8d585c9fde2df2636cca6cf5" - integrity sha512-LW+ReVw9JG6g8Bvp2I1ThMDPATlisvkde+1WykxGqRhu2YIO+PvWhnoFhr9RD0ia3rYVlJkgkuTshMbPJ8HVwA== +"@sentry/utils@5.29.0": + version "5.29.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.29.0.tgz#b4c1223ba362a94cf4850e9ca2cb24655b006b53" + integrity sha512-b2B1gshw2u3EHlAi84PuI5sfmLKXW1z9enMMhNuuNT/CoRp+g5kMAcUv/qYTws7UNnYSvTuVGuZG30v1e0hP9A== dependencies: - "@sentry/types" "5.28.0" + "@sentry/types" "5.29.0" tslib "^1.9.3" "@svgr/babel-plugin-add-jsx-attribute@^4.2.0": @@ -1891,10 +1891,10 @@ lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react-hooks@^3.6.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@testing-library/react-hooks/-/react-hooks-3.6.0.tgz#37e595eb1111e71b39ef0597b390850b9af3660d" - integrity sha512-7TbqFN4CqEmfR6bC50XOtXbM3A5sizzEOmcH7IBVdm0oFnqmlkPTnu4sMt9BfepsYDvVpF8Y2CaoMJlfmyLYuQ== +"@testing-library/react-hooks@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@testing-library/react-hooks/-/react-hooks-3.7.0.tgz#6d75c5255ef49bce39b6465bf6b49e2dac84919e" + integrity sha512-TwfbY6BWtWIHitjT05sbllyLIProcysC0dF0q1bbDa7OHLC6A6rJOYJwZ13hzfz3O4RtOuInmprBozJRyyo7/g== dependencies: "@babel/runtime" "^7.12.5" "@types/testing-library__react-hooks" "^3.4.0" @@ -4770,10 +4770,10 @@ domhandler@^2.3.0: dependencies: domelementtype "1" -dompurify@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.2.tgz#cb8c2b1a2f3c8a0b565127504ae4eedec176a972" - integrity sha512-BsGR4nDLaC5CNBnyT5I+d5pOeaoWvgVeg6Gq/aqmKYWMPR07131u60I80BvExLAJ0FQEIBQ1BTicw+C5+jOyrg== +dompurify@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.3.tgz#ec653ba521b39f397c2ca045769438d593ea8a9f" + integrity sha512-8Hv7Q0FuwD9rWoB6qI2eZsfKbGXfoUVuGHHrE15vgk4ReOKwOkSgbqb2OMFtc0d5besOEkoLkcyuV10zQ2X5gw== domutils@1.3: version "1.3.0" @@ -6388,10 +6388,10 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -humanize-duration@^3.24.0: - version "3.24.0" - resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.24.0.tgz#d851ca6fb93277e30ad789e88bd2019655f514c1" - integrity sha512-B3udnqisaDeRsvUSb+5n2hjxhABI9jotB+i1IEhgHhguTeM5LxIUKoVIu7UpeyaPOygr/Fnv7UhOi45kYYG+tg== +humanize-duration@^3.25.0: + version "3.25.0" + resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.25.0.tgz#ac73be923dbef477c48116f033f8e150f3e0028a" + integrity sha512-QXth17C/8J2QVO0urby5sANmgvwdOF4YZW3mO13ZTkJli4ltVphzMJVG+HkVuTN/bIq1W/O0jRYSyQACus/GVQ== iconv-lite@0.4.24, iconv-lite@^0.4.15, iconv-lite@^0.4.24: version "0.4.24" @@ -8056,7 +8056,12 @@ mapbox-gl@^1.13.0: tinyqueue "^2.0.3" vt-pbf "^3.1.1" -marked@^1.2.5, marked@~1.2.3: +marked@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-1.2.6.tgz#fa55cf38ab3585005c9fb3c1ebfb3d4590c29fdc" + integrity sha512-7vVuSEZ8g/HH3hK/BH/+7u/NJj7x9VY4EHzujLDcqAQLiOUeFJYAsfSAyoWtR17lKrx7b08qyIno4lffwrzTaA== + +marked@~1.2.3: version "1.2.5" resolved "https://registry.yarnpkg.com/marked/-/marked-1.2.5.tgz#a44b31f2a0b8b5bfd610f00d55d1952d1ac1dfdb" integrity sha512-2AlqgYnVPOc9WDyWu7S5DJaEZsfk6dNh/neatQ3IHUW4QLutM/VPSH9lG7bif+XjFWc9K9XR3QvR+fXuECmfdA== From 6c72b9344df4fde0dc66e60c6673f354a6aada98 Mon Sep 17 00:00:00 2001 From: Wille Marcel Date: Fri, 11 Dec 2020 07:43:28 -0300 Subject: [PATCH 09/22] Improve DueDateBox and add it to ProjectCard component on manage projects (#3711) * Improve DueDateBox and add it to ProjectCard component * MInor edits to string * adjust capital letters Co-authored-by: ramyaragupathy --- .../src/components/projectCard/dueDateBox.js | 54 ++++++++----------- .../src/components/projectCard/projectCard.js | 4 +- .../projectCard/tests/dueDateBox.test.js | 42 +++++++++++---- .../src/components/projectDetail/infoPanel.js | 8 ++- .../src/components/projectDetail/messages.js | 4 ++ .../src/components/taskSelection/action.js | 11 ++-- .../src/components/taskSelection/messages.js | 4 ++ frontend/src/locales/en.json | 2 + 8 files changed, 80 insertions(+), 49 deletions(-) diff --git a/frontend/src/components/projectCard/dueDateBox.js b/frontend/src/components/projectCard/dueDateBox.js index 4a4bf8e7a3..8d70e98fbc 100644 --- a/frontend/src/components/projectCard/dueDateBox.js +++ b/frontend/src/components/projectCard/dueDateBox.js @@ -1,73 +1,65 @@ import React, { useState, useEffect } from 'react'; import { FormattedMessage, useIntl } from 'react-intl'; import humanizeDuration from 'humanize-duration'; +import ReactTooltip from 'react-tooltip'; import { ClockIcon } from '../svgIcons'; import messages from './messages'; -export function DueDateBox({ dueDate, intervalMili, align = 'right' }: Object) { +export function DueDateBox({ dueDate, intervalMili, align = 'right', tooltipMsg }: Object) { const intl = useIntl(); const [timer, setTimer] = useState(Date.now()); useEffect(() => { let interval; - if (intervalMili) { interval = setInterval(() => { setTimer(Date.now()); }, intervalMili); // 1 minute } - return () => { clearInterval(interval); }; }, [intervalMili]); - if (dueDate === undefined) { - return null; - } else if (new Date(dueDate) === undefined) { + if (dueDate === undefined || new Date(dueDate) === undefined) { return null; } - const milliDifference = new Date(dueDate) - timer; - const langCodeOnly = intl.locale.slice(0, 2); - - let options = { - language: langCodeOnly, - fallbacks: ['en'], - largest: 1, - }; + let options = { language: intl.locale.slice(0, 2), fallbacks: ['en'], largest: 1 }; let className = `dib relative lh-solid f7 tr ${ align === 'right' ? 'fr' : 'fl' } br1 link ph1 pv2 bg-grey-light blue-grey truncate mw4`; + if (intervalMili !== undefined) { className = className.replace('mw4', ''); - options = { - units: ['h', 'm'], - round: true, - }; + options = { units: ['h', 'm'], round: true }; } + const milliDifference = new Date(dueDate) - timer; if (milliDifference < 60000 * 20 && intervalMili !== undefined) { className = className.replace('bg-grey-light', 'bg-red').replace('blue-grey', 'white'); } if (milliDifference > 0) { return ( - - - - - - + <> + + + + + + + - + {tooltipMsg && } + ); } else { return null; diff --git a/frontend/src/components/projectCard/projectCard.js b/frontend/src/components/projectCard/projectCard.js index 32932a70e3..0d71b65bc5 100644 --- a/frontend/src/components/projectCard/projectCard.js +++ b/frontend/src/components/projectCard/projectCard.js @@ -9,6 +9,7 @@ import { MappingLevelMessage } from '../mappingLevel'; import { ProjectStatusBox } from '../projectDetail/statusBox'; import { PROJECTCARD_CONTRIBUTION_SHOWN_THRESHOLD } from '../../config/index'; import { PriorityBox } from './priorityBox'; +import { DueDateBox } from './dueDateBox'; export function ProjectTeaser({ lastUpdated, @@ -126,11 +127,12 @@ export function ProjectCard({ percentMapped={percentMapped} percentValidated={percentValidated} /> -
+
+ {showBottomButtons && }
diff --git a/frontend/src/components/projectCard/tests/dueDateBox.test.js b/frontend/src/components/projectCard/tests/dueDateBox.test.js index 2be411ee02..633faf31ac 100644 --- a/frontend/src/components/projectCard/tests/dueDateBox.test.js +++ b/frontend/src/components/projectCard/tests/dueDateBox.test.js @@ -1,18 +1,38 @@ import React from 'react'; +import ReactTooltip from 'react-tooltip'; import { DueDateBox } from '../../../components/projectCard/dueDateBox'; import { createComponentWithIntl } from '../../../utils/testWithIntl'; -it('test relative date formatting in English', () => { - // six days of milliseconds plus a few seconds for the test - const sixDaysOut = 6 * 86400 * 1000 + 10000 + Date.now(); - const testDueDateBox = createComponentWithIntl(); - const testInstance = testDueDateBox.root; - expect(testInstance.findByType(DueDateBox).props.dueDate).toBe(sixDaysOut); - // console.log(testInstance.findAllByType('span')[1].children); +describe('test DueDate', () => { + it('relative date formatting in English', () => { + // six days of milliseconds plus a few seconds for the test + const sixDaysOut = 6 * 86400 * 1000 + 10000 + Date.now(); + const testDueDateBox = createComponentWithIntl(); + const testInstance = testDueDateBox.root; + expect(testInstance.findByType(DueDateBox).props.dueDate).toBe(sixDaysOut); + expect(() => testInstance.findByType(ReactTooltip)).toThrow( + new Error('No instances found with node type: "ReactTooltip"'), + ); + expect( + //find the FormattedMessage rendered component + testInstance.findByProps({ className: 'indent' }).children, + ).toContain('6 days left'); + }); - expect( - //find the FormattedMessage rendered component - testInstance.findByProps({ className: 'indent' }).children, - ).toContain('6 days left'); + it('with tooltip message', () => { + // five days of milliseconds plus a few seconds for the test + const fiveDaysOut = 5 * 86400 * 1000 + 10000 + Date.now(); + const testDueDateBox = createComponentWithIntl( + , + ); + const testInstance = testDueDateBox.root; + expect(testInstance.findByType(DueDateBox).props.dueDate).toBe(fiveDaysOut); + expect(testInstance.findByType(ReactTooltip).props.place).toBe('bottom'); + expect(testInstance.findAllByType('span')[0].props['data-tip']).toBe('Tooltip works'); + expect( + //find the FormattedMessage rendered component + testInstance.findByProps({ className: 'indent' }).children, + ).toContain('5 days left'); + }); }); diff --git a/frontend/src/components/projectDetail/infoPanel.js b/frontend/src/components/projectDetail/infoPanel.js index 526363adc9..eab1bd39d8 100644 --- a/frontend/src/components/projectDetail/infoPanel.js +++ b/frontend/src/components/projectDetail/infoPanel.js @@ -1,6 +1,6 @@ import React from 'react'; import ReactPlaceholder from 'react-placeholder'; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage, useIntl } from 'react-intl'; import messages from './messages'; import { MappingTypes } from '../mappingTypes'; @@ -34,6 +34,7 @@ const ProjectDetailTypeBar = (props) => { }; export function ProjectInfoPanel({ project, tasks, contributors, type }: Object) { + const intl = useIntl(); const { percentMapped, percentValidated, percentBadImagery } = useComputeCompleteness(tasks); return (
- +
); diff --git a/frontend/src/components/projectDetail/messages.js b/frontend/src/components/projectDetail/messages.js index 4609b622d0..10afd312ae 100644 --- a/frontend/src/components/projectDetail/messages.js +++ b/frontend/src/components/projectDetail/messages.js @@ -187,6 +187,10 @@ export default defineMessages({ id: 'project.detail.sections.overview', defaultMessage: 'Overview', }, + dueDateTooltip: { + id: 'project.detail.sections.overview.dueDate', + defaultMessage: 'Ideal date to complete the project', + }, description: { id: 'project.detail.sections.description', defaultMessage: 'Description', diff --git a/frontend/src/components/taskSelection/action.js b/frontend/src/components/taskSelection/action.js index a79e7c8a24..d305883385 100644 --- a/frontend/src/components/taskSelection/action.js +++ b/frontend/src/components/taskSelection/action.js @@ -3,7 +3,7 @@ import { useSelector } from 'react-redux'; import { navigate } from '@reach/router'; import ReactPlaceholder from 'react-placeholder'; import Popup from 'reactjs-popup'; -import { FormattedMessage } from 'react-intl'; +import { FormattedMessage, useIntl } from 'react-intl'; import messages from './messages'; import { ProjectInstructions } from './instructions'; @@ -37,6 +37,7 @@ export function TaskMapAction({ project, projectIsReady, tasks, activeTasks, act const [disabled, setDisable] = useState(false); const [taskComment, setTaskComment] = useState(''); const [selectedStatus, setSelectedStatus] = useState(); + const intl = useIntl(); const activeTask = activeTasks && activeTasks[0]; const timer = new Date(activeTask.lastUpdated); @@ -169,7 +170,9 @@ export function TaskMapAction({ project, projectIsReady, tasks, activeTasks, act
))} - +
+ +
@@ -200,12 +203,12 @@ export function TaskMapAction({ project, projectIsReady, tasks, activeTasks, act {taskHistory && taskHistory.taskHistory && taskHistory.taskHistory.length > 1 && ( -
{taskHistory.taskHistory.length} -
+ )} )} diff --git a/frontend/src/components/taskSelection/messages.js b/frontend/src/components/taskSelection/messages.js index ac62f2afe4..515f31b8ce 100644 --- a/frontend/src/components/taskSelection/messages.js +++ b/frontend/src/components/taskSelection/messages.js @@ -126,6 +126,10 @@ export default defineMessages({ id: 'project.sidebar.hide', defaultMessage: 'Hide sidebar', }, + timeToUnlock: { + id: 'project.sidebar.timeToUnlock', + defaultMessage: 'Time available for you to complete work on this task', + }, task: { id: 'project.task', defaultMessage: 'Task', diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 23c33b00d7..ec806abc83 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "If you are new to mapping, we recommend checking the Learn page for instructions before you begin.", "project.detail.cards.submityourwork.description": "Submitting your work is crucial to make sure your data is saved.", "project.detail.sections.overview": "Overview", + "project.detail.sections.overview.dueDate": "Ideal date to complete the project", "project.detail.sections.description": "Description", "project.detail.sections.questionsAndComments": "Questions and comments", "project.detail.sections.contributions": "Contributions", @@ -527,6 +528,7 @@ "project.editor.open_editor": "Open editor", "project.sidebar.show": "Show sidebar", "project.sidebar.hide": "Hide sidebar", + "project.sidebar.timeToUnlock": "Time available for you to complete work on this task", "project.task": "Task", "project.tasks": "Tasks", "project.taskId": "Task #{id}", From 757486fa60823116d84feb3e6adbe63ac3eecfea Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 11 Dec 2020 11:15:15 +0000 Subject: [PATCH 10/22] Bump msw from 0.24.1 to 0.24.2 in /frontend Bumps [msw](https://github.com/mswjs/msw) from 0.24.1 to 0.24.2. - [Release notes](https://github.com/mswjs/msw/releases) - [Changelog](https://github.com/mswjs/msw/blob/master/CHANGELOG.md) - [Commits](https://github.com/mswjs/msw/compare/v0.24.1...v0.24.2) Signed-off-by: dependabot-preview[bot] --- frontend/package.json | 2 +- frontend/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 843e51f4e7..0168d7899d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -99,7 +99,7 @@ "@testing-library/react-hooks": "^3.7.0", "combine-react-intl-messages": "^4.0.0", "jest-canvas-mock": "^2.3.0", - "msw": "^0.24.1", + "msw": "^0.24.2", "prettier": "^2.2.1", "react-test-renderer": "^16.14.0" }, diff --git a/frontend/yarn.lock b/frontend/yarn.lock index bf74c80009..59ba50fa2a 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -8390,10 +8390,10 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -msw@^0.24.1: - version "0.24.1" - resolved "https://registry.yarnpkg.com/msw/-/msw-0.24.1.tgz#2c10a85547c02d76de6c84a354c54ec6d989cc4a" - integrity sha512-1HD0Bq34x2I19CWXh+HPGqRbNmTT4D5MjVnyb6GN64AaB0UfXdg7EIwcfZ6J7KX8rcoNafEbhBDnilm+en0WnQ== +msw@^0.24.2: + version "0.24.2" + resolved "https://registry.yarnpkg.com/msw/-/msw-0.24.2.tgz#6c630400e0be7f5ea5ad6334af5806bac4d82977" + integrity sha512-lQubV+wer9Wa08sTxzEEzyxew+f8vQiOtXIKvy+hvrK+pD/G55NSqzzs6wkY3mHcsCVcPuac8Zssg2uvkvyREQ== dependencies: "@open-draft/until" "^1.0.3" "@types/cookie" "^0.4.0" From 05e218270de0ca870bd315f2038e1ebf153279d4 Mon Sep 17 00:00:00 2001 From: Wille Marcel Date: Fri, 11 Dec 2020 08:30:24 -0300 Subject: [PATCH 11/22] Update translations --- frontend/src/locales/ar.json | 2 ++ frontend/src/locales/cs.json | 2 ++ frontend/src/locales/de.json | 2 ++ frontend/src/locales/el.json | 2 ++ frontend/src/locales/es.json | 2 ++ frontend/src/locales/fa_IR.json | 2 ++ frontend/src/locales/fr.json | 2 ++ frontend/src/locales/he.json | 2 ++ frontend/src/locales/hu.json | 2 ++ frontend/src/locales/id.json | 2 ++ frontend/src/locales/it.json | 2 ++ frontend/src/locales/ja.json | 2 ++ frontend/src/locales/mg.json | 2 ++ frontend/src/locales/ml.json | 2 ++ frontend/src/locales/nl_NL.json | 2 ++ frontend/src/locales/pt.json | 2 ++ frontend/src/locales/pt_BR.json | 2 ++ frontend/src/locales/sv.json | 2 ++ frontend/src/locales/sw.json | 2 ++ frontend/src/locales/tl.json | 2 ++ frontend/src/locales/tr.json | 2 ++ frontend/src/locales/uk.json | 30 ++++++++++++++++-------------- frontend/src/locales/zh_TW.json | 2 ++ 23 files changed, 60 insertions(+), 14 deletions(-) diff --git a/frontend/src/locales/ar.json b/frontend/src/locales/ar.json index 6ee21da590..d9ffc851ad 100644 --- a/frontend/src/locales/ar.json +++ b/frontend/src/locales/ar.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "", "project.detail.cards.submityourwork.description": "", "project.detail.sections.overview": "", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "", "project.detail.sections.questionsAndComments": "", "project.detail.sections.contributions": "", @@ -527,6 +528,7 @@ "project.editor.open_editor": "", "project.sidebar.show": "", "project.sidebar.hide": "", + "project.sidebar.timeToUnlock": "", "project.task": "", "project.tasks": "", "project.taskId": "", diff --git a/frontend/src/locales/cs.json b/frontend/src/locales/cs.json index ac502bbb6c..e8a88f94bc 100644 --- a/frontend/src/locales/cs.json +++ b/frontend/src/locales/cs.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Pokud jste začátečník, než začnete doporučujeme pročíst si stránku s návody, jak na to.", "project.detail.cards.submityourwork.description": "Odeslání vaší práce je zásadní pro zajištění toho, aby vaše data byla uložena.", "project.detail.sections.overview": "Přehled", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "Popis", "project.detail.sections.questionsAndComments": "Otázky a komentáře", "project.detail.sections.contributions": "Příspěvky", @@ -527,6 +528,7 @@ "project.editor.open_editor": "Otevřít editor", "project.sidebar.show": "Zobrazit postranní panel", "project.sidebar.hide": "Skrýt postranní panel", + "project.sidebar.timeToUnlock": "", "project.task": "Úloha ", "project.tasks": "Úlohy ", "project.taskId": "Úloha #{id}", diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 658dc6f423..033d702704 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Wenn Sie noch nicht mit der Kartierung vertraut sind, empfehlen wir Ihnen, auf der Seite „Lernen“ weitere Anweisungen zu finden, bevor Sie beginnen.", "project.detail.cards.submityourwork.description": "Es ist wichtig, dass Sie ihre Arbeit speichern.", "project.detail.sections.overview": "Überblick", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "Beschreibung", "project.detail.sections.questionsAndComments": "Fragen und Kommentare", "project.detail.sections.contributions": "Beiträge", @@ -527,6 +528,7 @@ "project.editor.open_editor": "Editor öffnen", "project.sidebar.show": "Seitenleiste anzeigen", "project.sidebar.hide": "Seitenleiste verstecken", + "project.sidebar.timeToUnlock": "", "project.task": "Aufgabe", "project.tasks": "Aufgaben", "project.taskId": "Aufgabe #{id}", diff --git a/frontend/src/locales/el.json b/frontend/src/locales/el.json index fb6caa4a70..728cc5086b 100644 --- a/frontend/src/locales/el.json +++ b/frontend/src/locales/el.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Εάν είστε νέοι στην χαρτογράφηση, συνιστάται να ελέγξετε τη σελίδα Εκμάθησης, για οδηγίες πριν ξεκινήσετε.", "project.detail.cards.submityourwork.description": "Η Υποβολή της δουλειάς σας είναι ζωτικής σημασίας για να εξασφαλίσετε ότι τα δεδομένα σας αποθηκεύτηκαν.", "project.detail.sections.overview": "Επισκόπηση", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "Περιγραφή", "project.detail.sections.questionsAndComments": "Ερωτήσεις και σχόλια", "project.detail.sections.contributions": "Συνεισφορές", @@ -527,6 +528,7 @@ "project.editor.open_editor": "Ανοίξτε τον επεξεργαστή", "project.sidebar.show": "Εμφανίστε την πλευρική γραμμή", "project.sidebar.hide": "Αποκρύψτε την πλευρική γραμμή", + "project.sidebar.timeToUnlock": "", "project.task": "Εργασία", "project.tasks": "Εργασίες", "project.taskId": "#{id} εργασίας", diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index a1c13c8baa..7504bcb053 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Si es nuevo en el mapeo, le recomendamos que consulte la página de Aprendizaje para obtener instrucciones antes de comenzar.", "project.detail.cards.submityourwork.description": "Enviar su trabajo es crucial para asegurarse de que sus datos se guarden.", "project.detail.sections.overview": "Visión general", + "project.detail.sections.overview.dueDate": "Fecha ideal para completar el proyecto", "project.detail.sections.description": "Descripción", "project.detail.sections.questionsAndComments": "Preguntas y comentarios", "project.detail.sections.contributions": "Contribuciones", @@ -527,6 +528,7 @@ "project.editor.open_editor": "Abrir editor", "project.sidebar.show": "Muestra la barra lateral", "project.sidebar.hide": "Esconde la barra lateral", + "project.sidebar.timeToUnlock": "Tiempo disponible para completar el trabajo en esta tarea", "project.task": "Tarea", "project.tasks": "Tareas", "project.taskId": "Tarea #{id}", diff --git a/frontend/src/locales/fa_IR.json b/frontend/src/locales/fa_IR.json index f36b68e1bb..c3f0cd035b 100644 --- a/frontend/src/locales/fa_IR.json +++ b/frontend/src/locales/fa_IR.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "", "project.detail.cards.submityourwork.description": "", "project.detail.sections.overview": "بررسی اجمالی", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "توضیح", "project.detail.sections.questionsAndComments": "سوالات و نظرات", "project.detail.sections.contributions": "مشارکتها", @@ -527,6 +528,7 @@ "project.editor.open_editor": "", "project.sidebar.show": "", "project.sidebar.hide": "", + "project.sidebar.timeToUnlock": "", "project.task": "وظیفه", "project.tasks": "وظایف", "project.taskId": "", diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index c00f10ed66..1ecb6b61d9 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Si vous débutez dans la cartographie, nous vous recommandons de consulter la page Apprendre pour obtenir des instructions avant de commencer.", "project.detail.cards.submityourwork.description": "Soumettre votre travail est essentiel pour assurer que vos données sont enregistrées.", "project.detail.sections.overview": "Vue d'ensemble", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "Description", "project.detail.sections.questionsAndComments": "Questions et commentaires", "project.detail.sections.contributions": "Contributions", @@ -527,6 +528,7 @@ "project.editor.open_editor": "Ouvrir l'éditeur", "project.sidebar.show": "Afficher la barre latérale", "project.sidebar.hide": "Masquer la barre latérale", + "project.sidebar.timeToUnlock": "", "project.task": "Tâche", "project.tasks": "Tâches", "project.taskId": "Tâche #{id}", diff --git a/frontend/src/locales/he.json b/frontend/src/locales/he.json index 4e3b7e3f64..1ef197c7a9 100644 --- a/frontend/src/locales/he.json +++ b/frontend/src/locales/he.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "אם אין לך ניסיון במיפוי, אנחנו ממליצים לבדוק את עמוד הלימוד לקבלת הנחיות בטרם תחילת התרומה.", "project.detail.cards.submityourwork.description": "הגשת העבודה שלך היא הכרחית לשמירת הנתונים שלך.", "project.detail.sections.overview": "סקירה", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "תיאור", "project.detail.sections.questionsAndComments": "שאלות והערות", "project.detail.sections.contributions": "תרומות", @@ -527,6 +528,7 @@ "project.editor.open_editor": "פתיחת עורך", "project.sidebar.show": "הצגת לוח צד", "project.sidebar.hide": "הסתרת לוח צד", + "project.sidebar.timeToUnlock": "", "project.task": "משימה", "project.tasks": "משימות", "project.taskId": "משימה מס׳ {id}", diff --git a/frontend/src/locales/hu.json b/frontend/src/locales/hu.json index 08aae60471..ca06ef37ac 100644 --- a/frontend/src/locales/hu.json +++ b/frontend/src/locales/hu.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Ha még nem térképezett, akkor azt ajánljuk, hogy kezdés előtt tekintse át az utasításokat a Tanulás oldalon.", "project.detail.cards.submityourwork.description": "A munka beküldése nélkülözhetetlen ahhoz, hogy adatai biztosan el legyenek mentve.", "project.detail.sections.overview": "Áttekintés", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "Leírás", "project.detail.sections.questionsAndComments": "Kérdések és megjegyzések", "project.detail.sections.contributions": "Szerkesztések", @@ -527,6 +528,7 @@ "project.editor.open_editor": "Szerkesztő megnyitása", "project.sidebar.show": "Oldalsáv megjelenítése", "project.sidebar.hide": "Oldalsáv elrejtése", + "project.sidebar.timeToUnlock": "", "project.task": "Feladat", "project.tasks": "Feladatok", "project.taskId": "#{id} feladat", diff --git a/frontend/src/locales/id.json b/frontend/src/locales/id.json index c9ee804bb3..b1511f6d56 100644 --- a/frontend/src/locales/id.json +++ b/frontend/src/locales/id.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Jika Anda baru pertama kali memetakan, kami rekomendasikan Anda untuk membaca halaman Pelajari untuk memahami instruksi pemetaan sebelum Anda mulai memetakan.", "project.detail.cards.submityourwork.description": "Mengirimkan hasil pekerjaan Anda adalah hal yang sangat krusial untuk memastikan data Anda tersimpan.", "project.detail.sections.overview": "Gambaran umum", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "Deskripsi", "project.detail.sections.questionsAndComments": "Pertanyaan dan komentar", "project.detail.sections.contributions": "Kontribusi", @@ -527,6 +528,7 @@ "project.editor.open_editor": "Membuka editor", "project.sidebar.show": "Tampilkan panel samping", "project.sidebar.hide": "Sembunyikan panel samping", + "project.sidebar.timeToUnlock": "", "project.task": "Task", "project.tasks": "Tasks", "project.taskId": "Task #{id}", diff --git a/frontend/src/locales/it.json b/frontend/src/locales/it.json index 0724fe5de9..3d300d6234 100644 --- a/frontend/src/locales/it.json +++ b/frontend/src/locales/it.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Se sei nuovo alla mappatura, ti raccomandiamo di leggere la pagina Impara per istruzioni prima di iniziare.", "project.detail.cards.submityourwork.description": "Inviare il tuo lavoro è fondamentale per assicurarti che i tuoi dati siano salvati.", "project.detail.sections.overview": "Panoramica", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "Descrizione", "project.detail.sections.questionsAndComments": "Domande e commenti", "project.detail.sections.contributions": "Contributi", @@ -527,6 +528,7 @@ "project.editor.open_editor": "Apri editor", "project.sidebar.show": "Mostra barra laterale", "project.sidebar.hide": "Nascondi barra laterale", + "project.sidebar.timeToUnlock": "", "project.task": "Compiti", "project.tasks": "Compiti", "project.taskId": "Compito #{id}", diff --git a/frontend/src/locales/ja.json b/frontend/src/locales/ja.json index b01a025b5f..a0d8056827 100644 --- a/frontend/src/locales/ja.json +++ b/frontend/src/locales/ja.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "マッピングを初めて行う場合は、開始する前に学習ページで手順を確認することをお勧めします。", "project.detail.cards.submityourwork.description": "データを保存するには、作業内容を登録することが必要です。", "project.detail.sections.overview": "概要", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "説明", "project.detail.sections.questionsAndComments": "質問とコメント", "project.detail.sections.contributions": "協力", @@ -527,6 +528,7 @@ "project.editor.open_editor": "エディタで開く", "project.sidebar.show": "サイドバー表示", "project.sidebar.hide": "サイドバー非表示", + "project.sidebar.timeToUnlock": "", "project.task": "タスク", "project.tasks": "タスク", "project.taskId": "タスク #{id}", diff --git a/frontend/src/locales/mg.json b/frontend/src/locales/mg.json index 93a6f6be0e..bb5599193e 100644 --- a/frontend/src/locales/mg.json +++ b/frontend/src/locales/mg.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "", "project.detail.cards.submityourwork.description": "", "project.detail.sections.overview": "", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "Fanoritsoritana", "project.detail.sections.questionsAndComments": "", "project.detail.sections.contributions": "Fandraisana anjara", @@ -527,6 +528,7 @@ "project.editor.open_editor": "", "project.sidebar.show": "", "project.sidebar.hide": "", + "project.sidebar.timeToUnlock": "", "project.task": "", "project.tasks": "Asa", "project.taskId": "", diff --git a/frontend/src/locales/ml.json b/frontend/src/locales/ml.json index 616b02afcc..7285c271e1 100644 --- a/frontend/src/locales/ml.json +++ b/frontend/src/locales/ml.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "", "project.detail.cards.submityourwork.description": "", "project.detail.sections.overview": "", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "", "project.detail.sections.questionsAndComments": "", "project.detail.sections.contributions": "", @@ -527,6 +528,7 @@ "project.editor.open_editor": "", "project.sidebar.show": "", "project.sidebar.hide": "", + "project.sidebar.timeToUnlock": "", "project.task": "", "project.tasks": "", "project.taskId": "", diff --git a/frontend/src/locales/nl_NL.json b/frontend/src/locales/nl_NL.json index b3d77ffa32..364538cf31 100644 --- a/frontend/src/locales/nl_NL.json +++ b/frontend/src/locales/nl_NL.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Als u nieuw bent bij het in kaart brengen, raden we aan om de pagina Hoe het werkt na te lezen voordat u begint.", "project.detail.cards.submityourwork.description": "Indienen van uw werk is belangrijk om er voor te zorgen dat uw gegevens worden opgeslagen.", "project.detail.sections.overview": "Overzicht", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "Omschrijving", "project.detail.sections.questionsAndComments": "Vragen en opmerkingen", "project.detail.sections.contributions": "Bijdragen", @@ -527,6 +528,7 @@ "project.editor.open_editor": "Bewerker openen", "project.sidebar.show": "Zijbalk weergeven", "project.sidebar.hide": "Zijbalk verbergen", + "project.sidebar.timeToUnlock": "", "project.task": "Taak", "project.tasks": "Taken", "project.taskId": "Taak #{id}", diff --git a/frontend/src/locales/pt.json b/frontend/src/locales/pt.json index 39693c12f4..6acc4f2c84 100644 --- a/frontend/src/locales/pt.json +++ b/frontend/src/locales/pt.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Se só agora começaste a mapear, recomendamos que consultes a página de Aprendizagem para obteres instruções antes de começar.", "project.detail.cards.submityourwork.description": "É crucial que envies o teu trabalho para garantir que os teus dados são guardados.", "project.detail.sections.overview": "Visão geral", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "Descrição", "project.detail.sections.questionsAndComments": "Perguntas e comentários", "project.detail.sections.contributions": "Contribuições", @@ -527,6 +528,7 @@ "project.editor.open_editor": "Abrir editor", "project.sidebar.show": "Mostrar barra lateral", "project.sidebar.hide": "Ocultar barra lateral", + "project.sidebar.timeToUnlock": "", "project.task": "Tarefa", "project.tasks": "Tarefas", "project.taskId": "Tarefa #{id}", diff --git a/frontend/src/locales/pt_BR.json b/frontend/src/locales/pt_BR.json index 0868b81cac..71846fab79 100644 --- a/frontend/src/locales/pt_BR.json +++ b/frontend/src/locales/pt_BR.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Se você é novo no mapeamento, recomendamos verificar a página Saiba para obter instruções antes de começar.", "project.detail.cards.submityourwork.description": "Enviar seu trabalho é crucial para garantir que seus dados sejam salvos.", "project.detail.sections.overview": "Visão geral", + "project.detail.sections.overview.dueDate": "Data ideal para concluir o projeto", "project.detail.sections.description": "Descrição", "project.detail.sections.questionsAndComments": "Perguntas e comentários", "project.detail.sections.contributions": "Contribuições", @@ -527,6 +528,7 @@ "project.editor.open_editor": "Abrir editor", "project.sidebar.show": "Mostrar barra lateral", "project.sidebar.hide": "Ocultar barra lateral", + "project.sidebar.timeToUnlock": "Tempo disponível para concluir o trabalho nesta tarefa", "project.task": "Tarefa", "project.tasks": "Tarefas", "project.taskId": "Tarefa #{id}", diff --git a/frontend/src/locales/sv.json b/frontend/src/locales/sv.json index 658683da7b..c45ee7c750 100644 --- a/frontend/src/locales/sv.json +++ b/frontend/src/locales/sv.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Om du är ny på mappningen rekommenderar vi att du kontrollerar sidan Lär sidan efter instruktioner innan du börjar.", "project.detail.cards.submityourwork.description": "Att skicka in ditt arbete är avgörande för att säkerställa att dina data sparas.", "project.detail.sections.overview": "Översikt", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "Beskrivning", "project.detail.sections.questionsAndComments": "Frågor och kommentarer", "project.detail.sections.contributions": "Bidrag", @@ -527,6 +528,7 @@ "project.editor.open_editor": "", "project.sidebar.show": "Visa sidoraden", "project.sidebar.hide": "Dölj sidoraden", + "project.sidebar.timeToUnlock": "", "project.task": "Uppgift", "project.tasks": "Uppgifter", "project.taskId": "Uppgift #{id}", diff --git a/frontend/src/locales/sw.json b/frontend/src/locales/sw.json index 49c8c06620..0cdc3e0838 100644 --- a/frontend/src/locales/sw.json +++ b/frontend/src/locales/sw.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Kama ni mgeni wa kuchora ramani, tunapendekeza utembelee ukurasa wetu wa mafunzo ili upate maelekezo kabla ya kuanza kuchora.", "project.detail.cards.submityourwork.description": "Ni muhimu kukusanya kazi yako ili kuhakikisha taarifa zako zimehifadhiwa.", "project.detail.sections.overview": "Muhtasari", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "Maelezo", "project.detail.sections.questionsAndComments": "Maswali na maoni", "project.detail.sections.contributions": "Michango", @@ -527,6 +528,7 @@ "project.editor.open_editor": "", "project.sidebar.show": "", "project.sidebar.hide": "", + "project.sidebar.timeToUnlock": "", "project.task": "Kazi", "project.tasks": "Kazi", "project.taskId": "kazi #{id}", diff --git a/frontend/src/locales/tl.json b/frontend/src/locales/tl.json index 616b02afcc..7285c271e1 100644 --- a/frontend/src/locales/tl.json +++ b/frontend/src/locales/tl.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "", "project.detail.cards.submityourwork.description": "", "project.detail.sections.overview": "", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "", "project.detail.sections.questionsAndComments": "", "project.detail.sections.contributions": "", @@ -527,6 +528,7 @@ "project.editor.open_editor": "", "project.sidebar.show": "", "project.sidebar.hide": "", + "project.sidebar.timeToUnlock": "", "project.task": "", "project.tasks": "", "project.taskId": "", diff --git a/frontend/src/locales/tr.json b/frontend/src/locales/tr.json index 712b45acbd..4e76abeb80 100644 --- a/frontend/src/locales/tr.json +++ b/frontend/src/locales/tr.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Haritalamada yeniyseniz, başlamadan önce Öğren sayfasını kontrol etmenizi öneririz.", "project.detail.cards.submityourwork.description": "Verilerinizin kaydedildiğinden emin olmak için düzenlemelerinizi göndermek çok önemlidir.", "project.detail.sections.overview": "Genel Bakış", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "Tanım", "project.detail.sections.questionsAndComments": "Sorular ve yorumlar", "project.detail.sections.contributions": "Katkılar", @@ -527,6 +528,7 @@ "project.editor.open_editor": "Düzenleyiciyi aç", "project.sidebar.show": "Kenar çubuğunu göster", "project.sidebar.hide": "Kenar çubuğunu gizle", + "project.sidebar.timeToUnlock": "", "project.task": "Görev", "project.tasks": "Görevler", "project.taskId": "Görev #{id}", diff --git a/frontend/src/locales/uk.json b/frontend/src/locales/uk.json index b93e222c18..a6722ea6db 100644 --- a/frontend/src/locales/uk.json +++ b/frontend/src/locales/uk.json @@ -88,7 +88,7 @@ "emailUpdate.modal.text2": "Ми мапимо разом! Надання адреси е-пошти потрібне для організації зворотного зв’язку для надсилання зауважень щодо мапінгу та інших повідомлень, а також щоб мати змогу зв'язатись з вами.", "emailUpdate.modal.privacy_policy": "Ознайомтесь з нашими Правилами щодо збереження конфіденційної інформації, щоб дізнатись як ми захищаємо персональні дані користувачів.", "home.mainSection.title": "Де потрібні мапи", - "home.mainSection.lead": "", + "home.mainSection.lead": "Приєднуйтесь до світової спільноти, що допомагає людям у найбільш уражених місцях подолати гуманітарні проблеми та досягти сталого розвитку.", "home.callToAction.title": "Це дуже важко зробити без тебе", "home.callToAction.firstLeadLine": "Будь-хто може зробити свій внесок у покращення мапи. Якщо у вас немає досвіду у створенні мап, але ви бажаєте допомогти, – не хвилюйтесь, це не складно. Відвідайте нашу сторінку {link}, щоб навчитись основ.", "home.callToAction.secondLeadLine": "Досвідчений мапер? Ознайомтесь з наявними проєктами, доступними для мапінгу.", @@ -102,7 +102,7 @@ "home.stats.community": "Всього маперів", "home.stats.mappers": "Мапери онлайн", "home.mappingFlow.title": "Кожного року, стихійні лиха по всьому світу забирають життя майже {number} осіб та призводять до переселення близько 200 мільйонів людей. Наша місія змінити ситуацію на краще.", - "home.mappingFlow.headLine": "", + "home.mappingFlow.headLine": "Гуманітарні організації використовують Менеджер завдань для створення проєктів з мапінгу по всьому світу, там де дані допомагають врятувати або покращити життя.", "home.mappingFlow.cards.mapping.title": "Мапінг", "home.mappingFlow.cards.validation.title": "Перевірка", "home.mappingFlow.cards.usingData.title": "Використання даних", @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Якщо ви новачок в мапінгу, ми рекомендуємо вам ознайомитись зі сторінкою Навчитись перед початком.", "project.detail.cards.submityourwork.description": "Надсилання результатів ваших зусиль дуже важливе, щоб бути впевненим що вони збережені.", "project.detail.sections.overview": "Огляд", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "Опис", "project.detail.sections.questionsAndComments": "Питання та коментарі", "project.detail.sections.contributions": "Участь", @@ -431,8 +432,8 @@ "projects.formInputs.custom_editor.name": "Ім‘я", "projects.formInputs.custom_editor.description": "Опис", "projects.formInputs.custom_editor.url": "URL", - "projects.formInputs.custom_editor.enabled.mapping": "", - "projects.formInputs.custom_editor.enabled.validation": "", + "projects.formInputs.custom_editor.enabled.mapping": "Доступне для мапінгу", + "projects.formInputs.custom_editor.enabled.validation": "Готове для перевірки", "projects.formInputs.custom_editor.delete": "Вилучити налаштування редактора", "projects.formInputs.custom_editor.remove": "Вилучити налаштування редактора", "projects.formInputs.custom_editor.delete.confirm": "Це призведе до вилучення налаштувань типового редактора в цьому проєкті. Ви впевнені що бажаєте вимкнути цей параметр перемкнувши вимикач зверху?", @@ -443,7 +444,7 @@ "project.nav.showMapToggle": "Показати мапу", "project.nav.listViewToggle": "Список", "project.navFilters.typesOfMapping": "Типи мапінгу", - "project.navFilters.typesOfMapping.exactMatch": "", + "project.navFilters.typesOfMapping.exactMatch": "Точний збіг", "project.navFilters.campaigns": "Всі кампанії", "project.navFilters.showAllXTags": "Показати {typeOfTag}", "project.inputs.placeholders.search": "Шукати проєкт", @@ -477,10 +478,10 @@ "project.nav.clear": "Очитстити", "project.results.retry": "Повторити", "projects.stats.title": "Потрібно часу", - "projects.stats.average_mapping_time": "", - "projects.stats.average_validation_time": "", - "projects.stats.time_finish_mapping": "", - "projects.stats.time_finish_validation": "", + "projects.stats.average_mapping_time": "Середній час на мапінг одного Завдання", + "projects.stats.average_validation_time": "Середній час на перевірку одного Завдання", + "projects.stats.time_finish_mapping": "Час до завершення мапінгу", + "projects.stats.time_finish_validation": "Час до завершення перевірки", "project.stats.tasks.tatus": "Завдання за станом", "project.stats.tasks.needs_mapping": "Завдання для мапінгу", "project.stats.tasks.needs_validation": "Завдання для перевірки", @@ -527,6 +528,7 @@ "project.editor.open_editor": "Відкрити редактор", "project.sidebar.show": "Показати бічну панель", "project.sidebar.hide": "Сховати бічну панель", + "project.sidebar.timeToUnlock": "", "project.task": "Завдання", "project.tasks": "Завдання", "project.taskId": "Завдання #{id}", @@ -861,7 +863,7 @@ "EmailVerification.status.verified.explanation": "Дякуємо за надання електронної адреси.", "EmailVerification.status.verified.explanation.extraLine": "Від тепер, ми будемо сповіщати вас про можливості зробити світ кращим з допомогою проєктів в Менеджері завдань. Ви можете налаштувати сповіщення в налаштуваннях {link}.", "pages.about.title": "Про", - "pages.about.intro": "", + "pages.about.intro": "Кожного дня, глобальна спільнота за лаштунками невтомно працює, щоб зробити якомога повну мапу світу. Результатом роботи є Вільні Дані, користуватись якими можуть всі. Універсальний доступ до геопросторової інформації значною мірою змінює те, як люди використовують мапи й те що вони створюють з їх допомогою.", "pages.learn.title": "Дізнатись", "pages.learn.pages": "Довідки", "pages.learn.map.title": "Як мапити", @@ -899,12 +901,12 @@ "pages.learn.validate.steps.identify.title": "Переконайтесь що ви підходите на роль контролера ", "pages.learn.validate.steps.identify.description": "Перевірка вимагає терпіння та уваги до деталей. Досвід мапінгу в OpenStreetMap є обов'язковим, але це не означає що вам треба бути експертом щоб розпочати.", "pages.learn.validate.steps.build.title": "Покращуйте ваші навички", - "pages.learn.validate.steps.build.description": "", + "pages.learn.validate.steps.build.description": "Перед тим як стати контролером важливо вже бути досвідченим мапером. Покращуйте ваш досвід мапінгу будь-яких об'єктів в OpenStreetMap. Переконайтесь що ві знайомі з {taggingLink}. Врешті-решт, спробуйте JOSM – редактор, який розширюється за допомогою численних втулків та інструментів, які роблять мапінг та перевірку більш ефективними та простими.", "pages.learn.validate.steps.collaborate.title": "Співпрацюйте зі спільнотою", "pages.learn.validate.steps.collaborate.description": "Кожен має власні методики перевірки. Долучайтесь до обговорень в {mailingListLink} або на {forumLink}. Розвивайте ресурси, які ви вважаєте корисними та поширюйте їх у спільноті!", - "pages.learn.validate.mailing_lists": "", - "pages.learn.validate.forum": "", - "pages.learn.validate.tagging_schema": "", + "pages.learn.validate.mailing_lists": "список розсилки", + "pages.learn.validate.forum": "форум", + "pages.learn.validate.tagging_schema": "Схема теґування OpenStreetMap", "pages.learn.validate.note": "Коли ви станете досвідченим мапером OpenStreetMap, ви матимете впевненість, що готові стати контролером. Ви можете подати заявку на приєднання до однієї з команд перевірки даних або ж знайти проєкт, якому ви хотіли б допомогти з перевіркою. Долучіться до команди, щоб отримати дозвіл на перевірку виконаних завдань. Тепер у вас буде шанс просувати його вперед та допомагати іншим учасникам ", "pages.learn.manage_title": "Як керувати", "pages.learn.manage.intro": "Вміння організовувати мапінг – це величезна можливість швидкого та скоординованого збору даних. Щоб досягти успіху, ви повинні вміти заохочувати інших маперів.", diff --git a/frontend/src/locales/zh_TW.json b/frontend/src/locales/zh_TW.json index e14ef2e5b9..ba532b62b7 100644 --- a/frontend/src/locales/zh_TW.json +++ b/frontend/src/locales/zh_TW.json @@ -281,6 +281,7 @@ "project.detail.cards.mapthroughosm.description": "", "project.detail.cards.submityourwork.description": "", "project.detail.sections.overview": "", + "project.detail.sections.overview.dueDate": "", "project.detail.sections.description": "描述", "project.detail.sections.questionsAndComments": "", "project.detail.sections.contributions": "", @@ -527,6 +528,7 @@ "project.editor.open_editor": "", "project.sidebar.show": "", "project.sidebar.hide": "", + "project.sidebar.timeToUnlock": "", "project.task": "", "project.tasks": "任務", "project.taskId": "", From ddff15b872b1987319b4f795c4d166789c54ee3a Mon Sep 17 00:00:00 2001 From: Wille Marcel Date: Thu, 10 Dec 2020 18:45:06 -0300 Subject: [PATCH 12/22] Give more visibility to our code of conduct --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 248b97b064..331f9ddb49 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ This is Free and Open Source Software. You are welcome to use the code and set u ## Get involved! +* Check our [Code of conduct](.docs/code_of_conduct.md) * Get familiar with our [contributor guidelines](./docs/contributing.md) * Join the [working groups](./docs/working-groups.md) * Help us to [translate the user interface](./docs/contributing-translation.md) From b7604b13b696256dfe92cf05f8dcc63b7cc86eff Mon Sep 17 00:00:00 2001 From: Wille Marcel Date: Tue, 15 Dec 2020 05:50:45 -0300 Subject: [PATCH 13/22] Filter projects based on the action the user wants/can execute (#3859) * Add action=map filter for list projects endpoint * add action=validate filter for list projects endpoint + organize code * improve filter_projects_to_map and validate code * Reuse conditions for filtering * Update comment * Escape E203 * Skip undefined name in Flake with #noqa * #noqa to skip all conflicting PEP8 errors * Include permitted roles for map action * add action filter to "Explore projects" page * simplify filter projects code Co-authored-by: ramyaragupathy --- backend/api/projects/resources.py | 6 ++ backend/models/dtos/project_dto.py | 1 + backend/services/project_search_service.py | 93 ++++++++++++++++++- frontend/src/components/projects/messages.js | 12 +++ .../src/components/projects/projectNav.js | 2 + .../projects/projectsActionFilter.js | 55 +++++++++++ .../tests/projectsActionFilter.test.js | 63 +++++++++++++ frontend/src/hooks/UseProjectsQueryAPI.js | 9 +- frontend/src/locales/en.json | 3 + frontend/src/store/actions/auth.js | 6 +- frontend/src/store/actions/userPreferences.js | 1 + frontend/src/store/index.js | 2 + .../src/store/reducers/userPreferences.js | 7 ++ frontend/src/utils/testWithIntl.js | 8 +- 14 files changed, 261 insertions(+), 7 deletions(-) create mode 100644 frontend/src/components/projects/projectsActionFilter.js create mode 100644 frontend/src/components/projects/tests/projectsActionFilter.test.js diff --git a/backend/api/projects/resources.py b/backend/api/projects/resources.py index 7cab8165c3..60a9000d93 100644 --- a/backend/api/projects/resources.py +++ b/backend/api/projects/resources.py @@ -482,6 +482,7 @@ def setup_search_dto(self): search_dto = ProjectSearchDTO() search_dto.preferred_locale = request.environ.get("HTTP_ACCEPT_LANGUAGE") search_dto.mapper_level = request.args.get("mapperLevel") + search_dto.action = request.args.get("action") search_dto.organisation_name = request.args.get("organisationName") search_dto.organisation_id = request.args.get("organisationId") search_dto.team_id = request.args.get("teamId") @@ -602,6 +603,11 @@ def get(self): name: country description: Project country type: string + - in: query + name: action + description: Filter projects by possible actions + enum: [map, validate, any] + type: string - in: query name: projectStatuses description: Authenticated PMs can search for archived or draft statuses diff --git a/backend/models/dtos/project_dto.py b/backend/models/dtos/project_dto.py index 71e1e9ef02..d15be90960 100644 --- a/backend/models/dtos/project_dto.py +++ b/backend/models/dtos/project_dto.py @@ -289,6 +289,7 @@ class ProjectSearchDTO(Model): preferred_locale = StringType(default="en") mapper_level = StringType(validators=[is_known_mapping_level]) + action = StringType(choices=("map", "validate", "any")) mapping_types = ListType(StringType, validators=[is_known_mapping_type]) mapping_types_exact = BooleanType(required=False) project_statuses = ListType(StringType, validators=[is_known_project_status]) diff --git a/backend/services/project_search_service.py b/backend/services/project_search_service.py index 897c98c0bc..f330e4dd30 100644 --- a/backend/services/project_search_service.py +++ b/backend/services/project_search_service.py @@ -2,7 +2,7 @@ import math import geojson from geoalchemy2 import shape -from sqlalchemy import func, distinct, desc, or_ +from sqlalchemy import func, distinct, desc, or_, and_ from shapely.geometry import Polygon, box from cachetools import TTLCache, cached @@ -22,6 +22,8 @@ ProjectPriority, UserRole, TeamRoles, + ValidationPermission, + MappingPermission, ) from backend.models.postgis.campaign import Campaign from backend.models.postgis.organisation import Organisation @@ -244,6 +246,11 @@ def _filter_projects(search_dto: ProjectSearchDTO, user): query = query.filter( Project.mapper_level == MappingLevel[search_dto.mapper_level].value ) + if search_dto.action and search_dto.action != "any": + if search_dto.action == "map": + query = ProjectSearchService.filter_projects_to_map(query, user) + if search_dto.action == "validate": + query = ProjectSearchService.filter_projects_to_validate(query, user) if search_dto.organisation_name: query = query.filter(Organisation.name == search_dto.organisation_name) @@ -348,11 +355,91 @@ def _filter_projects(search_dto: ProjectSearchDTO, user): return all_results, paginated_results + @staticmethod + def filter_by_user_permission(query, user, permission: str): + """Filter projects a user can map or validate, based on their permissions.""" + if user and user.role != UserRole.ADMIN.value: + if permission == "validation_permission": + permission_class = ValidationPermission + team_roles = [ + TeamRoles.VALIDATOR.value, + TeamRoles.PROJECT_MANAGER.value, + ] + else: + permission_class = MappingPermission + team_roles = [ + TeamRoles.MAPPER.value, + TeamRoles.VALIDATOR.value, + TeamRoles.PROJECT_MANAGER.value, + ] + + selection = [] + # get ids of projects assigned to the user's teams + [ + [ + selection.append(team_project.project_id) + for team_project in user_team.team.projects + if team_project.project_id not in selection + and team_project.role in team_roles + ] + for user_team in user.teams + ] + if user.mapping_level == MappingLevel.BEGINNER.value: + # if user is beginner, get only projects with ANY or TEAMS mapping permission + # in the later case, only those that are associated with user teams + query = query.filter( + or_( + and_( + Project.id.in_(selection), + getattr(Project, permission) + == permission_class.TEAMS.value, + ), + getattr(Project, permission) == permission_class.ANY.value, + ) + ) + else: + # if user is intermediate or advanced, get projects with ANY or LEVEL permission + # and projects associated with user teams + query = query.filter( + or_( + Project.id.in_(selection), + getattr(Project, permission).in_( + [ + permission_class.ANY.value, + permission_class.LEVEL.value, + ] + ), + ) + ) + + return query + + @staticmethod + def filter_projects_to_map(query, user): + """Filter projects that needs mapping and can be mapped by the current user.""" + query = query.filter( + Project.tasks_mapped + Project.tasks_validated + < Project.total_tasks - Project.tasks_bad_imagery + ) + return ProjectSearchService.filter_by_user_permission( + query, user, "mapping_permission" + ) + + @staticmethod + def filter_projects_to_validate(query, user): + """Filter projects that needs validation and can be validated by the current user.""" + query = query.filter( + Project.tasks_validated < Project.total_tasks - Project.tasks_bad_imagery + ) + return ProjectSearchService.filter_by_user_permission( + query, user, "validation_permission" + ) + @staticmethod def get_projects_geojson( search_bbox_dto: ProjectSearchBBoxDTO, ) -> geojson.FeatureCollection: - """ search for projects meeting criteria provided return as a geojson feature collection""" + """Search for projects meeting the provided criteria. Returns a GeoJSON feature collection.""" # make a polygon from provided bounding box polygon = ProjectSearchService._make_4326_polygon_from_bbox( @@ -394,7 +481,7 @@ def get_projects_geojson( @staticmethod def _get_intersecting_projects(search_polygon: Polygon, author_id: int): - """ executes a database query to get the intersecting projects created by the author if provided """ + """Executes a database query to get the intersecting projects created by the author if provided """ query = db.session.query( Project.id, diff --git a/frontend/src/components/projects/messages.js b/frontend/src/components/projects/messages.js index 8c6e24c424..1e1919ccf8 100644 --- a/frontend/src/components/projects/messages.js +++ b/frontend/src/components/projects/messages.js @@ -32,6 +32,18 @@ export default defineMessages({ id: 'project.navFilters.typesOfMapping', defaultMessage: 'Types of mapping', }, + projectsToMap: { + id: 'project.navFilters.action.map', + defaultMessage: 'Projects to map', + }, + projectsToValidate: { + id: 'project.navFilters.action.validate', + defaultMessage: 'Projects to validate', + }, + anyProject: { + id: 'project.navFilters.action.any', + defaultMessage: 'Any project', + }, exactMatch: { id: 'project.navFilters.typesOfMapping.exactMatch', defaultMessage: 'Exact match', diff --git a/frontend/src/components/projects/projectNav.js b/frontend/src/components/projects/projectNav.js index e18bbe5436..4eb61da7d5 100644 --- a/frontend/src/components/projects/projectNav.js +++ b/frontend/src/components/projects/projectNav.js @@ -10,6 +10,7 @@ import { Dropdown } from '../dropdown'; import { ProjectSearchBox } from './projectSearchBox'; import ClearFilters from './clearFilters'; import { OrderBySelector } from './orderBy'; +import { ProjectsActionFilter } from './projectsActionFilter'; import { SwitchToggle } from '../formInputs'; import { GripIcon, ListIcon } from '../svgIcons'; @@ -109,6 +110,7 @@ export const ProjectNav = (props) => {
+ { + const dispatch = useDispatch(); + const action = useSelector((state) => state.preferences['action']); + const userDetails = useSelector((state) => state.auth.get('userDetails')); + + useEffect(() => { + // if action is not set on redux/localStorage, + // set as 'any' for advanced mappers and 'map' for others + if (!action || action === 'null') { + dispatch({ + type: 'SET_ACTION', + action: userDetails.mappingLevel === 'ADVANCED' ? 'any' : 'map', + }); + } + }, [dispatch, action, userDetails.mappingLevel]); + + return ( + {}} + onRemove={() => {}} + onChange={(n) => { + const value = n && n[0] && n[0].value; + // clean the action query param if it was set on the URL, + // as our main source of truth is the redux store + if (fullProjectsQuery.action) { + setQuery( + { + ...fullProjectsQuery, + page: undefined, + action: undefined, + }, + 'pushIn', + ); + } + dispatch({ type: 'SET_ACTION', action: value }); + }} + // use the action query param, in case someone loads the page with /explore?action=* + value={fullProjectsQuery.action || action || 'any'} + options={[ + { label: , value: 'map' }, + { label: , value: 'validate' }, + { label: , value: 'any' }, + ]} + display={'Action'} + className={'ba b--grey-light bg-white mr1 f6 v-mid dn dib-ns pv2'} + /> + ); +}; diff --git a/frontend/src/components/projects/tests/projectsActionFilter.test.js b/frontend/src/components/projects/tests/projectsActionFilter.test.js new file mode 100644 index 0000000000..b836952c20 --- /dev/null +++ b/frontend/src/components/projects/tests/projectsActionFilter.test.js @@ -0,0 +1,63 @@ +import React from 'react'; +import { render, screen, fireEvent, act } from '@testing-library/react'; +import '@testing-library/jest-dom'; + +import { store } from '../../../store'; +import { ReduxIntlProviders } from '../../../utils/testWithIntl'; +import { ProjectsActionFilter } from '../projectsActionFilter'; + +describe('ProjectsActionFilter', () => { + const myMock = jest.fn(); + it('test initialization and state changes', () => { + render( + + + , + ); + expect(screen.queryByText('Projects to map')).toBeInTheDocument(); + expect(screen.queryByText('Projects to validate')).not.toBeInTheDocument(); + expect(screen.queryByText('Any project')).not.toBeInTheDocument(); + // open dropdown + fireEvent.click(screen.queryByText('Projects to map')); + expect(screen.queryByText('Projects to validate')).toBeInTheDocument(); + expect(screen.queryByText('Any project')).toBeInTheDocument(); + // select Projects to validate + fireEvent.click(screen.queryByText('Projects to validate')); + expect(store.getState()['preferences']['action']).toBe('validate'); + // select Any projects + fireEvent.click(screen.queryByText('Projects to validate')); + fireEvent.click(screen.queryByText('Any project')); + expect(store.getState()['preferences']['action']).toBe('any'); + // select Projects to map + fireEvent.click(screen.queryByText('Any project')); + fireEvent.click(screen.queryByText('Projects to map')); + expect(store.getState()['preferences']['action']).toBe('map'); + }); + it('initialize it with validate action set', () => { + render( + + + , + ); + expect(screen.queryByText('Projects to validate')).toBeInTheDocument(); + fireEvent.click(screen.queryByText('Projects to validate')); + fireEvent.click(screen.queryByText('Any project')); + expect(store.getState()['preferences']['action']).toBe('any'); + expect(myMock).toHaveBeenCalledTimes(1); + }); + it('with an advanced user, the action is set as any', () => { + act(() => { + store.dispatch({ + type: 'SET_USER_DETAILS', + userDetails: { username: 'abc', mappingLevel: 'ADVANCED' }, + }); + }); + render( + + + , + ); + expect(screen.queryByText('Any project')).toBeInTheDocument(); + expect(store.getState()['preferences']['action']).toBe('any'); + }); +}); diff --git a/frontend/src/hooks/UseProjectsQueryAPI.js b/frontend/src/hooks/UseProjectsQueryAPI.js index bf392097dd..6b3ea11834 100644 --- a/frontend/src/hooks/UseProjectsQueryAPI.js +++ b/frontend/src/hooks/UseProjectsQueryAPI.js @@ -33,6 +33,7 @@ const projectQueryAllSpecification = { favoritedByMe: BooleanParam, mappedByMe: BooleanParam, status: StringParam, + action: StringParam, }; /* This can be passed into project API or used independently */ @@ -61,6 +62,7 @@ const backendToQueryConversion = { favoritedByMe: 'favoritedByMe', mappedByMe: 'mappedByMe', status: 'projectStatuses', + action: 'action', }; const dataFetchReducer = (state, action) => { @@ -111,6 +113,7 @@ export const useProjectsQueryAPI = ( /* Get the user bearer token from the Redux store */ const token = useSelector((state) => state.auth.get('token')); const locale = useSelector((state) => state.preferences['locale']); + const action = useSelector((state) => state.preferences['action']); const [state, dispatch] = useReducer(dataFetchReducer, { isLoading: true, @@ -142,6 +145,10 @@ export const useProjectsQueryAPI = ( throttledExternalQueryParamsState, backendToQueryConversion, ); + // it's needed in order to query by action when the user goes to /explore page + if (paramsRemapped.action === undefined && action) { + paramsRemapped.action = action; + } try { const result = await axios({ @@ -212,7 +219,7 @@ export const useProjectsQueryAPI = ( console.log('tried to cancel on effect cleanup ', cancel && cancel.params); cancel && cancel.end(); }; - }, [throttledExternalQueryParamsState, forceUpdate, token, locale]); + }, [throttledExternalQueryParamsState, forceUpdate, token, locale, action]); return [state, dispatch]; }; diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index ec806abc83..2ad353e336 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "Show map", "project.nav.listViewToggle": "List view", "project.navFilters.typesOfMapping": "Types of mapping", + "project.navFilters.action.map": "Projects to map", + "project.navFilters.action.validate": "Projects to validate", + "project.navFilters.action.any": "Any project", "project.navFilters.typesOfMapping.exactMatch": "Exact match", "project.navFilters.campaigns": "All campaigns", "project.navFilters.showAllXTags": "Show {typeOfTag}", diff --git a/frontend/src/store/actions/auth.js b/frontend/src/store/actions/auth.js index d815c307a3..6338abaa90 100644 --- a/frontend/src/store/actions/auth.js +++ b/frontend/src/store/actions/auth.js @@ -41,6 +41,7 @@ export const updateUserEmail = (userDetails, token, relevant_fields) => (dispatc export const logout = () => (dispatch) => { safeStorage.removeItem('username'); safeStorage.removeItem('token'); + safeStorage.removeItem('action'); safeStorage.removeItem('osm_oauth_token'); safeStorage.removeItem('osm_oauth_token_secret'); dispatch(clearUserDetails()); @@ -129,7 +130,10 @@ export const setUserDetails = (username, encodedToken, update = false) => (dispa dispatch(updateOrgsInfo(orgs.organisations.map((org) => org.organisationId))), ) .catch((error) => dispatch(updateOrgsInfo([]))); - fetchLocalJSONAPI(`teams/?omitMemberList=true&team_role=PROJECT_MANAGER&member=${userDetails.id}`, encodedToken) + fetchLocalJSONAPI( + `teams/?omitMemberList=true&team_role=PROJECT_MANAGER&member=${userDetails.id}`, + encodedToken, + ) .then((teams) => dispatch(updatePMsTeams(teams.teams.map((team) => team.teamId)))) .catch((error) => dispatch(updatePMsTeams([]))); dispatch(setLoader(false)); diff --git a/frontend/src/store/actions/userPreferences.js b/frontend/src/store/actions/userPreferences.js index 34e9ad48f4..0b2e71db38 100644 --- a/frontend/src/store/actions/userPreferences.js +++ b/frontend/src/store/actions/userPreferences.js @@ -2,6 +2,7 @@ import * as safeStorage from '../../utils/safe_storage'; export const types = { SET_LOCALE: 'SET_LOCALE', + SET_ACTION: 'SET_ACTION', TOGGLE_MAP: 'TOGGLE_MAP', TOGGLE_LIST_VIEW: 'TOGGLE_LIST_VIEW', TOGGLE_CARD_VIEW: 'TOGGLE_CARD_VIEW', diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js index 5ebbd457da..8e56d08b8f 100644 --- a/frontend/src/store/index.js +++ b/frontend/src/store/index.js @@ -18,6 +18,7 @@ const persistedState = { }), preferences: { locale: safeStorage.getItem('locale'), + action: safeStorage.getItem('action'), mapShown: 'true' === safeStorage.getItem('mapShown'), projectListView: 'true' === safeStorage.getItem('projectListView'), }, @@ -35,6 +36,7 @@ const store = createStore(reducers, persistedState, composedEnhancers); store.subscribe(() => { safeStorage.setItem('mapShown', store.getState().preferences['mapShown']); + safeStorage.setItem('action', store.getState().preferences['action']); safeStorage.setItem('projectListView', store.getState().preferences['projectListView']); }); diff --git a/frontend/src/store/reducers/userPreferences.js b/frontend/src/store/reducers/userPreferences.js index acd56a4d97..1bf1ea1394 100644 --- a/frontend/src/store/reducers/userPreferences.js +++ b/frontend/src/store/reducers/userPreferences.js @@ -4,6 +4,7 @@ const initialState = { locale: null, mapShown: false, projectListView: false, + action: 'any', }; export function preferencesReducer(state = initialState, action) { @@ -14,6 +15,12 @@ export function preferencesReducer(state = initialState, action) { locale: action.locale, }; } + case types.SET_ACTION: { + return { + ...state, + action: action.action, + }; + } case types.TOGGLE_MAP: { return { ...state, diff --git a/frontend/src/utils/testWithIntl.js b/frontend/src/utils/testWithIntl.js index 15919d235b..e3a5438b4a 100644 --- a/frontend/src/utils/testWithIntl.js +++ b/frontend/src/utils/testWithIntl.js @@ -13,8 +13,12 @@ export const createComponentWithReduxAndIntl = (children, props = { locale: 'en' return TestRenderer.create({children}); }; -export const ReduxIntlProviders = ({ children, props = { locale: 'en' } }: Object) => ( - +export const ReduxIntlProviders = ({ + children, + props = { locale: 'en' }, + localStore = null, +}: Object) => ( + {children} ); From 47ac386f19e44bab892f4b5520819e522292fced Mon Sep 17 00:00:00 2001 From: Diana Rita Nanyanzi <31903212+d-rita@users.noreply.github.com> Date: Tue, 15 Dec 2020 13:52:00 +0300 Subject: [PATCH 14/22] Request users to view task history comments (#3954) * Request mappers to read invalidated task comments: - add info svg icon - add banner request to view task history comments - conditional render of banner if task was invalidated and has comments * improve style and behaviour of task history alert Co-authored-by: Wille Marcel --- frontend/src/components/svgIcons/index.js | 1 + frontend/src/components/svgIcons/info.js | 14 +++++++++ .../src/components/taskSelection/action.js | 12 +++++++- .../taskSelection/actionSidebars.js | 11 +++++++ .../src/components/taskSelection/messages.js | 4 +++ .../hooks/tests/useReadTaskComments.test.js | 29 +++++++++++++++++++ frontend/src/hooks/useReadTaskComments.js | 21 ++++++++++++++ frontend/src/locales/en.json | 1 + .../src/network/tests/mockData/taskHistory.js | 25 ++++++++++++++++ 9 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 frontend/src/components/svgIcons/info.js create mode 100644 frontend/src/hooks/tests/useReadTaskComments.test.js create mode 100644 frontend/src/hooks/useReadTaskComments.js diff --git a/frontend/src/components/svgIcons/index.js b/frontend/src/components/svgIcons/index.js index 04789a3f30..ad46e65a99 100644 --- a/frontend/src/components/svgIcons/index.js +++ b/frontend/src/components/svgIcons/index.js @@ -72,3 +72,4 @@ export { SidebarIcon } from './sidebar'; export { QuestionCircleIcon } from './questionCircle'; export { ChartLineIcon } from './chart'; export { EditIcon } from './edit'; +export { InfoIcon } from './info'; diff --git a/frontend/src/components/svgIcons/info.js b/frontend/src/components/svgIcons/info.js new file mode 100644 index 0000000000..d7bb9a2a64 --- /dev/null +++ b/frontend/src/components/svgIcons/info.js @@ -0,0 +1,14 @@ +import React from 'react'; + +export class InfoIcon extends React.PureComponent { + render() { + return ( + + + + ); + } +} diff --git a/frontend/src/components/taskSelection/action.js b/frontend/src/components/taskSelection/action.js index d305883385..7530154d51 100644 --- a/frontend/src/components/taskSelection/action.js +++ b/frontend/src/components/taskSelection/action.js @@ -17,6 +17,7 @@ import { TaskHistory } from './taskActivity'; import { ChangesetCommentTags } from './changesetComment'; import { useSetProjectPageTitleTag } from '../../hooks/UseMetaTags'; import { useFetch } from '../../hooks/UseFetch'; +import useReadTaskComments from '../../hooks/useReadTaskComments'; import { DueDateBox } from '../projectCard/dueDateBox'; import { CompletionTabForMapping, @@ -37,6 +38,7 @@ export function TaskMapAction({ project, projectIsReady, tasks, activeTasks, act const [disabled, setDisable] = useState(false); const [taskComment, setTaskComment] = useState(''); const [selectedStatus, setSelectedStatus] = useState(); + const [historyTabChecked, setHistoryTabChecked] = useState(false); const intl = useIntl(); const activeTask = activeTasks && activeTasks[0]; @@ -47,10 +49,16 @@ export function TaskMapAction({ project, projectIsReady, tasks, activeTasks, act `projects/${project.projectId}/tasks/${tasksIds[0]}/`, project.projectId && tasksIds && tasksIds.length === 1, ); + const readTaskComments = useReadTaskComments(taskHistory); const getTaskGpxUrlCallback = useCallback((project, tasks) => getTaskGpxUrl(project, tasks), []); const formatImageryUrlCallback = useCallback((imagery) => formatImageryUrl(imagery), []); + const historyTabSwitch = () => { + setHistoryTabChecked(true); + setActiveSection('history'); + }; + useEffect(() => { if (!editor && projectIsReady && userDetails.defaultEditor && tasks && tasksIds) { let editorToUse; @@ -197,7 +205,7 @@ export function TaskMapAction({ project, projectIsReady, tasks, activeTasks, act className={`pb2 pointer truncate ${ activeSection === 'history' && 'bb b--blue-dark' }`} - onClick={() => setActiveSection('history')} + onClick={() => historyTabSwitch()} > {taskHistory && @@ -221,6 +229,8 @@ export function TaskMapAction({ project, projectIsReady, tasks, activeTasks, act } )} + {showReadCommentsAlert && ( +
historyTabSwitch()}> + + + + +
+ )}
{taskInstructions && }

diff --git a/frontend/src/components/taskSelection/messages.js b/frontend/src/components/taskSelection/messages.js index 515f31b8ce..20de0d60f5 100644 --- a/frontend/src/components/taskSelection/messages.js +++ b/frontend/src/components/taskSelection/messages.js @@ -303,6 +303,10 @@ export default defineMessages({ id: 'project.tasks.filter.noTasksFound', defaultMessage: 'No tasks were found.', }, + readTaskComments: { + id: 'project.tasks.readComments', + defaultMessage: 'Please check the history tab for relevant comments.', + }, completion: { id: 'project.tasks.action.completion', defaultMessage: 'Completion', diff --git a/frontend/src/hooks/tests/useReadTaskComments.test.js b/frontend/src/hooks/tests/useReadTaskComments.test.js new file mode 100644 index 0000000000..8ec7614fe6 --- /dev/null +++ b/frontend/src/hooks/tests/useReadTaskComments.test.js @@ -0,0 +1,29 @@ +import { renderHook } from '@testing-library/react-hooks'; +import { invalidatedTaskHistory, history } from '../../network/tests/mockData/taskHistory'; +import useReadTaskComments from '../useReadTaskComments'; + +describe('test useReadTaskComments hook', () => { + it('returns false when there is no task history', () => { + const { result } = renderHook(() => useReadTaskComments({})); + const readTaskComments = result.current; + expect(readTaskComments).toBe(false); + }); + + it('returns false if task has not been previously invalidated', () => { + const { result } = renderHook(() => useReadTaskComments(history)); + const readTaskComments = result.current; + expect(readTaskComments).toBe(false); + }); + + it('returns false if task history does not have comments', () => { + const { result } = renderHook(() => useReadTaskComments(history)); + const readTaskComments = result.current; + expect(readTaskComments).toBe(false); + }); + + it('returns true if was invalidated and has comments', () => { + const { result } = renderHook(() => useReadTaskComments(invalidatedTaskHistory)); + const readTaskComments = result.current; + expect(readTaskComments).toBe(true); + }); +}); diff --git a/frontend/src/hooks/useReadTaskComments.js b/frontend/src/hooks/useReadTaskComments.js new file mode 100644 index 0000000000..c6d7af65b5 --- /dev/null +++ b/frontend/src/hooks/useReadTaskComments.js @@ -0,0 +1,21 @@ +import { useState, useEffect } from 'react'; + +const useReadTaskComments = (history) => { + const [readTaskComments, setReadTaskComments] = useState(false); + + useEffect(() => { + if (history && history.taskHistory && history.taskHistory.length > 1) { + const invalidatedTaskHistory = history.taskHistory.filter( + (task) => task.actionText === 'INVALIDATED', + ); + const taskComments = history.taskHistory.filter((task) => task.action === 'COMMENT'); + + if (invalidatedTaskHistory.length > 0 && taskComments.length > 0) { + setReadTaskComments(true); + } + } + }, [history]); + return readTaskComments; +}; + +export default useReadTaskComments; diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 2ad353e336..9ad968f637 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -575,6 +575,7 @@ "project.tasks.filter.readyToValidate": "Ready for validation", "project.tasks.filter.readyToMap": "Available for mapping", "project.tasks.filter.noTasksFound": "No tasks were found.", + "project.tasks.readComments": "Please check the history tab for relevant comments.", "project.tasks.action.completion": "Completion", "project.tasks.action.history": "History", "project.tasks.action.finish_mapping.title": "Once you have finished mapping", diff --git a/frontend/src/network/tests/mockData/taskHistory.js b/frontend/src/network/tests/mockData/taskHistory.js index 0cb517d549..fdfdf9a991 100644 --- a/frontend/src/network/tests/mockData/taskHistory.js +++ b/frontend/src/network/tests/mockData/taskHistory.js @@ -42,3 +42,28 @@ export const history = { }, ], }; + +export const invalidatedTaskHistory = { + taskHistory: [ + { + historyId: 12001, + taskId: 1, + action: 'COMMENT', + actionText: 'More buildings need to be mapped', + actionDate: '2020-10-04T14:35:30.174515Z', + actionBy: 'test_user', + pictureUrl: null, + issues: null, + }, + { + historyId: 12000, + taskId: 1, + action: 'STATE_CHANGE', + actionText: 'INVALIDATED', + actionDate: '2020-10-04T14:35:20.174515Z', + actionBy: 'test_user', + pictureUrl: null, + issues: null, + }, + ], +}; From db6f97fd3d17f782d60c9e1034d157684282254f Mon Sep 17 00:00:00 2001 From: ramyaragupathy Date: Wed, 23 Sep 2020 11:51:07 +0530 Subject: [PATCH 15/22] Search and fetch english names Formatting for version file Flake formatting Handle islands and special chars Update nominatim API + country field Updated down revision Down revision update in docstring Black formatting --- migrations/versions/7937dae319b5_.py | 54 ++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 migrations/versions/7937dae319b5_.py diff --git a/migrations/versions/7937dae319b5_.py b/migrations/versions/7937dae319b5_.py new file mode 100644 index 0000000000..02e3c20069 --- /dev/null +++ b/migrations/versions/7937dae319b5_.py @@ -0,0 +1,54 @@ +""" Ensure Project's country names are in English + +Revision ID: 7937dae319b5 +Revises: 14842761654b +Create Date: 2020-09-21 17:17:10.542429 + +""" +from alembic import op +import requests + + +# revision identifiers, used by Alembic. +revision = "7937dae319b5" +down_revision = "14842761654b" +branch_labels = None +depends_on = None +nominatim_base_url = "https://nominatim.openstreetmap.org" +nominatim_data_format = "&format=jsonv2&accept-language=en&namedetails=1" + + +def upgrade(): + conn = op.get_bind() + # fetch existing country names + fetch_countries = ( + "select distinct(unnest(country)) from projects where country is not null;" + ) + countries = conn.execute(fetch_countries) + for country in countries: + country = country[0] + # search by name + url = nominatim_base_url + "/search?country=" + country + nominatim_data_format + country_search = requests.get(url).json() + if country_search != []: + updated_country_name = country_search[0].get("namedetails").get("name:en") + update_project = ( + "update projects set country = '{\"" + + handle_special_chars(updated_country_name) + + "\"}' where country @> ARRAY['" + + handle_special_chars(country) + + "']::varchar[]" + + ";" + ) + conn.execute(update_project) + + +def downgrade(): + pass + + +def handle_special_chars(country_name: str): + special_char = country_name.find("'") + if special_char >= 0: + country_name = country_name[:special_char] + "'" + country_name[special_char:] + return country_name From b71173cea59a436cffe376fdb40fea2517bba9be Mon Sep 17 00:00:00 2001 From: Wille Marcel Date: Tue, 15 Dec 2020 11:40:54 -0300 Subject: [PATCH 16/22] Update translations --- frontend/src/locales/ar.json | 4 ++++ frontend/src/locales/cs.json | 8 ++++++-- frontend/src/locales/de.json | 4 ++++ frontend/src/locales/el.json | 4 ++++ frontend/src/locales/es.json | 4 ++++ frontend/src/locales/fa_IR.json | 4 ++++ frontend/src/locales/fr.json | 4 ++++ frontend/src/locales/he.json | 8 ++++++-- frontend/src/locales/hu.json | 4 ++++ frontend/src/locales/id.json | 22 +++++++++++++--------- frontend/src/locales/it.json | 4 ++++ frontend/src/locales/ja.json | 4 ++++ frontend/src/locales/mg.json | 4 ++++ frontend/src/locales/ml.json | 4 ++++ frontend/src/locales/nl_NL.json | 8 ++++++-- frontend/src/locales/pt.json | 4 ++++ frontend/src/locales/pt_BR.json | 4 ++++ frontend/src/locales/sv.json | 4 ++++ frontend/src/locales/sw.json | 4 ++++ frontend/src/locales/tl.json | 4 ++++ frontend/src/locales/tr.json | 4 ++++ frontend/src/locales/uk.json | 4 ++++ frontend/src/locales/zh_TW.json | 4 ++++ 23 files changed, 107 insertions(+), 15 deletions(-) diff --git a/frontend/src/locales/ar.json b/frontend/src/locales/ar.json index d9ffc851ad..56698c898d 100644 --- a/frontend/src/locales/ar.json +++ b/frontend/src/locales/ar.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "", "project.nav.listViewToggle": "", "project.navFilters.typesOfMapping": "", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "", "project.navFilters.campaigns": "", "project.navFilters.showAllXTags": "", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "", "project.tasks.filter.readyToMap": "", "project.tasks.filter.noTasksFound": "", + "project.tasks.readComments": "", "project.tasks.action.completion": "", "project.tasks.action.history": "", "project.tasks.action.finish_mapping.title": "", diff --git a/frontend/src/locales/cs.json b/frontend/src/locales/cs.json index e8a88f94bc..abb4cf47a8 100644 --- a/frontend/src/locales/cs.json +++ b/frontend/src/locales/cs.json @@ -281,7 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Pokud jste začátečník, než začnete doporučujeme pročíst si stránku s návody, jak na to.", "project.detail.cards.submityourwork.description": "Odeslání vaší práce je zásadní pro zajištění toho, aby vaše data byla uložena.", "project.detail.sections.overview": "Přehled", - "project.detail.sections.overview.dueDate": "", + "project.detail.sections.overview.dueDate": "Ideální datum dokončení projektu", "project.detail.sections.description": "Popis", "project.detail.sections.questionsAndComments": "Otázky a komentáře", "project.detail.sections.contributions": "Příspěvky", @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "Zobrazit mapu", "project.nav.listViewToggle": "Zobrazení jako seznam", "project.navFilters.typesOfMapping": "Druhy mapování", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "Přesná shoda", "project.navFilters.campaigns": "Všechny kampaně", "project.navFilters.showAllXTags": "Zobrazit {typeOfTag}", @@ -528,7 +531,7 @@ "project.editor.open_editor": "Otevřít editor", "project.sidebar.show": "Zobrazit postranní panel", "project.sidebar.hide": "Skrýt postranní panel", - "project.sidebar.timeToUnlock": "", + "project.sidebar.timeToUnlock": "Čas, který je k dispozici pro dokončení práce na tomto úkolu", "project.task": "Úloha ", "project.tasks": "Úlohy ", "project.taskId": "Úloha #{id}", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "Připraveno pro validaci", "project.tasks.filter.readyToMap": "Dostupné pro mapování", "project.tasks.filter.noTasksFound": "Žádná úloha nenalezena.", + "project.tasks.readComments": "", "project.tasks.action.completion": "Dokončení", "project.tasks.action.history": "Historie", "project.tasks.action.finish_mapping.title": "Jakmile skončíte s mapováním", diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 033d702704..9705432a08 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "Karte anzeigen", "project.nav.listViewToggle": "Listenansicht", "project.navFilters.typesOfMapping": "Arten der Kartierung", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "", "project.navFilters.campaigns": "Alle Kampagnen", "project.navFilters.showAllXTags": "{typeOfTag} anzeigen", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "Bereit zur Validierung", "project.tasks.filter.readyToMap": "Verfügbar für Kartierung", "project.tasks.filter.noTasksFound": "Es wurden keine Aufgaben gefunden.", + "project.tasks.readComments": "", "project.tasks.action.completion": "Erfüllungsgrad", "project.tasks.action.history": "Verlauf", "project.tasks.action.finish_mapping.title": "Sobald Sie die Kartierung abgeschlossen haben", diff --git a/frontend/src/locales/el.json b/frontend/src/locales/el.json index 728cc5086b..8335c36be6 100644 --- a/frontend/src/locales/el.json +++ b/frontend/src/locales/el.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "Δείξε τον χάρτη", "project.nav.listViewToggle": "Προβολή λίστας", "project.navFilters.typesOfMapping": "Τύποι χαρτογράφησης", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "", "project.navFilters.campaigns": "Όλες οι καμπάνιες", "project.navFilters.showAllXTags": "Εμφάνισε {typeOfTag}", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "Έτοιμες για επικύρωση", "project.tasks.filter.readyToMap": "Διαθέσιμες για χαρτογράφηση", "project.tasks.filter.noTasksFound": "Δεν βρέθηκαν εργασίες.", + "project.tasks.readComments": "", "project.tasks.action.completion": "Ολοκλήρωση", "project.tasks.action.history": "Ιστορικό", "project.tasks.action.finish_mapping.title": "Εφόσον έχετε ολοκληρώσει τη χαρτογράφηση", diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index 7504bcb053..06213ea580 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "Mostrar mapa", "project.nav.listViewToggle": "Vista como lista", "project.navFilters.typesOfMapping": "Tipos de mapeo", + "project.navFilters.action.map": "Proyectos a mapear", + "project.navFilters.action.validate": "Proyectos a validar", + "project.navFilters.action.any": "Cualquier proyecto", "project.navFilters.typesOfMapping.exactMatch": "Coincidencia exacta", "project.navFilters.campaigns": "Todas las campañas", "project.navFilters.showAllXTags": "Mostrar {typeOfTag}", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "Listo para validación", "project.tasks.filter.readyToMap": "Disponible para mapeo", "project.tasks.filter.noTasksFound": "No se encontraron tareas.", + "project.tasks.readComments": "Por favor, compruebe la pestaña Historial para ver los comentarios relevantes.", "project.tasks.action.completion": "Terminación", "project.tasks.action.history": "Historial", "project.tasks.action.finish_mapping.title": "Una vez que haya terminado de mapear", diff --git a/frontend/src/locales/fa_IR.json b/frontend/src/locales/fa_IR.json index c3f0cd035b..47adafa885 100644 --- a/frontend/src/locales/fa_IR.json +++ b/frontend/src/locales/fa_IR.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "نمایش نقشه", "project.nav.listViewToggle": "", "project.navFilters.typesOfMapping": "نوع نقشه برداری", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "", "project.navFilters.campaigns": "", "project.navFilters.showAllXTags": "", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "آماده برای اعتبار سنجی", "project.tasks.filter.readyToMap": "موجود برای نقشه برداری", "project.tasks.filter.noTasksFound": "", + "project.tasks.readComments": "", "project.tasks.action.completion": "تکمیل", "project.tasks.action.history": "تاریخچه", "project.tasks.action.finish_mapping.title": "", diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 1ecb6b61d9..00cb3e32cc 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "Afficher la carte", "project.nav.listViewToggle": "Vue liste", "project.navFilters.typesOfMapping": "Types de cartographie", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "", "project.navFilters.campaigns": "Toutes les campagnes", "project.navFilters.showAllXTags": "Afficher {typeOfTag}", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "Prêt pour la validation", "project.tasks.filter.readyToMap": "Cartographiable", "project.tasks.filter.noTasksFound": "Aucune tâche n'a été trouvée.", + "project.tasks.readComments": "", "project.tasks.action.completion": "Achèvement", "project.tasks.action.history": "Historique", "project.tasks.action.finish_mapping.title": "Une fois que vous avez terminé de cartographier", diff --git a/frontend/src/locales/he.json b/frontend/src/locales/he.json index 1ef197c7a9..03bd91dea1 100644 --- a/frontend/src/locales/he.json +++ b/frontend/src/locales/he.json @@ -281,7 +281,7 @@ "project.detail.cards.mapthroughosm.description": "אם אין לך ניסיון במיפוי, אנחנו ממליצים לבדוק את עמוד הלימוד לקבלת הנחיות בטרם תחילת התרומה.", "project.detail.cards.submityourwork.description": "הגשת העבודה שלך היא הכרחית לשמירת הנתונים שלך.", "project.detail.sections.overview": "סקירה", - "project.detail.sections.overview.dueDate": "", + "project.detail.sections.overview.dueDate": "התאריך המיטבי להשלמת המיזם", "project.detail.sections.description": "תיאור", "project.detail.sections.questionsAndComments": "שאלות והערות", "project.detail.sections.contributions": "תרומות", @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "הצגת המפה", "project.nav.listViewToggle": "תצוגת רשימה", "project.navFilters.typesOfMapping": "סוגי המיפוי", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "תוצאה מדויקת", "project.navFilters.campaigns": "כל מסעות הפרסום", "project.navFilters.showAllXTags": "הצגת {typeOfTag}", @@ -528,7 +531,7 @@ "project.editor.open_editor": "פתיחת עורך", "project.sidebar.show": "הצגת לוח צד", "project.sidebar.hide": "הסתרת לוח צד", - "project.sidebar.timeToUnlock": "", + "project.sidebar.timeToUnlock": "הזמן הזמין לך להשלמת העבודה על המשימה הזאת", "project.task": "משימה", "project.tasks": "משימות", "project.taskId": "משימה מס׳ {id}", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "זמין לאימות", "project.tasks.filter.readyToMap": "זמין למיפוי", "project.tasks.filter.noTasksFound": "לא נמצאו משימות.", + "project.tasks.readComments": "", "project.tasks.action.completion": "השלמה", "project.tasks.action.history": "היסטוריה", "project.tasks.action.finish_mapping.title": "לאחר שסיימת למפות", diff --git a/frontend/src/locales/hu.json b/frontend/src/locales/hu.json index ca06ef37ac..8ea2a61589 100644 --- a/frontend/src/locales/hu.json +++ b/frontend/src/locales/hu.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "Térkép megjelenítése", "project.nav.listViewToggle": "", "project.navFilters.typesOfMapping": "Térképezés fajtái", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "", "project.navFilters.campaigns": "Minden kampány", "project.navFilters.showAllXTags": "{typeOfTag} megjelenítése", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "Érvényesítésre kész", "project.tasks.filter.readyToMap": "Térképezhető", "project.tasks.filter.noTasksFound": "Nem található feladat.", + "project.tasks.readComments": "", "project.tasks.action.completion": "Befejezés", "project.tasks.action.history": "Előzmények", "project.tasks.action.finish_mapping.title": "Miután befejezte a térképezést", diff --git a/frontend/src/locales/id.json b/frontend/src/locales/id.json index b1511f6d56..af29aa3099 100644 --- a/frontend/src/locales/id.json +++ b/frontend/src/locales/id.json @@ -281,7 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Jika Anda baru pertama kali memetakan, kami rekomendasikan Anda untuk membaca halaman Pelajari untuk memahami instruksi pemetaan sebelum Anda mulai memetakan.", "project.detail.cards.submityourwork.description": "Mengirimkan hasil pekerjaan Anda adalah hal yang sangat krusial untuk memastikan data Anda tersimpan.", "project.detail.sections.overview": "Gambaran umum", - "project.detail.sections.overview.dueDate": "", + "project.detail.sections.overview.dueDate": "Tanggal ideal untuk menyelesaikan proyek", "project.detail.sections.description": "Deskripsi", "project.detail.sections.questionsAndComments": "Pertanyaan dan komentar", "project.detail.sections.contributions": "Kontribusi", @@ -432,8 +432,8 @@ "projects.formInputs.custom_editor.name": "Nama", "projects.formInputs.custom_editor.description": "Deskripsi", "projects.formInputs.custom_editor.url": "URL", - "projects.formInputs.custom_editor.enabled.mapping": "", - "projects.formInputs.custom_editor.enabled.validation": "", + "projects.formInputs.custom_editor.enabled.mapping": "Diaktifkan untuk pemetaan", + "projects.formInputs.custom_editor.enabled.validation": "Diaktifkan untuk validasi", "projects.formInputs.custom_editor.delete": "Hapus editor kustom", "projects.formInputs.custom_editor.remove": "Hapus editor kustom", "projects.formInputs.custom_editor.delete.confirm": "Ini akan menghapus editor kustom dari proyek. Anda yakin tidak ingin menonaktifkan editor kustom dengan mengaktifkan kotak centang \"Diaktifkan\" di atas?", @@ -444,7 +444,10 @@ "project.nav.showMapToggle": "Tampilkan peta", "project.nav.listViewToggle": "Tampilan daftar", "project.navFilters.typesOfMapping": "Jenis Objek Pemetaan", - "project.navFilters.typesOfMapping.exactMatch": "", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", + "project.navFilters.typesOfMapping.exactMatch": "Sama persis", "project.navFilters.campaigns": "Semua campaigns", "project.navFilters.showAllXTags": "Tampilkan {typeOfTag}", "project.inputs.placeholders.search": "Cari proyek", @@ -528,7 +531,7 @@ "project.editor.open_editor": "Membuka editor", "project.sidebar.show": "Tampilkan panel samping", "project.sidebar.hide": "Sembunyikan panel samping", - "project.sidebar.timeToUnlock": "", + "project.sidebar.timeToUnlock": "Waktu yang tersedia untuk Anda menyelesaikan pekerjaan pada tugas ini", "project.task": "Task", "project.tasks": "Tasks", "project.taskId": "Task #{id}", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "Siap untuk validasi", "project.tasks.filter.readyToMap": "Tersedia untuk pemetaan", "project.tasks.filter.noTasksFound": "Tidak ada task yang ditemukan.", + "project.tasks.readComments": "", "project.tasks.action.completion": "Sudah dipetakan", "project.tasks.action.history": "Riwayat", "project.tasks.action.finish_mapping.title": "Ketika Anda selesai memetakan", @@ -901,12 +905,12 @@ "pages.learn.validate.steps.identify.title": "Identifikasi apakah menjadi validator tepat untuk Anda", "pages.learn.validate.steps.identify.description": "Validasi membutuhkan kesabaran dan perhatian terhadap detail. Beberapa pengalaman pemetaan di OpenStreetMap adalah suatu keharusan, tetapi jangan merasa bahwa Anda perlu menjadi ahli terlebih dahulu untuk memulai.", "pages.learn.validate.steps.build.title": "Bangun keterampilan Anda", - "pages.learn.validate.steps.build.description": "", + "pages.learn.validate.steps.build.description": "Menjadi kartografer yang handal sangat penting untuk mulai memvalidasi proyek. Tingkatkan pengalaman Anda dalam memetakan semua jenis elemen. Pastikan Anda sudah familiar dengan {taggingLink}. Cobalah JOSM Editor, editor untuk OpenStreetMap yang dapat disesuaikan sesuai kebutuhan, dilengkapi alat dan plugin untuk mempermudah pemetaan dan validasi!", "pages.learn.validate.steps.collaborate.title": "Kolaborasi sebagai bagian dari komunitas", "pages.learn.validate.steps.collaborate.description": "Tiap validator mempunyai beberapa teknik tersendiri untuk melakukan validasi. Gabung diskusi pada {mailingListLink} atau {forumLink}. Kontribusi materi yang Anda rasa berguna dan sampaikan kembali ke komunitas!", - "pages.learn.validate.mailing_lists": "", - "pages.learn.validate.forum": "", - "pages.learn.validate.tagging_schema": "", + "pages.learn.validate.mailing_lists": "milis", + "pages.learn.validate.forum": "forum", + "pages.learn.validate.tagging_schema": "Skema penandaan OpenStreetMap", "pages.learn.validate.note": "Setelah Anda menjadi komunitas mapper yang ahli di OpenStreetMap, Anda akan mendapat kepercayaan diri untuk menjadi seorang validator. Anda bisa mendaftarkan diri ke salah satu tim validator atau temukan proyek yang ingin Anda validasi. Bergabung kedalam tim, akan memberikan Anda kesempatan dan ijin untuk menvalidasi sebuah task. Sekarang ini adalah kesempatan untuk maju dan membantu mapper lain dalam perjalanan mereka juga!", "pages.learn.manage_title": "Belajar untuk mengatur proyek", "pages.learn.manage.intro": "Mampu mengatur kegiatan pemetaan adalah peluang besar untuk pengumpulan data yang cepat dan terkoordinasi. Agar sebuah project menjadi sukses, Anda harus mampu memotivasi komunitas mapper.", diff --git a/frontend/src/locales/it.json b/frontend/src/locales/it.json index 3d300d6234..d7dd562755 100644 --- a/frontend/src/locales/it.json +++ b/frontend/src/locales/it.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "Mostra la mappa", "project.nav.listViewToggle": "Vista a elenco", "project.navFilters.typesOfMapping": "Tipi di mappatura", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "Abbinamento esatto", "project.navFilters.campaigns": "Tutte le campagne", "project.navFilters.showAllXTags": "Mostra {typeOfTag}", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "Pronto per la validazione", "project.tasks.filter.readyToMap": "Disponibile per la mappatura", "project.tasks.filter.noTasksFound": "Nessun compito trovato", + "project.tasks.readComments": "", "project.tasks.action.completion": "Completamento", "project.tasks.action.history": "Storico", "project.tasks.action.finish_mapping.title": "Quando hai finito la mappatura", diff --git a/frontend/src/locales/ja.json b/frontend/src/locales/ja.json index a0d8056827..84ac48b86c 100644 --- a/frontend/src/locales/ja.json +++ b/frontend/src/locales/ja.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "地図を表示", "project.nav.listViewToggle": "リスト表示", "project.navFilters.typesOfMapping": "マッピング対象", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "", "project.navFilters.campaigns": "すべてのキャンペーン", "project.navFilters.showAllXTags": "{typeOfTag} を表示", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "検証準備完了", "project.tasks.filter.readyToMap": "マッピング可能", "project.tasks.filter.noTasksFound": "タスクが見つかりませんでした。", + "project.tasks.readComments": "", "project.tasks.action.completion": "完了", "project.tasks.action.history": "履歴", "project.tasks.action.finish_mapping.title": "マッピングが完了したら、", diff --git a/frontend/src/locales/mg.json b/frontend/src/locales/mg.json index bb5599193e..b371801809 100644 --- a/frontend/src/locales/mg.json +++ b/frontend/src/locales/mg.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "", "project.nav.listViewToggle": "", "project.navFilters.typesOfMapping": "", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "", "project.navFilters.campaigns": "", "project.navFilters.showAllXTags": "", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "", "project.tasks.filter.readyToMap": "", "project.tasks.filter.noTasksFound": "", + "project.tasks.readComments": "", "project.tasks.action.completion": "", "project.tasks.action.history": "Tahiry", "project.tasks.action.finish_mapping.title": "", diff --git a/frontend/src/locales/ml.json b/frontend/src/locales/ml.json index 7285c271e1..1f8fee6793 100644 --- a/frontend/src/locales/ml.json +++ b/frontend/src/locales/ml.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "", "project.nav.listViewToggle": "", "project.navFilters.typesOfMapping": "", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "", "project.navFilters.campaigns": "", "project.navFilters.showAllXTags": "", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "", "project.tasks.filter.readyToMap": "", "project.tasks.filter.noTasksFound": "", + "project.tasks.readComments": "", "project.tasks.action.completion": "", "project.tasks.action.history": "", "project.tasks.action.finish_mapping.title": "", diff --git a/frontend/src/locales/nl_NL.json b/frontend/src/locales/nl_NL.json index 364538cf31..7cce9d633d 100644 --- a/frontend/src/locales/nl_NL.json +++ b/frontend/src/locales/nl_NL.json @@ -281,7 +281,7 @@ "project.detail.cards.mapthroughosm.description": "Als u nieuw bent bij het in kaart brengen, raden we aan om de pagina Hoe het werkt na te lezen voordat u begint.", "project.detail.cards.submityourwork.description": "Indienen van uw werk is belangrijk om er voor te zorgen dat uw gegevens worden opgeslagen.", "project.detail.sections.overview": "Overzicht", - "project.detail.sections.overview.dueDate": "", + "project.detail.sections.overview.dueDate": "Ideale datum om het project te voltooien", "project.detail.sections.description": "Omschrijving", "project.detail.sections.questionsAndComments": "Vragen en opmerkingen", "project.detail.sections.contributions": "Bijdragen", @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "Kaart weergeven", "project.nav.listViewToggle": "Lijstweergave", "project.navFilters.typesOfMapping": "Typen in kaart brengen", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "Exacte overeenkomst", "project.navFilters.campaigns": "Alle campagnes", "project.navFilters.showAllXTags": "Weergeven {typeOfTag}", @@ -528,7 +531,7 @@ "project.editor.open_editor": "Bewerker openen", "project.sidebar.show": "Zijbalk weergeven", "project.sidebar.hide": "Zijbalk verbergen", - "project.sidebar.timeToUnlock": "", + "project.sidebar.timeToUnlock": "Voor u beschikbare tijd om het werk aan deze taak te voltooien", "project.task": "Taak", "project.tasks": "Taken", "project.taskId": "Taak #{id}", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "Gereed om te valideren", "project.tasks.filter.readyToMap": "Beschikbaar om in kaart te brengen", "project.tasks.filter.noTasksFound": "Geen taken gevonden.", + "project.tasks.readComments": "", "project.tasks.action.completion": "Voltooiïng", "project.tasks.action.history": "Geschiedenis", "project.tasks.action.finish_mapping.title": "Als u eenmaal gereed bent met in kaart brengen", diff --git a/frontend/src/locales/pt.json b/frontend/src/locales/pt.json index 6acc4f2c84..19330d53a3 100644 --- a/frontend/src/locales/pt.json +++ b/frontend/src/locales/pt.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "Mostrar mapa", "project.nav.listViewToggle": "Vista de lista", "project.navFilters.typesOfMapping": "Tipos de mapeamento", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "Correspondência exata", "project.navFilters.campaigns": "Todas as campanhas", "project.navFilters.showAllXTags": "Mostrar {typeOfTag}", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "Prontos para validação", "project.tasks.filter.readyToMap": "Disponíveis para mapeamento", "project.tasks.filter.noTasksFound": "Não foram encontradas tarefas.", + "project.tasks.readComments": "", "project.tasks.action.completion": "Finalização", "project.tasks.action.history": "Histórico", "project.tasks.action.finish_mapping.title": "Quando terminares de mapear", diff --git a/frontend/src/locales/pt_BR.json b/frontend/src/locales/pt_BR.json index 71846fab79..b00e7ce585 100644 --- a/frontend/src/locales/pt_BR.json +++ b/frontend/src/locales/pt_BR.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "Mostrar mapa", "project.nav.listViewToggle": "Exibição de lista", "project.navFilters.typesOfMapping": "Tipos de mapeamento", + "project.navFilters.action.map": "Projetos para mapear", + "project.navFilters.action.validate": "Projetos a validar", + "project.navFilters.action.any": "Qualquer projeto", "project.navFilters.typesOfMapping.exactMatch": "Correspondência exata", "project.navFilters.campaigns": "Todas as campanhas", "project.navFilters.showAllXTags": "Mostrar {typeOfTag}", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "Pronta para validação", "project.tasks.filter.readyToMap": "Disponível para mapeamento", "project.tasks.filter.noTasksFound": "Nenhuma tarefa foi encontrada.", + "project.tasks.readComments": "Por favor, verifique a guia Histórico e leia os comentários.", "project.tasks.action.completion": "Atualização", "project.tasks.action.history": "Histórico", "project.tasks.action.finish_mapping.title": "Depois de terminar o mapeamento", diff --git a/frontend/src/locales/sv.json b/frontend/src/locales/sv.json index c45ee7c750..8da9132ed6 100644 --- a/frontend/src/locales/sv.json +++ b/frontend/src/locales/sv.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "Visa karta", "project.nav.listViewToggle": "", "project.navFilters.typesOfMapping": "Typer av kartläggning", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "", "project.navFilters.campaigns": "Alla kampanjer", "project.navFilters.showAllXTags": "Visa {typeOfTag}", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "Redo för validering", "project.tasks.filter.readyToMap": "Tillgänglig för kartläggning", "project.tasks.filter.noTasksFound": "Inga uppgifter hittades.", + "project.tasks.readComments": "", "project.tasks.action.completion": "Slutförande", "project.tasks.action.history": "Historia", "project.tasks.action.finish_mapping.title": "När du är klar med kartläggningen", diff --git a/frontend/src/locales/sw.json b/frontend/src/locales/sw.json index 0cdc3e0838..afff884555 100644 --- a/frontend/src/locales/sw.json +++ b/frontend/src/locales/sw.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "Onyesha ramani", "project.nav.listViewToggle": "", "project.navFilters.typesOfMapping": "Aina za uchoraji wa ramani", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "", "project.navFilters.campaigns": "Kampeni zote", "project.navFilters.showAllXTags": "Onyesha {typeOfTag}", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "Tayari kwa kuthibitishwa", "project.tasks.filter.readyToMap": "Zipo kwa ajili ya kuchorwa", "project.tasks.filter.noTasksFound": "Hakuna kazi zilizopatikana.", + "project.tasks.readComments": "", "project.tasks.action.completion": "Kukamilika", "project.tasks.action.history": "Historia", "project.tasks.action.finish_mapping.title": "Mara tu utakapokua umemaliza kuchora ramani", diff --git a/frontend/src/locales/tl.json b/frontend/src/locales/tl.json index 7285c271e1..1f8fee6793 100644 --- a/frontend/src/locales/tl.json +++ b/frontend/src/locales/tl.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "", "project.nav.listViewToggle": "", "project.navFilters.typesOfMapping": "", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "", "project.navFilters.campaigns": "", "project.navFilters.showAllXTags": "", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "", "project.tasks.filter.readyToMap": "", "project.tasks.filter.noTasksFound": "", + "project.tasks.readComments": "", "project.tasks.action.completion": "", "project.tasks.action.history": "", "project.tasks.action.finish_mapping.title": "", diff --git a/frontend/src/locales/tr.json b/frontend/src/locales/tr.json index 4e76abeb80..fd1ac28451 100644 --- a/frontend/src/locales/tr.json +++ b/frontend/src/locales/tr.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "Haritayı göster", "project.nav.listViewToggle": "", "project.navFilters.typesOfMapping": "Haritalama çeşitleri", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "", "project.navFilters.campaigns": "Tüm Kampanyalar", "project.navFilters.showAllXTags": "{typeOfTag}'i göster", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "Doğrulamaya hazır", "project.tasks.filter.readyToMap": "Haritalamaya açık", "project.tasks.filter.noTasksFound": "Görev bulunamadı.", + "project.tasks.readComments": "", "project.tasks.action.completion": "Tamamlanma", "project.tasks.action.history": "Geçmiş", "project.tasks.action.finish_mapping.title": "Haritalamayı bitirdikten sonra", diff --git a/frontend/src/locales/uk.json b/frontend/src/locales/uk.json index a6722ea6db..16dc8468f2 100644 --- a/frontend/src/locales/uk.json +++ b/frontend/src/locales/uk.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "Показати мапу", "project.nav.listViewToggle": "Список", "project.navFilters.typesOfMapping": "Типи мапінгу", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "Точний збіг", "project.navFilters.campaigns": "Всі кампанії", "project.navFilters.showAllXTags": "Показати {typeOfTag}", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "Готові для перевірки", "project.tasks.filter.readyToMap": "Доступні для мапінгу", "project.tasks.filter.noTasksFound": "Завдання не знайдені.", + "project.tasks.readComments": "", "project.tasks.action.completion": "Завершення", "project.tasks.action.history": "Історія", "project.tasks.action.finish_mapping.title": "Після того як ви закінчили мапити", diff --git a/frontend/src/locales/zh_TW.json b/frontend/src/locales/zh_TW.json index ba532b62b7..b3ce4781a9 100644 --- a/frontend/src/locales/zh_TW.json +++ b/frontend/src/locales/zh_TW.json @@ -444,6 +444,9 @@ "project.nav.showMapToggle": "", "project.nav.listViewToggle": "列表視圖", "project.navFilters.typesOfMapping": "", + "project.navFilters.action.map": "", + "project.navFilters.action.validate": "", + "project.navFilters.action.any": "", "project.navFilters.typesOfMapping.exactMatch": "", "project.navFilters.campaigns": "", "project.navFilters.showAllXTags": "", @@ -572,6 +575,7 @@ "project.tasks.filter.readyToValidate": "", "project.tasks.filter.readyToMap": "", "project.tasks.filter.noTasksFound": "", + "project.tasks.readComments": "", "project.tasks.action.completion": "", "project.tasks.action.history": "", "project.tasks.action.finish_mapping.title": "", From 87d361f33844392f7aa807b56c65089d9f5b60d9 Mon Sep 17 00:00:00 2001 From: Ramya Date: Tue, 15 Dec 2020 20:40:29 +0530 Subject: [PATCH 17/22] Update NoGeometries signature (#3974) * Update NoGeomtries signature * Black formatiing --- backend/api/projects/resources.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/api/projects/resources.py b/backend/api/projects/resources.py index 60a9000d93..f07185e9bb 100644 --- a/backend/api/projects/resources.py +++ b/backend/api/projects/resources.py @@ -955,8 +955,9 @@ def get(self, project_id): if request.args.get("as_file") else False ) + locale = request.environ.get("HTTP_ACCEPT_LANGUAGE") project_dto = ProjectService.get_project_dto_for_mapper( - project_id, request.environ.get("HTTP_ACCEPT_LANGUAGE"), True + project_id, None, locale, True ) project_dto = project_dto.to_primitive() From 47f547be8e9eeb9fda5f3de9d7056332b9853178 Mon Sep 17 00:00:00 2001 From: Wille Marcel Date: Tue, 15 Dec 2020 11:54:58 -0300 Subject: [PATCH 18/22] Remove DueDateBox from ProjectCard + remove unneeded import on test file --- frontend/src/components/projectCard/projectCard.js | 2 -- .../src/components/userDetail/tests/elementsMapped.test.js | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/projectCard/projectCard.js b/frontend/src/components/projectCard/projectCard.js index 0d71b65bc5..2705bed5ca 100644 --- a/frontend/src/components/projectCard/projectCard.js +++ b/frontend/src/components/projectCard/projectCard.js @@ -9,7 +9,6 @@ import { MappingLevelMessage } from '../mappingLevel'; import { ProjectStatusBox } from '../projectDetail/statusBox'; import { PROJECTCARD_CONTRIBUTION_SHOWN_THRESHOLD } from '../../config/index'; import { PriorityBox } from './priorityBox'; -import { DueDateBox } from './dueDateBox'; export function ProjectTeaser({ lastUpdated, @@ -132,7 +131,6 @@ export function ProjectCard({ level={mapperLevel} className="fl f7 pv2 ttc fw5 blue-grey truncate" /> - {showBottomButtons && }

diff --git a/frontend/src/components/userDetail/tests/elementsMapped.test.js b/frontend/src/components/userDetail/tests/elementsMapped.test.js index 358b9dc6c1..d4c7e75102 100644 --- a/frontend/src/components/userDetail/tests/elementsMapped.test.js +++ b/frontend/src/components/userDetail/tests/elementsMapped.test.js @@ -1,5 +1,5 @@ import React from 'react'; -import { render, screen } from '@testing-library/react'; +import { render } from '@testing-library/react'; import '@testing-library/jest-dom'; import { ReduxIntlProviders } from '../../../utils/testWithIntl'; @@ -18,7 +18,7 @@ describe('ElementsMapped & TaskStats components', () => { }; const { getByText } = render( - + , ); @@ -31,7 +31,7 @@ describe('ElementsMapped & TaskStats components', () => { expect(getByText('229')).toBeInTheDocument(); }); - it ('TaskStats component is rendered', ()=> { + it('TaskStats component is rendered', () => { const userStats = { tasksMapped: 9, tasksValidatedByOthers: 8, From 60cac55d25a381e999f2a4f10be310af799a55b9 Mon Sep 17 00:00:00 2001 From: Wille Marcel Date: Tue, 15 Dec 2020 15:41:06 -0300 Subject: [PATCH 19/22] fix url of code of conduct --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 331f9ddb49..0c0e8fcab2 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ This is Free and Open Source Software. You are welcome to use the code and set u ## Get involved! -* Check our [Code of conduct](.docs/code_of_conduct.md) +* Check our [Code of conduct](./docs/code_of_conduct.md) * Get familiar with our [contributor guidelines](./docs/contributing.md) * Join the [working groups](./docs/working-groups.md) * Help us to [translate the user interface](./docs/contributing-translation.md) From 7b67669524af623bd54c14916ccc53cb749d0648 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 15 Dec 2020 16:53:12 +0000 Subject: [PATCH 20/22] Bump dompurify from 2.2.3 to 2.2.4 in /frontend Bumps [dompurify](https://github.com/cure53/DOMPurify) from 2.2.3 to 2.2.4. - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](https://github.com/cure53/DOMPurify/compare/2.2.3...2.2.4) Signed-off-by: dependabot-preview[bot] --- frontend/package.json | 2 +- frontend/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 0168d7899d..e366c1a5b6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -29,7 +29,7 @@ "@webscopeio/react-textarea-autocomplete": "^4.7.2", "axios": "^0.21.0", "chart.js": "^2.9.4", - "dompurify": "^2.2.3", + "dompurify": "^2.2.4", "downshift-hooks": "^0.8.1", "final-form": "^4.20.1", "fromentries": "^1.3.2", diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 59ba50fa2a..476c1ea07c 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -4770,10 +4770,10 @@ domhandler@^2.3.0: dependencies: domelementtype "1" -dompurify@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.3.tgz#ec653ba521b39f397c2ca045769438d593ea8a9f" - integrity sha512-8Hv7Q0FuwD9rWoB6qI2eZsfKbGXfoUVuGHHrE15vgk4ReOKwOkSgbqb2OMFtc0d5besOEkoLkcyuV10zQ2X5gw== +dompurify@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.4.tgz#a98cd182b729bdd8715c3eb7a8bf8eafb2ff7410" + integrity sha512-jE21SelIgWrGKoXGfGPA524Zt1IJFBnktwfFMHDlEYRx5FZOdc+4eEH9mkA6PuhExrq3HVpJnY8hMYUzAMl0OA== domutils@1.3: version "1.3.0" From 0c250801e0a0076c748250d32671cc5efa2b4c03 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 15 Dec 2020 20:20:29 +0000 Subject: [PATCH 21/22] Bump marked from 1.2.6 to 1.2.7 in /frontend Bumps [marked](https://github.com/markedjs/marked) from 1.2.6 to 1.2.7. - [Release notes](https://github.com/markedjs/marked/releases) - [Changelog](https://github.com/markedjs/marked/blob/master/release.config.js) - [Commits](https://github.com/markedjs/marked/compare/v1.2.6...v1.2.7) Signed-off-by: dependabot-preview[bot] --- frontend/package.json | 2 +- frontend/yarn.lock | 13 ++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index e366c1a5b6..5f5967c90c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -37,7 +37,7 @@ "immutable": "^4.0.0-rc.12", "mapbox-gl": "^1.13.0", "mapbox-gl-draw-rectangle-mode": "^1.0.4", - "marked": "^1.2.6", + "marked": "^1.2.7", "node-sass": "^4.14.1", "osmtogeojson": "^3.0.0-beta.3", "query-string": "^6.13.7", diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 476c1ea07c..1abe50f585 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -8056,15 +8056,10 @@ mapbox-gl@^1.13.0: tinyqueue "^2.0.3" vt-pbf "^3.1.1" -marked@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/marked/-/marked-1.2.6.tgz#fa55cf38ab3585005c9fb3c1ebfb3d4590c29fdc" - integrity sha512-7vVuSEZ8g/HH3hK/BH/+7u/NJj7x9VY4EHzujLDcqAQLiOUeFJYAsfSAyoWtR17lKrx7b08qyIno4lffwrzTaA== - -marked@~1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/marked/-/marked-1.2.5.tgz#a44b31f2a0b8b5bfd610f00d55d1952d1ac1dfdb" - integrity sha512-2AlqgYnVPOc9WDyWu7S5DJaEZsfk6dNh/neatQ3IHUW4QLutM/VPSH9lG7bif+XjFWc9K9XR3QvR+fXuECmfdA== +marked@^1.2.7, marked@~1.2.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/marked/-/marked-1.2.7.tgz#6e14b595581d2319cdcf033a24caaf41455a01fb" + integrity sha512-No11hFYcXr/zkBvL6qFmAp1z6BKY3zqLMHny/JN/ey+al7qwCM2+CMBL9BOgqMxZU36fz4cCWfn2poWIf7QRXA== martinez-polygon-clipping@0.7.0: version "0.7.0" From 29cdfb8d5e2acc2898b817fa89c0fdfbbfe2ba5b Mon Sep 17 00:00:00 2001 From: Wille Marcel Date: Tue, 15 Dec 2020 15:46:51 -0300 Subject: [PATCH 22/22] Hide social network logos if the url is not defined with an env var --- frontend/src/components/footer.js | 20 +++++++++++--------- frontend/src/config/index.js | 12 ++++++------ 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/frontend/src/components/footer.js b/frontend/src/components/footer.js index 632773cf25..1429cca24a 100644 --- a/frontend/src/components/footer.js +++ b/frontend/src/components/footer.js @@ -52,15 +52,17 @@ export function Footer({ location }: Object) { ))}

- {socialNetworks.map((item, n) => ( - - {item.icon} - - ))} + {socialNetworks + .filter((item) => item.link) + .map((item, n) => ( + + {item.icon} + + ))}

diff --git a/frontend/src/config/index.js b/frontend/src/config/index.js index 9d2277236e..a4204309f8 100644 --- a/frontend/src/config/index.js +++ b/frontend/src/config/index.js @@ -12,7 +12,7 @@ export const USER_STATS_API_URL = // APPLICATION SETTINGS export const DEFAULT_LOCALE = process.env.REACT_APP_DEFAULT_LOCALE || 'en'; -export const ENVIRONMENT= process.env.REACT_APP_ENVIRONMENT || ''; +export const ENVIRONMENT = process.env.REACT_APP_ENVIRONMENT || ''; export const PROJECTCARD_CONTRIBUTION_SHOWN_THRESHOLD = process.env.REACT_APP_PROJECTCARD_CONTRIBUTION_SHOWN_THRESHOLD || 5; export const INTERMEDIATE_LEVEL_COUNT = @@ -32,11 +32,11 @@ export const OSM_CONSUMER_SECRET = process.env.REACT_APP_OSM_CONSUMER_SECRET || export const ORG_PRIVACY_POLICY_URL = process.env.REACT_APP_ORG_PRIVACY_POLICY_URL || ''; export const OSM_REGISTER_URL = process.env.REACT_APP_OSM_REGISTER_URL || 'https://www.openstreetmap.org/user/new'; -export const ORG_TWITTER = process.env.REACT_APP_ORG_TWITTER || 'http://twitter.com'; -export const ORG_FB = process.env.REACT_APP_ORG_FB || 'https://www.facebook.com'; -export const ORG_INSTAGRAM = process.env.REACT_APP_ORG_INSTAGRAM || 'https://www.instagram.com'; -export const ORG_YOUTUBE = process.env.REACT_APP_ORG_YOUTUBE || 'https://www.youtube.com'; -export const ORG_GITHUB = process.env.REACT_APP_ORG_GITHUB || 'https://github.com/'; +export const ORG_TWITTER = process.env.REACT_APP_ORG_TWITTER || ''; +export const ORG_FB = process.env.REACT_APP_ORG_FB || ''; +export const ORG_INSTAGRAM = process.env.REACT_APP_ORG_INSTAGRAM || ''; +export const ORG_YOUTUBE = process.env.REACT_APP_ORG_YOUTUBE || ''; +export const ORG_GITHUB = process.env.REACT_APP_ORG_GITHUB || ''; export const MATOMO_ID = process.env.REACT_APP_MATOMO_ID || ''; export const IMAGE_UPLOAD_SERVICE = process.env.REACT_APP_IMAGE_UPLOAD_API_URL || ''; export const HOMEPAGE_VIDEO_URL = process.env.REACT_APP_HOMEPAGE_VIDEO_URL || '';