diff options
5 files changed, 97 insertions, 73 deletions
diff --git a/.zuul.d/tempest-and-integrated.yaml b/.zuul.d/tempest-and-integrated.yaml index 5457094ee..df2e9b52a 100644 --- a/.zuul.d/tempest-and-integrated.yaml +++ b/.zuul.d/tempest-and-integrated.yaml @@ -35,7 +35,6 @@ required-projects: &base_required_projects - name: openstack/horizon - name: openstack/tempest - - name: openstack/tempest-horizon irrelevant-files: &base_irrelevant_files - ^.*\.rst$ - ^doc/.*$ @@ -56,9 +55,7 @@ horizon: true tempest: true tempest_concurrency: 2 - tempest_test_regex: horizon - tempest_plugins: - - tempest-horizon + tempest_test_regex: test_dashboard_basic_ops tox_envlist: all - job: diff --git a/horizon/static/framework/util/navigations/navigations.service.js b/horizon/static/framework/util/navigations/navigations.service.js index 8da8746c0..5d7a3571f 100644 --- a/horizon/static/framework/util/navigations/navigations.service.js +++ b/horizon/static/framework/util/navigations/navigations.service.js @@ -25,6 +25,7 @@ collapseAllNavigation: collapseAllNavigation, expandNavigationByUrl: expandNavigationByUrl, setBreadcrumb: setBreadcrumb, + setAbsoluteURI: setAbsoluteURI, isNavigationExists: isNavigationExists }; @@ -107,6 +108,14 @@ }); } + /* set absolute uri */ + function setAbsoluteURI(webroot, url) { + if (webroot.endsWith("/") && url.startsWith("/")) { + webroot = webroot.slice(0, -1); + } + return webroot + url; + } + /* check whether navigation exists from url */ function isNavigationExists(url) { return angular.element("a.openstack-panel[href='" + url + "']").length ? true : false; diff --git a/horizon/static/framework/util/navigations/navigations.service.spec.js b/horizon/static/framework/util/navigations/navigations.service.spec.js index 8a83a6430..6e4e51d2a 100644 --- a/horizon/static/framework/util/navigations/navigations.service.spec.js +++ b/horizon/static/framework/util/navigations/navigations.service.spec.js @@ -160,6 +160,13 @@ }); }); + describe('setAbsoluteURI', function() { + it('sets absolute uri', function() { + var url = service.setAbsoluteURI('/dashboard/', '/project/images/'); + expect(url).toBe('/dashboard/project/images/'); + }); + }); + describe('isNavigationExists', function() { it('returns true if navigation for specified URL exists', function() { var result = service.isNavigationExists('/project/images/'); diff --git a/horizon/static/framework/widgets/details/routed-details-view.controller.js b/horizon/static/framework/widgets/details/routed-details-view.controller.js index 739dc5d7e..cea3e4102 100644 --- a/horizon/static/framework/widgets/details/routed-details-view.controller.js +++ b/horizon/static/framework/widgets/details/routed-details-view.controller.js @@ -28,7 +28,8 @@ 'horizon.framework.widgets.modal-wait-spinner.service', '$location', '$q', - '$routeParams' + '$routeParams', + '$window' ]; function controller( @@ -39,7 +40,8 @@ spinnerService, $location, $q, - $routeParams + $routeParams, + $window ) { var ctrl = this; @@ -69,6 +71,9 @@ // get defaultIndexUrl var url = resourceType.getDefaultIndexUrl(); + // add webroot + var webroot = $window.WEBROOT; + url = navigationsService.setAbsoluteURI(webroot, url); // if querystring has 'nav' parameter, overwrite the url var query = $location.search(); if (query.hasOwnProperty("nav")) { diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers.html b/openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers.html index 329f11419..34194763a 100644 --- a/openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers.html +++ b/openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers.html @@ -13,76 +13,82 @@ <div class="col-xs-12"> <hz-magic-search-context filter-facets="cc.filterFacets"> <hz-magic-search-bar></hz-magic-search-bar> - </hz-magic-search-context> - <uib-accordion class="hz-container-accordion" ng-if="cc.model.containers.length > 0"> - <div uib-accordion-group ng-repeat="container in cc.model.containers" - ng-class="{'panel-primary': container.name === cc.model.container.name}" - class="panel-default" - ng-click="cc.selectContainer(container)"> - <uib-accordion-heading> - <div ng-click="cc.selectContainer(container)"> - <span class="hz-container-title truncate" - uib-tooltip="{$ container.name $}" - uib-tooltip-placement="top" - uib-tooltip-popup-delay="1000" - uib-tooltip-trigger="mouseenter"> - {$ container.name $} - </span> - <span uib-tooltip="{$ 'Delete Container' | translate $}" - uib-tooltip-placement="top" - uib-tooltip-trigger="mouseenter" - class="fa fa-trash hz-container-delete-icon" - ng-if="container.name === cc.model.container.name" - ng-click="cc.deleteContainer(container)"></span> - </div> - </uib-accordion-heading> - <div ng-if="!container.is_fetched" class="horizon-loading-bar container-pending-bar"> - <div class="progress progress-striped active"> - <div class="progress-bar"></div> + <uib-accordion + st-magic-search + st-table="cc.model.containers" + class="hz-container-accordion" + ng-if="cc.model.containers.length > 0"> + <div uib-accordion-group ng-repeat="container in cc.model.containers" + ng-class="{'panel-primary': container.name === cc.model.container.name}" + class="panel-default" + ng-click="cc.selectContainer(container)"> + <uib-accordion-heading> + <div ng-click="cc.selectContainer(container)"> + <span class="hz-container-title truncate" + uib-tooltip="{$ container.name $}" + uib-tooltip-placement="top" + uib-tooltip-popup-delay="1000" + uib-tooltip-trigger="mouseenter"> + {$ container.name $} + </span> + <span uib-tooltip="{$ 'Delete Container' | translate $}" + uib-tooltip-placement="top" + uib-tooltip-trigger="mouseenter" + class="fa fa-trash hz-container-delete-icon" + ng-if="container.name === cc.model.container.name" + ng-click="cc.deleteContainer(container)"> + </span> + </div> + </uib-accordion-heading> + + <div ng-if="!container.is_fetched" class="horizon-loading-bar container-pending-bar"> + <div class="progress progress-striped active"> + <div class="progress-bar"></div> + </div> </div> + <ul ng-if="container.is_fetched" class="hz-object-detail list-unstyled"> + <li class="hz-object-count row"> + <span class="hz-object-label col-lg-7 col-md-12" translate>Object Count</span> + <span class="hz-object-val col-lg-5 col-md-12">{$ container.count $}</span> + </li> + <li class="hz-object-size row"> + <span class="hz-object-label col-lg-7 col-md-12" translate>Size</span> + <span class="hz-object-val col-lg-5 col-md-12">{$ container.bytes | bytes $}</span> + </li> + <li class="hz-object-timestamp row"> + <span class="hz-object-label col-lg-7 col-md-12" translate>Date Created</span> + <span class="hz-object-val col-lg-5 col-md-12">{$ container.timestamp | date $}</span> + </li> + <li ng-if="container.storage_policy.display_name" class="hz-object-policy row"> + <span class="hz-object-label col-lg-7 col-md-12" translate>Storage Policy</span> + <span class="hz-object-val col-lg-5 col-md-12">{$ container.storage_policy.display_name $}</span> + <span class="hz-object-val col-lg-offset-7 col-lg-5 col-md-12">({$ container.storage_policy.name $})</span> + </li> + <li ng-if="!container.storage_policy.display_name" class="hz-object-policy row"> + <span class="hz-object-label col-lg-7 col-md-12" translate>Storage Policy</span> + <span class="hz-object-val col-lg-5 col-md-12">{$ container.storage_policy.name $}</span> + </li> + <li class="hz-object-link row"> + <div class="themable-checkbox col-lg-7 col-md-12"> + <input type="checkbox" id="id_access" ng-model="container.is_public" + ng-if="container.name === cc.model.container.name" + ng-click="cc.toggleAccess(container)"> + <label class="hz-object-label" for="id_access" translate>Public Access</label> + </div> + <span class="hz-object-val col-lg-5 col-md-12"> + <a href="{$ container.public_url $}" target="_blank" + ng-show="container.public_url" translate>Link</a> + <span ng-hide="container.public_url" translate>Disabled</span> + </span> + </li> + </ul> </div> - <ul ng-if="container.is_fetched" class="hz-object-detail list-unstyled"> - <li class="hz-object-count row"> - <span class="hz-object-label col-lg-7 col-md-12" translate>Object Count</span> - <span class="hz-object-val col-lg-5 col-md-12">{$ container.count $}</span> - </li> - <li class="hz-object-size row"> - <span class="hz-object-label col-lg-7 col-md-12" translate>Size</span> - <span class="hz-object-val col-lg-5 col-md-12">{$ container.bytes | bytes $}</span> - </li> - <li class="hz-object-timestamp row"> - <span class="hz-object-label col-lg-7 col-md-12" translate>Date Created</span> - <span class="hz-object-val col-lg-5 col-md-12">{$ container.timestamp | date $}</span> - </li> - <li ng-if="container.storage_policy.display_name" class="hz-object-policy row"> - <span class="hz-object-label col-lg-7 col-md-12" translate>Storage Policy</span> - <span class="hz-object-val col-lg-5 col-md-12">{$ container.storage_policy.display_name $}</span> - <span class="hz-object-val col-lg-offset-7 col-lg-5 col-md-12">({$ container.storage_policy.name $})</span> - </li> - <li ng-if="!container.storage_policy.display_name" class="hz-object-policy row"> - <span class="hz-object-label col-lg-7 col-md-12" translate>Storage Policy</span> - <span class="hz-object-val col-lg-5 col-md-12">{$ container.storage_policy.name $}</span> - </li> - <li class="hz-object-link row"> - <div class="themable-checkbox col-lg-7 col-md-12"> - <input type="checkbox" id="id_access" ng-model="container.is_public" - ng-if="container.name === cc.model.container.name" - ng-click="cc.toggleAccess(container)"> - <label class="hz-object-label" for="id_access" translate>Public Access</label> - </div> - <span class="hz-object-val col-lg-5 col-md-12"> - <a href="{$ container.public_url $}" target="_blank" - ng-show="container.public_url" translate>Link</a> - <span ng-hide="container.public_url" translate>Disabled</span> - </span> - </li> - </ul> - </div uib-accordion-group> - </uib-accordion> - <div class="col-xs-12" ng-if="cc.model.containers.length == 0"> - <p><translate>No items to display.</translate></p> - </div> + </uib-accordion> + <div class="col-xs-12" ng-if="cc.model.containers.length == 0"> + <p><translate>No items to display.</translate></p> + </div> + </hz-magic-search-context> </div> </div> </div> |