I'm trying to make a very basic pedestal app to display a list of items, or a text message if the list is empty.
I thought what I wanted was :
- a data model where [:root :items] would be my list of items
- a template function for the page ([:root])
- a static template function for the empty list
- a dynamic template function for a list with elements
- at the start of the application, send a message that will initialize the list to be empty
- in rendering, respond to :
[node-create [] :map]
by doing ... nothing ?[node-create [:root] :map]
by rendering the template for the full page[node-create [:root :items] :map]
by adding the template for the empty list
To be clear, what I want to display in the end would be (without elements)
<html>
<div>My list</div>
<p>There is nothing in the list</p>
</html>
and when there is something in the list :
<html>
<div>My list</div>
<ul>
<li>item1</li>
<li>item2</li>
</ul>
</html>
Am I on the right track here ?
I'm stuck at initializing the data model to be what I want. The closest I got is this :
;; behavior.clj
(defn init-root-transform [old-value message]
{})
(defn init-items-transform [old-value message]
[])
(def example-app
{:version 2
;; :transform [[:set-value [:greeting] set-value-transform]]})
:transform [[:bootstrap [:root] init-app-transform]
[:bootstrap-systems [:root :items] init-items-transform]
]})
;; start.cljs
... skipped...
(app/begin app)
(p/put-message (:input app) {msg/type :bootstrap msg/topic [:root]})
(p/put-message (:input app) {msg/type :bootstrap-systems msg/topic [:root :items]})
The problem is that, this way, I get a data model with a single :root node containing the value {:items [] }.
It might sounds like a very silly question, but are those two data models the same ?
[:root :systems] => []
[:root] => {:systems []}
And when I boot my application, the generated rendering deltas are :
[node-create [] :map]
[node-create [:root] :map]
[value [:root] nil {:items [] }]
I don't think this is suitable for rendering my list of items, is it ?
UPDATE :
@solussd implied that the two datamodels are the same ; however, when the following delta is generated :
[value [:root] nil {:items []}]
I still can't handle it. If I add a rendering config like this :
[value [:root :items] render-items-list]
Then the render-items-list
function is not called.
If I add a rendering config like this :
[value [:root] render-root]
Then the render-root
function will be called, but obviously, not with the proper 'path', and I suppose it would also be called when any other change to the ':root' element in the data model is changed.
Any idea how I can fix that is welcome...