Skip to content

Commit c363810

Browse files
authored
Merge pull request #82 from Xpirix/navigation_bar_improvement
Navigation bar improvement
2 parents fed6181 + 7f48da8 commit c363810

File tree

6 files changed

+440
-219
lines changed

6 files changed

+440
-219
lines changed
Lines changed: 107 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -1,164 +1,119 @@
1-
{% load i18n plugins_tagcloud simplemenu_tags static %}
1+
{% load i18n plugins_tagcloud simplemenu_tags static plugin_utils %}
22
<nav id="sidebar" class="sidebar">
3-
<ul class="content-wrapper">
4-
<li>
5-
<a class="button is-success is-medium" href="{% url "plugin_upload" %}">
6-
<i class="fas fa-upload"></i>
7-
{% trans "Upload a plugin" %}
8-
</a>
9-
</li>
10-
<hr/>
11-
{% get_namedmenu Navigation as menu %}
12-
{% for item in menu %}
13-
<li class="{% if request.path == item.page.url %}is-active{% endif %}">
14-
<a href="{{ item.page.url }}">
15-
{% if item.page.url == "/" %}
16-
<i class="fas fa-home mr-3"></i>
17-
{% elif item.page.url == "/plugins/" %}
18-
<i class="fas fa-plug mr-3"></i>
19-
{% elif item.page.url == "/plugins/my" %}
20-
<i class="fas fa-user mr-3"></i>
21-
{% endif %}
22-
{{ item.name }}
23-
</a>
3+
<ul class="content-wrapper">
4+
<li>
5+
<a class="button is-success is-medium" href="{% url "plugin_upload" %}">
6+
<i class="fas fa-upload"></i>
7+
{% trans "Upload a plugin" %}
8+
</a>
9+
</li>
10+
<hr/>
11+
12+
{% get_navigation_menu user as menu %}
13+
{% for item in menu %}
14+
{% if item.submenu %}
15+
<li>
16+
<div class="has-child">
17+
<a onclick="toggleSubMenu('{{ item.name }}')">
18+
<i class="fas {{ item.icon }} mr-3"></i>
19+
{{ item.name }}
20+
</a>
21+
<span onclick="toggleSubMenu('{{ item.name }}')" class="drop-arrow"><img src="{% static "images/arrow.svg" %}"/></span>
22+
</div>
23+
<ul class="collapsed" id="{{ item.name }}">
24+
{% for subitem in item.submenu %}
25+
{% if subitem.submenu %}
26+
<li>
27+
<div class="has-child">
28+
<a onclick="toggleSubMenu('{{ subitem.name }}')">
29+
<i class="fas {{ subitem.icon }} mr-3"></i>
30+
{{ subitem.name }}
31+
</a>
32+
<span onclick="toggleSubMenu('{{ subitem.name }}')" class="drop-arrow
33+
"><img src="{% static "images/arrow.svg" %}"/></span>
34+
</div>
35+
<ul class="collapsed"
36+
id="{{ subitem.name }}">
37+
{% for entry in subitem.submenu %}
38+
<li class="has-child {% if request.path == entry.url %}is-active{% endif %}">
39+
<a href="{{ entry.url }}">
40+
{{ entry.name }}
41+
</a>
42+
</li>
43+
{% endfor %}
44+
</ul>
45+
</li>
46+
{% else %}
47+
48+
<li class="has-child {% if request.path == subitem.url %}is-active{% endif %}">
49+
<a href="{{ subitem.url }}">
50+
{{ subitem.name }}
51+
</a>
52+
</li>
53+
{% endif %}
54+
{% endfor %}
55+
</ul>
2456
</li>
25-
{% endfor %}
26-
<li>
27-
<div class="has-child">
28-
<a onclick="toggleSubMenu('news')">
29-
<i class="fas fa-newspaper mr-3"></i>
30-
New & Updated
57+
{% else %}
58+
<li class="{% if request.path == item.url %}is-active{% endif %}">
59+
<a href="{{ item.url }}">
60+
<i class="fas {{ item.icon }} mr-3"></i>
61+
{{ item.name }}
3162
</a>
32-
<span onclick="toggleSubMenu('news')" class="drop-arrow"><img src="{% static "images/arrow.svg" %}"/></span>
33-
</div>
34-
<ul class="collapsed" id="news">
35-
{% get_namedmenu New as new %}
36-
{% for item in new %}
37-
<li class="has-child {% if request.path == item.page.url %}is-active{% endif %}">
38-
<a href="{{ item.page.url }}">
39-
{{ item.name }}
40-
</a>
41-
</li>
42-
{% endfor %}
43-
</ul>
44-
</li>
45-
<li>
46-
<div class="has-child">
47-
<a onclick="toggleSubMenu('top')">
48-
<i class="fas fa-star mr-3"></i>
49-
Top
50-
</a>
51-
<span onclick="toggleSubMenu('top')" class="drop-arrow"><img src="{% static "images/arrow.svg" %}"/></span>
52-
</div>
53-
<ul class="collapsed" id="top">
54-
{% get_namedmenu Top as Top %}
55-
{% for item in Top %}
56-
<li class="has-child {% if request.path == item.page.url %}is-active{% endif %}">
57-
<a href="{{ item.page.url }}">
58-
{{ item.name }}
59-
</a>
60-
</li>
61-
{% endfor %}
62-
</ul>
63-
</li>
64-
<li>
65-
<div class="has-child">
66-
<a onclick="toggleSubMenu('category')">
67-
<i class="fas fa-list mr-3"></i>
68-
Category
63+
</li>
64+
{% endif %}
65+
{% endfor %}
66+
<li>
67+
<div class="has-child">
68+
<a onclick="toggleSubMenu('docs')">
69+
<i class="fas fa-book mr-3"></i>
70+
Documentation
71+
</a>
72+
<span onclick="toggleSubMenu('docs')" class="drop-arrow"><img src="{% static "images/arrow.svg" %}"/></span>
73+
</div>
74+
<ul class="collapsed" id="docs">
75+
{% url 'docs_publish' as docs_publish_url %}
76+
<li class="has-child {% if request.path == docs_publish_url %}is-active{% endif %}">
77+
<a href="{{ docs_publish_url }}">
78+
Publish a plugin
6979
</a>
70-
<span onclick="toggleSubMenu('category')" class="drop-arrow"><img src="{% static "images/arrow.svg" %}"/></span>
71-
</div>
72-
<ul class="collapsed" id="category">
73-
{% get_namedmenu Category as Category %}
74-
{% for item in Category %}
75-
<li class="has-child {% if request.path == item.page.url %}is-active{% endif %}">
76-
<a href="{{ item.page.url }}">
77-
{{ item.name }}
78-
</a>
79-
</li>
80-
{% endfor %}
81-
</ul>
82-
</li>
83-
{% if user.is_authenticated and user.is_staff %}
84-
<li>
85-
<div class="has-child">
86-
<a onclick="toggleSubMenu('unapproved')">
87-
<i class="fas fa-check-circle mr-3"></i>
88-
Under review
80+
</li>
81+
{% url 'docs_approval' as docs_approval_url %}
82+
<li class="has-child {% if request.path == docs_approval_url %}is-active{% endif %}">
83+
<a href="{{ docs_approval_url }}">
84+
Approval process
8985
</a>
90-
<span onclick="toggleSubMenu('unapproved')" class="drop-arrow"><img src="{% static "images/arrow.svg" %}"/></span>
91-
</div>
92-
<ul class="collapsed" id="unapproved">
93-
{% get_namedmenu Unapproved as Unapproved %}
94-
{% for item in Unapproved %}
95-
<li class="has-child {% if request.path == item.page.url %}is-active{% endif %}">
96-
<a href="{{ item.page.url }}">
97-
{{ item.name }}
98-
</a>
99-
</li>
100-
{% endfor %}
101-
</ul>
102-
</li>
103-
{% endif %}
104-
105-
<li>
106-
<div class="has-child">
107-
<a onclick="toggleSubMenu('docs')">
108-
<i class="fas fa-book mr-3"></i>
109-
Documentation
110-
</a>
111-
<span onclick="toggleSubMenu('docs')" class="drop-arrow"><img src="{% static "images/arrow.svg" %}"/></span>
112-
</div>
113-
<ul class="collapsed" id="docs">
114-
{% url 'docs_publish' as docs_publish_url %}
115-
<li class="has-child {% if request.path == docs_publish_url %}is-active{% endif %}">
116-
<a href="{{ docs_publish_url }}">
117-
Publish a plugin
118-
</a>
119-
</li>
120-
{% url 'docs_approval' as docs_approval_url %}
121-
<li class="has-child {% if request.path == docs_approval_url %}is-active{% endif %}">
122-
<a href="{{ docs_approval_url }}">
123-
Approval process
124-
</a>
125-
</li>
126-
{% comment %} <li class="has-child {% if request.path == '/docs/manage' %}is-active{% endif %}">
127-
<a href="/docs/manage">
128-
Manage a plugin
129-
</a>
130-
</li> {% endcomment %}
131-
</ul>
132-
</li>
133-
<li>
134-
<div>
86+
</li>
87+
</ul>
88+
</li>
89+
<li>
90+
<div>
13591
{% include_plugins_tagcloud_modal 'plugins.plugin' %}
136-
</div>
137-
</li>
138-
</ul>
92+
</div>
93+
</li>
94+
</ul>
13995
</nav>
140-
141-
96+
14297
<script>
143-
function rotateArrow(e) {
144-
e.previousElementSibling.querySelector('img').classList.toggle('rotated');
145-
}
98+
function rotateArrow(e) {
99+
e.previousElementSibling.querySelector('img').classList.toggle('rotated');
100+
}
146101

