Created
January 14, 2014 16:27
-
-
Save ddsilva/8421112 to your computer and use it in GitHub Desktop.
Tree view espaço físico
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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