diff of e74f745ac046170bd0a5a2d375ac38d8d5317534
e74f745ac046170bd0a5a2d375ac38d8d5317534
diff --git a/aggressive-murja.asd b/aggressive-murja.asd
index 14f7f3e..814bad9 100644
--- a/aggressive-murja.asd
+++ b/aggressive-murja.asd
@@ -30,7 +30,8 @@
"uuid"
"cl-hash-util"
"spinneret"
- "parenscript")
+ "parenscript"
+ "paren-async")
:description "A rewrite of the <a href=\"https://github.com/feuery/murja-blog/\">murja blogging engine</a> in lisp"
:components ((:module "src"
:components
diff --git a/resources/css/murja.css b/resources/css/murja.css
index f7f5d27..55881c9 100644
--- a/resources/css/murja.css
+++ b/resources/css/murja.css
@@ -281,7 +281,7 @@ header {
justify-content: flex-end;
}
-.previouslyPostResult {
+#previouslyPostResult {
display: block;
}
@@ -381,11 +381,6 @@ header {
flex: 3;
}
-.dialog {
- width: 60%;
- height: 60%;
-}
-
.excerpt {
float: right;
background-color: #999;
diff --git a/src/view/admin/components/editor.lisp b/src/view/admin/components/editor.lisp
index 88dec2f..c45b70b 100644
--- a/src/view/admin/components/editor.lisp
+++ b/src/view/admin/components/editor.lisp
@@ -9,12 +9,27 @@
(in-package :murja.view.admin.components.editor)
+(defun add-previously-dialog ()
+ (with-html
+ (:header.previouslyHeader (:button :id "closeModal" "X"))
+
+ (:select :id "previouslyPostResult" :multiple t)
+ (:input :type "text" :placeholder "Search for posts" :id "previouslySearcher")))
+
(defun previouslies (post)
(with-html
(:script (:raw (previouslies-component-frontend)))
- (:div :id "previouslies-container"
- (:input :type "text" ;; "hidden"
- :name "previouslies" :id "previouslies" :value (json:stringify (posts:previouslies post))))))
+ (:dialog :id "previouslyModal"
+ (add-previously-dialog))
+
+ (:div
+ (:button :id "add-previously" "Link previous posts")
+
+ (:div :id "previouslies-container"
+ (:input :type "hidden"
+ :name "previouslies" :id "previouslies" :value (if (posts:previouslies post)
+ (json:stringify (posts:previouslies post))
+ "[]"))))))
(defun tag-component (post)
(with-html
diff --git a/src/view/admin/components/previouslies-script.lisp b/src/view/admin/components/previouslies-script.lisp
index 4aae247..df026bd 100644
--- a/src/view/admin/components/previouslies-script.lisp
+++ b/src/view/admin/components/previouslies-script.lisp
@@ -1,5 +1,5 @@
(defpackage murja.view.admin.components.previouslies-script
- (:use :cl :binding-arrows :parenscript)
+ (:use :cl :binding-arrows :parenscript :paren-async)
(:export :previouslies-component-frontend)
(:documentation "All the parenscript logic hidden from making murja.view.admin.components.editor an eyesore"))
@@ -76,7 +76,81 @@
(append-child ul-root))
nil))
+
+ (defun-async previously-searched (e)
+ (let ((result (await (fetch "/api/posts/search-previously"
+ (create
+ method "POST"
+ body (@ e target value)
+ headers (create
+ "Content-Type" "application/json"))))))
+
+ (when (equal 200 (@ result status))
+ (let* ((previouslies-input (chain document
+ (query-selector "#previouslies")))
+ (current-previouslies (chain JSON (parse (@ previouslies-input value))))
+ (root-select (chain document
+ (query-selector "#previouslyPostResult")))
+ (result (await (chain result (json))))
+ (result-data (chain result
+ (filter (lambda (el)
+ (not (chain current-previouslies
+ (includes el))))))))
+
+ (setf (@ root-select innerHTML) "")
+
+ (dolist (result result-data)
+ (let ((option (chain document
+ (create-element "option"))))
+ (setf (@ option innerText) (@ result title))
+ (setf (@ option value) (@ result id))
+ (chain option
+ (add-event-listener "click" (lambda (e)
+ (let* ((id (@ e target value))
+ (title (@ e target innerText))
+ (previouslies-input (chain document
+ (query-selector "#previouslies")))
+ (current-previouslies (chain JSON (parse (@ previouslies-input value)))))
+ (chain current-previouslies
+ (push (create id id
+ title title)))
+ (setf (@ previouslies-input value) (chain JSON (stringify current-previouslies)))
+
+ (setf (@ root-select innerHTML) "")
+ (setf (@ (chain document
+ (query-selector "#previouslySearcher"))
+ innerHTML) "")
+
+ (regenerate-previously-component)))))
+
+ (chain root-select (append-child option))))))))
+
+ (defun link-add-previously-button (e)
+ (chain document
+ (query-selector "#add-previously")
+ (add-event-listener "click"
+ (lambda (ee)
+ (chain document
+ (query-selector "#previouslyModal")
+ (show-modal)))))
+
+ (chain document
+ (query-selector "#closeModal")
+ (add-event-listener "click"
+ (lambda (ee)
+ (chain document
+ (query-selector "#previouslyModal")
+ (close)))))
+
+ (chain document
+ (query-selector "#previouslySearcher")
+ (add-event-listener "input" #'previously-searched)))
+
(chain document
(add-event-listener "DOMContentLoaded"
- #'regenerate-previously-component))))
+ #'regenerate-previously-component))
+
+ (chain document
+ (add-event-listener "DOMContentLoaded"
+ #'link-add-previously-button))))