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