// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Commercial // SPDX-FileCopyrightText: 2025-2026 Christian Galo package server import "net/http" // redirectToRecord answers a mutation that navigates (design D9 "Outcome // contract", spec form-library): a create form lands on the record it just // made, a Settings save returns to its page. An htmx submit gets // HX-Redirect to path and a 200 with an empty body, so htmx performs a full // browser navigation instead of following the response itself; a native // (non-htmx) submit gets a 303 to the same path directly, since redirecting // only an XHR response body would never move the address bar. A bare 303 is // never the answer to an htmx submit: htmx follows it and swaps the full // destination page into the form's own target, nesting the operator shell // inside itself (the panel-inside-panel defect design D9 records). Every // caller that answers a navigating success goes through this one helper. func redirectToRecord(w http.ResponseWriter, r *http.Request, path string) { w.Header().Add("Vary", "HX-Request") if r.Header.Get("HX-Request") == "true" { w.Header().Set("HX-Redirect", path) w.WriteHeader(http.StatusOK) return } http.Redirect(w, r, path, http.StatusSeeOther) }