Acting upon clicks in an ExtJS TreePanel
Tuesday, June 10th, 2008ExtJS’ TreePanel absolutely rock. You can display complicated data structures without worrying about the rendering process at all. However, what if you want to catch a click on a node and somehow process it in the Apotomo/Ruby environment?
In this example I’ll attach an event handler to a TreePanel which updates another widget whenever a node is clicked.
First we’ll have a look at the WidgetTree setup.
app/apotomo/apotomo_widget_tree.rb
1 2 3 4 5 6 7 8 9 10 | ts = Apotomo::TreeStore.new ts[:root] = {:two=>{:two_one=>{}}, :three=>{}} w << pnl = ext_panel('big_panel', :title => "Big Panel") pnl << tpanel = ext_tree_panel('an_ext_tree', :width => 200) tpanel.set_store(ts) pnl << peer_panel = ext_panel('peer_panel', :title => "Tree peer", :width => 300) peer_panel << cell(:tree_peer, :init, 'my_tree_peer') tpanel.watch(:click, 'my_tree_peer', :_show_clicked) |
When rendered, this leads to the following app state.
We can see the TreePanel widget and the “Peer Panel” widget being pushed into the “Big Panel” (line 5 and 8).
The my_tree_peer widget is in state :init, displaying a message that nothing special happened (line 9). If a click in the tree is encountered, my_tree_code is asked to go into the state :_show_clicked. (line 10).
Let’s click on a node.
In our new application state, the my_tree_peer widget reports which node was clicked. How spectacular! The Apotomo event dispatcher sent it to another state. We can find out how this new state works by looking at the widget code.
app/cells/tree_peer_cell.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class TreePeerCell < Apotomo::StatefulWidget def transition_map { :init => [:_show_clicked], :_show_clicked => [:_show_clicked], } end def init "No item has been clicked." end def _show_clicked node_id = param(:node_id) "You clicked node #{node_id}." end end |
The two state methods just send static html to the screen, which is ok for demonstration purposes.
Note how we mapped a real ExtJS client-side event into a server-side Ruby event and managed all the event-handling in pure ruby. That’s Apotomo!

