Re-write questionnaire macro
This commit is contained in:
parent
617bb46fe4
commit
50d3c79f4b
1 changed files with 55 additions and 1 deletions
|
@ -24,6 +24,7 @@
|
||||||
:spacing)
|
:spacing)
|
||||||
(:import-from
|
(:import-from
|
||||||
:dev.metalisp.sbt/form
|
:dev.metalisp.sbt/form
|
||||||
|
:form
|
||||||
:checkable
|
:checkable
|
||||||
:checkable-element
|
:checkable-element
|
||||||
:ctrl
|
:ctrl
|
||||||
|
@ -258,7 +259,7 @@ Returns multiple values:
|
||||||
(let ((splitted-list (split-list-by-keyword question)))
|
(let ((splitted-list (split-list-by-keyword question)))
|
||||||
(apply #'values (mapcar (lambda (x) (nth 1 x)) splitted-list))))
|
(apply #'values (mapcar (lambda (x) (nth 1 x)) splitted-list))))
|
||||||
|
|
||||||
(defmacro questionnaire (action &body body)
|
(defmacro questionnaire-1 (action &body body)
|
||||||
"This macro generates an HTML form composed of multiple questions, each rendered using the `question' macro.
|
"This macro generates an HTML form composed of multiple questions, each rendered using the `question' macro.
|
||||||
|
|
||||||
ACTION: Specifies the URL where the form will be submitted. This should be a
|
ACTION: Specifies the URL where the form will be submitted. This should be a
|
||||||
|
@ -310,3 +311,56 @@ Example German:
|
||||||
,@(split-list-by-keyword choices)))
|
,@(split-list-by-keyword choices)))
|
||||||
(btn-primary (:type "submit")
|
(btn-primary (:type "submit")
|
||||||
(find-l10n "submit" spinneret:*html-lang* *l10n*))))))
|
(find-l10n "submit" spinneret:*html-lang* *l10n*))))))
|
||||||
|
|
||||||
|
(defmacro questionnaire (action &body body)
|
||||||
|
"This macro generates an HTML form composed of multiple questions.
|
||||||
|
|
||||||
|
ACTION: Specifies the URL where the form will be submitted. This should be a
|
||||||
|
string representing the URL path.
|
||||||
|
|
||||||
|
BODY: A series of questions. Each question should contain the keys :ask,
|
||||||
|
:group, and :choices. The first element of :choices should be a keyword
|
||||||
|
specifying the type of input elements (e.g. :radio), followed by a list of
|
||||||
|
answer options.
|
||||||
|
|
||||||
|
Example 1:
|
||||||
|
(questionnaire \"/submit\"
|
||||||
|
(:ask \"How old are you?\"
|
||||||
|
:group \"age\"
|
||||||
|
:choices (:radio \"18-24\" \"25-34\" \"35-44\")))
|
||||||
|
Example 2:
|
||||||
|
(questionnaire \"/submit\"
|
||||||
|
(:ask \"How old are you?\"
|
||||||
|
:group \"age\"
|
||||||
|
:choices (:single \"18-24\" \"25-34\" \"35-44\")))
|
||||||
|
Example 3:
|
||||||
|
(questionnaire \"/submit\"
|
||||||
|
(:ask \"Which social media platforms do you use regularly?\"
|
||||||
|
:group \"socialmedia\"
|
||||||
|
:choices (:multiple \"Facebook\" \"Twitter\" \"Instagram\")))
|
||||||
|
Example 4:
|
||||||
|
(questionnaire \"/submit\"
|
||||||
|
(:ask \"Which social media platforms do you use regularly?\"
|
||||||
|
:group \"socialmedia\"
|
||||||
|
:choices (:multiple \"Facebook\" \"Twitter\" \"Instagram\" :text \"Others\")))
|
||||||
|
|
||||||
|
It is also possible to write the keys in another language:
|
||||||
|
Example German:
|
||||||
|
(questionnaire \"/submit\"
|
||||||
|
(:frage \"Welche Social Media-Plattformen nutzen Sie regelmäßig?\"
|
||||||
|
:gruppe \"sozialemedien\"
|
||||||
|
:auswahl (:multiple \"Facebook\" \"Twitter\" \"Instagram\" :text \"Andere\")))"
|
||||||
|
(let ((class-string (spacing :property "p" :side "y" :size 5)))
|
||||||
|
`(spinneret:with-html
|
||||||
|
(form (:class ,class-string :action ,action :method "post")
|
||||||
|
|
||||||
|
,@(loop for q in body
|
||||||
|
for (ask group choices) = (multiple-value-list (extract-question-components q))
|
||||||
|
collect `(:fieldset (:legend ,ask)
|
||||||
|
(:ol ,@(loop for choice in (split-list-by-keyword choices)
|
||||||
|
for (type values) = (multiple-value-list (resolve-input-and-choice choice))
|
||||||
|
collect `(:li ,@(loop for value in values
|
||||||
|
collect `(apply-input-form ,type ,group ,value)))))))
|
||||||
|
|
||||||
|
(btn-primary (:type "submit")
|
||||||
|
(find-l10n "submit" spinneret:*html-lang* *l10n*))))))
|
||||||
|
|
Loading…
Add table
Reference in a new issue