// templui component selectbox - version: v0.84.0 installed by templui v0.84.0 package selectbox import ( "context" "fmt" "git.jmbit.de/jmb/scanfile/server/web/templui/components/button" "git.jmbit.de/jmb/scanfile/server/web/templui/components/icon" "git.jmbit.de/jmb/scanfile/server/web/templui/components/input" "git.jmbit.de/jmb/scanfile/server/web/templui/components/popover" "git.jmbit.de/jmb/scanfile/server/web/templui/utils" "strconv" ) type contextKey string var contentIDKey contextKey = "contentID" type Props struct { ID string Class string Attributes templ.Attributes Multiple bool } type TriggerProps struct { ID string Class string Attributes templ.Attributes Name string Required bool Disabled bool HasError bool Multiple bool ShowPills bool SelectedCountText string } type ValueProps struct { ID string Class string Attributes templ.Attributes Placeholder string Multiple bool } type ContentProps struct { ID string Class string Attributes templ.Attributes NoSearch bool SearchPlaceholder string } type GroupProps struct { ID string Class string Attributes templ.Attributes } type LabelProps struct { ID string Class string Attributes templ.Attributes } type ItemProps struct { ID string Class string Attributes templ.Attributes Value string Selected bool Disabled bool } templ SelectBox(props ...Props) { {{ var p Props if len(props) > 0 { p = props[0] } wrapperID := p.ID if wrapperID == "" { wrapperID = utils.RandomID() } contentID := fmt.Sprintf("%s-content", wrapperID) ctx = context.WithValue(ctx, contentIDKey, contentID) }}
{ children... }
} templ Trigger(props ...TriggerProps) { {{ var p TriggerProps if len(props) > 0 { p = props[0] } contentID, ok := ctx.Value(contentIDKey).(string) if !ok { contentID = "fallback-select-content-id" } if p.ShowPills { p.Multiple = true } }} @popover.Trigger(popover.TriggerProps{ For: contentID, TriggerType: popover.TriggerTypeClick, }) { @button.Button(button.Props{ ID: p.ID, Type: "button", Variant: button.VariantOutline, Class: utils.TwMerge( // Required class for JavaScript "select-trigger", // Base styles matching input "w-full h-9 px-3 py-1 text-base md:text-sm", "flex items-center justify-between", "rounded-md border border-input bg-transparent shadow-xs transition-[color,box-shadow] outline-none", // Dark mode background "dark:bg-input/30", // Selection styles "selection:bg-primary selection:text-primary-foreground", // Focus styles "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]", // Error/Invalid styles "aria-invalid:ring-destructive/20 aria-invalid:border-destructive dark:aria-invalid:ring-destructive/40", utils.If(p.HasError, "border-destructive ring-destructive/20 dark:ring-destructive/40"), p.Class, ), Disabled: p.Disabled, Attributes: utils.MergeAttributes( templ.Attributes{ "data-tui-selectbox-content-id": contentID, "data-tui-selectbox-multiple": strconv.FormatBool(p.Multiple), "data-tui-selectbox-show-pills": strconv.FormatBool(p.ShowPills), "data-tui-selectbox-selected-count-text": p.SelectedCountText, "tabindex": "0", "required": strconv.FormatBool(p.Required), "aria-invalid": utils.If(p.HasError, "true"), }, ), }) { { children... } @icon.ChevronDown(icon.Props{ Size: 16, Class: "text-muted-foreground", }) } } } templ Value(props ...ValueProps) { {{ var p ValueProps }} if len(props) > 0 { {{ p = props[0] }} } if p.Placeholder != "" { { p.Placeholder } } { children... } } templ Content(props ...ContentProps) { {{ var p ContentProps if len(props) > 0 { p = props[0] } contentID, ok := ctx.Value(contentIDKey).(string) if !ok { contentID = "fallback-select-content-id" } }} @popover.Content(popover.ContentProps{ ID: contentID, Placement: popover.PlacementBottomStart, Offset: 4, MatchWidth: true, DisableESC: !p.NoSearch, Class: utils.TwMerge( "p-1 select-content z-50 overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md", "min-w-[var(--popover-trigger-width)] w-[var(--popover-trigger-width)]", p.Class, ), Attributes: utils.MergeAttributes( templ.Attributes{ "role": "listbox", "tabindex": "-1", }, p.Attributes, ), }) { if !p.NoSearch {
@icon.Search(icon.Props{Size: 16}) @input.Input(input.Props{ Type: input.TypeSearch, Class: "pl-8", Placeholder: utils.IfElse(p.SearchPlaceholder != "", p.SearchPlaceholder, "Search..."), Attributes: templ.Attributes{ "data-tui-selectbox-search": "", }, })
}
{ children... }
} } templ Group(props ...GroupProps) { {{ var p GroupProps }} if len(props) > 0 { {{ p = props[0] }} }
{ children... }
} templ Label(props ...LabelProps) { {{ var p LabelProps }} if len(props) > 0 { {{ p = props[0] }} } { children... } } templ Item(props ...ItemProps) { {{ var p ItemProps }} if len(props) > 0 { {{ p = props[0] }} }
{ children... } @icon.Check(icon.Props{Size: 16})
} templ Script() { }