menu 2 level dynamic ok

This commit is contained in:
jr-k 2024-07-11 00:43:46 +02:00
parent 6775ad8404
commit 6db3d0896a
7 changed files with 102 additions and 79 deletions

View File

@ -1,4 +1,6 @@
{
"dynmenu_content": "Content",
"slideshow_slide_page_title": "Schedule Overview",
"slideshow_slide_goto_player": "Go to player",
"slideshow_slide_refresh_player": "Refresh player",

View File

@ -1,4 +1,6 @@
{
"dynmenu_content": "Contenido",
"slideshow_slide_page_title": "Descripción General del Programa",
"slideshow_slide_goto_player": "Ir al reproductor",
"slideshow_slide_refresh_player": "Actualizar reproductor",

View File

@ -1,4 +1,6 @@
{
"dynmenu_content": "Contenu",
"slideshow_slide_page_title": "Vue Planning",
"slideshow_slide_goto_player": "Voir le lecteur",
"slideshow_slide_refresh_player": "Rafraîchir le lecteur",

View File

@ -1,4 +1,6 @@
{
"dynmenu_content": "Contenuti",
"slideshow_slide_page_title": "Programmazione",
"slideshow_slide_goto_player": "Vai al player",
"slideshow_slide_refresh_player": "Aggiorna player",

View File

@ -10,7 +10,7 @@ from src.model.hook.HookRegistration import HookRegistration
from src.model.hook.StaticHookRegistration import StaticHookRegistration
from src.model.hook.FunctionalHookRegistration import FunctionalHookRegistration
from src.constant.WebDirConstant import WebDirConstant
from src.util.utils import get_safe_cron_descriptor, is_valid_cron_date_time, seconds_to_hhmmss, am_i_in_docker, truncate
from src.util.utils import get_safe_cron_descriptor, is_valid_cron_date_time, seconds_to_hhmmss, am_i_in_docker, truncate, merge_dicts, dictsort
class TemplateRenderer:
@ -41,6 +41,8 @@ class TemplateRenderer:
seconds_to_hhmmss=seconds_to_hhmmss,
is_valid_cron_date_time=is_valid_cron_date_time,
json_dumps=json.dumps,
merge_dicts=merge_dicts,
dictsort=dictsort,
truncate=truncate,
l=self._model_store.lang().map(),
t=self._model_store.lang().translate,

View File

@ -247,3 +247,11 @@ def truncate(s, length, ellipsis=None):
return s[:length]
def merge_dicts(dict1, dict2):
result = dict1.copy()
result.update(dict2)
return result
def dictsort(dict1, attribute="position"):
return dict(sorted(dict1.items(), key=lambda item: item[1][attribute]))

View File

@ -51,6 +51,64 @@
<body class="{% block body_class %}{% endblock %}">
<div class="container {% block container_class %}{% endblock %}">
{% set dynmenu = {
"slideshow": {
"name": l.dynmenu_content,
"icon": "fa-image",
"position": 0,
"pills": [
{"name": "Bibliothèque", "route": "slideshow_content_list", "icon": "fa-image"},
{"name": "Planifier", "route": "slideshow_slide_list", "icon": "fa-clock"},
]
},
"configuration": {
"name": "Configuration",
"icon": "fa-cog",
"position": 3,
"pills": [
{"name": l.settings_page_title, "route": "settings_variable_list", "icon": "fa-cogs"},
{"name": l.sysinfo_page_title, "route": "sysinfo_attribute_list", "icon": "fa-list-check"},
]
}
} %}
{% if FLEET_PLAYER_ENABLED %}
{% set dynmenu = merge_dicts(dynmenu, {
"fleet": {
"name": "Appareils",
"icon": "fa-tv",
"position": 1,
"pills": [
{"name": l.fleet_node_player_group_page_title, "route": "fleet_node_player_group_list", "icon": "fa-layer-group"},
{"name": l.fleet_node_player_page_title, "route": "fleet_node_player_list", "icon": "fa-tv"},
]
}
}) %}
{% endif %}
{% if AUTH_ENABLED %}
{% set dynmenu = merge_dicts(dynmenu, {
"security": {
"name": "Sécurité",
"icon": "fa-key",
"position": 2,
"pills": [
{"name": l.auth_page_title, "route": "auth_user_list", "icon": "fa-user"},
]
}
}) %}
{% endif %}
{% set dynmenu = dictsort(dynmenu) %}
{% set route_to_category = {} %}
{% for category, details in dynmenu.items() %}
{% for pill in details.pills %}
{% set route_to_category = route_to_category.update({pill.route: category}) or route_to_category %}
{% endfor %}
{% endfor %}
{% set current_dynmenu = dynmenu[route_to_category[request.url_rule.endpoint]] %}
{% block header %}
<menu>
<h1 class="logo">
@ -65,69 +123,18 @@
<nav>
<ul>
{{ HOOK(H_ROOT_NAV_ELEMENT_START) }}
<li class="{{ 'active' if request.url_rule.endpoint == 'slideshow_slide_list' }}">
<a href="{{ url_for('slideshow_slide_list') }}">
<i class="fa-regular fa-clock"></i> {{ l.slideshow_slide_page_title }}
</a>
</li>
<li class="{{ 'active' if request.url_rule.endpoint == 'slideshow_content_list' }}">
<a href="{{ url_for('slideshow_content_list') }}">
<i class="fa fa-image"></i> {{ l.slideshow_content_page_title }}
</a>
</li>
{% if PLAYLIST_ENABLED %}
<li class="{{ 'active' if request.url_rule.endpoint == 'playlist_list' }}">
<a href="{{ url_for('playlist_list') }}">
<i class="fa fa-bars-staggered"></i> {{ l.playlist_page_title }}
{% for category, menu in dynmenu.items() %}
<li class="{{ 'active' if menu.name == current_dynmenu.name }}">
<a href="{{ url_for(menu.pills[0].route) }}">
<i class="fa {{ menu.icon }}"></i> {{ menu.name }}
</a>
</li>
{% endif %}
{% if FLEET_PLAYER_ENABLED %}
<li class="{{ 'active' if request.url_rule.endpoint == 'fleet_node_player_group_list' }}">
<a href="{{ url_for('fleet_node_player_group_list') }}">
<i class="fa fa-layer-group"></i> {{ l.fleet_node_player_group_page_title }}
</a>
</li>
<li class="{{ 'active' if request.url_rule.endpoint == 'fleet_node_player_list' }}">
<a href="{{ url_for('fleet_node_player_list') }}">
<i class="fa fa-tv"></i> {{ l.fleet_node_player_page_title }}
</a>
</li>
{% endif %}
{% if AUTH_ENABLED %}
<li class="{{ 'active' if request.url_rule.endpoint == 'auth_user_list' }}">
<a href="{{ url_for('auth_user_list') }}">
<i class="fa fa-user"></i> {{ l.auth_page_title }}
</a>
</li>
{% endif %}
<li class="{{ 'active' if request.url_rule.endpoint == 'settings_variable_list' }}">
<a href="{{ url_for('settings_variable_list') }}">
<i class="fa-solid fa-cogs"></i> {{ l.settings_page_title }}
</a>
</li>
<li class="{{ 'active' if request.url_rule.endpoint == 'sysinfo_attribute_list' }}">
<a href="{{ url_for('sysinfo_attribute_list') }}">
<i class="fa-solid fa-list-check"></i> {{ l.sysinfo_page_title }}
</a>
</li>
{% if AUTH_ENABLED %}
<li class="user-menu">
<div class="username">
<i class="fa fa-user"></i>
{{ current_user.username }}
</div>
<a href="{{ url_for('logout') }}" title="{{ l.logout }}" class="logout">
<i class="fa fa-right-from-bracket"></i>
</a>
</li>
{% endif %}
{% endfor %}
{{ HOOK(H_ROOT_NAV_ELEMENT_END) }}
</ul>
</nav>
{% endif %}
{% block footer %}
<footer>
{{ HOOK(H_ROOT_FOOTER) }}
@ -145,29 +152,27 @@
{% endblock %}
<main>
<div class="context-bar">
<div class="context-menu">
<div class="inner">
<ul class="pills">
<li class="{{ 'active' if request.url_rule.endpoint == 'slideshow_content_list' }}">
<a href="{{ url_for('slideshow_content_list') }}">
<span class="icon">
<i class="fa fa-image"></i>
</span>
Bibliothèque
</a>
</li>
<li class="{{ 'active' if request.url_rule.endpoint == 'slideshow_slide_list' }}">
<a href="{{ url_for('slideshow_slide_list') }}">
<span class="icon">
<i class="fa fa-clock"></i>
</span>
Planifier
</a>
</li>
</ul>
{% set show_context_bar = current_dynmenu or AUTH_ENABLED %}
<div class="context-bar {{ 'hidden' if not show_context_bar }}">
{% if current_dynmenu %}
<div class="context-menu">
<div class="inner">
<ul class="pills">
{% for menu in current_dynmenu.pills %}
<li class="{{ 'active' if request.url_rule.endpoint == menu.route }}">
<a href="{{ url_for(menu.route) }}">
<span class="icon">
<i class="fa {{ menu.icon }}"></i>
</span>
{{ menu.name }}
</a>
</li>
{% endfor %}
</ul>
</div>
</div>
</div>
{% endif %}
{% if AUTH_ENABLED %}
<div class="context-divider"></div>