diff --git a/frontend/cs-hx.lisp b/frontend/cs-hx.lisp index 61e77cc..7d17c9e 100644 --- a/frontend/cs-hx.lisp +++ b/frontend/cs-hx.lisp @@ -5,6 +5,7 @@ (defpackage :scopes/frontend/cs-hx (:use :common-lisp) (:local-nicknames (:dom :scopes/web/dom) + (:frontend :scopes/frontend) (:message :scopes/core/message) (:response :scopes/web/response) (:shape :scopes/shape) @@ -35,13 +36,15 @@ (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") + (button '(:class "btn btn-primary") (getf data :button)) ))) -(defun form-field (name) +(defun form-field (fld) (div nil - (label '(:class "form-label") name) - (input (list :type "text" :name name :class "form-control")))) + (label '(:class "form-label") (frontend:label fld)) + (input (list :type (frontend:field-type fld) + :name (frontend:name fld) + :class "form-control")))) (setf (gethash :view *templates*) #'view) (setf (gethash :form *templates*) #'form) diff --git a/frontend/frontend.lisp b/frontend/frontend.lisp new file mode 100644 index 0000000..20027f4 --- /dev/null +++ b/frontend/frontend.lisp @@ -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)) diff --git a/lib/auth/web.lisp b/lib/auth/web.lisp index 9542c70..a5ca2a9 100644 --- a/lib/auth/web.lisp +++ b/lib/auth/web.lisp @@ -6,6 +6,7 @@ (:auth :scopes-auth) (:config :scopes/config) (:core :scopes/core) + (:frontend :scopes/frontend) (:jwt :scopes/web/jwt) (:message :scopes/core/message) (:server :scopes/web/server) @@ -15,12 +16,23 @@ (in-package :scopes-auth/web) -(defun login-form (ctx msg) - (let ((mso (message:create '(:auth :form :login) - :data '(:fields (:login :password) :button "Login")))) - (actor:send (actor:customer msg) mso) +;;;; set up login form for interactive (browser) login + +(defun login-form (ctx msg-in) + (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) (let* ((prc (auth:login (shape:data msg)))) ;(jwt:create ...) diff --git a/scopes-web.asd b/scopes-web.asd index e8e78ab..1cfcc81 100644 --- a/scopes-web.asd +++ b/scopes-web.asd @@ -9,7 +9,9 @@ :depends-on (:cl-cookie :cl-html-parse :clack :dexador :flexi-streams :lack :lack-component :lack-app-file :quri :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/cookie") (:file "web/dom") diff --git a/test/etc/config-dummy.lisp b/test/etc/config-dummy.lisp index aa5d54e..dac3d4f 100644 --- a/test/etc/config-dummy.lisp +++ b/test/etc/config-dummy.lisp @@ -10,6 +10,7 @@ (config:add :child :class 'child-config :user (config:from-env :user) + ;:user (util:getenv "SCOPES_USER") :password (config:from-env :password) :address (config:from-env :address) :port (config:from-env :port "8199")