cl-scopes/frontend/cs-hx.lisp

47 lines
1.7 KiB
Common Lisp

;;;; cl-scopes/frontend/cs-hx - frontend (http response) definitions
;;;; for embedding HTML fragments in pages generated by the `cyberscopes` Hugo theme
;;;; with dynamic elements handled by `HTMX`.
(defpackage :scopes/frontend/cs-hx
(:use :common-lisp)
(:local-nicknames (:dom :scopes/web/dom)
(:message :scopes/core/message)
(:response :scopes/web/response)
(:shape :scopes/shape)
(:util :scopes/util))
(:import-from :scopes/web/dom
#:button #:div #:input #:label)
(:export #:render-content #:response))
(in-package :scopes/frontend/cs-hx)
(defvar *templates* (make-hash-table))
(defclass response (response:html-response) ())
(defmethod response:render-content ((resp response) msg)
;(dom:render (dom:dlist nil (shape:data msg))))
(let ((tmpl (or (gethash (shape:head-value msg :action) *templates*) #'view)))
(dom:render (funcall tmpl resp msg))))
(defun view (resp msg)
(div nil (util:loop-plist (shape:data msg) k v collect (view-field k v))))
(defun view-field (label value)
(div nil (label nil label) ": " value))
(defun form (resp msg)
(let* ((data (shape:data msg))
(fields (getf data :fields)))
(dom:form (list :name "login" :hx-target "#cs-debug" :hx-post "/hx/auth/login")
(mapcar (lambda (f) (form-field f)) fields)
(button '(:class "btn btn-primary") "Login")
)))
(defun form-field (name)
(div nil
(label '(:class "form-label") name)
(input (list :type "text" :name name :class "form-control"))))
(setf (gethash :view *templates*) #'view)
(setf (gethash :form *templates*) #'form)