package app import ( "maxwarden/entries" . "maxwarden/ui" . "maragu.dev/gomponents" . "maragu.dev/gomponents/html" "maxwarden/middleware" "net/http" ) const ( EDITOR_TYPE_EDIT = iota EDITOR_TYPE_ADD = iota ) func EditorHandler(w http.ResponseWriter, r *http.Request) { identity := middleware.GetIdentity(r) session := middleware.GetSession(r) var editorType int var title string var btnLabel string if r.URL.Path == "/app/editor/add" { editorType = EDITOR_TYPE_ADD title = "Add Credentials" btnLabel = "Add" } else { editorType = EDITOR_TYPE_EDIT title = "Edit Credentials" btnLabel = "Save" } var secret entries.Secret if r.Method == http.MethodGet { if editorType == EDITOR_TYPE_EDIT { id := r.PathValue("id") secret, _ = entries.FetchSecretFromID(identity.UserID, identity.MasterKey, id) } } if r.Method == http.MethodPost { r.ParseForm() desc := r.FormValue("description") notes := r.FormValue("notes") username := r.FormValue("un") password := r.FormValue("pas") url := r.FormValue("url") secret = entries.Secret{ ID: r.PathValue("id"), Description: desc, URL: url, Notes: notes, Password: password, Username: username, } if editorType == EDITOR_TYPE_ADD { entries.Add(identity.UserID, identity.MasterKey, secret) } else { entries.Update(identity.UserID, identity.MasterKey, secret) } http.Redirect(w, r, "/app", http.StatusFound) return } AppLayout(title, *identity, session, Modal( "password_generator", Text("Passkey Generator"), HxLoad("/app/generator-hx"), []Node { ButtonUIOutline(ModalCloser(), Text("Close")), }, ), If(editorType == EDITOR_TYPE_EDIT, Group{ Modal( "warning_popup", Text("Warning!"), Text("Are you sure you want to delete this entry? This action cannot be undone."), []Node{ A(Href("/app/delete/"+secret.ID), ButtonUIDanger(Text("Delete"))), ButtonUIOutline(ModalCloser(), Text("Close")), }, ), Div( InlineStyle("$me { display: flex; flex-direction: row-reverse; align-items: center; }"), ModalActuator("warning_popup", ButtonUIDanger(Text("Delete"))), ), }, ), Form( AutoComplete("off"), Method("POST"), FormLabel(Text("Description")), FormInput(Type("text"), Name("description"), Value(secret.Description), AutoFocus(), Required()), Br(), FormLabel(Text("Username")), FormInput(Type("text"), Name("un"), Value(secret.Username)), Br(), Div( FlexLeftRight( FormLabel(Text("Password")), ModalActuator("password_generator", ButtonUI(Type("button"), Text("Generate a secure password"))), ), Br(), FormInput(Class("password"), Type("password"), Name("pas"), Value(secret.Password)), Br(), FormLabel(Text("Show password?"), For("show")), FormCheck(Class("checkbox"), ID("show")), InlineScript(` let check = me(".checkbox", me()); let passInput = me(".password", me()); check.on("click", () => { if (passInput.type === "password") { passInput.type = "text"; } else if (passInput.type === "text") { passInput.type = "password"; } }); `), ), Br(), FormLabel(Text("URL")), FormInput(Type("text"), Name("url"), Value(secret.URL)), Br(), FormLabel(Text("Additional Notes")), FormTextarea(InlineStyle("$me { height: $32; font-family: var(--font-mono); }"), Name("notes"), Text(secret.Notes)), Br(), Div( InlineStyle("$me { display: flex; flex-direction: row; align-items: center; gap: $4; }"), ButtonUISuccess(Text(btnLabel), Type("submit")), A(Href("/app"), ButtonUIOutline(Text("Close"), Type("button"))), ), If(editorType == EDITOR_TYPE_EDIT, Div( InlineStyle("$me { margin-top: $3; color: $color(neutral-400); font-size: var(--text-sm);}"), Text("Last modified: "), FormatDateTime(secret.Modified), Br(), Text("Created: "), FormatDateTime(secret.Created), ), ), ), ).Render(w) }