frontend: work in progress: abstract form and field definitions -> dom rendering

This commit is contained in:
Helmut Merz 2025-07-06 08:59:43 +02:00
parent 6afcfa36fb
commit dd1501636e
5 changed files with 45 additions and 9 deletions

View file

@ -5,6 +5,7 @@
(defpackage :scopes/frontend/cs-hx (defpackage :scopes/frontend/cs-hx
(:use :common-lisp) (:use :common-lisp)
(:local-nicknames (:dom :scopes/web/dom) (:local-nicknames (:dom :scopes/web/dom)
(:frontend :scopes/frontend)
(:message :scopes/core/message) (:message :scopes/core/message)
(:response :scopes/web/response) (:response :scopes/web/response)
(:shape :scopes/shape) (:shape :scopes/shape)
@ -35,13 +36,15 @@
(fields (getf data :fields))) (fields (getf data :fields)))
(dom:form (list :name "login" :hx-target "#cs-debug" :hx-post "/hx/auth/login") (dom:form (list :name "login" :hx-target "#cs-debug" :hx-post "/hx/auth/login")
(mapcar (lambda (f) (form-field f)) fields) (mapcar (lambda (f) (form-field f)) fields)
(button '(:class "btn btn-primary") "Login") (button '(:class "btn btn-primary") (getf data :button))
))) )))
(defun form-field (name) (defun form-field (fld)
(div nil (div nil
(label '(:class "form-label") name) (label '(:class "form-label") (frontend:label fld))
(input (list :type "text" :name name :class "form-control")))) (input (list :type (frontend:field-type fld)
:name (frontend:name fld)
:class "form-control"))))
(setf (gethash :view *templates*) #'view) (setf (gethash :view *templates*) #'view)
(setf (gethash :form *templates*) #'form) (setf (gethash :form *templates*) #'form)

18
frontend/frontend.lisp Normal file
View file

@ -0,0 +1,18 @@
;;;; cl-scopes/frontend - generic (browser-oriented) frontend definitions.
(defpackage :scopes/frontend
(:use :common-lisp)
(:export #:form
#:field #:attrs #:field-type #:label #:name
#:control))
(in-package :scopes/frontend)
(defclass field ()
((name :reader name :initarg :name)
(label :reader label :initarg :label)
(field-type :reader field-type :initarg :type :initform :text)
(attrs :reader attrs :initarg :attrs :initform nil)))
(defun field (name label &key type attrs)
(make-instance 'field :name name :label label :type type :attrs attrs))

View file

@ -6,6 +6,7 @@
(:auth :scopes-auth) (:auth :scopes-auth)
(:config :scopes/config) (:config :scopes/config)
(:core :scopes/core) (:core :scopes/core)
(:frontend :scopes/frontend)
(:jwt :scopes/web/jwt) (:jwt :scopes/web/jwt)
(:message :scopes/core/message) (:message :scopes/core/message)
(:server :scopes/web/server) (:server :scopes/web/server)
@ -15,12 +16,23 @@
(in-package :scopes-auth/web) (in-package :scopes-auth/web)
(defun login-form (ctx msg) ;;;; set up login form for interactive (browser) login
(let ((mso (message:create '(:auth :form :login)
:data '(:fields (:login :password) :button "Login")))) (defun login-form (ctx msg-in)
(actor:send (actor:customer msg) mso) (let ((msg (message:create '(:auth :form :login)
:data (list
;:fields (:login :password)
:fields (login-fields)
:button "Login"))))
(actor:send (actor:customer msg-in) msg)
)) ))
(defun login-fields ()
(list (frontend:field :login "User Name" :attrs '(:autofocus t))
(frontend:field :password "Password" :type :password)))
;;;; browser login: check credentials / auth token / external auth
(defun login (ctx msg) (defun login (ctx msg)
(let* ((prc (auth:login (shape:data msg)))) (let* ((prc (auth:login (shape:data msg))))
;(jwt:create ...) ;(jwt:create ...)

View file

@ -9,7 +9,9 @@
:depends-on (:cl-cookie :cl-html-parse :clack :dexador :flexi-streams :depends-on (:cl-cookie :cl-html-parse :clack :dexador :flexi-streams
:lack :lack-component :lack-app-file :quri :lack :lack-component :lack-app-file :quri
:scopes-core) :scopes-core)
:components ((:file "frontend/cs-hx" :depends-on ("web/dom" "web/response")) :components ((:file "frontend/frontend")
(:file "frontend/cs-hx"
:depends-on ("web/dom" "web/response"))
(:file "web/client") (:file "web/client")
(:file "web/cookie") (:file "web/cookie")
(:file "web/dom") (:file "web/dom")

View file

@ -10,6 +10,7 @@
(config:add :child :class 'child-config (config:add :child :class 'child-config
:user (config:from-env :user) :user (config:from-env :user)
;:user (util:getenv "SCOPES_USER")
:password (config:from-env :password) :password (config:from-env :password)
:address (config:from-env :address) :address (config:from-env :address)
:port (config:from-env :port "8199") :port (config:from-env :port "8199")