{# Macro recursivo reutilizable para renderizar árboles jerárquicos. #} {# Datos: lista de dicts con {code, name, parent, id, url, badges} #} {# #} {# Uso: #} {# {% from "contabilidad/tree_macros.html" import tree_toolbar, tree_toolbar_close, render_tree with context %} #} {# {{ tree_toolbar(entidades, current_entity_code) }} #} {#
#} {# {{ render_tree(roots, all_nodes, parent_field, id_field, icon) }} #} {#
#} {# {{ tree_toolbar_close() }} #} {# ── Toolbar del árbol (entidad + expandir/colapsar) ────────────────────── #} {% macro tree_toolbar(entidades, current_entity_code, entity_field='entidad', new_url='#', new_label=_('Nuevo')) %}
{% if entidades %}
{%- set ns = namespace(current_entity_name=current_entity_code) -%} {%- for _ent in entidades -%} {%- set _eobj = _ent[0] if _ent is sequence else _ent -%} {%- if _eobj.code == current_entity_code -%} {%- set ns.current_entity_name = _eobj.company_name -%} {%- endif -%} {%- endfor -%} {{ _('Entidad:') }} {{ ns.current_entity_name }}
{% endif %}
{% if new_url and new_url != '#' %} {{ new_label }} {% endif %}
{% endmacro %} {# ── Cierre del toolbar ────────────────────────────────────────────────── #} {% macro tree_toolbar_close() %}
{% endmacro %} {# ── Árbol recursivo completo ──────────────────────────────────────────── #} {# #} {# Parámetros: #} {# roots – lista de dicts raíz (donde 'parent' es None) #} {# all_nodes – lista plana de TODOS los dicts de nodos #} {# parent_key – nombre de la key en el dict para el padre ('parent') #} {# id_key – nombre de la key identificadora ('id' o 'code') #} {# icon – clase de icono Bootstrap Icons #} {# #} {% macro render_tree(roots, all_nodes, parent_key='parent', id_key='id', icon='bi-folder') %} {%- macro _tree_node(_node, _all, _pk, _ik, _icon) -%} {%- set nid = _node[_ik] -%} {%- set kids = _all | selectattr(_pk, 'equalto', nid) | list -%} {%- set has_kids = kids | length > 0 -%} {# sonicloud:exclude ItemTagNotWithinContainerTagCheck — este macro se invoca dentro de