From 9c41191a002c088ecb269b1e69606000be9be005 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Mon, 24 Oct 2016 16:10:58 +0100 Subject: [PATCH] Adds tab behavior to vue component --- .../environments/environments_bundle.js.es6 | 46 ++++++++++++++++++- .../stores/environmnets_store.js.es6 | 2 +- .../projects/environments_controller.rb | 10 +--- .../projects/environments/index.html.haml | 14 +++--- 4 files changed, 55 insertions(+), 17 deletions(-) diff --git a/app/assets/javascripts/environments/environments_bundle.js.es6 b/app/assets/javascripts/environments/environments_bundle.js.es6 index 027dc7fb211..4dc4ac2c99b 100644 --- a/app/assets/javascripts/environments/environments_bundle.js.es6 +++ b/app/assets/javascripts/environments/environments_bundle.js.es6 @@ -15,6 +15,15 @@ $(() => { gl.EnvironmentsListApp.$destroy(true); } + const filters = { + stopped (environments) { + return environments.filter((env) => env.state === 'stopped') + }, + available (environments) { + return environments.filter((env) => env.state === 'available') + } + }; + gl.EnvironmentsListApp = new Vue({ el: '#environments-list-view', @@ -26,13 +35,33 @@ $(() => { data: { state: Store.state, endpoint: environmentsListApp.dataset.endpoint, - loading: true + loading: true, + visibility: 'available' + }, + + computed: { + filteredEnvironments () { + return filters[this.visibility](this.state.environments); + }, + + countStopped () { + return filters['stopped'](this.state.environments).length; + }, + + counAvailable () { + return filters['available'](this.state.environments).length; + } }, init: Store.create.bind(Store), created() { gl.environmentsService = new EnvironmentsService(this.endpoint); + + const scope = this.$options.getQueryParameter('scope'); + if (scope) { + this.visibility = scope; + } }, /** @@ -45,6 +74,21 @@ $(() => { this.loading = false; }); + }, + + /** + * Transforms the url parameter into an object and + * returns the one requested. + * + * @param {String} param + * @returns {String} The value of the requested parameter. + */ + getQueryParameter(param) { + return window.location.search.substring(1).split('&').reduce((acc, param) => { + acc[param.split('=')[0]] = param.split('=')[1]; + return acc; + }, {})[param]; } + }); }); diff --git a/app/assets/javascripts/environments/stores/environmnets_store.js.es6 b/app/assets/javascripts/environments/stores/environmnets_store.js.es6 index 35563b0d7fa..f48e8d4c49a 100644 --- a/app/assets/javascripts/environments/stores/environmnets_store.js.es6 +++ b/app/assets/javascripts/environments/stores/environmnets_store.js.es6 @@ -82,7 +82,7 @@ return acc; }, []).sort(this.sortByName); - + this.state.environments = environmentsTree; return environmentsTree; diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index b9e2187bc3b..42f882b55ab 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -8,14 +8,8 @@ class Projects::EnvironmentsController < Projects::ApplicationController def index @scope = params[:scope] - @all_environments = project.environments - @environments = - if @scope == 'stopped' - @all_environments.stopped - else - @all_environments.available - end - + @environments = project.environments + respond_to do |format| format.html format.json do diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml index a8667d88e7b..7cec3fa281c 100644 --- a/app/views/projects/environments/index.html.haml +++ b/app/views/projects/environments/index.html.haml @@ -4,28 +4,28 @@ - content_for :page_specific_javascripts do = page_specific_javascript_tag("environments/environments_bundle.js") - -%div{ class: container_class } + +#environments-list-view{ data: environments_list_data, class: container_class } .top-area - %ul.nav-links + %ul.nav-links{ "v-if" => "!loading" } %li{class: ('active' if @scope.nil?)} = link_to project_environments_path(@project) do Available %span.badge.js-available-environments-count - = number_with_delimiter(@all_environments.available.count) + {{counAvailable}} %li{class: ('active' if @scope == 'stopped')} = link_to project_environments_path(@project, scope: :stopped) do Stopped %span.badge.js-stopped-environments-count - = number_with_delimiter(@all_environments.stopped.count) + {{countStopped}} - if can?(current_user, :create_environment, @project) && !@all_environments.blank? .nav-controls = link_to new_namespace_project_environment_path(@project.namespace, @project), class: "btn btn-create" do New environment - #environments-list-view{ data: environments_list_data, class: "environments-container" } + .environments-container .environments-list-loading.text-center{ "v-if" => "loading" } = icon("spinner spin") @@ -51,6 +51,6 @@ %th %th.hidden-xs %tbody - %tr{"is" => "environment-item", "v-for" => "model in state.environments", ":model" => "model"} + %tr{"is" => "environment-item", "v-for" => "model in filteredEnvironments", ":model" => "model"} =render "projects/environments/components/environment"