Potion/internal/app/handlers/state_handler.go
Hayden Hargreaves b17c5774e9 (UI): Implemented much of the frontend recipe creation wizard.
Most everything is implemented, included a state handler and a pretty
simple (but workable) system for managing state in HTML. Nice and simple
for now.

There is still much work to be done, but the rest is simple backend
creation and error handling. And then input validation...a nightmare.
2025-06-29 22:30:20 -07:00

76 lines
1.6 KiB
Go

package handlers
import (
"fmt"
"net/http"
"strings"
"github.com/gin-gonic/gin"
)
const TAG_HTML = `
<li
hx-post="/v1/web/state/tags/delete"
hx-trigger="click"
hx-target="#tag-list"
hx-swap="innerHTML"
hx-include="#tag-list"
hx-vals='{"target": "%s"}'
class="flex text-xs items-center bg-blue-100 w-fit px-2 py-1 rounded-full gap-x-1 select-none cursor-pointer hover:bg-blue-200 duration-300">
&times; %s
</li>
`
const TAG_LIST_HTML = `
<input
hx-swap-oob="outerHTML"
type="hidden"
name="tags"
id="tags"
value="%s"
/>
`
func NewTag(ctx *gin.Context) {
tag := strings.ToLower(ctx.PostForm("tag"))
tags := strings.Split(ctx.PostForm("tags"), ",")
tags = append([]string{tag}, tags...)
var html string
var cleaned_tags []string
for _, tag := range tags {
if tag != "" {
html += fmt.Sprintf(TAG_HTML, tag, tag)
// Ensure that the list provided does not contain blank spaces.
// This is another measure to ensure this state is bulletproof.
cleaned_tags = append(cleaned_tags, tag)
}
}
// Execute OOB swap for the tags
html += fmt.Sprintf(TAG_LIST_HTML, strings.Join(cleaned_tags, ","))
ctx.String(http.StatusOK, html)
}
func DeleteTag(ctx *gin.Context) {
tags := strings.Split(ctx.PostForm("tags"), ",")
target := ctx.PostForm("target")
var html string
var new_tags []string
for _, tag := range tags {
if tag != target && tag != "" {
html += fmt.Sprintf(TAG_HTML, tag, tag)
new_tags = append(new_tags, tag)
}
}
// Execute OOB swap for the tags
html += fmt.Sprintf(TAG_LIST_HTML, strings.Join(new_tags, ","))
ctx.String(http.StatusOK, html)
}