blob: 65ece69ea79b886fa0601e627759ffe15d743b98 [file] [log] [blame]
# Copyright 2012, 2013 The Apache Software Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http:#www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ## t5/core/tree
#
# Handlers to support to the core/Tree Tapestry component.
define ["./dom", "./ajax", "./zone"],
(dom, ajax) ->
TREE = "[data-component-type='core/Tree']"
NODE_ID = "data-node-id"
SELECTOR = "#{TREE} [#{NODE_ID}]"
LOADING = "tree-children-loading"
LOADED = "tree-children-loaded"
EXPANDED = "tree-expanded"
SELECTED = "selected-leaf-node"
send = (node, action, success) ->
container = node.findParent TREE
url = container.attribute "data-tree-action-url"
ajax url,
data:
"t:action": action
"t:nodeid": node.attribute NODE_ID
success: success
loadChildren = (node) ->
# Ignore duplicate requests to load the children.
return if node.meta LOADING
node.meta LOADING, true
node.addClass "empty-node"
node.update "<span class='tree-ajax-wait'/>"
send node, "expand", (response) ->
# Remove the Ajax spinner and mark the node as expanded (it will have a "-"
# icon instead of a "+" icon)
node.update("").addClass(EXPANDED).removeClass("empty-node")
label = node.findParent("li").findFirst(".tree-label")
label.insertAfter response.json.content
node.meta LOADING, false
node.meta LOADED, true
# toggles a folder in the tree between expanded and collapsed (once data for the folder
# has been loaded).
toggle = (node) ->
sublist = node.findParent("li").findFirst("ul")
if node.hasClass EXPANDED
node.removeClass EXPANDED
sublist.hide()
send node, "markCollapsed"
return
node.addClass EXPANDED
sublist.show()
send node, "markExpanded"
# The handler is triggered on the `<span data-node-id=''>` directly inside the `<li>`.
clickHandler = ->
# Ignore clicks on leaf nodes, and on folders that are known to be empty.
if (@parent().hasClass "leaf-node") or (@hasClass "empty-node")
return false
# If not already loaded then fire off the Ajax request to load the content.
if (@meta LOADED) or (@hasClass EXPANDED)
toggle this
else
loadChildren this
return false
toggleSelection = ->
selected = @hasClass SELECTED
node = @findParent("li").findFirst("[#{NODE_ID}]")
if selected
@removeClass SELECTED
send node, "deselect"
else
@addClass SELECTED
send node, "select"
return false
dom.onDocument "click", SELECTOR, clickHandler
dom.onDocument "click",
"#{TREE}[data-tree-node-selection-enabled] LI.leaf-node > .tree-label",
toggleSelection
return null