simple auth example
This commit is contained in:
parent
1d7ac301ab
commit
13f650b28b
5 changed files with 54 additions and 3 deletions
2
framework/assets/dist/htmgo.js
vendored
2
framework/assets/dist/htmgo.js
vendored
File diff suppressed because one or more lines are too long
|
|
@ -81,3 +81,17 @@ function onUrlChange(newUrl: string) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
400s should allow swapping by default, as it's useful to show error messages
|
||||||
|
*/
|
||||||
|
document.addEventListener('htmx:beforeSwap', function(evt) {
|
||||||
|
if(evt instanceof CustomEvent) {
|
||||||
|
// Allow 422 and 400 responses to swap
|
||||||
|
// We treat these as form validation errors
|
||||||
|
if (evt.detail.xhr.status === 422 || evt.detail.xhr.status === 400) {
|
||||||
|
evt.detail.shouldSwap = true;
|
||||||
|
evt.detail.isError = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,10 @@ htmx.defineExtension("mutation-error", {
|
||||||
}
|
}
|
||||||
const status = evt.detail.xhr.status;
|
const status = evt.detail.xhr.status;
|
||||||
if (status >= 400) {
|
if (status >= 400) {
|
||||||
htmx.findAll("[hx-on\\:\\:mutation-error]").forEach((element) => {
|
document.querySelectorAll("*").forEach((element) => {
|
||||||
htmx.trigger(element, "htmx:mutation-error", { status });
|
if (element.hasAttribute("hx-on::on-mutation-error")) {
|
||||||
|
htmx.trigger(element, "htmx:on-mutation-error", { status });
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,22 @@ func GetRequestContext(r *http.Request) *RequestContext {
|
||||||
return r.Context().Value(RequestContextKey).(*RequestContext)
|
return r.Context().Value(RequestContextKey).(*RequestContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *RequestContext) IsHttpPost() bool {
|
||||||
|
return c.Request.Method == http.MethodPost
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *RequestContext) IsHttpGet() bool {
|
||||||
|
return c.Request.Method == http.MethodGet
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *RequestContext) IsHttpPut() bool {
|
||||||
|
return c.Request.Method == http.MethodPut
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *RequestContext) IsHttpDelete() bool {
|
||||||
|
return c.Request.Method == http.MethodDelete
|
||||||
|
}
|
||||||
|
|
||||||
func (c *RequestContext) FormValue(key string) string {
|
func (c *RequestContext) FormValue(key string) string {
|
||||||
return c.Request.FormValue(key)
|
return c.Request.FormValue(key)
|
||||||
}
|
}
|
||||||
|
|
@ -210,16 +226,27 @@ func (app *App) start() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeHtml(w http.ResponseWriter, element Ren) error {
|
func writeHtml(w http.ResponseWriter, element Ren) error {
|
||||||
|
if element == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
w.Header().Set("Content-Type", "text/html")
|
w.Header().Set("Content-Type", "text/html")
|
||||||
_, err := fmt.Fprint(w, Render(element))
|
_, err := fmt.Fprint(w, Render(element))
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func HtmlView(w http.ResponseWriter, page *Page) error {
|
func HtmlView(w http.ResponseWriter, page *Page) error {
|
||||||
|
// if the page is nil, do nothing, this can happen if custom response is written, such as a 302 redirect
|
||||||
|
if page == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
return writeHtml(w, page.Root)
|
return writeHtml(w, page.Root)
|
||||||
}
|
}
|
||||||
|
|
||||||
func PartialViewWithHeaders(w http.ResponseWriter, headers *Headers, partial *Partial) error {
|
func PartialViewWithHeaders(w http.ResponseWriter, headers *Headers, partial *Partial) error {
|
||||||
|
if partial == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
if partial.Headers != nil {
|
if partial.Headers != nil {
|
||||||
for s, a := range *partial.Headers {
|
for s, a := range *partial.Headers {
|
||||||
w.Header().Set(s, a)
|
w.Header().Set(s, a)
|
||||||
|
|
@ -236,6 +263,10 @@ func PartialViewWithHeaders(w http.ResponseWriter, headers *Headers, partial *Pa
|
||||||
}
|
}
|
||||||
|
|
||||||
func PartialView(w http.ResponseWriter, partial *Partial) error {
|
func PartialView(w http.ResponseWriter, partial *Partial) error {
|
||||||
|
if partial == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
if partial.Headers != nil {
|
if partial.Headers != nil {
|
||||||
for s, a := range *partial.Headers {
|
for s, a := range *partial.Headers {
|
||||||
w.Header().Set(s, a)
|
w.Header().Set(s, a)
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,10 @@ func NewPage(root Ren) *Page {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func EmptyPage() *Page {
|
||||||
|
return NewPage(Fragment())
|
||||||
|
}
|
||||||
|
|
||||||
func NewPageWithHttpMethod(httpMethod string, root *Element) *Page {
|
func NewPageWithHttpMethod(httpMethod string, root *Element) *Page {
|
||||||
return &Page{
|
return &Page{
|
||||||
HttpMethod: httpMethod,
|
HttpMethod: httpMethod,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue