aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPřemysl Janouch <p@janouch.name>2019-04-22 12:03:36 +0200
committerPřemysl Janouch <p@janouch.name>2019-04-22 13:55:07 +0200
commit88560a8fbf6d0c8bac45a07c29bd4ab23b50968b (patch)
tree503729d985e62e5e6a2db52775fdd071095fa6a3
parent301d0354255ae1fc8255126ef5c35fd55cf97721 (diff)
downloadsklad-88560a8fbf6d0c8bac45a07c29bd4ab23b50968b.tar.gz
sklad-88560a8fbf6d0c8bac45a07c29bd4ab23b50968b.tar.xz
sklad-88560a8fbf6d0c8bac45a07c29bd4ab23b50968b.zip
sklad: prefill form with last values on error
Since the browser's back button cannot be used because of our fascist caching policy.
-rw-r--r--cmd/sklad/container.tmpl23
-rw-r--r--cmd/sklad/main.go30
2 files changed, 34 insertions, 19 deletions
diff --git a/cmd/sklad/container.tmpl b/cmd/sklad/container.tmpl
index 7fa1654..479174c 100644
--- a/cmd/sklad/container.tmpl
+++ b/cmd/sklad/container.tmpl
@@ -36,18 +36,19 @@
</form>
</header>
<form method=post action="container?id={{ .Container.Id }}">
- <textarea name=description
- rows="{{ max 5 (lines .Container.Description) }}"
+ {{- $description := or .NewDescription .Container.Description }}
+ <textarea name=description rows="{{ max 5 (lines $description) }}"
placeholder="Popis obalu nebo jeho obsahu">
- {{- .Container.Description -}}
+ {{- $description -}}
</textarea>
<footer>
<div>
<label for=series>Řada:</label>
<select name=series id=series>
+ {{- $preselect := or .NewSeries .Container.Series }}
{{- range $prefix, $desc := .AllSeries }}
<option value="{{ $prefix }}"
- {{ if eq $prefix $.Container.Series }}selected{{ end -}}
+ {{ if eq $prefix $preselect }}selected{{ end -}}
>{{ $prefix }} &mdash; {{ $desc }}</option>
{{- end }}
</select>
@@ -55,7 +56,7 @@
<div>
<label for=parent>Nadobal:</label>
<input type=text name=parent id=parent
- value="{{ .Container.Parent }}">
+ value="{{ or .NewParent .Container.Parent }}">
</div>
<input type=submit value="Uložit">
</footer>
@@ -69,21 +70,27 @@
<h2>Nový obal</h2>
</header>
<form method=post action="container">
- <textarea name=description rows=5
- placeholder="Popis obalu nebo jeho obsahu"></textarea>
+ {{- $description := or .NewDescription "" }}
+ <textarea name=description rows="{{ max 5 (lines $description) }}"
+ placeholder="Popis obalu nebo jeho obsahu">
+ {{- $description -}}
+ </textarea>
<footer>
<div>
<label for=series>Řada:</label>
<select name=series id=series>
+ {{- $preselect := or .NewSeries "" }}
{{- range $prefix, $desc := .AllSeries }}
<option value="{{ $prefix }}"
+ {{ if eq $prefix $preselect }}selected{{ end -}}
>{{ $prefix }} &mdash; {{ $desc }}</option>
{{- end }}
</select>
</div>
<div>
<label for=parent>Nadobal:</label>
- <input type=text name=parent id=parent value="">
+ <input type=text name=parent id=parent
+ value="{{ or .NewParent "" }}">
</div>
<input type=submit value="Uložit">
</footer>
diff --git a/cmd/sklad/main.go b/cmd/sklad/main.go
index 52cbee5..4808713 100644
--- a/cmd/sklad/main.go
+++ b/cmd/sklad/main.go
@@ -123,7 +123,6 @@ func handleContainer(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, redirect, http.StatusSeeOther)
return
}
- // TODO: Use the last data as a prefill.
} else if r.Method != http.MethodGet {
w.WriteHeader(http.StatusMethodNotAllowed)
return
@@ -134,14 +133,6 @@ func handleContainer(w http.ResponseWriter, r *http.Request) {
allSeries[s.Prefix] = s.Description
}
- var container *Container
- children := indexChildren[""]
-
- if c, ok := indexContainer[ContainerId(shownId)]; ok {
- children = c.Children()
- container = c
- }
-
params := struct {
Error error
ErrorNoSuchSeries bool
@@ -152,6 +143,9 @@ func handleContainer(w http.ResponseWriter, r *http.Request) {
ErrorWouldContainItself bool
ErrorContainerInUse bool
Container *Container
+ NewDescription *string
+ NewSeries string
+ NewParent *string
Children []*Container
AllSeries map[string]string
}{
@@ -163,10 +157,24 @@ func handleContainer(w http.ResponseWriter, r *http.Request) {
ErrorCannotChangeNumber: err == errCannotChangeNumber,
ErrorWouldContainItself: err == errWouldContainItself,
ErrorContainerInUse: err == errContainerInUse,
- Container: container,
- Children: children,
+ Children: indexChildren[""],
AllSeries: allSeries,
}
+ if c, ok := indexContainer[ContainerId(shownId)]; ok {
+ params.Children = c.Children()
+ params.Container = c
+ }
+ if description, ok := r.Form["description"]; ok {
+ params.NewDescription = &description[0]
+ }
+ if series, ok := r.Form["series"]; ok {
+ // It seems impossible to dereference strings in text/template so that
+ // `eq` can be used, and we don't actually need a null value here.
+ params.NewSeries = series[0]
+ }
+ if parent, ok := r.Form["parent"]; ok {
+ params.NewParent = &parent[0]
+ }
executeTemplate("container.tmpl", w, &params)
}