Compare commits
3 Commits
885d161cf5
...
0936963aaf
Author | SHA1 | Date | |
---|---|---|---|
0936963aaf | |||
e4ae5d0001 | |||
21d01f4c4b |
12
LICENSE
Normal file
12
LICENSE
Normal 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.
|
@ -21,73 +21,73 @@
|
|||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
{{ if .Container }}
|
{{ if .Container }}
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<header>
|
<header>
|
||||||
<h2>{{ .Container.Id }}
|
<h2>{{ .Container.Id }}
|
||||||
{{ range .Container.Path }}
|
{{- range .Container.Path }}
|
||||||
<small>« <a href="container?id={{ . }}">{{ . }}</a></small>
|
<small>« <a href="container?id={{ . }}">{{ . }}</a></small>
|
||||||
{{ end }}
|
{{- end }}
|
||||||
</h2>
|
</h2>
|
||||||
<form method=post action="label?id={{ .Container.Id }}" target=_blank>
|
<form method=post action="label?id={{ .Container.Id }}" target=_blank>
|
||||||
<input type=submit value="Vytisknout štítek">
|
<input type=submit value="Vytisknout štítek">
|
||||||
|
</form>
|
||||||
|
<form method=post action="container?id={{ .Container.Id }}&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 }} — {{ $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>
|
||||||
<form method=post action="container?id={{ .Container.Id }}&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 }} — {{ $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>
|
</section>
|
||||||
|
|
||||||
<h2>Podobaly</h3>
|
<h2>Podobaly</h3>
|
||||||
|
|
||||||
{{ else }}
|
{{ else }}
|
||||||
<section>
|
<section>
|
||||||
<header>
|
<header>
|
||||||
<h2>Nový obal</h2>
|
<h2>Nový obal</h2>
|
||||||
</header>
|
</header>
|
||||||
<form method=post action="container">
|
<form method=post action="container">
|
||||||
<textarea name=description rows=5
|
<textarea name=description rows=5
|
||||||
placeholder="Popis obalu nebo jeho obsahu"></textarea>
|
placeholder="Popis obalu nebo jeho obsahu"></textarea>
|
||||||
<footer>
|
<footer>
|
||||||
<div>
|
<div>
|
||||||
<label for=series>Řada:</label>
|
<label for=series>Řada:</label>
|
||||||
<select name=series id=series>
|
<select name=series id=series>
|
||||||
{{ range $prefix, $desc := .AllSeries }}
|
{{- range $prefix, $desc := .AllSeries }}
|
||||||
<option value="{{ $prefix }}"
|
<option value="{{ $prefix }}"
|
||||||
>{{ $prefix }} — {{ $desc }}</option>
|
>{{ $prefix }} — {{ $desc }}</option>
|
||||||
{{ end }}
|
{{- end }}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label for=parent>Nadobal:</label>
|
<label for=parent>Nadobal:</label>
|
||||||
<input type=text name=parent id=parent value="">
|
<input type=text name=parent id=parent value="">
|
||||||
</div>
|
</div>
|
||||||
<input type=submit value="Uložit">
|
<input type=submit value="Uložit">
|
||||||
</footer>
|
</footer>
|
||||||
</form>
|
</form>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<h2>Obaly nejvyšší úrovně</h2>
|
<h2>Obaly nejvyšší úrovně</h2>
|
||||||
@ -95,28 +95,36 @@
|
|||||||
|
|
||||||
{{ range .Children }}
|
{{ range .Children }}
|
||||||
<section>
|
<section>
|
||||||
<header>
|
<header>
|
||||||
<h3><a href="container?id={{ .Id }}">{{ .Id }}</a>
|
<h3><a href="container?id={{ .Id }}">{{ .Id }}</a>
|
||||||
{{ range .Path }}
|
{{- range .Path }}
|
||||||
<small>« <a href="container?id={{ . }}">{{ . }}</a></small>
|
<small>« <a href="container?id={{ . }}">{{ . }}</a></small>
|
||||||
{{ end }}
|
{{- end }}
|
||||||
</h3>
|
</h3>
|
||||||
<form method=post action="label?id={{ .Id }}" target=_blank>
|
<form method=post action="label?id={{ .Id }}" target=_blank>
|
||||||
<input type=submit value="Vytisknout štítek">
|
{{- if $.Container }}
|
||||||
</form>
|
<input type=hidden name=context value="{{ $.Container.Id }}">
|
||||||
<form method=post action="container?id={{ .Id }}&remove">
|
{{- end }}
|
||||||
<input type=submit value="Odstranit">
|
<input type=submit value="Vytisknout štítek">
|
||||||
</form>
|
</form>
|
||||||
</header>
|
<form method=post action="container?id={{ .Id }}&remove">
|
||||||
{{ if .Description }}
|
{{- if $.Container }}
|
||||||
<p>{{ .Description }}
|
<input type=hidden name=context value="{{ $.Container.Id }}">
|
||||||
{{ end }}
|
{{- end }}
|
||||||
{{ if .Children }}
|
<input type=submit value="Odstranit">
|
||||||
<p>
|
</form>
|
||||||
{{ range .Children }}
|
</header>
|
||||||
<a href="container?id={{ .Id }}">{{ .Id }}</a>
|
|
||||||
{{ end }}
|
{{- if .Description }}
|
||||||
{{ end }}
|
<p>{{ .Description }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if .Children }}
|
||||||
|
<p>
|
||||||
|
{{- range .Children }}
|
||||||
|
<a href="container?id={{ .Id }}">{{ .Id }}</a>
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
</section>
|
</section>
|
||||||
{{ else }}
|
{{ else }}
|
||||||
<p>Obal je prázdný.
|
<p>Obal je prázdný.
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
{{ define "Title" }}Tisk štítku{{ end }}
|
{{ define "Title" }}Tisk štítku{{ end }}
|
||||||
{{ define "Content" }}
|
{{ define "Content" }}
|
||||||
|
|
||||||
<h2>Tisk štítku pro <a href="container?id={{ .Id }}">{{ .Id }}</a></h2>
|
<h2>Tisk štítku pro <a href="container?id={{ .Id }}">{{ .Id }}</a></h2>
|
||||||
|
|
||||||
{{ if .UnknownId }}
|
{{ if .UnknownId }}
|
||||||
|
@ -5,9 +5,9 @@
|
|||||||
<h2>Přihlášení</h2>
|
<h2>Přihlášení</h2>
|
||||||
|
|
||||||
<form method=post>
|
<form method=post>
|
||||||
<label for=password>Heslo:</label>
|
<label for=password>Heslo:</label>
|
||||||
<input type=password name=password id=password autofocus
|
<input type=password name=password id=password autofocus
|
||||||
><input type=submit value="Přihlásit">
|
><input type=submit value="Přihlásit">
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
{{ if .IncorrectPassword }}
|
{{ if .IncorrectPassword }}
|
||||||
|
@ -12,6 +12,7 @@ import (
|
|||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"janouch.name/sklad/imgutil"
|
"janouch.name/sklad/imgutil"
|
||||||
@ -103,8 +104,11 @@ func handleContainer(w http.ResponseWriter, r *http.Request) {
|
|||||||
var err error
|
var err error
|
||||||
if r.Method == http.MethodPost {
|
if r.Method == http.MethodPost {
|
||||||
err = handleContainerPost(r)
|
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.
|
// 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 {
|
} else if r.Method != http.MethodGet {
|
||||||
w.WriteHeader(http.StatusMethodNotAllowed)
|
w.WriteHeader(http.StatusMethodNotAllowed)
|
||||||
return
|
return
|
||||||
@ -305,6 +309,8 @@ func handleLabel(w http.ResponseWriter, r *http.Request) {
|
|||||||
executeTemplate("label.tmpl", w, ¶ms)
|
executeTemplate("label.tmpl", w, ¶ms)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var mutex sync.Mutex
|
||||||
|
|
||||||
func handle(w http.ResponseWriter, r *http.Request) {
|
func handle(w http.ResponseWriter, r *http.Request) {
|
||||||
if err := r.ParseForm(); err != nil {
|
if err := r.ParseForm(); err != nil {
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
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")
|
w.Header().Set("Cache-Control", "no-store")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mutex.Lock()
|
||||||
|
defer mutex.Unlock()
|
||||||
|
|
||||||
switch _, base := path.Split(r.URL.Path); base {
|
switch _, base := path.Split(r.URL.Path); base {
|
||||||
case "login":
|
case "login":
|
||||||
handleLogin(w, r)
|
handleLogin(w, r)
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
{{ define "Title" }}„{{ .Query }}“ — Vyhledávání{{ end }}
|
{{ define "Title" }}„{{ .Query }}“ — Vyhledávání{{ end }}
|
||||||
{{ define "Content" }}
|
{{ define "Content" }}
|
||||||
|
|
||||||
<h2>Vyhledávání: „{{ .Query }}“<h2>
|
<h2>Vyhledávání: „{{ .Query }}“</h2>
|
||||||
|
|
||||||
<h3>Řady</h3>
|
<h3>Řady</h3>
|
||||||
|
|
||||||
{{ range .Series }}
|
{{ range .Series }}
|
||||||
<section>
|
<section>
|
||||||
<header>
|
<header>
|
||||||
<h3><a href="series?prefix={{ .Prefix }}">{{ .Prefix }}</a></h3>
|
<h3><a href="series?prefix={{ .Prefix }}">{{ .Prefix }}</a></h3>
|
||||||
<p>{{ .Description }}
|
<p>{{ .Description }}
|
||||||
</header>
|
</header>
|
||||||
</section>
|
</section>
|
||||||
{{ else }}
|
{{ else }}
|
||||||
<p>Neodpovídají žádné řady.
|
<p>Neodpovídají žádné řady.
|
||||||
@ -20,16 +20,16 @@
|
|||||||
|
|
||||||
{{ range .Containers }}
|
{{ range .Containers }}
|
||||||
<section>
|
<section>
|
||||||
<header>
|
<header>
|
||||||
<h3><a href="container?id={{ .Id }}">{{ .Id }}</a>
|
<h3><a href="container?id={{ .Id }}">{{ .Id }}</a>
|
||||||
{{ range .Path }}
|
{{- range .Path }}
|
||||||
<small>« <a href="container?id={{ . }}">{{ . }}</a></small>
|
<small>« <a href="container?id={{ . }}">{{ . }}</a></small>
|
||||||
{{ end }}
|
{{- end }}
|
||||||
</h3>
|
</h3>
|
||||||
</header>
|
</header>
|
||||||
{{ if .Description }}
|
{{- if .Description }}
|
||||||
<p>{{ .Description }}
|
<p>{{ .Description }}
|
||||||
{{ end }}
|
{{- end }}
|
||||||
</section>
|
</section>
|
||||||
{{ else }}
|
{{ else }}
|
||||||
<p>Neodpovídají žádné obaly.
|
<p>Neodpovídají žádné obaly.
|
||||||
|
@ -22,45 +22,42 @@
|
|||||||
<p>{{ .Description }}
|
<p>{{ .Description }}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ else }}
|
{{ else }}
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<form method=post action="series">
|
<form method=post action="series">
|
||||||
<header>
|
<header>
|
||||||
<h3>Nová řada</h3>
|
<h3>Nová řada</h3>
|
||||||
<input type=text name=prefix placeholder="Prefix řady">
|
<input type=text name=prefix placeholder="Prefix řady">
|
||||||
<input type=text name=description placeholder="Popis řady"
|
<input type=text name=description placeholder="Popis řady"
|
||||||
><input type=submit value="Uložit">
|
><input type=submit value="Uložit">
|
||||||
|
</header>
|
||||||
</form>
|
</form>
|
||||||
</header>
|
|
||||||
</form>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{{ range .AllSeries }}
|
{{ range .AllSeries }}
|
||||||
<section>
|
<section>
|
||||||
<header>
|
<header>
|
||||||
<h3><a href="series?prefix={{ .Prefix }}">{{ .Prefix }}</a></h3>
|
<h3><a href="series?prefix={{ .Prefix }}">{{ .Prefix }}</a></h3>
|
||||||
{{ with $count := len .Containers }}
|
{{- with $count := len .Containers }}
|
||||||
{{ if eq $count 1 }}
|
{{- if eq $count 1 }}
|
||||||
<p>{{ $count }} obal
|
<p>{{ $count }} obal
|
||||||
{{ else if and (ge $count 2) (le $count 4) }}
|
{{- else if and (ge $count 2) (le $count 4) }}
|
||||||
<p>{{ $count }} obaly
|
<p>{{ $count }} obaly
|
||||||
{{ else if gt $count 0 }}
|
{{- else if gt $count 0 }}
|
||||||
<p>{{ $count }} obalů
|
<p>{{ $count }} obalů
|
||||||
{{ end }}
|
{{- end }}
|
||||||
{{ end }}
|
{{- end }}
|
||||||
<form method=post action="series?prefix={{ .Prefix }}">
|
<form method=post action="series?prefix={{ .Prefix }}">
|
||||||
<input type=text name=description value="{{ .Description }}"
|
<input type=text name=description value="{{ .Description }}"
|
||||||
><input type=submit value="Uložit">
|
><input type=submit value="Uložit">
|
||||||
</form>
|
</form>
|
||||||
<form method=post action="series?prefix={{ .Prefix }}&remove">
|
<form method=post action="series?prefix={{ .Prefix }}&remove">
|
||||||
<input type=submit value="Odstranit">
|
<input type=submit value="Odstranit">
|
||||||
</form>
|
</form>
|
||||||
</header>
|
</header>
|
||||||
</section>
|
</section>
|
||||||
{{ else }}
|
{{ else }}
|
||||||
<p>Nejsou žádné řady.
|
<p>Nejsou žádné řady.
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user