diff --git a/pkg/company.go b/pkg/company.go index bfe8a50..146c8ac 100644 --- a/pkg/company.go +++ b/pkg/company.go @@ -88,6 +88,7 @@ func newTaxDetailsForm(ctx context.Context, conn *Conn, locale *Locale) *taxDeta Name: "currency", Label: pgettext("input", "Currency", locale), Options: MustGetOptions(ctx, conn, "select currency_code, currency_symbol from currency order by currency_code"), + Required: true, Selected: "EUR", }, } diff --git a/pkg/contacts.go b/pkg/contacts.go index b708ec9..ed44982 100644 --- a/pkg/contacts.go +++ b/pkg/contacts.go @@ -224,6 +224,7 @@ func newContactForm(ctx context.Context, conn *Conn, locale *Locale) *contactFor Name: "country", Label: pgettext("input", "Tax", locale), Options: mustGetCountryOptions(ctx, conn, locale), + Required: true, Selected: "ES", Attributes: []template.HTMLAttr{ `autocomplete="country"`, diff --git a/pkg/form.go b/pkg/form.go index dee8a98..ca0dfbc 100644 --- a/pkg/form.go +++ b/pkg/form.go @@ -61,6 +61,8 @@ type SelectField struct { Selected string Options []*SelectOption Attributes []template.HTMLAttr + Required bool + EmptyLabel string Errors []error } diff --git a/pkg/products.go b/pkg/products.go index 5c97089..3c50c70 100644 --- a/pkg/products.go +++ b/pkg/products.go @@ -36,6 +36,7 @@ func GetProductForm(w http.ResponseWriter, r *http.Request, params httprouter.Pa form := newProductForm(r.Context(), conn, locale, company) slug := params[0].Value if slug == "new" { + form.Tax.EmptyLabel = gettext("Select a tax for this product.", locale) w.WriteHeader(http.StatusOK) mustRenderNewProductForm(w, r, form) return @@ -164,9 +165,10 @@ func newProductForm(ctx context.Context, conn *Conn, locale *Locale, company *Co }, }, Tax: &SelectField{ - Name: "tax", - Label: pgettext("input", "Tax", locale), - Options: MustGetOptions(ctx, conn, "select tax_id::text, name from tax where company_id = $1 order by name", company.Id), + Name: "tax", + Label: pgettext("input", "Tax", locale), + Required: true, + Options: MustGetOptions(ctx, conn, "select tax_id::text, name from tax where company_id = $1 order by name", company.Id), }, } } diff --git a/pkg/profile.go b/pkg/profile.go index 4cb8ed1..f91e2b1 100644 --- a/pkg/profile.go +++ b/pkg/profile.go @@ -61,9 +61,10 @@ func newProfileForm(ctx context.Context, conn *Conn, locale *Locale) *profileFor }, }, Language: &SelectField{ - Name: "language", - Label: pgettext("input", "Language", locale), - Options: languages, + Name: "language", + Label: pgettext("input", "Language", locale), + Options: languages, + Required: true, Attributes: []template.HTMLAttr{ `autocomplete="language"`, }, diff --git a/po/ca.po b/po/ca.po index b8f2382..d5b4aca 100644 --- a/po/ca.po +++ b/po/ca.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: numerus\n" "Report-Msgid-Bugs-To: jordi@tandem.blog\n" -"POT-Creation-Date: 2023-02-04 11:24+0100\n" +"POT-Creation-Date: 2023-02-05 14:04+0100\n" "PO-Revision-Date: 2023-01-18 17:08+0100\n" "Last-Translator: jordi fita mas \n" "Language-Team: Catalan \n" @@ -238,11 +238,11 @@ msgctxt "input" msgid "Password" msgstr "Contrasenya" -#: pkg/login.go:69 pkg/profile.go:88 pkg/contacts.go:262 +#: pkg/login.go:69 pkg/profile.go:89 pkg/contacts.go:263 msgid "Email can not be empty." msgstr "No podeu deixar el correu-e en blanc." -#: pkg/login.go:70 pkg/profile.go:89 pkg/contacts.go:263 +#: pkg/login.go:70 pkg/profile.go:90 pkg/contacts.go:264 msgid "This value is not a valid email. It should be like name@domain.com." msgstr "Aquest valor no és un correu-e vàlid. Hauria de ser similar a nom@domini.cat." @@ -254,70 +254,74 @@ msgstr "No podeu deixar la contrasenya en blanc." msgid "Invalid user or password." msgstr "Nom d’usuari o contrasenya incorrectes." -#: pkg/products.go:144 +#: pkg/products.go:39 +msgid "Select a tax for this product." +msgstr "Escolliu un impost per aquest producte." + +#: pkg/products.go:148 msgctxt "input" msgid "Name" msgstr "Nom" -#: pkg/products.go:150 +#: pkg/products.go:154 msgctxt "input" msgid "Description" msgstr "Descripció" -#: pkg/products.go:155 +#: pkg/products.go:159 msgctxt "input" msgid "Price" msgstr "Preu" -#: pkg/products.go:164 pkg/contacts.go:225 +#: pkg/products.go:169 pkg/contacts.go:225 msgctxt "input" msgid "Tax" msgstr "Impost" -#: pkg/products.go:183 pkg/profile.go:91 +#: pkg/products.go:189 pkg/profile.go:92 msgid "Name can not be empty." msgstr "No podeu deixar el nom en blanc." -#: pkg/products.go:184 +#: pkg/products.go:190 msgid "Price can not be empty." msgstr "No podeu deixar el preu en blanc." -#: pkg/products.go:185 +#: pkg/products.go:191 msgid "Price must be a number greater than zero." msgstr "El preu ha de ser un número major a zero." -#: pkg/products.go:187 +#: pkg/products.go:193 msgid "Selected tax is not valid." msgstr "Heu seleccionat un impost que no és vàlid." -#: pkg/company.go:78 +#: pkg/company.go:89 msgctxt "input" msgid "Currency" msgstr "Moneda" -#: pkg/company.go:95 +#: pkg/company.go:107 msgid "Selected currency is not valid." msgstr "Heu seleccionat una moneda que no és vàlida." -#: pkg/company.go:217 +#: pkg/company.go:229 msgctxt "input" msgid "Tax name" msgstr "Nom impost" -#: pkg/company.go:223 +#: pkg/company.go:235 msgctxt "input" msgid "Rate (%)" msgstr "Percentatge" -#: pkg/company.go:245 +#: pkg/company.go:257 msgid "Tax name can not be empty." msgstr "No podeu deixar el nom de l’impost en blanc." -#: pkg/company.go:246 +#: pkg/company.go:258 msgid "Tax rate can not be empty." msgstr "No podeu deixar percentatge en blanc." -#: pkg/company.go:247 +#: pkg/company.go:259 msgid "Tax rate must be an integer between -99 and 99." msgstr "El percentatge ha de ser entre -99 i 99." @@ -341,11 +345,11 @@ msgctxt "input" msgid "Language" msgstr "Idioma" -#: pkg/profile.go:92 +#: pkg/profile.go:93 msgid "Confirmation does not match password." msgstr "La confirmació no és igual a la contrasenya." -#: pkg/profile.go:93 +#: pkg/profile.go:94 msgid "Selected language is not valid." msgstr "Heu seleccionat un idioma que no és vàlid." @@ -394,51 +398,51 @@ msgctxt "input" msgid "Postal code" msgstr "Codi postal" -#: pkg/contacts.go:255 +#: pkg/contacts.go:256 msgid "Business name can not be empty." msgstr "No podeu deixar el nom i els cognoms en blanc." -#: pkg/contacts.go:256 +#: pkg/contacts.go:257 msgid "VAT number can not be empty." msgstr "No podeu deixar el DNI o NIF en blanc." -#: pkg/contacts.go:257 +#: pkg/contacts.go:258 msgid "This value is not a valid VAT number." msgstr "Aquest valor no és un DNI o NIF vàlid." -#: pkg/contacts.go:259 +#: pkg/contacts.go:260 msgid "Phone can not be empty." msgstr "No podeu deixar el telèfon en blanc." -#: pkg/contacts.go:260 +#: pkg/contacts.go:261 msgid "This value is not a valid phone number." msgstr "Aquest valor no és un telèfon vàlid." -#: pkg/contacts.go:266 +#: pkg/contacts.go:267 msgid "This value is not a valid web address. It should be like https://domain.com/." msgstr "Aquest valor no és una adreça web vàlida. Hauria de ser similar a https://domini.cat/." -#: pkg/contacts.go:268 +#: pkg/contacts.go:269 msgid "Address can not be empty." msgstr "No podeu deixar l’adreça en blanc." -#: pkg/contacts.go:269 +#: pkg/contacts.go:270 msgid "City can not be empty." msgstr "No podeu deixar la població en blanc." -#: pkg/contacts.go:270 +#: pkg/contacts.go:271 msgid "Province can not be empty." msgstr "No podeu deixar la província en blanc." -#: pkg/contacts.go:271 +#: pkg/contacts.go:272 msgid "Postal code can not be empty." msgstr "No podeu deixar el codi postal en blanc." -#: pkg/contacts.go:272 +#: pkg/contacts.go:273 msgid "This value is not a valid postal code." msgstr "Aquest valor no és un codi postal vàlid." -#: pkg/contacts.go:274 +#: pkg/contacts.go:275 msgid "Selected country is not valid." msgstr "Heu seleccionat un país que no és vàlid." diff --git a/po/es.po b/po/es.po index ce70e32..01e5c9e 100644 --- a/po/es.po +++ b/po/es.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: numerus\n" "Report-Msgid-Bugs-To: jordi@tandem.blog\n" -"POT-Creation-Date: 2023-02-04 11:24+0100\n" +"POT-Creation-Date: 2023-02-05 14:04+0100\n" "PO-Revision-Date: 2023-01-18 17:45+0100\n" "Last-Translator: jordi fita mas \n" "Language-Team: Spanish \n" @@ -238,11 +238,11 @@ msgctxt "input" msgid "Password" msgstr "Contraseña" -#: pkg/login.go:69 pkg/profile.go:88 pkg/contacts.go:262 +#: pkg/login.go:69 pkg/profile.go:89 pkg/contacts.go:263 msgid "Email can not be empty." msgstr "No podéis dejar el correo-e en blanco." -#: pkg/login.go:70 pkg/profile.go:89 pkg/contacts.go:263 +#: pkg/login.go:70 pkg/profile.go:90 pkg/contacts.go:264 msgid "This value is not a valid email. It should be like name@domain.com." msgstr "Este valor no es un correo-e válido. Tiene que ser parecido a nombre@dominio.es." @@ -254,70 +254,74 @@ msgstr "No podéis dejar la contraseña en blanco." msgid "Invalid user or password." msgstr "Nombre de usuario o contraseña inválido." -#: pkg/products.go:144 +#: pkg/products.go:39 +msgid "Select a tax for this product." +msgstr "Escoged un impuesto para este producto." + +#: pkg/products.go:148 msgctxt "input" msgid "Name" msgstr "Nombre" -#: pkg/products.go:150 +#: pkg/products.go:154 msgctxt "input" msgid "Description" msgstr "Descripción" -#: pkg/products.go:155 +#: pkg/products.go:159 msgctxt "input" msgid "Price" msgstr "Precio" -#: pkg/products.go:164 pkg/contacts.go:225 +#: pkg/products.go:169 pkg/contacts.go:225 msgctxt "input" msgid "Tax" msgstr "Impuesto" -#: pkg/products.go:183 pkg/profile.go:91 +#: pkg/products.go:189 pkg/profile.go:92 msgid "Name can not be empty." msgstr "No podéis dejar el nombre en blanco." -#: pkg/products.go:184 +#: pkg/products.go:190 msgid "Price can not be empty." msgstr "No podéis dejar el precio en blanco." -#: pkg/products.go:185 +#: pkg/products.go:191 msgid "Price must be a number greater than zero." msgstr "El precio tiene que ser un número mayor a cero." -#: pkg/products.go:187 +#: pkg/products.go:193 msgid "Selected tax is not valid." msgstr "Habéis escogido un impuesto que no es válido." -#: pkg/company.go:78 +#: pkg/company.go:89 msgctxt "input" msgid "Currency" msgstr "Moneda" -#: pkg/company.go:95 +#: pkg/company.go:107 msgid "Selected currency is not valid." msgstr "Habéis escogido una moneda que no es válida." -#: pkg/company.go:217 +#: pkg/company.go:229 msgctxt "input" msgid "Tax name" msgstr "Nombre impuesto" -#: pkg/company.go:223 +#: pkg/company.go:235 msgctxt "input" msgid "Rate (%)" msgstr "Porcentaje" -#: pkg/company.go:245 +#: pkg/company.go:257 msgid "Tax name can not be empty." msgstr "No podéis dejar el nombre del impuesto en blanco." -#: pkg/company.go:246 +#: pkg/company.go:258 msgid "Tax rate can not be empty." msgstr "No podéis dejar el porcentaje en blanco." -#: pkg/company.go:247 +#: pkg/company.go:259 msgid "Tax rate must be an integer between -99 and 99." msgstr "El porcentaje tiene que estar entre -99 y 99." @@ -341,11 +345,11 @@ msgctxt "input" msgid "Language" msgstr "Idioma" -#: pkg/profile.go:92 +#: pkg/profile.go:93 msgid "Confirmation does not match password." msgstr "La confirmación no corresponde con la contraseña." -#: pkg/profile.go:93 +#: pkg/profile.go:94 msgid "Selected language is not valid." msgstr "Habéis escogido un idioma que no es válido." @@ -394,51 +398,51 @@ msgctxt "input" msgid "Postal code" msgstr "Código postal" -#: pkg/contacts.go:255 +#: pkg/contacts.go:256 msgid "Business name can not be empty." msgstr "No podéis dejar el nombre y los apellidos en blanco." -#: pkg/contacts.go:256 +#: pkg/contacts.go:257 msgid "VAT number can not be empty." msgstr "No podéis dejar el DNI o NIF en blanco." -#: pkg/contacts.go:257 +#: pkg/contacts.go:258 msgid "This value is not a valid VAT number." msgstr "Este valor no es un DNI o NIF válido." -#: pkg/contacts.go:259 +#: pkg/contacts.go:260 msgid "Phone can not be empty." msgstr "No podéis dejar el teléfono en blanco." -#: pkg/contacts.go:260 +#: pkg/contacts.go:261 msgid "This value is not a valid phone number." msgstr "Este valor no es un teléfono válido." -#: pkg/contacts.go:266 +#: pkg/contacts.go:267 msgid "This value is not a valid web address. It should be like https://domain.com/." msgstr "Este valor no es una dirección web válida. Tiene que ser parecida a https://dominio.es/." -#: pkg/contacts.go:268 +#: pkg/contacts.go:269 msgid "Address can not be empty." msgstr "No podéis dejar la dirección en blanco." -#: pkg/contacts.go:269 +#: pkg/contacts.go:270 msgid "City can not be empty." msgstr "No podéis dejar la población en blanco." -#: pkg/contacts.go:270 +#: pkg/contacts.go:271 msgid "Province can not be empty." msgstr "No podéis dejar la provincia en blanco." -#: pkg/contacts.go:271 +#: pkg/contacts.go:272 msgid "Postal code can not be empty." msgstr "No podéis dejar el código postal en blanco." -#: pkg/contacts.go:272 +#: pkg/contacts.go:273 msgid "This value is not a valid postal code." msgstr "Este valor no es un código postal válido válido." -#: pkg/contacts.go:274 +#: pkg/contacts.go:275 msgid "Selected country is not valid." msgstr "Habéis escogido un país que no es válido." diff --git a/web/static/numerus.css b/web/static/numerus.css index 9c4bb33..0240b1e 100644 --- a/web/static/numerus.css +++ b/web/static/numerus.css @@ -342,11 +342,13 @@ input.width-2x { color: var(--numerus--color--red); } -[lang="en"] input:not([required]) + label::after { +[lang="en"] input:not([required]) + label::after, +[lang="en"] select:not([required]) + label::after { content: " (optional)" } -[lang="ca"] input:not([required]) + label::after, [lang="es"] input:not([required]) + label::after { +[lang="ca"] input:not([required]) + label::after, [lang="es"] input:not([required]) + label::after, +[lang="ca"] select:not([required]) + label::after, [lang="es"] select:not([required]) + label::after { content: " (opcional)" } diff --git a/web/template/form.gohtml b/web/template/form.gohtml index c4f2425..88c8671 100644 --- a/web/template/form.gohtml +++ b/web/template/form.gohtml @@ -1,8 +1,8 @@ {{ define "input-field" -}}
+ {{- range $attribute := .Attributes }} {{$attribute}} {{ end }} + {{ if .Required }}required="required"{{ end }} value="{{ .Val }}" placeholder="{{ .Label }}"> {{- if .Errors }}
    @@ -17,12 +17,16 @@ {{ define "select-field" -}}
    {{- if .Errors }}