(defmodule nemoptera_setup_pages
(export all))
(defun show (req)
(if (nemoptera_setup:installed?)
(nemoptera_http:html 200 (done-page (nemoptera_public:logged-in? req)))
(nemoptera_http:html 200 (form-page (nemoptera_setup:check-env) #M() ""))))
(defun save (req)
(if (nemoptera_setup:installed?)
(nemoptera_http:redirect "/")
(let ((fields (maps:from_list
(list (tuple 'site_name (nemoptera_http:param req "site_name"))
(tuple 'site_url (nemoptera_http:param req "site_url"))
(tuple 'site_tagline (nemoptera_http:param req "site_tagline"))
(tuple 'site_description (nemoptera_http:param req "site_description"))
(tuple 'loose_title (nemoptera_http:param req "loose_title"))
(tuple 'db_path (nemoptera_http:param req "db_path"))
(tuple 'repo_dir (nemoptera_http:param req "repo_dir"))
(tuple 'username (nemoptera_http:param req "username"))
(tuple 'password (nemoptera_http:param req "password"))
(tuple 'password2 (nemoptera_http:param req "password2"))))))
(case (nemoptera_setup:finish fields)
('ok (nemoptera_http:redirect "/login"))
(`#(error ,message)
(nemoptera_http:html 400 (form-page (nemoptera_setup:check-env) fields message)))))))
(defun done-page (logged-in?)
(nemoptera_ui:render "Setup" 'setup 'setup logged-in?
"<h1 class=\"page\">Setup</h1><p>This site is already installed.</p><p><a href=\"/\">Home</a></p>"))
(defun form-page (checks fields message)
(let ((ready (nemoptera_setup:all-ok? checks)))
(nemoptera_ui:render "Setup" 'setup 'setup 'false
(list "<h1 class=\"page\">Setup</h1>"
"<p>Create the administrator and the site record. Settings are stored under <code>data/</code>.</p>"
(if (=:= "" message) "" (list "<p class=\"error\">" (nemoptera_ui:escape message) "</p>"))
"<h2>Environment</h2><table>"
(lists:map #'check-row/1 checks)
"</table>"
"<form method=\"post\" action=\"/setup\">"
(field "site_name" "Site name" (value fields 'site_name "Nemoptera") "text")
(field "site_url" "Site URL" (value fields 'site_url (nemoptera_site:default-url)) "url")
(field "site_tagline" "Tagline" (value fields 'site_tagline "Repositories hosted with Fossil.") "text")
(area "site_description" "Description for uncategorized repositories" (value fields 'site_description ""))
(field "loose_title" "Heading for uncategorized repositories" (value fields 'loose_title "Repositories") "text")
(field "db_path" "Database file" (value fields 'db_path "data/nemoptera.db") "text")
(field "repo_dir" "Repository directory" (value fields 'repo_dir "data/repos") "text")
(field "username" "Administrator username" (value fields 'username "") "text")
(field "password" "Administrator password" "" "password")
(field "password2" "Repeat password" "" "password")
"<p class=\"actions\"><button type=\"submit\""
(if ready "" " disabled")
">Install</button></p></form>"))))
(defun check-row (check)
(list "<tr><td>" (nemoptera_ui:escape (maps:get 'name check)) "</td><td>"
(if (maps:get 'ok check) "ok" "<span class=\"error\">failed</span>")
"</td><td>" (nemoptera_ui:escape (maps:get 'detail check)) "</td></tr>"))
(defun field (name label current type)
(list "<label for=\"" name "\">" (nemoptera_ui:escape label) "</label>"
"<input id=\"" name "\" name=\"" name "\" type=\"" type "\" value=\""
(nemoptera_ui:escape current) "\">"))
(defun area (name label current)
(list "<label for=\"" name "\">" (nemoptera_ui:escape label) "</label>"
"<textarea id=\"" name "\" name=\"" name "\">" (nemoptera_ui:escape current) "</textarea>"))
(defun value (fields key default)
(let ((current (maps:get key fields default)))
(if (nemoptera_text:blank? current) default (nemoptera_text:to-str current))))