lets-go:8.4 form repopulation

This commit is contained in:
tamsin johnson 2024-01-30 15:51:20 -08:00
parent 5316e01cce
commit fd514a4580
3 changed files with 47 additions and 22 deletions

View File

@ -56,9 +56,20 @@ func (app *application) snippetView(w http.ResponseWriter, r *http.Request) {
func (app *application) snippetCreate(w http.ResponseWriter, r *http.Request) { func (app *application) snippetCreate(w http.ResponseWriter, r *http.Request) {
data := app.newTemplateData(r) data := app.newTemplateData(r)
data.Form = snippetCreateForm{
Expires: 365,
}
app.render(w, r, http.StatusOK, "create.tmpl", data) app.render(w, r, http.StatusOK, "create.tmpl", data)
} }
type snippetCreateForm struct {
Title string
Content string
Expires int
FieldErrors map[string]string
}
// snippetCreatePost ... // snippetCreatePost ...
func (app *application) snippetCreatePost(w http.ResponseWriter, r *http.Request) { func (app *application) snippetCreatePost(w http.ResponseWriter, r *http.Request) {
err := r.ParseForm() err := r.ParseForm()
@ -67,37 +78,41 @@ func (app *application) snippetCreatePost(w http.ResponseWriter, r *http.Request
return return
} }
title := r.PostForm.Get("title")
content := r.PostForm.Get("content")
expires, err := strconv.Atoi(r.PostForm.Get("expires")) expires, err := strconv.Atoi(r.PostForm.Get("expires"))
if err != nil { if err != nil {
app.clientError(w, http.StatusBadRequest) app.clientError(w, http.StatusBadRequest)
return return
} }
fieldErrors := make(map[string]string) form := snippetCreateForm{
Title: r.PostForm.Get("title"),
if strings.TrimSpace(title) == "" { Content: r.PostForm.Get("content"),
fieldErrors["title"] = "This field cannot be blank" Expires: expires,
} else if utf8.RuneCountInString(title) > 100 { FieldErrors: map[string]string{},
fieldErrors["title"] = "This field cannot contain more than 100 characters"
} }
if strings.TrimSpace(content) == "" { if strings.TrimSpace(form.Title) == "" {
fieldErrors["content"] = "This field cannot be blank" form.FieldErrors["title"] = "This field cannot be blank"
} else if utf8.RuneCountInString(form.Title) > 100 {
form.FieldErrors["title"] = "This field cannot contain more than 100 characters"
} }
if expires != 1 && expires != 7 && expires != 365 { if strings.TrimSpace(form.Content) == "" {
fieldErrors["expires"] = "This field must equal 1, 7 or 365" form.FieldErrors["content"] = "This field cannot be blank"
} }
if len(fieldErrors) > 0 { if form.Expires != 1 && form.Expires != 7 && form.Expires != 365 {
fmt.Fprint(w, fieldErrors) form.FieldErrors["expires"] = "This field must equal 1, 7 or 365"
}
if len(form.FieldErrors) > 0 {
data := app.newTemplateData(r)
data.Form = form
app.render(w, r, http.StatusUnprocessableEntity, "create.tmpl", data)
return return
} }
id, err := app.snippets.Insert(title, content, expires) id, err := app.snippets.Insert(form.Title, form.Content, form.Expires)
if err != nil { if err != nil {
app.serverError(w, r, err) app.serverError(w, r, err)
return return

View File

@ -10,8 +10,9 @@ import (
type templateData struct { type templateData struct {
CurrentYear int CurrentYear int
Snippet models.Snippet Snippet models.Snippet
Snippets []models.Snippet Snippets []models.Snippet
Form any
} }
// humanDate ... // humanDate ...

View File

@ -4,17 +4,26 @@
<form action='/snippet/create' method='POST'> <form action='/snippet/create' method='POST'>
<div> <div>
<label>Title:</label> <label>Title:</label>
<input type='text' name='title'> {{with .Form.FieldErrors.title}}
<label class='error'>{{.}}</label>
{{end}}
<input type='text' name='title' value='{{.Form.Title}}'>
</div> </div>
<div> <div>
<label>Content:</label> <label>Content:</label>
{{with .Form.FieldErrors.content}}
<label class='error'>{{.}}</label>
{{end}}
<textarea name='content'></textarea> <textarea name='content'></textarea>
</div> </div>
<div> <div>
<label>Delete in:</label> <label>Delete in:</label>
<input type='radio' name='expires' value='365' checked> One Year {{with .Form.FieldErrors.expires}}
<input type='radio' name='expires' value='7'> One Week <label class='error'>{{.}}</label>
<input type='radio' name='expires' value='1'> One Day {{end}}
<input type='radio' name='expires' value='365' {{if (eq .Form.Expires 365) }}checked{{end}}> One Year
<input type='radio' name='expires' value='7' {{if (eq .Form.Expires 7) }}checked{{end}}> One Week
<input type='radio' name='expires' value='1' {{if (eq .Form.Expires 1) }}checked{{end}}> One Day
</div> </div>
<div> <div>
<input type='submit' value='Publish Snippet'> <input type='submit' value='Publish Snippet'>