src/view/admin/components/editor.lisp

DOWNLOAD
(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)))
    (: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
    (:div.tag-component
     (:input :type "hidden" :id "tags-value" :name "tags" :value (json:stringify (or (tags post) #())))
     (:select :multiple t :class "tag-select" :id "tag-select"
       (dolist (tag (tags post))
	 (:option :value tag tag)))
     (:button :id "add-tag" "Add tag")
     (:button :id "remove-tag" "Remove tag")

     (:script
      (:raw (tags-component-frontend))))))

(defun post-meta (post)
  (with-html
    (:div 
     (:label "Title: "
	     (:input :id "title" :name "title" :value (post-title post) :type "text"))
     (:label "Hidden: "
	     (:input :id "hidden" :name "hidden" :checked (post-hidden? post) :type "checkbox"))
     (:label "Unlisted: "
	     (:input :id "unlisted" :name "unlisted" :checked (post-unlisted? post) :type "checkbox")))))

(defun header (post)
  (with-html
    (:div.editor-top 
     (post-meta post)
     (tag-component post)
     (previouslies post)
     (:div.editor-saver
      (:input :type :submit :value "Save post!")))))

(defun editor-script (post)
  (ps
    (chain document
	   (add-event-listener "DOMContentLoaded"
			       (lambda (e)
				 (let ((editor (chain ace
						      (edit "editor-post-content"
							    (create theme "ace/theme/monokai"
								    mode "ace/mode/html"))))
				       (form (chain document
						    (query-selector "#mainform"))))
				   (chain editor (set-keyboard-handler "ace/keyboard/emacs"))
				   (chain editor (set-value (lisp (article post))))

				   (chain form
					  (add-event-listener "submit"
							      (lambda (e)
								(let ((txt (chain document
										  (query-selector "#article")))
								      (editor (chain ace (edit "editor-post-content"))))
								  (setf (@ txt value)
									(chain editor (get-value)))
								  e))))))))))
										     

  

(defun editor (post)
  (with-html
    (:script (:raw (editor-script post)))
    (:script (:raw (editor-dnd-script)))
    (:form :method "POST" :action (format nil "/api/save-post/~d" (post-id post)) :id "mainform"
	   (header post)
	   (:div
	    (:textarea :name "article" :id "article")
	    (:div :id "editor-post-content")))))