summaryrefslogtreecommitdiff
path: root/app/assets/javascripts
diff options
context:
space:
mode:
authorFilipa Lacerda <filipa@gitlab.com>2016-10-25 21:00:56 +0100
committerFilipa Lacerda <filipa@gitlab.com>2016-11-16 11:58:05 +0000
commita2dbdb88be6fdd363d42f925c2792adb2e4756ab (patch)
tree1bed260111b26da8e5f2bfc301f4f7afa959a7ff /app/assets/javascripts
parent9a7fa3b6d38f6ac9dbdfef793d66cb6d21c6431e (diff)
downloadgitlab-ce-a2dbdb88be6fdd363d42f925c2792adb2e4756ab.tar.gz
Fix tab filtering and counting
Diffstat (limited to 'app/assets/javascripts')
-rw-r--r--app/assets/javascripts/environments/environments_bundle.js.es629
-rw-r--r--app/assets/javascripts/environments/stores/environmnets_store.js.es625
2 files changed, 39 insertions, 15 deletions
diff --git a/app/assets/javascripts/environments/environments_bundle.js.es6 b/app/assets/javascripts/environments/environments_bundle.js.es6
index 3382e7a4b29..59c0dcfe1c2 100644
--- a/app/assets/javascripts/environments/environments_bundle.js.es6
+++ b/app/assets/javascripts/environments/environments_bundle.js.es6
@@ -16,14 +16,21 @@ $(() => {
gl.EnvironmentsListApp.$destroy(true);
}
- const filterEnvironments = (environments = [], filter = "") => {
- return environments.filter((env) => {
- if (env.children) {
- return env.children.filter((child) => child.state === filter).length;
- } else {
- return env.state === filter;
- };
- });
+
+ const filterState = (state) => (environment) => environment.state === state && environment;
+
+ // recursiveMap :: (Function, Array) -> Array
+ const recursiveMap = (fn, arr) => {
+ return arr.map((item) => {
+ if (!item.children) { return fn(item); }
+
+ const filteredChildren = recursiveMap(fn, item.children).filter(Boolean);
+ if (filteredChildren.length) {
+ item.children = filteredChildren;
+ return item;
+ }
+
+ }).filter(Boolean);
};
gl.EnvironmentsListApp = new Vue({
@@ -43,15 +50,15 @@ $(() => {
computed: {
filteredEnvironments () {
- return filterEnvironments(this.state.environments, this.visibility);
+ return recursiveMap(filterState(this.visibility), this.state.environments);
},
countStopped () {
- return filterEnvironments(this.state.environments, 'stopped').length;
+
},
countAvailable () {
- return filterEnvironments(this.state.environments, 'available').length;
+ // return recursiveMap(filterState('available'), this.state.environments).length;
}
},
diff --git a/app/assets/javascripts/environments/stores/environmnets_store.js.es6 b/app/assets/javascripts/environments/stores/environmnets_store.js.es6
index 9416b944b4d..de51d94d2b5 100644
--- a/app/assets/javascripts/environments/stores/environmnets_store.js.es6
+++ b/app/assets/javascripts/environments/stores/environmnets_store.js.es6
@@ -7,6 +7,8 @@
create () {
this.state.environments = [];
+ this.state.stoppedCounter = 0;
+ this.state.availableCounter = 0;
},
/**
@@ -42,6 +44,10 @@
* @returns {Array} Tree structured array with the received environments.
*/
storeEnvironments(environments = []) {
+
+ this.state.stoppedCounter = this.countByState(environments, 'stopped');
+ this.state.availableCounter = this.countByState(environments, 'available');
+
const environmentsTree = environments.reduce((acc, environment) => {
if (environment.last_deployment) {
@@ -59,15 +65,14 @@
if (environment.environment_type !== null) {
const occurs = acc.find((element, index, array) => {
- return element.environment_type === environment.environment_type;
+ return element.children && element.name === environment.environment_type;
});
-
-
+
environment["vue-isChildren"] = true;
if (occurs !== undefined) {
acc[acc.indexOf(occurs)].children.push(environment);
- acc[acc.indexOf(occurs)].children.push(environment).sort(this.sortByName)
+ acc[acc.indexOf(occurs)].children.sort(this.sortByName)
} else {
acc.push({
name: environment.environment_type,
@@ -89,6 +94,18 @@
},
/**
+ * Given an array of environments, returns the number of environments
+ * that have the given state.
+ *
+ * @param {Array} environments
+ * @param {String} state
+ * @returns {Number}
+ */
+ countByState(environments, state) {
+ return environments.filter((env) => env.state === state).length;
+ },
+
+ /**
* Sorts the two objects provided by their name.
*
* @param {Object} a