gitoriaLog in with ident

tickets

All repositories: gitoria

ReadmeCodePull requestsReleasesTicketsSettings
Commit38bdd5e438bdd5e4deploy.sh: never send .git or .gitignore to Byrodinmre38bdd5e4/components/new_project.hl

3.0 KB

  1. // components/new_project.hl — `/new-project` (ticket #20): open a project. Any logged-in user with a display
  2. // name may; they become its first admin. The slug (the URL part) is proposed from the title as you type and
  3. // stays editable — once you edit it, the title no longer overwrites it. Title / slug / description can be
  4. // changed later on the project's settings page.
  5. parent './main.hl'
  6. import { createProject, slugFromTitle, uniqueSlug } from '../store.hl'
  7. import { siteName } from '../project.hl'
  8. import { canWriteSession, writerOfSession } from '../users.hl'
  9. session = null
  10. canWrite = canWriteSession(session)
  11. mustLogIn = !canWrite
  12. title = ''
  13. slug = ''
  14. slugEdited = false
  15. message = ''
  16. done = false
  17. doneHref = ''
  18. doneName = ''
  19. __title = siteName + ' | new project'
  20. View {
  21. projectForm {
  22. h1 { "New project" }
  23. if (mustLogIn) { p { id = "loginhint" class = "hint" "Log in with ident (top right) and choose a display name to open a project." } }
  24. if (canWrite) {
  25. form { id = "projectform"
  26. on submit(e) {
  27. e.preventDefault()
  28. emit create(e)
  29. }
  30. label { "Title"
  31. input { id = "projecttitle" name = "title" required = "required" maxlength = "100" autocomplete = "off" value = title on input(e) { emit setTitle(e.target.value) } }
  32. }
  33. label { "Slug (the address of the project)"
  34. input { id = "projectslug" name = "slug" maxlength = "100" autocomplete = "off" value = slug on input(e) { emit setSlug(e.target.value) } }
  35. }
  36. button { id = "projectcreate" type = "submit" "Create project" }
  37. p { id = "projectmessage" class = "message" message }
  38. }
  39. }
  40. if (done) { p { id = "created" class = "notice" "Created " strong { doneName } ". " a { id = "createdlink" href = doneHref "Open its settings" } } }
  41. }
  42. }
  43. on setTitle(v) {
  44. title = v
  45. if (!slugEdited) {
  46. let r = emit server proposeSlug(v)
  47. if (r != null && r.slug != null) { slug = r.slug }
  48. }
  49. }
  50. on setSlug(v) {
  51. slug = v
  52. slugEdited = true
  53. }
  54. on create(e) {
  55. if (title.trim() == '') { return null }
  56. let r = emit server makeProject(title, slug)
  57. if (r == null || r.error != null) {
  58. message = r != null ? r.error : 'could not create the project'
  59. return null
  60. }
  61. message = ''
  62. done = true
  63. doneName = r.title
  64. doneHref = r.settingsHref
  65. title = ''
  66. slug = ''
  67. slugEdited = false
  68. }
  69. on client signedIn(tag, info) {
  70. canWrite = info.named
  71. mustLogIn = !info.named
  72. }
  73. on client signedOut(tag) {
  74. canWrite = false
  75. mustLogIn = true
  76. }
  77. on server proposeSlug(text, session) {
  78. if (hlTypeName(text) != 'String' || text.trim() == '') { return { slug = '' } }
  79. return { slug = uniqueSlug(slugFromTitle(text)) }
  80. }
  81. on server makeProject(title, slug, session) {
  82. let w = writerOfSession(session)
  83. if (w.error != null) { return { error = w.error } }
  84. if (hlTypeName(title) != 'String' || hlTypeName(slug) != 'String') { return { error = 'title and slug must be text' } }
  85. let r = createProject(w.user, title, slug, '')
  86. if (r.error != null) { return { error = r.error } }
  87. return { title = r.project.title slug = r.project.slug settingsHref = r.project.settingsHref }
  88. }

Branches

Latest commits

  • 38bdd5e4deploy.sh: never send .git or .gitignore to Byrodinmre
  • f12fa1bcState of 2026-09-27, before the move to gitoriamre