summaryrefslogtreecommitdiff
path: root/forms.lua
diff options
context:
space:
mode:
Diffstat (limited to 'forms.lua')
-rw-r--r--forms.lua115
1 files changed, 115 insertions, 0 deletions
diff --git a/forms.lua b/forms.lua
new file mode 100644
index 0000000..d4084a4
--- /dev/null
+++ b/forms.lua
@@ -0,0 +1,115 @@
+local citrine = require 'citrine'
+local html = require 'html'
+
+local M = {}
+
+local function show_messages(messages)
+ if messages then
+ for _, m in ipairs(messages) do
+ citrine.errmsg(m)
+ end
+ end
+end
+
+function M.reasonable_string(str)
+ local len = utf8.len(str)
+ return len and len < 256 and len > 0 or false
+end
+
+local function input(type, id, label, value, submit)
+ html.p({class = 'field'}, function()
+ if label and type ~= 'checkbox' then
+ html.label({["for"] = id}, label)
+ end
+ html.input {
+ type = type, id = id, name = id,
+ required = type ~= 'checkbox' and "" or nil, maxlength = 256,
+ value = value
+ }
+ if label and type == 'checkbox' then
+ html.label({["for"] = id, class = 'checkbox-label'}, label)
+ html.text " "
+ end
+ if submit then
+ html.input {type = 'submit', value = submit}
+ end
+ end)
+end
+
+local function hidden(name, value)
+ html.input {type = 'hidden', name = name, value = value}
+end
+
+function M.login(action, messages, values)
+ local attrs = {method = "POST", action = action, class = 'login-form'}
+ local values = values or {}
+ html.form(attrs, function()
+ html.h2 "existing account"
+ show_messages(messages)
+ input('email', 'email', "email: ", values.email)
+ input('password', 'password', "password: ")
+ hidden('action', 'login')
+ input('submit', nil, nil, "log in")
+ end)
+end
+
+function M.register(action, messages, values)
+ local attrs = {method = "POST", action = action, class = 'register-form'}
+ local values = values or {}
+ html.form(attrs, function()
+ html.h2 "register"
+ show_messages(messages)
+ input('email', 'email', "email: ", values.email)
+ input('password', 'password', "password: ", values.password)
+ input('password', 'confirm_password', "confirm password: ")
+ input('text', 'username',
+ "username (may be changed later): ", values.username)
+ input('time', 'coinstar', "when's 8am? ")
+ html.p [[
+ tip: you should use a (offline) password manager to generate and
+ store your passwords.
+ ]]
+ hidden('action', 'register')
+ input('submit', nil, nil, "register")
+ end)
+end
+
+function M.connect(uid, token, meta, endpoint)
+ local attrs = {method = "POST", action = endpoint, class = 'connect-form'}
+ html.form(attrs, function()
+ hidden('uid', uid)
+ hidden('token', token)
+ if meta then
+ hidden('meta', meta)
+ end
+ input('submit', nil, nil, "confirm")
+ end)
+end
+
+function M.user_settings(user, messages)
+ show_messages(messages)
+ html.form({method = "POST"}, function()
+ input('text', 'username',
+ "username: ", user:get "username", "change")
+ end)
+ html.form({method = "POST"}, function()
+ input('email', 'email',
+ "email: ", user:get "email", "change")
+ end)
+ html.p "username changes may take time to effect."
+ html.h3 "change password"
+ html.form({method = "POST"}, function()
+ input('password', 'password', "current password: ")
+ input('password', 'new_password', "new password: ")
+ input('password', 'confirm_password', "confirm password: ")
+ input('submit', nil, nil, "change")
+ end)
+ html.h3 "log out"
+ html.form({method = "POST"}, function()
+ hidden('logout', 'yes')
+ input('checkbox', 'everywhere',
+ "log out everywhere", nil, "log out")
+ end)
+end
+
+return M