On Mon, Oct 11, 2021 at 12:47 PM Adriaan Joubert <adriaan...@gmail.com> wrote:
> Hi, > Hello, Adriaan! > We are starting to use a library called fancytree ( > http://wwwendt.de/tech/fancytree/demo/index.html). For basic trees this > integrates really easily with tapestry. > > However for tree tables the simplest way to render the trees client-side is > to ship the contents of the tree table down in a json structure. For simple > values this works well. > > Ideally we would like to have tapestry components available in the tree > table. We could come up with complicated ways of doing this (hidden divs > for every cell etc), but it would be easy if we could render a tapestry > component to a string, and simply ship this client side as a field in the > json. > > Does this sound feasible at all? I found > https://github.com/uklance/tapestry-offline, but is there a simpler > built-in way? > tapestry-offline is great when you want to use Tapestry to generate some content outside of Tapestry-handled requests. For Tapestry-handled requests, you can use its own PartialTemplateRenderer service: https://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/PartialTemplateRenderer.html. It works for component and block instances. One example taken from one of the Tapestry internal testing apps: public class PartialTemplateRendererDemo { @Inject @Property private Block someBlock; @Inject private PartialTemplateRenderer partialTemplateRenderer; @InjectComponent private BeanDisplay beanDisplay; @Property private Pojo object; void setupRender() { object = new Pojo(); object.setDate(new Date(21342345234444L)); object.setString(String.valueOf(System.currentTimeMillis())); object.setInteger((int) (System.currentTimeMillis() % 234123)); } public String getServiceRenderedBlock() { return partialTemplateRenderer.render(someBlock); } public String getServiceRenderedComponent() { return partialTemplateRenderer.render(beanDisplay); } public static class Pojo { private int integer; private String string; private Date date; public int getInteger() { return integer; } public void setInteger(int i) { this.integer = i; } public String getString() { return string; } public void setString(String s) { this.string = s; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } } } <t:block id="someBlock"> <!-- One component that generates a good amount of markup --> <t:beandisplay t:id="insideBlock" t:object="object"/> </t:block> <div id="original"> <t:delegate to="block:someblock"/> </div> <div id="serviceRenderedBlock"> <t:outputRaw value="serviceRenderedBlock"/> </div> <div id="originalBeanDisplay"> <t:beandisplay t:id="beanDisplay" t:object="object"/> </div> <div id="serviceRenderedComponent"> <t:outputRaw value="serviceRenderedComponent"/> > > If anybody has any ideas that would be great. > > Cheers, > > Adriaan > -- Thiago