diff --git a/src/servala/core/models/service.py b/src/servala/core/models/service.py index 362661b..f7e4a7c 100644 --- a/src/servala/core/models/service.py +++ b/src/servala/core/models/service.py @@ -80,6 +80,13 @@ class Service(ServalaModelMixin, models.Model): def __str__(self): return self.name + @property + def featured_links(self): + """Return external links marked as featured.""" + if not self.external_links: + return [] + return [link for link in self.external_links if link.get("featured")] + def validate_dict(data, required_fields=None, allow_empty=True): if not data: diff --git a/src/servala/frontend/templates/account/login.html b/src/servala/frontend/templates/account/login.html index 233118b..58cd49b 100644 --- a/src/servala/frontend/templates/account/login.html +++ b/src/servala/frontend/templates/account/login.html @@ -1,21 +1,22 @@ {% extends "frontend/base.html" %} {% load static i18n %} {% load allauth account socialaccount %} - {% block html_title %} {% translate "Sign in" %} {% endblock html_title %} - {% block page_title %} {% translate "Welcome to Servala" %} {% endblock page_title %} - {% block card_header %} -
- Servala +
+ Servala
{% endblock card_header %} - {% block card_content %} {% if SOCIALACCOUNT_ENABLED %} @@ -24,9 +25,10 @@
{% translate "Ready to get started?" %}
-

{% translate "Sign in to access your managed service instances and the Servala service catalog" %}

+

+ {% translate "Sign in to access your managed service instances and the Servala service catalog" %} +

- {% for provider in socialaccount_providers %} {% provider_login_url provider process=process scope=scope auth_params=auth_params as href %}
@@ -35,7 +37,9 @@
@@ -43,7 +47,6 @@
{% endif %} {% endif %} -
@@ -72,8 +75,8 @@
- {% translate "Learn more" %} @@ -82,7 +85,6 @@
-
@@ -96,7 +98,6 @@
-
diff --git a/src/servala/frontend/templates/frontend/base.html b/src/servala/frontend/templates/frontend/base.html index c2d9285..990dc17 100644 --- a/src/servala/frontend/templates/frontend/base.html +++ b/src/servala/frontend/templates/frontend/base.html @@ -5,13 +5,18 @@ - + - {% block html_title %}Dashboard{% endblock html_title %} – Servala + + {% block html_title %} + Dashboard + {% endblock html_title %} + – Servala diff --git a/src/servala/frontend/templates/frontend/organizations/service_detail.html b/src/servala/frontend/templates/frontend/organizations/service_detail.html index d03489e..d9ca433 100644 --- a/src/servala/frontend/templates/frontend/organizations/service_detail.html +++ b/src/servala/frontend/templates/frontend/organizations/service_detail.html @@ -26,6 +26,24 @@

{{ service.description|default:"No description available."|urlize }}

+ {% if service.external_links %} +
+
+
{% translate "External Links" %}
+
+ {% for link in service.external_links %} + + {{ link.title }} + + + {% endfor %} +
+
+
+ {% endif %}
diff --git a/src/servala/frontend/templates/frontend/organizations/services.html b/src/servala/frontend/templates/frontend/organizations/services.html index 022b6e5..41d488e 100644 --- a/src/servala/frontend/templates/frontend/organizations/services.html +++ b/src/servala/frontend/templates/frontend/organizations/services.html @@ -16,10 +16,10 @@
-
+
{% for service in services %}
-
+
{% if service.logo %} {{ service.category }}
-
+
{% if service.description %}

{{ service.description|urlize }}

{% endif %}
- diff --git a/src/servala/frontend/templates/frontend/profile.html b/src/servala/frontend/templates/frontend/profile.html index dc12100..b9c1799 100644 --- a/src/servala/frontend/templates/frontend/profile.html +++ b/src/servala/frontend/templates/frontend/profile.html @@ -116,7 +116,8 @@ {% endblocktranslate %}

- {% translate "VSHN Account Console" %} diff --git a/src/servala/frontend/templates/includes/message.html b/src/servala/frontend/templates/includes/message.html index 59260d2..3125da1 100644 --- a/src/servala/frontend/templates/includes/message.html +++ b/src/servala/frontend/templates/includes/message.html @@ -1,28 +1,29 @@ -
+
{{ message }}
- \ No newline at end of file + document.addEventListener('DOMContentLoaded', function() { + const alert = document.getElementById('auto-dismiss-alert-{{ forloop.counter0|default:' + 0 ' }}'); + if (alert) { + setTimeout(function() { + let opacity = 1; + const fadeOutInterval = setInterval(function() { + if (opacity > 0.05) { + opacity -= 0.05; + alert.style.opacity = opacity; + } else { + clearInterval(fadeOutInterval); + const bsAlert = new bootstrap.Alert(alert); + bsAlert.close(); + } + }, 25); + }, 5000); + } + }); + diff --git a/src/servala/frontend/views/support.py b/src/servala/frontend/views/support.py index a5de757..9181c1e 100644 --- a/src/servala/frontend/views/support.py +++ b/src/servala/frontend/views/support.py @@ -51,7 +51,8 @@ class SupportView(OrganizationViewMixin, FormView): self.request, mark_safe( _( - 'There was an error submitting your support request. Please try again or contact us directly at servala-support@vshn.ch.' + "There was an error submitting your support request. " + "Please try again or contact us directly at servala-support@vshn.ch." ) ), ) diff --git a/src/servala/static/css/servala.css b/src/servala/static/css/servala.css index db9052a..ee4c080 100644 --- a/src/servala/static/css/servala.css +++ b/src/servala/static/css/servala.css @@ -174,3 +174,21 @@ a.btn-keycloak { margin-top: -16px; padding-right: 28px; } + +/* Service cards equal height styling */ +.service-cards-container .card { + height: 100%; + display: flex; + flex-direction: column; +} + +.service-cards-container .card-body { + flex-grow: 1; + display: flex; + flex-direction: column; + justify-content: flex-start; +} + +.service-cards-container .card-footer { + margin-top: auto; +}