UserEditComponent.vala 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using Astralis;
  2. using Inversion;
  3. namespace Spry.Authentication {
  4. public class UserEditComponent : Component {
  5. public int user_id { get; set; }
  6. public string username { get; set; }
  7. public UserProjection user { get; set; }
  8. public override string markup { get { return """
  9. <spry-context property="user_id" />
  10. <spry-context property="username" />
  11. <form
  12. spry-action=":save"
  13. spry-method="post"
  14. hx-disabled-elt="find input, find button"
  15. hx-indicator="find button"
  16. hx-swap="outerHTML"
  17. style="display: grid; grid-template-columns: max-content auto; column-gap: 3em; row-gap: 1em;">
  18. <label for="username">Username</label>
  19. <input type="text" name="username" value-expr="this.user.username" disabled>
  20. <label for="forename">Forename</label>
  21. <input type="text" name="forename" value-expr="this.user.forename" required>
  22. <label for="surname">Surname</label>
  23. <input type="text" name="surname" value-expr="this.user.surname" required>
  24. <label for="email">Email Address</label>
  25. <input type="text" name="email" value-expr="this.user.email" required>
  26. <label for="date_of_birth">Date of Birth</label>
  27. <input type="date" name="date_of_birth" value-expr='this.user.date_of_birth.format("%Y-%m-%d")' required>
  28. <label for="new_password">Password</label>
  29. <input type="password" name="new_password" placeholder="Leave blank to keep unchanged">
  30. <button style="grid-column: span 2;" type="submit">Save</button>
  31. </form>
  32. """; }}
  33. private UserService user_service = inject<UserService>();
  34. private HttpContext http_context = inject<HttpContext>();
  35. public async override void handle_action (string action) throws Error {
  36. var form = yield Astralis.FormDataParser.parse (http_context.request.request_body, http_context.request.content_type);
  37. var dob_strs = form.get_field ("date_of_birth").split("-");
  38. var dob = new DateTime(new TimeZone.utc (), int.parse(dob_strs[0]), int.parse(dob_strs[1]), int.parse(dob_strs[2]), 0, 0, 0);
  39. yield user_service.alter_user (user_id, username, form.get_field ("email"), form.get_field ("forename"), form.get_field ("surname"), dob, true);
  40. var new_password = form.get_field ("new_password");
  41. if(new_password != null && new_password != "") {
  42. yield user_service.set_password (user_id, new_password);
  43. }
  44. response.set_header ("HX-Refresh", "true");
  45. response.skip_content ();
  46. }
  47. }
  48. }