41 lines
1.4 KiB
Common Lisp
41 lines
1.4 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 #:div #: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 (gethash (shape:head-value msg :action) *templates*)))
|
|
(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 form (resp msg)
|
|
(let* ((data (shape:data msg))
|
|
(fields (getf data :fields)))
|
|
(mapcar (lambda (f) (form-field f)) fields)))
|
|
|
|
(defun view-field (label value)
|
|
(div nil (label nil label) ": " value))
|
|
|
|
(defun form-field (name)
|
|
(div nil (label nil name) ": " name))
|
|
|
|
(setf (gethash :view *templates*) #'view)
|
|
(setf (gethash :form *templates*) #'form)
|