From 37b39c596f0b5f46d4716ee27a90b113d957fdb4 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 23 Jun 2025 10:15:57 +0200 Subject: [PATCH] start with rendering forms --- frontend/cs-hx.lisp | 20 +++++++++++++------- test/test-web.lisp | 2 +- util/async.lisp | 5 ++--- web/dom.lisp | 4 ++-- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/frontend/cs-hx.lisp b/frontend/cs-hx.lisp index 076a465..61e77cc 100644 --- a/frontend/cs-hx.lisp +++ b/frontend/cs-hx.lisp @@ -9,7 +9,8 @@ (:response :scopes/web/response) (:shape :scopes/shape) (:util :scopes/util)) - (:import-from :scopes/web/dom #:div #:label) + (:import-from :scopes/web/dom + #:button #:div #:input #:label) (:export #:render-content #:response)) (in-package :scopes/frontend/cs-hx) @@ -26,16 +27,21 @@ (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 (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 nil name) ": " 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) diff --git a/test/test-web.lisp b/test/test-web.lisp index 07f010c..42daa60 100644 --- a/test/test-web.lisp +++ b/test/test-web.lisp @@ -47,7 +47,7 @@ (setf inp "Link") (setf parsed (dom:parse inp)) (== parsed '(((:a :href "https://example.com") "Link"))) - ;(== (dom:from-list parsed) ((dom:a '(:href "https://example.com") "Link"))) + ;(== (car (dom:from-list parsed)) (dom:a '(:href "https://example.com") "Link")) (== (dom:render (dom:from-list parsed)) inp) (== (dom:to-list (dom:a '(:href "https://example.com") "Link")) (car parsed)) )) diff --git a/util/async.lisp b/util/async.lisp index fe161e9..ea552f2 100644 --- a/util/async.lisp +++ b/util/async.lisp @@ -34,10 +34,9 @@ (make-instance 'mailbox)) (defun rcv (mb) - (handler-case - (lpq:pop-queue (queue mb)) + (handler-case (lpq:pop-queue (queue mb)) (condition (cnd) - (util:lg :info "condition on pop-queue" cnd) + (util:lg :info "rcv -> lpq:pop-queue" cnd) +quit-message+))) (defun try-rcv (mb) diff --git a/web/dom.lisp b/web/dom.lisp index def37fc..00c5649 100644 --- a/web/dom.lisp +++ b/web/dom.lisp @@ -8,7 +8,7 @@ (:export #:xml-element #:elem #:element #:void-element #:render #:dlist - #:a #:dd #:div #:dl #:dt #:label + #:a #:button #:dd #:div #:dl #:dt #:form #:label #:br #:input #:parse #:from-list #:to-list)) @@ -81,7 +81,7 @@ tags))) (eval-when (:compile-toplevel :load-toplevel :execute) - (make-elements (a dd div dl dt label))) + (make-elements (a button dd div dl dt form label))) (eval-when (:compile-toplevel :load-toplevel :execute) (make-elements (br input) void-element))