diff --git a/app/images/logo-origin-thin.svg b/app/images/logo-origin-thin.svg index fe5e643830..bc491d34fe 100644 --- a/app/images/logo-origin-thin.svg +++ b/app/images/logo-origin-thin.svg @@ -1,11 +1,33 @@ - - - - logo-origin-thin - Created with Sketch. - - - - - - \ No newline at end of file + + + + +logo-origin-thin + + + + + diff --git a/app/index.html b/app/index.html index 43cfa28412..757186ce64 100644 --- a/app/index.html +++ b/app/index.html @@ -1,5 +1,5 @@ - + @@ -35,29 +35,18 @@ - + - +

Technology preview is enabled

+ - -
- - -
-
-
+
+
+
+
diff --git a/app/scripts/constants.js b/app/scripts/constants.js index eb1db4f3a5..87f6862d99 100644 --- a/app/scripts/constants.js +++ b/app/scripts/constants.js @@ -216,10 +216,16 @@ angular.extend(window.OPENSHIFT_CONSTANTS, { label: "Deployments", href: "/browse/deployments", prefixes: [ + "/add-config-volume", + "/attach-pvc", "/browse/deployment/", "/browse/dc/", "/browse/rs/", - "/browse/rc/" + "/browse/rc/", + "/edit/autoscaler", + "/edit/dc/", + "/edit/health-checks", + "/set-limits" ] }, { @@ -247,7 +253,9 @@ angular.extend(window.OPENSHIFT_CONSTANTS, { label: "Routes", href: "/browse/routes", prefixes: [ - "/browse/routes/" + "/browse/routes/", + "/create-route", + "/edit/routes/" ] } ] @@ -265,14 +273,16 @@ angular.extend(window.OPENSHIFT_CONSTANTS, { href: "/browse/builds", prefixes: [ "/browse/builds/", - "/browse/builds-noconfig/" + "/browse/builds-noconfig/", + "/edit/builds/" ] }, { label: "Pipelines", href: "/browse/pipelines", prefixes: [ - "/browse/pipelines/" + "/browse/pipelines/", + "/edit/pipelines/" ] }, { @@ -309,14 +319,17 @@ angular.extend(window.OPENSHIFT_CONSTANTS, { label: "Config Maps", href: "/browse/config-maps", prefixes: [ - "/browse/config-maps/" + "/browse/config-maps/", + "/create-config-map", + "/edit/config-maps/" ] }, { label: "Secrets", href: "/browse/secrets", prefixes: [ - "/browse/secrets/" + "/browse/secrets/", + "/create-secret" ], canI: { resource: 'secrets', @@ -336,7 +349,8 @@ angular.extend(window.OPENSHIFT_CONSTANTS, { iconClass: "pficon pficon-container-node", href: "/browse/storage", prefixes: [ - "/browse/storage/" + "/browse/storage/", + "/create-pvc" ] }, { diff --git a/app/scripts/controllers/addConfigVolume.js b/app/scripts/controllers/addConfigVolume.js index a89b01b578..fa8e7cc74f 100644 --- a/app/scripts/controllers/addConfigVolume.js +++ b/app/scripts/controllers/addConfigVolume.js @@ -59,8 +59,7 @@ angular.module('openshiftConsole') name: $routeParams.name, kind: $routeParams.kind, namespace: $routeParams.project, - subpage: 'Add Config Files', - includeProject: true + subpage: 'Add Config Files' }); var humanizeKind = $filter('humanizeKind'); @@ -130,8 +129,7 @@ angular.module('openshiftConsole') $scope.breadcrumbs = BreadcrumbsService.getBreadcrumbs({ object: object, project: project, - subpage: 'Add Config Files', - includeProject: true + subpage: 'Add Config Files' }); }, function(e) { diff --git a/app/scripts/controllers/attachPVC.js b/app/scripts/controllers/attachPVC.js index 7f2f1f1aea..bc47f3b745 100644 --- a/app/scripts/controllers/attachPVC.js +++ b/app/scripts/controllers/attachPVC.js @@ -64,8 +64,7 @@ angular.module('openshiftConsole') name: $routeParams.name, kind: $routeParams.kind, namespace: $routeParams.project, - subpage: 'Add Storage', - includeProject: true + subpage: 'Add Storage' }); ProjectsService @@ -73,9 +72,6 @@ angular.module('openshiftConsole') .then(_.spread(function(project, context) { $scope.project = project; - // Update project breadcrumb with display name. - $scope.breadcrumbs[0].title = $filter('displayName')(project); - if (!AuthorizationService.canI(resourceGroupVersion, 'update', $routeParams.project)) { Navigate.toErrorPage('You do not have authority to update ' + humanizeKind($routeParams.kind) + ' ' + $routeParams.name + '.', 'access_denied'); @@ -126,8 +122,7 @@ angular.module('openshiftConsole') $scope.breadcrumbs = BreadcrumbsService.getBreadcrumbs({ object: resource, project: project, - subpage: 'Add Storage', - includeProject: true + subpage: 'Add Storage' }); var podTemplate = _.get(resource, 'spec.template'); $scope.existingVolumeNames = StorageService.getVolumeNames(podTemplate); diff --git a/app/scripts/controllers/create.js b/app/scripts/controllers/create.js index ba303c1531..4381a3af0f 100644 --- a/app/scripts/controllers/create.js +++ b/app/scripts/controllers/create.js @@ -27,10 +27,6 @@ angular.module('openshiftConsole') $scope.alerts = $scope.alerts || {}; $scope.breadcrumbs = [ - { - title: $scope.projectName, - link: "project/" + $scope.projectName - }, { title: "Add to Project" } @@ -41,8 +37,6 @@ angular.module('openshiftConsole') .then(_.spread(function(project, context) { $scope.project = project; $scope.context = context; - // Update project breadcrumb with display name. - $scope.breadcrumbs[0].title = $filter('displayName')(project); // List image streams and templates in the both the shared `openshift` // namespace and the project namespace. diff --git a/app/scripts/controllers/create/browseCategory.js b/app/scripts/controllers/create/browseCategory.js index 848411a840..bbe07e1ba8 100644 --- a/app/scripts/controllers/create/browseCategory.js +++ b/app/scripts/controllers/create/browseCategory.js @@ -60,10 +60,6 @@ angular.module('openshiftConsole') $scope.alerts = $scope.alerts || {}; $scope.breadcrumbs = [ - { - title: $scope.projectName, - link: "project/" + $scope.projectName - }, { title: "Add to Project", link: "project/" + $scope.projectName + "/create" @@ -90,8 +86,6 @@ angular.module('openshiftConsole') .then(_.spread(function(project, context) { $scope.project = project; $scope.context = context; - // Update project breadcrumb with display name. - $scope.breadcrumbs[0].title = $filter('displayName')(project); // List image streams and templates in the both the shared `openshift` // namespace and the project namespace. diff --git a/app/scripts/controllers/create/createFromImage.js b/app/scripts/controllers/create/createFromImage.js index 3ecc477fdf..19782f4be3 100644 --- a/app/scripts/controllers/create/createFromImage.js +++ b/app/scripts/controllers/create/createFromImage.js @@ -45,10 +45,6 @@ angular.module("openshiftConsole") $scope.displayName = $routeParams.displayName; $scope.advancedOptions = $routeParams.advanced === 'true'; $scope.breadcrumbs = [ - { - title: $scope.projectName, - link: "project/" + $scope.projectName - }, { title: "Add to Project", link: "project/" + $scope.projectName + "/create" @@ -83,8 +79,6 @@ angular.module("openshiftConsole") .get($routeParams.project) .then(_.spread(function(project, context) { $scope.project = project; - // Update project breadcrumb with display name. - $scope.breadcrumbs[0].title = $filter('displayName')(project); if($routeParams.sourceURI) { $scope.sourceURIinParams = true; } diff --git a/app/scripts/controllers/create/nextSteps.js b/app/scripts/controllers/create/nextSteps.js index 546c8ded9e..032bd7124b 100644 --- a/app/scripts/controllers/create/nextSteps.js +++ b/app/scripts/controllers/create/nextSteps.js @@ -35,10 +35,6 @@ angular.module("openshiftConsole") $scope.fromSampleRepo = $routeParams.fromSample; $scope.breadcrumbs = [ - { - title: $scope.projectName, - link: "project/" + $scope.projectName - }, { title: "Add to Project", link: "project/" + $scope.projectName + "/create" @@ -56,8 +52,6 @@ angular.module("openshiftConsole") .get($routeParams.project) .then(_.spread(function(project, context) { $scope.project = project; - // Update project breadcrumb with display name. - $scope.breadcrumbs[0].title = $filter('displayName')(project); watches.push(DataService.watch("buildconfigs", context, function(buildconfigs) { $scope.buildConfigs = buildconfigs.by("metadata.name"); $scope.createdBuildConfig = $scope.buildConfigs[$routeParams.name]; diff --git a/app/scripts/controllers/createConfigMap.js b/app/scripts/controllers/createConfigMap.js index 8fc3669f9a..51f582eb1c 100644 --- a/app/scripts/controllers/createConfigMap.js +++ b/app/scripts/controllers/createConfigMap.js @@ -22,10 +22,6 @@ angular.module('openshiftConsole') // TODO: Update BreadcrumbsService to handle create pages. $scope.breadcrumbs = [ - { - title: $scope.projectName, - link: "project/" + $scope.projectName - }, { title: "Config Maps", link: "project/" + $scope.projectName + "/browse/config-maps" @@ -49,8 +45,6 @@ angular.module('openshiftConsole') .get($routeParams.project) .then(_.spread(function(project, context) { $scope.project = project; - // Update project breadcrumb with display name. - $scope.breadcrumbs[0].title = $filter('displayName')(project); if (!AuthorizationService.canI('configmaps', 'create', $routeParams.project)) { Navigate.toErrorPage('You do not have authority to create config maps in project ' + $routeParams.project + '.', 'access_denied'); diff --git a/app/scripts/controllers/createPersistentVolumeClaim.js b/app/scripts/controllers/createPersistentVolumeClaim.js index a86848fc50..1f3246d6cc 100644 --- a/app/scripts/controllers/createPersistentVolumeClaim.js +++ b/app/scripts/controllers/createPersistentVolumeClaim.js @@ -25,10 +25,6 @@ angular.module('openshiftConsole') $scope.claim = {}; $scope.breadcrumbs = [ - { - title: $scope.projectName, - link: "project/" + $scope.projectName - }, { title: "Storage", link: "project/" + $scope.projectName + "/browse/storage" @@ -52,8 +48,6 @@ angular.module('openshiftConsole') .get($routeParams.project) .then(_.spread(function(project, context) { $scope.project = project; - // Update project breadcrumb with display name. - $scope.breadcrumbs[0].title = $filter('displayName')(project); if (!AuthorizationService.canI('persistentvolumeclaims', 'create', $routeParams.project)) { Navigate.toErrorPage('You do not have authority to create persistent volume claims in project ' + $routeParams.project + '.', 'access_denied'); diff --git a/app/scripts/controllers/createRoute.js b/app/scripts/controllers/createRoute.js index 90583da6a3..a839c1db3c 100644 --- a/app/scripts/controllers/createRoute.js +++ b/app/scripts/controllers/createRoute.js @@ -33,10 +33,6 @@ angular.module('openshiftConsole') }; $scope.breadcrumbs = [ - { - title: $scope.projectName, - link: "project/" + $scope.projectName - }, { title: "Routes", link: "project/" + $scope.projectName + "/browse/routes" @@ -60,8 +56,6 @@ angular.module('openshiftConsole') .get($routeParams.project) .then(_.spread(function(project, context) { $scope.project = project; - // Update project breadcrumb with display name. - $scope.breadcrumbs[0].title = $filter('displayName')(project); if (!AuthorizationService.canI('routes', 'create', $routeParams.project)) { Navigate.toErrorPage('You do not have authority to create routes in project ' + $routeParams.project + '.', 'access_denied'); diff --git a/app/scripts/controllers/createSecret.js b/app/scripts/controllers/createSecret.js index 006bfef2cb..2d60e95859 100644 --- a/app/scripts/controllers/createSecret.js +++ b/app/scripts/controllers/createSecret.js @@ -23,10 +23,6 @@ angular.module('openshiftConsole') $scope.projectName = $routeParams.project; $scope.breadcrumbs = [ - { - title: $scope.projectName, - link: "project/" + $scope.projectName - }, { title: "Secrets", link: "project/" + $scope.projectName + "/browse/secrets" @@ -41,7 +37,6 @@ angular.module('openshiftConsole') .then(_.spread(function(project, context) { $scope.project = project; $scope.context = context; - $scope.breadcrumbs[0].title = $filter('displayName')(project); if (!AuthorizationService.canI('secrets', 'create', $routeParams.project)) { Navigate.toErrorPage('You do not have authority to create secrets in project ' + $routeParams.project + '.', 'access_denied'); diff --git a/app/scripts/controllers/edit/autoscaler.js b/app/scripts/controllers/edit/autoscaler.js index 5605c88868..5b405a5dfa 100644 --- a/app/scripts/controllers/edit/autoscaler.js +++ b/app/scripts/controllers/edit/autoscaler.js @@ -211,15 +211,13 @@ angular.module('openshiftConsole') kind: $scope.targetKind, namespace: $routeParams.project, project: project, - subpage: 'Autoscale', - includeProject: true + subpage: 'Autoscale' }); } else { $scope.breadcrumbs = BreadcrumbsService.getBreadcrumbs({ object: resource, project: project, - subpage: 'Autoscale', - includeProject: true + subpage: 'Autoscale' }); // Create a new HPA. diff --git a/app/scripts/controllers/edit/buildConfig.js b/app/scripts/controllers/edit/buildConfig.js index 3ef26e3d77..785a21375e 100644 --- a/app/scripts/controllers/edit/buildConfig.js +++ b/app/scripts/controllers/edit/buildConfig.js @@ -59,12 +59,7 @@ angular.module('openshiftConsole') advancedOptions: false, hasHooks: false }; - $scope.breadcrumbs = [ - { - title: $routeParams.project, - link: "project/" + $routeParams.project - } - ]; + $scope.breadcrumbs = []; if ($routeParams.isPipeline) { $scope.breadcrumbs.push({ @@ -253,8 +248,6 @@ angular.module('openshiftConsole') .then(_.spread(function(project, context) { $scope.project = project; $scope.context = context; - // Update project breadcrumb with display name. - $scope.breadcrumbs[0].title = $filter('displayName')(project); if (!AuthorizationService.canI('buildconfigs', 'update', $routeParams.project)) { Navigate.toErrorPage('You do not have authority to update build config ' + diff --git a/app/scripts/controllers/edit/configMap.js b/app/scripts/controllers/edit/configMap.js index 6caba8a479..2a5223f9a1 100644 --- a/app/scripts/controllers/edit/configMap.js +++ b/app/scripts/controllers/edit/configMap.js @@ -26,7 +26,6 @@ angular.module('openshiftConsole') name: $routeParams.configMap, kind: 'ConfigMap', namespace: $routeParams.project, - includeProject: true, subpage: 'Edit Config Map' }); @@ -53,7 +52,6 @@ angular.module('openshiftConsole') $scope.breadcrumbs = BreadcrumbsService.getBreadcrumbs({ name: $routeParams.configMap, object: configMap, - includeProject: true, project: project, subpage: 'Edit Config Map' }); diff --git a/app/scripts/controllers/edit/deploymentConfig.js b/app/scripts/controllers/edit/deploymentConfig.js index 99eb01f359..506be375dc 100644 --- a/app/scripts/controllers/edit/deploymentConfig.js +++ b/app/scripts/controllers/edit/deploymentConfig.js @@ -35,8 +35,7 @@ angular.module('openshiftConsole') name: $routeParams.name, kind: $routeParams.kind, namespace: $routeParams.project, - subpage: 'Edit Deployment Config', - includeProject: true + subpage: 'Edit Deployment Config' }); $scope.deploymentConfigStrategyTypes = [ @@ -96,8 +95,7 @@ angular.module('openshiftConsole') $scope.breadcrumbs = BreadcrumbsService.getBreadcrumbs({ object: deploymentConfig, project: project, - subpage: 'Edit', - includeProject: true + subpage: 'Edit' }); // Create map which will associate concatiner name to container's data(envVar, trigger and image which will be used on manual deployment) diff --git a/app/scripts/controllers/edit/healthChecks.js b/app/scripts/controllers/edit/healthChecks.js index 20f035d5f2..300bb02aa8 100644 --- a/app/scripts/controllers/edit/healthChecks.js +++ b/app/scripts/controllers/edit/healthChecks.js @@ -44,8 +44,7 @@ angular.module('openshiftConsole') name: $routeParams.name, kind: $routeParams.kind, namespace: $routeParams.project, - subpage: 'Edit Health Checks', - includeProject: true + subpage: 'Edit Health Checks' }); // Map of removed probes so that removing and adding back a probe remembers what was previously set. @@ -94,8 +93,7 @@ angular.module('openshiftConsole') $scope.breadcrumbs = BreadcrumbsService.getBreadcrumbs({ object: object, project: project, - subpage: 'Edit Health Checks', - includeProject: true + subpage: 'Edit Health Checks' }); $scope.containers = _.get(object, 'spec.template.spec.containers'); diff --git a/app/scripts/controllers/edit/route.js b/app/scripts/controllers/edit/route.js index 7b697d5cd2..385b1ae569 100644 --- a/app/scripts/controllers/edit/route.js +++ b/app/scripts/controllers/edit/route.js @@ -28,9 +28,6 @@ angular.module('openshiftConsole') $scope.routeURL = Navigate.resourceURL($scope.routeName, "Route", $scope.projectName); $scope.breadcrumbs = [{ - title: $scope.projectName, - link: 'project/' + $scope.projectName - }, { title: 'Routes', link: 'project/' + $scope.projectName + '/browse/routes' }, { @@ -54,8 +51,6 @@ angular.module('openshiftConsole') .get($routeParams.project) .then(_.spread(function(project, context) { $scope.project = project; - // Update project breadcrumb with display name. - $scope.breadcrumbs[0].title = $filter('displayName')(project); if (!AuthorizationService.canI('routes', 'update', $routeParams.project)) { Navigate.toErrorPage('You do not have authority to update route ' + $routeParams.routeName + '.', 'access_denied'); diff --git a/app/scripts/controllers/edit/yaml.js b/app/scripts/controllers/edit/yaml.js index 819bc0e338..832a27e091 100644 --- a/app/scripts/controllers/edit/yaml.js +++ b/app/scripts/controllers/edit/yaml.js @@ -30,9 +30,6 @@ angular.module('openshiftConsole') $scope.name = $routeParams.name; $scope.resourceURL = Navigate.resourceURL($scope.name, $routeParams.kind, $routeParams.project); $scope.breadcrumbs = [{ - title: $routeParams.project, - link: "project/" + $routeParams.project - }, { title: $routeParams.name, // If returnURL is unspecified, the breadcrumbs directive defaults to back. link: $routeParams.returnURL diff --git a/app/scripts/controllers/newfromtemplate.js b/app/scripts/controllers/newfromtemplate.js index fda5a8dc4f..ee13502de3 100644 --- a/app/scripts/controllers/newfromtemplate.js +++ b/app/scripts/controllers/newfromtemplate.js @@ -35,10 +35,6 @@ angular.module('openshiftConsole') } $scope.breadcrumbs = [ - { - title: $routeParams.project, - link: "project/" + $routeParams.project - }, { title: "Add to Project", link: "project/" + $routeParams.project + "/create" @@ -52,7 +48,6 @@ angular.module('openshiftConsole') } ]; - var displayName = $filter('displayName'); var getValidTemplateParamsMap = function() { try { return JSON.parse($routeParams.templateParamsMap); @@ -181,8 +176,6 @@ angular.module('openshiftConsole') .get($routeParams.project) .then(_.spread(function(project) { $scope.project = project; - // Update project breadcrumb with display name. - $scope.breadcrumbs[0].title = displayName(project); // Missing namespace indicates that the template should be received from from the 'CachedTemplateService'. // Otherwise get it via GET call. @@ -202,7 +195,7 @@ angular.module('openshiftConsole') DataService.get("templates", name, {namespace: (namespace || $scope.project.metadata.name)}).then( function(template) { $scope.template = template; - $scope.breadcrumbs[3].title = $filter('displayName')(template); + $scope.breadcrumbs[2].title = $filter('displayName')(template); findTemplateImages(template); var imageUsesParameters = function(image) { return !_.isEmpty(image.usesParameters); diff --git a/app/scripts/controllers/overview.js b/app/scripts/controllers/overview.js index c973a5d6a1..cad81fbc9b 100644 --- a/app/scripts/controllers/overview.js +++ b/app/scripts/controllers/overview.js @@ -1374,7 +1374,7 @@ function OverviewController($scope, $scope.$on('$destroy', function() { DataService.unwatchAll(watches); - $(window).off('resize.overview', onResize); + $(window).off('.overview'); }); })); } diff --git a/app/scripts/controllers/setLimits.js b/app/scripts/controllers/setLimits.js index 1339865f56..b623f4ce4e 100644 --- a/app/scripts/controllers/setLimits.js +++ b/app/scripts/controllers/setLimits.js @@ -55,8 +55,7 @@ angular.module('openshiftConsole') name: $routeParams.name, kind: $routeParams.kind, namespace: $routeParams.project, - subpage: 'Edit Resource Limits', - includeProject: true + subpage: 'Edit Resource Limits' }); var getErrorDetails = $filter('getErrorDetails'); @@ -84,8 +83,6 @@ angular.module('openshiftConsole') ProjectsService .get($routeParams.project) .then(_.spread(function(project, context) { - // Update project breadcrumb with display name. - $scope.breadcrumbs[0].title = $filter('displayName')(project); var resourceGroupVersion = { resource: APIService.kindToResource($routeParams.kind), @@ -104,8 +101,7 @@ angular.module('openshiftConsole') $scope.breadcrumbs = BreadcrumbsService.getBreadcrumbs({ object: object, project: project, - subpage: 'Edit Resource Limits', - includeProject: true + subpage: 'Edit Resource Limits' }); $scope.resourceURL = Navigate.resourceURL(object); $scope.containers = _.get(object, 'spec.template.spec.containers'); diff --git a/app/scripts/directives/logViewer.js b/app/scripts/directives/logViewer.js index 9edbb565ed..b7b8de2248 100644 --- a/app/scripts/directives/logViewer.js +++ b/app/scripts/directives/logViewer.js @@ -27,8 +27,7 @@ angular.module('openshiftConsole') DataService, HTMLService, ModalsService, - logLinks, - BREAKPOINTS) { + logLinks) { // cache the jQuery win, but not clobber angular's $window var $win = $(window); @@ -78,9 +77,7 @@ angular.module('openshiftConsole') // cached node's are set by the directive's postLink fn after render (see link: func below) // A jQuery wrapped version is cached in var of same name w/$ var cachedLogNode; - var cachedScrollableNode; - var $cachedScrollableNode; - var scrollableDOMNode; + var scrollableNode; var $affixableNode; var html = document.documentElement; $scope.logViewerID = _.uniqueId('log-viewer'); @@ -96,16 +93,6 @@ angular.module('openshiftConsole') name = $scope.object.metadata.name; } - // are we going to scroll the window, or the DOM node? - var detectScrollableNode = function() { - if(window.innerWidth < BREAKPOINTS.screenSmMin && !$scope.fixedHeight) { - scrollableDOMNode = null; - } else { - scrollableDOMNode = cachedScrollableNode; - } - }; - - // is just toggling show/hide, nothing else. var updateScrollLinksVisibility = function() { @@ -141,42 +128,25 @@ angular.module('openshiftConsole') var attachScrollEvents = function() { - // always clear all scroll listeners before reattaching - $cachedScrollableNode.off('scroll', onScroll); - $win.off('scroll', onScroll); - - // only add the appropriate event - if(window.innerWidth <= BREAKPOINTS.screenSmMin && !$scope.fixedHeight) { - $win.on('scroll', onScroll); + if(scrollableNode) { + $(scrollableNode).on('scroll', onScroll); } else { - $cachedScrollableNode.on('scroll', onScroll); + $win.on('scroll', onScroll); } }; - // TODO: resize event breaks the affix, even with this if/else. - // however, on first load of either mobile or non this works fine. var affix = function() { // don't affix for a fixed height scroll window if ($scope.fixedHeight) { return; } - if(window.innerWidth < BREAKPOINTS.screenSmMin && !$scope.fixedHeight) { - $affixableNode - .affix({ - target: window, - offset: { - top: $scope.followAffixTop || 0 // 390 - } - }); - } else { - $affixableNode - .affix({ - target: $cachedScrollableNode, - offset: { - top: $scope.followAffixTop || 0 // 390 - } - }); - } + $affixableNode + .affix({ + target: window, + offset: { + top: $scope.followAffixTop || 0 // 390 + } + }); }; var getLogOutputElement = function() { @@ -243,11 +213,7 @@ angular.module('openshiftConsole') // roll up & debounce the various fns to call on resize var onResize = _.debounce(function() { fillHeight(true); - // update scroll handlers - detectScrollableNode(); - attachScrollEvents(); updateScrollLinksVisibility(); // toggles show/hide - affix(); // toggle off the follow behavior if the user resizes the window onScroll(); }, 100); @@ -263,7 +229,7 @@ angular.module('openshiftConsole') // Tell the scroll listener this is an auto-scroll. The listener // will reset it to false. autoScrollingNow = true; - logLinks.scrollBottom(scrollableDOMNode); + logLinks.scrollBottom(scrollableNode); }; @@ -471,11 +437,8 @@ angular.module('openshiftConsole') // PUBLIC API ---------------------------------------------------- - // scrollable node is a parent div#container-main, but may be window - // if we are currently mobile this.cacheScrollableNode = function(node) { - cachedScrollableNode = node; - $cachedScrollableNode = $(cachedScrollableNode); + scrollableNode = node; }; this.cacheLogNode = function(node) { @@ -487,7 +450,6 @@ angular.module('openshiftConsole') }; this.start = function() { - detectScrollableNode(); attachScrollEvents(); affix(); }; @@ -500,11 +462,11 @@ angular.module('openshiftConsole') autoScrollActive: true, state: false, // show nothing initially to avoid flicker onScrollBottom: function() { - logLinks.scrollBottom(scrollableDOMNode); + logLinks.scrollBottom(scrollableNode); }, onScrollTop: function() { $scope.autoScrollActive = false; - logLinks.scrollTop(scrollableDOMNode); + logLinks.scrollTop(scrollableNode); $('#' + $scope.logViewerID + '-affixedFollow').affix('checkPosition'); }, toggleAutoScroll: toggleAutoScroll, @@ -521,7 +483,9 @@ angular.module('openshiftConsole') // clean up all the listeners $win.off('resize', onResize); $win.off('scroll', onScroll); - $cachedScrollableNode.off('scroll', onScroll); + if (scrollableNode) { + $(scrollableNode).off('scroll', onScroll); + } }); @@ -543,7 +507,9 @@ angular.module('openshiftConsole') // would be better if 'scrollable' was a directive on a parent div // and we were sending it messages telling it when to scroll. $timeout(function() { - ctrl.cacheScrollableNode(document.getElementById($scope.fixedHeight ? ($scope.logViewerID + '-fixed-scrollable') : 'container-main')); + if ($scope.fixedHeight) { + ctrl.cacheScrollableNode(document.getElementById($scope.logViewerID + '-fixed-scrollable')); + } ctrl.cacheLogNode(document.getElementById($scope.logViewerID+'-logContent')); ctrl.cacheAffixable(document.getElementById($scope.logViewerID+'-affixedFollow')); ctrl.start(); diff --git a/app/scripts/directives/nav.js b/app/scripts/directives/nav.js index bdc5c03de7..15efa31720 100644 --- a/app/scripts/directives/nav.js +++ b/app/scripts/directives/nav.js @@ -1,38 +1,64 @@ 'use strict'; angular.module('openshiftConsole') - .directive('sidebar', function($location, $filter, Constants) { - var canI = $filter('canI'); + .directive('sidebar', + function( + $location, + $filter, + $timeout, + $rootScope, + AuthorizationService, + Constants, + HTMLService) { var itemMatchesPath = function(item, path) { return (item.href === path) || _.some(item.prefixes, function(prefix) { - return _.startsWith(path, prefix); - }); + return _.startsWith(path, prefix); + }); }; return { restrict: 'E', templateUrl: 'views/_sidebar.html', controller: function($scope) { - var path = $location.path().replace("/project/" + $scope.projectName, ""); - $scope.activeSecondary; + var path; + var hoverDelay = 300; + var hideDelay = hoverDelay + 200; + $scope.navItems = Constants.PROJECT_NAVIGATION; - $scope.activePrimary = _.find($scope.navItems, function(primaryItem) { - if (itemMatchesPath(primaryItem, path)) { - $scope.activeSecondary = null; - return true; - } + $scope.sidebar = {}; - // Check if there is a secondary nav item that is active - return _.some(primaryItem.secondaryNavSections, function(secondarySection) { - var activeSecondary = _.find(secondarySection.items, function(secondaryItem) { - return itemMatchesPath(secondaryItem, path); - }); - if (activeSecondary) { - $scope.activeSecondary = activeSecondary; + var updateActive = function() { + _.set($scope, 'sidebar.secondaryOpen', false); + _.set($rootScope, 'nav.showMobileNav', false); + $scope.activeSecondary = null; + $scope.activePrimary = _.find($scope.navItems, function(primaryItem) { + path = $location.path().replace("/project/" + $scope.projectName, ""); + if (itemMatchesPath(primaryItem, path)) { + $scope.activeSecondary = null; return true; } - return false; + + // Check if there is a secondary nav item that is active + return _.some(primaryItem.secondaryNavSections, function(secondarySection) { + var activeSecondary = _.find(secondarySection.items, function(secondaryItem) { + return itemMatchesPath(secondaryItem, path); + }); + if (activeSecondary) { + $scope.activeSecondary = activeSecondary; + return true; + } + return false; + }); }); - }); + }; + updateActive(); + + $scope.$on('$routeChangeSuccess', updateActive); + + var clearHover = function() { + _.each($scope.navItems, function(navItem) { + navItem.isHover = false; + }); + }; $scope.navURL = function(href) { if (!href) { @@ -49,16 +75,124 @@ angular.module('openshiftConsole') if(!isValid) { return false; } - var userCan = item.canI ? - canI(item.canI.resource, item.canI.verb, item.canI.group) : - true; - return userCan; + if (!item.canI) { + return true; + } + + return AuthorizationService.canI({ + resource: item.canI.resource, + group: item.canI.group + }, item.canI.verb, $scope.projectName); + }; + + $scope.itemClicked = function(primaryItem) { + if (primaryItem.href) { + // Make sure any secondary nav closes if a primary item with an + // href was activated using the keyboard. + $scope.nav.showMobileNav = false; + $scope.sidebar.secondaryOpen = false; + return; + } + + // Remove `isHover` from any of the items if another primary item was + // activated using the keyboard. + clearHover(); + + // Open the item regardless of whether the mouse is really over it + // for keyboard and screen reader accessibility. + primaryItem.isHover = true; + primaryItem.mobileSecondary = $scope.isMobile; + $scope.sidebar.showMobileSecondary = $scope.isMobile; + $scope.sidebar.secondaryOpen = true; + }; + + $scope.onMouseEnter = function(primaryItem) { + if (_.isEmpty(primaryItem.secondaryNavSections)) { + return; + } + + if (primaryItem.mouseLeaveTimeout) { + $timeout.cancel(primaryItem.mouseLeaveTimeout); + primaryItem.mouseLeaveTimeout = null; + } + + primaryItem.mouseEnterTimeout = $timeout(function() { + primaryItem.isHover = true; + primaryItem.mouseEnterTimeout = null; + $scope.sidebar.secondaryOpen = true; + }, hoverDelay); }; + + $scope.onMouseLeave = function(primaryItem) { + if (_.isEmpty(primaryItem.secondaryNavSections)) { + return; + } + + if (primaryItem.mouseEnterTimeout) { + $timeout.cancel(primaryItem.mouseEnterTimeout); + primaryItem.mouseEnterTimeout = null; + } + + primaryItem.mouseLeaveTimeout = $timeout(function() { + primaryItem.isHover = false; + primaryItem.mouseLeaveTimeout = null; + $scope.sidebar.secondaryOpen = _.some($scope.navItems, function(primaryItem) { + return primaryItem.isHover && !_.isEmpty(primaryItem.secondaryNavSections); + }); + }, hideDelay); + }; + + $scope.closeNav = function() { + clearHover(); + $scope.nav.showMobileNav = false; + $scope.sidebar.secondaryOpen = false; + }; + + $scope.collapseMobileSecondary = function(primaryItem, event) { + primaryItem.mobileSecondary = false; + event.stopPropagation(); + }; + + var checkMobile = function() { + return HTMLService.isWindowBelowBreakpoint(HTMLService.WINDOW_SIZE_SM); + }; + + $scope.isMobile = checkMobile(); + + var onResize = _.throttle(function() { + var isMobile = checkMobile(); + if (isMobile !== $scope.isMobile) { + $scope.$evalAsync(function() { + $scope.isMobile = isMobile; + if (!isMobile) { + _.set($rootScope, 'nav.showMobileNav', false); + _.each($scope.navItems, function(primaryItem) { + primaryItem.mobileSecondary = false; + }); + } + }); + } + }, 50); + $(window).on('resize.verticalnav', onResize); + + $scope.$on('$destroy', function() { + $(window).off('.verticalnav'); + }); } }; }) - .directive('projectHeader', function($timeout, $location, $filter, ProjectsService, projectOverviewURLFilter, Constants) { + .directive('oscHeader', + function( + $filter, + $location, + $rootScope, + $routeParams, + $timeout, + AuthorizationService, + Constants, + ProjectsService, + projectOverviewURLFilter) { // cache these to eliminate flicker var projects = {}; @@ -69,13 +203,54 @@ angular.module('openshiftConsole') return { restrict: 'EA', - templateUrl: 'views/directives/header/project-header.html', + templateUrl: 'views/directives/header/header.html', link: function($scope, $elem) { var MAX_PROJETS_TO_DISPLAY = 100; + var NAV_COLLAPSED_STORAGE_KEY = 'openshift/vertical-nav-collapsed'; + $scope.currentProject = projects[ $routeParams.project ]; + + var setCollapsed = function(collapsed, updateSavedState) { + var storageValue; + _.set($rootScope, 'nav.collapsed', collapsed); + + if (updateSavedState) { + storageValue = collapsed ? 'true' : 'false'; + localStorage.setItem(NAV_COLLAPSED_STORAGE_KEY, storageValue); + } + }; + + var readSavedCollapsedState = function() { + var savedState = localStorage.getItem(NAV_COLLAPSED_STORAGE_KEY) === 'true'; + setCollapsed(savedState); + }; + readSavedCollapsedState(); + + var isCollapsed = function() { + return _.get($rootScope, 'nav.collapsed', false); + }; + + var setMobileNavVisible = function(visible) { + _.set($rootScope, 'nav.showMobileNav', visible); + }; + + $scope.toggleNav = function() { + var collapsed = isCollapsed(); + setCollapsed(!collapsed, true); + }; + + $scope.toggleMobileNav = function() { + var showMobileNav = _.get($rootScope, 'nav.showMobileNav'); + setMobileNavVisible(!showMobileNav); + }; + + $scope.closeMobileNav = function() { + setMobileNavVisible(false); + }; $scope.closeOrderingPanel = function() { _.set($scope, 'ordering.panelName', ""); }; + $scope.showOrderingPanel = function(panelName) { _.set($scope, 'ordering.panelName', panelName); }; @@ -85,32 +260,9 @@ angular.module('openshiftConsole') var options = []; var updateOptions = function() { - var project = $scope.project || {}; - $scope.context = { - namespace: $scope.projectName - }; var name = $scope.projectName; - var isRealProject = project.metadata && project.metadata.name; - - // If we don't have a name or a real project, nothing to do yet. - if (!name && !isRealProject) { - return; - } - if (!name) { - name = project.metadata.name; - } - - if (!isRealProject) { - project = { - metadata: { - name: name - } - }; - } - - if(!projects[name]) { - projects[name] = project; + return; } var makeOption = function(project, skipUniqueCheck) { @@ -145,13 +297,46 @@ angular.module('openshiftConsole') select.selectpicker('refresh'); }; + var updateProjects = function() { + return ProjectsService.list().then(function(items) { + projects = items.by("metadata.name"); + }); + }; - ProjectsService.list().then(function(items) { - projects = items.by("metadata.name"); - updateOptions(); - }); + $scope.$on('$routeChangeSuccess', function() { + var projectName = $routeParams.project; + if ($scope.projectName === projectName) { + // The project hasn't changed. + return; + } - updateOptions(); + $scope.projectName = projectName; + $scope.chromeless = $routeParams.view === "chromeless"; + + if (projectName && !$scope.chromeless) { + _.set($rootScope, 'view.hasProject', true); + // Check if the user can add to project after switching projects. + // Assume false until the request completes. + $scope.canIAddToProject = false; + // Make sure we have project rules before we check canIAddToProject or we get the wrong value. + AuthorizationService.getProjectRules(projectName).then(function() { + // Make sure the user hasn't switched projects while the request was still in flight. + if ($scope.projectName !== projectName) { + return; + } + + $scope.canIAddToProject = AuthorizationService.canIAddToProject(projectName); + }); + + updateProjects().then(function() { + $scope.projectName = projectName; + $scope.currentProject = _.get(projects, [ projectName ]); + updateOptions(); + }); + } else { + _.set($rootScope, 'view.hasProject', false); + } + }); select .selectpicker({ @@ -165,12 +350,6 @@ angular.module('openshiftConsole') $location.url(newURL); }); }); - - $scope.$on('project.settings.update', function(event, data) { - projects[data.metadata.name] = data; - updateOptions(); - }); - } }; }) @@ -188,13 +367,6 @@ angular.module('openshiftConsole') } }; }) - .directive('projectPage', function() { - return { - restrict: 'E', - transclude: true, - templateUrl: 'views/_project-page.html' - }; - }) .directive('navbarUtility', function() { return { restrict: 'E', @@ -205,18 +377,63 @@ angular.module('openshiftConsole') } }; }) - .directive('navbarUtilityMobile', function() { - return { - restrict: 'E', - transclude: true, - templateUrl: 'views/directives/header/_navbar-utility-mobile.html' - }; - }) - .directive('defaultHeader', function() { + .directive('navbarUtilityMobile', function($timeout) { return { restrict: 'E', transclude: true, - templateUrl: 'views/directives/header/default-header.html' + templateUrl: 'views/directives/header/_navbar-utility-mobile.html', + link: function($scope, $element) { + $timeout(function() { + // Add necessary Patternfly classes to the elements. We need to do this + // in JavaScript to maintain compatibility with older extensions. + + // Before: + //
  • + // Dashboard + //
  • + // + // After: + //
  • + // Dashboard + //
  • + + // Add `list-group-item` to `li` elements. + var menuItems = $element.find('li'); + menuItems.addClass('list-group-item'); + + var menuItemByHref = {}; + + menuItems.each(function(i, menuItem) { + var links = $(menuItem).find('a'); + + // Remember the menu item for each link so we can set active + // styles. Assumes href is unique for each menu item. + links.each(function(j, link) { + if (link.href) { + menuItemByHref[link.href] = menuItem; + } + }); + + // Add `list-group-item-value` to the link text, but don't wrap the icons. + links.contents().filter(function() { + // Filter for non-empty text nodes (node type 3). + // https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType + return this.nodeType === 3 && $.trim(this.nodeValue).length; + }).wrap(''); + }); + + var updateActive = function() { + menuItems.removeClass('active'); + var menuItem = menuItemByHref[window.location.href]; + if (menuItem) { + $(menuItem).addClass('active'); + } + }; + + updateActive(); + $scope.$on('$routeChangeSuccess', updateActive); + }); + } }; }) // TODO: rename this :) diff --git a/app/scripts/directives/util.js b/app/scripts/directives/util.js index 61a5a74e97..dfaf1c87a0 100644 --- a/app/scripts/directives/util.js +++ b/app/scripts/directives/util.js @@ -158,9 +158,10 @@ angular.module('openshiftConsole') }); } }; - }).directive('onEnter', function(){ + }) + .directive('onEnter', function(){ return function (scope, element, attrs) { - element.bind("keydown keypress", function (event) { + element.bind("keydown keypress", function(event) { if(event.which === 13) { scope.$apply(function (){ scope.$eval(attrs.onEnter); @@ -170,6 +171,18 @@ angular.module('openshiftConsole') }); }; }) + .directive('onEsc', function(){ + return function (scope, element, attrs) { + element.bind("keydown keypress", function(event) { + if(event.which === 27) { + scope.$apply(function (){ + scope.$eval(attrs.onEsc); + }); + event.preventDefault(); + } + }); + }; + }) // To use this directive on a page you must have reloadOnSearch:false set on the route in app.js .directive('persistTabState', function($routeParams, $location) { return { diff --git a/app/scripts/extensions/nav/dropdownMobile.js b/app/scripts/extensions/nav/dropdownMobile.js index b96465a63e..99931ea455 100644 --- a/app/scripts/extensions/nav/dropdownMobile.js +++ b/app/scripts/extensions/nav/dropdownMobile.js @@ -11,9 +11,10 @@ angular.module('openshiftConsole') var liObj = { type: 'dom', node: [ - '
  • ', + '
  • ', '', - ' ' + _.escape(app.title), + ' ', + '' + _.escape(app.title) + '', '', '
  • ' ].join('') @@ -24,27 +25,27 @@ angular.module('openshiftConsole') dropdownItems = dropdownItems.concat([{ type: 'dom', node: [ - '
  • ', + '
  • ', '', - ' Documentation', + ' Documentation', '', '
  • ' ].join('') }, { type: 'dom', node: [ - '
  • ', + '
  • ', '', - ' Command Line Tools', + ' Command Line Tools', '', '
  • ' ].join('') }, { type: 'dom', node: [ - '
  • ', + '
  • ', '', - ' About', + ' About', '', '
  • ' ].join('') @@ -52,10 +53,10 @@ angular.module('openshiftConsole') { type: 'dom', node: _.template([ - '
  • ', + '
  • ', '', '', - 'Log out <%= userName %>', + 'Log out <%= userName %>', '', '
  • ' ].join(''))({userName: (user ? (user.fullName || user.metadata.name) : "") }) diff --git a/app/scripts/services/logLinks.js b/app/scripts/services/logLinks.js index d662e571bb..293da75b57 100644 --- a/app/scripts/services/logLinks.js +++ b/app/scripts/services/logLinks.js @@ -17,22 +17,13 @@ angular.module('openshiftConsole') var scrollBottom = function(node) { if(!node) { - window.scrollTo(0, document.body.scrollHeight - document.body.clientHeight); + window.scrollTo(0, document.documentElement.scrollHeight - document.documentElement.clientHeight); } else { node.scrollTop = node.scrollHeight; } }; - var scrollTo = function(anchor, event) { - // sad face. stop reloading the page!!!! - event.preventDefault(); - event.stopPropagation(); - $location.hash(anchor); - $anchorScroll(anchor); - }; - - // new tab: path/to/current?view=chromeless var chromelessLink = function(options, fullLogURL) { if (fullLogURL) { @@ -89,7 +80,6 @@ angular.module('openshiftConsole') return { scrollTop: scrollTop, scrollBottom: scrollBottom, - scrollTo: scrollTo, chromelessLink: chromelessLink, archiveUri: archiveUri }; diff --git a/app/styles/_application-launcher.less b/app/styles/_application-launcher.less index cc79ab7b41..94ad183d85 100644 --- a/app/styles/_application-launcher.less +++ b/app/styles/_application-launcher.less @@ -2,47 +2,29 @@ // Application Launcher // -------------------------------------------------- -.navbar-pf,.navbar-pf-alt { - .applauncher-pf { - .applauncher-pf-icon { - @media (min-width: @screen-sm-min) { - font-size: 16px; - } - } - .applauncher-pf-link-icon { - @media (min-width: @screen-sm-min) { - padding-right: 10px; - } +.applauncher-pf { + &.dropdown-kebab-pf .dropdown-menu { + margin-top: 0; + right: 10px; + &:before { + display: none; } } -} - -.nav.navbar-iconic .applauncher-pf .dropdown-menu { - right: 12px; -} - -.navbar-iconic { - .applauncher-pf { - - &.open > a, - &.open > a:focus { - background-color: inherit; - border-color: inherit; - } - - &.dropdown > .dropdown-toggle, - .dropdown-toggle { - @media (min-width: @screen-sm-min) { - border-left-width: 0; - padding: (@grid-gutter-width / 2); - line-height: inherit; - } + &.open > a { + &, + &:focus, + &:hover { + background: transparent; } } - - .dropdown-kebab-pf .dropdown-menu { - &:before { - border-color: transparent; + .dropdown-toggle { + color: @navbar-pf-vertical-color; + display: block; + font-size: 16px; + padding: 17px 15px 15px 12px !important; + &:focus, + &:hover { + color: @navbar-pf-vertical-active-color; } } } diff --git a/app/styles/_catalog.less b/app/styles/_catalog.less index 6031a77e03..5d5b793851 100644 --- a/app/styles/_catalog.less +++ b/app/styles/_catalog.less @@ -47,9 +47,9 @@ @media(min-width: @screen-sm-min) { .catalog-search, .landing-side-bar { - top: @navbar-os-header-height-desktop + 1; // add 1 for the bottom border + top: @navbar-os-header-height-desktop; .tech-preview & { - top: @navbar-os-header-height-desktop + 1 + @tech-preview-banner-height; // add 1 for the bottom border + top: @navbar-os-header-height-desktop + @tech-preview-banner-height; } } } diff --git a/app/styles/_core.less b/app/styles/_core.less index f76be93b20..a3c4caecc1 100644 --- a/app/styles/_core.less +++ b/app/styles/_core.less @@ -42,17 +42,6 @@ } } -.console-os { - .wrap > .container { // For projects list page - margin-top: 35px; - margin-bottom: @grid-gutter-width * 2; - h1 { - margin: 10px 0 20px; - } - } -} - - // Firefox-specific hack for preventing fieldset content causing the container to expand // see: https://stackoverflow.com/questions/17408815/fieldset-resizes-wrong-appears-to-have-unremovable-min-width-min-content/17863685#17863685 @-moz-document url-prefix() { diff --git a/app/styles/_layouts.less b/app/styles/_layouts.less new file mode 100644 index 0000000000..fc33b913d3 --- /dev/null +++ b/app/styles/_layouts.less @@ -0,0 +1,60 @@ +// +// Layouts (substructure) +// ------------------------------------ + +.header-toolbar { + background-color: @panel-light; + border-bottom: 1px solid @page-header-border-color; +} +.layout-pf.layout-pf-fixed { + height: 1px; + body { + height: 1px; + padding-top: @navbar-os-header-height-mobile; + &.tech-preview { + padding-top: (@navbar-os-header-height-mobile + @tech-preview-banner-height); + } + @media(min-width: @screen-sm-min) { + padding-top: @navbar-os-header-height-desktop; + &.tech-preview { + padding-top: (@navbar-os-header-height-desktop + @tech-preview-banner-height); + } + } + &.has-project-bar { + padding-top: (@navbar-os-header-height-mobile + @project-bar-height-mobile); + &.tech-preview { + padding-top: (@navbar-os-header-height-mobile + @project-bar-height-mobile + @tech-preview-banner-height); + } + @media(min-width: @screen-sm-min) { + padding-top: (@navbar-os-header-height-desktop + @project-bar-height-desktop); + &.tech-preview { + padding-top: (@navbar-os-header-height-desktop + @project-bar-height-desktop + @tech-preview-banner-height); + } + .container-pf-nav-pf-vertical { + margin-left: @nav-pf-vertical-width; + &.collapsed-nav { + margin-left: 75px; + } + } + } + } + } + .container-pf-nav-pf-vertical { + height: 100%; + transition: margin-left .1s ease-in-out; + &, + &.collapsed-nav { + margin-left: 0; // override PatternFly default + } + .middle-header { + margin-bottom: @grid-gutter-width / 2; + } + .view { + height: 100%; + } + } +} +.surface-shaded { + background-color: @panel-shaded; + min-height: 100%; +} diff --git a/app/styles/_log.less b/app/styles/_log.less index bd4ef32c9d..dde897b0bb 100644 --- a/app/styles/_log.less +++ b/app/styles/_log.less @@ -122,21 +122,28 @@ top: @log-scroll-offset-top; &.affix { position: fixed; - right: @log-scroll-top-offset-right-xs; + right: @log-scroll-top-offset-right; + top: (@log-scroll-offset-top + @navbar-os-header-height-mobile + @project-bar-height-mobile); @media (min-width: @screen-sm-min) { - right: @log-scroll-top-offset-right-sm; - top: (@log-scroll-offset-top + @navbar-os-header-height-desktop); - .tech-preview & { - top: (@log-scroll-offset-top + @navbar-os-header-height-desktop + @tech-preview-banner-height); - } - } - @media (min-width: @screen-md-min) { - right: @log-scroll-top-offset-right-lg; + top: (@log-scroll-offset-top + @navbar-os-header-height-desktop + @project-bar-height-desktop); } .chromeless & { right: @log-scroll-offset-right; + top: (@log-scroll-offset-top + @navbar-os-header-height-mobile); + @media (min-width: @screen-sm-min) { + top: (@log-scroll-offset-top + @navbar-os-header-height-desktop); + } + } + .tech-preview & { + top: (@log-scroll-offset-top + @navbar-os-header-height-mobile + @project-bar-height-mobile + @tech-preview-banner-height); @media (min-width: @screen-sm-min) { - right: (@log-scroll-offset-right + @scrollbar-width); + top: (@log-scroll-offset-top + @navbar-os-header-height-desktop + @project-bar-height-desktop + @tech-preview-banner-height); + } + } + .tech-preview .chromeless & { + top: (@log-scroll-offset-top + @navbar-os-header-height-mobile + @tech-preview-banner-height); + @media (min-width: @screen-sm-min) { + top: (@log-scroll-offset-top + @navbar-os-header-height-desktop + @tech-preview-banner-height); } } } diff --git a/app/styles/_navbar-alt.less b/app/styles/_navbar-alt.less deleted file mode 100644 index cd64a46093..0000000000 --- a/app/styles/_navbar-alt.less +++ /dev/null @@ -1,367 +0,0 @@ -// -// navbar-alt (top bar with project menu and utility nav) -// ------------------------------------------------------ - -#header-logo { - background-image: url('@{image-path}/logo-origin-thin.svg'); - background-repeat: no-repeat; - background-position: center left; - // Use initial logo dimensions; or set a width and/or height (eg - background-size: auto 36px) - // Max logo dimensions width 230px / height 36px - background-size: initial; - height: @navbar-os-header-height-mobile - 1; // 1px border-bottom on navbar-os-mobile - width: 230px; -} - -.navbar-pf-alt { - background: @navbar-os-bg-color; - border-bottom: 1px solid @sidebar-os-border-color; - border-left: 1px solid transparent; - border-right: 1px solid transparent; - border-top: 0; - min-height: inherit; - .layout-pf-alt-fixed & { - left: 0; - position: fixed; - right: 0; - top: 0; - z-index: @zindex-navbar-fixed; - } - .layout-pf-alt-fixed .tech-preview & { - top: @tech-preview-banner-height; - } - .navbar-toggle { - float: none; - margin: 0; - padding: 9px 14px; - @media (max-width: @screen-xxs-max) { - padding-left: 8px; - padding-right: 8px; - } - } - .navbar-header { - display: flex; - flex: 1 1 0%; - text-decoration: none; - .navbar-home { - align-items: center; - color: @sidebar-os-color; - display: flex; - flex: 1 0 0%; - font-weight: 300; - justify-content: center; - text-decoration: none; - .pficon { - color: #A8A9AA; - font-size: 20px; - } - &:hover, &:focus, &:hover .pficon, &:focus .pficon { - background-color: @navbar-os-project-menu-active-bg; - color: @navbar-os-project-menu-active-color; - } - } - } - .navbar-iconic { - margin-right: 10px; - } - .nav { - .dropdown-menu { - margin-top: -5px; - right: 0; - @media(min-width: @screen-xs-min) { - right: 5px; - } - @media(min-width: @screen-sm-min) { - margin-top: -10px; - right: 0; - } - &:after { - border: 6px solid transparent; - border-bottom-color: #fff; - border-top-width: 0; - content: ""; - display: block; - height: 0; - position: absolute; - right: 7px; - top: -6px; - vertical-align: middle; - width: 0; - - @media (max-width: @screen-xs-max) { - right: 13px; - } - } - } - } - .navbar-brand { - border: 0; - height: auto; - margin-left: 0; - padding: 0 0 0 10px; - position: relative; - } - .navbar-toggle { - border: 0; - display: block; - float: left; - &:hover, &:focus { - .icon-bar { - background: @navbar-pf-alt-navbar-toggle-icon-bar-hover-bg; - } - } - + .navbar-brand { - margin-left: 0; - } - .icon-bar { - background: @navbar-pf-alt-color; - } - } - .nav .nav-item-iconic { - // utiltity links - color: @navbar-pf-alt-color; - cursor: pointer; - line-height: normal; - max-height: none; - padding-top: @navbar-padding-vertical; - padding-bottom: @navbar-padding-vertical; - &:hover, &:focus { - background-color: transparent; - color: @navbar-pf-alt-active-color; - text-decoration: none; - .caret, .fa, .glyphicon, .pf-icon { - color: @navbar-pf-alt-active-color; - } - } - .add-to-project, - .username { - float: left; - font-weight: 300; - padding: 0 4px; - } - // align nav-item-iconic vertically with project menu - .caret { - margin-top: 5px; - } - .add-to-project + .caret, - .pficon-user, - .username + .caret { - display: block; - float: left; - } - .caret, .fa, .pf-icon { - color: @navbar-pf-alt-color; - font-size: @font-size-base + 3; - width: auto; - } - .username { - max-width: 100px; - @media (min-width: @screen-md-min) { - max-width: 130px; - } - @media (min-width: @screen-lg-min) { - max-width: 150px; - } - @media (min-width: @screen-xl-min) { - max-width: 250px; - } - } - } - .open > .nav-item-iconic { - &, &:hover, &:focus { - background: transparent; - - .caret, .fa, .pf-icon { - color: @navbar-pf-alt-active-color; - } - } - } -} - -@media (min-width: @screen-sm-min) { - #header-logo { - height: @navbar-os-header-height-desktop; - } - .navbar-pf-alt .nav { - .dropdown .nav-item-iconic { - padding-right: 20px; - } - .nav-item-iconic { - display: block; - float: left; - padding: 21px 10px 20px; - .status-icon { - position: relative; - top: 1px; - } - } - } -} - -// System status -.navbar-pf-alt { - .system-status .status-issue { - display: none; - font-weight: 300; - max-width: 100px; - padding: 0 0 0 5px; - position: relative; - top: -2px; - @media (min-width: @screen-lg-min) { - display: inline; - } - } - .system-status-mobile { - @media (min-width: @screen-sm-min) { - display: none; - } - &:before { - content: ''; - display: block; - position: absolute; - top: 0; - left: -1px; - width: 1px; - background: @sidebar-os-border-color; - height: 100%; - } - } -} - -.navbar-flex-btn { - position: relative; - + .navbar-flex-btn .add-to-project-btn:before, - .navbar-toggle.project-action-btn:before { - display: none; // remove inset border - } - .add-to-project-btn { - font-weight: 300; - &:before { - background: @navbar-os-project-menu-border-inset; - content: ''; - display: block; - height: 100%; - left: 0px; - position: absolute; - top: 0; - width: 1px; - } - } -} - -@media (max-width: @screen-xs-max) { - .layout-pf-alt-fixed .navbar-pf-alt { - position: absolute; - .navbar-brand:after { - content: ''; - background: @sidebar-os-border-color; - display: block; - height: 100%; - left: -1px; - position: absolute; - top: 0; - width: 1px; - } - } - .top-header.logged-out { - .toggle-menu { - display: none; - } - } - .navbar-flex-btn { - flex: 0 0 50px; - > a { - color: lighten(@navbar-os-project-menu-color, 20%); - cursor: pointer; - display: flex; - &:hover, &:active, &:focus { - text-decoration: none; - } - } - } - .navbar-pf-alt .nav-item-iconic { - align-items: center; - flex: 1 1 auto; - justify-content: center; - padding: 0 !important; - &.system-status{ - &:before { - background: @navbar-os-project-menu-border-inset; - content: ''; - display: block; - height: 100%; - left: 0px; - position: absolute; - top: 0; - width: 1px; - } - &:hover { - background: transparent; - text-decoration: none; - } - } - } -} - -@media (max-width: @screen-xxs-max) { - .navbar-flex-btn { - flex: 0 0 40px; - } -} - -@media (min-width: @screen-sm-min) { - .navbar-pf-alt { - .navbar-header { - height: 60px; - width: (@sidebar-left-width-md - @navbar-header-offset); - .navbar-brand { - padding: 0; - margin-left: 30px; - margin-right: 75px; - margin-top: 0; - } - } - } - .navbar-flex-btn.toggle-menu { - display: none; - } -} - -@media (min-width: @screen-lg-min) { - .navbar-pf-alt .navbar-header { - width: (@sidebar-left-width-md - @navbar-header-offset); - } -} -@media (min-width: @screen-xl-min) { - .navbar-pf-alt { - .navbar-header { - width: (@sidebar-left-width-lg - @navbar-header-offset); - .navbar-home { - font-size: @font-size-base + 1; - justify-content: flex-start; - margin-top: 0; - padding-left: 20px; - .pficon { - .primary-nav-icon-xl(); - } - .visible-xlg-inline-block { - margin-left: 3px; - } - } - } - } -} - - -.tech-preview-banner { - background: @brand-warning; - color: @color-pf-white; - font-size: 12px; - text-align: center; - text-transform: uppercase; - width: 100%; - z-index: @zindex-navbar-fixed; - @media (min-width: @screen-sm-min) { - position: fixed; - } -} diff --git a/app/styles/_navbar-vertical.less b/app/styles/_navbar-vertical.less new file mode 100644 index 0000000000..6f4d10be53 --- /dev/null +++ b/app/styles/_navbar-vertical.less @@ -0,0 +1,116 @@ +// +// Navigation Bar for use with vertical navigation +// ----------------------------------------------- + +#header-logo { + background-image: url('@{image-path}/logo-origin-thin.svg'); + background-position: left center; + background-repeat: no-repeat; + // Max logo dimensions width 196px / height 40px + height: @navbar-os-header-height-mobile - 1; // 1px border-bottom on navbar-os-mobile + width: 196px; + @media(min-width: @screen-sm-min) { + // Max logo dimensions width 230px / height 40px + width: 230px; + } +} + +.navbar-pf-vertical { + background-color: @navbar-os-bg-color; + border-bottom: 1px solid @project-bar-border-color; + border-top: none; + min-height: 0; + @media(min-width: @screen-xs-max) { + padding-left: 20px; + } + .dropdown-menu:after { + border: 6px solid transparent; + border-bottom-color: #fff; + border-top-width: 0; + content: ""; + display: block; + height: 0; + position: absolute; + right: 9px; + top: -6px; + vertical-align: middle; + width: 0; + } + .layout-pf-fixed .tech-preview & { + top: @tech-preview-banner-height; + } + .navbar-brand { + padding: 0; + @media(min-width: @screen-sm-min) { + padding-bottom: 10px; + padding-top: 10px; + } + } + .navbar-header { + float: left; + } + .navbar-iconic { + display: flex; + float: right; + margin: 0; + @media(min-width: @screen-sm-min) { + margin-right: @navbar-header-right-margin; + } + .badge { + margin: 0 !important; + position: absolute; + top: 9px; + right: 13px; + @media(min-width: @screen-sm-min) { + top: 20px; + } + } + + .drawer-pf-trigger { + display: inline-block; // workaround for Safari bug + a { + display: block; + } + } + .dropdown .nav-item-iconic { + padding-right: 20px; + } + > li { + display: none; + @media(min-width: @screen-sm-min) { + display: inline-block; // workaround for Safari bug + } + } + .nav-item-iconic { + line-height: normal; // align text and icon + padding-right: 15px; + @media(max-width: @screen-xs-max) { + padding: 10px 15px 10px 5px; + } + .username { + display: inline-block; + font-weight: 300; + max-width: 170px; // enable truncation + padding-right: 2px; + vertical-align: top; // align text and icon + } + } + } + .navbar-toggle { + margin: 4px 5px; + .icon-bar { + width: 20px; + } + @media(min-width: @screen-sm-min) { + margin: 13px 15px; + .icon-bar { + width: 22px; + } + } + } +} + +.navbar-toggle:focus { + color: @navbar-pf-vertical-navbar-toggle-icon-bar-hover-bg; // for Firefox outline + .tab-focus(); +} diff --git a/app/styles/_notifications.less b/app/styles/_notifications.less index 872df6aff4..3f9723bb2a 100644 --- a/app/styles/_notifications.less +++ b/app/styles/_notifications.less @@ -1,18 +1,34 @@ -// fixes positioning that doesn't quite work w/core patternfly styles -.navbar-pf-alt .nav .nav-item-iconic .badge { - font-size: 9px; - margin: -15px 0 0 -12px; - min-width: 10px; - min-height: 10px; -} +// +// Notification drawer +// ----------------------------------------------- notification-drawer-wrapper { .drawer-pf { - height: calc(~"100vh - 80px"); //to create a 20px offset bottom - top: @navbar-os-header-height-desktop - 10; - z-index: @zindex-navbar-fixed + 1; // was 1050 + height: calc(100vh ~"-" (@navbar-os-header-height-mobile + @project-bar-height-mobile)); + position: fixed; + top: (@navbar-os-header-height-mobile + @project-bar-height-mobile); + z-index: @zindex-navbar-fixed - 2; // two less than navbar, one less than project-bar + @media(max-width: 350px) { + left: 0; + width: 100%; + } + @media(min-width: @screen-sm-min) { + height: calc(100vh ~"-" (@navbar-os-header-height-desktop + @project-bar-height-desktop) ~"-" 20px); // 20px bottom gutter + top: (@navbar-os-header-height-desktop + @project-bar-height-desktop); + } + &.drawer-pf-expanded { + left: 0; + @media(min-width: @screen-sm-min) { + left: 270px; + } + } .tech-preview & { - top: @navbar-os-header-height-desktop + @tech-preview-banner-height - 10; + height: calc(100vh ~"-" (@navbar-os-header-height-mobile + @project-bar-height-mobile + @tech-preview-banner-height)); + top: (@navbar-os-header-height-mobile + @project-bar-height-mobile + @tech-preview-banner-height); + @media(min-width: @screen-sm-min) { + height: calc(100vh ~"-" (@navbar-os-header-height-desktop + @project-bar-height-desktop + @tech-preview-banner-height) ~"-" 20px); // 20px bottom gutter + top: (@navbar-os-header-height-desktop + @project-bar-height-desktop + @tech-preview-banner-height); + } } } // the whole block is clickable, need to set pointer on all of these @@ -23,25 +39,23 @@ notification-drawer-wrapper { cursor: pointer; } .drawer-pf-notification { - padding: 0px; - } - .drawer-pf-notification.ng-leave { - transition:0.25s linear all; - opacity:1; - } - .drawer-pf-notification.ng-leave.ng-leave-active { - opacity:0; + padding: 0; + &.ng-leave { + transition: 0.25s linear all; + opacity: 1; + &.ng-leave-active { + opacity: 0; + } + } } .drawer-pf-notification-inner { - padding:15px; + padding: 15px; .pficon-close { - color: #000; + color: @color-pf-black; } } - .expanded-notification { - .drawer-pf-notification-message { - max-width: 35%; // keeps flex in check in case of a really long message - } + .expanded-notification .drawer-pf-notification-message { + max-width: 35%; // keeps flex in check in case of a really long message } } @@ -52,7 +66,7 @@ notification-drawer-wrapper { // - https://github.com/patternfly/angular-patternfly/issues/539 // I'm putting quite a bit of markup inside the header, // need to tinker to eliminate this rule. - overflow:hidden; + overflow: hidden; .container-fluid { margin-left: 0; margin-right: 0; @@ -62,6 +76,6 @@ notification-drawer-wrapper { } .small { .small(); - color: #000000; + color: @color-pf-black; } } diff --git a/app/styles/_overview.less b/app/styles/_overview.less index d576223f59..d1c4659fbc 100644 --- a/app/styles/_overview.less +++ b/app/styles/_overview.less @@ -75,10 +75,6 @@ } .overview { - .empty-state { - // prevent alerts from displaying to close to top-header - margin-top: @grid-gutter-width / 2; - } .app-heading { display: flex; justify-content: space-between; @@ -183,6 +179,10 @@ } } } + .empty-state { + // prevent alerts from displaying too close to top-header + padding-top: @grid-gutter-width / 2; + } .expanded-section { margin-top: 20px; .row > [class^=col-] { @@ -457,8 +457,9 @@ margin-bottom: 30px; } .toolbar-container { - margin-top: 10px; - margin-bottom: 5px; + padding-bottom: 13px; + padding-top: 13px; + .surface-shaded(); } .triggers { margin-bottom: 20px; diff --git a/app/styles/_project-bar.less b/app/styles/_project-bar.less new file mode 100644 index 0000000000..7002a9d0fb --- /dev/null +++ b/app/styles/_project-bar.less @@ -0,0 +1,248 @@ +// +// Project bar +// ----------------------------------------------- + +.project-bar { + background-color: @project-bar-bg; + border-bottom: 1px solid @project-bar-border-color; + display: flex; + height: @project-bar-height-mobile; + left: 0; + position: fixed; + right: 0; + top: @navbar-os-header-height-mobile; + z-index: @zindex-navbar-fixed - 1; // one less than navbar + @media (min-width: @screen-sm-min) { + height: @project-bar-height-desktop; + top: @navbar-os-header-height-desktop; + } + .add-to-project { + align-items: center; + color: @color-pf-black-300; + display: flex; + flex: 0 0 35px; + font-weight: 300; + justify-content: center; + @media (min-width: @screen-xs-max) { + flex: 1 0 auto; + margin-right: 15px; + } + &:before { + background: @navbar-os-project-menu-border-inset; + content: ''; + display: block; + height: 100%; + left: 0px; + position: absolute; + top: 0; + width: 1px; + @media (min-width: @screen-xs-max) { + display: none; + } + } + > a { + align-items: center; + color: @color-pf-black-300; + display: flex; + padding: 5px 0; + flex: 1 1 auto; + justify-content: center; + &:active, + &:focus, + &:hover { + color: #fff; + text-decoration: none; + } + } + .caret { + padding-left: 20px; + } + .dropdown-menu { + margin-top: 0; // align top edge to project bar bottom + @media (min-width: @screen-xs-max) { + right: -7px; + } + } + } + .bootstrap-select.btn-group { + @media(min-width: @screen-sm-min) { + max-width: 70%; + min-width: 200px; + width: auto; + } + @media(min-width: @screen-lg-min) { + max-width: 60%; + } + .btn { + background: transparent; + border-bottom: 0; + border-color: @project-bar-border-color; + border-left-width: 0; + border-radius: 0; + border-top: 0; + box-shadow: none; + color: @navbar-os-project-menu-color; + font-size: @font-size-large - 1; + font-weight: 300; + line-height: @line-height-base; + padding: 1px 40px 1px 15px; // padding so truncated name with ellipsis doesn't extend into down icon + @media(min-width: @screen-sm-min) { + padding-left: 25px; + } + transition: none; + @media (min-width: @screen-sm-min) { + font-size: @font-size-large + 3; + padding: 4px 40px 4px 20px; + } + @media(min-width: @screen-sm-min) { + &:after { + content: ''; + background: @navbar-os-project-menu-border-inset; + display: block; + height: 100%; + left: 0px; + position: absolute; + top: 0; + width: 1px; + } + } + &:hover, &:focus { + background-color: @navbar-os-project-menu-active-bg; + color: @navbar-os-project-menu-active-color; + } + &:focus { + .tab-focus(); + &:active { + outline: none !important; + } + } + .filter-option { + .truncate(); + } + } + &.open { + .btn { + background-color: @navbar-os-project-menu-active-bg; + } + } + .dropdown-toggle { + &.btn-default { + border-right-width: 1px; + height: (@project-bar-height-mobile - 1); + @media(min-width: @screen-sm-min) { + border-left-width: 1px; + border-right: 0; + height: (@project-bar-height-desktop - 1); + } + } + .caret { + font-size: @font-size-base; + margin-top: -5px; + position: absolute; + right: 15px; + top: 50%; + } + } + .dropdown-menu { + background-color: @navbar-os-project-menu-active-bg; + border-color: @navbar-os-project-border-color; + border-radius: 0; + color: @navbar-os-project-menu-color; + margin-top: 0; + padding: 0; + li { + background-color: @navbar-os-project-menu-active-bg; + &.selected a { + background-color: @navbar-os-project-bg !important; + border-color: transparent !important; + color: @navbar-os-project-menu-active-color; + &:after { + content: ''; + width: 2px; + height: 100%; + left:0; + top:0; + display: block; + position: absolute; + background-color: @sidebar-os-active; + } + } + &.divider { + border-top: 1px solid @project-bar-bg; + height: 1px; + margin: 0 !important; + } + &:last-child > a { // "View all projects" + color: @sidebar-os-active !important; + } + a { + color: @sidebar-os-color; + font-weight: 300; + padding: 3px 5px 3px 16px; + @media(min-width: @screen-sm-min) { + padding: 8px 20px; + } + white-space: normal; + &:hover, &:focus { + background-color: @navbar-os-project-menu-hover-bg; + border-color: transparent; + color: @sidebar-os-active-color; + } + @media (max-width: @screen-xs-max) { + span.text { + .word-break-all(); + } + } + } + } + } + } + .form-group { + flex-basis: 100%; + margin-bottom: 0; + min-width: 0; // so that truncation on .filter-option works + .form-control { + background-color: transparent; + margin-bottom: 0; + height: auto; + } + } + .dropdown-menu:after { + border:6px solid transparent; + border-bottom-color:#fff; + border-top-width:0; + content:""; + display:block; + height:0; + position:absolute; + right:10px; + top:-6px; + vertical-align:middle; + width:0; + } + .navbar-toggle { + border: 0; + display: block; + float: left; + margin: 0 10px; + padding: 12px 16px; // match width of collapsed vertical-nav + @media(max-width: @screen-xs-max) { + display: none; + } + &:hover, + &:focus { + .icon-bar { + background: @navbar-pf-vertical-navbar-toggle-icon-bar-hover-bg; + } + } + .icon-bar { + background-color: @navbar-pf-vertical-color; + } + } + .tech-preview & { + top: @navbar-os-header-height-mobile + @tech-preview-banner-height; + @media (min-width: @screen-sm-min) { + top: @navbar-os-header-height-desktop + @tech-preview-banner-height; + } + } +} diff --git a/app/styles/_project-menu.less b/app/styles/_project-menu.less deleted file mode 100644 index 9e880ad6ee..0000000000 --- a/app/styles/_project-menu.less +++ /dev/null @@ -1,139 +0,0 @@ -// -// Project list menu -// ----------------------------------------------- - -.navbar-project-menu { - display: flex; - @media (min-width: @screen-sm-min) { - float: left; - .bootstrap-select.btn-group .btn:before { - color: @gray-light; - content: 'Project'; - font-size: @font-size-xsmall; - left: 15px; - position: absolute; - top: 8px; - } - } - .bootstrap-select.btn-group { - .btn { - background: @navbar-os-project-menu-bg; - border-bottom: 0; - border-color: @navbar-os-project-menu-border; - border-radius: 0; - border-top: 0; - box-shadow: none; - color: @navbar-os-project-menu-color; - font-size: @font-size-large + 3; - font-weight: 300; - line-height: @line-height-base; - padding: 7px 30px 8px 15px; // padding so truncated name with ellipsis doesn't extend into down icon - transition: none; - @media (min-width: @screen-sm-min) { - padding-bottom: 15px; - padding-top: 15px; - } - &:after { - content: ''; - background: @navbar-os-project-menu-border-inset; - display: block; - height: 100%; - left: 0px; - position: absolute; - top: 0; - width: 1px; - } - &:hover, &:focus { - background-color: @navbar-os-project-menu-active-bg; - color: @navbar-os-project-menu-active-color; - } - &:focus { - .tab-focus(); - &:active { - outline: none !important; - } - } - .filter-option { - .truncate(); - } - } - &.open { - .btn { - background-color: @navbar-os-project-menu-active-bg; - } - } - .dropdown-toggle .caret { - font-size: 16px; - } - .dropdown-menu { - background-color: @navbar-os-project-menu-active-bg; - border-color: @navbar-os-project-border-color; - color: @navbar-os-project-menu-color; - margin-top: 0; - padding: 0; - li { - &.selected a { - background-color: @navbar-os-project-bg !important; - border-color: transparent !important; - color: @navbar-os-project-menu-active-color; - &:after { - content: ''; - width: 2px; - height: 100%; - left:0; - top:0; - display: block; - position: absolute; - background-color: @sidebar-os-active; - } - } - &.divider { - background-color: @navbar-os-project-menu-border-inset !important; - border-top: 1px solid @sidebar-os-border-color; - height: 2px; - margin: 0 !important; - } - &:last-child > a { // "View all projects" - color: @sidebar-os-active !important; - } - a { - color: @sidebar-os-color; - padding: 10px 15px; - white-space: normal; - &:hover, &:focus { - background-color: @navbar-os-project-menu-hover-bg; - border-color: transparent; - color: @sidebar-os-active-color; - } - @media (max-width: @screen-xs-max) { - span.text { - .word-break-all(); - } - } - } - } - } - } - .form-group { - margin-bottom: 0; - min-width: 0; // so that truncation on .filter-option works - width: 100%; - @media (min-width: @screen-sm-min) { - min-width: 220px; // IE - width: 220px; - } - @media (min-width: @screen-md-min) { - min-width: 400px; // IE - width: 400px; - } - @media (min-width: @screen-lg-min) { - min-width: 500px; // IE - width: 500px; - } - .form-control { - background-color: transparent; - margin-bottom: 0; - height: auto; - } - } -} diff --git a/app/styles/_scrollbars.less b/app/styles/_scrollbars.less index fff6e64bb4..905a9cd28f 100644 --- a/app/styles/_scrollbars.less +++ b/app/styles/_scrollbars.less @@ -36,7 +36,7 @@ .landing, .landing-side-bar, .log-view .log-view-output, -.navbar-project-menu .dropdown-menu { +.project-bar .dropdown-menu { &::-webkit-scrollbar-thumb { background-color: @scrollbar-thumb-inverse; box-shadow: inset 1px 1px 0 rgba(255,255,255,.1),inset 0 -1px 0 rgba(255,255,255,.07); @@ -55,6 +55,6 @@ background-color: @scrollbar-track-landing-side-bar; } -.navbar-project-menu ::-webkit-scrollbar-track { +.project-bar ::-webkit-scrollbar-track { background-color: @scrollbar-track-inverse; } diff --git a/app/styles/_sidebar-right.less b/app/styles/_sidebar-right.less new file mode 100644 index 0000000000..fb789ca25a --- /dev/null +++ b/app/styles/_sidebar-right.less @@ -0,0 +1,230 @@ +// +// Sidebar Right +// -------------------------------------------------- + +.right-section { + height: 100%; + position: fixed; + .right-container { + align-items: flex-start; + bottom: 0; + display: flex; + flex-direction: column; + flex-wrap: nowrap; + justify-content: flex-start; + height: 100%; + left: 0; + overflow: hidden; + position: absolute; + right: 0; + top: 0; + .right-content { + flex: 1 1 auto; + position: relative; + overflow-x: hidden; + overflow-y: auto; + width: 100%; + } + .right-header { + flex: 0 0 auto; + width: 100%; + } + } +} + +.sidebar-right { + background-color: @body-bg; + border-left: 1px solid #dadada; + display: none; + flex: 0 0 @sidebar-right-width-sm; + position: relative; + .dl-horizontal { + margin: 0 0 @line-height-computed; + dt { + text-align: left; + } + dd { + .word-break(); + } + } + h3 { + border-top: 1px solid darken(@page-header-border-color, 2%); + margin-top: 0; + padding-top: @line-height-computed; + &:last-child { + border-top: 0; + padding-top: 0; + } + } + .sidebar-header { + border-color: @page-header-border-color; + margin-bottom: 0; + margin-top: 20px; + h2 { + margin-left: 20px; + } + } + .sidebar-help { + color: @gray-light; + } +} + +.show-sidebar-right { + @media (min-width: @screen-sm-min) { + display: flex; + min-height: 100%; + } + .middle { + flex: 1 1 auto; + } + .sidebar-right { + @media (min-width: @screen-sm-min) { + display: block; + } + @media (min-width: @screen-md-min) { + flex: 0 0 @sidebar-right-width-md; + } + @media (min-width: @screen-lg-min) { + flex: 0 0 @sidebar-right-width-lg; + } + @media (min-width: @screen-xl-min) { + flex: 0 0 @sidebar-right-width-xlg; + } + .right-section { + width: @sidebar-right-width-sm; + @media (min-width: @screen-md-min) { + width: @sidebar-right-width-md; + } + @media (min-width: @screen-lg-min) { + width: @sidebar-right-width-lg; + } + @media (min-width: @screen-xl-min) { + width: @sidebar-right-width-xlg; + } + } + } +} + +.events-badge { + font-size: 14px; + &:hover { + text-decoration: none; + .event-label { + text-decoration: underline; + } + } + .event-count { + color: @text-color; + } + .pficon-info { + color: @text-muted; + } +} + +.events-sidebar { + .pficon { + vertical-align: middle; + } + .events-sidebar-collapse { + font-size: 16px; + margin-right: 12px; + + a { + text-decoration: none; + } + } + .sidebar-header.right-header { + align-items: center; + display: flex; + justify-content: space-between; + // So that sidebar bottom border aligns with main content header bottom border. + margin-top: 17.5px; + h2 { + .h4(); + display: inline-block; + } + .warning-count { + .nowrap(); + margin-left: 2px; + .pficon { + vertical-align: -1px; + } + } + .event-details-link { + .small(); + margin-right: 20px; + } + } + .right-content { + .events { + // Because .right-section is position:fixed, we need to account for the top nav and project bar combined height, + // so offset that amount by adding padding-bottom, which makes the entire scrollable area visible. + padding-bottom: (@navbar-os-header-height-mobile + @project-bar-height-mobile + @tech-preview-banner-height); + } + .event { + display: flex; + align-items: center; + padding: 10px 20px; + &.highlight { + background-color: @list-view-expanded-bg; + border-bottom-width: 0; + border-color: @table-border-color !important; + } + + .event { + border-top: 1px solid #ededed; + } + .event-icon { + font-size: 18px; + margin-right: 10px; + min-width: 18px; + } + .event-details { + .truncate(); + flex-grow: 1; + .detail-group { + display: flex; + flex-direction: column; + justify-content: space-between; + } + .event-reason, .event-object, .event-message { + .truncate(); + } + .event-message { + .small(); + } + .event-timestamp { + .small(); + .text-muted(); + } + @media (min-width: @screen-lg-min) { + .detail-group { + flex-direction: row; + } + .event-object { + order: 1; + } + .event-reason { + order: 2; + } + .event-timestamp { + .text-right(); + margin-left: 5px; + min-width: 100px; + } + } + } + } + + .event.highlight + .event { + border-top: 1px solid #d1d1d1; + } + } +} + +.events-sidebar-expand { + font-size: 16px; + + a { + text-decoration: none; + } +} diff --git a/app/styles/_sidebar.less b/app/styles/_sidebar.less deleted file mode 100644 index c7a0997ecc..0000000000 --- a/app/styles/_sidebar.less +++ /dev/null @@ -1,431 +0,0 @@ -// -// Sidebar Sidenav & Secondary hover menu -// -------------------------------------------------- - -.nav-sidenav-secondary .dropdown-header { - color: #b3b3b3; - font-size: (@font-size-base - 1); - padding-bottom: 10px; - padding-left: @sidebar-os-padding-x-secondary; - padding-top: 10px; -} - -.sidebar-left { - .navbar-sidebar { - border-bottom: 0; - border-left: 0; - border-top: 0; - margin: 0; - min-height: 46px; - &.visible-xs-block { - border:0; - } - .sidebar-header { - border: 0; - padding-bottom: 0; - margin: 0; - display: block; - &:before { - content: " "; - display: table; - } - &:after { - content: " "; - display: table; - clear: both; - } - h2 { - // make size, weight and height consistent with project list select - color: @navbar-os-project-menu-color; - font-size: 15px; - margin-left: 20px; - margin-top: 13px; - } - .navbar-toggle { - margin:4px 10px 0; - padding: 10px; - .icon-bar { - background: @navbar-pf-alt-color; - } - &:hover, &:focus { - .icon-bar { - background: @navbar-pf-alt-navbar-toggle-icon-bar-hover-bg; - } - } - } - } - ul.nav-sidenav-primary > li { - background: @sidebar-os-bg; - border-bottom: 1px solid @sidebar-os-border-color; - border-top: 1px solid @sidebar-os-border-inset-color; - font-weight: 300; - &.active { - &, - &:focus, - &:hover, - &.open { - &, - .dropdown-menu { - background-color: @sidebar-os-active-bg; - } - .nav-sidenav-secondary > li a { - &:focus, - &:hover { - background: @sidebar-os-dropdown-link-active-hover-bg; - } - } - } - > a { - color: @sidebar-os-active-color; - &:after { - background-color: @sidebar-os-active; - bottom: 0; - content: ''; - display: block; - left: 0; - position: absolute; - top: -1px; - width: 3px; - } - .fa, .pficon { - color: @sidebar-os-active; - } - } - } - &:focus, - &:hover, - &.open { - background-color: @sidebar-os-hover-bg; - > a { - background-color: transparent; - color: @sidebar-os-active-color; - .fa, .pficon { - color: @sidebar-os-active; - } - } - .dropdown-menu { - background-color: @sidebar-os-hover-bg; - } - } - > a { - color: @sidebar-os-color; - &, - &:focus, - &:hover { - background-color: transparent; - } - &.dropdown-toggle:focus { - outline: thin dotted; - } - .fa, .pficon { - color: @sidebar-os-icon-color; - margin-right: 5px; - } - .fa-angle-right { - display: none; - } - } - .dropdown-menu { - background-color: @sidebar-os-hover-bg; - } - .nav-sidenav-secondary > li { - &.active a { - &, - &:hover { - background: @sidebar-os-dropdown-link-active-bg !important; - color: @sidebar-os-active-color; - } - } - a { - color: @sidebar-os-color; - padding-left: @sidebar-os-padding-x-secondary; - &:focus, - &:hover { - background: @sidebar-os-dropdown-link-hover-bg; - color: @sidebar-os-active-color; - } - } - } - } - } -} - -.show-sidebar-right { - .sidebar-right { - background-color: @body-bg; - .sidebar-header { - border-color: @page-header-border-color; - margin-bottom: 0; - margin-top: 20px; - h2 { - margin-left: 20px; - } - } - h3 { - border-top: 1px solid darken(@page-header-border-color, 2%); - margin-top: 0; - padding-top: @line-height-computed; - &:last-child { - border-top: 0; - padding-top: 0; - } - } - } -} - - -@media (min-width: @screen-sm-min) { - .sidebar-left { - .navbar-sidebar { - border-right: 1px solid @sidebar-os-border-color; - border-bottom: 0; - width: @sidebar-left-width-md; - position: absolute; - top:1px; - right:0; - bottom: 0; - left:0; - .sidebar-header { - display: none; - } - // Sidebar hover menu - .hover-nav.dropdown-menu { - border: 0; - border-radius: 0; - .box-shadow(2px 2px 2px rgba(0, 0, 0, 0.125)); - left: 100%; - margin: 0 0 0 1px; - min-width: 230px; - position: absolute; - padding: 10px; - top: -2px; - z-index: @zindex-dropdown + 1; - } - ul.nav-sidenav-primary { - border-bottom: 1px solid @sidebar-os-border-inset-color; - > li { - position: relative; - &.open { - > a:before { - // connect tab and hover-nav - background-color: @sidebar-os-hover-bg; - bottom: 0; - content: ''; - display: block; - right: -1px; - position: absolute; - top: -1px; - width: 1px; - } - &.active > a:before { - background-color: @sidebar-os-active-bg; - } - } - > a { - padding: @sidebar-os-padding-x @sidebar-os-padding-y; - text-align: center; - .fa, .pficon { - display: block; - font-size: 20px; - margin-right: 0; - padding-bottom: 5px; - } - .fa-angle-right { - display: block; - font-size: 16px; - position: absolute; - right: 13px; - top: 39%; - } - span { - display: block; - margin: 0; - } - } - .hover-nav ul.nav-sidenav-secondary li a { - padding-left: 15px; - } - } - } - } - } - .nav-sidenav-secondary .dropdown-header { - padding-left: 15px; - } -} - -// Prevent left nav from extending off viewport when > 600px by hiding the icon -// which reduces the nav height -.sidebar-left .navbar-sidebar ul.nav-sidenav-primary > li > a { - @media (max-height: @screen-height-sm) and (min-width: @screen-sm-min) { - text-align: left; - // Hide icon but show right arrow - .pficon, - .fa { - display: none; - &.fa-angle-right { - display: block; - top: 36%; - } - } - } - @media (max-height: @screen-height-sm) and (min-width: @screen-xl-min) { - .fa, - .pficon { - display: inline-block; - } - } -} - - - -@media (min-width: @screen-xl-min) { - .sidebar-left { - .navbar-sidebar { - ul.nav-sidenav-primary > li { - > a { - text-align: left; - padding: (@sidebar-os-padding-x); - .fa, .pficon { - .primary-nav-icon-xl(); - } - .fa-angle-right { - height: 18px; - left: auto; - padding: 0; - position: absolute; - right: 5px; - text-align: right; - top: 23px; - } - .pficon { - vertical-align: middle; - } - } - } - } - } -} - -.events-sidebar-expand { - font-size: 16px; - - a { - text-decoration: none; - } -} - -.events-sidebar { - .pficon { - vertical-align: middle; - } - .events-sidebar-collapse { - font-size: 16px; - margin-right: 12px; - - a { - text-decoration: none; - } - } - .sidebar-header.right-header { - align-items: center; - display: flex; - justify-content: space-between; - // So that sidebar bottom border aligns with main content header bottom border. - margin-top: 17.5px; - h2 { - .h4(); - display: inline-block; - } - .warning-count { - .nowrap(); - margin-left: 2px; - .pficon { - vertical-align: -1px; - } - } - .event-details-link { - .small(); - margin-right: 20px; - } - } - .right-content { - .events { - padding-top: 10px; - } - .event { - border: 1px solid transparent; - display: flex; - align-items: center; - padding: 10px 20px; - &.highlight { - background-color: @list-view-expanded-bg; - border-bottom-width: 0; - border-color: @table-border-color !important; - } - + .event { - border-top: 1px solid #ededed; - } - .event-icon { - font-size: 18px; - margin-right: 10px; - min-width: 18px; - } - .event-details { - .truncate(); - flex-grow: 1; - .detail-group { - display: flex; - flex-direction: column; - justify-content: space-between; - } - .event-reason, .event-object, .event-message { - .truncate(); - } - .event-message { - .small(); - } - .event-timestamp { - .small(); - .text-muted(); - } - @media (min-width: @screen-lg-min) { - .detail-group { - flex-direction: row; - } - .event-object { - order: 1; - } - .event-reason { - order: 2; - } - .event-timestamp { - .text-right(); - margin-left: 5px; - min-width: 100px; - } - } - } - } - - .event.highlight + .event { - border-top: 1px solid #d1d1d1; - } - } -} - -.events-badge { - font-size: 14px; - &:hover { - text-decoration: none; - .event-label { - text-decoration: underline; - } - } - .event-count { - color: @text-color; - } - .pficon-info { - color: @text-muted; - } -} diff --git a/app/styles/_substructure.less b/app/styles/_substructure.less deleted file mode 100644 index 5471b78fe9..0000000000 --- a/app/styles/_substructure.less +++ /dev/null @@ -1,289 +0,0 @@ -// -// Substructure -// ------------------------------------ -html,body { - margin:0; - padding:0; -} - -.layout-pf-alt.layout-pf-alt-fixed body { - padding-top: 0; -} -.console-os { - background-color: @body-bg; - &.tech-preview .top-header { - height: @navbar-os-header-height-mobile + @tech-preview-banner-height; - } - .top-header { - display: flex; - position: relative; - height: @navbar-os-header-height-mobile; - - } - .wrap { - display: flex; - flex-direction: column; - height:100vh; - margin-top:-@navbar-os-header-height-mobile; /* top offset height */ - padding-top:@navbar-os-header-height-mobile; /* top offset height */ - position:relative; - width:100%; - .backface-visibility(hidden); - &.no-sidebar { - h1 { - margin: 10px 0 20px; - } - .middle { - padding-top: 30px; - } - } - &.chromeless { - // prevent chromeless log-viewer from having margin or padding - .middle-content, - .middle-header { - margin:0 !important; - padding:0 !important; - } - } - } - .sidebar-left,.middle,.sidebar-right { - flex: 0 0 auto; - width: 100%; - position: relative; - } - .sidebar-left { - background: @sidebar-os-bg; - padding: 0; - position:relative; - @media (max-width: @screen-xs-max) { - border-top: 0; - padding-left: 0; - padding-right: 0; - } - } - .sidebar-right { - background-color: @panel-light; - display: none; - } - .middle { - height: 100%; // full height at mobile - .middle-section { - position: absolute; - top: 0; - left: 0; - height: 100%; - width: 100%; - .middle-container { - display: flex; - flex-direction: column; - height: 100%; - .middle-header { - flex: 0 0 auto; - margin-bottom: @grid-gutter-width / 2; - } - .middle-content { - flex: 1 1 auto; - position: relative; - width: 100%; - } - } - } - } - .no-sidebar .middle-content > .container { - // reduce 20px to account for tile bottom margin - padding-bottom: (@middle-content-bottom-margin - 20px); - } -} -.header-toolbar { - background-color: @panel-light; - border-bottom: 1px solid @page-header-border-color; -} -.surface-shaded { - background-color: @panel-shaded; -} - -@media (min-width: @screen-sm-min) { - .layout-pf-alt-fixed .nav-pf-vertical-alt { - position: fixed; - bottom:0; - overflow: visible; - /* width: inherit; used if parent is using width: can't use 100% or auto */ - } - .console-os { - &.tech-preview { - .top-header { - height: @navbar-os-header-height-desktop + @tech-preview-banner-height; - } - .wrap { - margin-top: -(@navbar-os-header-height-desktop + @tech-preview-banner-height); /* top offset height */ - padding-top: @navbar-os-header-height-desktop + @tech-preview-banner-height; /* top offset height */ - } - } - .wrap { - flex-direction: row; - margin-top: -@navbar-os-header-height-desktop; /* top offset height */ - overflow: hidden; - padding-top: @navbar-os-header-height-desktop; /* top offset height */ - &.no-sidebar { - .sidebar-left { - display: none !important; - } - } - &.show-sidebar-right { - .sidebar-right { - display: block; - .dl-horizontal { - margin: 0 0 @line-height-computed; - dt { - text-align: left; - } - dd { - .word-break(); - } - } - .sidebar-help { - color: @gray-light; - } - } - } - } - .top-header { - height: @navbar-os-header-height-desktop; /* top offset height */ - } - .sidebar-left,.middle,.sidebar-right { - -webkit-overflow-scrolling:touch; - } - .sidebar-left { - flex: 0 0 @sidebar-left-width-md; - overflow-y: visible; - } - .middle{ - flex: 1 1 0%; - position: relative; - // make scrollable - overflow-x: hidden; - overflow-y: auto; - &.landing-page { - -webkit-overflow-scrolling: auto; // resolves iOS bug where .landing-search-area and .landing-side-bar disappear - } - } - .sidebar-right { - border-left: 1px solid #dadada; - flex: 0 0 @sidebar-right-width-sm; - position: relative; - } - } - // scrollable panels within sections - // --------------------------------- - .middle-section { - .middle-container { - align-items: flex-start; - bottom: 0; - display: flex; - flex-direction: column; - flex-wrap: nowrap; - height: 100%; - justify-content: flex-start; - left: 0; - position: absolute; - right: 0; - top: 0; - .middle-header { - flex: 0 0 auto; - width: 100%; - } - .middle-content { - flex: 1 1 auto; - position: relative; - width: 100%; - } - } - } - .right-section { - position: absolute; - top: 0; - right: 0; - width: @sidebar-right-width-sm; - height: 100%; - .right-container { - align-items: flex-start; - bottom: 0; - display: flex; - flex-direction: column; - flex-wrap: nowrap; - justify-content: flex-start; - height: 100%; - left: 0; - overflow: hidden; - position: absolute; - right: 0; - top: 0; - .right-header { - flex: 0 0 auto; - width: 100%; - } - .right-content { - flex: 1 1 auto; - position: relative; - overflow-x: hidden; - overflow-y: auto; - width: 100%; - } - } - } -} - - -@media (min-width: @screen-md-min) { - .console-os { - .middle .container-fluid { - // At wide view increase the space between middle container and sidebar-left/right, by setting its padding to 30px instead of the bootstrap 20px default - padding-left: @middle-content-container-padding-lg; - padding-right: @middle-content-container-padding-lg; - } - .sidebar-right { - flex: 0 0 @sidebar-right-width-md; - .right-section { - width: @sidebar-right-width-md; - } - } - } -} - -@media (min-width: @screen-lg-min) { - .console-os { - .sidebar-left { - flex: 0 0 @sidebar-left-width-md; - .navbar-sidebar { - width: @sidebar-left-width-md; - } - } - .wrap.show-sidebar-right { - .sidebar-right { - flex: 0 0 @sidebar-right-width-lg; - .right-section { - width: @sidebar-right-width-lg; - } - } - } - } -} - -@media (min-width: @screen-xl-min) { - .console-os { - .sidebar-left { - flex: 0 0 @sidebar-left-width-lg; - .navbar-sidebar { - width: @sidebar-left-width-lg; - } - } - .wrap.show-sidebar-right { - .sidebar-right { - flex: 0 0 @sidebar-right-width-xlg; - .right-section { - width: @sidebar-right-width-xlg; - } - } - } - } -} diff --git a/app/styles/_system-status.less b/app/styles/_system-status.less new file mode 100644 index 0000000000..da5a4e1687 --- /dev/null +++ b/app/styles/_system-status.less @@ -0,0 +1,30 @@ +// +// System status extension point +// ----------------------------------------------- + +// Always show system-status if it exists +[extension-name="nav-system-status"] { + display: inline-block !important; +} + +.nav-item-iconic.system-status { + @media(max-width: 350px) { + padding-right: 5px !important; + } +} + +.status-issue { + display: none; + font-weight: 300; + max-width: 100px; + padding: 0 0 0 5px; + position: relative; + top: -2px; + // 900px is the minimum required to display the status-issue description + // under the following conditions: + // * #header-logo with width of 320px (OCP); + // * a username that exceeds the max width + @media(min-width: 900px) { + display: inline; + } +} diff --git a/app/styles/_tech-preview.less b/app/styles/_tech-preview.less new file mode 100644 index 0000000000..680c4c2ea9 --- /dev/null +++ b/app/styles/_tech-preview.less @@ -0,0 +1,15 @@ +// +// Tech preview indicator +// ----------------------------------------------- + +.tech-preview-banner { + background: @brand-warning; + color: @color-pf-white; + font-size: 12px; + position: fixed; + text-align: center; + text-transform: uppercase; + top: 0; + width: 100%; + z-index: @zindex-navbar-fixed; +} diff --git a/app/styles/_typography.less b/app/styles/_typography.less index 948faf09bf..c41da41af9 100644 --- a/app/styles/_typography.less +++ b/app/styles/_typography.less @@ -20,14 +20,14 @@ margin: 0 10px; white-space: nowrap; } - @media (min-width: @screen-md-min) { - .page-header.page-header-bleed-left { - margin-left: -30px; - padding-left: 30px; - margin-right: -30px; - padding-right: 30px; - } - } + // @media (min-width: @screen-md-min) { + // .page-header.page-header-bleed-left { + // margin-left: -30px; + // padding-left: 30px; + // margin-right: -30px; + // padding-right: 30px; + // } + // } .section-header{ .page-header(); border-bottom: none; diff --git a/app/styles/_variables.less b/app/styles/_variables.less index 096e64ab85..bfcfd82d89 100644 --- a/app/styles/_variables.less +++ b/app/styles/_variables.less @@ -7,7 +7,14 @@ // Patternfly overrides @dropdown-divider-margin: 4px 0; @list-view-hover-bg: #fafafa; -@navbar-pf-alt-navbar-brand-padding: 20px 0; +@nav-pf-vertical-bg-color: #30363d; +@nav-pf-vertical-border-color: @project-bar-border-color; +@nav-pf-vertical-border-inset-color: @project-bar-border-inset-color; +@nav-pf-vertical-secondary-bg-color: @project-bar-bg; +@nav-pf-vertical-secondary-hover-color: lighten(@nav-pf-vertical-secondary-bg-color, 8%); +@nav-pf-vertical-secondary-active-bg-color: @nav-pf-vertical-secondary-hover-color; +@nav-pf-vertical-width: 220px; +@navbar-pf-vertical-navbar-brand-padding: 20px 0; @navbar-pf-bg-color: @navbar-os-bg-color; @sidebar-pf-bg: @body-bg; @table-cell-padding-bottom: 8px; @@ -44,17 +51,16 @@ @log-scroll-offset-bottom: @log-scroll-offset-top; @log-scroll-offset-right: 25px; @log-scroll-offset-top: 10px; -@log-scroll-top-offset-right-xs: (@log-scroll-offset-right + @middle-content-container-padding); -@log-scroll-top-offset-right-sm: (@log-scroll-offset-right + @scrollbar-width + @middle-content-container-padding); -@log-scroll-top-offset-right-lg: (@log-scroll-offset-right + @scrollbar-width + @middle-content-container-padding-lg); +@log-scroll-top-offset-right: (@log-scroll-offset-right + @middle-content-container-padding); // The log viewer needs to be udpated if this value changes. It accounts for // bottom margin when resizing the log in JavaScript. @middle-content-bottom-margin: @grid-gutter-width; @middle-content-container-padding: floor((@grid-gutter-width / 2)); // 20px bootstrap default @middle-content-container-padding-lg: (@middle-content-container-padding + 10px); @navbar-header-offset: 2px; -@navbar-os-header-height-desktop: 60px; -@navbar-os-header-height-mobile: 46px; +@navbar-header-right-margin: 10px; +@navbar-os-header-height-desktop: 59px; +@navbar-os-header-height-mobile: 41px; @navbar-os-bg-color: #1c2127; @navbar-os-label-filter-bg: @navbar-os-project-menu-bg; @navbar-os-project-bg: @navbar-os-bg-color; @@ -68,22 +74,24 @@ @navbar-os-project-menu-hover-bg: @sidebar-os-active-bg; @navbar-project-label-color: @sidebar-os-color; @panel-light: @body-bg; +@panel-shaded: #f2f2f2; +@project-bar-bg: #383f47; +@project-bar-border-color: #050505; +@project-bar-border-inset-color: rgba(255,255,255,.04); +@project-bar-height-mobile: 28px; +@project-bar-height-desktop: 40px; +@project-bar-select-bg: darken(@project-bar-bg, 8%); @scroll-shadows-bg-color: rgba(255, 255, 255, 1); @scroll-shadows-bg-color-transparent: rgba(255, 255, 255, 0); @sidebar-os-bg: #30363d; @sidebar-os-color: #dbdada; @sidebar-os-active-bg: #383f47; @sidebar-os-active-color: lighten(@sidebar-os-color, 13%); -@sidebar-os-border-color: #050505; // #1a1d21 -@sidebar-os-border-inset-color: rgba(255,255,255,.04); -@sidebar-os-dropdown-link-active-bg: lighten(@sidebar-os-active-bg, 5%); -@sidebar-os-dropdown-link-active-hover-bg: lighten(@sidebar-os-active-bg, 9%); -@sidebar-os-dropdown-link-hover-bg: lighten(@sidebar-os-hover-bg, 4%); -@sidebar-os-hover-bg: #3f4750; -@sidebar-os-icon-color: rgba(200,200,200, .8); -@sidebar-os-padding-x: 20px; -@sidebar-os-padding-x-secondary: 37px; -@sidebar-os-padding-y: 15px; +@sidebar-os-icon-hover-color: rgba(255,255,255, .7); +// @sidebar-os-border-color: #050505; +// @sidebar-os-border-inset-color: rgba(255,255,255,.04); +// @sidebar-os-hover-bg: #3f4750; // primary hover +// @sidebar-os-padding-x-secondary: 37px; @sidebar-os-active: @console-bright-blue; @sidebar-left-mobile: 250px; @sidebar-left-width-lg: 210px; @@ -98,7 +106,7 @@ @scrollbar-thumb-hover: rgba(0,0,0,.18); @scrollbar-thumb-hover-inverse: rgba(255,255,255,.35); @scrollbar-track: rgba(0,0,0,.03); -@scrollbar-track-inverse: @sidebar-os-border-color; +@scrollbar-track-inverse: @project-bar-border-color; @scrollbar-track-inverse-alt: rgba(255,255,255,.1); @scrollbar-track-landing: #042e43; @scrollbar-track-landing-side-bar: darken(#2C343D, 5%); // #2C343D is @landing-side-bar-bg in catalog diff --git a/app/styles/_vertical-nav.less b/app/styles/_vertical-nav.less new file mode 100644 index 0000000000..35e7248c79 --- /dev/null +++ b/app/styles/_vertical-nav.less @@ -0,0 +1,158 @@ +// +// Vertical nav (Sidebar left) +// ----------------------------------------------- + +.nav-pf-vertical { + background-color: @nav-pf-vertical-bg-color; + top: @navbar-os-header-height-mobile; + transition: width .1s ease-in-out, left .1s ease-in-out; + z-index: 990; + @media(min-width: @screen-sm-min) { + top: @navbar-os-header-height-desktop; + } + .has-project-bar & { + top: (@navbar-os-header-height-mobile + @project-bar-height-mobile); + @media(min-width: @screen-sm-min) { + top: (@navbar-os-header-height-desktop + @project-bar-height-desktop); + } + } + .list-group-item { + border-color: @nav-pf-vertical-border-color; + &:after { + background: @nav-pf-vertical-border-inset-color; + content: ''; + display: block; + height: 1px; + position: absolute; + top: 0px; + width: 100%; + } + &.active > a, + &:focus > a, + &:hover > a { + background-color: @nav-pf-vertical-secondary-bg-color; + font-weight: 300; + } + &:focus > a, + &:hover > a { + .pficon, + .fa { + color: @sidebar-os-icon-hover-color; + } + } + &.active > a { + .pficon, + .fa { + color: @nav-pf-vertical-active-icon-color; + } + } + > a, + > a:focus { + font-size: @font-size-base; + font-weight: 300; + text-decoration: none; + @media(max-width: @screen-xs-max) { + height: auto; + padding: 10px 15px; + } + .fa, .pficon { + font-size: (@font-size-base + 2); + @media(min-width: @screen-sm-min) { + font-size: (@font-size-base + 5); + } + } + .list-group-item-value { + line-height: inherit; + text-decoration: none !important; + } + } + // padding aligns arrow vertically + &.secondary-nav-item-pf > a:after { + padding: 16px 0; + @media(max-width: @screen-xs-max) { + padding: 8px 0; + } + } + } + &.collapsed { + .list-group-item.secondary-nav-item-pf:hover, + .list-group-item.secondary-nav-item-pf.active { + > a:after { + right: 12px !important; // prevent arrow moving onHover due to pf rules + } + } + .nav-pf-secondary-nav { + left: (@nav-pf-vertical-collapsed-width - 1); // adjust for 1px border + } + } + &.hide-mobile-nav { + left: -(@nav-pf-vertical-width + 2); // width + box-shadow + } + &.show-mobile-nav { + box-shadow: 2px 0 3px rgba(3,3,3,.15); + left: 0; + } + .list-group-item.secondary-nav-item-pf { + &:hover > a:after { + color: @sidebar-os-icon-hover-color; + } + // right arrow alignment + > a:after { + font-size: 14px; + } + } + .nav-pf-secondary-nav { + background: @nav-pf-vertical-secondary-bg-color; + border-left: 0; + border-right: 1px solid @nav-pf-vertical-border-color; + top:(@project-bar-height-mobile + @navbar-os-header-height-mobile); + width: @nav-pf-vertical-width + 1; // adjust for 1px border + @media(min-width: @screen-sm-min) { + border-left: 1px solid @nav-pf-vertical-border-color; // inset border between primary and secondary + top: (@project-bar-height-desktop + @navbar-os-header-height-desktop); + } + .list-group-item { + &:after { + display: none; + } + &.active > a { + background: @nav-pf-vertical-secondary-active-bg-color; + &:hover { + background: @nav-pf-vertical-secondary-active-bg-color; + } + } + > a { + background: transparent; + &:hover { + text-decoration: none; + background: @nav-pf-vertical-secondary-hover-color; + } + } + } + .tech-preview & { + top: (@navbar-os-header-height-mobile + @project-bar-height-mobile + @tech-preview-banner-height); + @media(min-width: @screen-sm-min) { + top: (@navbar-os-header-height-desktop + @project-bar-height-desktop + @tech-preview-banner-height); + } + } + } + .nav-item-pf-header { + font-size: (@font-size-base + 1); + } + .nav-pf-secondary-nav .list-group-item > a { + padding: 4px 0 2px 0; + margin-left: 20px; + } + .tech-preview & { + top: (@navbar-os-header-height-mobile + @tech-preview-banner-height); + @media(min-width: @screen-sm-min) { + top: (@navbar-os-header-height-desktop + @tech-preview-banner-height); + } + } + .tech-preview.has-project-bar & { + top: (@navbar-os-header-height-mobile + @project-bar-height-mobile + @tech-preview-banner-height); + @media(min-width: @screen-sm-min) { + top: (@navbar-os-header-height-desktop + @project-bar-height-desktop + @tech-preview-banner-height); + } + } +} diff --git a/app/styles/main.less b/app/styles/main.less index e53c940fdb..2f5a21780d 100644 --- a/app/styles/main.less +++ b/app/styles/main.less @@ -30,27 +30,30 @@ @import "_core.less"; @import "_data-toolbar.less"; @import "_ellipsis.less"; +@import "_layouts.less"; @import "_list-pf.less"; @import "_list-view.less"; -@import "_navbar-alt.less"; +@import "_navbar-vertical.less"; @import "_overlay-forms.less"; @import "_overview.less"; @import "_pipeline.less"; -@import "_project-menu.less"; +@import "_project-bar.less"; @import "_responsive-utilities.less"; @import "_scrollbars.less"; @import "_scroll-shadows-horizontal.less"; @import "_secrets.less"; -@import "_sidebar.less"; -@import "_substructure.less"; +@import "_sidebar-right.less"; +@import "_system-status.less"; @import "_tables.less"; @import "_tile.less"; +@import "_tech-preview.less"; @import "_tooltip.less"; @import "_typography.less"; @import "_spacers.less"; @import "_log.less"; @import "_settings.less"; @import "_utils.less"; +@import "_vertical-nav.less"; @import "_patternfly-additions.less"; @import "_projects.less"; @import "_container-terminal.less"; diff --git a/app/views/_project-page.html b/app/views/_project-page.html deleted file mode 100644 index 3cb68ae613..0000000000 --- a/app/views/_project-page.html +++ /dev/null @@ -1,15 +0,0 @@ -
    - -
    -
    - -
    -
    - -
    diff --git a/app/views/_sidebar.html b/app/views/_sidebar.html index e96b059afc..b618dc348a 100644 --- a/app/views/_sidebar.html +++ b/app/views/_sidebar.html @@ -1,58 +1,78 @@ - + + +
    diff --git a/app/views/about.html b/app/views/about.html index 1a843aac59..30aa43a099 100644 --- a/app/views/about.html +++ b/app/views/about.html @@ -1,50 +1,39 @@ - -
    - -
    - -
    -
    -
    -
    +
    +
    +
    +
    +
    +
    -
    -
    -
    - -
    -

    Red Hat OpenShift ®

    -

    About

    -

    OpenShift is Red Hat's Platform-as-a-Service (PaaS) that allows developers to quickly develop, host, and scale applications in a cloud environment.

    + +
    +

    Red Hat OpenShift ®

    +

    About

    +

    OpenShift is Red Hat's Platform-as-a-Service (PaaS) that allows developers to quickly develop, host, and scale applications in a cloud environment.

    -

    Version

    -
    -
    OpenShift Master:
    -
    {{version.master.openshift || 'unknown'}}
    -
    Kubernetes Master:
    -
    {{version.master.kubernetes || 'unknown'}}
    -
    +

    Version

    +
    +
    OpenShift Master:
    +
    {{version.master.openshift || 'unknown'}}
    +
    Kubernetes Master:
    +
    {{version.master.kubernetes || 'unknown'}}
    +
    -

    The documentation helps you learn about OpenShift and start exploring its features. From getting started with creating your first application to trying out more advanced build and deployment techniques, it provides guidance on setting up and managing your OpenShift environment as an application developer.

    +

    The documentation helps you learn about OpenShift and start exploring its features. From getting started with creating your first application to trying out more advanced build and deployment techniques, it provides guidance on setting up and managing your OpenShift environment as an application developer.

    -

    With the OpenShift command line interface (CLI), you can create applications and manage OpenShift projects from a terminal. To get started using the CLI, visit Command Line Tools. -

    +

    With the OpenShift command line interface (CLI), you can create applications and manage OpenShift projects from a terminal. To get started using the CLI, visit Command Line Tools. +

    -

    Account

    -

    You are currently logged in under the user account {{user.metadata.name}}.

    +

    Account

    +

    You are currently logged in under the user account {{user.metadata.name}}.

    -
    -
    -
    -
    -
    -
    -
    -
    +
    +
    +
    +
    +
    diff --git a/app/views/add-config-volume.html b/app/views/add-config-volume.html index fcdca5df1e..5b2cdfe765 100644 --- a/app/views/add-config-volume.html +++ b/app/views/add-config-volume.html @@ -1,224 +1,210 @@ - -
    - +
    +
    +
    +
    + +
    Loading...
    -
    - -
    -
    -
    -
    -
    -
    - -
    Loading...
    +
    +

    The {{kind | humanizeKind}} could not be loaded.

    +

    {{error | getErrorDetails}}

    +
    -
    -

    The {{kind | humanizeKind}} could not be loaded.

    -

    {{error | getErrorDetails}}

    -
    +
    +
    +

    No config maps or secrets.

    -
    -
    -

    No config maps or secrets.

    +

    + There are no config maps or secrets in project {{project | displayName}} to use + as a volume for this {{kind | humanizeKind}}. +

    -

    - There are no config maps or secrets in project {{project | displayName}} to use - as a volume for this {{kind | humanizeKind}}. -

    +

    Back to {{kind | humanizeKind}} {{name}}

    +
    -

    Back to {{kind | humanizeKind}} {{name}}

    +
    +

    Add Config Files to {{name}}

    +
    + Add values from a config map or secret as volume. This will make the data available as files for {{kind | humanizeKind}} {{name}}. +
    +
    +
    +
    + + + + + {{$select.selected.metadata.name}} + – {{$select.selected.kind | humanizeKind : true}} + + + + + + +
    + + Create Config Map + + + + Create Secret + +
    +
    + Pick the config source. Its data will be mounted as a volume in the container.
    +
    -
    -

    Add Config Files to {{name}}

    -
    - Add values from a config map or secret as volume. This will make the data available as files for {{kind | humanizeKind}} {{name}}. -
    - -
    -
    - - - - - {{$select.selected.metadata.name}} - – {{$select.selected.kind | humanizeKind : true}} - - - - - - -
    - - Create Config Map - - - - Create Secret - -
    -
    - Pick the config source. Its data will be mounted as a volume in the container. -
    -
    +
    + + +
    + + Mount path for the volume. + + A file will be created in this directory for each key from the config + map or secret. The file contents will be the value of the key. + + +
    +
    + + Mount path must be a valid path to a directory starting with /. + +
    +
    + + The mount path is already used. Please choose another mount path. + +
    +
    -
    - - -
    - - Mount path for the volume. - - A file will be created in this directory for each key from the config - map or secret. The file contents will be the value of the key. - - -
    -
    - - Mount path must be a valid path to a directory starting with /. - -
    -
    - - The mount path is already used. Please choose another mount path. - -
    -
    +
    +
    + +
    + Add only certain keys or use paths that are different than the key names. +
    +
    +
    -
    -
    - -
    - Add only certain keys or use paths that are different than the key names. -
    -
    +
    +

    Keys and Paths

    +
    + Select the keys to use and the file paths where each key will be exposed. + The file paths are relative to the mount path. + The contents of each file will be the value of the key. +
    +
    +
    +
    + + + + {{$select.selected}} + + + + + +
    +
    + + +
    + + Path must be a relative path. It cannot start with / or + contain .. path elements. +
    - -
    -

    Keys and Paths

    -
    - Select the keys to use and the file paths where each key will be exposed. - The file paths are relative to the mount path. - The contents of each file will be the value of the key. -
    -
    -
    -
    - - - - {{$select.selected}} - - - - - -
    -
    - - -
    - - Path must be a relative path. It cannot start with / or - contain .. path elements. - -
    -
    - - Paths must be unique. - -
    -
    -
    -
    - Remove Item - - - Add Item - -
    -
    +
    + + Paths must be unique. +
    +
    +
    +
    + Remove Item + + + Add Item + +
    +
    +
    -
    -

    Containers

    -
    - The volume will be mounted into all containers. You can - select specific containers - instead. -
    - -
    - - - -
    -
    +
    +

    Containers

    +
    + The volume will be mounted into all containers. You can + select specific containers + instead. +
    -
    - - Cancel -
    -
    - +
    + + +
    -
    -
    -
    -
    -
    -
    -
    -
    + +
    + + Cancel +
    + + +
    +
    +
    +
    +
    +
    diff --git a/app/views/attach-pvc.html b/app/views/attach-pvc.html index 5a80a78691..8f50b935c7 100644 --- a/app/views/attach-pvc.html +++ b/app/views/attach-pvc.html @@ -1,236 +1,224 @@ - -
    - - -
    - -
    -
    -
    -
    -
    -
    - -
    Loading...
    - -
    -

    No persistent volume claims.

    +
    +
    +
    +
    +
    + +
    Loading...
    + +
    +

    No persistent volume claims.

    + +

    + A persistent volume claim is required to attach to this {{kind | humanizeKind}}, + but none are loaded on this project. +

    + + -

    - A persistent volume claim is required to attach to this {{kind | humanizeKind}}, - but none are loaded on this project. -

    +

    + To claim storage from a persistent volume, refer to the documentation on using persistent volumes. +

    - +

    Back to {{kind | humanizeKind}} {{name}}

    +
    -

    - To claim storage from a persistent volume, refer to the documentation on using persistent volumes. -

    +
    +

    Add Storage to {{name}}

    +
    + Add an existing persistent volume claim to the template of {{kind | humanizeKind}} {{name}}. +
    +
    +
    +
    + + + + + + + + + + + + +
    + + {{pvc.metadata.name}}{{pvc.status.capacity['storage'] | usageWithUnits: 'storage'}}{{pvc.spec.resources.requests['storage'] | usageWithUnits: 'storage'}}({{pvc.spec.accessModes | accessModes | join}}) + {{pvc.status.phase}} + + to volume {{pvc.spec.volumeName}} + +
    +
    +
    + Select storage to use. +
    +
    + Select storage to use or create storage. + . You cannot create new storage since you are at quota. +
    -

    Back to {{kind | humanizeKind}} {{name}}

    +

    Volume

    +
    + Specify details about how volumes are going to be mounted inside containers.
    -
    -

    Add Storage to {{name}}

    -
    - Add an existing persistent volume claim to the template of {{kind | humanizeKind}} {{name}}. +
    + + +
    + Mount path for the volume inside the container. If not specified, the volume will not be mounted automatically.
    - -
    -
    - - - - - - - - - - - - -
    - - {{pvc.metadata.name}}{{pvc.status.capacity['storage'] | usageWithUnits: 'storage'}}{{pvc.spec.resources.requests['storage'] | usageWithUnits: 'storage'}}({{pvc.spec.accessModes | accessModes | join}}) - {{pvc.status.phase}} - - to volume {{pvc.spec.volumeName}} - -
    -
    -
    - Select storage to use. -
    -
    - Select storage to use or create storage. - . You cannot create new storage since you are at quota. -
    - -

    Volume

    -
    - Specify details about how volumes are going to be mounted inside containers. -
    - -
    - - -
    - Mount path for the volume inside the container. If not specified, the volume will not be mounted automatically. -
    -
    - - Mount path must be a valid path to a directory starting with /. - -
    -
    - - Volume mount in that path already exists. Please choose another mount path. - -
    -
    - -
    - - -
    - Optional path within the volume from which it will be mounted into the - container. Defaults to the volume's root. -
    -
    - - Path must be a relative path. It cannot start with / or - contain .. path elements. - -
    -
    +
    + + Mount path must be a valid path to a directory starting with /. + +
    +
    + + Volume mount in that path already exists. Please choose another mount path. + +
    +
    -
    - - - -
    - Unique name used to identify this volume. If not specified, a volume name is generated. -
    -
    - - Volume names may only contain lower-case letters, numbers, and dashes. - They may not start or end with a dash. - -
    -
    - - Volume names cannot be longer than 63 characters. - -
    -
    - - Volume name already exists. Please choose another name. - -
    -
    +
    + + +
    + Optional path within the volume from which it will be mounted into the + container. Defaults to the volume's root. +
    +
    + + Path must be a relative path. It cannot start with / or + contain .. path elements. + +
    +
    -
    -
    - -
    - Mount the volume as read-only. -
    -
    -
    +
    + + + +
    + Unique name used to identify this volume. If not specified, a volume name is generated. +
    +
    + + Volume names may only contain lower-case letters, numbers, and dashes. + They may not start or end with a dash. + +
    +
    + + Volume names cannot be longer than 63 characters. + +
    +
    + + Volume name already exists. Please choose another name. + +
    +
    - -
    -
    - The volume will be mounted into all containers. You can - select specific containers - instead. -
    +
    +
    + +
    + Mount the volume as read-only. +
    +
    +
    -
    - - - -
    -
    + +
    +
    + The volume will be mounted into all containers. You can + select specific containers + instead. +
    - - +
    + + + +
    +
    -
    - - Cancel -
    -
    -
    + + + +
    + + Cancel
    -
    -
    + +
    -
    -
    -
    -
    -
    +
    +
    +
    +
    +
    diff --git a/app/views/browse/build-config.html b/app/views/browse/build-config.html index 5ca46e4de5..f8fbcc5202 100644 --- a/app/views/browse/build-config.html +++ b/app/views/browse/build-config.html @@ -1,512 +1,506 @@ - - - -
    -
    -
    -
    - - -

    -

    - -
    -
    -
    -
    -
    Loading...
    -
    -
    - - - History - - -
    Loading...
    + + source repository + {{buildConfig.spec.source.git.uri}} + + + build configuration {{buildConfig.metadata.name}}. + + + + No pipeline builds have run for {{buildConfigName}}. +
    + + View the Jenkinsfile to see what stages will run. + + + View the file {{buildConfig.spec.strategy.jenkinsPipelineStrategy.jenkinsfilePath}} in the + source repository + source repository + to see what stages will run. + +
    +

    - -
    -

    No builds.

    + -

    - - - Builds will create an image from - - - Start a new build to create an image from - - - source repository - {{buildConfig.spec.source.git.uri}} - - - build configuration {{buildConfig.metadata.name}}. - - - - No pipeline builds have run for {{buildConfigName}}. -
    - - View the Jenkinsfile to see what stages will run. - - - View the file {{buildConfig.spec.strategy.jenkinsPipelineStrategy.jenkinsfilePath}} in the - source repository - source repository - to see what stages will run. - -
    -

    +
    - + +
    + +
    + + + Build + + #{{latestBuild | annotation : 'buildNumber'}}{{latestBuild.metadata.name}} + + failed. + encountered an error. + was cancelled. + is {{latestBuild.status.phase | lowercase}}. + + + + + + View Log + + + + View Log + + +
    +
    + + created + + + started + +
    + +
    +
    +
    +
    +
    +
    - - -
    - -
    - - - Build - - #{{latestBuild | annotation : 'buildNumber'}}{{latestBuild.metadata.name}} - - failed. - encountered an error. - was cancelled. - is {{latestBuild.status.phase | lowercase}}. - - - - - - View Log - - - - View Log - - -
    -
    - - created +
    +
    + + + + + + + + + + + + + + + + + + + + +
    BuildStatusDurationCreated
    {{emptyMessage}}
    + + + #{{build | annotation : 'buildNumber'}} - - started + + {{build.metadata.name}} + +
    + + {{build.status.phase}} + {{build.status.reason | sentenceCase}} +
    +
    + + {{build.status.startTimestamp | duration : build.status.completionTimestamp}} + + +
    +
    + + + +
    {{emptyMessage}}
    +
    +
    + + + Configuration +
    +
    +
    + + +
    +
    +
    Build Strategy:
    +
    {{buildConfig.spec.strategy.type | startCase}}
    - - -
    -
    -
    -
    -
    - +
    +
    +
    Source Repo:
    +
    {{buildConfig.spec.source.git.uri}}
    +
    Source Ref:
    +
    {{buildConfig.spec.source.git.ref}}
    +
    Source Context Dir:
    +
    {{buildConfig.spec.source.contextDir}}
    +
    +
    +
    Jenkinsfile Path:
    +
    + {{buildConfig.spec.strategy.jenkinsPipelineStrategy.jenkinsfilePath}} +
    +
    + {{buildConfig.spec.strategy.jenkinsPipelineStrategy.jenkinsfilePath}} +
    +
    -
    - - - - - - - - - - - - - - - - - - - - -
    BuildStatusDurationCreated
    {{emptyMessage}}
    - - - #{{build | annotation : 'buildNumber'}} - - - {{build.metadata.name}} - - -
    - - {{build.status.phase}} - {{build.status.reason | sentenceCase}} +
    Binary Input as File:
    +
    {{buildConfig.spec.source.binary.asFile}}
    +
    +
    Source:
    +
    + none + + + + + +
    +
    +
    +
    Image Sources:
    +
    +
    +

    {{imageSource.from | imageObjectRef : buildConfig.metadata.namespace}}

    +
    +
    +
    Paths:
    +
    +
    {{source}}{{destination}}
    +
    -
    - - {{build.status.startTimestamp | duration : build.status.completionTimestamp}} - - -
    -
    - - - -
    {{emptyMessage}}
    + +
    +
    +
    +
    Builder Image:
    +
    + + {{buildFrom | imageObjectRef : buildConfig.metadata.namespace}} + + + {{buildFrom | imageObjectRef : buildConfig.metadata.namespace}} + +
    +
    +
    Output To:
    +
    + + {{outputTo | imageObjectRef : buildConfig.metadata.namespace}} + + + {{outputTo | imageObjectRef : buildConfig.metadata.namespace}} + +
    +
    +
    Run Policy:
    +
    + {{buildConfig.spec.runPolicy | sentenceCase}} + + + + + + + + +
    +
    + +
    +
    Dockerfile:
    +
    +
    +
    + +
    + Jenkinsfile: +
    +
    +
    + +
    +

    Post-Commit Hooks

    +
    - - - Configuration -
    -
    -
    - - -
    -
    -
    Build Strategy:
    -
    {{buildConfig.spec.strategy.type | startCase}}
    -
    -
    -
    -
    Source Repo:
    -
    {{buildConfig.spec.source.git.uri}}
    -
    Source Ref:
    -
    {{buildConfig.spec.source.git.ref}}
    -
    Source Context Dir:
    -
    {{buildConfig.spec.source.contextDir}}
    -
    -
    -
    Jenkinsfile Path:
    -
    - {{buildConfig.spec.strategy.jenkinsPipelineStrategy.jenkinsfilePath}} -
    -
    - {{buildConfig.spec.strategy.jenkinsPipelineStrategy.jenkinsfilePath}} -
    - -
    -
    Binary Input as File:
    -
    {{buildConfig.spec.source.binary.asFile}}
    -
    -
    Source:
    -
    - none - - - - - -
    -
    -
    -
    Image Sources:
    -
    -
    -

    {{imageSource.from | imageObjectRef : buildConfig.metadata.namespace}}

    -
    -
    -
    Paths:
    -
    -
    {{source}}{{destination}}
    -
    -
    -
    -
    -
    -
    -
    Builder Image:
    -
    - - {{buildFrom | imageObjectRef : buildConfig.metadata.namespace}} - - - {{buildFrom | imageObjectRef : buildConfig.metadata.namespace}} - -
    -
    -
    Output To:
    +
    +
    +

    Triggers Learn More 

    +
    +
    +
    +
    +
    Bitbucket Webhook URL: +
    - - {{outputTo | imageObjectRef : buildConfig.metadata.namespace}} - - - {{outputTo | imageObjectRef : buildConfig.metadata.namespace}} - +
    -
    -
    -
    Run Policy:
    +
    +
    +
    GitHub Webhook URL: +
    - {{buildConfig.spec.runPolicy | sentenceCase}} - - - - - - - - +
    -
    - -
    -
    Dockerfile:
    -
    -
    -
    - -
    - Jenkinsfile: -
    -
    -
    -
    -
    -

    Post-Commit Hooks

    -
    -
    -
    -

    Triggers Learn More 

    -
    -
    -
    -
    -
    Bitbucket Webhook URL: -
    -
    - -
    -
    -
    -
    GitHub Webhook URL: -
    -
    - -
    -
    -
    -
    GitLab Webhook URL: -
    -
    - -
    -
    -
    -
    Generic Webhook URL: -
    -
    - -
    -
    -
    -
    - New Image For: -
    -
    - - {{triggerFrom | imageObjectRef : buildConfig.metadata.namespace}} - - - {{triggerFrom | imageObjectRef : buildConfig.metadata.namespace}} - -
    -
    -
    -
    Config Change For:
    -
    Build config {{buildConfig.metadata.name}}
    -
    -
    -
    Other Trigger:
    -
    {{trigger.type}}
    -
    -
    -
    -
    Manual (CLI): +
    +
    GitLab Webhook URL: +
    +
    + +
    +
    +
    +
    Generic Webhook URL: +
    +
    + +
    +
    +
    +
    + New Image For:
    -
    - +
    + + {{triggerFrom | imageObjectRef : buildConfig.metadata.namespace}} + + + {{triggerFrom | imageObjectRef : buildConfig.metadata.namespace}} +
    -
    +
    +
    +
    Config Change For:
    +
    Build config {{buildConfig.metadata.name}}
    +
    +
    +
    Other Trigger:
    +
    {{trigger.type}}
    +
    - -
    - - - Environment -

    Environment Variables

    -

    - The builder image has additional environment variables defined. Variables defined below will overwrite any from the image with the same name. - Show Image Environment Variables - Hide Image Environment Variables -

    - - -
    - - - - Clear Changes -
    - -
    -
    - -
    -
    -
    -
    -
    -
    - +
    Manual (CLI): +
    +
    + +
    + +
    +
    + +
    + + + Environment +

    Environment Variables

    +

    + The builder image has additional environment variables defined. Variables defined below will overwrite any from the image with the same name. + Show Image Environment Variables + Hide Image Environment Variables +

    + + +
    + + + + Clear Changes +
    + +
    +
    + +
    +
    +
    +
    +
    diff --git a/app/views/browse/build.html b/app/views/browse/build.html index c86dd59490..b687f4457d 100644 --- a/app/views/browse/build.html +++ b/app/views/browse/build.html @@ -1,155 +1,148 @@ - - +
    +
    +
    + + +
    Loading...
    +
    +

    +

    + + +
    +
    +
    +
    +
    +
    +
    - - - Details - - - + + + Details + + + - - Environment -

    Environment Variables

    -

    - - Environment variables can be edited on the build configuration. -

    - -

    The build strategy had no environment variables defined.

    -
    + + Environment +

    Environment Variables

    +

    + + Environment variables can be edited on the build configuration. +

    + +

    The build strategy had no environment variables defined.

    +
    - - Logs - + + Logs + - - - {{build.status.phase}} + + + {{build.status.phase}} -
    - Log from {{build.status.startTimestamp | date : 'medium'}} - - to {{build.status.completionTimestamp | date : 'medium'}} - -
    +
    + Log from {{build.status.startTimestamp | date : 'medium'}} + + to {{build.status.completionTimestamp | date : 'medium'}} + +
    -
    -
    - - Events - - -
    + + + + Events + + +
    -
    -
    -
    -
    -
    -
    - +
    +
    +
    +
    +
    diff --git a/app/views/browse/config-map.html b/app/views/browse/config-map.html index 6bc90d4732..31ccf95351 100644 --- a/app/views/browse/config-map.html +++ b/app/views/browse/config-map.html @@ -1,80 +1,74 @@ - - - -
    -
    -
    -
    - - -
    Loading...
    -
    -

    The config map could not be loaded.

    -

    {{error | getErrorDetails}}

    +
    +
    +
    + + +
    Loading...
    +
    +

    The config map could not be loaded.

    +

    {{error | getErrorDetails}}

    +
    +
    +

    + -
    -

    - - {{configMap.metadata.name}} - created -

    - + {{configMap.metadata.name}} + created +

    + +
    +
    +
    +
    +
    +
    +
    +
    +

    The config map has no items.

    -
    -
    -
    -
    -
    -
    -
    -

    The config map has no items.

    -
    -
    - - - - - - - -
    {{prop}} - - -
    -
    - -
    +
    + + + + + + + +
    {{prop}} + + +
    -
    -
    -
    -
    - + +
    +
    +
    +
    +
    diff --git a/app/views/browse/config-maps.html b/app/views/browse/config-maps.html index c96fc69ded..4ebe962a16 100644 --- a/app/views/browse/config-maps.html +++ b/app/views/browse/config-maps.html @@ -1,72 +1,65 @@ - - - - -
    -
    -
    -
    - -
    -
    - -
    -
    +
    +
    +
    + -
    -
    - -
    -
    -
    Loading...
    -
    - - - - - - - - - - - - - - - - - - - - - -
    NameCreatedLabels
    No config maps to show
    - {{configMap.metadata.name}} - - - - none - -
    -
    -
    -
    +

    + Config Maps + + + Learn More + + +

    +
    +
    +
    +
    -
    -
    -
    - +
    +
    +
    +
    +
    + +
    +
    +
    Loading...
    +
    + + + + + + + + + + + + + + + + + + + + + +
    NameCreatedLabels
    No config maps to show
    + {{configMap.metadata.name}} + + + + none + +
    +
    +
    +
    +
    +
    +
    diff --git a/app/views/browse/deployment-config.html b/app/views/browse/deployment-config.html index e4384af01b..535442ee43 100644 --- a/app/views/browse/deployment-config.html +++ b/app/views/browse/deployment-config.html @@ -1,366 +1,359 @@ - - +
    +
    +
    + + +
    +

    +

    + +
    +
    +
    +
    +
    +
    Loading...
    +
    +
    +
    + + {{deploymentConfig.metadata.name}} is paused. + This will stop any new rollouts or triggers from running until resumed. + + Resume Rollouts +
    -
    -
    -
    -
    Loading...
    -
    -
    -
    - - {{deploymentConfig.metadata.name}} is paused. - This will stop any new rollouts or triggers from running until resumed. - - Resume Rollouts + + + History +
    + +
    + + + Deployment + + #{{mostRecent | annotation : 'deploymentVersion'}}{{mostRecent.metadata.name}} + is + {{mostRecent | deploymentStatus | lowercase}}. + View Log +
    - - - History -
    - -
    - - - Deployment - - #{{mostRecent | annotation : 'deploymentVersion'}}{{mostRecent.metadata.name}} - is - {{mostRecent | deploymentStatus | lowercase}}. - View Log +
    + created +
    +
    +
    +
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + +
    DeploymentStatusCreatedTrigger
    {{emptyMessage}}
    + + + #{{deployment | annotation : 'deploymentVersion'}} + (latest) + + +
    + + + {{deployment | deploymentStatus}}, + {{deployment.status.replicas}}/{{deployment.spec.replicas}} replicas - -
    -
    - created -
    - -
    -
    -
    - -
    +
    -
    - - - - - - - - - - - - - - - - - - + + - - -
    DeploymentStatusCreatedTrigger
    {{emptyMessage}}
    - - - #{{deployment | annotation : 'deploymentVersion'}} - (latest) - - -
    - - - {{deployment | deploymentStatus}}, - {{deployment.status.replicas}}/{{deployment.spec.replicas}} replicas - - -
    -
    - - - Unknown - - - - - - Image change - - - Config change - {{cause.type}} - + + + + Unknown + + + + + + Image change -
    - - - Configuration -
    -
    -
    - - -
    -
    Selectors:
    -
    - -
    -
    Replicas:
    -
    - - (autoscaled) -
    + Config change + {{cause.type}} + + + +
    + + + Configuration +
    +
    +
    + + +
    +
    Selectors:
    +
    + +
    +
    Replicas:
    +
    + + (autoscaled) +
    -
    Strategy:
    -
    {{deploymentConfig.spec.strategy.type}}
    +
    Strategy:
    +
    {{deploymentConfig.spec.strategy.type}}
    -
    -
    Timeout:
    -
    {{strategyParams.timeoutSeconds}} sec
    -
    Update Period:
    -
    {{strategyParams.updatePeriodSeconds}} sec
    -
    Interval:
    -
    {{strategyParams.intervalSeconds}} sec
    -
    Max Unavailable:
    -
    {{strategyParams.maxUnavailable}}
    -
    Max Surge:
    -
    {{strategyParams.maxSurge}}
    -
    - -
    -

    Template

    - - -

    Volumes

    -

    - none -

    - - -

    - Add Storage - - Add Config Files -

    -
    +
    +
    Timeout:
    +
    {{strategyParams.timeoutSeconds}} sec
    +
    Update Period:
    +
    {{strategyParams.updatePeriodSeconds}} sec
    +
    Interval:
    +
    {{strategyParams.intervalSeconds}} sec
    +
    Max Unavailable:
    +
    {{strategyParams.maxUnavailable}}
    +
    Max Surge:
    +
    {{strategyParams.maxSurge}}
    +
    + + +

    Template

    + + +

    Volumes

    +

    + none +

    + + +

    + Add Storage + + Add Config Files +

    +
    - -
    -

    Autoscaling

    + +
    +

    Autoscaling

    - -
    - - Warning: - {{warning.message}} + +
    + + Warning: + {{warning.message}} - - Edit Resource - Requests and Limits -
    + + Edit Resource + Requests and Limits +
    - -
    - Add Autoscaler - Autoscaling is not enabled. There are no autoscalers for this deployment config. -
    + +
    + Add Autoscaler + Autoscaling is not enabled. There are no autoscalers for this deployment config. +
    - -
    - -
    -
    + +
    + +
    +
    -
    -

    - Hooks - - Learn More  - -

    -
    - -
    -
    - -
    -
    - -
    -
    - none -
    -
    +
    +

    + Hooks + + Learn More  + +

    +
    + +
    +
    + +
    +
    + +
    +
    + none +
    +
    -
    -

    Triggers

    -
    -
    Manual (CLI): - - Learn More  - -
    +
    +

    Triggers

    +
    +
    Manual (CLI): + + Learn More  + +
    +
    + +
    +
    + + {{trigger.type}} + +
    New Image For:
    - + {{trigger.imageChangeParams.from | imageObjectRef : deploymentConfig.metadata.namespace}} + (disabled)
    -
    - - {{trigger.type}} - -
    New Image For:
    -
    - {{trigger.imageChangeParams.from | imageObjectRef : deploymentConfig.metadata.namespace}} - (disabled) -
    -
    - -
    Change Of:
    -
    Config
    -
    -
    -
    -
    -
    + + +
    Change Of:
    +
    Config
    +
    + +
    + +
    - -
    - - -
    + +
    + + +
    -
    - -
    -
    - - Environment - - - - Events - - -
    -
    -
    -
    -
    -
    -
    - +
    + +
    + + + Environment + + + + Events + + + +
    +
    +
    +
    +
    diff --git a/app/views/browse/deployment.html b/app/views/browse/deployment.html index 6c831a5754..8d8cbd8b50 100644 --- a/app/views/browse/deployment.html +++ b/app/views/browse/deployment.html @@ -1,302 +1,296 @@ - - +
    - -
    -
    -
    -
    - - -
    -

    - - {{name}} - created -

    - +
    +
    + + +
    +

    + -

    -
    -
    -
    -
    Loading...
    -
    -
    -
    - - {{deployment.metadata.name}} is paused. - This pauses any in-progress rollouts and stops new - rollouts from running until the deployment is resumed. - - Resume Rollouts - -
    - - - History -
    -
    -
    - -
    -
    + {{name}} + created + + +
    +
    +
    +
    +
    +
    Loading...
    +
    +
    +
    + + {{deployment.metadata.name}} is paused. + This pauses any in-progress rollouts and stops new + rollouts from running until the deployment is resumed. + + Resume Rollouts + +
    + + + History +
    +
    +
    +
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    VersionNameReplicasCreated
    {{emptyMessage}}
    - #{{replicaSet | annotation : 'deployment.kubernetes.io/revision'}} - - {{replicaSet.metadata.name}} - - {{replicaSet.status.replicas}}/{{replicaSet.spec.replicas}} replicas - - -
    - - - Configuration -
    -
    -
    - - -
    -
    Selectors:
    -
    - -
    -
    Replicas:
    -
    - - (autoscaled) -
    - {{deployment.status.updatedReplicas}} up to date -
    -
    - {{deployment.status.availableReplicas}} available, - {{deployment.status.unavailableReplicas}} unavailable -
    -
    -
    Strategy:
    -
    {{deployment.spec.strategy.type | sentenceCase}}
    -
    - Max Unavailable: - -
    -
    - 25% - - {{deployment.spec.strategy.rollingUpdate.maxUnavailable}} - -
    -
    - Max Surge: - -
    -
    - 25% - - {{deployment.spec.strategy.rollingUpdate.maxSurge}} - -
    -
    - Min Ready: - -
    -
    - {{deployment.spec.minReadySeconds || 0}} sec -
    -
    - Revision History Limit: - -
    -
    - {{deployment.spec.revisionHistoryLimit || 2}} -
    -
    - Progress Deadline: - -
    -
    - {{deployment.spec.progressDeadlineSeconds || 600}} sec -
    -
    - -

    Template

    - - - -
    -
    -

    Volumes

    -

    - none -

    - - - +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    VersionNameReplicasCreated
    {{emptyMessage}}
    + #{{replicaSet | annotation : 'deployment.kubernetes.io/revision'}} + + {{replicaSet.metadata.name}} + + {{replicaSet.status.replicas}}/{{replicaSet.spec.replicas}} replicas + + +
    + + + Configuration +
    +
    +
    + + +
    +
    Selectors:
    +
    + +
    +
    Replicas:
    +
    + + (autoscaled) +
    + {{deployment.status.updatedReplicas}} up to date +
    +
    + {{deployment.status.availableReplicas}} available, + {{deployment.status.unavailableReplicas}} unavailable
    +
    +
    Strategy:
    +
    {{deployment.spec.strategy.type | sentenceCase}}
    +
    + Max Unavailable: + +
    +
    + 25% + + {{deployment.spec.strategy.rollingUpdate.maxUnavailable}} + +
    +
    + Max Surge: + +
    +
    + 25% + + {{deployment.spec.strategy.rollingUpdate.maxSurge}} + +
    +
    + Min Ready: + +
    +
    + {{deployment.spec.minReadySeconds || 0}} sec +
    +
    + Revision History Limit: + +
    +
    + {{deployment.spec.revisionHistoryLimit || 2}} +
    +
    + Progress Deadline: + +
    +
    + {{deployment.spec.progressDeadlineSeconds || 600}} sec +
    +
    -

    Autoscaling

    +

    Template

    + + - -
    - - Warning: - {{warning.message}} +
    +
    +

    Volumes

    +

    + none +

    + + + - - Edit Resource - Requests and Limits -
    +

    Autoscaling

    - -
    - Add Autoscaler - none -
    + +
    + + Warning: + {{warning.message}} - -
    - -
    + + Edit Resource + Requests and Limits +
    -
    - -
    - - -
    + +
    + Add Autoscaler + none
    -
    - + + +
    +
    +
    - - - Environment - - - - Events - - - -
    -
    -
    -
    -
    -
    - + +
    + + +
    +
    +
    + +
    +
    + + + Environment + + + + Events + + + +
    +
    +
    +
    +
    diff --git a/app/views/browse/image.html b/app/views/browse/image.html index 6f72e8b84c..a8c8425410 100644 --- a/app/views/browse/image.html +++ b/app/views/browse/image.html @@ -1,52 +1,45 @@ - - - - -
    -
    -
    -
    - - -
    Loading...
    -
    -

    - {{imageStream.metadata.name}}:{{tagName}} -

    -
    -
    -
    -
    -
    -
    Loading...
    -
    -
    - - - - - Details - - - - - - - Configuration - - - - - Layers -

    No layer information is available for this image.

    - - -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +
    +
    + + +
    Loading...
    +
    +

    + {{imageStream.metadata.name}}:{{tagName}} +

    +
    +
    +
    +
    +
    +
    Loading...
    +
    +
    + + + + + Details + + + + + + + Configuration + + + + + Layers +

    No layer information is available for this image.

    + + +
    +
    +
    +
    +
    +
    +
    diff --git a/app/views/browse/imagestream.html b/app/views/browse/imagestream.html index 24854675e4..1179de2d91 100644 --- a/app/views/browse/imagestream.html +++ b/app/views/browse/imagestream.html @@ -1,61 +1,54 @@ - - - - -
    -
    -
    -
    - - -
    Loading...
    -
    -

    - - {{imageStream.metadata.name}} - created -

    - +
    +
    +
    + + +
    Loading...
    +
    +

    + -

    -
    -
    -
    -
    -
    - - - - - - - - -
    -
    -
    -
    -
    -
    - + {{imageStream.metadata.name}} + created + + +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +
    +
    +
    +
    +
    diff --git a/app/views/browse/persistent-volume-claim.html b/app/views/browse/persistent-volume-claim.html index 8e78c41aeb..b35f111b4e 100644 --- a/app/views/browse/persistent-volume-claim.html +++ b/app/views/browse/persistent-volume-claim.html @@ -1,95 +1,88 @@ - - - - -
    -
    -
    -
    - - -
    Loading...
    -
    -

    - - {{pvc.metadata.name}} - - - waiting for {{pvc.spec.resources.requests['storage'] | usageWithUnits: 'storage'}} allocation, - - waiting for allocation, - - created -

    - -
    -
    -
    -
    -
    -
    -
    - - - Details -
    -
    -
    Status:
    -
    - - {{pvc.status.phase}} - to volume {{pvc.spec.volumeName}} -
    -
    Capacity:
    -
    - - allocated {{pvc.status.capacity['storage'] | usageWithUnits: 'storage'}} - - allocated unknown size -
    -
    Requested Capacity:
    -
    - - {{pvc.spec.resources.requests['storage'] | usageWithUnits: 'storage'}} - - none -
    -
    Access Modes:
    -
    {{pvc.spec.accessModes | accessModes:'long' | join}}
    -
    -
    -
    - - Events - - -
    -
    +
    +
    +
    + + +
    Loading...
    +
    +

    + -

    -
    -
    -
    - + {{pvc.metadata.name}} + + + waiting for {{pvc.spec.resources.requests['storage'] | usageWithUnits: 'storage'}} allocation, + + waiting for allocation, + + created + + +
    +
    +
    +
    +
    +
    +
    + + + Details +
    +
    +
    Status:
    +
    + + {{pvc.status.phase}} + to volume {{pvc.spec.volumeName}} +
    +
    Capacity:
    +
    + + allocated {{pvc.status.capacity['storage'] | usageWithUnits: 'storage'}} + + allocated unknown size +
    +
    Requested Capacity:
    +
    + + {{pvc.spec.resources.requests['storage'] | usageWithUnits: 'storage'}} + + none +
    +
    Access Modes:
    +
    {{pvc.spec.accessModes | accessModes:'long' | join}}
    +
    +
    +
    + + Events + + +
    +
    +
    +
    +
    +
    diff --git a/app/views/browse/pod.html b/app/views/browse/pod.html index c5f0fddfac..8ff0ef280d 100644 --- a/app/views/browse/pod.html +++ b/app/views/browse/pod.html @@ -1,222 +1,215 @@ - - - - -
    -
    -
    -
    - - -
    Loading...
    -
    -

    - - {{pod.metadata.name}} - - - - created -

    - -
    +
    +
    +
    + + +
    Loading...
    +
    +

    + -

    -
    -
    -
    -
    - - - Details - - - - Environment - - - - - - - + {{pod.metadata.name}} + + + + created + + +
    +
    +
    +
    +
    +
    +
    + + + Details + + + + Environment + + + + + + + + + + Logs + + + + + + + {{pod.spec.containers[0].name}} + + + + {{$select.selected.name}} + +
    +
    +
    + + + + + {{containerStateReason || containerStatusKey | sentenceCase}} + + + + Log from {{containerStartTime | date : 'medium'}} to {{containerEndTime | date : 'medium'}} + +
    + +
    +
    - - Logs - + + Terminal - - +
    +

    + No running containers +

    +
    +
    +
    + + + When you navigate away from this pod, any open terminal connections will be closed. + This will kill any foreground processes you started from the terminal. + + +
    + + + +
    +
    +
    + {{pod.spec.containers[0].name}} - - - - {{$select.selected.name}} - -
    + + + + + + {{selectedTerminalContainer.containerName}} + + + +
    + + + + + {{term.status}} + + + {{term.containerState}} + +
    - - - - - {{containerStateReason || containerStatusKey | sentenceCase}} - - - - Log from {{containerStartTime | date : 'medium'}} to {{containerEndTime | date : 'medium'}} - - - - - - - - Terminal - -
    -

    - No running containers -

    - -
    -
    - - - When you navigate away from this pod, any open terminal connections will be closed. - This will kill any foreground processes you started from the terminal. - - -
    - - - -
    -
    -
    - - - {{pod.spec.containers[0].name}} - - - - - - {{selectedTerminalContainer.containerName}} - - - -
    - - - - - {{term.status}} - - - {{term.containerState}} - -
    -
    -
    -
    -
    -
    - -
    -
    - - - -
    -
    +
    +
    + +
    +
    + - - - - Events - - - -
    -
    -
    -
    -
    -
    - + + +
    +
    +
    + + + + Events + + + +
    +
    +
    +
    +
    diff --git a/app/views/browse/replica-set.html b/app/views/browse/replica-set.html index 8a102b5664..009f90028c 100644 --- a/app/views/browse/replica-set.html +++ b/app/views/browse/replica-set.html @@ -1,111 +1,104 @@ - - +
    +
    +
    + + +
    Loading...
    +
    +

    + + + + + + {{replicaSet.metadata.name}} + + Warning: The deployment's deployment config is missing. + created +

    + + +
    +
    +
    +
    +
    +
    +
    + + + Details +
    + +
    +
    + + Environment +

    + + Environment variables can be edited on the deployment + {{deployment.metadata.name}}. +

    +

    + + Environment variables can be edited on deployment config + {{deploymentConfigName}}. +

    + + + +
    + + + + + + + Logs + - -
    -
    -
    -
    - - -
    Loading...
    -
    -

    - - - - - - {{replicaSet.metadata.name}} -

    - - -
    -
    -
    -
    -
    -
    -
    - - - Details -
    - -
    -
    - - Environment -

    - - Environment variables can be edited on the deployment - {{deployment.metadata.name}}. -

    -

    - - Environment variables can be edited on deployment config - {{deploymentConfigName}}. -

    - - - -
    - - - - - - - Logs - - - - - - {{replicaSet | deploymentStatus}} - - - - - Events - - -
    -
    -
    -
    -
    -
    -
    - +
    +
    + + Events + + +
    +
    +
    +
    +
    +
    diff --git a/app/views/browse/route.html b/app/views/browse/route.html index c71bab0b0f..2648e60042 100644 --- a/app/views/browse/route.html +++ b/app/views/browse/route.html @@ -1,225 +1,218 @@ - - +
    +
    +
    + + +
    Loading...
    +
    +

    + + {{route.metadata.name}} + + + created +

    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + + {{route | routeLabel : null : true}} + +
    + + The route is not accepting traffic yet because it has not been admitted by a router. +
    +
    +
    +
    + + + {{route | routeLabel : ingress.host : true}} + + + + + {{route | routeLabel : ingress.host}} + +
    +
    + Admission status unknown for router '{{ingress.routerName}}' + + + Exposed on router '{{ingress.routerName}}' + + + + Rejected by router '{{ingress.routerName}}' + +
    +
    +
    + + + The DNS admin should set up a CNAME from the route's hostname, {{ingress.host}}, + to the router's canonical hostname, {{ingress.routerCanonicalHostname}}. + + Don't Show Me Again +
    +
    +
    - -
    -
    -
    -
    - - -
    Loading...
    -
    -

    -

    - -
    -
    -
    -
    -
    -
    -
    -
    -
    - - {{route | routeLabel : null : true}} + +
    +
    +

    Traffic

    +
    + This route splits traffic across multiple services. +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + +
    ServiceWeight
    + {{route.spec.to.name}} + + {{route.spec.to.weight}} +
    + {{alternate.name}} + + {{alternate.weight}} +
    +
    +
    +
    +

    TLS Settings

    +
    +
    Termination Type:
    +
    {{route.spec.tls.termination | humanizeTLSTermination}}
    +
    Insecure Traffic:
    +
    {{route.spec.tls.insecureEdgeTerminationPolicy || 'None'}}
    +
    Certificate:
    +
    + + Show -
    - - The route is not accepting traffic yet because it has not been admitted by a router. -
    + none +
    +
    +
    {{route.spec.tls.certificate}}
    -
    -
    - - - {{route | routeLabel : ingress.host : true}} - - - - - {{route | routeLabel : ingress.host}} - -
    -
    - Admission status unknown for router '{{ingress.routerName}}' - - - Exposed on router '{{ingress.routerName}}' - - - - Rejected by router '{{ingress.routerName}}' - -
    -
    -
    - - - The DNS admin should set up a CNAME from the route's hostname, {{ingress.host}}, - to the router's canonical hostname, {{ingress.routerCanonicalHostname}}. - - Don't Show Me Again -
    -
    +
    Key:
    +
    + + Show + + none +
    +
    +
    {{route.spec.tls.key}}
    - -

    Details

    -
    -
    Wildcard Policy:
    -
    {{route.spec.wildcardPolicy}}
    -
    Path:
    -
    - {{route.spec.path}} - none -
    -
    {{route.spec.to.kind || "Routes To"}}:
    -
    - {{route.spec.to.name}} -
    -
    Target Port:
    -
    - - {{route.spec.port.targetPort}} - - any -
    -
    - This target port will route to {{route | routeTargetPortMapping : services[route.spec.to.name]}}. -
    -
    -
    -
    -

    Traffic

    -
    - This route splits traffic across multiple services. -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - -
    ServiceWeight
    - {{route.spec.to.name}} - - {{route.spec.to.weight}} -
    - {{alternate.name}} - - {{alternate.weight}} -
    -
    +
    CA Certificate:
    +
    + + Show + + none +
    +
    +
    {{route.spec.tls.caCertificate}}
    -
    -

    TLS Settings

    -
    -
    Termination Type:
    -
    {{route.spec.tls.termination | humanizeTLSTermination}}
    -
    Insecure Traffic:
    -
    {{route.spec.tls.insecureEdgeTerminationPolicy || 'None'}}
    -
    Certificate:
    -
    - - Show - - none -
    -
    -
    {{route.spec.tls.certificate}}
    -
    -
    Key:
    -
    - - Show - - none -
    -
    -
    {{route.spec.tls.key}}
    -
    -
    CA Certificate:
    -
    - - Show - - none -
    -
    -
    {{route.spec.tls.caCertificate}}
    -
    -
    Destination CA Cert:
    -
    - - Show - - none -
    -
    -
    {{route.spec.tls.destinationCACertificate}}
    -
    -
    -

    - TLS is not enabled. - - Edit this route to enable secure network traffic. - -

    +
    Destination CA Cert:
    +
    + + Show + + none +
    +
    +
    {{route.spec.tls.destinationCACertificate}}
    - -
    -
    +
    +

    + TLS is not enabled. + + Edit this route to enable secure network traffic. + +

    +
    +
    -
    -
    -
    -
    - +
    +
    +
    +
    +
    diff --git a/app/views/browse/routes.html b/app/views/browse/routes.html index 38f891eab2..f6100dd6cb 100644 --- a/app/views/browse/routes.html +++ b/app/views/browse/routes.html @@ -1,116 +1,109 @@ - - - - -
    -
    -
    -
    - -
    -
    - -
    -
    +
    +
    +
    + -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{customNameHeader || 'Name'}}HostnameServiceTarget PortTLS Termination
    {{emptyMessage}}
    - {{route.metadata.name}} - - - - - - {{route | routeLabel}} - - - - - {{route | routeLabel}} - - - - Pending - - - {{route.spec.to.kind}}: {{route.spec.to.name}} - {{route.spec.to.name}} - - - {{route.spec.port.targetPort}} - - - {{route.spec.port.targetPort}} - - -   - - {{route.spec.tls.termination | humanizeTLSTermination}} -   -
    -
    -
    +

    + Routes + + + Learn More + + +

    +
    +
    +
    +
    -
    -
    -
    - +
    +
    +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{customNameHeader || 'Name'}}HostnameServiceTarget PortTLS Termination
    {{emptyMessage}}
    + {{route.metadata.name}} + + + + + + {{route | routeLabel}} + + + + + {{route | routeLabel}} + + + + Pending + + + {{route.spec.to.kind}}: {{route.spec.to.name}} + {{route.spec.to.name}} + + + {{route.spec.port.targetPort}} + + + {{route.spec.port.targetPort}} + + +   + + {{route.spec.tls.termination | humanizeTLSTermination}} +   +
    +
    +
    +
    +
    +
    diff --git a/app/views/browse/secret.html b/app/views/browse/secret.html index 1debf98ae5..ad84548998 100644 --- a/app/views/browse/secret.html +++ b/app/views/browse/secret.html @@ -1,89 +1,83 @@ - - - -
    -
    -
    -
    - - -
    Loading...
    -
    -

    The secret details could not be loaded.

    -

    {{error | getErrorDetails}}

    +
    +
    +
    + + +
    Loading...
    +
    +

    The secret details could not be loaded.

    +

    {{error | getErrorDetails}}

    +
    +
    +

    + -
    -

    - - {{secret.metadata.name}} - created -

    -
    -

    -
    -
    -
    -
    -
    -
    -

    - {{secret.type}} - {{view.showSecret ? "Hide" : "Reveal"}} Secret -

    -
    -
    -
    -
    - -
    + {{secret.metadata.name}} + created + +
    +
    +
    +
    +
    +
    +
    +
    +

    + {{secret.type}} + {{view.showSecret ? "Hide" : "Reveal"}} Secret +

    +
    +
    +
    +
    + +
    -
    - -
    -
    -
    {{secretDataName}}
    -
    - - -
    - This secret value contains non-printable characters and is displayed as a Base64-encoded string. -
    -
    -
    *****
    +
    + +
    +
    +
    {{secretDataName}}
    +
    + + +
    + This secret value contains non-printable characters and is displayed as a Base64-encoded string.
    -
    + +
    *****
    -
    - +
    -
    + +
    -
    -
    -
    -
    - +
    +
    +
    +
    +
    diff --git a/app/views/browse/service.html b/app/views/browse/service.html index 9330156d6d..1a58a17e6b 100644 --- a/app/views/browse/service.html +++ b/app/views/browse/service.html @@ -1,119 +1,112 @@ - - - - -
    -
    -
    -
    - - -
    Loading...
    -
    -

    - - {{service.metadata.name}} - created -

    - -
    -
    -
    -
    -
    -
    -
    - - - Details -
    -
    -
    Selectors:
    -
    - none - {{selectorLabel}}={{selectorValue}}, -
    -
    Type:
    -
    {{service.spec.type}}
    -
    IP:
    -
    {{service.spec.clusterIP}}
    -
    Hostname:
    -
    - {{service.metadata.name}}.{{service.metadata.namespace}}.svc - - - -
    -
    External Hostname:
    -
    {{service.spec.externalName}}
    -
    Session affinity:
    -
    {{service.spec.sessionAffinity}}
    -
    Ingress Points:
    -
    - {{ingress.ip}}, -
    -
    External IPs:
    -
    - {{externalIP}}, -
    -
    Routes:
    -
    - - Create route - None - -
    -
    -

    Traffic

    -
    - -
    -

    - Learn more about routes and services. -

    -

    Pods

    -
    - -
    - -
    -
    - - Events - - -
    -
    +
    +
    +
    + + +
    Loading...
    +
    +

    + -

    -
    -
    -
    - + {{service.metadata.name}} + created + + +
    +
    +
    +
    +
    +
    +
    + + + Details +
    +
    +
    Selectors:
    +
    + none + {{selectorLabel}}={{selectorValue}}, +
    +
    Type:
    +
    {{service.spec.type}}
    +
    IP:
    +
    {{service.spec.clusterIP}}
    +
    Hostname:
    +
    + {{service.metadata.name}}.{{service.metadata.namespace}}.svc + + + +
    +
    External Hostname:
    +
    {{service.spec.externalName}}
    +
    Session affinity:
    +
    {{service.spec.sessionAffinity}}
    +
    Ingress Points:
    +
    + {{ingress.ip}}, +
    +
    External IPs:
    +
    + {{externalIP}}, +
    +
    Routes:
    +
    + + Create route + None + +
    +
    +

    Traffic

    +
    + +
    +

    + Learn more about routes and services. +

    +

    Pods

    +
    + +
    + +
    +
    + + Events + + +
    +
    +
    +
    +
    +
    diff --git a/app/views/browse/stateful-set.html b/app/views/browse/stateful-set.html index 9072a101fc..a4b0d56437 100644 --- a/app/views/browse/stateful-set.html +++ b/app/views/browse/stateful-set.html @@ -1,183 +1,177 @@ - - -
    -
    - -
    -
    - Technology Preview - - -
    -

    - {{statefulSet.metadata.name}} - -

    - +
    +
    +
    + Technology Preview + + +
    +

    + {{statefulSet.metadata.name}} + -

    -
    + + +
    +
    +
    + +
    +
    +
    Loading...
    + +
    +
    + + + Details + +
    + +
    + + + +
    + +
    +
    +
    Status:
    +
    + + {{statefulSet | deploymentStatus}} +
    +
    Replicas:
    +
    + + {{podsForStatefulSet | hashSize}}/{{statefulSet.spec.replicas}} replicas + +
    +
    -
    -
    -
    Loading...
    +

    Template

    + + -
    -
    - - - Details + + -
    +
    -
    - - - -
    - -
    -
    -
    Status:
    -
    - - {{statefulSet | deploymentStatus}} -
    -
    Replicas:
    -
    - - {{podsForStatefulSet | hashSize}}/{{statefulSet.spec.replicas}} replicas - -
    -
    - -

    Template

    - - - - - - -
    +
    +
    +
    +

    Volumes

    +

    + none +

    + + + +

    Pods

    + + + + + +
    +
    + -
    -
    -

    Volumes

    -

    - none -

    - - - -

    Pods

    - - - - - - -
    -
    - - - - Environment -
    - -
    -
    - - - Metrics -
    - - -
    -
    + + Environment +
    + +
    +
    + + + Metrics +
    + + +
    +
    - - Events -
    - -
    -
    + + Events +
    + +
    +
    - -
    -
    +
    -
    -
    -
    - +
    +
    +
    +
    diff --git a/app/views/browse/stateful-sets.html b/app/views/browse/stateful-sets.html index 8476c1fcb0..3359958d91 100644 --- a/app/views/browse/stateful-sets.html +++ b/app/views/browse/stateful-sets.html @@ -1,77 +1,68 @@ - - - -
    -
    -
    -
    - -
    -
    - -
    -
    +
    +
    +
    + +
    +
    +
    - -
    -
    - -
    Loading...
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - -
    NameReplicasCreated
    No stateful sets to show
    - {{statefulSet.metadata.name}} - - {{podsByOwnerUID[statefulSet.metadata.uid] | hashSize}}/{{statefulSet.spec.replicas}} replicas - - - -
    -
    -
    +
    +
    +
    +
    + +
    Loading...
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    NameReplicasCreated
    No stateful sets to show
    + {{statefulSet.metadata.name}} + + {{podsByOwnerUID[statefulSet.metadata.uid] | hashSize}}/{{statefulSet.spec.replicas}} replicas + + + +
    -
    - - +
    diff --git a/app/views/builds.html b/app/views/builds.html index fe12522a0a..4509185198 100644 --- a/app/views/builds.html +++ b/app/views/builds.html @@ -1,187 +1,180 @@ - - - - -
    -
    -
    -
    - -
    -
    - -
    -
    +
    +
    +
    + +
    +
    +
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
    NameLast BuildStatusDurationCreatedTypeSource
    {{emptyMessage}}
    - {{buildConfigName}} - No builds{{buildConfigs[buildConfigName].spec.strategy.type | startCase}}
    +
    +
    +
    +
    +
    diff --git a/app/views/command-line.html b/app/views/command-line.html index e980725398..eb31755e40 100644 --- a/app/views/command-line.html +++ b/app/views/command-line.html @@ -1,73 +1,62 @@ - -
    - -
    - -
    -
    -
    -
    -
    -
    -
    -

    Command Line Tools

    -

    - With the OpenShift command line interface (CLI), you can create applications and manage OpenShift projects from a terminal. - - You can download the oc client tool using the links below. For more information about downloading and installing it, please refer to the Get Started with the CLI documentation. - - - Refer to the Get Started with the CLI documentation for instructions about downloading and installing the oc client tool. - -

    - - -
    -

    -

    - After downloading and installing it, you can start by logging in. You are currently logged into this console as {{user.metadata.name}}. If you want to log into the CLI using the same session token: - -

    -                      oc login {{loginBaseURL}}
    -                    
    -

    +
    +
    +
    +
    +
    +
    +

    Command Line Tools

    +

    + With the OpenShift command line interface (CLI), you can create applications and manage OpenShift projects from a terminal. + + You can download the oc client tool using the links below. For more information about downloading and installing it, please refer to the Get Started with the CLI documentation. + + + Refer to the Get Started with the CLI documentation for instructions about downloading and installing the oc client tool. + +

    + + +
    +

    +

    + After downloading and installing it, you can start by logging in. You are currently logged into this console as {{user.metadata.name}}. If you want to log into the CLI using the same session token: + +

    +                oc login {{loginBaseURL}}
    +              
    +

    -
    - - A token is a form of a password. - Do not share your API token. To reveal your token, press the copy to clipboard button and then paste the clipboard contents. -
    +
    + + A token is a form of a password. + Do not share your API token. To reveal your token, press the copy to clipboard button and then paste the clipboard contents. +
    -

    After you login to your account you will get a list of projects that you can switch between: - -

    +

    After you login to your account you will get a list of projects that you can switch between: + +

    -

    If you do not have any existing projects, you can create one: - -

    +

    If you do not have any existing projects, you can create one: + +

    -

    To show a high level overview of the current project: - -

    +

    To show a high level overview of the current project: + +

    -

    For other information about the command line tools, check the CLI Reference and Basic CLI Operations.

    -
    -
    -
    +

    For other information about the command line tools, check the CLI Reference and Basic CLI Operations.

    -
    -
    -
    -
    -
    +
    +
    +
    +
    +
    diff --git a/app/views/create-config-map.html b/app/views/create-config-map.html index e29ce8e60c..2befbf19b6 100644 --- a/app/views/create-config-map.html +++ b/app/views/create-config-map.html @@ -1,42 +1,31 @@ - -
    - -
    - -
    -
    -
    -
    -
    -
    - -
    -

    Create Config Map

    -
    - Config maps hold key-value pairs that can be used in pods to read application - configuration. -
    -
    -
    - -
    - - Cancel -
    -
    -
    +
    +
    +
    +
    +
    + +
    +

    Create Config Map

    +
    + Config maps hold key-value pairs that can be used in pods to read application + configuration. +
    +
    +
    + +
    + + Cancel
    -
    -
    -
    -
    -
    -
    -
    -
    + + +
    +
    +
    +
    +
    +
    diff --git a/app/views/create-from-url.html b/app/views/create-from-url.html index 8cdd11afce..6d6c0de38b 100644 --- a/app/views/create-from-url.html +++ b/app/views/create-from-url.html @@ -1,84 +1,73 @@ - -
    - -
    - -
    -
    -
    -
    -
    -
    -
    Loading...
    -
    - - -

    Source code from {{createDetails.sourceURI}} will be built and deployed unless otherwise specified in the next step.

    -
    -
    -

    Create a New Project

    - -
    -
    -

    Choose a Project

    - - - {{$select.selected | displayName}} - - - - - – - - - - -
    -
    - - - Choose Existing Project - - - {{$select.selected | displayName}} - - - - - – - - - - -
    - - Cancel -
    -
    - - Create a New Project - - -
    +
    +
    +
    +
    +
    +
    Loading...
    +
    + + +

    Source code from {{createDetails.sourceURI}} will be built and deployed unless otherwise specified in the next step.

    +
    +
    +

    Create a New Project

    + +
    +
    +

    Choose a Project

    + + + {{$select.selected | displayName}} + + + + + – + + + + +
    +
    + + + Choose Existing Project + + + {{$select.selected | displayName}} + + + + + – + + + + +
    + + Cancel
    -

    - A project is required in order to complete the installation. - -

    -
    -
    + + + Create a New Project + + +
    +

    + A project is required in order to complete the installation. + +

    -
    -
    -
    -
    -
    +
    +
    +
    +
    +
    diff --git a/app/views/create-persistent-volume-claim.html b/app/views/create-persistent-volume-claim.html index 5b5786658d..3f4e1bc383 100644 --- a/app/views/create-persistent-volume-claim.html +++ b/app/views/create-persistent-volume-claim.html @@ -1,42 +1,31 @@ - -
    - -
    - -
    -
    -
    -
    -
    -
    - -
    -

    Create Storage

    -
    - Create a request for an administrator-defined storage asset by specifying size and permissions for a best fit. - Learn More  -
    -
    -
    - -
    - - Cancel -
    -
    -
    +
    +
    +
    +
    +
    + +
    +

    Create Storage

    +
    + Create a request for an administrator-defined storage asset by specifying size and permissions for a best fit. + Learn More  +
    +
    +
    + +
    + + Cancel
    -
    -
    -
    -
    -
    -
    -
    -
    + + +
    +
    +
    +
    +
    +
    diff --git a/app/views/create-project.html b/app/views/create-project.html index 04a1ff4b36..82ae83f82c 100644 --- a/app/views/create-project.html +++ b/app/views/create-project.html @@ -1,21 +1,10 @@ - -
    - -
    - -
    -
    -
    -
    -
    -

    Create Project

    - -
    -
    -
    -
    -
    -
    -
    +
    +
    +
    +
    +

    Create Project

    + +
    +
    +
    +
    diff --git a/app/views/create-route.html b/app/views/create-route.html index f0540d5775..f41ae73b68 100644 --- a/app/views/create-route.html +++ b/app/views/create-route.html @@ -1,54 +1,43 @@ - -
    - -
    - -
    -
    -
    -
    -
    -
    - -
    -

    Create Route

    -
    - Routing is a way to make your application publicly visible. +
    +
    +
    +
    +
    + +
    +

    Create Route

    +
    + Routing is a way to make your application publicly visible. +
    +
    +
    Loading...
    +
    +
    + + + + +
    + + Cancel
    - -
    Loading...
    -
    -
    - - - - -
    - - Cancel -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    + +
    + +
    +
    +
    +
    +
    +
    diff --git a/app/views/create-secret.html b/app/views/create-secret.html index c254fbab5b..4ce92757c5 100644 --- a/app/views/create-secret.html +++ b/app/views/create-secret.html @@ -1,38 +1,27 @@ - -
    - -
    - -
    -
    -
    -
    -
    -
    -
    Loading...
    -
    - - -
    -

    Create Secret

    -
    - Secrets allow you to authenticate to a private Git repository or a private image registry. -
    - - -
    -
    +
    +
    +
    +
    +
    +
    Loading...
    +
    + + +
    +

    Create Secret

    +
    + Secrets allow you to authenticate to a private Git repository or a private image registry.
    + +
    -
    -
    -
    -
    -
    +
    +
    +
    +
    +
    diff --git a/app/views/create.html b/app/views/create.html index 9c4fe7fac8..6c17c98831 100644 --- a/app/views/create.html +++ b/app/views/create.html @@ -1,48 +1,37 @@ - -
    - -
    - -
    -
    -
    -
    - - -
    -
    - - - Browse Catalog - - - +
    +
    +
    + + +
    +
    + + + Browse Catalog + + + - - Deploy Image -
    - -
    -
    + + Deploy Image +
    + +
    +
    - - Import YAML / JSON - - + + Import YAML / JSON + + -
    -
    -
    -
    -
    -
    -
    -
    -
    + +
    +
    +
    +
    +
    diff --git a/app/views/create/category.html b/app/views/create/category.html index 3b005d212e..8830f45a21 100644 --- a/app/views/create/category.html +++ b/app/views/create/category.html @@ -1,48 +1,33 @@ - -
    -
    - -
    -
    -
    -
    - -
    -
    -

    {{category.label}}

    -
    {{category.description}}
    +
    +
    + +

    {{category.label}}

    +
    {{category.description}}
    - -
    - - -
    + +
    + + +
    - -
    - - -
    -
    -
    -
    -
    -
    -
    + +
    + + +
    +
    +
    -
    diff --git a/app/views/create/fromimage.html b/app/views/create/fromimage.html index 0b5e0d505b..14c41ec7b4 100644 --- a/app/views/create/fromimage.html +++ b/app/views/create/fromimage.html @@ -1,435 +1,424 @@ - -
    -
    - -
    -
    -
    -
    -
    -
    - -
    - Loading... +
    +
    +
    +
    + +
    + Loading... +
    +
    + +
    + -
    - -
    - -
    -
    - -
    -
    -
    -
    - - -
    - -
    -
    Identifies the resources created for this application.
    -
    - A name is required. -
    -
    - Please enter a valid name. -

    A valid name is applied to all generated resources. It is an alphanumeric (a-z, and 0-9) string with a maximum length of 24 characters, where the first character is a letter (a-z), and the '-' character is allowed anywhere except the first or last character.

    -
    -
    -
    - The name must have at least 2 characters. -
    -
    - This name is already in use within the project. Please choose a different name. -
    -
    +
    +
    + +
    + +
    +
    + + +
    + +
    +
    Identifies the resources created for this application.
    +
    + A name is required. +
    +
    + Please enter a valid name. +

    A valid name is applied to all generated resources. It is an alphanumeric (a-z, and 0-9) string with a maximum length of 24 characters, where the first character is a letter (a-z), and the '-' character is allowed anywhere except the first or last character.

    +
    +
    +
    + The name must have at least 2 characters. +
    +
    + This name is already in use within the project. Please choose a different name.
    -
    +
    +
    +
    +
    +
    +
    -
    - -
    - - -
    -
    - Sample repository for {{imageName}}: {{image.metadata.annotations.sampleRepo}}, - ref: {{image.metadata.annotations.sampleRef}}, - context dir: {{image.metadata.annotations.sampleContextDir}} - Try It -
    -
    - A Git repository URL is required. -
    -
    - This might not be a valid Git URL. Check that it is the correct URL to a remote Git repository. -
    -
    + +
    - - -
    -
    - -
    - -
    -
    Optional branch, tag, or commit.
    -
    +
    + Sample repository for {{imageName}}: {{image.metadata.annotations.sampleRepo}}, + ref: {{image.metadata.annotations.sampleRef}}, + context dir: {{image.metadata.annotations.sampleContextDir}} + Try It +
    +
    + A Git repository URL is required. +
    +
    + This might not be a valid Git URL. Check that it is the correct URL to a remote Git repository.
    +
    - -
    - + +
    +
    +
    -
    Optional subdirectory for the application source code, used as the context directory for the build.
    +
    Optional branch, tag, or commit.
    +
    +
    - -
    - -
    - - -
    + +
    + +
    + +
    +
    Optional subdirectory for the application source code, used as the context directory for the build.
    +
    - - -
    - -
    - - -
    + +
    + +
    + + +
    - + + +
    + +
    + + +
    - -
    - -
    -
    - -
    -
    - -
    -

    Environment Variables (Build and Runtime) + + + + +
    + +
    +
    + +
    +

    Environment Variables (Build and Runtime) + + + +

    + +
    + + + + +
    +

    Autodeploy when

    +
    + +
    +
    + +
    +
    +

    Environment Variables (Runtime only) +

    +

    + + {{showDCEnvs ? 'Hide' : 'Show'}} Image Environment Variables + +

    +
    +
    +

    These variables exist on the image and will be available at runtime. You may override them below.

    +
    + +
    - - - - - -
    -

    Autodeploy when

    -
    - -
    -
    - -
    -
    -

    Environment Variables (Runtime only) - - - -

    -

    - - {{showDCEnvs ? 'Hide' : 'Show'}} Image Environment Variables - -

    -
    -
    -

    These variables exist on the image and will be available at runtime. You may override them below.

    -
    - -
    - -
    -
    -
    - - - - -
    - - - {{$select.selected.label}} - - {{option.label}} - - -
    - Scale replicas manually or automatically based on CPU usage. -
    - -
    - - CPU metrics might not be available. In order to use horizontal pod autoscalers, - your cluster administrator must have properly configured cluster metrics. - -
    -
    -
    - - -
    - The number of instances of your image. -
    -
    - Replicas must be an integer value greater than or equal to 0. -
    -
    + add-row-link="Add Environment Variable" + add-row-with-selectors-link="Add Environment Variable Using a Config Map or Secret"> +
    +
    +
    - - + -
    - - You should configure resource limits below for autoscaling. - Autoscaling will not work without a CPU - limit. - request. - - The CPU limit will be automatically calculated from the container memory limit. - - -
    + +
    + + + {{$select.selected.label}} + + {{option.label}} + + +
    + Scale replicas manually or automatically based on CPU usage. +
    + +
    + + CPU metrics might not be available. In order to use horizontal pod autoscalers, + your cluster administrator must have properly configured cluster metrics. + +
    +
    +
    + + +
    + The number of instances of your image. +
    +
    + Replicas must be an integer value greater than or equal to 0. +
    +
    -
    + + - +
    + + You should configure resource limits below for autoscaling. + Autoscaling will not work without a CPU + limit. + request. + + The CPU limit will be automatically calculated from the container memory limit. + + +
    - - - - - -
    - {{problem}} -
    -
    - {{problem}} -
    -
    + - + - - + + + + + +
    + {{problem}}
    -
    - Show - Hide - advanced options - for source, routes, builds, and deployments. +
    + {{problem}}
    -
    - - Cancel -
    - -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    + + + + + + +
    +
    + Show + Hide + advanced options + for source, routes, builds, and deployments. +
    +
    + + Cancel +
    + + +
    +
    +
    +
    +
    +
    +
    -
    diff --git a/app/views/create/next-steps.html b/app/views/create/next-steps.html index 80efcc601b..bb67fe0d8a 100644 --- a/app/views/create/next-steps.html +++ b/app/views/create/next-steps.html @@ -1,14 +1,6 @@ - -
    -
    - -
    -
    -
    +
    -
    -
    -
    diff --git a/app/views/deployments.html b/app/views/deployments.html index fe19c6d2ab..d3ec512bf0 100644 --- a/app/views/deployments.html +++ b/app/views/deployments.html @@ -1,226 +1,219 @@ - - - - -
    -
    -
    -
    - -
    -
    - -
    -
    +
    +
    +
    + +
    +
    +
    -
    -
    -
    - -
    -
    -

    Deployment Configurations

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + +
    NameLast VersionStatusCreatedTrigger
    {{emptyMessage}}
    - {{dcName}} - - No deployments
    - {{dcName}} - - - - - - #{{replicationController | annotation : 'deploymentVersion'}} - - - {{replicationController.metadata.name}} - - -
    - - - {{replicationController | deploymentStatus}}, - {{replicationController.status.replicas}}/{{replicationController.spec.replicas}} replicas - -
    - -
    - - - Unknown - - - - - - Image change - - - Config change - {{cause.type}} + + + +
    +
    + +
    +
    +

    Deployment Configurations

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - -
    NameLast VersionStatusCreatedTrigger
    {{emptyMessage}}
    + {{dcName}} + + No deployments
    + {{dcName}} + + + + + + #{{replicationController | annotation : 'deploymentVersion'}} + + + {{replicationController.metadata.name}} + + +
    + + + {{replicationController | deploymentStatus}}, + {{replicationController.status.replicas}}/{{replicationController.spec.replicas}} replicas + +
    + +
    + + + Unknown + + + + + + Image change + Config change + {{cause.type}} -
    -
    -

    Deployments

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameLast VersionReplicasCreatedStrategy
    - {{deployment.metadata.name}} - - - {{deployment | lastDeploymentRevision}} - - - {{deployment | lastDeploymentRevision}} - - - {{deployment.status.replicas}}/{{deployment.spec.replicas}} replicas - - - - {{deployment.spec.strategy.type | sentenceCase}} -
    -
    -
    -

    Replica Sets

    - - - - - - - - - - - - - - - - - - -
    NameReplicasCreated
    - {{replicaSet.metadata.name}} - - {{replicaSet.status.replicas}}/{{replicaSet.spec.replicas}} replicas - - -
    -
    -
    -

    Other Replication Controllers

    - - - - - - - - - - - - - - - - - - - - -
    NameReplicasCreated
    No replication controllers to show
    - {{deployment.metadata.name}} - - {{deployment.status.replicas}}/{{deployment.spec.replicas}} replicas - - -
    -
    -
    + + +
    +
    +

    Deployments

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameLast VersionReplicasCreatedStrategy
    + {{deployment.metadata.name}} + + + {{deployment | lastDeploymentRevision}} + + + {{deployment | lastDeploymentRevision}} + + + {{deployment.status.replicas}}/{{deployment.spec.replicas}} replicas + + + + {{deployment.spec.strategy.type | sentenceCase}} +
    -
    -
    -
    -
    - +
    +

    Replica Sets

    + + + + + + + + + + + + + + + + + + +
    NameReplicasCreated
    + {{replicaSet.metadata.name}} + + {{replicaSet.status.replicas}}/{{replicaSet.spec.replicas}} replicas + + +
    +
    +
    +

    Other Replication Controllers

    + + + + + + + + + + + + + + + + + + + + +
    NameReplicasCreated
    No replication controllers to show
    + {{deployment.metadata.name}} + + {{deployment.status.replicas}}/{{deployment.spec.replicas}} replicas + + +
    +
    +
    +
    +
    +
    +
    diff --git a/app/views/directives/header/_navbar-utility-mobile.html b/app/views/directives/header/_navbar-utility-mobile.html index a089270c79..8160a2767c 100644 --- a/app/views/directives/header/_navbar-utility-mobile.html +++ b/app/views/directives/header/_navbar-utility-mobile.html @@ -1,8 +1,8 @@ -
    diff --git a/app/views/edit/config-map.html b/app/views/edit/config-map.html index 7cee603aed..6a48a05129 100644 --- a/app/views/edit/config-map.html +++ b/app/views/edit/config-map.html @@ -1,56 +1,45 @@ - -
    - -
    - -
    -
    -
    -
    -
    -
    - -
    -

    Edit Config Map {{configMap.metadata.name}}

    -
    - Config maps hold key-value pairs that can be used in pods to read application - configuration. -
    -
    -
    Loading...
    -
    -
    - - Warning: - Config map {{configMap.metadata.name}} has changed since you started editing it. - You'll need to copy any changes you've made and edit the config map again. -
    -
    - - Warning: - Config map {[configMap.metadata.name}} has been deleted since you started editing it. -
    -
    - -
    - - Cancel -
    -
    -
    -
    +
    +
    +
    +
    +
    + +
    +

    Edit Config Map {{configMap.metadata.name}}

    +
    + Config maps hold key-value pairs that can be used in pods to read application + configuration. +
    +
    +
    Loading...
    +
    +
    + + Warning: + Config map {{configMap.metadata.name}} has changed since you started editing it. + You'll need to copy any changes you've made and edit the config map again.
    -
    -
    -
    -
    -
    -
    -
    -
    +
    + + Warning: + Config map {[configMap.metadata.name}} has been deleted since you started editing it. +
    +
    + +
    + + Cancel +
    +
    + +
    +
    +
    +
    +
    +
    +
    diff --git a/app/views/edit/deployment-config.html b/app/views/edit/deployment-config.html index 9f21aa4b4f..69884edc7b 100644 --- a/app/views/edit/deployment-config.html +++ b/app/views/edit/deployment-config.html @@ -1,390 +1,379 @@ - -
    - -
    - -
    -
    -
    -
    - - -
    Loading...
    -
    -

    - Edit Deployment Config {{deploymentConfig.metadata.name}} -

    -
    -
    -
    -
    -
    -

    Deployment Strategy

    -
    - {{strategyParamsName}} -
    - - - {{$select.selected}} - - {{strategyType}} - - -
    - - - The recreate strategy has basic rollout behavior and supports lifecycle hooks for injecting code into the deployment process. - Learn More  - - - The rolling strategy will wait for pods to pass their readiness check, scale down old components and then scale up. - Learn More  - - - The custom strategy allows you to specify container image that will provide your own deployment behavior. - Learn More  - - -
    -
    +
    +
    +
    +
    +
    + + +
    Loading...
    +
    +

    + Edit Deployment Config {{deploymentConfig.metadata.name}} +

    +
    + +
    +

    Deployment Strategy

    +
    + {{strategyParamsName}} +
    + + + {{$select.selected}} + + {{strategyType}} + + +
    + + + The recreate strategy has basic rollout behavior and supports lifecycle hooks for injecting code into the deployment process. + Learn More  + + + The rolling strategy will wait for pods to pass their readiness check, scale down old components and then scale up. + Learn More  + + + The custom strategy allows you to specify container image that will provide your own deployment behavior. + Learn More  + + +
    +
    -
    -
    - -
    - -
    -
    An image that can carry out the deployment.
    -
    +
    +
    + +
    + +
    +
    An image that can carry out the deployment.
    +
    -
    - - -
    -
    - - -
    +
    + + +
    +
    + + +
    +
    +
    +
    + + + + seconds + +
    + How long to wait for a pod to scale up before giving up. +
    +
    +
    + Must be a number.
    -
    -
    - - - - seconds - -
    - How long to wait for a pod to scale up before giving up. +
    + Timeout can't be negative. +
    + + Must be a whole number. + +
    +
    + +
    + +
    +
    + + + + seconds + +
    + Time to wait between retrying to run individual pod. +
    +
    +
    + Must be a number.
    -
    -
    - Must be a number. -
    -
    - Timeout can't be negative. -
    - - Must be a whole number. - +
    + Update period can't be negative.
    + + Must be a whole number. +
    +
    -
    - -
    -
    - - - - seconds - -
    - Time to wait between retrying to run individual pod. -
    -
    -
    - Must be a number. -
    -
    - Update period can't be negative. -
    - - Must be a whole number. - -
    -
    - -
    - - - - seconds - -
    - Time to wait between polling deployment status after running a pod. -
    -
    -
    - Must be a number. -
    -
    - Interval can't be negative. -
    - - Must be a whole number. - -
    -
    -
    - -
    - -
    - -
    -
    - The maximum number of pods that can be unavailable during the rolling deployment. This can be either a percentage (10%) or a whole number (1). -
    -
    - - Must be a non-negative whole number or percentage. - -
    +
    + + + + seconds + +
    + Time to wait between polling deployment status after running a pod. +
    +
    +
    + Must be a number.
    - -
    - -
    - -
    -
    - The maximum number of pods that can be scheduled above the original number of pods while the rolling deployment is in progress. This can be either a percentage (10%) or a whole number (1). -
    -
    - - Must be a non-negative whole number or percentage. - -
    +
    + Interval can't be negative.
    + + Must be a whole number. +
    +
    +
    - -
    -
    -
    - -

    Pre Lifecycle Hook

    - - -
    - -
    -

    Mid Lifecycle Hook

    - - -
    - -
    -

    Post Lifecycle Hook

    - - -
    -
    -
    +
    + +
    +
    -
    -
    To set additional parameters or edit lifecycle hooks, view advanced strategy options.
    - Hide Advanced Strategy Options +
    + The maximum number of pods that can be unavailable during the rolling deployment. This can be either a percentage (10%) or a whole number (1).
    -
    -
    - - -
    -

    Images

    -
    - -
    -
    -

    Container {{containerName}}

    -
    -
    - -
    -
    - - - -
    - -
    -
    +
    + + Must be a non-negative whole number or percentage. + +
    +
    -
    - - + +
    + -
    + placeholder="25%" + name="maxSurge" + ng-model="strategyData[strategyParamsPropertyName].maxSurge" + ng-pattern="/^\d+%?$/" + select-on-focus + class="form-control" + aria-describedby="maxSurge"> +
    +
    + The maximum number of pods that can be scheduled above the original number of pods while the rolling deployment is in progress. This can be either a percentage (10%) or a whole number (1).
    +
    + + Must be a non-negative whole number or percentage. + +
    +
    +
    + + +
    +
    +
    -
    - +

    Pre Lifecycle Hook

    + +
    - -
    -
    - - -
    +
    +

    Mid Lifecycle Hook

    + +
    -
    -
    To set secrets for pulling your images from private image registries, view advanced image options.
    - Hide Advanced Image Options +
    +

    Post Lifecycle Hook

    + +
    -
    +
    +
    +
    +
    To set additional parameters or edit lifecycle hooks, view advanced strategy options.
    + Hide Advanced Strategy Options +
    + +
    -
    -

    Environment Variables

    +
    +

    Images

    +
    -
    -
    -

    Container {{containerName}}

    -
    - +
    +
    +

    Container {{containerName}}

    +
    +
    + +
    +
    + + + +
    +
    - - +
    + + +
    +
    + +
    + +
    -
    - - + +
    +
    + +
    + +
    +
    To set secrets for pulling your images from private image registries, view advanced image options.
    + Hide Advanced Image Options +
    +
    +
    + + +
    +

    Environment Variables

    + +
    +
    +

    Container {{containerName}}

    +
    +
    - - -
    +
    + + + + +
    + + +
    + +
    diff --git a/app/views/edit/health-checks.html b/app/views/edit/health-checks.html index 75883d7402..4da3c7fae9 100644 --- a/app/views/edit/health-checks.html +++ b/app/views/edit/health-checks.html @@ -1,87 +1,76 @@ - -
    - -
    - -
    -
    -
    -
    - -
    -
    -
    Loading...
    -
    -

    Health Checks: {{name}}

    -
    - Container health is periodically checked using readiness and liveness probes. - -
    -
    -
    -

    Container {{container.name}}

    -

    Readiness Probe

    -
    - A readiness probe checks if the container is ready to handle requests. A - failed readiness probe means that a container should not receive any traffic - from a proxy, even if it's running. -
    - - -

    Liveness Probe

    -
    - A liveness probe checks if the container is still running. If the liveness - probe fails, the container is killed. -
    - -
    - - -

    - Remove Liveness Probe -

    -
    -
    +
    +
    +
    +
    +
    + +
    Loading...
    + +

    Health Checks: {{name}}

    +
    + Container health is periodically checked using readiness and liveness probes. + +
    +
    +
    +

    Container {{container.name}}

    +

    Readiness Probe

    +
    + A readiness probe checks if the container is ready to handle requests. A + failed readiness probe means that a container should not receive any traffic + from a proxy, even if it's running. +
    + + +

    Liveness Probe

    +
    + A liveness probe checks if the container is still running. If the liveness + probe fails, the container is killed. +
    + +
    + + +

    + Remove Liveness Probe +

    +
    +
    - - + + -
    - - -
    -
    - +
    + +
    -
    -
    -
    -
    -
    -
    -
    + + +
    +
    +
    +
    +
    diff --git a/app/views/edit/project.html b/app/views/edit/project.html index e4898fb369..5477c57659 100644 --- a/app/views/edit/project.html +++ b/app/views/edit/project.html @@ -1,53 +1,42 @@ - -
    - -
    - -
    -
    -
    -
    -
    -

    Edit Project {{project.metadata.name}}

    -
    Update the display name and description of your project. The project's unique name cannot be modified.
    - -
    -
    -
    - - -
    +
    +
    +
    +
    +

    Edit Project {{project.metadata.name}}

    +
    Update the display name and description of your project. The project's unique name cannot be modified.
    + + +
    +
    + + +
    -
    - - -
    +
    + + +
    -
    - - Cancel -
    -
    - +
    + + Cancel
    -
    -
    -
    -
    -
    -
    + + +
    +
    +
    +
    diff --git a/app/views/edit/route.html b/app/views/edit/route.html index 789ee800f1..0af3cfd9c3 100644 --- a/app/views/edit/route.html +++ b/app/views/edit/route.html @@ -1,43 +1,34 @@ - -
    - -
    - -
    -
    -
    -
    -
    - - -

    Edit Route {{routeName}}

    -
    - Loading... -
    -
    -
    - - -
    - - -
    -
    -
    -
    +
    +
    +
    +
    +
    + + +

    Edit Route {{routeName}}

    +
    + Loading...
    -
    -
    -
    -
    -
    +
    +
    + + +
    + + +
    +
    +
    +
    +
    +
    +
    +
    diff --git a/app/views/edit/yaml.html b/app/views/edit/yaml.html index c040b0ab41..f885a8d67e 100644 --- a/app/views/edit/yaml.html +++ b/app/views/edit/yaml.html @@ -1,56 +1,45 @@ - -
    - -
    - -
    -
    -
    -
    - - -
    Loading...
    -
    -

    Edit {{updated.resource.metadata.name}}

    - +
    +
    +
    + + +
    Loading...
    +
    +

    Edit {{updated.resource.metadata.name}}

    + -
    - - Warning: - {{updated.resource.kind | humanizeKind | upperFirst}} {{updated.resource.metadata.name}} has - changed since you started editing it. You'll need to copy any changes you've made and edit the - {{updated.resource.kind | humanizeKind}} again. -
    +
    + + Warning: + {{updated.resource.kind | humanizeKind | upperFirst}} {{updated.resource.metadata.name}} has + changed since you started editing it. You'll need to copy any changes you've made and edit the + {{updated.resource.kind | humanizeKind}} again. +
    -
    - - Warning: - {{updated.resource.kind | humanizeKind | upperFirst}} {{updated.resource.metadata.name}} has - been deleted since you started editing it. -
    +
    + + Warning: + {{updated.resource.kind | humanizeKind | upperFirst}} {{updated.resource.metadata.name}} has + been deleted since you started editing it. +
    - + -
    - + + -
    - - -
    -
    -
    +
    + +
    -
    -
    -
    -
    -
    + +
    +
    +
    +
    diff --git a/app/views/events.html b/app/views/events.html index 791aa3c11a..8597e92065 100644 --- a/app/views/events.html +++ b/app/views/events.html @@ -1,26 +1,20 @@ - - - -
    -
    -
    -
    - - +
    +
    +
    + + +
    +
    +
    +
    + +
    +
    +
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    - +
    +
    +
    +
    diff --git a/app/views/images.html b/app/views/images.html index b0d8c36ede..b1c606121e 100644 --- a/app/views/images.html +++ b/app/views/images.html @@ -1,73 +1,66 @@ - - - - -
    -
    -
    -
    - -
    -
    - -
    -
    +
    +
    +
    + +
    +
    +
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameDocker RepoTagsUpdated
    {{emptyMessage}}
    {{imageStream.metadata.name}} - unknown - {{imageStream.status.dockerImageRepository || imageStream.spec.dockerImageRepository}} - - none - {{tag.tag}}, - , - {{imageStream.status.tags[4].tag}}, - and {{imageStream.status.tags.length - 4}} others -
    -
    -
    -
    -
    -
    -
    - +
    +
    +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameDocker RepoTagsUpdated
    {{emptyMessage}}
    {{imageStream.metadata.name}} + unknown + {{imageStream.status.dockerImageRepository || imageStream.spec.dockerImageRepository}} + + none + {{tag.tag}}, + , + {{imageStream.status.tags[4].tag}}, + and {{imageStream.status.tags.length - 4}} others +
    +
    +
    +
    +
    +
    diff --git a/app/views/landing-page.html b/app/views/landing-page.html index febf0c834e..a2a3728553 100644 --- a/app/views/landing-page.html +++ b/app/views/landing-page.html @@ -1,36 +1,25 @@ - -
    - -
    - -
    -
    -
    - - - - - - - - - - -
    - -
    -
    - - - - - - -
    -
    -
    -
    -
    -
    +
    +
    + + + + + + + + + + +
    + +
    +
    + + + + + + +
    +
    +
    diff --git a/app/views/logs/chromeless-build-log.html b/app/views/logs/chromeless-build-log.html index f3495a79a0..214d72db03 100644 --- a/app/views/logs/chromeless-build-log.html +++ b/app/views/logs/chromeless-build-log.html @@ -1,31 +1,18 @@ - - -
    - -
    -
    -
    -
    -
    - -
    -
    -
    - - -
    -
    -
    +
    +
    + +
    +
    + +
    diff --git a/app/views/logs/chromeless-deployment-log.html b/app/views/logs/chromeless-deployment-log.html index 803f2092d0..3f6b33aa86 100644 --- a/app/views/logs/chromeless-deployment-log.html +++ b/app/views/logs/chromeless-deployment-log.html @@ -1,29 +1,16 @@ - - -
    - -
    -
    -
    -
    -
    - -
    -
    -
    - - -
    -
    -
    +
    +
    + +
    +
    + +
    diff --git a/app/views/logs/chromeless-pod-log.html b/app/views/logs/chromeless-pod-log.html index 01acd83b78..20eed37ed3 100644 --- a/app/views/logs/chromeless-pod-log.html +++ b/app/views/logs/chromeless-pod-log.html @@ -1,31 +1,18 @@ - - -
    - -
    -
    -
    -
    -
    - -
    -
    -
    - - -
    -
    -
    +
    +
    + +
    +
    + +
    diff --git a/app/views/membership.html b/app/views/membership.html index fda8e1affa..77b3feb027 100644 --- a/app/views/membership.html +++ b/app/views/membership.html @@ -1,305 +1,299 @@ - - +
    + +
    +
    + +
    +
    -
    -
    -
    -
    - +
    +
    +

    You do not have permission to view roles in this project.

    +
    + + + + {{subjectKind.name | startCase}}s ({{subjectKind.subjects | hashSize}}) + + -
    -
    -
    -
    - -
    -
    +
    +
    +
    +

    Name

    +
    +
    +

    Roles

    +
    +
    +

    + Add Another Role +

    +
    -
    -
    -

    You do not have permission to view roles in this project.

    -
    - - - - {{subjectKind.name | startCase}}s ({{subjectKind.subjects | hashSize}}) - -
    -

    - {{subjectKind.description}} - - Learn More - -

    + +
    +

    + There are no {{ subjectKind.name | humanizeKind }}s with access to this project. +

    +
    +
    +
    + + + {{subject.namespace}} / + + + {{subject.name}} + + + + + {{subject.name}} + + + (you) + +
    - + class="action-set" + flex row tablet="column" mobile="column">
    -
    -

    Name

    -
    -
    -

    Roles

    -
    -
    -

    - Add Another Role -

    -
    -
    - -
    -

    - There are no {{ subjectKind.name | humanizeKind }}s with access to this project. -

    + class="col-roles" + row tablet="column" flex wrap axis="start"> +
    -
    - - - {{subject.namespace}} / - - - {{subject.name}} - - - - - {{subject.name}} - - - (you) - - -
    -
    -
    - -
    -
    -
    - - - - - -
    {{ role.metadata.name }}
    -
    - {{role | annotation : 'description'}} -
    -
    -
    - -
    -
    + ng-if="mode.edit" + class="col-add-role"> +
    + + + + + +
    {{ role.metadata.name }}
    +
    + {{role | annotation : 'description'}} +
    +
    +
    +
    +
    +
    - -
    -
    - + +
    +
    + - - - - + + + + - + - - -
    -
    -
     
    -
    -
    - - - - - -
    {{ role.metadata.name }}
    -
    - {{role | annotation : 'description'}} -
    -
    -
    - -
    -
    -
    + + - - +
    - -
    - -
    -
    -   -
    + class="action-set" + flex row tablet="column" mobile="column"> +
     
    +
    +
    + + + + + +
    {{ role.metadata.name }}
    +
    + {{role | annotation : 'description'}} +
    +
    +
    +
    - - -
    -
    + + +
    + +
    + +
    +
    +   +
    +
    +
    +
    +
    + +
    - +
    diff --git a/app/views/monitoring.html b/app/views/monitoring.html index 1fc5ba6f84..eec133a4cd 100644 --- a/app/views/monitoring.html +++ b/app/views/monitoring.html @@ -1,444 +1,443 @@ - - - - -
    -
    -
    -
    - -
    - - {{$select.selected.label ? $select.selected.label : ($select.selected.kind | humanizeKind : true)}} - -
    -
    -
    -
    -
    -
    -
    -
    - - - -
    -
    -
    -
    -
    - +
    +
    +
    +
    + +
    + + {{$select.selected.label ? $select.selected.label : ($select.selected.kind | humanizeKind : true)}} + +
    +
    +
    +
    +
    +
    +
    +
    + + + +
    -
    + +
    +
    +
    -
    -
    -
    - -
    -
    +
    +
    +
    +
    +
    + +
    +
    -
    -

    Pods

    -
    -
    -
    - - -
    The current filters are hiding all pods.
    - There are no pods in this project. -
    -
    -
    -
    -
    - - - - - - - -
    +
    +

    Pods

    +
    +
    +
    + + +
    The current filters are hiding all pods.
    + There are no pods in this project. +
    +
    +
    +
    +
    + + + + + + + +
    -
    -
    -
    -
    - - created -
    -
    - - {{pod | podStatus | sentenceCase}} - - – - {{pod | numContainersReady}}/{{pod.spec.containers.length}} ready - -
    -
    -
    -
    - - -
    -
    +
    +
    +
    +
    + + created +
    +
    + + {{pod | podStatus | sentenceCase}} + + – + {{pod | numContainersReady}}/{{pod.spec.containers.length}} ready + +
    +
    +
    +
    + +
    -
    - +
    +
    +
    + - - + + - - {{pod.spec.containers[0].name}} - + + {{pod.spec.containers[0].name}} + - - {{$select.selected.name}} - -
    -
    -
    -
    + + {{$select.selected.name}} + +
    +
    +
    +
    -
    - -
    - -
    -
    + + +
    +
    +
    +
    -
    -

    Deployments

    -
    -
    -
    - - -
    The current filters are hiding all deployments.
    - There are no deployments in this project. -
    -
    -
    -
    -
    - - - - - - - -
    +
    +

    Deployments

    +
    +
    +
    + + +
    The current filters are hiding all deployments.
    + There are no deployments in this project. +
    +
    +
    +
    +
    + + + + + + + +
    -
    -
    -
    -
    - - created -
    -
    - - - -
    -
    -
    -
    - - - -
    -
    +
    +
    +
    +
    + + created +
    +
    -
    -
    - - - -
    - - +
    +
    + + + +
    -
    -
    - - - - - - - -
    +
    +
    +
    + + + +
    + + +
    +
    +
    +
    + + + + + + + +
    -
    -
    -
    -
    - - created -
    -
    - - - -
    -
    -
    -
    - - - -
    -
    +
    +
    +
    +
    + + created +
    +
    -
    -
    - Logs are not available for replica sets. - - To see application logs, view the logs for one of the replica set's - pods. - -
    - - +
    +
    + + + +
    +
    + Logs are not available for replica sets. + + To see application logs, view the logs for one of the replica set's + pods. + +
    + + +
    +
    +
    +
    -
    -

    Stateful Sets

    -
    -
    -
    - - -
    The current filters are hiding all stateful sets.
    - There are no stateful sets in this project. -
    -
    -
    -
    -
    - - - - - - - -
    +
    +

    Stateful Sets

    +
    +
    +
    + + +
    The current filters are hiding all stateful sets.
    + There are no stateful sets in this project. +
    +
    +
    +
    +
    + + + + + + + +
    -
    -
    -
    -
    - - created -
    -
    - - - -
    -
    -
    -
    - - -
    -
    +
    +
    +
    +
    + + created +
    +
    -
    -
    - Logs are not available for stateful sets. - - To see application logs, view the logs for one of the stateful sets's - pods. - -
    - - +
    +
    + + +
    +
    + Logs are not available for stateful sets. + + To see application logs, view the logs for one of the stateful sets's + pods. + +
    + + +
    +
    +
    +
    -
    -

    Builds

    -
    -
    -
    - - -
    The current filters are hiding all builds.
    - There are no builds in this project. -
    -
    -
    -
    -
    - - - - - - - -
    +
    +

    Builds

    +
    +
    +
    + + +
    The current filters are hiding all builds.
    + There are no builds in this project. +
    +
    +
    +
    +
    + + + + + + + +
    -
    -
    -
    -
    - - created -
    -
    - -
    -
    -
    -
    - - - - {{build.spec.revision.git.message}} - {{build.spec.revision.git.commit | limitTo:7}} - - authored by {{build.spec.revision.git.author.name}} - - - - {{build.spec.source.git.uri}} - - - Source: {{build.spec.source.type}} - - -
    -
    +
    +
    +
    +
    + + created +
    +
    +
    -
    -
    - - - -
    - Log from {{build.status.startTimestamp | date : 'medium'}} - - to {{build.status.completionTimestamp | date : 'medium'}} +
    +
    + + + + {{build.spec.revision.git.message}} + {{build.spec.revision.git.commit | limitTo:7}} + + authored by {{build.spec.revision.git.author.name}} + + + + {{build.spec.source.git.uri}} + + + Source: {{build.spec.source.type}} +
    - - +
    -
    +
    + + + +
    + Log from {{build.status.startTimestamp | date : 'medium'}} + + to {{build.status.completionTimestamp | date : 'medium'}} + +
    + +
    +
    +
    -
    -
    -
    -
    - +
    +
    +
    +
    +
    + +
    diff --git a/app/views/newfromtemplate.html b/app/views/newfromtemplate.html index 91039257f6..4fe97f44d1 100644 --- a/app/views/newfromtemplate.html +++ b/app/views/newfromtemplate.html @@ -1,58 +1,47 @@ - -
    - -
    - -
    -
    -
    -
    -
    -
    - -
    - Loading... -
    -
    - -
    - -
    -

    Images

    -
      -
    • - - - {{image.name}} - - - Image value set - from parameters - - {{parameterDisplayNames[parameterName]}}, - - -
    • -
    -
    -
    - - -
    -
    -
    -
    +
    +
    +
    +
    +
    + +
    + Loading... +
    +
    + +
    + +
    +

    Images

    +
      +
    • + + + {{image.name}} + + + Image value set + from parameters + + {{parameterDisplayNames[parameterName]}}, + + +
    • +
    +
    +
    + + +
    -
    -
    -
    -
    -
    +
    +
    +
    +
    +
    diff --git a/app/views/other-resources.html b/app/views/other-resources.html index c8c1418522..5312898d00 100644 --- a/app/views/other-resources.html +++ b/app/views/other-resources.html @@ -1,90 +1,83 @@ - - - - -
    -
    -
    -
    - -
    - - {{$select.selected.kind | humanizeKind : true}} - -
    - -
    -
    -
    -
    - -
    -
    +
    +
    +
    + +
    + + {{$select.selected.kind | humanizeKind : true}} + +
    + +
    +
    +
    +
    +
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameCreatedLabelsActions
    {{emptyMessage}}
    {{resource.metadata.name}} - none - - - - - -
    -
    -
    -
    -
    -
    -
    - +
    +
    +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameCreatedLabelsActions
    {{emptyMessage}}
    {{resource.metadata.name}} + none + + + + + +
    +
    +
    +
    +
    +
    diff --git a/app/views/overview.html b/app/views/overview.html index 45410f3fc4..e4862bc2af 100644 --- a/app/views/overview.html +++ b/app/views/overview.html @@ -1,376 +1,371 @@ - - -
    -
    - -
    - - - -
    -
    -

    Get started with your project.

    -

    - Use your source or an example repository to build an application - image, or add components like databases and message queues. -

    -

    - - Add to Project - - - Browse Catalog - -

    -
    -
    -

    Welcome to project {{projectName}}.

    - -
    +
    +
    + +
    + + + +
    +
    +

    Get started with your project.

    +

    + Use your source or an example repository to build an application + image, or add components like databases and message queues. +

    +

    + + Add to Project + + + Browse Catalog + +

    +
    +
    +

    Welcome to project {{projectName}}.

    +
    -
    - Loading... -
    -
    -
    -
    -