Implement unit property for flags

This commit is contained in:
nemunaire 2021-11-12 23:52:22 +01:00
parent c3742ade4e
commit 61fccca070
7 changed files with 17 additions and 7 deletions

View file

@ -46,6 +46,7 @@ type ExerciceFlag struct {
LockedFile []ExerciceUnlockFile `toml:"unlock_file,omitempty"` LockedFile []ExerciceUnlockFile `toml:"unlock_file,omitempty"`
NeedFlag []ExerciceDependency `toml:"need_flag,omitempty"` NeedFlag []ExerciceDependency `toml:"need_flag,omitempty"`
NoShuffle bool NoShuffle bool
Unit string `toml:"unit,omitempty"`
NumberMin interface{} `toml:"min,omitempty"` NumberMin interface{} `toml:"min,omitempty"`
NumberMax interface{} `toml:"max,omitempty"` NumberMax interface{} `toml:"max,omitempty"`
NumberStep interface{} `toml:"step,omitempty"` NumberStep interface{} `toml:"step,omitempty"`

View file

@ -136,6 +136,7 @@ func buildKeyFlag(exercice fic.Exercice, flag ExerciceFlag, flagline int, defaul
Label: flag.Label, Label: flag.Label,
Placeholder: flag.Placeholder, Placeholder: flag.Placeholder,
Help: flag.Help, Help: flag.Help,
Unit: flag.Unit,
IgnoreCase: !flag.CaseSensitive, IgnoreCase: !flag.CaseSensitive,
Multiline: flag.Type == "text", Multiline: flag.Type == "text",
ValidatorRegexp: validatorRegexp(flag.ValidatorRe), ValidatorRegexp: validatorRegexp(flag.ValidatorRe),

View file

@ -171,6 +171,9 @@
<Icon name="plus" /> <Icon name="plus" />
</Button> </Button>
{/if} {/if}
{#if flag.unit}
<span class="input-group-text">{flag.unit}</span>
{/if}
</div> </div>
{/each} {/each}
{#if flag.help} {#if flag.help}

View file

@ -186,6 +186,7 @@ CREATE TABLE IF NOT EXISTS exercice_flags(
type VARCHAR(255) NOT NULL, type VARCHAR(255) NOT NULL,
placeholder VARCHAR(255) NOT NULL, placeholder VARCHAR(255) NOT NULL,
help VARCHAR(255) NOT NULL, help VARCHAR(255) NOT NULL,
unit VARCHAR(255) NOT NULL,
ignorecase BOOLEAN NOT NULL DEFAULT 0, ignorecase BOOLEAN NOT NULL DEFAULT 0,
multiline BOOLEAN NOT NULL DEFAULT 0, multiline BOOLEAN NOT NULL DEFAULT 0,
validator_regexp VARCHAR(255) NULL, validator_regexp VARCHAR(255) NULL,

View file

@ -330,7 +330,7 @@ func (f EFile) GetDepends() ([]Flag, error) {
if err := rows.Scan(&d); err != nil { if err := rows.Scan(&d); err != nil {
return nil, err return nil, err
} }
deps = append(deps, FlagKey{d, f.IdExercice, 0, "", "", "", "", false, false, nil, []byte{}, 0}) deps = append(deps, FlagKey{d, f.IdExercice, 0, "", "", "", "", "", false, false, nil, []byte{}, 0})
} }
if err := rows.Err(); err != nil { if err := rows.Err(); err != nil {
return nil, err return nil, err

View file

@ -25,6 +25,8 @@ type FlagKey struct {
Placeholder string `json:"placeholder"` Placeholder string `json:"placeholder"`
// Help is a description of the flag // Help is a description of the flag
Help string `json:"help"` Help string `json:"help"`
// Unit is another indication appended to the input
Unit string `json:"unit"`
// IgnoreCase indicates if the case is sensitive to case or not // IgnoreCase indicates if the case is sensitive to case or not
IgnoreCase bool `json:"ignorecase"` IgnoreCase bool `json:"ignorecase"`
// Multiline indicates if the flag is stored on multiple lines // Multiline indicates if the flag is stored on multiple lines
@ -39,7 +41,7 @@ type FlagKey struct {
// GetFlagKeys returns a list of key's flags comming with the challenge. // GetFlagKeys returns a list of key's flags comming with the challenge.
func (e Exercice) GetFlagKeys() ([]FlagKey, error) { func (e Exercice) GetFlagKeys() ([]FlagKey, error) {
if rows, err := DBQuery("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, ignorecase, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE id_exercice = ?", e.Id); err != nil { if rows, err := DBQuery("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, unit, ignorecase, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE id_exercice = ?", e.Id); err != nil {
return nil, err return nil, err
} else { } else {
defer rows.Close() defer rows.Close()
@ -49,7 +51,7 @@ func (e Exercice) GetFlagKeys() ([]FlagKey, error) {
var k FlagKey var k FlagKey
k.IdExercice = e.Id k.IdExercice = e.Id
if err := rows.Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.IgnoreCase, &k.Multiline, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost); err != nil { if err := rows.Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.Unit, &k.IgnoreCase, &k.Multiline, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost); err != nil {
return nil, err return nil, err
} }
@ -65,13 +67,13 @@ func (e Exercice) GetFlagKeys() ([]FlagKey, error) {
// GetFlagKey returns a list of flags comming with the challenge. // GetFlagKey returns a list of flags comming with the challenge.
func GetFlagKey(id int) (k FlagKey, err error) { func GetFlagKey(id int) (k FlagKey, err error) {
err = DBQueryRow("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, ignorecase, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE id_flag = ?", id).Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.IgnoreCase, &k.Multiline, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost) err = DBQueryRow("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, unit, ignorecase, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE id_flag = ?", id).Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.Unit, &k.IgnoreCase, &k.Multiline, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost)
return return
} }
// GetFlagKeyByLabel returns a flag matching the given label. // GetFlagKeyByLabel returns a flag matching the given label.
func (e Exercice) GetFlagKeyByLabel(label string) (k FlagKey, err error) { func (e Exercice) GetFlagKeyByLabel(label string) (k FlagKey, err error) {
err = DBQueryRow("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, ignorecase, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE type LIKE ? AND id_exercice = ?", label, e.Id).Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.IgnoreCase, &k.Multiline, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost) err = DBQueryRow("SELECT id_flag, id_exercice, ordre, label, type, placeholder, help, unit, ignorecase, multiline, validator_regexp, cksum, choices_cost FROM exercice_flags WHERE type LIKE ? AND id_exercice = ?", label, e.Id).Scan(&k.Id, &k.IdExercice, &k.Order, &k.Label, &k.Type, &k.Placeholder, &k.Help, &k.Unit, &k.IgnoreCase, &k.Multiline, &k.ValidatorRegexp, &k.Checksum, &k.ChoicesCost)
return return
} }
@ -155,7 +157,7 @@ func (k FlagKey) Create(e Exercice) (Flag, error) {
} }
} }
if res, err := DBExec("INSERT INTO exercice_flags (id_exercice, ordre, label, type, placeholder, help, ignorecase, multiline, validator_regexp, cksum, choices_cost) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", e.Id, k.Order, k.Label, k.Type, k.Placeholder, k.Help, k.IgnoreCase, k.Multiline, k.ValidatorRegexp, k.Checksum, k.ChoicesCost); err != nil { if res, err := DBExec("INSERT INTO exercice_flags (id_exercice, ordre, label, type, placeholder, help, unit, ignorecase, multiline, validator_regexp, cksum, choices_cost) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", e.Id, k.Order, k.Label, k.Type, k.Placeholder, k.Help, k.Unit, k.IgnoreCase, k.Multiline, k.ValidatorRegexp, k.Checksum, k.ChoicesCost); err != nil {
return k, err return k, err
} else if kid, err := res.LastInsertId(); err != nil { } else if kid, err := res.LastInsertId(); err != nil {
return k, err return k, err
@ -180,7 +182,7 @@ func (k FlagKey) Update() (int64, error) {
} }
} }
if res, err := DBExec("UPDATE exercice_flags SET id_exercice = ?, ordre = ?, label = ?, type = ?, placeholder = ?, help = ?, ignorecase = ?, multiline = ?, validator_regexp = ?, cksum = ?, choices_cost = ? WHERE id_flag = ?", k.IdExercice, k.Order, k.Label, k.Type, k.Placeholder, k.Help, k.IgnoreCase, k.Multiline, k.ValidatorRegexp, k.Checksum, k.ChoicesCost, k.Id); err != nil { if res, err := DBExec("UPDATE exercice_flags SET id_exercice = ?, ordre = ?, label = ?, type = ?, placeholder = ?, help = ?, unit = ?, ignorecase = ?, multiline = ?, validator_regexp = ?, cksum = ?, choices_cost = ? WHERE id_flag = ?", k.IdExercice, k.Order, k.Label, k.Type, k.Placeholder, k.Help, k.Unit, k.IgnoreCase, k.Multiline, k.ValidatorRegexp, k.Checksum, k.ChoicesCost, k.Id); err != nil {
return 0, err return 0, err
} else if nb, err := res.RowsAffected(); err != nil { } else if nb, err := res.RowsAffected(); err != nil {
return 0, err return 0, err

View file

@ -34,6 +34,7 @@ type myTeamFlag struct {
Type string `json:"type,omitempty"` Type string `json:"type,omitempty"`
Placeholder string `json:"placeholder,omitempty"` Placeholder string `json:"placeholder,omitempty"`
Help string `json:"help,omitempty"` Help string `json:"help,omitempty"`
Unit string `json:"unit,omitempty"`
Separator string `json:"separator,omitempty"` Separator string `json:"separator,omitempty"`
NbLines uint64 `json:"nb_lines,omitempty"` NbLines uint64 `json:"nb_lines,omitempty"`
IgnoreOrder bool `json:"ignore_order,omitempty"` IgnoreOrder bool `json:"ignore_order,omitempty"`
@ -205,6 +206,7 @@ func MyJSONTeam(t *Team, started bool) (interface{}, error) {
Type: k.Type, Type: k.Type,
order: k.Order, order: k.Order,
Help: k.Help, Help: k.Help,
Unit: k.Unit,
} }
if strings.HasPrefix(flag.Type, "number") { if strings.HasPrefix(flag.Type, "number") {