From b8ae8e9fa3d46516590661ddb37a0967e677dd0b Mon Sep 17 00:00:00 2001 From: "Phyks (Lucas Verney)" Date: Sat, 25 Aug 2018 18:15:19 +0200 Subject: [PATCH] Add a way to report a bug, close #34 --- scripts/renest_json.py | 2 + src/App.vue | 7 ++ src/components/Modal.vue | 6 +- src/components/ReportIssueModal.vue | 96 ++++++++++++++++++++++++++++ src/components/ShareMapViewModal.vue | 2 +- src/constants.js | 3 + src/i18n/en.json | 10 ++- src/i18n/fr.json | 12 +++- src/i18n/oc.json | 8 +-- src/vuetify.js | 2 + 10 files changed, 135 insertions(+), 13 deletions(-) create mode 100644 src/components/ReportIssueModal.vue diff --git a/scripts/renest_json.py b/scripts/renest_json.py index 556f5d6..df3e6ee 100755 --- a/scripts/renest_json.py +++ b/scripts/renest_json.py @@ -6,6 +6,8 @@ locale = json.loads(sys.stdin.read()) nested_json = {} for key, value in locale.items(): + if not value: + continue split_key = key.split('.') d = nested_json for key2 in split_key[:-1]: diff --git a/src/App.vue b/src/App.vue index dd9d54a..5eb1ab6 100644 --- a/src/App.vue +++ b/src/App.vue @@ -41,6 +41,9 @@ {{ $t("menu.Settings") }} + + {{ $t("menu.reportIssue") }} + @@ -53,6 +56,7 @@ + @@ -66,11 +70,13 @@ import moment from 'moment'; import { DELAY_BETWEEN_API_BATCH_REQUESTS, VERSION } from '@/constants'; import ReportErrorModal from '@/components/ReportErrorModal.vue'; +import ReportIssueModal from '@/components/ReportIssueModal.vue'; import ShareMapViewModal from '@/components/ShareMapViewModal.vue'; export default { components: { ReportErrorModal, + ReportIssueModal, ShareMapViewModal, }, computed: { @@ -90,6 +96,7 @@ export default { data() { return { hasReportError: false, + isReportIssueModalShown: false, isSendingReports: false, isShareMapViewModalShown: false, title: "Cycl'Assist", diff --git a/src/components/Modal.vue b/src/components/Modal.vue index 927b163..3051b20 100644 --- a/src/components/Modal.vue +++ b/src/components/Modal.vue @@ -1,5 +1,5 @@ @@ -36,6 +36,10 @@ export default { window.addEventListener('keydown', this.hideModalOnEsc); }, props: { + maxWidth: { + type: Number, + default: 290, + }, value: Boolean, }, }; diff --git a/src/components/ReportIssueModal.vue b/src/components/ReportIssueModal.vue new file mode 100644 index 0000000..a651db0 --- /dev/null +++ b/src/components/ReportIssueModal.vue @@ -0,0 +1,96 @@ + + + diff --git a/src/components/ShareMapViewModal.vue b/src/components/ShareMapViewModal.vue index 748ca77..c5a670f 100644 --- a/src/components/ShareMapViewModal.vue +++ b/src/components/ShareMapViewModal.vue @@ -22,7 +22,7 @@ {{ $t('misc.ok') }} - + diff --git a/src/constants.js b/src/constants.js index d2bb450..da719b2 100644 --- a/src/constants.js +++ b/src/constants.js @@ -115,3 +115,6 @@ export const DELAY_BETWEEN_API_BATCH_REQUESTS = 1000; // A vibration sequence for report alarms export const REPORT_ALARM_VIBRATION_SEQUENCE = [500]; + +// Email address to send issues to +export const CONTACT_EMAIL_ADDRESS = 'phyks+cyclassist@phyks.me'; diff --git a/src/i18n/en.json b/src/i18n/en.json index 2ad6771..227da28 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -50,6 +50,7 @@ "About": "Help", "Settings": "Settings", "exportGPX": "Export GPX", + "reportIssue": "Report an issue", "shareMapView": "Share map view" }, "misc": { @@ -57,8 +58,7 @@ "discard": "Discard", "ok": "OK", "or": "or", - "retry": "Retry", - "spaceBeforeDoublePunctuations": "" + "retry": "Retry" }, "permissions": { "geolocation": "Geolocation", @@ -75,6 +75,12 @@ "unableToSendDescription": "There was a network issue preventing from sending the latest report.", "unableToSendTitle": "Unable to send latest report" }, + "reportIssueModal": { + "description": "Description", + "includeGPX": "Include the current GPS trace?", + "reportIssue": "Report an issue", + "send": "Send" + }, "reportLabels": { "accident": "Accident", "accidentDescription": "Any accident on the road (automatically removed after one hour).", diff --git a/src/i18n/fr.json b/src/i18n/fr.json index 4d3a2a9..00fc08b 100644 --- a/src/i18n/fr.json +++ b/src/i18n/fr.json @@ -3,7 +3,7 @@ "availableReportsTitle": "Les signalements disponibles pour l'instant sont :", "lastReportAdded": "Dernier signalement ajout\u00e9 {fromNow}.", "license": "Licence", - "licenseDescription": "Le code source est sous licence MIT (code source). Les ic\u00f4nes sont bas\u00e9es sur des travaux de Wikimedia, Vecteezy, Pixabay ou Flaticon. Les sons sont bas\u00e9s sur des \u0153uvres sous CC0 de freesound.org. Les tuiles de fond de carte proviennent de chez Carto.com ou Thunderforest, gr\u00e2ce aux contributeurs OpenStreetMap et \u00e0 OpenLayers. Les signalements sont disponibles sous licence ODbL. La saisie manuelle de la position utilise l'excellente API de adresse.data.gouv.fr.", + "licenseDescription": "Le code source est sous licence MIT (code source). Les ic\u00f4nes sont bas\u00e9es sur des travaux de Wikimedia, Vecteezy, Pixabay ou Flaticon. Les sons sont bas\u00e9s sur des \u0153uvres sous CC0 de freesound.org. Les tuiles de fond de carte proviennent de chez Carto.com ou Thunderforest, gr\u00e2ce aux contributeurs OpenStreetMap et \u00e0 Leaflet. Les signalements sont disponibles sous licence ODbL. La saisie manuelle de la position utilise l'excellente API de adresse.data.gouv.fr.", "nbActiveReports": "Aucun signalement actif. | Un signalement actif. | {nbActiveReports} signalements actifs.", "nbReports": "Aucun signalement. | Un signalement. | {nbReports} signalements.", "stats": "Statistiques", @@ -50,6 +50,7 @@ "About": "Aide", "Settings": "Pr\u00e9f\u00e9rences", "exportGPX": "Exporter en GPX", + "reportIssue": "Signaler un bug", "shareMapView": "Partager" }, "misc": { @@ -57,8 +58,7 @@ "discard": "Annuler", "ok": "OK", "or": "ou", - "retry": "R\u00e9essayer", - "spaceBeforeDoublePunctuations": " " + "retry": "R\u00e9essayer" }, "permissions": { "geolocation": "G\u00e9olocalisation", @@ -75,6 +75,12 @@ "unableToSendDescription": "Une erreur de r\u00e9seau emp\u00eache l'envoi du dernier signalement.", "unableToSendTitle": "Impossible d'envoyer le dernier signalement" }, + "reportIssueModal": { + "description": "Description", + "includeGPX": "Inclure la trace GPS courante", + "reportIssue": "Signaler un bug", + "send": "Envoyer" + }, "reportLabels": { "accident": "Accident", "accidentDescription": "Un accident sur la route (automatiquement supprim\u00e9 apr\u00e8s une heure).", diff --git a/src/i18n/oc.json b/src/i18n/oc.json index 415958e..41e799b 100644 --- a/src/i18n/oc.json +++ b/src/i18n/oc.json @@ -3,7 +3,7 @@ "availableReportsTitle": "Los senhalaments disponibles pel moment son :", "lastReportAdded": "Darri\u00e8ra senhalament ajustat {fromNow}.", "license": "Lic\u00e9ncia", - "licenseDescription": "It is released under an MIT license (source code). Icons are based on creations from Wikimedia, Vecteezy, Pixabay or Flaticon. Sounds are based on CC0 works from freesound.org. The map background is using tiles from Carto.com or Thunderforest, thanks to OpenStreetMap contributors and Leaflet. Collected reports are available under ODbL license. Manual location picking uses the awesome API from adresse.data.gouv.fr.", + "licenseDescription": "Lo c\u00f2di font es jos lic\u00e9ncia MIT (c\u00f2di font). Las ic\u00f2nas son basadas sus d'\u00f2bras de Wikimedia, Vecteezy, Pixabay o Flaticon. Las teulas de fons venon Carto.com o Thunderforest, gr\u00e0cia als contributors OpenStreetMap e a Leaflet. Los senhalaments son disponibles jos lic\u00e9ncia ODbL. La sasida manuala de la posicion utiliza l'excellenta API de adresse.data.gouv.fr.", "nbActiveReports": "Cap de senhalament actiu. |\u00a0Un senhalament actiu. | {nbActiveReports} senhalaments actius.", "nbReports": "Cap de senhalament. | Un senhalament. | {nbReports} senhalaments.", "stats": "Estatisticas", @@ -57,8 +57,7 @@ "discard": "Anullar", "ok": "D\u2019acc\u00f2rdi", "or": "o", - "retry": "Ensajar tornamai", - "spaceBeforeDoublePunctuations": " " + "retry": "Ensajar tornamai" }, "permissions": { "geolocation": "Geolocalizacion", @@ -90,12 +89,9 @@ "potholeDescription": "Un trauc per la rota." }, "settings": { - "autorotate": "", "customTileServer": "Servidor de teulas personalizat", "customTileServerURL": "URL del servidor de teulas personalizat", "customTileServerURLHint": "Per exemple\u00a0: http://tile.thunderforest.com/cycle/{z}/{x}/{y}.png", - "defaultOrientationMode": "", - "fixedNorth": "", "locale": "Lenga", "skipOnboarding": "Passar l'introduccion", "tileServer": "Servidor de teulas per la mapa" diff --git a/src/vuetify.js b/src/vuetify.js index 2ccd8c9..7563fe8 100644 --- a/src/vuetify.js +++ b/src/vuetify.js @@ -16,6 +16,7 @@ import VProgressCircular from 'vuetify/es5/components/VProgressCircular'; import VProgressLinear from 'vuetify/es5/components/VProgressLinear'; import VSelect from 'vuetify/es5/components/VSelect'; import VSwitch from 'vuetify/es5/components/VSwitch'; +import VTextarea from 'vuetify/es5/components/VTextarea'; import VTextField from 'vuetify/es5/components/VTextField'; import VToolbar from 'vuetify/es5/components/VToolbar'; @@ -37,6 +38,7 @@ Vue.use(Vuetify, { VProgressLinear, VSelect, VSwitch, + VTextarea, VTextField, VToolbar, },