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))))