src/view/admin/components/tag-script.lisp

DOWNLOAD
(in-package :murja.view.admin.components.tag-script)

(eval-when (:compile-toplevel :load-toplevel :execute)
  (named-readtables:in-readtable :murja.ps))

(defun tags-component-frontend ()
  (ps

    (defun sync-tags-input ()
      "Syncs every option inside tag <select> into a JSON.stringified array inside the hidden tag-input.value"
      (let ((tag-select (chain document
			       (query-selector "#tag-select")))
	    (tag-input (chain document
			      (query-selector "#tags-value")))
	    (acc (array)))
	(dolist (node (@ tag-select child-nodes))
	  (when (= (@ node tag-name) "OPTION")
	    (chain acc (push node))))

	(setf (@ tag-input value)
	      (chain JSON
		     (stringify 
		      (chain acc
			     (map (lambda (node)
				    (@ node text))))))))
      false)
	
    
    (chain document
	   (add-event-listener "DOMContentLoaded"
			       (lambda (e)
				 (let ((add-tag (chain document
						       (query-selector "#add-tag")))
				       (remove-tag (chain document
							  (query-selector "#remove-tag")))
				       (tag-select (chain document
							  (query-selector "#tag-select"))))

				   (chain add-tag
					  (add-event-listener "click" (lambda (e)
									;; TODO: most of these .preventDefaults() could've been prevented by adding type="button" to all the <buttons>
									(chain e (prevent-default))
									(let* ((new-tag (chain
											(prompt "New tag?")
											(to-lower-case)))
									       (as-option (chain
											   document
											   (create-element "option"))))
									  (setf (@ as-option text) new-tag)
									  (chain tag-select
										 options
										 (add as-option))
									  
									  (sync-tags-input)
									  false))))
									  
				   (chain remove-tag
					  (add-event-listener "click" (lambda (e)
									(chain e (prevent-default))
									(chain
									 tag-select
									 (remove (@ tag-select selected-index)))
									(sync-tags-input)
									false)))))))))