Skip to content

Instantly share code, notes, and snippets.

@ddsilva
Created January 14, 2014 16:27
Show Gist options
  • Save ddsilva/8421112 to your computer and use it in GitHub Desktop.
Save ddsilva/8421112 to your computer and use it in GitHub Desktop.
Tree view espaço físico
define [
'core'
'jqtree'
'models/espaco_fisico_model'
'daos/espaco_fisico_dao'
], () ->
# Imports
# =============================================================
Core = require 'core'
DaoFactory = require 'core/dao_factory'
EspacoFisicoModel = require 'models/espaco_fisico_model'
EspacoFisicoDao = DaoFactory.getDAOByName 'espaco_fisico_dao'
# TreeView class
# =============================================================
class TreeView extends Core.View
# Override Attributes
# =============================================================
template : """
<div class="tree-container hide"></div>
<p class="fallback alert hide">Não há espaço físico cadastrado.</p>
"""
# Additional Attributes
# =============================================================
treeData : null
espacoFisicoId : null
# Override Methos
# =============================================================
initialize: (options) ->
super
_(@).extend options
# Se for recebido um objeto json que especifica uma árvore, ela será montada sem chamar servicó algum
# Se não houver um objeto json e houver um espaço físico específicado, a árvore será carregada até o nó correspondente
# Senão, são carregados os nós da raiz
if @treeData
promise = $.Deferred()
promise.resolve()
else if @espacoFisicoId
promise = EspacoFisicoDao.localizar(@espacoFisicoId)
else
promise = EspacoFisicoDao.listarRaizes()
promise.always (data) =>
@setTreeData data if data
do @render
afterRender: ->
super
do @cacheDOMElements
# Se houverem dados, a árvore é montada, senão é exibida uma mensagem ao usuário
if @getTreeData().length then @setupTree data:@getTreeData() else @DOMElements.$fallback.show()
# Additional Methods
# =============================================================
# Faz o cache dos elementos do DOM que são manipulados durante a execução
cacheDOMElements: ->
@DOMElements =
$treeContainer : @$el.find '.tree-container'
$fallback : @$el.find '.fallback'
# Tree Methods
# =============================================================
# Configura e exibe a árvore
setupTree: (options={}) ->
# Configuração padrão
defaultOptions =
dataUrl : EspacoFisicoModel.prototype.urlRoot
_(options).defaults defaultOptions
# Construindo a árvore
@DOMElements.$treeContainer.show().tree options
# Se houver um espaço físico específicado, será aberto seu nó pai
if @espacoFisicoId then @openNodeById @espacoFisicoId
@trigger 'tree:seted'
# Configura os dados da arvore
setTreeData: (data=[]) ->
if _(data).isArray()
data = for node in data then @formatDataNode node
# Ordena os nós pela label
@treeData = _(data).sortBy (node) => node.label
return @
# Retorna os dados da árvore
getTreeData: ->
return @treeData or []
# Seleciona um nó por id
selectNodeById: (nodeId) ->
node = @DOMElements.$treeContainer.tree 'getNodeById', nodeId
@DOMElements.$treeContainer.tree 'selectNode', node
return node
# Abre um nó por id
openNodeById: (nodeId) ->
node = @DOMElements.$treeContainer.tree 'getNodeById', nodeId
@DOMElements.$treeContainer.tree 'openNode', node
@DOMElements.$treeContainer.tree 'selectNode', node
# Retorna o nó selecionado
getSelectedNode: ->
@DOMElements.$treeContainer.tree 'getSelectedNode'
# Formata os dados de um nó
formatDataNode: (node) ->
# Estrutura padrão de um node
nodeDefaults =
id : null
label : ''
children : []
load_on_demand : false
_(node).defaults nodeDefaults
# Se o nó já tiver filhos e estiver setado para carregar por demanda, muda esta configuração para não duplicar nós
if node.load_on_demand and node.children.length then node.load_on_demand = false
# Formata os filhos do nó
if node.children.length
node.children = for child in node.children then @formatDataNode child
node.children = _(node.children).sortBy (node) => node.label;
return node
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment