src/view/admin/components/editor.lisp
(defpackage murja.view.admin.components.editor
(:use :cl :binding-arrows :spinneret :parenscript :murja.view.admin.components.dnd-script)
(:export :editor)
(:import-from :murja.view.admin.components.tag-script :tags-component-frontend)
(:import-from :murja.view.admin.components.previouslies-script :previouslies-component-frontend)
(:import-from :murja.model.post :post-id :tags :article :post-title :post-hidden? :post-unlisted?)
(:local-nicknames (:posts :murja.model.post)
(:json :com.inuoe.jzon)))
(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")))))