diff --git a/spine.el b/spine.el index 3bc2226..27a1bf4 100644 --- a/spine.el +++ b/spine.el @@ -174,38 +174,6 @@ SELECTED-ID expands the matching book's detail section." collect (ht ("date" (format "[%s]" date)) ("text" text)))))))) - ("minibuffer" - (when selected - (let ((status (plist-get book :status))) - (ht ("actions" - (append - (cond - ((equal status "WANT") - (list - (ht ("command" "status") ("label" "Mark reading") - ("href" (format "/edit?id=%s&action=status&value=READING" id))) - (ht ("command" "note") ("label" "Add note") - ("href" (format "/edit?id=%s&action=note" id))))) - ((equal status "READING") - (list - (ht ("command" "status") ("label" "Mark read") - ("href" (format "/edit?id=%s&action=status&value=READ" id))) - (ht ("command" "status") ("label" "Abandon") - ("href" (format "/edit?id=%s&action=status&value=ABANDONED" id))) - (ht ("command" "note") ("label" "Add note") - ("href" (format "/edit?id=%s&action=note" id))))) - ((equal status "READ") - (list - (ht ("command" "status") ("label" "Read again") - ("href" (format "/edit?id=%s&action=status&value=READING" id))) - (ht ("command" "note") ("label" "Add note") - ("href" (format "/edit?id=%s&action=note" id))))) - ((equal status "ABANDONED") - (list - (ht ("command" "status") ("label" "Try again") - ("href" (format "/edit?id=%s&action=status&value=READING" id))))) - (t nil)) - nil)))))) ))) (push model book-models))) (push (ht ("label" (cdr (assoc status status-labels))) @@ -217,7 +185,45 @@ SELECTED-ID expands the matching book's detail section." ("reading_count" reading-count) ("current_filter" effective-filter) ("summary_groups" (nreverse summary-groups)) - ("groups" (nreverse groups)))))) + ("groups" (nreverse groups)) + ("minibuffer" + (when selected-id + (let* ((books-by-id (make-hash-table :test 'equal))) + (dolist (b books) + (puthash (plist-get b :id) b books-by-id)) + (let ((book (gethash selected-id books-by-id))) + (when book + (let ((status (or (plist-get book :status) "WANT"))) + (ht ("actions" + (append + (cond + ((equal status "WANT") + (list + (ht ("command" "status") ("label" "Mark reading") + ("href" (format "/edit?id=%s&action=status&value=READING" selected-id))) + (ht ("command" "note") ("label" "Add note") + ("href" (format "/edit?id=%s&action=note" selected-id))))) + ((equal status "READING") + (list + (ht ("command" "status") ("label" "Mark read") + ("href" (format "/edit?id=%s&action=status&value=READ" selected-id))) + (ht ("command" "status") ("label" "Abandon") + ("href" (format "/edit?id=%s&action=status&value=ABANDONED" selected-id))) + (ht ("command" "note") ("label" "Add note") + ("href" (format "/edit?id=%s&action=note" selected-id))))) + ((equal status "READ") + (list + (ht ("command" "status") ("label" "Read again") + ("href" (format "/edit?id=%s&action=status&value=READING" selected-id))) + (ht ("command" "note") ("label" "Add note") + ("href" (format "/edit?id=%s&action=note" selected-id))))) + ((equal status "ABANDONED") + (list + (ht ("command" "status") ("label" "Try again") + ("href" (format "/edit?id=%s&action=status&value=READING" selected-id))))) + (t nil)) + nil)))))))) + ))))) (defun spine-add-book (&rest args) "Add a new WANT book to `spine-org-file'. Keyword arguments: :title :author :category :format :isbn :cover diff --git a/templates/index.mustache b/templates/index.mustache index 01abb10..f4ff1a0 100644 --- a/templates/index.mustache +++ b/templates/index.mustache @@ -132,8 +132,11 @@ {{#minibuffer}} {{/minibuffer}} diff --git a/test/spine-edit-test.el b/test/spine-edit-test.el index 41677cf..fe0ea1b 100644 --- a/test/spine-edit-test.el +++ b/test/spine-edit-test.el @@ -106,29 +106,35 @@ "spine-set-status signals error for unknown ID." (should-error (spine-set-status "nonexistent-id" "READING"))) -(ert-deftest spine-edit-model-minibuffer-want () "Selected WANT book has Mark reading and Add note actions." (spine-edit-test--cleanup) + +(ert-deftest spine-edit-model-minibuffer-reading () + "Selected READING book has Mark read, Abandon, Add note actions." + (spine-edit-test--cleanup) (unwind-protect (progn (spine-edit-test--setup) (let* ((books (spine-books)) (book (car books)) - (id (plist-get book :id)) - (model (spine-index-model books nil id)) - (groups (ht-get model "groups"))) - (cl-labels ((find-book-model (groups id) - (cl-block nil - (dolist (g groups) - (dolist (b (ht-get g "books")) - (when (string= (ht-get b "title") "Edit Test Book") - (cl-return b))))))) - (let ((bm (find-book-model groups id))) - (should bm) - (let ((mb (ht-get bm "minibuffer"))) - (should mb) - (let ((actions (ht-get mb "actions"))) - (should (= (length actions) 2)) - (should (string= (ht-get (nth 0 actions) "label") "Mark reading")) - (should (string= (ht-get (nth 1 actions) "label") "Add note")))))))) + (id (plist-get book :id))) + (spine-set-status id "READING") + (let ((model (spine-index-model (spine-books) nil id))) + (let ((mb (ht-get model "minibuffer"))) + (should mb) + (let ((actions (ht-get mb "actions"))) + (should (= (length actions) 3)) + (should (string= (ht-get (nth 0 actions) "label") "Mark read")) + (should (string= (ht-get (nth 1 actions) "label") "Abandon")) + (should (string= (ht-get (nth 2 actions) "label") "Add note"))))))) + (spine-edit-test--cleanup))) + +(ert-deftest spine-edit-model-minibuffer-nil-when-no-selection () + "No minibuffer when no book is selected." + (spine-edit-test--cleanup) + (unwind-protect + (progn + (spine-edit-test--setup) + (let ((model (spine-index-model (spine-books)))) + (should-not (ht-get model "minibuffer")))) (spine-edit-test--cleanup)))