Skip to content

Commit

Permalink
Import plans from csv file, improved italian translation (#418)
Browse files Browse the repository at this point in the history
* Added the feature to import plans from a CSV file

The headers of the CSV are:

type, title, reference_id, link, , ,

* Improved Italian translation

* Removed cypress files

Using playwright for e2e tests

---------

Co-authored-by: coda <coda@thebusinessgame.it>
Co-authored-by: Giacomo <giacomo.marcon@thebusinessgame.it>
  • Loading branch information
3 people committed Jun 17, 2023
1 parent 4ae41cb commit 0bb3ec0
Show file tree
Hide file tree
Showing 14 changed files with 1,002 additions and 6 deletions.
3 changes: 3 additions & 0 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package main

import (
"context"

"github.com/spf13/viper"
"github.com/uptrace/opentelemetry-go-extra/otelzap"
)
Expand Down Expand Up @@ -63,6 +64,7 @@ func InitConfig(logger *otelzap.Logger) {
viper.SetDefault("config.allow_guests", true)
viper.SetDefault("config.allow_registration", true)
viper.SetDefault("config.allow_jira_import", true)
viper.SetDefault("config.allow_csv_import",true)
viper.SetDefault("config.default_locale", "en")
viper.SetDefault("config.friendly_ui_verbs", false)
viper.SetDefault("config.allow_external_api", true)
Expand Down Expand Up @@ -143,6 +145,7 @@ func InitConfig(logger *otelzap.Logger) {
viper.BindEnv("config.allow_guests", "CONFIG_ALLOW_GUESTS")
viper.BindEnv("config.allow_registration", "CONFIG_ALLOW_REGISTRATION")
viper.BindEnv("config.allow_jira_import", "CONFIG_ALLOW_JIRA_IMPORT")
viper.BindEnv("config.allow_CSV_import", "CONFIG_ALLOW_CSV_IMPORT")
viper.BindEnv("config.default_locale", "CONFIG_DEFAULT_LOCALE")
viper.BindEnv("config.friendly_ui_verbs", "CONFIG_FRIENDLY_UI_VERBS")
viper.BindEnv("config.allow_external_api", "CONFIG_ALLOW_EXTERNAL_API")
Expand Down
5 changes: 4 additions & 1 deletion docs/CONFIGURATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,10 @@ set that user as ADMIN role.
| `config.toast_timeout` | CONFIG_TOAST_TIMEOUT | Number of milliseconds before notifications are hidden. | 1000 |
| `config.allow_guests` | CONFIG_ALLOW_GUESTS | Whether or not to allow guest (anonymous) users. | true |
| `config.allow_registration` | CONFIG_ALLOW_REGISTRATION | Whether or not to allow user registration (outside Admin). | true |
| `config.allow_jira_import` | CONFIG_ALLOW_JIRA_IMPORT | Whether or not to allow import plans from JIRA XML. | true |
| `config.allow_jira_import` | CONFIG_ALLOW_JIRA_IMPORT | Whether or not to allow import plans from JIRA XML. |
true |
| `config.allow_csv_import` | CONFIG_ALLOW_CSV_IMPORT | Whether or not to allow import plans from a csv file |
true |
| `config.default_locale` | CONFIG_DEFAULT_LOCALE | The default locale (language) for the UI | en |
| `config.friendly_ui_verbs` | CONFIG_FRIENDLY_UI_VERBS | Whether or not to use more friendly UI verbs like Users instead of Warrior, e.g. Corporate friendly | false |
| `config.allow_external_api` | CONFIG_ALLOW_EXTERNAL_API | Whether or not to allow External API access | true |
Expand Down
3 changes: 3 additions & 0 deletions e2e/fixtures/csv-issues.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
feature,Plan_1,REF001,http://example.com/test1,"This is a description for Test Plan 1","This is acceptance criteria for Test Plan 1"
prova,Plan_2,REF002,http://example.com/test2,"This is a description for Test Plan 2","This is acceptance criteria for Test Plan 2"
task,Plan_3,REF003,http://example.com/test3,"This is a description for Test Plan 3","This is acceptance criteria for Test Plan 3"
2 changes: 1 addition & 1 deletion e2e/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions frontend/public/lang/default/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"planType": "Plan Type",
"planLinkPlaceholder": "Enter a link to plan",
"importJiraXML": "Import plans from Jira XML",
"importCsv": "Import plans from a Csv file",
"landingTitle": "Thunderdome is an Agile Planning Poker app with a fun theme",
"landingCountries": "Warriors in over {count} countries",
"pages": {
Expand Down
118 changes: 118 additions & 0 deletions frontend/public/lang/default/it.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
{
"logoutError": "Si è verificato un errore durante il logout del guerriero",
"battleDelete": "Elimina Battaglia",
"battleAbandon": "Abbandona Battaglia",
"battleCreate": "Crea Battaglia",
"battleEdit": "Modifica Battaglia",
"warriorCreate": "Crea Guerriero",
"planAdd": "Aggiungi Piano",
"planSkip": "Salta Piano",
"planName": "Nome Piano",
"planNamePlaceholder": "Inserisci un nome per il piano",
"planType": "Tipo Piano",
"planLinkPlaceholder": "Inserisci un link al piano",
"importJiraXML": "Importa piani da Jira XML",
"importCsv": "Importa piani da un file Csv",
"landingTitle": "Thunderdome è un'app Agile Planning Poker con un tema divertente",
"landingCountries": "Guerrieri in oltre {count} paesi",
"pages": {
"myBattles": {
"nav": "Le mie Battaglie",
"title": "Le mie Battaglie",
"battlesError": "Si è verificato un errore nel trovare le tue battaglie",
"countPlansPointed": "{totalPointed} di {totalPlans} piani assegnati",
"createBattle": {
"title": "Crea una Battaglia",
"createError": "Si è verificato un errore durante la creazione della battaglia",
"fields": {
"name": {
"label": "Nome Battaglia",
"placeholder": "Inserisci un nome per la battaglia"
},
"plans": {
"label": "Piani",
"addButton": "Aggiungi Piano",
"fields": {
"name": {
"placeholder": "Inserisci un nome per il piano"
}
}
},
"autoFinishVoting": {
"label": "Termina automaticamente il voto quando tutti i guerrieri hanno votato"
}
}
}
},
"createAccount": {
"title": "Arruolati per la Battaglia",
"loginForBattle": "o {loginOpen}Accedi{loginClose} per unirti alla Battaglia",
"guestForm": {
"createError": "Si è verificato un errore durante la registrazione del guerriero come ospite"
},
"createAccountForm": {
"createError": "Si è verificato un errore durante la creazione del guerriero"
}
},
"warriorProfile": {
"fields": {
"enable_notifications": {
"label": "Abilita notifiche di battaglia"
}
}
},
"admin": {
"counts": {
"registered": "Guerreri registrati",
"unregistered": "Guerreri non registrati",
"battles": "Battaglie",
"plans": "Piani di Battaglia"
},
"registeredWarriors": {
"title": "Guerreri registrati"
},
"maintenance": {
"cleanBattles": "Pulisci Battaglie vecchie di {daysOld} giorni"
}
},
"login": {
"registerForBattle": "o {registerOpen}Registrati{registerClose} per unirti alla Battaglia",
"authError": "Errore durante l'autenticazione del guerriero"
},
"battle": {
"title": "Battaglia",
"warriors": "Guerrieri",
"socketReconnecting": "Ops, ricarico i Piani di Battaglia...",
"socketError": "Errore durante la connessione alla Battaglia, ricarica la pagina e riprova.",
"loading": "Caricamento Piani di Battaglia...",
"warriorJoined": "{name} si è unito alla Battaglia",
"warriorRetreated": "{name} si è ritirato dalla Battaglia",
"warriorInvite": "Invita un Guerriero",
"planSkipped": "Piano saltato",
"voteResults": {
"unknownWarrior": "Guerriero sconosciuto"
},
"battleDeleted": "Battaglia eliminata"
}
},
"plans": "Piani di Battaglia",
"battle": "Battaglia",
"battles": "Battaglie",
"battlesActive": "Battaglie attive",
"battlesActiveUsers": "Guerrieri attivi nelle Battaglie",
"battleJoin": "Entra in Battaglia",
"battleRemoveSuccess": "Battaglia eliminata con successo.",
"battleRemoveError": "Errore durante l'eliminazione della Battaglia.",
"teamGetBattlesError": "Errore durante la visualizzazione delle Battaglie del team",
"sessionDuplicate": "Esiste già una sessione di battaglia duplicata per il tuo ID",
"removeBattleConfirmText": "Sei sicuro di voler rimuovere questa Battaglia?",
"removeBattle": "Rimuovi Battaglia",
"deleteBattleConfirmText": "Sei sicuro di voler eliminare questa Battaglia?",
"deleteBattle": "Elimina Battaglia",
"oldBattleCleanError": "Errore durante la pulizia delle Battaglie vecchie",
"getBattleError": "Errore durante la visualizzazione della Battaglia",
"getBattlesError": "Errore durante la visualizzazione delle Battaglie",
"showActiveBattles": "Mostra Battaglie Attive",
"customizableBattleOptions": "Opzioni di Battaglia personalizzabili",
"deleteBattleError": "Errore durante l'eliminazione della Battaglia"
}
2 changes: 2 additions & 0 deletions frontend/public/lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
"votingRestart": "Restart Voting",
"importJiraXMLBadFileTypeError": "Error bad file type",
"importJiraXMLReadFileError": "Error reading file",
"importCsvFileBadFileTypeError": "Error bad file type",
"importCsvFileReadFileError": "Error reading file",
"planTypeStory": "Story",
"planTypeBug": "Bug",
"planTypeSpike": "Spike",
Expand Down
117 changes: 117 additions & 0 deletions frontend/public/lang/friendly/it.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
{
"logoutError": "Si è verificato un errore durante il logout dell'utente",
"battleDelete": "Elimina Gioco",
"battleAbandon": "Abbandona Gioco",
"battleCreate": "Crea Gioco",
"battleEdit": "Modifica Gioco",
"warriorCreate": "Crea Utente",
"planAdd": "Aggiungi Storia",
"planSkip": "Salta Storia",
"planName": "Nome Storia",
"planNamePlaceholder": "Inserisci un nome per la storia",
"planType": "Tipo Storia",
"planLinkPlaceholder": "Inserisci un link alla storia",
"importJiraXML": "Importa storie da Jira XML",
"landingTitle": "Thunderdome è un'app di Agile Planning Poker",
"landingCountries": "Utenti in oltre {count} paesi",
"pages": {
"myBattles": {
"nav": "Mie partite",
"title": "Mie partite",
"battlesError": "Errore durante la ricerca delle tue partite",
"countPlansPointed": "{totalPointed} di {totalPlans} storie puntate",
"createBattle": {
"title": "Crea una partita",
"createError": "Errore durante la creazione della partita",
"fields": {
"name": {
"label": "Nome partita",
"placeholder": "Inserisci il nome della partita"
},
"plans": {
"label": "Storie",
"addButton": "Aggiungi storia",
"fields": {
"name": {
"placeholder": "Inserisci il nome della storia"
}
}
},
"autoFinishVoting": {
"label": "Termina automaticamente il voto quando tutti i giocatori hanno votato"
}
}
}
},
"createAccount": {
"title": "Registrati per partecipare alle partite di punteggio",
"loginForBattle": "o {loginOpen}Accedi{loginClose} per partecipare alla partita",
"guestForm": {
"createError": "Errore durante la registrazione del giocatore come ospite"
},
"createAccountForm": {
"createError": "Errore durante la creazione del giocatore"
}
},
"warriorProfile": {
"fields": {
"enable_notifications": {
"label": "Abilita le notifiche di gioco"
}
}
},
"admin": {
"counts": {
"registered": "Giocatori registrati",
"unregistered": "Giocatori non registrati",
"battles": "Partite",
"plans": "Storie"
},
"registeredWarriors": {
"title": "Giocatori registrati"
},
"maintenance": {
"cleanBattles": "Pulisci le partite più vecchie di {daysOld} giorni"
}
},
"login": {
"registerForBattle": "o {registerOpen}Registrati{registerClose} per partecipare alla partita",
"authError": "Errore durante l'autenticazione del giocatore"
},
"battle": {
"title": "Partita",
"warriors": "Giocatori",
"socketReconnecting": "Ops, caricamento della partita...",
"socketError": "Errore durante la connessione alla partita, ricaricare e riprovare.",
"loading": "Caricamento partita...",
"warriorJoined": "{name} si è unito alla partita",
"warriorRetreated": "{name} ha lasciato la partita",
"warriorInvite": "Invita un giocatore",
"planSkipped": "Storia saltata",
"voteResults": {
"unknownWarrior": "Giocatore sconosciuto"
},
"battleDeleted": "Partita eliminata"
}
},
"plans": "Storie",
"battle": "Partita",
"battles": "Partite",
"battlesActive": "Partite attive",
"battlesActiveUsers": "Utenti attivi in partite",
"battleJoin": "Unisciti alla partita",
"battleRemoveSuccess": "Partita rimossa con successo.",
"battleRemoveError": "Errore durante la rimozione della partita.",
"teamGetBattlesError": "Errore durante il recupero delle partite del team",
"sessionDuplicate": "Esiste una sessione di gioco duplicata per il tuo ID",
"removeBattleConfirmText": "Sei sicuro di voler rimuovere questa partita?",
"removeBattle": "Rimuovi partita",
"deleteBattleConfirmText": "Sei sicuro di voler eliminare questa partita?",
"deleteBattle": "Elimina partita",
"oldBattleCleanError": "Errore durante la pulizia delle partite",
"getBattleError": "Errore durante il recupero delle partite",
"getBattlesError": "Errore durante il recupero delle partite",
"showActiveBattles": "Mostra partite attive",
"customizableBattleOptions": "Opzioni di gioco personalizzabili",
"deleteBattleError": "Errore durante l'eliminazione della partita"
}

0 comments on commit 0bb3ec0

Please sign in to comment.