147-
function toggleSubMenu(listId) {
148-
console.log(listId)
149-
let e = document.getElementById(listId);
150-
e.classList.toggle('unfolded');
151-
rotateArrow(e);
152-
}
102+
function toggleSubMenu(listId) {
103+
console.log(listId)
104+
let e = document.getElementById(listId);
105+
e.classList.toggle('unfolded');
106+
rotateArrow(e);
107+
}
153108

154-
function toggleMenu() {
155-
document.getElementById('sidebar').classList.toggle('visible');
156-
document.getElementById('hamburger-btn').classList.toggle('open');
109+
function toggleMenu() {
110+
document.getElementById('sidebar').classList.toggle('visible');
111+
document.getElementById('hamburger-btn').classList.toggle('open');
112+
}
113+
// expand active section
114+
document.querySelectorAll('li.is-active,li:has(.is-active)').forEach(li => {
115+
if (e = li.querySelector('ul')) {
116+
e.classList.toggle('unfolded');
157117
}
158-
// expand active section
159-
document.querySelectorAll('li.is-active,li:has(.is-active)').forEach(li => {
160-
if (e = li.querySelector('ul')) {
161-
e.classList.toggle('unfolded');
162-
}
163-
});
118+
});
164119
</script>

qgis-app/plugins/templatetags/plugin_utils.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,24 @@ def get_sustaining_members_section():
109109
return f.read()
110110
except FileNotFoundError:
111111
return ""
112+
113+
def _filter_menu(menu, user):
114+
"""
115+
Filter the menu and its submenus based on user status
116+
"""
117+
filtered_menu = []
118+
for item in menu:
119+
if item.get('requires_staff') and not user.is_staff:
120+
continue
121+
if item.get('requires_login') and not user.is_authenticated:
122+
continue
123+
filtered_menu.append(item)
124+
return filtered_menu
125+
126+
@register.simple_tag()
127+
def get_navigation_menu(user):
128+
"""
129+
Get the navigation menu from the settings, filtered by user status
130+
"""
131+
menu = _filter_menu(settings.NAVIGATION_MENU, user)
132+
return menu

0 commit comments

Comments
 (0)