From c9f4d625734bfcdb992e2e17523c24cee5eccd2a Mon Sep 17 00:00:00 2001 From: Jeffrey Phillips Date: Wed, 6 Sep 2017 14:29:30 -0400 Subject: [PATCH] Add the ability to add a secret to an application --- app/index.html | 1 + app/scripts/controllers/secret.js | 10 + .../directives/addSecretToApplication.js | 180 ++++++++++++ app/styles/_secrets.less | 57 +++- app/views/browse/secret.html | 13 +- .../directives/add-secret-to-application.html | 92 ++++++ dist/scripts/scripts.js | 264 ++++++++++++------ dist/scripts/templates.js | 86 +++++- dist/styles/main.css | 30 +- 9 files changed, 641 insertions(+), 92 deletions(-) create mode 100644 app/scripts/directives/addSecretToApplication.js create mode 100644 app/views/directives/add-secret-to-application.html diff --git a/app/index.html b/app/index.html index 757186ce64..a1e24bfe82 100644 --- a/app/index.html +++ b/app/index.html @@ -328,6 +328,7 @@

JavaScript Required

+ diff --git a/app/scripts/controllers/secret.js b/app/scripts/controllers/secret.js index 85041fd0a4..b0dd222f22 100644 --- a/app/scripts/controllers/secret.js +++ b/app/scripts/controllers/secret.js @@ -27,6 +27,16 @@ angular.module('openshiftConsole') } ]; + $scope.addToApplicationVisible = false; + + $scope.addToApplication = function() { + $scope.addToApplicationVisible = true; + }; + + $scope.closeAddToApplication = function() { + $scope.addToApplicationVisible = false; + }; + ProjectsService .get($routeParams.project) .then(_.spread(function(project, context) { diff --git a/app/scripts/directives/addSecretToApplication.js b/app/scripts/directives/addSecretToApplication.js new file mode 100644 index 0000000000..c2681b2a9e --- /dev/null +++ b/app/scripts/directives/addSecretToApplication.js @@ -0,0 +1,180 @@ +"use strict"; +(function() { + angular.module("openshiftConsole").component('addSecretToApplication', { + controller: [ + '$filter', + '$scope', + 'APIService', + 'DataService', + 'Navigate', + 'NotificationsService', + 'StorageService', + AddSecretToApplication + ], + controllerAs: 'ctrl', + bindings: { + project: '<', + secret: '<', + onComplete: '<', + onCancel: '<' + }, + templateUrl: 'views/directives/add-secret-to-application.html' + }); + + function AddSecretToApplication($filter, $scope, APIService, DataService, Navigate, NotificationsService, StorageService) { + var ctrl = this; + var deploymentConfigs; + var deployments; + var replicationControllers; + var replicaSets; + var statefulSets; + + var sortApplications = function() { + // Don't waste time sorting on each data load, just sort when we have them all + if (deploymentConfigs && deployments && replicationControllers && replicaSets && statefulSets) { + var apiObjects = deploymentConfigs.concat(deployments) + .concat(replicationControllers) + .concat(replicaSets) + .concat(statefulSets); + ctrl.applications = _.sortBy(apiObjects, ['metadata.name', 'kind']); + ctrl.updating = false; + } + }; + + var getApplications = function() { + var hasDeploymentFilter = $filter('hasDeployment'); + var hasDeploymentConfigFilter = $filter('hasDeploymentConfig'); + + ctrl.updating = true; + var context = { + namespace: ctrl.project.metadata.name + }; + // Load all the "application" types + DataService.list('deploymentconfigs', context).then(function(deploymentConfigData) { + deploymentConfigs = _.toArray(deploymentConfigData.by('metadata.name')); + sortApplications(); + }); + DataService.list('replicationcontrollers', context).then(function(replicationControllerData) { + replicationControllers = _.reject(replicationControllerData.by('metadata.name'), hasDeploymentConfigFilter); + sortApplications(); + }); + DataService.list({ + group: 'apps', + resource: 'deployments' + }, context).then(function(deploymentData) { + deployments = _.toArray(deploymentData.by('metadata.name')); + sortApplications(); + }); + DataService.list({ + group: 'extensions', + resource: 'replicasets' + }, context).then(function(replicaSetData) { + replicaSets = _.reject(replicaSetData.by('metadata.name'), hasDeploymentFilter); + sortApplications(); + }); + DataService.list({ + group: 'apps', + resource: 'statefulsets' + }, context).then(function(statefulSetData) { + statefulSets = _.toArray(statefulSetData.by('metadata.name')); + sortApplications(); + }); + }; + + ctrl.$onInit = function() { + ctrl.addType = 'env'; + ctrl.disableInputs = false; + getApplications(); + }; + + ctrl.$postLink = function() { + $scope.$watch(function() { + return ctrl.application; + }, function() { + // Look at the existing mount paths so that we can warn if the new value is not unique. + var podTemplate = _.get(ctrl.application, 'spec.template'); + ctrl.existingMountPaths = StorageService.getMountPaths(podTemplate); + }); + }; + + ctrl.addToApplication = function() { + var applicationToUpdate = angular.copy(ctrl.application); + + var podTemplate = _.get(applicationToUpdate, 'spec.template'); + + ctrl.disableInputs = true; + + if (ctrl.addType === 'env') { + var newEnvFrom = { + secretRef: { + name: ctrl.secret.metadata.name + } + }; + + // For each container, add the new volume mount. + _.each(podTemplate.spec.containers, function(container) { + container.envFrom = container.envFrom || []; + container.envFrom.push(newEnvFrom); + }); + } else { + var generateName = $filter('generateName'); + var name = generateName(ctrl.secret.metadata.name + '-'); + var newVolumeMount = { + name: name, + mountPath: ctrl.mountVolume, + readOnly: true + }; + + // For each selected container, add the new volume mount. + _.each(podTemplate.spec.containers, function(container) { + container.volumeMounts = container.volumeMounts || []; + container.volumeMounts.push(newVolumeMount); + }); + + var newVolume = { + name: name, + secret: { + secretName: ctrl.secret.metadata.name + } + }; + + podTemplate.spec.volumes = podTemplate.spec.volumes || []; + podTemplate.spec.volumes.push(newVolume); + } + + var humanizeKind = $filter('humanizeKind'); + var sourceKind = humanizeKind(ctrl.secret.kind); + var targetKind = humanizeKind(applicationToUpdate.kind); + var context = { + namespace: ctrl.project.metadata.name + }; + + DataService.update(APIService.kindToResource(applicationToUpdate.kind), applicationToUpdate.metadata.name, applicationToUpdate, context).then( + function() { + NotificationsService.addNotification({ + type: "success", + message: "Successfully added " + sourceKind + " " + ctrl.secret.metadata.name + " to " + targetKind + " " + applicationToUpdate.metadata.name + ".", + links: [{ + href: Navigate.resourceURL(applicationToUpdate), + label: "View " + humanizeKind(applicationToUpdate.kind, true) + }] + }); + if (angular.isFunction(ctrl.onComplete)) { + ctrl.onComplete(); + } + }, + function(result) { + var getErrorDetails = $filter('getErrorDetails'); + + NotificationsService.addNotification({ + type: "error", + message: "An error occurred adding " + sourceKind + " " + ctrl.secret.metadata.name + " to " + targetKind + " " + applicationToUpdate.metadata.name + ". " + + getErrorDetails(result) + }); + }).finally(function() { + ctrl.disableInputs = false; + } + ); + }; + } +})(); diff --git a/app/styles/_secrets.less b/app/styles/_secrets.less index 08a7206b90..b3b45581a1 100644 --- a/app/styles/_secrets.less +++ b/app/styles/_secrets.less @@ -1,3 +1,58 @@ +.add-secret-to-application { + .catalogs-overlay-panel { + max-width: 600px; + } + + .dialog-title { + border-bottom: 1px solid @color-pf-black-300; + + h3 { + margin: 18px 0; + padding-left: 15px; + } + } + + .dialog-body { + padding: 20px; + + .add-choice { + margin-bottom: 10px; + } + .button-group { + .btn { + margin-left: 10px; + &:first-of-type { + margin-left: 0; + } + } + } + legend { + border-bottom: 0; + font-size: @font-size-base + 1; + font-weight: 600; + margin-bottom: 10px; + } + .radio { + margin-top: 0; + } + } + + .updating { + background-color: @color-pf-white; + bottom: 55px; + left: 0; + padding-top: 60px; + position: absolute; + right: 0; + top: 55px; + z-index: 1000; + } + + .volume-options { + margin-left: 20px; + } +} + .osc-secrets-form { .advanced-secrets, .basic-secrets { @@ -80,7 +135,7 @@ dl.secret-data { } .create-secret-modal { - background-color: #F5F5F5; + background-color: @color-pf-black-150; .modal-footer{ margin-top: 0px } diff --git a/app/views/browse/secret.html b/app/views/browse/secret.html index ad84548998..a576e435df 100644 --- a/app/views/browse/secret.html +++ b/app/views/browse/secret.html @@ -10,8 +10,11 @@

The secret details could not be loaded.

-

+ + + diff --git a/app/views/directives/add-secret-to-application.html b/app/views/directives/add-secret-to-application.html new file mode 100644 index 0000000000..7e88b520c0 --- /dev/null +++ b/app/views/directives/add-secret-to-application.html @@ -0,0 +1,92 @@ +
+
+

Add to Application

+
+
+
+
+ Add this secret to application: +
+
+ + + + {{$select.selected.metadata.name}} + – {{$select.selected.kind | humanizeKind : true}} + + + + + + +
+
+ Add secret as: +
+
+ +
+ +
+
+
+ +
+
+ Mount Path for the volume. A file will be created in this director for each key from the secret. The file contents will be the value of the key. +
+
+ + The mount path is already used. Please choose another mount path. + +
+
+
+
+
+ + +
+
+
+
+ +

+ Updating +

+
+
+
diff --git a/dist/scripts/scripts.js b/dist/scripts/scripts.js index be8564f3ef..0b2d8e5500 100644 --- a/dist/scripts/scripts.js +++ b/dist/scripts/scripts.js @@ -3,7 +3,7 @@ function OverviewController(e, t, n, a, r, o, i, s, c, l, u, d, m, p, f, g, h, v, y, b, C, S, w, k, j) { var P = this, R = t("isIE")() || t("isEdge")(); e.projectName = n.project; -var E, T, I = t("annotation"), N = t("buildConfigForBuild"), D = t("deploymentIsInProgress"), A = t("imageObjectRef"), B = t("isJenkinsPipelineStrategy"), L = t("isNewerResource"), U = t("label"), O = t("podTemplate"), F = {}, x = {}, M = {}, V = P.state = { +var T, E, I = t("annotation"), N = t("buildConfigForBuild"), D = t("deploymentIsInProgress"), A = t("imageObjectRef"), B = t("isJenkinsPipelineStrategy"), L = t("isNewerResource"), U = t("label"), O = t("podTemplate"), F = {}, x = {}, M = {}, V = P.state = { alerts: {}, builds: {}, clusterQuotas: {}, @@ -210,15 +210,15 @@ return "Succeeded" !== e.status.phase && "Failed" !== e.status.phase && (!U(e, " V.podsByOwnerUID = C.groupByOwnerUID(P.pods), P.monopods = _.filter(V.podsByOwnerUID[""], je); }, Re = function(e) { return !!_.get(e, "status.replicas") || (!I(e, "deploymentConfig") || D(e)); -}, Ee = function(e) { +}, Te = function(e) { return I(e, "deploymentConfig"); -}, Te = function() { +}, Ee = function() { if (P.deploymentConfigs && P.replicationControllers) { var e = []; P.replicationControllersByDeploymentConfig = {}, P.currentByDeploymentConfig = {}, M = {}; var t = {}, n = {}; _.each(P.replicationControllers, function(a) { -var r = Ee(a) || ""; +var r = Te(a) || ""; (!r || !P.deploymentConfigs[r] && _.get(a, "status.replicas")) && e.push(a); var o = M[r]; o && !L(a, o) || (M[r] = a); @@ -236,9 +236,9 @@ if (_.get(e, "status.replicas")) return !0; var n = u.getRevision(e); return !n || !!t && u.getRevision(t) === n; }, Ne = function() { -P.replicaSets && E && (P.replicaSetsByDeploymentUID = b.groupByControllerUID(P.replicaSets), P.currentByDeploymentUID = {}, _.each(P.replicaSetsByDeploymentUID, function(e, t) { +P.replicaSets && T && (P.replicaSetsByDeploymentUID = b.groupByControllerUID(P.replicaSets), P.currentByDeploymentUID = {}, _.each(P.replicaSetsByDeploymentUID, function(e, t) { if (t) { -var n = E[t], a = _.filter(e, function(e) { +var n = T[t], a = _.filter(e, function(e) { return Ie(e, n); }), r = u.sortByRevision(a); P.replicaSetsByDeploymentUID[t] = r, P.currentByDeploymentUID[t] = _.head(r); @@ -381,9 +381,9 @@ P.pods && p.fetchReferencedImageStreamImages(P.pods, V.imagesByDockerReference, Ye.push(l.watch("pods", a, function(e) { P.pods = e.by("metadata.name"), Pe(), r(), _e(), $e(P.monopods), pe(P.monopods), we(P.monopods), ie(), h.log("pods (subscribe)", P.pods); })), Ye.push(l.watch("replicationcontrollers", a, function(e) { -P.replicationControllers = e.by("metadata.name"), Te(), $e(P.vanillaReplicationControllers), $e(P.monopods), pe(P.vanillaReplicationControllers), we(P.vanillaReplicationControllers), Qe(), ie(), h.log("replicationcontrollers (subscribe)", P.replicationControllers); +P.replicationControllers = e.by("metadata.name"), Ee(), $e(P.vanillaReplicationControllers), $e(P.monopods), pe(P.vanillaReplicationControllers), we(P.vanillaReplicationControllers), Qe(), ie(), h.log("replicationcontrollers (subscribe)", P.replicationControllers); })), Ye.push(l.watch("deploymentconfigs", a, function(e) { -P.deploymentConfigs = e.by("metadata.name"), Te(), $e(P.deploymentConfigs), $e(P.vanillaReplicationControllers), we(P.deploymentConfigs), Ce(), He(), We(), Qe(), ie(), h.log("deploymentconfigs (subscribe)", P.deploymentConfigs); +P.deploymentConfigs = e.by("metadata.name"), Ee(), $e(P.deploymentConfigs), $e(P.vanillaReplicationControllers), we(P.deploymentConfigs), Ce(), He(), We(), Qe(), ie(), h.log("deploymentconfigs (subscribe)", P.deploymentConfigs); })), Ye.push(l.watch({ group: "extensions", resource: "replicasets" @@ -393,7 +393,7 @@ P.replicaSets = e.by("metadata.name"), Ne(), $e(P.vanillaReplicaSets), $e(P.mono group: "apps", resource: "deployments" }, a, function(e) { -E = e.by("metadata.uid"), P.deployments = _.sortBy(E, "metadata.name"), Ne(), $e(P.deployments), $e(P.vanillaReplicaSets), we(P.deployments), Qe(), ie(), h.log("deployments (subscribe)", P.deploymentsByUID); +T = e.by("metadata.uid"), P.deployments = _.sortBy(T, "metadata.name"), Ne(), $e(P.deployments), $e(P.vanillaReplicaSets), we(P.deployments), Qe(), ie(), h.log("deployments (subscribe)", P.deploymentsByUID); })), Ye.push(l.watch("builds", a, function(e) { V.builds = e.by("metadata.name"), Ke(), h.log("builds (subscribe)", V.builds); })), Ye.push(l.watch({ @@ -429,7 +429,7 @@ P.horizontalPodAutoscalers = e.by("metadata.name"), Le(), h.log("autoscalers (su poll: R, pollInterval: 6e4 })), Ye.push(l.watch("imagestreams", a, function(e) { -T = e.by("metadata.name"), p.buildDockerRefMapForImageStreams(T, V.imageStreamImageRefByDockerReference), r(), h.log("imagestreams (subscribe)", T); +E = e.by("metadata.name"), p.buildDockerRefMapForImageStreams(E, V.imageStreamImageRefByDockerReference), r(), h.log("imagestreams (subscribe)", E); }, { poll: R, pollInterval: 6e4 @@ -4714,9 +4714,9 @@ var t = a("annotation")(e, "deploymentVersion"); t && (n.logOptions.replicationControllers[e.metadata.name].version = t), n.logCanRun.replicationControllers[e.metadata.name] = !_.includes([ "New", "Pending" ], a("deploymentStatus")(e)); }, R = function(e) { n.logOptions.builds[e.metadata.name] = {}, n.logCanRun.builds[e.metadata.name] = !_.includes([ "New", "Pending", "Error" ], e.status.phase); -}, E = function() { -n.filteredStatefulSets = s.filterForKeywords(_.values(n.statefulSets), S, w); }, T = function() { +n.filteredStatefulSets = s.filterForKeywords(_.values(n.statefulSets), S, w); +}, E = function() { b = _.filter(n.pods, function(e) { return !n.filters.hideOlderResources || "Succeeded" !== e.status.phase && "Failed" !== e.status.phase; }), n.filteredPods = s.filterForKeywords(b, S, w); @@ -4780,13 +4780,13 @@ var t = _.get(n, [ "podsByOwnerUID", e.metadata.uid ], []); _.isEmpty(t) || u.toPodsForDeployment(e, t); }, m.get(e.project).then(_.spread(function(e, a) { n.project = e, n.projectContext = a, o.watch("pods", a, function(e) { -n.podsByName = e.by("metadata.name"), n.pods = C(n.podsByName, !0), n.podsByOwnerUID = d.groupByOwnerUID(n.pods), n.podsLoaded = !0, _.each(n.pods, j), T(), c.log("pods", n.pods); +n.podsByName = e.by("metadata.name"), n.pods = C(n.podsByName, !0), n.podsByOwnerUID = d.groupByOwnerUID(n.pods), n.podsLoaded = !0, _.each(n.pods, j), E(), c.log("pods", n.pods); }), o.watch({ resource: "statefulsets", group: "apps", version: "v1beta1" }, a, function(e) { -n.statefulSets = e.by("metadata.name"), n.statefulSetsLoaded = !0, E(), c.log("statefulSets", n.statefulSets); +n.statefulSets = e.by("metadata.name"), n.statefulSetsLoaded = !0, T(), c.log("statefulSets", n.statefulSets); }), o.watch("replicationcontrollers", a, function(e) { n.replicationControllers = C(e.by("metadata.name"), !0), n.replicationControllersLoaded = !0, _.each(n.replicationControllers, P), U(), c.log("replicationcontrollers", n.replicationControllers); }), o.watch("builds", a, function(e) { @@ -4799,7 +4799,7 @@ n.replicaSets = C(e.by("metadata.name"), !0), n.replicaSetsLoaded = !0, O(), c.l }), n.$on("$destroy", function() { o.unwatchAll(f); }), n.$watch("filters.hideOlderResources", function() { -T(), A(), U(), O(), E(); +E(), A(), U(), O(), T(); var e = t.search(); e.hideOlderResources = n.filters.hideOlderResources ? "true" : "false", t.replace().search(e); }), n.$watch("kindSelector.selected.kind", function() { @@ -4897,14 +4897,14 @@ subjectName: n.name httpErr: e("getErrorDetails")(a) })); }); -}, E = {}; -n.tab && (E[n.tab] = !0); -var T = u.getSubjectKinds(); +}, T = {}; +n.tab && (T[n.tab] = !0); +var E = u.getSubjectKinds(); angular.extend(a, { -selectedTab: E, +selectedTab: T, projectName: g, forms: {}, -subjectKinds: T, +subjectKinds: E, newBinding: { role: "", kind: n.tab || "User", @@ -4980,7 +4980,7 @@ e && !_.includes(a.projects, e) ? a.projects = [ e ].concat(t) : a.projects = t; }), l.get(n.project).then(_.spread(function(n, r) { f = r, j(), k(f), angular.extend(a, { project: n, -subjectKinds: T, +subjectKinds: E, canUpdateRolebindings: y("rolebindings", "update", g), confirmRemove: function(n, r, i) { var c = null, l = I(n, r, i, a.user.metadata.name); @@ -5739,10 +5739,10 @@ e.metricsAvailable = t; }); var P = t("deploymentStatus"), R = function(t) { e.logCanRun = !_.includes([ "New", "Pending" ], P(t)); -}, E = t("isIE")() || t("isEdge")(); +}, T = t("isIE")() || t("isEdge")(); g.get(n.project).then(_.spread(function(u, g) { e.project = u, e.projectContext = g; -var v = {}, T = function() { +var v = {}, E = function() { if (e.hpaForRS = s.filterHPA(v, y, n.replicaSet), e.deploymentConfigName && e.isActive) { var t = s.filterHPA(v, "DeploymentConfig", e.deploymentConfigName); e.autoscalers = e.hpaForRS.concat(t); @@ -5755,7 +5755,7 @@ j.push(o.watch(e.resource, g, function(t) { var n, a = []; angular.forEach(t.by("metadata.name"), function(t) { (C(t, "deploymentConfig") || "") === e.deploymentConfigName && a.push(t); -}), n = i.getActiveDeployment(a), e.isActive = n && n.metadata.uid === e.replicaSet.metadata.uid, T(); +}), n = i.getActiveDeployment(a), e.isActive = n && n.metadata.uid === e.replicaSet.metadata.uid, E(); })); }, N = function() { s.getHPAWarnings(e.replicaSet, e.autoscalers, e.limitRanges, u).then(function(t) { @@ -5813,7 +5813,7 @@ title: e.deployment.metadata.name, link: m.resourceURL(e.deployment) }, humanizedKind: "Deployments" -}), $(), T(); +}), $(), E(); })), j.push(o.watch({ group: "extensions", resource: "replicasets" @@ -5876,9 +5876,9 @@ group: "autoscaling", resource: "horizontalpodautoscalers", version: "v1" }, g, function(e) { -v = e.by("metadata.name"), T(), N(); +v = e.by("metadata.name"), E(), N(); }, { -poll: E, +poll: T, pollInterval: 6e4 })), o.list("limitranges", g).then(function(t) { e.limitRanges = t.by("metadata.name"), N(); @@ -6106,7 +6106,11 @@ title: "Secrets", link: "project/" + e.project + "/browse/secrets" }, { title: n.secretName -} ], r.get(e.project).then(_.spread(function(e, t) { +} ], n.addToApplicationVisible = !1, n.addToApplication = function() { +n.addToApplicationVisible = !0; +}, n.closeAddToApplication = function() { +n.addToApplicationVisible = !1; +}, r.get(e.project).then(_.spread(function(e, t) { n.project = e, n.context = t, a.get("secrets", n.secretName, t, { errorNotification: !1 }).then(function(e) { @@ -6639,7 +6643,7 @@ e.$on("$destroy", b), u.get(a.project).then(_.spread(function(n, r) { e.project = n, e.context = r, i.canI("buildconfigs", "update", a.project) ? s.get("buildconfigs", a.buildconfig, r, { errorNotification: !1 }).then(function(t) { -e.buildConfig = t, f(), e.updatedBuildConfig = angular.copy(e.buildConfig), e.buildStrategy = v(e.updatedBuildConfig), e.strategyType = e.buildConfig.spec.strategy.type, e.envVars = e.buildStrategy.env || [], e.triggers = C(e.triggers, e.buildConfig.spec.triggers), e.sources = E(e.sources, e.buildConfig.spec.source), _.has(t, "spec.strategy.jenkinsPipelineStrategy.jenkinsfile") && (e.jenkinsfileOptions.type = "inline"), s.list("secrets", r).then(function(t) { +e.buildConfig = t, f(), e.updatedBuildConfig = angular.copy(e.buildConfig), e.buildStrategy = v(e.updatedBuildConfig), e.strategyType = e.buildConfig.spec.strategy.type, e.envVars = e.buildStrategy.env || [], e.triggers = C(e.triggers, e.buildConfig.spec.triggers), e.sources = T(e.sources, e.buildConfig.spec.source), _.has(t, "spec.strategy.jenkinsPipelineStrategy.jenkinsfile") && (e.jenkinsfileOptions.type = "inline"), s.list("secrets", r).then(function(t) { var n = m.groupSecretsByType(t), a = _.mapValues(n, function(e) { return _.map(e, "metadata.name"); }); @@ -6832,7 +6836,7 @@ var a = "Custom" === e.strategyType ? "secretSource" : "secret", r = _.filter(n, return e[a].name; }); _.isEmpty(r) ? delete t.secrets : t.secrets = r; -}, E = function(e, t) { +}, T = function(e, t) { return "None" === t.type ? e : (e.none = !1, angular.forEach(t, function(t, n) { e[n] = !0; }), e); @@ -7543,10 +7547,10 @@ link: "project/" + e.projectName + "/create?tab=fromCatalog" }, { title: R } ]; -var E = { +var T = { name: "app", value: "" -}, T = t("orderByDisplayName"), I = t("getErrorDetails"), N = {}, D = function() { +}, E = t("orderByDisplayName"), I = t("getErrorDetails"), N = {}, D = function() { g.hideNotification("create-builder-list-config-maps-error"), g.hideNotification("create-builder-list-secrets-error"), _.each(N, function(e) { !e.id || "error" !== e.type && "warning" !== e.type || g.hideNotification(e.id); }); @@ -7567,7 +7571,7 @@ h = e.by("metadata.name"), m.log("quotas", h); }), c.list("appliedclusterresourcequotas", n).then(function(e) { y = e.by("metadata.name"), m.log("cluster quotas", y); }), e.$watch("scaling.autoscale", S), e.$watch("container", S, !0), e.$watch("name", function(e, t) { -E.value && E.value !== t || (E.value = e); +T.value && T.value !== t || (T.value = e); }), function(a) { a.name = r.name, a.imageName = P, a.imageTag = r.imageTag, a.namespace = r.namespace, a.buildConfig = { buildOnSourceChange: !0, @@ -7587,7 +7591,7 @@ deployOnConfigChange: !0 }, a.DCEnvVarsFromImage, a.DCEnvVarsFromUser = [], a.routing = { include: !0, portOptions: [] -}, a.labelArray = [ E ], a.annotations = {}, a.scaling = { +}, a.labelArray = [ T ], a.annotations = {}, a.scaling = { replicas: 1, autoscale: !1, autoscaleOptions: [ { @@ -7611,7 +7615,7 @@ var o = [], i = []; e.valueFromObjects = [], c.list("configmaps", n, null, { errorNotification: !1 }).then(function(t) { -o = T(t.by("metadata.name")), e.valueFromObjects = o.concat(i); +o = E(t.by("metadata.name")), e.valueFromObjects = o.concat(i); }, function(e) { 403 !== e.code && g.addNotification({ id: "create-builder-list-config-maps-error", @@ -7622,7 +7626,7 @@ details: I(e) }), c.list("secrets", n, null, { errorNotification: !1 }).then(function(t) { -i = T(t.by("metadata.name")), e.valueFromObjects = i.concat(o); +i = E(t.by("metadata.name")), e.valueFromObjects = i.concat(o); var n = b.groupSecretsByType(t), a = _.mapValues(n, function(e) { return _.map(e, "metadata.name"); }); @@ -9228,7 +9232,7 @@ selectedProject: p.project }, p.aceLoaded = function(e) { (j = e.getSession()).setOption("tabSize", 2), j.setOption("useSoftTabs", !0), e.setDragDelay = 0, e.$blockScrolling = 1 / 0; }; -var E = function(e) { +var T = function(e) { a.open({ animation: !0, templateUrl: "views/modals/confirm.html", @@ -9245,18 +9249,18 @@ cancelButtonText: "Cancel" } } }).result.then(y); -}, T = {}, I = function() { -c.hideNotification("from-file-error"), _.each(T, function(e) { +}, E = {}, I = function() { +c.hideNotification("from-file-error"), _.each(E, function(e) { !e.id || "error" !== e.type && "warning" !== e.type || c.hideNotification(e.id); }); }, N = function(e) { -I(), T = u.getSecurityAlerts(p.createResources, p.input.selectedProject.metadata.name); +I(), E = u.getSecurityAlerts(p.createResources, p.input.selectedProject.metadata.name); var t = e.quotaAlerts || []; -T = T.concat(t), _.filter(T, { +E = E.concat(t), _.filter(E, { type: "error" -}).length ? (_.each(T, function(e) { +}).length ? (_.each(E, function(e) { e.id = _.uniqueId("from-file-alert-"), c.addNotification(e); -}), p.disableInputs = !1) : T.length ? (E(T), p.disableInputs = !1) : y(); +}), p.disableInputs = !1) : E.length ? (T(E), p.disableInputs = !1) : y(); }, D = function() { if (_.has(p.input.selectedProject, "metadata.uid")) return n.when(p.input.selectedProject); var t = p.input.selectedProject.metadata.name, a = p.input.selectedProject.metadata.annotations["new-display-name"], r = e("description")(p.input.selectedProject); @@ -10589,7 +10593,111 @@ showAction: "=?" }, templateUrl: "views/directives/action-chip.html" }; -}), angular.module("openshiftConsole").directive("templateOptions", function() { +}), function() { +angular.module("openshiftConsole").component("addSecretToApplication", { +controller: [ "$filter", "$scope", "APIService", "DataService", "Navigate", "NotificationsService", "StorageService", function(e, t, n, a, r, o, i) { +var s, c, l, u, d, m = this, p = function() { +if (s && c && l && u && d) { +var e = s.concat(c).concat(l).concat(u).concat(d); +m.applications = _.sortBy(e, [ "metadata.name", "kind" ]), m.updating = !1; +} +}, f = function() { +var t = e("hasDeployment"), n = e("hasDeploymentConfig"); +m.updating = !0; +var r = { +namespace: m.project.metadata.name +}; +a.list("deploymentconfigs", r).then(function(e) { +s = _.toArray(e.by("metadata.name")), p(); +}), a.list("replicationcontrollers", r).then(function(e) { +l = _.reject(e.by("metadata.name"), n), p(); +}), a.list({ +group: "apps", +resource: "deployments" +}, r).then(function(e) { +c = _.toArray(e.by("metadata.name")), p(); +}), a.list({ +group: "extensions", +resource: "replicasets" +}, r).then(function(e) { +u = _.reject(e.by("metadata.name"), t), p(); +}), a.list({ +group: "apps", +resource: "statefulsets" +}, r).then(function(e) { +d = _.toArray(e.by("metadata.name")), p(); +}); +}; +m.$onInit = function() { +m.addType = "env", m.disableInputs = !1, f(); +}, m.$postLink = function() { +t.$watch(function() { +return m.application; +}, function() { +var e = _.get(m.application, "spec.template"); +m.existingMountPaths = i.getMountPaths(e); +}); +}, m.addToApplication = function() { +var t = angular.copy(m.application), i = _.get(t, "spec.template"); +if (m.disableInputs = !0, "env" === m.addType) { +var s = { +secretRef: { +name: m.secret.metadata.name +} +}; +_.each(i.spec.containers, function(e) { +e.envFrom = e.envFrom || [], e.envFrom.push(s); +}); +} else { +var c = e("generateName")(m.secret.metadata.name + "-"), l = { +name: c, +mountPath: m.mountVolume, +readOnly: !0 +}; +_.each(i.spec.containers, function(e) { +e.volumeMounts = e.volumeMounts || [], e.volumeMounts.push(l); +}); +var u = { +name: c, +secret: { +secretName: m.secret.metadata.name +} +}; +i.spec.volumes = i.spec.volumes || [], i.spec.volumes.push(u); +} +var d = e("humanizeKind"), p = d(m.secret.kind), f = d(t.kind), g = { +namespace: m.project.metadata.name +}; +a.update(n.kindToResource(t.kind), t.metadata.name, t, g).then(function() { +o.addNotification({ +type: "success", +message: "Successfully added " + p + " " + m.secret.metadata.name + " to " + f + " " + t.metadata.name + ".", +links: [ { +href: r.resourceURL(t), +label: "View " + d(t.kind, !0) +} ] +}), angular.isFunction(m.onComplete) && m.onComplete(); +}, function(n) { +var a = e("getErrorDetails"); +o.addNotification({ +type: "error", +message: "An error occurred adding " + p + " " + m.secret.metadata.name + " to " + f + " " + t.metadata.name + ". " + a(n) +}); +}).finally(function() { +m.disableInputs = !1; +}); +}; +} ], +controllerAs: "ctrl", +bindings: { +project: "<", +secret: "<", +onComplete: "<", +onCancel: "<" +}, +templateUrl: "views/directives/add-secret-to-application.html" +}); +}(), angular.module("openshiftConsole").directive("templateOptions", function() { return { restrict: "E", templateUrl: "views/_templateopt.html", @@ -10823,8 +10931,8 @@ Used: t.available > 0 ? "#0088ce" : "#ec7a08", Available: "#d1d1d1" } }; -E[t.id] ? E[t.id].load(r) : ((n = B(e)).data = r, a(function() { -$ || (E[t.id] = c3.generate(n)); +T[t.id] ? T[t.id].load(r) : ((n = B(e)).data = r, a(function() { +$ || (T[t.id] = c3.generate(n)); })); } } @@ -10837,10 +10945,10 @@ _.each(e.datasets, function(e) { t[e.id] = e.data; }); var n, r = c.getSparklineData(t), o = e.chartPrefix + "sparkline"; -T[o] ? T[o].load(r) : ((n = L(e)).data = r, e.chartDataColors && (n.color = { +E[o] ? E[o].load(r) : ((n = L(e)).data = r, e.chartDataColors && (n.color = { pattern: e.chartDataColors }), a(function() { -$ || (T[o] = c3.generate(n)); +$ || (E[o] = c3.generate(n)); })); } } @@ -10928,7 +11036,7 @@ m.loaded = !0; } } m.includedMetrics = m.includedMetrics || [ "cpu", "memory", "network" ]; -var R, E = {}, T = {}, I = n("resources.limits.memory"), N = n("resources.limits.cpu"), D = 30, $ = !1; +var R, T = {}, E = {}, I = n("resources.limits.memory"), N = n("resources.limits.cpu"), D = 30, $ = !1; m.uniqueID = c.uniqueID(), m.metrics = [], _.includes(m.includedMetrics, "memory") && m.metrics.push({ label: "Memory", units: "MiB", @@ -11025,14 +11133,14 @@ delete e.data; }, !0), R = t(P, c.getDefaultUpdateInterval(), !1); }); var O = o.$on("metrics.charts.resize", function() { -c.redraw(E), c.redraw(T); +c.redraw(T), c.redraw(E); }); m.$on("$destroy", function() { -R && (t.cancel(R), R = null), O && (O(), O = null), angular.forEach(E, function(e) { +R && (t.cancel(R), R = null), O && (O(), O = null), angular.forEach(T, function(e) { e.destroy(); -}), E = null, angular.forEach(T, function(e) { +}), T = null, angular.forEach(E, function(e) { e.destroy(); -}), T = null, $ = !0; +}), E = null, $ = !0; }); } }; @@ -11148,7 +11256,7 @@ _.set(R, [ e, n ], i); } else _.set(R, [ e, n ], r); } function y() { -if (!E && h()) { +if (!T && h()) { P = Date.now(); var e = f(); c.getPodMetrics(e).then(u, g).finally(function() { @@ -11158,7 +11266,7 @@ t.loaded = !0; } var b, C = {}, S = 30, w = "compact" === t.profile, k = !1; t.uniqueID = s.uniqueID(); -var j, P, R = {}, E = w, T = function(e) { +var j, P, R = {}, T = w, E = function(e) { return e >= 1024; }; t.metrics = [ { @@ -11166,10 +11274,10 @@ label: "Memory", units: "MiB", convert: i.bytesToMiB, formatUsage: function(e) { -return T(e) && (e /= 1024), s.formatUsage(e); +return E(e) && (e /= 1024), s.formatUsage(e); }, usageUnits: function(e) { -return T(e) ? "GiB" : "MiB"; +return E(e) ? "GiB" : "MiB"; }, descriptor: "memory/usage", type: "pod_container", @@ -11231,7 +11339,7 @@ return _.set(n, "legend.show", !w && !t.showAverage), n; t.$watch("options", function() { R = {}, j = null, delete t.metricsError, y(); }, !0), b = e(y, s.getDefaultUpdateInterval(), !1), t.updateInView = function(e) { -E = !e, e && (!P || Date.now() > P + s.getDefaultUpdateInterval()) && y(); +T = !e, e && (!P || Date.now() > P + s.getDefaultUpdateInterval()) && y(); }; var $ = r.$on("metrics.charts.resize", function() { s.redraw(C); @@ -11310,11 +11418,11 @@ y = setInterval(function() { n > 10 ? e() : (n++, j().is(":visible") && (P(), e())); }, 100); } -}, E = _.debounce(function() { +}, T = _.debounce(function() { P(!0), b(), S(); }, 100); -m.on("resize", E); -var T, I = function() { +m.on("resize", T); +var E, I = function() { C = !0, d.scrollBottom(u); }, N = document.createDocumentFragment(), D = _.debounce(function() { l.appendChild(N), N = document.createDocumentFragment(), t.autoScrollActive && I(), t.showScrollLinks || b(); @@ -11322,9 +11430,9 @@ l.appendChild(N), N = document.createDocumentFragment(), t.autoScrollActive && I maxWait: 300 }), A = function(e) { var t = r.defer(); -return T ? (T.onClose(function() { +return E ? (E.onClose(function() { t.resolve(); -}), T.stop()) : t.resolve(), e || (D.cancel(), l && (l.innerHTML = ""), N = document.createDocumentFragment()), t.promise; +}), E.stop()) : t.resolve(), e || (D.cancel(), l && (l.innerHTML = ""), N = document.createDocumentFragment()), t.promise; }, B = function() { A().then(function() { t.$evalAsync(function() { @@ -11344,7 +11452,7 @@ limitBytes: 10485760 }, t.options), n = 0, a = function(e) { n++, N.appendChild(f(n, e)), D(); }; -(T = c.createStream(h, v, t.context, e)).onMessage(function(r, o, i) { +(E = c.createStream(h, v, t.context, e)).onMessage(function(r, o, i) { t.$evalAsync(function() { t.empty = !1, "logs" !== t.state && (t.state = "logs", R()); }), r && (e.limitBytes && i >= e.limitBytes && (t.$evalAsync(function() { @@ -11352,18 +11460,18 @@ t.limitReached = !0, t.loading = !1; }), A(!0)), a(r), !t.largeLog && n >= e.tailLines && t.$evalAsync(function() { t.largeLog = !0; })); -}), T.onClose(function() { -T = null, t.$evalAsync(function() { +}), E.onClose(function() { +E = null, t.$evalAsync(function() { t.loading = !1, t.autoScrollActive = !1, 0 !== n || t.emptyStateMessage || (t.state = "empty", t.emptyStateMessage = "The logs are no longer available or could not be loaded."); }); -}), T.onError(function() { -T = null, t.$evalAsync(function() { +}), E.onError(function() { +E = null, t.$evalAsync(function() { angular.extend(t, { loading: !1, autoScrollActive: !1 }), 0 === n ? (t.state = "empty", t.emptyStateMessage = "The logs are no longer available or could not be loaded.") : t.errorWhileRunning = !0; }); -}), T.start(); +}), E.start(); } }); }); @@ -11409,7 +11517,7 @@ t.autoScrollActive = !t.autoScrollActive, t.autoScrollActive && I(); goChromeless: d.chromelessLink, restartLogs: B }), t.$on("$destroy", function() { -A(), m.off("resize", E), m.off("scroll", S), u && $(u).off("scroll", S); +A(), m.off("resize", T), m.off("scroll", S), u && $(u).off("scroll", S); }), "deploymentconfigs/logs" === h && !v) return t.state = "empty", void (t.emptyStateMessage = "Logs are not available for this replication controller because it was not generated from a deployment configuration."); t.$watchGroup([ "name", "options.container", "run" ], B); } ], @@ -13501,7 +13609,7 @@ hasErrors: r project: n.input.selectedProject, appName: n.app.name }) : s.toNextSteps(n.app.name, n.input.selectedProject.metadata.name); -}, E = function(e) { +}, T = function(e) { a.open({ animation: !0, templateUrl: "views/modals/confirm.html", @@ -13518,14 +13626,14 @@ cancelButtonText: "Cancel" } } }).result.then(R); -}, T = function(e) { +}, E = function(e) { h = e.quotaAlerts || []; var t = _.filter(h, { type: "error" }); n.nameTaken || t.length ? (n.disableInputs = !1, _.each(h, function(e) { e.id = _.uniqueId("deploy-image-alert-"), c.addNotification(e); -})) : h.length ? (E(h), n.disableInputs = !1) : R(); +})) : h.length ? (T(h), n.disableInputs = !1) : R(); }; n.create = function() { n.disableInputs = !0, v(), y().then(function(e) { @@ -13535,7 +13643,7 @@ namespace: n.input.selectedProject.metadata.name }), o = function(e) { return n.nameTaken = e.nameTaken, a; }; -t.then(o, o).then(T, T); +t.then(o, o).then(E, E); }, function(e) { c.addNotification({ id: "deploy-image-create-project-error", @@ -13994,14 +14102,14 @@ e.totalUnread = j(e.notifications).length, e.hasUnread = !!e.totalUnread, o.$emi }); }, R = function() { _.each(v, P); -}, E = function(e) { -return _.orderBy(e, [ "event.lastTimestamp", "event.firstTimestamp" ], [ "desc", "desc" ]); }, T = function(e) { +return _.orderBy(e, [ "event.lastTimestamp", "event.firstTimestamp" ], [ "desc", "desc" ]); +}, E = function(e) { var t = _.sortBy(e, function(e) { return e.heading; }); return _.each(t, function(e) { -e.notifications = E(e.notifications), e.counts = P(e); +e.notifications = T(e.notifications), e.counts = P(e); }), t; }, I = function(e) { var t = {}; @@ -14026,7 +14134,7 @@ return e.project.metadata.name === r.project; }); }); }, A = function(e) { -h = I(e.by("metadata.uid")), v = T(h), $(); +h = I(e.by("metadata.uid")), v = E(h), $(); }, B = { Normal: "pficon pficon-info", Warning: "pficon pficon-warning-triangle-o" diff --git a/dist/scripts/templates.js b/dist/scripts/templates.js index dde6b3f3cd..7baaec4829 100644 --- a/dist/scripts/templates.js +++ b/dist/scripts/templates.js @@ -3571,13 +3571,19 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function( "\n" + "
\n" + "

\n" + - "
\n" + - "\n" + + "\n" + "Actions\n" + "
    \n" + + "
  • \n" + + "Add to Application\n" + + "
  • \n" + "
  • \n" + "Edit YAML\n" + "
  • \n" + @@ -3630,6 +3636,9 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function( "
\n" + "

\n" + "\n" + + "\n" + + "\n" + + "\n" + "\n" + "" ); @@ -5531,6 +5540,79 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function( ); + $templateCache.put('views/directives/add-secret-to-application.html', + "
\n" + + "
\n" + + "

Add to Application

\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "Add this secret to application:\n" + + "
\n" + + "
\n" + + "\n" + + "\n" + + "\n" + + "{{$select.selected.metadata.name}}\n" + + "– {{$select.selected.kind | humanizeKind : true}}\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "
\n" + + "
\n" + + "Add secret as:\n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + "\n" + + "
\n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + "
\n" + + "Mount Path for the volume. A file will be created in this director for each key from the secret. The file contents will be the value of the key.\n" + + "
\n" + + "
\n" + + "\n" + + "The mount path is already used. Please choose another mount path.\n" + + "\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "\n" + + "\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "

\n" + + "Updating\n" + + "

\n" + + "
\n" + + "
\n" + + "
" + ); + + $templateCache.put('views/directives/annotations.html', "

\n" + "Show Annotations\n" + diff --git a/dist/styles/main.css b/dist/styles/main.css index 4dc6fe7ce0..42d94d117a 100644 --- a/dist/styles/main.css +++ b/dist/styles/main.css @@ -3,6 +3,7 @@ body,figure{margin:0} .text-left,caption,th{text-align:left} .navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px} .c3 svg,html{-webkit-tap-highlight-color:transparent} +.list-view-pf-top-align .list-view-pf-actions,.list-view-pf-top-align .list-view-pf-checkbox{align-self:flex-start} .fa,.font-icon,.glyphicon{-moz-osx-font-smoothing:grayscale} @font-face{font-family:"Open Sans";font-style:normal;font-weight:300;src:url(../styles/fonts/OpenSans-Light-webfont.eot);src:local("Open Sans Light"),local("OpenSans-Light"),url(../styles/fonts/OpenSans-Light-webfont.eot?#iefix) format("embedded-opentype"),url(../styles/fonts/OpenSans-Light-webfont.woff2) format("woff2"),url(../styles/fonts/OpenSans-Light-webfont.woff) format("woff"),url(../styles/fonts/OpenSans-Light-webfont.ttf) format("truetype"),url(../styles/fonts/OpenSans-Light-webfont.svg#OpenSans) format("svg")} @font-face{font-family:"Open Sans";font-style:normal;font-weight:400;src:url(../styles/fonts/OpenSans-Regular-webfont.eot);src:local("Open Sans"),local("OpenSans"),url(../styles/fonts/OpenSans-Regular-webfont.eot?#iefix) format("embedded-opentype"),url(../styles/fonts/OpenSans-Regular-webfont.woff2) format("woff2"),url(../styles/fonts/OpenSans-Regular-webfont.woff) format("woff"),url(../styles/fonts/OpenSans-Regular-webfont.ttf) format("truetype"),url(../styles/fonts/OpenSans-Regular-webfont.svg#OpenSans) format("svg")} @@ -766,6 +767,7 @@ select[multiple].input-lg,textarea.input-lg{height:auto} .form-horizontal .form-group-sm .control-label{padding-top:3px;font-size:11px} } .btn{display:inline-block;margin-bottom:0;font-weight:600;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;border:1px solid transparent;white-space:nowrap;padding:2px 6px;font-size:13px;line-height:1.66666667;border-radius:1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} +.bootstrap-switch,.datepicker table{-webkit-user-select:none;-moz-user-select:none} .btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:dotted thin!important;outline:-webkit-focus-ring-color auto 5px!important;outline-offset:-2px!important} .btn.focus,.btn:focus,.btn:hover{color:#4d5258;text-decoration:none} .btn.active,.btn:active{outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)} @@ -950,7 +952,7 @@ select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.i .navbar-collapse.in{overflow-y:visible} .navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-left:0;padding-right:0} } -.embed-responsive,.modal,.modal-open,.progress{overflow:hidden} +.carousel-inner,.embed-responsive,.modal,.modal-open,.progress{overflow:hidden} @media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px} } .membership .ui-select-bootstrap>.ui-select-choices,.typeahead-long{max-height:300px} @@ -1336,7 +1338,7 @@ button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance .popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff} .popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#bbb} .popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff} -.carousel-inner{overflow:hidden;width:100%} +.carousel-inner{width:100%} .carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left} @media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-moz-transition:-moz-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px} .carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0} @@ -2374,7 +2376,7 @@ td>.progress:first-child:last-child{margin-bottom:0;margin-top:3px} .datepicker-dropdown.datepicker-orient-bottom:after{top:-6px} .datepicker-dropdown.datepicker-orient-top:before{bottom:-7px;border-bottom:0;border-top:7px solid #bbb} .datepicker-dropdown.datepicker-orient-top:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff} -.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} +.datepicker table{margin:0;-webkit-touch-callout:none;-khtml-user-select:none;-ms-user-select:none;user-select:none} .datepicker table tr td,.datepicker table tr th{text-align:center;width:30px;height:30px;border:none} .datepicker table tr td.new,.datepicker table tr td.old{color:#9c9c9c} .datepicker table tr td.day:hover,.datepicker table tr td.focused{background:#f1f1f1;cursor:pointer} @@ -2510,7 +2512,8 @@ select.bs-select-hidden,select.selectpicker{display:none!important} .bs-donebutton .btn-group button{width:100%} .bs-searchbox+.bs-actionsbox{padding:0 8px 4px} .bs-searchbox .form-control{margin-bottom:0;width:100%;float:none} -.bootstrap-switch{display:inline-block;direction:ltr;cursor:pointer;border-radius:1px;border:1px solid #bbb;position:relative;text-align:left;overflow:hidden;line-height:8px;z-index:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s} +.bootstrap-switch{display:inline-block;direction:ltr;cursor:pointer;border-radius:1px;border:1px solid #bbb;position:relative;text-align:left;overflow:hidden;line-height:8px;z-index:0;-ms-user-select:none;user-select:none;vertical-align:middle;-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s} +.c3 text,.log-line-number{-moz-user-select:none;-webkit-user-select:none} .bootstrap-switch .bootstrap-switch-container{display:inline-block;top:0;border-radius:1px;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)} .bootstrap-switch .bootstrap-switch-handle-off,.bootstrap-switch .bootstrap-switch-handle-on,.bootstrap-switch .bootstrap-switch-label{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:inline-block!important;height:100%;padding:2px 6px;font-size:13px;line-height:21px} .ie9.layout-pf-alt-fixed .nav-pf-vertical-alt,.ie9.layout-pf-fixed .nav-pf-secondary-nav,.ie9.layout-pf-fixed .nav-pf-tertiary-nav,.ie9.layout-pf-fixed .nav-pf-vertical,.list-group-item-header{box-sizing:content-box} @@ -2544,7 +2547,7 @@ select.bs-select-hidden,select.selectpicker{display:none!important} .bootstrap-touchspin .input-group-btn-vertical i{position:absolute;font-weight:400} .c3 svg{font:10px sans-serif} .c3 line,.c3 path{fill:none;stroke:#000} -.c3 text{-webkit-user-select:none;-moz-user-select:none;user-select:none} +.c3 text{user-select:none} .c3-bars path,.c3-event-rect,.c3-legend-item-tile,.c3-xgrid-focus,.c3-ygrid{shape-rendering:crispEdges} .c3-chart-arc text{fill:#fff;font-size:13px} .c3-grid text{fill:#aaa} @@ -3129,7 +3132,6 @@ a.disabled{color:#8b8d8f;cursor:not-allowed;text-decoration:none} } .list-view-pf-actions{float:right;margin-bottom:20px;margin-left:20px;margin-top:20px;order:2} .list-view-pf-actions .dropdown-kebab-pf,.list-view-pf-actions button,.list-view-pf-actions>a{margin-left:10px} -.list-view-pf-top-align .list-view-pf-actions{align-self:flex-start} .list-view-pf-additional-info{align-items:center;display:flex;flex-wrap:wrap} @media (min-width:992px){.list-view-pf-additional-info{flex:1 0 auto;float:left;width:50%} } @@ -3144,7 +3146,6 @@ a.disabled{color:#8b8d8f;cursor:not-allowed;text-decoration:none} @media (min-width:992px){.list-view-pf-body{align-items:center;display:flex;flex-direction:row} } .list-view-pf-checkbox{border-right:1px solid #d1d1d1;float:left;margin-right:15px;padding:3px 10px 3px 0} -.list-view-pf-top-align .list-view-pf-checkbox{align-self:flex-start} .list-view-pf-stacked .list-view-pf-description{display:block;flex:none} @media (min-width:992px){.list-view-pf-description{align-items:center;display:flex;float:left;width:50%} } @@ -5307,6 +5308,17 @@ td.visible-print,th.visible-print{display:table-cell!important} .landing::-webkit-scrollbar-track{background-color:#042e43} .landing-side-bar::-webkit-scrollbar-track{background-color:#21272e} .project-bar ::-webkit-scrollbar-track{background-color:#050505} +.add-secret-to-application .catalogs-overlay-panel{max-width:600px} +.add-secret-to-application .dialog-title{border-bottom:1px solid #d1d1d1} +.add-secret-to-application .dialog-title h3{margin:18px 0;padding-left:15px} +.add-secret-to-application .dialog-body{padding:20px} +.add-secret-to-application .dialog-body .add-choice{margin-bottom:10px} +.add-secret-to-application .dialog-body .button-group .btn{margin-left:10px} +.add-secret-to-application .dialog-body .button-group .btn:first-of-type{margin-left:0} +.add-secret-to-application .dialog-body legend{border-bottom:0;font-size:14px;font-weight:600;margin-bottom:10px} +.add-secret-to-application .dialog-body .radio{margin-top:0} +.add-secret-to-application .updating{background-color:#fff;bottom:55px;left:0;padding-top:60px;position:absolute;right:0;top:55px;z-index:1000} +.add-secret-to-application .volume-options{margin-left:20px} .osc-secrets-form .advanced-secrets .help-blocks,.osc-secrets-form .advanced-secrets .input-labels,.osc-secrets-form .basic-secrets .help-blocks,.osc-secrets-form .basic-secrets .input-labels{display:table;padding-right:30px;position:relative;width:100%} .osc-secrets-form .advanced-secrets .help-blocks .help-block,.osc-secrets-form .advanced-secrets .help-blocks .input-label,.osc-secrets-form .advanced-secrets .input-labels .help-block,.osc-secrets-form .advanced-secrets .input-labels .input-label,.osc-secrets-form .basic-secrets .help-blocks .help-block,.osc-secrets-form .basic-secrets .help-blocks .input-label,.osc-secrets-form .basic-secrets .input-labels .help-block,.osc-secrets-form .basic-secrets .input-labels .input-label{width:100%;float:left;padding-right:5px} .osc-secrets-form .advanced-secrets .secret-row,.osc-secrets-form .basic-secrets .secret-row{display:table;padding-right:30px;position:relative;width:100%;margin-bottom:15px} @@ -5322,7 +5334,7 @@ dl.secret-data dt{margin-bottom:5px} dl.secret-data dt{clear:left;float:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:160px} } dl.secret-data pre{margin-bottom:0} -.create-secret-modal{background-color:#F5F5F5} +.create-secret-modal{background-color:#f5f5f5} .create-secret-modal .modal-footer{margin-top:0px} .create-secret-modal .modal-body{padding:0px 18px} .create-secret-editor{height:150px} @@ -5657,7 +5669,7 @@ alerts+.chromeless .log-loading-msg{margin-top:130px} .log-line{color:#d1d1d1} .log-line:hover{background-color:#22262b;color:#ededed} .log-line-number:before{content:attr(data-line-number)} -.log-line-number{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;border-right:1px #272b30 solid;padding-right:10px;vertical-align:top;white-space:nowrap;width:60px;color:#72767b} +.log-line-number{-ms-user-select:none;border-right:1px #272b30 solid;padding-right:10px;vertical-align:top;white-space:nowrap;width:60px;color:#72767b} .log-line-text{padding:0 10px;white-space:pre-wrap;width:100%;word-wrap:break-word;word-break:break-word;overflow-wrap:break-word;min-width:0} .appended-icon,.project-date [am-time-ago],.projects-list [am-time-ago]{white-space:nowrap} .log-line-text::-moz-selection{color:#101214;background:#e5e5e5}