Open vindarel opened 4 years ago
Reproducible example:
(defpackage testtable
(:use #:cl
#:weblocks-ui/form
#:weblocks/html)
(:import-from #:weblocks/widget
#:render
#:update
#:defwidget)
(:import-from #:weblocks/actions
#:make-js-action)
(:import-from #:weblocks/app
#:defapp)
(:import-from #:weblocks-navigation-widget
#:defroutes))
(in-package :testtable)
(defapp testtable :prefix "/")
(weblocks/debug:on)
(defparameter *quantity* 0 "Simulate a book's quantity in the DB.")
(defwidget book-widget (weblocks-ui:ui-widget)
())
(defun add-book (book-widget)
"Add one copy to the default place."
(incf *quantity*)
(update book-widget))
(defmethod render ((widget book-widget))
(with-html
(:td "Title: On Lisp")
(:td "quantity:" *quantity*)
(:td (with-html-form (:POST (lambda (&key &allow-other-keys)
(add-book widget)))
(:input :type "submit"
:value "Add 1")))))
(defwidget book-list-widget ()
())
(defmethod render ((widget book-list-widget))
(with-html
(:table
(:tbody
(dolist (elt (list (make-instance 'book-widget)
(make-instance 'book-widget)))
do (with-html
(:tr (render elt))))))))
(defmethod weblocks/session:init ((app testtable))
(declare (ignorable app))
(make-instance 'book-list-widget))
(defun start ()
(weblocks/server:start :port 8910))
idea: the tbody
.
(defmethod get-html-tag ((widget t))
(let ((path (get-html-path)))
(log:debug path)
(case (first path)
(:table
:tr)
(:tr
:td)
(t
:div))))
but (get-html-path)
still returns NIL, hence get-html-tag
a DIV.
Excuse me, can't dive into this problem now.
Hi,
I have an issue rendering a widget as a row inside a table. It is rendered inside a
div
and it doesn't respect the markup of my render function.This reminds me of a fix we implemented some months ago. We corrected
get-html-tag
for it to consult Spinneret and return a:tr
or a:td
if we are inside a table, and a:div
otherwise.I start like this:
add-book
updates the widget:I render the table inside my main widget:
and it displays the table correctly. When I click on the +1 button, a new widget is inserted above the widget that was clicked, inside the
tr
, it is rendered as a div and it doesn't contain any:td
, only the plain text title + author + price + quantity concatenated.tracing my render function: it is called.
logging
get-html-tag
and thusspinneret:get-html-path
: the path is NIL (??)I tried rendering my widget with an enclosing
:tr
: it doesn't change that the path is NIL and the rendered html as notd
but all the fields as text.Do you have any pointers or best practices to share?
ps: code