Commit 35c987a5 authored by Eduardo Silva's avatar Eduardo Silva
Browse files

finalizacao do menu base e ajustes pontuais no header #6

parent c4482742
...@@ -299,79 +299,136 @@ create_dropdown_tag('br_header_functions', 'header-functions', 'fa-th') ...@@ -299,79 +299,136 @@ create_dropdown_tag('br_header_functions', 'header-functions', 'fa-th')
@register.tag(name='br_header_link_item') @register.tag(name='br_header_link_item')
def do_br_header_link_item(parser, token): def do_br_header_link_item(parser, token):
bits = token.split_contents() bits = token.split_contents()
kwargs = {'href': None, 'extra_classes': None, 'style': None} kwargs = {'href_str': None, 'extra_classes_expr': None, 'style_expr': None}
for bit in bits[1:]: for bit in bits[1:]:
if '=' in bit: key, value = bit.split('=', 1)
key, value = bit.split('=', 1) if key == 'href':
if key in kwargs: kwargs['href_str'] = value
kwargs[key] = value elif key == 'extra_classes':
kwargs['extra_classes_expr'] = parser.compile_filter(value)
elif key == 'style':
kwargs['style_expr'] = parser.compile_filter(value)
nodelist = parser.parse(('end_br_header_link_item',)) nodelist = parser.parse(('end_br_header_link_item',))
parser.delete_first_token() parser.delete_first_token()
return BRHeaderLinkItemNode(nodelist, **kwargs) return BRHeaderLinkItemNode(nodelist, **kwargs)
class BRHeaderLinkItemNode(template.Node): class BRHeaderLinkItemNode(template.Node):
def __init__(self, nodelist, href, extra_classes, style): def __init__(self, nodelist, href_str, extra_classes_expr, style_expr):
self.nodelist = nodelist self.nodelist = nodelist
self.href = href self.href_str = href_str
self.extra_classes = extra_classes self.extra_classes_expr = extra_classes_expr
self.style = style self.style_expr = style_expr
def render(self, context): def render(self, context):
from django.template import Variable, VariableDoesNotExist
content = self.nodelist.render(context) content = self.nodelist.render(context)
resolved_href = resolve_variable(self.href, context) or '#' resolved_href = "#"
extra_classes_str = f" {resolve_variable(self.extra_classes, context)}" if self.extra_classes else ""
style_attr = '' if self.href_str:
if self.style: parts = self.href_str.split('|default:')
resolved_style = resolve_variable(self.style, context) primary_expr_str = parts[0].strip()
style_attr = format_html(' style="{}"', resolved_style) secondary_expr_str = parts[1].strip() if len(parts) > 1 else None
try:
primary_value = Variable(primary_expr_str).resolve(context)
if primary_value:
resolved_href = primary_value
except VariableDoesNotExist:
pass
if resolved_href == "#" and secondary_expr_str:
try:
base_obj = Variable(secondary_expr_str.split('.')[0]).resolve(context)
if base_obj and hasattr(base_obj, 'url'):
url = getattr(base_obj, 'url')
if url:
resolved_href = url
except VariableDoesNotExist:
pass
except Exception:
pass
# Resolve classes e estilos
extra_classes = self.extra_classes_expr.resolve(context) if self.extra_classes_expr else ""
style = self.style_expr.resolve(context) if self.style_expr else ""
style_attr = format_html(' style="{}"', style) if style else ""
return format_html( return format_html(
'<a class="br-item{}" href="{}"{}>{}</a>', '<a class="br-item {}" href="{}"{}>{}</a>',
extra_classes_str, resolved_href, style_attr, mark_safe(content) extra_classes,
resolved_href,
style_attr,
mark_safe(content)
) )
@register.tag(name='br_function_item') @register.tag(name='br_function_item')
def do_br_function_item(parser, token): def do_br_function_item(parser, token):
bits = token.split_contents() bits = token.split_contents()
kwargs = {'icon_class': None, 'label': None, 'aria_label': None, 'extra_classes': None, 'icon_style': None, 'label_style': None} kwargs = {
'icon_class': None, 'label': None, 'aria_label': None,
'extra_classes': None, 'icon_style': None, 'label_style': None,
'href': None
}
for bit in bits[1:]: for bit in bits[1:]:
if '=' in bit: if '=' in bit:
key, value = bit.split('=', 1) key, value = bit.split('=', 1)
if key in kwargs: if key in kwargs:
kwargs[key] = value kwargs[key] = parser.compile_filter(value)
return BRFunctionItemNode(**kwargs) return BRFunctionItemNode(**kwargs)
class BRFunctionItemNode(template.Node): class BRFunctionItemNode(template.Node):
def __init__(self, icon_class, label, aria_label, extra_classes, icon_style, label_style): def __init__(self, icon_class, label, aria_label, extra_classes, icon_style, label_style, href):
self.icon_class = icon_class self.icon_class = icon_class
self.label = label self.label = label
self.aria_label = aria_label self.aria_label = aria_label
self.extra_classes = extra_classes self.extra_classes = extra_classes
self.icon_style = icon_style self.icon_style = icon_style
self.label_style = label_style self.label_style = label_style
self.href = href
def render(self, context): def render(self, context):
resolved_label = resolve_variable(self.label, context) def resolve_filter(f):
resolved_aria_label = resolve_variable(self.aria_label, context) or resolved_label return f.resolve(context) if f else ""
extra_classes_str = f" {resolve_variable(self.extra_classes, context)}" if self.extra_classes else ""
icon_style_attr = ''
if self.icon_style:
resolved_style = resolve_variable(self.icon_style, context)
icon_style_attr = format_html(' style="{}"', resolved_style)
label_style_attr = ''
if self.label_style:
resolved_style = resolve_variable(self.label_style, context)
label_style_attr = format_html(' style="{}"', resolved_style)
return format_html( resolved_label = resolve_filter(self.label)
'''<div class="br-item{}"> resolved_aria_label = resolve_filter(self.aria_label) or resolved_label
<button class="br-button circle small" type="button" aria-label="{}"> resolved_icon_class = resolve_filter(self.icon_class)
<i class="fas {}" aria-hidden="true"{}></i><span class="text"{}>{}</span> resolved_href = resolve_filter(self.href)
</button>
</div>''', extra_classes_str = resolve_filter(self.extra_classes)
extra_classes_str, resolved_aria_label, resolve_variable(self.icon_class, context), icon_style_attr = format_html(' style="{}"', resolve_filter(self.icon_style)) if self.icon_style else ""
icon_style_attr, label_style_attr, resolved_label label_style_attr = format_html(' style="{}"', resolve_filter(self.label_style)) if self.label_style else ""
inner_content = format_html(
'<i class="fas {}" aria-hidden="true"{}></i><span class="text"{}>{}</span>',
resolved_icon_class, icon_style_attr, label_style_attr, resolved_label
) )
if resolved_href:
return format_html(
'''<div class="br-item {}">
<a class="br-button circle small" href="{}" aria-label="{}">
{}
</a>
</div>''',
extra_classes_str, resolved_href, resolved_aria_label, inner_content
)
else:
return format_html(
'''<div class="br-item {}">
<button class="br-button circle small" type="button" aria-label="{}">
{}
</button>
</div>''',
extra_classes_str, resolved_aria_label, inner_content
)
# ========================= # =========================
# BLOCO: BUSCA E LOGIN # BLOCO: BUSCA E LOGIN
# ========================= # =========================
......
...@@ -172,11 +172,11 @@ def do_br_menu_item(parser, token): ...@@ -172,11 +172,11 @@ def do_br_menu_item(parser, token):
kwargs = {} kwargs = {}
for bit in bits[1:]: for bit in bits[1:]:
try: if '=' in bit:
name, value = bit.split('=') name, value = bit.split('=', 1)
kwargs[name] = value.strip('"\'') kwargs[name] = value.strip('"\'')
except ValueError: else:
raise template.TemplateSyntaxError(f"Argumento inválido em {tag_name}: {bit}") raise template.TemplateSyntaxError(f"Argumento inválido em '{tag_name}': '{bit}'. Esperado 'nome=valor'.")
href = kwargs.get('href') href = kwargs.get('href')
icon = kwargs.get('icone', '') icon = kwargs.get('icone', '')
...@@ -196,17 +196,17 @@ class BRMenuItemNode(template.Node): ...@@ -196,17 +196,17 @@ class BRMenuItemNode(template.Node):
self.icon = icon self.icon = icon
def render(self, context): def render(self, context):
# Resolve `href`
try: try:
href = template.Variable(self.href).resolve(context) href = template.Variable(self.href).resolve(context)
except template.VariableDoesNotExist: except template.VariableDoesNotExist:
href = self.href href = self.href
# Resolve `icon` icon = self.icon
try: if icon:
icon = template.Variable(self.icon).resolve(context) try:
except template.VariableDoesNotExist: icon = template.Variable(icon).resolve(context)
icon = self.icon except template.VariableDoesNotExist:
pass
content = self.nodelist.render(context) content = self.nodelist.render(context)
...@@ -218,7 +218,7 @@ class BRMenuItemNode(template.Node): ...@@ -218,7 +218,7 @@ class BRMenuItemNode(template.Node):
) )
return format_html( return format_html(
'<a class="menu-item" href="{}" role="treeitem">{}<span class="content">{}</span></a>', '<a class="menu-item divider" href="{}" role="treeitem">{}<span class="content">{}</span></a>',
href, href,
mark_safe(icon_html), mark_safe(icon_html),
content content
...@@ -348,6 +348,34 @@ class BRMenuLinksNode(template.Node): ...@@ -348,6 +348,34 @@ class BRMenuLinksNode(template.Node):
content = self.nodelist.render(context).strip() content = self.nodelist.render(context).strip()
return format_html('<div class="menu-links">{}</div>', mark_safe(content)) return format_html('<div class="menu-links">{}</div>', mark_safe(content))
@register.tag(name='br_menu_list')
def do_br_menu_list(parser, token):
nodelist = parser.parse(('end_br_menu_list',))
parser.delete_first_token()
return BRMenuListNode(nodelist)
class BRMenuListNode(template.Node):
def __init__(self, nodelist):
self.nodelist = nodelist
def render(self, context):
content = self.nodelist.render(context)
return format_html('<ul>{}</ul>', mark_safe(content))
@register.tag(name='br_menu_list_item')
def do_br_menu_list_item(parser, token):
nodelist = parser.parse(('end_br_menu_list_item',))
parser.delete_first_token()
return BRMenuListItemNode(nodelist)
class BRMenuListItemNode(template.Node):
def __init__(self, nodelist):
self.nodelist = nodelist
def render(self, context):
content = self.nodelist.render(context)
return format_html('<li>{}</li>', mark_safe(content))
@register.tag(name="br_menu_link") @register.tag(name="br_menu_link")
def do_br_menu_link(parser, token): def do_br_menu_link(parser, token):
bits = token.split_contents() bits = token.split_contents()
......
...@@ -33,16 +33,17 @@ ...@@ -33,16 +33,17 @@
{% br_header_links %} {% br_header_links %}
{% br_list %} {% br_list %}
{% br_list_header %}Acesso Rápido{% end_br_list_header %} {% br_list_header %}Acesso Rápido{% end_br_list_header %}
{% br_header_link_item href="#" %}Link de acesso 1{% end_br_header_link_item %} {% br_header_link_item href="https://www.google.com/" %}Link de acesso 1{% end_br_header_link_item %}
{% br_header_link_item href="#" %}Link de acesso 2{% end_br_header_link_item %} {% br_header_link_item href="#" %}Link de acesso 2{% end_br_header_link_item %}
{% br_header_link_item href="#" %}Link de acesso 3{% end_br_header_link_item %} {% br_header_link_item href="#" %}Link de acesso 3{% end_br_header_link_item %}
{% br_header_link_item href="#" %}Link de acesso 4{% end_br_header_link_item %}
{% end_br_list %} {% end_br_list %}
{% end_br_header_links %} {% end_br_header_links %}
{% br_header_functions %} {% br_header_functions %}
{% br_list %} {% br_list %}
{% br_list_header %}Funcionalidades do Sistema{% end_br_list_header %} {% br_list_header %}Funcionalidades do Sistema{% end_br_list_header %}
{% br_function_item icon_class="fa-chart-bar" label="Funcionalidade 1" %} {% br_function_item href="https://www.google.com/" icon_class="fa-chart-bar" label="Funcionalidade 1" %}
{% br_function_item icon_class="fa-headset" label="Funcionalidade 2" %} {% br_function_item icon_class="fa-headset" label="Funcionalidade 2" %}
{% br_function_item icon_class="fa-comment" label="Funcionalidade 3" %} {% br_function_item icon_class="fa-comment" label="Funcionalidade 3" %}
{% br_function_item icon_class="fa-adjust" label="Funcionalidade 4" %} {% br_function_item icon_class="fa-adjust" label="Funcionalidade 4" %}
......
...@@ -17,19 +17,125 @@ ...@@ -17,19 +17,125 @@
{% end_br_menu_header %} {% end_br_menu_header %}
{% br_menu_body %} {% br_menu_body %}
{% br_menu_folder %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-bell" %}Camada 1{% end_br_menu_item %} {# === MENU-FOLDER 1 === #}
{% br_menu_item href="javascript: void(0)" icone="fas fa-bell" %}Camada 2{% end_br_menu_item %} {% br_menu_folder %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-bell" %}Camada 3{% end_br_menu_item %} {% br_menu_item href="javascript: void(0)" icone="fas fa-bell" %}Camada 1{% end_br_menu_item %}
{% end_br_menu_folder %} {% br_menu_list %}
{% br_menu_divider_item href="javascript: void(0)" icone="fas fa-bell" %} {% br_menu_list_item %}
Item de Camada 1 {% br_menu_item href="javascript: void(0)" icone="fas fa-heart" %}Camada 2{% end_br_menu_item %}
{% end_br_menu_divider_item %} {% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_divider_item href="javascript: void(0)" icone="fas fa-bell" %} {% br_menu_item href="javascript: void(0)" icone="fas fa-address-book" %}Camada 2{% end_br_menu_item %}
Item de Camada 1 {% br_menu_list %}
{% end_br_menu_divider_item %} {% br_menu_list_item %}
{% end_br_menu_body %} {% br_menu_item href="javascript: void(0)" icone="fas fa-book" %}Camada 3{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-tree" %}Camada 3{% end_br_menu_item %}
{% br_menu_list %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-moon" %}Camada 3{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-archive" %}Camada 2{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_folder %}
{# === MENU-FOLDER 2 === #}
{% br_menu_folder %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-bell" %}Camada 1{% end_br_menu_item %}
{% br_menu_list %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-heart" %}Camada 2{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-address-book" %}Camada 2{% end_br_menu_item %}
{% br_menu_list %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-book" %}Camada 3{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-tree" %}Camada 3{% end_br_menu_item %}
{% br_menu_list %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-moon" %}Camada 3{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-archive" %}Camada 2{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_folder %}
{# === MENU-FOLDER 3 === #}
{% br_menu_folder %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-bell" %}Camada 1{% end_br_menu_item %}
{% br_menu_list %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-heart" %}Camada 2{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-address-book" %}Camada 2{% end_br_menu_item %}
{% br_menu_list %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-book" %}Camada 3{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-tree" %}Camada 3{% end_br_menu_item %}
{% br_menu_list %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" %}Camada 4{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-moon" %}Camada 3{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_list_item %}
{% br_menu_list_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-archive" %}Camada 2{% end_br_menu_item %}
{% end_br_menu_list_item %}
{% end_br_menu_list %}
{% end_br_menu_folder %}
{# === ITENS DE CAMADA 1 COMO DIVISOR #}
{% br_menu_item href="javascript: void(0)" icone="fas fa-bell" class="divider" %}Item de Camada 1{% end_br_menu_item %}
{% br_menu_item href="javascript: void(0)" icone="fas fa-bell" class="divider" %}Item de Camada 1{% end_br_menu_item %}
{% end_br_menu_body %}
{% br_menu_footer %} {% br_menu_footer %}
{% br_menu_footer_logos %} {% br_menu_footer_logos %}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment