Compare commits

...

3 Commits

7 changed files with 157 additions and 130 deletions

12
LICENSE Normal file
View File

@ -0,0 +1,12 @@
Copyright (c) 2019, Přemysl Janouch <p@janouch.name>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

View File

@ -21,73 +21,73 @@
{{ end }}
{{ if .Container }}
<section>
<header>
<h2>{{ .Container.Id }}
{{ range .Container.Path }}
<small>&laquo; <a href="container?id={{ . }}">{{ . }}</a></small>
{{ end }}
</h2>
<form method=post action="label?id={{ .Container.Id }}" target=_blank>
<input type=submit value="Vytisknout štítek">
<header>
<h2>{{ .Container.Id }}
{{- range .Container.Path }}
<small>&laquo; <a href="container?id={{ . }}">{{ . }}</a></small>
{{- end }}
</h2>
<form method=post action="label?id={{ .Container.Id }}" target=_blank>
<input type=submit value="Vytisknout štítek">
</form>
<form method=post action="container?id={{ .Container.Id }}&amp;remove">
<input type=submit value="Odstranit">
</form>
</header>
<form method=post action="container?id={{ .Container.Id }}">
<textarea name=description
rows="{{ max 5 (lines .Container.Description) }}"
placeholder="Popis obalu nebo jeho obsahu">
{{- .Container.Description -}}
</textarea>
<footer>
<div>
<label for=series>Řada:</label>
<select name=series id=series>
{{- range $prefix, $desc := .AllSeries }}
<option value="{{ $prefix }}"
{{ if eq $prefix $.Container.Series }}selected{{ end -}}
>{{ $prefix }} &mdash; {{ $desc }}</option>
{{- end }}
</select>
</div>
<div>
<label for=parent>Nadobal:</label>
<input type=text name=parent id=parent
value="{{ .Container.Parent }}">
</div>
<input type=submit value="Uložit">
</footer>
</form>
<form method=post action="container?id={{ .Container.Id }}&amp;remove">
<input type=submit value="Odstranit">
</form>
</header>
<form method=post action="container?id={{ .Container.Id }}">
<textarea name=description rows="{{ max 5 (lines .Container.Description) }}"
placeholder="Popis obalu nebo jeho obsahu">
{{ .Container.Description }}</textarea>
<footer>
<div>
<label for=series>Řada:</label>
<select name=series id=series>
{{ range $prefix, $desc := .AllSeries }}
<option value="{{ $prefix }}"
{{ if eq $prefix $.Container.Series }}selected{{ end }}
>{{ $prefix }} &mdash; {{ $desc }}</option>
{{ end }}
</select>
</div>
<div>
<label for=parent>Nadobal:</label>
<input type=text name=parent id=parent value="{{ .Container.Parent }}">
</div>
<input type=submit value="Uložit">
</footer>
</form>
</section>
<h2>Podobaly</h3>
{{ else }}
<section>
<header>
<h2>Nový obal</h2>
</header>
<form method=post action="container">
<textarea name=description rows=5
placeholder="Popis obalu nebo jeho obsahu"></textarea>
<footer>
<div>
<label for=series>Řada:</label>
<select name=series id=series>
{{ range $prefix, $desc := .AllSeries }}
<option value="{{ $prefix }}"
>{{ $prefix }} &mdash; {{ $desc }}</option>
{{ end }}
</select>
</div>
<div>
<label for=parent>Nadobal:</label>
<input type=text name=parent id=parent value="">
</div>
<input type=submit value="Uložit">
</footer>
</form>
<header>
<h2>Nový obal</h2>
</header>
<form method=post action="container">
<textarea name=description rows=5
placeholder="Popis obalu nebo jeho obsahu"></textarea>
<footer>
<div>
<label for=series>Řada:</label>
<select name=series id=series>
{{- range $prefix, $desc := .AllSeries }}
<option value="{{ $prefix }}"
>{{ $prefix }} &mdash; {{ $desc }}</option>
{{- end }}
</select>
</div>
<div>
<label for=parent>Nadobal:</label>
<input type=text name=parent id=parent value="">
</div>
<input type=submit value="Uložit">
</footer>
</form>
</section>
<h2>Obaly nejvyšší úrovně</h2>
@ -95,28 +95,36 @@
{{ range .Children }}
<section>
<header>
<h3><a href="container?id={{ .Id }}">{{ .Id }}</a>
{{ range .Path }}
<small>&laquo; <a href="container?id={{ . }}">{{ . }}</a></small>
{{ end }}
</h3>
<form method=post action="label?id={{ .Id }}" target=_blank>
<input type=submit value="Vytisknout štítek">
</form>
<form method=post action="container?id={{ .Id }}&amp;remove">
<input type=submit value="Odstranit">
</form>
</header>
{{ if .Description }}
<p>{{ .Description }}
{{ end }}
{{ if .Children }}
<p>
{{ range .Children }}
<a href="container?id={{ .Id }}">{{ .Id }}</a>
{{ end }}
{{ end }}
<header>
<h3><a href="container?id={{ .Id }}">{{ .Id }}</a>
{{- range .Path }}
<small>&laquo; <a href="container?id={{ . }}">{{ . }}</a></small>
{{- end }}
</h3>
<form method=post action="label?id={{ .Id }}" target=_blank>
{{- if $.Container }}
<input type=hidden name=context value="{{ $.Container.Id }}">
{{- end }}
<input type=submit value="Vytisknout štítek">
</form>
<form method=post action="container?id={{ .Id }}&amp;remove">
{{- if $.Container }}
<input type=hidden name=context value="{{ $.Container.Id }}">
{{- end }}
<input type=submit value="Odstranit">
</form>
</header>
{{- if .Description }}
<p>{{ .Description }}
{{- end }}
{{- if .Children }}
<p>
{{- range .Children }}
<a href="container?id={{ .Id }}">{{ .Id }}</a>
{{- end }}
{{- end }}
</section>
{{ else }}
<p>Obal je prázdný.

