scanfile/server/web/templui/components/progress/progress.templ

126 lines
2.3 KiB
Text

// templui component progress - version: v0.84.0 installed by templui v0.84.0
package progress
import (
"fmt"
"git.jmbit.de/jmb/scanfile/server/web/templui/utils"
)
type Size string
type Variant string
const (
SizeSm Size = "sm"
SizeLg Size = "lg"
)
const (
VariantDefault Variant = "default"
VariantSuccess Variant = "success"
VariantDanger Variant = "danger"
VariantWarning Variant = "warning"
)
type Props struct {
ID string
Class string
Attributes templ.Attributes
Max int
Value int
Label string
ShowValue bool
Size Size
Variant Variant
BarClass string
}
templ Progress(props ...Props) {
{{ var p Props }}
if len(props) > 0 {
{{ p = props[0] }}
}
if p.ID == "" {
{{ p.ID = utils.RandomID() }}
}
<div
id={ p.ID }
class={ utils.TwMerge("w-full", p.Class) }
aria-valuemin="0"
aria-valuemax={ fmt.Sprintf("%d", maxValue(p.Max)) }
aria-valuenow={ fmt.Sprintf("%d", p.Value) }
role="progressbar"
{ p.Attributes... }
>
if p.Label != "" || p.ShowValue {
<div class="flex justify-between items-center mb-1">
if p.Label != "" {
<span class="text-sm font-medium">{ p.Label }</span>
}
if p.ShowValue {
<span class="text-sm font-medium">
{ fmt.Sprintf("%d%%", percentage(p.Value, p)) }
</span>
}
</div>
}
<div class="w-full overflow-hidden rounded-full bg-secondary">
<div
data-progress-indicator
class={
utils.TwMerge(
"h-full rounded-full transition-all",
sizeClasses(p.Size),
variantClasses(p.Variant),
p.BarClass,
),
}
></div>
</div>
</div>
}
func maxValue(max int) int {
if max <= 0 {
return 100
}
return max
}
func percentage(value int, props Props) int {
max := maxValue(props.Max)
if value < 0 {
value = 0
}
if value > max {
value = max
}
return (value * 100) / max
}
func sizeClasses(size Size) string {
switch size {
case SizeSm:
return "h-1"
case SizeLg:
return "h-4"
default:
return "h-2.5"
}
}
func variantClasses(variant Variant) string {
switch variant {
case VariantSuccess:
return "bg-green-500"
case VariantDanger:
return "bg-destructive"
case VariantWarning:
return "bg-yellow-500"
default:
return "bg-primary"
}
}
templ Script() {
<script defer src="/assets/js/progress.min.js"></script>
}