diff --git a/app/scripts/directives/editEnvironmentFrom.js b/app/scripts/directives/editEnvironmentFrom.js index 227924089a..966791f902 100644 --- a/app/scripts/directives/editEnvironmentFrom.js +++ b/app/scripts/directives/editEnvironmentFrom.js @@ -11,7 +11,8 @@ addRowLink: '@', // creates a link to "add row" and sets its text label entries: '=', // an array of objects containing configmaps and secrets envFromSelectorOptions: '<', // dropdown selector options, an array of objects - selectorPlaceholder: '@' // placeholder copy for dropdown selector + selectorPlaceholder: '@', // placeholder copy for dropdown selector + isReadonly: '<?' // display as read only values }, templateUrl: 'views/directives/edit-environment-from.html' }); @@ -20,7 +21,6 @@ $filter, utils) { var ctrl = this; - var canI = $filter('canI'); var humanizeKind = $filter('humanizeKind'); var uniqueId = _.uniqueId(); @@ -51,6 +51,7 @@ } ctrl.envFromEntries.splice(start, deleteCount); + if(!ctrl.envFromEntries.length && ctrl.addRowLink) { addEntry(ctrl.envFromEntries); } @@ -59,11 +60,18 @@ ctrl.editEnvironmentFromForm.$setDirty(); }; + ctrl.hasOptions = function() { + return !_.isEmpty(ctrl.envFromSelectorOptions); + }; + + ctrl.hasEntries = function() { + return _.some(ctrl.entries, function(entry) { + return _.get(entry, 'configMapRef.name') || _.get(entry, 'secretRef.name'); + }); + }; + ctrl.isEnvFromReadonly = function(entry) { - return ctrl.isReadonlyAny || - entry.isReadonlyValue === true || - ((entry.secretRef || entry.configMapRef) && !entry.selectedEnvFrom) || - _.isEmpty(ctrl.envFromSelectorOptions); + return ctrl.isReadonly === true || entry && entry.isReadonly === true; }; ctrl.groupByKind = function(object) { @@ -107,66 +115,61 @@ }); }; - var updateEnvFromEntries = function(entries) { - ctrl.envFromEntries = entries || []; + var updateEnvFromEntries = function() { + var configMapsByName = {}; + var secretsByName = {}; + + ctrl.envFromEntries = ctrl.entries || []; if(!ctrl.envFromEntries.length) { addEntry(ctrl.envFromEntries); } - _.each(ctrl.envFromEntries, function(entry) { - if(entry) { - if(entry.configMapRef && !canI('configmaps', 'get')) { - entry.isReadonlyValue = true; - } - - if(entry.secretRef && !canI('secrets', 'get')) { - entry.isReadonlyValue = true; - } + _.each(ctrl.envFromSelectorOptions, function(option) { + switch(option.kind) { + case 'ConfigMap': + configMapsByName[option.metadata.name] = option; + break; + case 'Secret': + secretsByName[option.metadata.name] = option; + break; } }); - }; - var getReferenceValue = function(option) { - var referenceValue; - - switch(option.kind) { - case 'ConfigMap': - referenceValue = _.find(ctrl.envFromEntries, {configMapRef: {name: option.metadata.name}}); - break; - case 'Secret': - referenceValue = _.find(ctrl.envFromEntries, {secretRef: {name: option.metadata.name}}); - break; - } + _.each(ctrl.envFromEntries, function(entry) { + var refType; + var entryType; - return referenceValue; - }; + if (entry.configMapRef) { + refType = 'configMapRef'; + entryType = 'configmaps'; + } - ctrl.checkEntries = function(option, entrySelectedEnvFrom) { - if(option === entrySelectedEnvFrom) { - return false; - } + if(entry.secretRef) { + refType = 'secretRef'; + entryType = 'secrets'; + } - return !!(getReferenceValue(option)); - }; + if (refType && entryType) { + var refTypeName = entry[refType].name; - var findReferenceValueForEntries = function(entries, envFromSelectorOptions) { - ctrl.cannotAdd = (ctrl.isReadonlyAny || _.isEmpty(envFromSelectorOptions)); + if (entry.configMapRef && (refTypeName in configMapsByName)) { + entry.selectedEnvFrom = configMapsByName[refTypeName]; + } - if(envFromSelectorOptions) { - _.each(envFromSelectorOptions, function(option) { - var referenceValue = getReferenceValue(option); + if (entry.secretRef && (refTypeName in secretsByName)) { + entry.selectedEnvFrom = secretsByName[refTypeName]; + } - if (referenceValue) { - _.set(referenceValue, 'selectedEnvFrom', option); + if(!canI(entryType, 'get')) { + entry.isReadonly = true; } - }); - } + } + }); }; ctrl.$onInit = function() { - updateEnvFromEntries(ctrl.entries); - findReferenceValueForEntries(ctrl.entries, ctrl.envFromSelectorOptions); + updateEnvFromEntries(); if('cannotDelete' in $attrs) { ctrl.cannotDeleteAny = true; @@ -176,10 +179,6 @@ ctrl.cannotSort = true; } - if('isReadonly' in $attrs) { - ctrl.isReadonlyAny = true; - } - if('showHeader' in $attrs) { ctrl.showHeader = true; } @@ -190,12 +189,8 @@ }; ctrl.$onChanges = function(changes) { - if(changes.entries) { - updateEnvFromEntries(changes.entries.currentValue); - } - - if(changes.envFromSelectorOptions) { - findReferenceValueForEntries(ctrl.envFromEntries, changes.envFromSelectorOptions.currentValue); + if(changes.entries || changes.envFromSelectorOptions) { + updateEnvFromEntries(); } }; } diff --git a/app/views/directives/edit-environment-from.html b/app/views/directives/edit-environment-from.html index 7940c8c551..6a3ac4419a 100644 --- a/app/views/directives/edit-environment-from.html +++ b/app/views/directives/edit-environment-from.html @@ -8,7 +8,6 @@ </div> </div> </div> - <div ng-model="$ctrl.entries" class="environment-from-editor" as-sortable="$ctrl.dragControlListeners"> <div class="environment-from-entry" @@ -18,9 +17,9 @@ as-sortable-item> <div class="form-group environment-from-input"> - <div ng-if="$ctrl.isEnvFromReadonly(entry)" class="faux-input-group"> + <div ng-if="$ctrl.isEnvFromReadonly(entry) || !$ctrl.hasOptions()" class="faux-input-group"> <div ng-if="!entry.configMapRef.name && !entry.secretRef.name"> - No secrets or config maps have been added as Environment From. + No config maps or secrets have been added as Environment From. </div> <div ng-if="entry.configMapRef.name || entry.secretRef.name" class="faux-form-control readonly"> Use all keys and values from @@ -29,7 +28,7 @@ </div> </div> - <div ng-if="!$ctrl.isEnvFromReadonly(entry)"> + <div ng-if="!$ctrl.isEnvFromReadonly(entry) && $ctrl.hasOptions()"> <div class="ui-select"> <ui-select ng-model="entry.selectedEnvFrom" ng-required="entry.selectedEnvFrom" @@ -42,7 +41,6 @@ </span> </ui-select-match> <ui-select-choices - ui-disable-choice="$ctrl.checkEntries(source, entry.selectedEnvFrom)" repeat="source in $ctrl.envFromSelectorOptions | filter : { metadata: { name: $select.search } } track by (source | uid)" group-by="$ctrl.groupByKind"> <span ng-bind-html="source.metadata.name | highlight : $select.search"></span> @@ -52,7 +50,7 @@ </div> </div> - <div ng-if="!$ctrl.isReadonlyAny && !entry.isReadonlyValue" class="environment-from-editor-button"> + <div ng-if="!$ctrl.isEnvFromReadonly(entry) && $ctrl.hasEntries()" class="environment-from-editor-button"> <span ng-if="!$ctrl.cannotSort && $ctrl.entries.length > 1" class="fa fa-bars sort-row" @@ -70,18 +68,18 @@ </div> <div class="environment-from-view-details"> <a - ng-if="entry.selectedEnvFrom" href="" + ng-if="entry.selectedEnvFrom" ng-click="$ctrl.viewOverlayPanel(entry.selectedEnvFrom)">View Details</a> </div> </div> - <div class="environment-from-entry form-group" ng-if="!$ctrl.cannotAdd"> + <div class="environment-from-entry form-group" ng-if="!$ctrl.isEnvFromReadonly() && $ctrl.hasOptions()"> <a href="" class="add-row-link" role="button" - ng-click="$ctrl.onAddRow()">{{ $ctrl.addRowLink }}</a> + ng-click="$ctrl.onAddRow()">{{$ctrl.addRowLink}}</a> </div> </div> diff --git a/app/views/directives/edit-environment-variables.html b/app/views/directives/edit-environment-variables.html index b5f1e950dc..2c2fa1ec98 100644 --- a/app/views/directives/edit-environment-variables.html +++ b/app/views/directives/edit-environment-variables.html @@ -46,6 +46,7 @@ <h4 class="section-label"> selector-placeholder="Config Map/Secret" env-from-selector-options="$ctrl.valueFromObjects" add-row-link="Add ALL Values from Config Map or Secret" + is-readonly="$ctrl.ngReadonly" show-header> </edit-environment-from> </div> diff --git a/dist/scripts/scripts.js b/dist/scripts/scripts.js index 487a76eff9..f70be3c8d1 100644 --- a/dist/scripts/scripts.js +++ b/dist/scripts/scripts.js @@ -9207,8 +9207,14 @@ a.onAddRow = function() { s(a.envFromEntries), n.setFocusOn("." + a.setFocusClass); }, a.deleteEntry = function(e, t) { a.envFromEntries && !a.envFromEntries.length || (a.envFromEntries.splice(e, t), !a.envFromEntries.length && a.addRowLink && s(a.envFromEntries), a.updateEntries(a.envFromEntries), a.editEnvironmentFromForm.$setDirty()); +}, a.hasOptions = function() { +return !_.isEmpty(a.envFromSelectorOptions); +}, a.hasEntries = function() { +return _.some(a.entries, function(e) { +return _.get(e, "configMapRef.name") || _.get(e, "secretRef.name"); +}); }, a.isEnvFromReadonly = function(e) { -return a.isReadonlyAny || !0 === e.isReadonlyValue || (e.secretRef || e.configMapRef) && !e.selectedEnvFrom || _.isEmpty(a.envFromSelectorOptions); +return !0 === a.isReadonly || e && !0 === e.isReadonly; }, a.groupByKind = function(e) { return o(e.kind); }, a.dragControlListeners = { @@ -9238,50 +9244,37 @@ a.entries = _.filter(e, function(e) { return e.secretRef || e.configMapRef; }); }; -var c = function(e) { -a.envFromEntries = e || [], a.envFromEntries.length || s(a.envFromEntries), _.each(a.envFromEntries, function(e) { -e && (e.configMapRef && !r("configmaps", "get") && (e.isReadonlyValue = !0), e.secretRef && !r("secrets", "get") && (e.isReadonlyValue = !0)); -}); -}, l = function(e) { -var t; -switch (e.kind) { +var c = function() { +var e = {}, t = {}; +a.envFromEntries = a.entries || [], a.envFromEntries.length || s(a.envFromEntries), _.each(a.envFromSelectorOptions, function(n) { +switch (n.kind) { case "ConfigMap": -t = _.find(a.envFromEntries, { -configMapRef: { -name: e.metadata.name -} -}); +e[n.metadata.name] = n; break; case "Secret": -t = _.find(a.envFromEntries, { -secretRef: { -name: e.metadata.name +t[n.metadata.name] = n; } -}); +}), _.each(a.envFromEntries, function(n) { +var a, o; +if (n.configMapRef && (a = "configMapRef", o = "configmaps"), n.secretRef && (a = "secretRef", o = "secrets"), a && o) { +var i = n[a].name; +n.configMapRef && i in e && (n.selectedEnvFrom = e[i]), n.secretRef && i in t && (n.selectedEnvFrom = t[i]), r(o, "get") || (n.isReadonly = !0); } -return t; -}; -a.checkEntries = function(e, t) { -return e !== t && !!l(e); -}; -var u = function(e, t) { -a.cannotAdd = a.isReadonlyAny || _.isEmpty(t), t && _.each(t, function(e) { -var t = l(e); -t && _.set(t, "selectedEnvFrom", e); }); }; a.$onInit = function() { -c(a.entries), u(a.entries, a.envFromSelectorOptions), "cannotDelete" in e && (a.cannotDeleteAny = !0), "cannotSort" in e && (a.cannotSort = !0), "isReadonly" in e && (a.isReadonlyAny = !0), "showHeader" in e && (a.showHeader = !0), a.envFromEntries && !a.envFromEntries.length && s(a.envFromEntries); +c(), "cannotDelete" in e && (a.cannotDeleteAny = !0), "cannotSort" in e && (a.cannotSort = !0), "showHeader" in e && (a.showHeader = !0), a.envFromEntries && !a.envFromEntries.length && s(a.envFromEntries); }, a.$onChanges = function(e) { -e.entries && c(e.entries.currentValue), e.envFromSelectorOptions && u(a.envFromEntries, e.envFromSelectorOptions.currentValue); +(e.entries || e.envFromSelectorOptions) && c(); }; } ], bindings: { addRowLink: "@", entries: "=", envFromSelectorOptions: "<", -selectorPlaceholder: "@" +selectorPlaceholder: "@", +isReadonly: "<?" }, templateUrl: "views/directives/edit-environment-from.html" }); diff --git a/dist/scripts/templates.js b/dist/scripts/templates.js index e3f6abd1f2..93c5ef1b15 100644 --- a/dist/scripts/templates.js +++ b/dist/scripts/templates.js @@ -6709,9 +6709,9 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function( "<div ng-model=\"$ctrl.entries\" class=\"environment-from-editor\" as-sortable=\"$ctrl.dragControlListeners\">\n" + "<div class=\"environment-from-entry\" ng-class-odd=\"'odd'\" ng-class-even=\"'even'\" ng-repeat=\"entry in $ctrl.envFromEntries\" as-sortable-item>\n" + "<div class=\"form-group environment-from-input\">\n" + - "<div ng-if=\"$ctrl.isEnvFromReadonly(entry)\" class=\"faux-input-group\">\n" + + "<div ng-if=\"$ctrl.isEnvFromReadonly(entry) || !$ctrl.hasOptions()\" class=\"faux-input-group\">\n" + "<div ng-if=\"!entry.configMapRef.name && !entry.secretRef.name\">\n" + - "No secrets or config maps have been added as Environment From.\n" + + "No config maps or secrets have been added as Environment From.\n" + "</div>\n" + "<div ng-if=\"entry.configMapRef.name || entry.secretRef.name\" class=\"faux-form-control readonly\">\n" + "Use all keys and values from\n" + @@ -6719,7 +6719,7 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function( "<span ng-if=\"entry.secretRef.name\">secret {{entry.secretRef.name}}</span>\n" + "</div>\n" + "</div>\n" + - "<div ng-if=\"!$ctrl.isEnvFromReadonly(entry)\">\n" + + "<div ng-if=\"!$ctrl.isEnvFromReadonly(entry) && $ctrl.hasOptions()\">\n" + "<div class=\"ui-select\">\n" + "<ui-select ng-model=\"entry.selectedEnvFrom\" ng-required=\"entry.selectedEnvFrom\" on-select=\"$ctrl.envFromObjectSelected($index, entry, $select.selected)\" ng-class=\"{'{{$ctrl.setFocusClass}}' : $last}\">\n" + "<ui-select-match placeholder=\"Select a resource\">\n" + @@ -6728,23 +6728,23 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function( "<small class=\"text-muted\">– {{$select.selected.kind | humanizeKind : true}}</small>\n" + "</span>\n" + "</ui-select-match>\n" + - "<ui-select-choices ui-disable-choice=\"$ctrl.checkEntries(source, entry.selectedEnvFrom)\" repeat=\"source in $ctrl.envFromSelectorOptions | filter : { metadata: { name: $select.search } } track by (source | uid)\" group-by=\"$ctrl.groupByKind\">\n" + + "<ui-select-choices repeat=\"source in $ctrl.envFromSelectorOptions | filter : { metadata: { name: $select.search } } track by (source | uid)\" group-by=\"$ctrl.groupByKind\">\n" + "<span ng-bind-html=\"source.metadata.name | highlight : $select.search\"></span>\n" + "</ui-select-choices>\n" + "</ui-select>\n" + "</div>\n" + "</div>\n" + "</div>\n" + - "<div ng-if=\"!$ctrl.isReadonlyAny && !entry.isReadonlyValue\" class=\"environment-from-editor-button\">\n" + + "<div ng-if=\"!$ctrl.isEnvFromReadonly(entry) && $ctrl.hasEntries()\" class=\"environment-from-editor-button\">\n" + "<span ng-if=\"!$ctrl.cannotSort && $ctrl.entries.length > 1\" class=\"fa fa-bars sort-row\" role=\"button\" aria-label=\"Move row\" aria-grabbed=\"false\" as-sortable-item-handle></span>\n" + "<a ng-if=\"!$ctrl.cannotDeleteAny\" href=\"\" class=\"pficon pficon-close delete-row as-sortable-item-delete\" role=\"button\" aria-label=\"Delete row\" ng-click=\"$ctrl.deleteEntry($index, 1)\"></a>\n" + "</div>\n" + "<div class=\"environment-from-view-details\">\n" + - "<a ng-if=\"entry.selectedEnvFrom\" href=\"\" ng-click=\"$ctrl.viewOverlayPanel(entry.selectedEnvFrom)\">View Details</a>\n" + + "<a href=\"\" ng-if=\"entry.selectedEnvFrom\" ng-click=\"$ctrl.viewOverlayPanel(entry.selectedEnvFrom)\">View Details</a>\n" + "</div>\n" + "</div>\n" + - "<div class=\"environment-from-entry form-group\" ng-if=\"!$ctrl.cannotAdd\">\n" + - "<a href=\"\" class=\"add-row-link\" role=\"button\" ng-click=\"$ctrl.onAddRow()\">{{ $ctrl.addRowLink }}</a>\n" + + "<div class=\"environment-from-entry form-group\" ng-if=\"!$ctrl.isEnvFromReadonly() && $ctrl.hasOptions()\">\n" + + "<a href=\"\" class=\"add-row-link\" role=\"button\" ng-click=\"$ctrl.onAddRow()\">{{$ctrl.addRowLink}}</a>\n" + "</div>\n" + "</div>\n" + "<overlay-panel class=\"add-config-to-application\" show-panel=\"$ctrl.overlayPanelVisible\" show-close=\"true\" handle-close=\"$ctrl.closeOverlayPanel\">\n" + @@ -6798,7 +6798,7 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function( "Environment From\n" + "<span class=\"pficon pficon-help\" aria-hidden=\"true\" data-toggle=\"tooltip\" data-original-title=\"Environment From lets you add all key-value pairs from a config map or secret as environment variables.\"></span>\n" + "</h4>\n" + - "<edit-environment-from entries=\"container.envFrom\" selector-placeholder=\"Config Map/Secret\" env-from-selector-options=\"$ctrl.valueFromObjects\" add-row-link=\"Add ALL Values from Config Map or Secret\" show-header>\n" + + "<edit-environment-from entries=\"container.envFrom\" selector-placeholder=\"Config Map/Secret\" env-from-selector-options=\"$ctrl.valueFromObjects\" add-row-link=\"Add ALL Values from Config Map or Secret\" is-readonly=\"$ctrl.ngReadonly\" show-header>\n" + "</edit-environment-from>\n" + "</div>\n" + "<button class=\"btn btn-default\" ng-if=\"$ctrl.canIUpdate && !$ctrl.ngReadonly\" ng-click=\"$ctrl.save()\" ng-disabled=\"$ctrl.form.$pristine || $ctrl.form.$invalid\">Save</button>\n" +