View File

@ -1,5 +1,6 @@
{{ define "Title" }}Tisk štítku{{ end }}
{{ define "Content" }}
<h2>Tisk štítku pro <a href="container?id={{ .Id }}">{{ .Id }}</a></h2>
{{ if .UnknownId }}

View File

@ -5,9 +5,9 @@
<h2>Přihlášení</h2>
<form method=post>
<label for=password>Heslo:</label>
<input type=password name=password id=password autofocus
><input type=submit value="Přihlásit">
<label for=password>Heslo:</label>
<input type=password name=password id=password autofocus
><input type=submit value="Přihlásit">
</form>
{{ if .IncorrectPassword }}

View File

@ -12,6 +12,7 @@ import (
"path"
"path/filepath"
"strings"
"sync"
"time"
"janouch.name/sklad/imgutil"
@ -103,8 +104,11 @@ func handleContainer(w http.ResponseWriter, r *http.Request) {
var err error
if r.Method == http.MethodPost {
err = handleContainerPost(r)
// XXX: This is rather ugly. When removing, we want to keep
// FIXME: This is rather ugly. When removing, we want to keep
// the context id, in addition to the id being changed.
// TODO: If there were no errors, redirect the user to GET,
// which is related to the previous comment.
// TODO: If there were errors, use the last data as a prefill.
} else if r.Method != http.MethodGet {
w.WriteHeader(http.StatusMethodNotAllowed)
return
@ -305,6 +309,8 @@ func handleLabel(w http.ResponseWriter, r *http.Request) {
executeTemplate("label.tmpl", w, &params)
}
var mutex sync.Mutex
func handle(w http.ResponseWriter, r *http.Request) {
if err := r.ParseForm(); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
@ -314,6 +320,9 @@ func handle(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Cache-Control", "no-store")
}
mutex.Lock()
defer mutex.Unlock()
switch _, base := path.Split(r.URL.Path); base {
case "login":
handleLogin(w, r)

View File

@ -1,16 +1,16 @@
{{ define "Title" }}&bdquo;{{ .Query }}&ldquo; &mdash; Vyhledávání{{ end }}
{{ define "Content" }}
<h2>Vyhledávání: &bdquo;{{ .Query }}&ldquo;<h2>
<h2>Vyhledávání: &bdquo;{{ .Query }}&ldquo;</h2>
<h3>Řady</h3>
{{ range .Series }}
<section>
<header>
<h3><a href="series?prefix={{ .Prefix }}">{{ .Prefix }}</a></h3>
<p>{{ .Description }}
</header>
<header>
<h3><a href="series?prefix={{ .Prefix }}">{{ .Prefix }}</a></h3>
<p>{{ .Description }}
</header>
</section>
{{ else }}
<p>Neodpovídají žádné řady.
@ -20,16 +20,16 @@
{{ range .Containers }}
<section>
<header>
<h3><a href="container?id={{ .Id }}">{{ .Id }}</a>
{{ range .Path }}
<small>&laquo; <a href="container?id={{ . }}">{{ . }}</a></small>
{{ end }}
</h3>
</header>
{{ if .Description }}
<p>{{ .Description }}
{{ end }}
<header>
<h3><a href="container?id={{ .Id }}">{{ .Id }}</a>
{{- range .Path }}
<small>&laquo; <a href="container?id={{ . }}">{{ . }}</a></small>
{{- end }}
</h3>
</header>
{{- if .Description }}
<p>{{ .Description }}
{{- end }}
</section>
{{ else }}
<p>Neodpovídají žádné obaly.

View File

@ -22,45 +22,42 @@
<p>{{ .Description }}
{{ end }}
{{ else }}
<section>
<form method=post action="series">
<header>
<h3>Nová řada</h3>
<input type=text name=prefix placeholder="Prefix řady">
<input type=text name=description placeholder="Popis řady"
><input type=submit value="Uložit">
<form method=post action="series">
<header>
<h3>Nová řada</h3>
<input type=text name=prefix placeholder="Prefix řady">
<input type=text name=description placeholder="Popis řady"
><input type=submit value="Uložit">
</header>
</form>
</header>
</form>
</section>
{{ range .AllSeries }}
<section>
<header>
<h3><a href="series?prefix={{ .Prefix }}">{{ .Prefix }}</a></h3>
{{ with $count := len .Containers }}
{{ if eq $count 1 }}
<p>{{ $count }} obal
{{ else if and (ge $count 2) (le $count 4) }}
<p>{{ $count }} obaly
{{ else if gt $count 0 }}
<p>{{ $count }} obalů
{{ end }}
{{ end }}
<form method=post action="series?prefix={{ .Prefix }}">
<input type=text name=description value="{{ .Description }}"
><input type=submit value="Uložit">
</form>
<form method=post action="series?prefix={{ .Prefix }}&amp;remove">
<input type=submit value="Odstranit">
</form>
</header>
<header>
<h3><a href="series?prefix={{ .Prefix }}">{{ .Prefix }}</a></h3>
{{- with $count := len .Containers }}
{{- if eq $count 1 }}
<p>{{ $count }} obal
{{- else if and (ge $count 2) (le $count 4) }}
<p>{{ $count }} obaly
{{- else if gt $count 0 }}
<p>{{ $count }} obalů
{{- end }}
{{- end }}
<form method=post action="series?prefix={{ .Prefix }}">
<input type=text name=description value="{{ .Description }}"
><input type=submit value="Uložit">
</form>
<form method=post action="series?prefix={{ .Prefix }}&amp;remove">
<input type=submit value="Odstranit">
</form>
</header>
</section>
{{ else }}
<p>Nejsou žádné řady.
{{ end }}
{{ end }}
{{ end }}