feat(api): Added sso endpoint for keycloak user profile top menu bar
parent
cbb6e6ebb5
commit
278544166d
|
@ -81,6 +81,15 @@ server {
|
||||||
access_log off;
|
access_log off;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
location /header/html/sso {
|
||||||
|
alias /api/api/static/templates/header_sso.html;
|
||||||
|
default_type text/html;
|
||||||
|
index header_sso.html
|
||||||
|
expires 1m;
|
||||||
|
log_not_found off;
|
||||||
|
access_log off;
|
||||||
|
}
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
try_files $uri $uri/
|
try_files $uri $uri/
|
||||||
expires 1m;
|
expires 1m;
|
||||||
|
|
|
@ -127,6 +127,13 @@ class Menu:
|
||||||
with open("api/static/templates/header_admin.html", "w") as fh:
|
with open("api/static/templates/header_admin.html", "w") as fh:
|
||||||
fh.write(output_from_parsed_template)
|
fh.write(output_from_parsed_template)
|
||||||
|
|
||||||
|
## SSO app. Nginx will serve /header/html/sso -> header_sso.html
|
||||||
|
template = env.get_template("sso.html")
|
||||||
|
output_from_parsed_template = template.render(data=self.menudict)
|
||||||
|
print(output_from_parsed_template)
|
||||||
|
with open("api/static/templates/header_sso.html", "w") as fh:
|
||||||
|
fh.write(output_from_parsed_template)
|
||||||
|
|
||||||
def get_header(self):
|
def get_header(self):
|
||||||
return self.menudict
|
return self.menudict
|
||||||
# with open('menu.yaml', 'w') as yml:
|
# with open('menu.yaml', 'w') as yml:
|
||||||
|
|
|
@ -0,0 +1,313 @@
|
||||||
|
{% block css %}
|
||||||
|
<style>
|
||||||
|
/* Header used classes */
|
||||||
|
header#header {
|
||||||
|
background-color: white !important;
|
||||||
|
box-shadow: 0 2px 4px #00000014;
|
||||||
|
border-bottom: 1px solid #262626;
|
||||||
|
display: inline-flex;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
z-index: 2000;
|
||||||
|
height: 50px;
|
||||||
|
position: absolute;
|
||||||
|
box-sizing: border-box;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
#nextcloud {
|
||||||
|
padding: 7px 0;
|
||||||
|
padding-left: 86px;
|
||||||
|
position: relative;
|
||||||
|
height: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
opacity: 1;
|
||||||
|
align-items: center;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
a * {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
border: 0;
|
||||||
|
color: var(--color-main-text);
|
||||||
|
text-decoration: none;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#theming-preview-logo,
|
||||||
|
#header #nextcloud {
|
||||||
|
padding-left: 64px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header #header-left,
|
||||||
|
#header .header-left {
|
||||||
|
flex: 1 0;
|
||||||
|
white-space: nowrap;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header #header-right,
|
||||||
|
#header .header-right {
|
||||||
|
justify-content: flex-end;
|
||||||
|
flex-shrink: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header .header-right > div,
|
||||||
|
#header .header-right > form {
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header #navbar-menu-apps #menu-apps-btn {
|
||||||
|
cursor: pointer;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header #navbar-menu-apps #menu-apps-btn #dropdownMenuAppsButton {
|
||||||
|
cursor: pointer;
|
||||||
|
height: 16px;
|
||||||
|
margin-right: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header
|
||||||
|
#navbar-menu-apps
|
||||||
|
#menu-apps-btn
|
||||||
|
#dropdownMenuAppsButton
|
||||||
|
#menu-apps-icon {
|
||||||
|
height: 16px;
|
||||||
|
width: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header div#navbar-menu-apps {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header #navbar-menu-apps .dropdown-menu {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.15);
|
||||||
|
border-radius: 5px;
|
||||||
|
box-shadow: rgb(0 0 0 / 20%) 0 3px 8px;
|
||||||
|
margin-top: -2px;
|
||||||
|
padding: 10px;
|
||||||
|
max-height: 500px;
|
||||||
|
overflow-y: scroll;
|
||||||
|
z-index: 2000;
|
||||||
|
background-color: white;
|
||||||
|
top: 33px;
|
||||||
|
right: -14px;
|
||||||
|
left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header #navbar-menu-apps .dropdown-menu ul {
|
||||||
|
list-style: none;
|
||||||
|
display: grid;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
padding: 15px 2px 0 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
grid-template-columns: 82px 82px 82px;
|
||||||
|
grid-gap: 12px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header #navbar-menu-apps .dropdown-menu ul li.app a.app-link {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: start;
|
||||||
|
text-align: center;
|
||||||
|
color: #262626;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header #navbar-menu-apps .dropdown-menu ul li.app a.app-link .icon {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
background-color: #cc0066;
|
||||||
|
border-radius: 0.25rem;
|
||||||
|
margin-right: 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header #navbar-menu-apps .dropdown-menu ul li.app a.app-link .icon i {
|
||||||
|
color: #fff;
|
||||||
|
font-size: 19px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header #navbar-menu-apps .dropdown-menu ul li.app a.app-link .text {
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 4px;
|
||||||
|
height: 26px;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 15px;
|
||||||
|
overflow-wrap: anywhere;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header #header-left,
|
||||||
|
#header .header-left,
|
||||||
|
#header #header-right,
|
||||||
|
#header .header-right {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
{% endblock %}
|
||||||
|
<header role="banner" id="header">
|
||||||
|
<div id="navbar-logo" class="header-left">
|
||||||
|
<a href="/" id="nextcloud">
|
||||||
|
<img src="/img/logo.png" alt="" style="height: 39px" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="navbar-nextcloud" class="header-right">
|
||||||
|
<div id="navbar-menu-apps" onclick="openMenu()">
|
||||||
|
<div id="menu-apps-btn">
|
||||||
|
<div
|
||||||
|
id="dropdownMenuAppsButton"
|
||||||
|
data-toggle="dropdown"
|
||||||
|
aria-haspopup="true"
|
||||||
|
aria-expanded="false"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
id="menu-apps-icon"
|
||||||
|
data-name="Menú Apps"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="26"
|
||||||
|
height="26"
|
||||||
|
viewBox="0 0 26 26"
|
||||||
|
>
|
||||||
|
<rect
|
||||||
|
id="Rectángulo_2"
|
||||||
|
data-name="Rectángulo 2"
|
||||||
|
width="6"
|
||||||
|
height="6"
|
||||||
|
fill="#262626"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
id="Rectángulo_1447"
|
||||||
|
data-name="Rectángulo 1447"
|
||||||
|
width="6"
|
||||||
|
height="6"
|
||||||
|
transform="translate(0 10)"
|
||||||
|
fill="#262626"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
id="Rectángulo_1450"
|
||||||
|
data-name="Rectángulo 1450"
|
||||||
|
width="6"
|
||||||
|
height="6"
|
||||||
|
transform="translate(0 20)"
|
||||||
|
fill="#262626"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
id="Rectángulo_1440"
|
||||||
|
data-name="Rectángulo 1440"
|
||||||
|
width="6"
|
||||||
|
height="6"
|
||||||
|
transform="translate(10)"
|
||||||
|
fill="#262626"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
id="Rectángulo_1446"
|
||||||
|
data-name="Rectángulo 1446"
|
||||||
|
width="6"
|
||||||
|
height="6"
|
||||||
|
transform="translate(10 10)"
|
||||||
|
fill="#262626"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
id="Rectángulo_1449"
|
||||||
|
data-name="Rectángulo 1449"
|
||||||
|
width="6"
|
||||||
|
height="6"
|
||||||
|
transform="translate(10 20)"
|
||||||
|
fill="#262626"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
id="Rectángulo_1441"
|
||||||
|
data-name="Rectángulo 1441"
|
||||||
|
width="6"
|
||||||
|
height="6"
|
||||||
|
transform="translate(20)"
|
||||||
|
fill="#262626"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
id="Rectángulo_1445"
|
||||||
|
data-name="Rectángulo 1445"
|
||||||
|
width="6"
|
||||||
|
height="6"
|
||||||
|
transform="translate(20 10)"
|
||||||
|
fill="#262626"
|
||||||
|
></rect>
|
||||||
|
<rect
|
||||||
|
id="Rectángulo_1448"
|
||||||
|
data-name="Rectángulo 1448"
|
||||||
|
width="6"
|
||||||
|
height="6"
|
||||||
|
transform="translate(20 20)"
|
||||||
|
fill="#262626"
|
||||||
|
></rect>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
id="dropdownMenuApps"
|
||||||
|
class="dropdown-menu dropdown-menu-right"
|
||||||
|
aria-labelledby="dropdownMenuButton"
|
||||||
|
style="display: none"
|
||||||
|
>
|
||||||
|
<ul id="app-apps">
|
||||||
|
{% for item in data.apps_internal %}
|
||||||
|
<li class="app {{ item.shorname }}">
|
||||||
|
<a href="{{ item.href }}" class="app-link" target="_blank">
|
||||||
|
<div class="icon {{ item.shorname }}">
|
||||||
|
<i class="{{ item.icon }}" aria-hidden="true"></i>
|
||||||
|
</div>
|
||||||
|
<div class="text">{{ item.name }}</div>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<ul id="app-external" class="external-links">
|
||||||
|
{% for item in data.apps_external %}
|
||||||
|
<li class="app {{ item.shorname }}">
|
||||||
|
<a href="{{ item.href }}" class="app-link" target="_blank">
|
||||||
|
<div class="icon {{ item.shorname }}">
|
||||||
|
<i class="{{ item.icon }}" aria-hidden="true"></i>
|
||||||
|
</div>
|
||||||
|
<div class="text">{{ item.name }}</div>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="dd-logo">
|
||||||
|
<a href="https://xnet-x.net/ca/digital-democratic/" target="_blank">
|
||||||
|
<img src="/img/product-logo.svg" alt="" style="height: 16px; margin-right: 21px; margin-top: 16px">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{% block pagescript %}
|
||||||
|
<script>
|
||||||
|
function openMenu(){
|
||||||
|
if ($('#menu-apps-btn').hasClass("open")) {
|
||||||
|
$('#menu-apps-btn').removeClass("open")
|
||||||
|
$('#dropdownMenuApps').css('display', 'none')
|
||||||
|
} else {
|
||||||
|
$('#menu-apps-btn').addClass("open")
|
||||||
|
$('#dropdownMenuApps').css('display', 'block')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
Loading…
Reference in New Issue