feat: add /edit handler with note prompt page and action dispatch
This commit is contained in:
@@ -476,6 +476,63 @@ Set by test harnesses that only need the model functions.")
|
|||||||
(ht ("app_title" "spine")))))
|
(ht ("app_title" "spine")))))
|
||||||
(insert (spine-render "add.mustache" model)))))))
|
(insert (spine-render "add.mustache" model)))))))
|
||||||
|
|
||||||
|
(defun httpd/edit (proc uri-path query request)
|
||||||
|
"Handle /edit: GET shows prompt page, POST processes actions.
|
||||||
|
Query params:
|
||||||
|
id - book ID
|
||||||
|
action - status | note | rating
|
||||||
|
value - target status / rating value (for status/rating actions)
|
||||||
|
text - note text (for note action)
|
||||||
|
date - optional date string (for note/read actions)"
|
||||||
|
(let ((method (caar request))
|
||||||
|
(id (cadr (assoc "id" query)))
|
||||||
|
(action (cadr (assoc "action" query)))
|
||||||
|
(value (cadr (assoc "value" query)))
|
||||||
|
(text (cadr (assoc "text" query)))
|
||||||
|
(date (cadr (assoc "date" query))))
|
||||||
|
(if (equal method "POST")
|
||||||
|
(progn
|
||||||
|
(cond
|
||||||
|
((equal action "note")
|
||||||
|
(spine-add-note id text date))
|
||||||
|
((equal action "status")
|
||||||
|
(spine-set-status id value))
|
||||||
|
((equal action "rating")
|
||||||
|
(spine-set-rating id value)))
|
||||||
|
(httpd-redirect proc (format "/index?id=%s" id) 303))
|
||||||
|
;; GET: show prompt page for actions needing input
|
||||||
|
(if (and id (equal action "note"))
|
||||||
|
(let* ((books (spine-books))
|
||||||
|
(book (cl-find id books :key (lambda (b) (plist-get b :id)) :test #'equal))
|
||||||
|
(title (if book (plist-get book :title) "Unknown")))
|
||||||
|
(httpd-with-buffer proc "text/html"
|
||||||
|
(insert (format
|
||||||
|
"<!DOCTYPE html>
|
||||||
|
<html lang=\"en\">
|
||||||
|
<head><meta charset=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"/>
|
||||||
|
<meta name=\"color-scheme\" content=\"light dark\"/>
|
||||||
|
<title>Spine — note</title>
|
||||||
|
<link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@picocss/pico@2.1.1/css/pico.min.css\"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<main class=\"container\">
|
||||||
|
<article style=\"max-width:560px;margin-inline:auto;\">
|
||||||
|
<header><strong>spine · add note</strong></header>
|
||||||
|
<p><em>%s</em></p>
|
||||||
|
<form method=\"post\" action=\"/edit\">
|
||||||
|
<input type=\"hidden\" name=\"id\" value=\"%s\"/>
|
||||||
|
<input type=\"hidden\" name=\"action\" value=\"note\"/>
|
||||||
|
<label>Date <input type=\"date\" name=\"date\" value=\"%s\"/></label>
|
||||||
|
<label>Note <textarea name=\"text\" rows=\"3\" required autofocus></textarea></label>
|
||||||
|
<button type=\"submit\">Add note</button>
|
||||||
|
</form>
|
||||||
|
</article>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>"
|
||||||
|
title id (format-time-string "%Y-%m-%d"))))))
|
||||||
|
;; Unknown action or missing id: redirect to index
|
||||||
|
(httpd-redirect proc "/index" 302))))
|
||||||
(defun httpd/ (proc uri-path query request)
|
(defun httpd/ (proc uri-path query request)
|
||||||
"Redirect root to /index."
|
"Redirect root to /index."
|
||||||
(httpd-redirect proc "/index" 302))
|
(httpd-redirect proc "/index" 302))
|
||||||
|
|||||||
Reference in New Issue
Block a user