From d5b24d7b9760a68072cfed390c66a9433b415275 Mon Sep 17 00:00:00 2001 From: Rob Cresswell Date: Fri, 19 Feb 2016 15:29:10 +0000 Subject: [PATCH] Use breadcrumb nav across Horizon We've added breadcrumbs to the Details pages, but its a pretty inconsistent experience. This patch adds breadcrumbs to the base template, making the breadcrumbs consistent across all pages; this will be useful when the side nav is hidden for responsive design. This patch also makes the breadcrumbs on the detail pages behave better with theming. - Made the detail header and actions avoid using floats - Moved breadcrumb truncating to the front end, so that it can be customised easily via CSS - Manually added breadcrumb for ngcontainers page - Removed overly specific HTML check from Key Pair Details test - Fixed
alignment on Key Pair Details page Closes-Bug: 1554812 Partially-Implements: blueprint navigation-improvements Change-Id: Ibcd4c369b5d8ad62f7c839c0deeaefc750677b40 --- horizon/templates/bootstrap/breadcrumb.html | 15 ++++++ .../horizon/common/_breadcrumb_nav.html | 26 ---------- horizon/templates/horizon/common/_detail.html | 5 +- .../horizon/common/_detail_header.html | 16 +++++++ horizon/templatetags/breadcrumb_nav.py | 47 ++++++++++++++++--- .../templates/hypervisors/detail.html | 5 +- .../dashboards/admin/hypervisors/views.py | 2 - .../volume_encryption_type_detail.html | 6 +-- .../projects/templates/projects/detail.html | 5 +- .../users/templates/users/detail.html | 5 +- .../access_and_security/keypairs/tests.py | 4 -- .../access_and_security/keypairs/detail.html | 8 ++-- .../security_groups/detail.html | 6 +-- .../templates/containers/ngindex.html | 8 ++++ .../dashboards/project/firewalls/views.py | 4 -- .../dashboards/project/loadbalancers/views.py | 3 -- .../project/networks/ports/views.py | 1 - .../project/networks/subnets/views.py | 1 - .../networks/templates/networks/detail.html | 6 +-- .../volumes/volumes/encryption_detail.html | 6 +-- .../project/volumes/volumes/tests.py | 4 +- .../static/dashboard/scss/_variables.scss | 3 ++ .../scss/components/_breadcrumbs.scss | 9 ++++ .../static/dashboard/scss/horizon.scss | 1 + openstack_dashboard/templates/base.html | 6 +++ .../themes/default/bootstrap/_variables.scss | 4 +- .../default/bootstrap/components/_type.scss | 1 - .../themes/default/horizon/_styles.scss | 1 - .../components/_breadcrumb_header.scss | 10 ---- ...igation-improvements-ab101299eb1a8d54.yaml | 10 ++++ 30 files changed, 128 insertions(+), 100 deletions(-) create mode 100644 horizon/templates/bootstrap/breadcrumb.html delete mode 100644 horizon/templates/horizon/common/_breadcrumb_nav.html create mode 100644 horizon/templates/horizon/common/_detail_header.html create mode 100644 openstack_dashboard/static/dashboard/scss/components/_breadcrumbs.scss delete mode 100644 openstack_dashboard/themes/default/horizon/components/_breadcrumb_header.scss create mode 100644 releasenotes/notes/bp/navigation-improvements-ab101299eb1a8d54.yaml diff --git a/horizon/templates/bootstrap/breadcrumb.html b/horizon/templates/bootstrap/breadcrumb.html new file mode 100644 index 0000000000..b1bc2f3671 --- /dev/null +++ b/horizon/templates/bootstrap/breadcrumb.html @@ -0,0 +1,15 @@ +{% spaceless %} + +{% endspaceless %} diff --git a/horizon/templates/horizon/common/_breadcrumb_nav.html b/horizon/templates/horizon/common/_breadcrumb_nav.html deleted file mode 100644 index a46e427651..0000000000 --- a/horizon/templates/horizon/common/_breadcrumb_nav.html +++ /dev/null @@ -1,26 +0,0 @@ -{% load truncate_filter %} - - diff --git a/horizon/templates/horizon/common/_detail.html b/horizon/templates/horizon/common/_detail.html index 272cb68895..5a7c4d322f 100644 --- a/horizon/templates/horizon/common/_detail.html +++ b/horizon/templates/horizon/common/_detail.html @@ -1,15 +1,12 @@ {% extends 'base.html' %} {% load i18n %} -{% load breadcrumb_nav %} {% block title %} {{ page_title }} {% endblock %} {% block page_header %} - + {% include 'horizon/common/_detail_header.html' %} {% endblock %} {% block main %} diff --git a/horizon/templates/horizon/common/_detail_header.html b/horizon/templates/horizon/common/_detail_header.html new file mode 100644 index 0000000000..0ea67d05d6 --- /dev/null +++ b/horizon/templates/horizon/common/_detail_header.html @@ -0,0 +1,16 @@ + diff --git a/horizon/templatetags/breadcrumb_nav.py b/horizon/templatetags/breadcrumb_nav.py index 4d2bfcb4bb..f2cacb389b 100644 --- a/horizon/templatetags/breadcrumb_nav.py +++ b/horizon/templatetags/breadcrumb_nav.py @@ -1,4 +1,4 @@ -# Copyright 2015 Cisco Systems, Inc. +# Copyright 2016 Cisco Systems, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain @@ -17,11 +17,44 @@ from django import template register = template.Library() -@register.inclusion_tag('horizon/common/_breadcrumb_nav.html', +@register.inclusion_tag('bootstrap/breadcrumb.html', takes_context=True) def breadcrumb_nav(context): - return {'actions': context.get('actions'), - 'breadcrumb': context.get('custom_breadcrumb'), - 'url': context.get('url'), - 'page_title': context['page_title'], - 'panel': context.request.horizon['panel'], } + """A logic heavy function for automagically creating a breadcrumb. + It uses the dashboard, panel group(if it exists), then current panel. + Can also use a "custom_breadcrumb" context item to add extra items. + """ + breadcrumb = [] + dashboard = context.request.horizon['dashboard'] + try: + panel_groups = dashboard.get_panel_groups() + except KeyError: + panel_groups = None + panel_group = None + panel = context.request.horizon['panel'] + + # Add panel group, if there is one + if panel_groups: + for group in panel_groups.values(): + if panel.slug in group.panels and group.slug != 'default': + panel_group = group + break + + # Remove panel reference if that is the current page + if panel.get_absolute_url() == context.request.path: + panel = None + + # Get custom breadcrumb, if there is one. + custom_breadcrumb = context.get('custom_breadcrumb') + + # Build list of tuples (name, optional url) + breadcrumb.append((dashboard.name,)) + if panel_group: + breadcrumb.append((panel_group.name,)) + if panel: + breadcrumb.append((panel.name, panel.get_absolute_url())) + if custom_breadcrumb: + breadcrumb.extend(custom_breadcrumb) + breadcrumb.append((context.get('page_title'),)) + + return {'breadcrumb': breadcrumb} diff --git a/openstack_dashboard/dashboards/admin/hypervisors/templates/hypervisors/detail.html b/openstack_dashboard/dashboards/admin/hypervisors/templates/hypervisors/detail.html index c32d742e97..e84b0b0ae5 100644 --- a/openstack_dashboard/dashboards/admin/hypervisors/templates/hypervisors/detail.html +++ b/openstack_dashboard/dashboards/admin/hypervisors/templates/hypervisors/detail.html @@ -1,12 +1,9 @@ {% extends 'base.html' %} {% load i18n %} -{% load breadcrumb_nav %} {% block title %}{% trans "Hypervisor Servers" %}{% endblock %} {% block page_header %} - + {% include "horizon/common/_detail_header.html" %} {% endblock %} {% block main %} diff --git a/openstack_dashboard/dashboards/admin/hypervisors/views.py b/openstack_dashboard/dashboards/admin/hypervisors/views.py index 0db5f625b2..55c210c885 100644 --- a/openstack_dashboard/dashboards/admin/hypervisors/views.py +++ b/openstack_dashboard/dashboards/admin/hypervisors/views.py @@ -12,7 +12,6 @@ # License for the specific language governing permissions and limitations # under the License. -from django.core.urlresolvers import reverse from django.utils.translation import ugettext_lazy as _ from horizon import exceptions @@ -69,7 +68,6 @@ class AdminDetailView(tables.DataTableView): context = super(AdminDetailView, self).get_context_data(**kwargs) hypervisor_name = self.kwargs['hypervisor'].split('_', 1)[1] breadcrumb = [ - (_("Hypervisors"), reverse('horizon:admin:hypervisors:index')), (hypervisor_name,), ] context['custom_breadcrumb'] = breadcrumb return context diff --git a/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/volume_encryption_type_detail.html b/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/volume_encryption_type_detail.html index ab4912e15b..cd4e53c4e9 100644 --- a/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/volume_encryption_type_detail.html +++ b/openstack_dashboard/dashboards/admin/volumes/templates/volumes/volume_types/volume_encryption_type_detail.html @@ -1,11 +1,9 @@ {% extends 'base.html' %} -{% load i18n breadcrumb_nav %} +{% load i18n %} {% block title %}{% trans "Volume Type Encryption Details" %}{% endblock %} {% block page_header %} - + {% include "horizon/common/_detail_header.html" %} {% endblock %} {% block main %} diff --git a/openstack_dashboard/dashboards/identity/projects/templates/projects/detail.html b/openstack_dashboard/dashboards/identity/projects/templates/projects/detail.html index 968a22a0a9..c038697642 100644 --- a/openstack_dashboard/dashboards/identity/projects/templates/projects/detail.html +++ b/openstack_dashboard/dashboards/identity/projects/templates/projects/detail.html @@ -1,13 +1,10 @@ {% extends 'base.html' %} {% load i18n %} -{% load breadcrumb_nav %} {% block title %}{% trans "Project Details" %}{% endblock %} {% block page_header %} - + {% include "horizon/common/_detail_header.html" %} {% endblock %} {% block main %} diff --git a/openstack_dashboard/dashboards/identity/users/templates/users/detail.html b/openstack_dashboard/dashboards/identity/users/templates/users/detail.html index eee3ed5c69..43019f1475 100644 --- a/openstack_dashboard/dashboards/identity/users/templates/users/detail.html +++ b/openstack_dashboard/dashboards/identity/users/templates/users/detail.html @@ -1,13 +1,10 @@ {% extends 'base.html' %} {% load i18n %} -{% load breadcrumb_nav %} {% block title %}{% trans "User Details" %}{% endblock %} {% block page_header %} - + {% include "horizon/common/_detail_header.html" %} {% endblock %} {% block main %} diff --git a/openstack_dashboard/dashboards/project/access_and_security/keypairs/tests.py b/openstack_dashboard/dashboards/project/access_and_security/keypairs/tests.py index 1b8c743887..5668568063 100644 --- a/openstack_dashboard/dashboards/project/access_and_security/keypairs/tests.py +++ b/openstack_dashboard/dashboards/project/access_and_security/keypairs/tests.py @@ -116,10 +116,6 @@ class KeyPairViewTests(test.TestCase): url = reverse('horizon:project:access_and_security:keypairs:detail', kwargs={'keypair_name': keypair.name}) res = self.client.get(url, context) - - # Note(Itxaka): With breadcrumbs, the title is in a list as active - self.assertContains(res, '
  • Key Pair Details
  • ', - 1, 200) self.assertContains(res, "
    %s
    " % keypair.name, 1, 200) @test.create_stubs({api.nova: ("keypair_create", "keypair_delete")}) diff --git a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/detail.html b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/detail.html index 21c4615632..0fa36db261 100644 --- a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/detail.html +++ b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/keypairs/detail.html @@ -1,15 +1,14 @@ {% extends 'base.html' %} -{% load i18n sizeformat breadcrumb_nav %} +{% load i18n sizeformat %} {% block title %}{% trans "Key Pair Details" %}{% endblock %} {% block page_header %} - + {% include "horizon/common/_detail_header.html" %} {% endblock %} {% block main %} +
    {% trans "Name" %}
    {{ keypair.name|default:_("None") }}
    @@ -28,4 +27,5 @@
    {{ keypair.public_key|default:_("None") }}
    +
    {% endblock %} diff --git a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/detail.html b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/detail.html index c52a6881f3..f2c0656a3c 100644 --- a/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/detail.html +++ b/openstack_dashboard/dashboards/project/access_and_security/templates/access_and_security/security_groups/detail.html @@ -1,12 +1,10 @@ {% extends 'base.html' %} -{% load i18n breadcrumb_nav %} +{% load i18n %} {% block title %}{% trans "Manage Security Group Rules" %}{% endblock %} {% block page_header %} - + {% include "horizon/common/_detail_header.html" %} {% endblock %} {% block main %} diff --git a/openstack_dashboard/dashboards/project/containers/templates/containers/ngindex.html b/openstack_dashboard/dashboards/project/containers/templates/containers/ngindex.html index f2dad0fef2..de1eac7a26 100644 --- a/openstack_dashboard/dashboards/project/containers/templates/containers/ngindex.html +++ b/openstack_dashboard/dashboards/project/containers/templates/containers/ngindex.html @@ -2,6 +2,14 @@ {% load i18n %} {% block title %}{% trans "Containers" %}{% endblock %} +{% block breadcrumb_nav %} + +{% endblock %} + {% block ng_route_base %} {% endblock %} diff --git a/openstack_dashboard/dashboards/project/firewalls/views.py b/openstack_dashboard/dashboards/project/firewalls/views.py index a06925f17f..71334bbfa4 100644 --- a/openstack_dashboard/dashboards/project/firewalls/views.py +++ b/openstack_dashboard/dashboards/project/firewalls/views.py @@ -90,8 +90,6 @@ class RuleDetailsView(tabs.TabView): rule = self.get_data() table = fw_tabs.RulesTable(self.request) breadcrumb = [ - (_("Firewalls"), - reverse_lazy('horizon:project:firewalls:firewalls')), (_("Rules"), reverse_lazy('horizon:project:firewalls:rules'))] context["custom_breadcrumb"] = breadcrumb context["rule"] = rule @@ -126,8 +124,6 @@ class PolicyDetailsView(tabs.TabView): policy = self.get_data() table = fw_tabs.PoliciesTable(self.request) breadcrumb = [ - (_("Firewalls"), - reverse_lazy('horizon:project:firewalls:firewalls')), (_("Policies"), reverse_lazy('horizon:project:firewalls:policies'))] context["custom_breadcrumb"] = breadcrumb diff --git a/openstack_dashboard/dashboards/project/loadbalancers/views.py b/openstack_dashboard/dashboards/project/loadbalancers/views.py index 32fae5100d..30e552a4d8 100644 --- a/openstack_dashboard/dashboards/project/loadbalancers/views.py +++ b/openstack_dashboard/dashboards/project/loadbalancers/views.py @@ -136,7 +136,6 @@ class VipDetailsView(tabs.TabView): context['vip'] = vip vip_nav = vip.pool.name_or_id breadcrumb = [ - (_("Load Balancers"), self.get_redirect_url()), (vip_nav, reverse('horizon:project:loadbalancers:vipdetails', args=(vip.id,))), @@ -173,7 +172,6 @@ class MemberDetailsView(tabs.TabView): context['member'] = member member_nav = member.pool.name_or_id breadcrumb = [ - (_("Load Balancers"), self.get_redirect_url()), (member_nav, reverse('horizon:project:loadbalancers:pooldetails', args=(member.pool.id,))), @@ -213,7 +211,6 @@ class MonitorDetailsView(tabs.TabView): monitor = self.get_data() context['monitor'] = monitor breadcrumb = [ - (_("Load Balancers"), self.get_redirect_url()), (_("Monitors"), reverse('horizon:project:loadbalancers:monitors')), ] context["custom_breadcrumb"] = breadcrumb diff --git a/openstack_dashboard/dashboards/project/networks/ports/views.py b/openstack_dashboard/dashboards/project/networks/ports/views.py index 61107bed1e..e270979777 100644 --- a/openstack_dashboard/dashboards/project/networks/ports/views.py +++ b/openstack_dashboard/dashboards/project/networks/ports/views.py @@ -89,7 +89,6 @@ class DetailView(tabs.TabView): network_id=port.network_id) # TODO(robcresswell) Add URL for "Ports" crumb after bug/1416838 breadcrumb = [ - (_("Networks"), self.get_redirect_url()), ((port.network_name or port.network_id), port.network_url), (_("Ports"),), ] context["custom_breadcrumb"] = breadcrumb diff --git a/openstack_dashboard/dashboards/project/networks/subnets/views.py b/openstack_dashboard/dashboards/project/networks/subnets/views.py index 3df07f81bb..2307a207db 100644 --- a/openstack_dashboard/dashboards/project/networks/subnets/views.py +++ b/openstack_dashboard/dashboards/project/networks/subnets/views.py @@ -158,7 +158,6 @@ class DetailView(tabs.TabView): network_id=subnet.network_id) # TODO(robcresswell) Add URL for "Subnets" crumb after bug/1416838 breadcrumb = [ - (_("Networks"), self.get_redirect_url()), (network_nav, subnet.network_url), (_("Subnets"),), ] context["custom_breadcrumb"] = breadcrumb diff --git a/openstack_dashboard/dashboards/project/networks/templates/networks/detail.html b/openstack_dashboard/dashboards/project/networks/templates/networks/detail.html index 9e42f48e98..c02e1f5800 100644 --- a/openstack_dashboard/dashboards/project/networks/templates/networks/detail.html +++ b/openstack_dashboard/dashboards/project/networks/templates/networks/detail.html @@ -1,11 +1,9 @@ {% extends 'base.html' %} -{% load i18n breadcrumb_nav %} +{% load i18n %} {% block title %}{% trans "Network Details"%}{% endblock %} {% block page_header %} - + {% include "horizon/common/_detail_header.html" %} {% endblock %} {% block main %} diff --git a/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/encryption_detail.html b/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/encryption_detail.html index 253125d198..5881a4afcd 100644 --- a/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/encryption_detail.html +++ b/openstack_dashboard/dashboards/project/volumes/templates/volumes/volumes/encryption_detail.html @@ -1,11 +1,9 @@ {% extends 'base.html' %} -{% load i18n breadcrumb_nav %} +{% load i18n %} {% block title %}{% trans "Volume Encryption Details" %}{% endblock %} {% block page_header %} - + {% include "horizon/common/_detail_header.html" %} {% endblock %} {% block main %} diff --git a/openstack_dashboard/dashboards/project/volumes/volumes/tests.py b/openstack_dashboard/dashboards/project/volumes/volumes/tests.py index 0402e152eb..9873960757 100644 --- a/openstack_dashboard/dashboards/project/volumes/volumes/tests.py +++ b/openstack_dashboard/dashboards/project/volumes/volumes/tests.py @@ -1273,7 +1273,7 @@ class VolumeViewTests(test.TestCase): self.assertContains(res, "Volume Encryption Details: %s" % volume.name, - 1, 200) + 2, 200) self.assertContains(res, "
    %s
    " % volume.volume_type, 1, 200) self.assertContains(res, "
    %s
    " % enc_meta.provider, 1, 200) self.assertContains(res, "
    %s
    " % enc_meta.control_location, 1, @@ -1301,7 +1301,7 @@ class VolumeViewTests(test.TestCase): self.assertContains(res, "Volume Encryption Details: %s" % volume.name, - 1, 200) + 2, 200) self.assertContains(res, "

    Volume is Unencrypted

    ", 1, 200) self.assertNoMessages() diff --git a/openstack_dashboard/static/dashboard/scss/_variables.scss b/openstack_dashboard/static/dashboard/scss/_variables.scss index e87ba33617..c2921cc256 100644 --- a/openstack_dashboard/static/dashboard/scss/_variables.scss +++ b/openstack_dashboard/static/dashboard/scss/_variables.scss @@ -76,3 +76,6 @@ $members-list-roles-width: 125px !default; // https://github.com/twbs/bootstrap/issues/13443 $dropdown-item-padding-vertical: 3px; $dropdown-item-padding-horizontal: 20px; + +// This defines the max-width for a breadcrumb item before it will be truncated +$breadcrumb-item-width: 15em !default; diff --git a/openstack_dashboard/static/dashboard/scss/components/_breadcrumbs.scss b/openstack_dashboard/static/dashboard/scss/components/_breadcrumbs.scss new file mode 100644 index 0000000000..44e79a49ba --- /dev/null +++ b/openstack_dashboard/static/dashboard/scss/components/_breadcrumbs.scss @@ -0,0 +1,9 @@ +.breadcrumb { + margin-top: $line-height-computed; + + .breadcrumb-item-truncate { + @include text-overflow(); + vertical-align: middle; + max-width: $breadcrumb-item-width; + } +} diff --git a/openstack_dashboard/static/dashboard/scss/horizon.scss b/openstack_dashboard/static/dashboard/scss/horizon.scss index b1b68fb117..5776d1f645 100644 --- a/openstack_dashboard/static/dashboard/scss/horizon.scss +++ b/openstack_dashboard/static/dashboard/scss/horizon.scss @@ -16,6 +16,7 @@ // Dashboard Components @import "components/bar_charts"; +@import "components/breadcrumbs"; @import "components/charts"; @import "components/checkboxes"; @import "components/datepicker"; diff --git a/openstack_dashboard/templates/base.html b/openstack_dashboard/templates/base.html index 75dafc864c..65e6d84ee3 100644 --- a/openstack_dashboard/templates/base.html +++ b/openstack_dashboard/templates/base.html @@ -1,5 +1,7 @@ {% load branding i18n %} {% load context_selection %} +{% load breadcrumb_nav %} + @@ -36,6 +38,10 @@
    + {% block breadcrumb_nav %} + {% breadcrumb_nav %} + {% endblock %} + {% block page_header %} {% include "horizon/common/_page_header.html" with title=page_title %} {% endblock %} diff --git a/openstack_dashboard/themes/default/bootstrap/_variables.scss b/openstack_dashboard/themes/default/bootstrap/_variables.scss index 43df247c7c..eee39f974b 100644 --- a/openstack_dashboard/themes/default/bootstrap/_variables.scss +++ b/openstack_dashboard/themes/default/bootstrap/_variables.scss @@ -772,9 +772,9 @@ $badge-border-radius: 10px !default; //## $breadcrumb-padding-vertical: 8px !default; -$breadcrumb-padding-horizontal: 10px !default; +$breadcrumb-padding-horizontal: 15px !default; //** Breadcrumb background color -$breadcrumb-bg: $body-bg !default; +$breadcrumb-bg: #f5f5f5 !default; //** Breadcrumb text color $breadcrumb-color: $gray !default; //** Text color of current page in the breadcrumb diff --git a/openstack_dashboard/themes/default/bootstrap/components/_type.scss b/openstack_dashboard/themes/default/bootstrap/components/_type.scss index 0c85313591..dafdb53c20 100644 --- a/openstack_dashboard/themes/default/bootstrap/components/_type.scss +++ b/openstack_dashboard/themes/default/bootstrap/components/_type.scss @@ -1,5 +1,4 @@ .page-header { border-bottom: 0; - margin: 0; padding: 0; } diff --git a/openstack_dashboard/themes/default/horizon/_styles.scss b/openstack_dashboard/themes/default/horizon/_styles.scss index c5702eae88..343a9637dd 100644 --- a/openstack_dashboard/themes/default/horizon/_styles.scss +++ b/openstack_dashboard/themes/default/horizon/_styles.scss @@ -1,6 +1,5 @@ @import "/bootstrap/scss/bootstrap/mixins/_vendor-prefixes.scss"; -@import "components/breadcrumb_header"; @import "components/context_selection"; @import "components/login"; @import "components/messages"; diff --git a/openstack_dashboard/themes/default/horizon/components/_breadcrumb_header.scss b/openstack_dashboard/themes/default/horizon/components/_breadcrumb_header.scss deleted file mode 100644 index 58798e4914..0000000000 --- a/openstack_dashboard/themes/default/horizon/components/_breadcrumb_header.scss +++ /dev/null @@ -1,10 +0,0 @@ -/* Breadcrumb used as a header in the details pages */ -.page-header > .breadcrumb { - font-size: $font-size-h3; - margin-bottom: 0; - padding: 8px 0px; - - .actions_column { - padding: 0; - } -} diff --git a/releasenotes/notes/bp/navigation-improvements-ab101299eb1a8d54.yaml b/releasenotes/notes/bp/navigation-improvements-ab101299eb1a8d54.yaml new file mode 100644 index 0000000000..57cd98fc68 --- /dev/null +++ b/releasenotes/notes/bp/navigation-improvements-ab101299eb1a8d54.yaml @@ -0,0 +1,10 @@ +--- +features: + - > + [`blueprint navigation-improvements `_] Breadcrumb navigation has been added across Horizon. + +upgrade: + - The breadcrumb navigation inside the details pages now applies across + Horizon. A small change in the logic means that ``custom_breadcrumb`` + items in the context no longer need to specify the panel name and link. + See [`blueprint navigation-improvements `_]