diff --git a/app/assets/javascripts/ci_variable_list/components/ci_admin_variables.vue b/app/assets/javascripts/ci_variable_list/components/ci_admin_variables.vue
new file mode 100644
index 0000000000000000000000000000000000000000..83bad9eb5186ab1ee947197634baec3c82ed1db5
--- /dev/null
+++ b/app/assets/javascripts/ci_variable_list/components/ci_admin_variables.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
diff --git a/app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue b/app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue
index 8ee7132bb252f6e087b6ba7db5021a672bd94fac..c9002edc1abd9ed2728c1fa5a541c6799d241b00 100644
--- a/app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue
+++ b/app/assets/javascripts/ci_variable_list/components/ci_environments_dropdown.vue
@@ -33,9 +33,9 @@ export default {
},
filteredEnvironments() {
const lowerCasedSearchTerm = this.searchTerm.toLowerCase();
- return this.environments.filter((resultString) =>
- resultString.toLowerCase().includes(lowerCasedSearchTerm),
- );
+ return this.environments.filter((environment) => {
+ return environment.toLowerCase().includes(lowerCasedSearchTerm);
+ });
},
shouldRenderCreateButton() {
return this.searchTerm && !this.environments.includes(this.searchTerm);
diff --git a/app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue b/app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue
index dc57f3fe4ced881d8af109da740e292a239d9ee3..5ba63de8c96306ff461a9777c32a94bd819e43c5 100644
--- a/app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue
+++ b/app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue
@@ -33,7 +33,7 @@ import {
VARIABLE_ACTIONS,
variableOptions,
} from '../constants';
-
+import { createJoinedEnvironments } from '../utils';
import CiEnvironmentsDropdown from './ci_environments_dropdown.vue';
import { awsTokens, awsTokenList } from './ci_variable_autocomplete_tokens';
@@ -98,9 +98,15 @@ export default {
required: false,
default: () => {},
},
+ variables: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
},
data() {
return {
+ newEnvironments: [],
isTipDismissed: getCookie(AWS_TIP_DISMISSED_COOKIE_NAME) === 'true',
typeOptions: variableOptions,
validationErrorEventProperty: '',
@@ -128,6 +134,9 @@ export default {
isTipVisible() {
return !this.isTipDismissed && AWS_TOKEN_CONSTANTS.includes(this.variable.key);
},
+ joinedEnvironments() {
+ return createJoinedEnvironments(this.variables, this.environments, this.newEnvironments);
+ },
maskedFeedback() {
return this.displayMaskedError ? __('This variable can not be masked.') : '';
},
@@ -176,7 +185,7 @@ export default {
this.$emit('add-variable', this.variable);
},
createEnvironmentScope(env) {
- this.$emit('create-environment-scope', env);
+ this.newEnvironments.push(env);
},
deleteVariable() {
this.$emit('delete-variable', this.variable);
@@ -314,7 +323,7 @@ export default {
v-if="areScopedVariablesAvailable"
class="gl-w-full"
:selected-environment-scope="variable.environmentScope"
- :environments="environments"
+ :environments="joinedEnvironments"
@select-environment="setEnvironmentScope"
@create-environment-scope="createEnvironmentScope"
/>
diff --git a/app/assets/javascripts/ci_variable_list/components/ci_variable_settings.vue b/app/assets/javascripts/ci_variable_list/components/ci_variable_settings.vue
index 29578c6f7106620237b2478d4603de688985b408..81e3a983ea31dcf6e0b1baa13821335ab820af0a 100644
--- a/app/assets/javascripts/ci_variable_list/components/ci_variable_settings.vue
+++ b/app/assets/javascripts/ci_variable_list/components/ci_variable_settings.vue
@@ -1,6 +1,5 @@