From ef05423f47fdd970498d880cf18f282fa0205596 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 14 Mar 2013 10:16:27 +0200 Subject: [PATCH] Finish select2-ajax for users. Added Select2Helper for tests --- app/assets/javascripts/users_select.js.coffee | 10 +++++----- app/assets/stylesheets/application.scss | 2 +- app/assets/stylesheets/common.scss | 14 -------------- app/assets/stylesheets/ref_select.scss | 90 ------------------------------------------------------------------------------------------ app/assets/stylesheets/selects.scss | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ app/controllers/application_controller.rb | 7 +++---- features/project/team_management.feature | 1 + features/steps/project/project_team_management.rb | 4 +++- features/steps/userteams/userteams.rb | 348 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ features/support/env.rb | 2 +- features/teams/team.feature | 1 + spec/support/select2_helper.rb | 25 +++++++++++++++++++++++++ 12 files changed, 324 insertions(+), 290 deletions(-) delete mode 100644 app/assets/stylesheets/ref_select.scss create mode 100644 app/assets/stylesheets/selects.scss create mode 100644 spec/support/select2_helper.rb diff --git a/app/assets/javascripts/users_select.js.coffee b/app/assets/javascripts/users_select.js.coffee index 45e4a17..7a39e42 100644 --- a/app/assets/javascripts/users_select.js.coffee +++ b/app/assets/javascripts/users_select.js.coffee @@ -19,7 +19,7 @@ $ -> multiple: $('.ajax-users-select').hasClass('multiselect') minimumInputLength: 0 ajax: # instead of writing the function to execute the request we use Select2's convenient helper - url: "/api/v3/users.json" + url: "/api/" + gon.api_version + "/users.json" dataType: "json" data: (term, page) -> search: term # search term @@ -33,11 +33,11 @@ $ -> initSelection: (element, callback) -> id = $(element).val() if id isnt "" - $.ajax("http://api.rottentomatoes.com/api/public/v1.0/users/" + id + ".json", + $.ajax( + "/api/" + gon.api_version + "/users/" + id + ".json", + dataType: "json" data: - apikey: "ju6z9mjyajq2djue3gbvv26t" - - dataType: "jsonp" + private_token: gon.api_token ).done (data) -> callback data diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index f4afc35..71068e4 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -15,7 +15,7 @@ @import "gitlab_bootstrap.scss"; @import "common.scss"; -@import "ref_select.scss"; +@import "selects.scss"; @import "sections/header.scss"; @import "sections/nav.scss"; diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index 2e7df61..9afbd8f 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -555,17 +555,3 @@ img.emoji { display: none; } -.ajax-users-select { - width: 400px; -} - -.user-result { - .user-image { - float: left; - } - .user-name { - } - .user-username { - color: #999; - } -} diff --git a/app/assets/stylesheets/ref_select.scss b/app/assets/stylesheets/ref_select.scss deleted file mode 100644 index 284d1c3..0000000 --- a/app/assets/stylesheets/ref_select.scss +++ /dev/null @@ -1,90 +0,0 @@ -/** Branch/tag selector **/ -.project-refs-form { - margin: 0; - span { - background:none !important; - position:static !important; - width:auto !important; - height:auto !important; - } -} -.project-refs-select { - width: 120px; -} - -.project-refs-form .chzn-container { - position: relative; - top: 0; - left: 0; - margin-right: 10px; - - .chzn-drop { - min-width: 400px; - .chzn-results { - max-height: 300px; - } - .chzn-search input { - min-width: 365px; - } - } -} - -/** Fix for Search Dropdown Border **/ -.chzn-container { - .chzn-search { - input:focus { - @include box-shadow(none); - } - } - - .chzn-drop { - margin: 7px 0; - min-width: 200px; - border: 1px solid #bbb; - @include border-radius(0); - - .chzn-results { - margin-top: 5px; - max-height: 300px; - - .group-result { - color: $style_color; - border-bottom: 1px solid #EEE; - padding: 8px; - } - .active-result { - @include border-radius(0); - - &.highlighted { - background: $hover; - color: $style_color; - } - &.result-selected { - background: #EEE; - border-left: 4px solid #CCC; - } - } - } - - .chzn-search { - @include bg-gray-gradient; - input { - min-width: 165px; - border-color: #CCC; - } - } - } - - .chzn-single { - @include bg-light-gray-gradient; - - div { - background: transparent; - border-left: none; - } - - span { - font-weight: normal; - } - } -} diff --git a/app/assets/stylesheets/selects.scss b/app/assets/stylesheets/selects.scss new file mode 100644 index 0000000..a2c99d0 --- /dev/null +++ b/app/assets/stylesheets/selects.scss @@ -0,0 +1,110 @@ +.ajax-users-select { + width: 400px; +} + +.user-result { + .user-image { + float: left; + } + .user-name { + } + .user-username { + color: #999; + } +} + +.select2-no-results { + padding: 7px; + color: #666; +} + +/** Branch/tag selector **/ +.project-refs-form { + margin: 0; + span { + background:none !important; + position:static !important; + width:auto !important; + height:auto !important; + } +} +.project-refs-select { + width: 120px; +} + +.project-refs-form .chzn-container { + position: relative; + top: 0; + left: 0; + margin-right: 10px; + + .chzn-drop { + min-width: 400px; + .chzn-results { + max-height: 300px; + } + .chzn-search input { + min-width: 365px; + } + } +} + +/** Fix for Search Dropdown Border **/ +.chzn-container { + .chzn-search { + input:focus { + @include box-shadow(none); + } + } + + .chzn-drop { + margin: 7px 0; + min-width: 200px; + border: 1px solid #bbb; + @include border-radius(0); + + .chzn-results { + margin-top: 5px; + max-height: 300px; + + .group-result { + color: $style_color; + border-bottom: 1px solid #EEE; + padding: 8px; + } + .active-result { + @include border-radius(0); + + &.highlighted { + background: $hover; + color: $style_color; + } + &.result-selected { + background: #EEE; + border-left: 4px solid #CCC; + } + } + } + + .chzn-search { + @include bg-gray-gradient; + input { + min-width: 165px; + border-color: #CCC; + } + } + } + + .chzn-single { + @include bg-light-gray-gradient; + + div { + background: transparent; + border-left: none; + } + + span { + font-weight: normal; + } + } +} diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index bb1afc8..32b1246 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -152,9 +152,8 @@ class ApplicationController < ActionController::Base def add_gon_variables gon.default_issues_tracker = Project.issues_tracker.default_value - if current_user - gon.api_token = current_user.private_token - gon.gravatar_url = request.ssl? ? Gitlab.config.gravatar.ssl_url : Gitlab.config.gravatar.plain_url - end + gon.api_version = Gitlab::API.version + gon.api_token = current_user.private_token if current_user + gon.gravatar_url = request.ssl? ? Gitlab.config.gravatar.ssl_url : Gitlab.config.gravatar.plain_url end end diff --git a/features/project/team_management.feature b/features/project/team_management.feature index d106a54..04545a0 100644 --- a/features/project/team_management.feature +++ b/features/project/team_management.feature @@ -11,6 +11,7 @@ Feature: Project Team management Then I should be able to see myself in team And I should see "Sam" in team list + @javascript Scenario: Add user to project Given I click link "New Team Member" And I select "Mike" as "Reporter" diff --git a/features/steps/project/project_team_management.rb b/features/steps/project/project_team_management.rb index 49e9a93..e8e0543 100644 --- a/features/steps/project/project_team_management.rb +++ b/features/steps/project/project_team_management.rb @@ -2,6 +2,7 @@ class ProjectTeamManagement < Spinach::FeatureSteps include SharedAuthentication include SharedProject include SharedPaths + include Select2Helper Then 'I should be able to see myself in team' do page.should have_content(@user.name) @@ -20,8 +21,9 @@ class ProjectTeamManagement < Spinach::FeatureSteps And 'I select "Mike" as "Reporter"' do user = User.find_by_name("Mike") + + select2(user.id, from: "#user_ids", multiple: true) within "#new_team_member" do - select "#{user.name} (#{user.username})", :from => "user_ids" select "Reporter", :from => "project_access" end click_button "Add users" diff --git a/features/steps/userteams/userteams.rb b/features/steps/userteams/userteams.rb index e467a17..f049431 100644 --- a/features/steps/userteams/userteams.rb +++ b/features/steps/userteams/userteams.rb @@ -2,238 +2,239 @@ class Userteams < Spinach::FeatureSteps include SharedAuthentication include SharedPaths include SharedProject + include Select2Helper - When 'I do not have teams with me' do - UserTeam.with_member(current_user).destroy_all - end + When 'I do not have teams with me' do + UserTeam.with_member(current_user).destroy_all + end - Then 'I should see dashboard page without teams info block' do - page.has_no_css?(".teams-box").must_equal true - end + Then 'I should see dashboard page without teams info block' do + page.has_no_css?(".teams-box").must_equal true + end - When 'I have teams with my membership' do - team = create :user_team, owner: current_user - team.add_member(current_user, UserTeam.access_roles["Master"], true) - end + When 'I have teams with my membership' do + team = create :user_team, owner: current_user + team.add_member(current_user, UserTeam.access_roles["Master"], true) + end - Then 'I should see dashboard page with teams information block' do - page.should have_css(".teams-box") - end + Then 'I should see dashboard page with teams information block' do + page.should have_css(".teams-box") + end - When 'exist user teams' do - team = create :user_team - team.add_member(current_user, UserTeam.access_roles["Master"], true) - end + When 'exist user teams' do + team = create :user_team + team.add_member(current_user, UserTeam.access_roles["Master"], true) + end - And 'I click on "All teams" link' do - click_link("All Teams") - end + And 'I click on "All teams" link' do + click_link("All Teams") + end - Then 'I should see "All teams" page' do - current_path.should == teams_path - end + Then 'I should see "All teams" page' do + current_path.should == teams_path + end - And 'I should see exist teams in teams list' do - team = UserTeam.last - find_in_list(".teams_list tr", team).must_equal true - end + And 'I should see exist teams in teams list' do + team = UserTeam.last + find_in_list(".teams_list tr", team).must_equal true + end - When 'I click to "New team" link' do - click_link("New Team") - end + When 'I click to "New team" link' do + click_link("New Team") + end - And 'I submit form with new team info' do - fill_in 'name', with: 'gitlab' + And 'I submit form with new team info' do + fill_in 'name', with: 'gitlab' - fill_in 'user_team_description', with: 'team description' - click_button 'Create team' - end + fill_in 'user_team_description', with: 'team description' + click_button 'Create team' + end - And 'I should see newly created team' do - page.should have_content "gitlab" - page.should have_content "team description" - end + And 'I should see newly created team' do + page.should have_content "gitlab" + page.should have_content "team description" + end - Then 'I should be redirected to new team page' do - team = UserTeam.last - current_path.should == team_path(team) - end + Then 'I should be redirected to new team page' do + team = UserTeam.last + current_path.should == team_path(team) + end - When 'I have teams with projects and members' do - team = create :user_team, owner: current_user - @project = create :project - team.add_member(current_user, UserTeam.access_roles["Master"], true) - team.assign_to_project(@project, UserTeam.access_roles["Master"]) - @event = create(:closed_issue_event, project: @project) - end + When 'I have teams with projects and members' do + team = create :user_team, owner: current_user + @project = create :project + team.add_member(current_user, UserTeam.access_roles["Master"], true) + team.assign_to_project(@project, UserTeam.access_roles["Master"]) + @event = create(:closed_issue_event, project: @project) + end - When 'I visit team page' do - visit team_path(UserTeam.last) - end + When 'I visit team page' do + visit team_path(UserTeam.last) + end - Then 'I should see projects list' do - page.should have_css(".projects_box") - projects_box = find(".projects_box") - projects_box.should have_content(@project.name) - end + Then 'I should see projects list' do + page.should have_css(".projects_box") + projects_box = find(".projects_box") + projects_box.should have_content(@project.name) + end - And 'project from team has issues assigned to me' do - team = UserTeam.last - team.projects.each do |project| - project.issues << create(:issue, assignee: current_user) - end + And 'project from team has issues assigned to me' do + team = UserTeam.last + team.projects.each do |project| + project.issues << create(:issue, assignee: current_user) end + end - When 'I visit team issues page' do - team = UserTeam.last - visit issues_team_path(team) - end + When 'I visit team issues page' do + team = UserTeam.last + visit issues_team_path(team) + end - Then 'I should see issues from this team assigned to me' do - team = UserTeam.last - team.projects.each do |project| - project.issues.assigned(current_user).each do |issue| - page.should have_content issue.title - end + Then 'I should see issues from this team assigned to me' do + team = UserTeam.last + team.projects.each do |project| + project.issues.assigned(current_user).each do |issue| + page.should have_content issue.title end end + end - Given 'I have team with projects and members' do - team = create :user_team, owner: current_user - project = create :project - user = create :user - team.add_member(current_user, UserTeam.access_roles["Master"], true) - team.add_member(user, UserTeam.access_roles["Developer"], false) - team.assign_to_project(project, UserTeam.access_roles["Master"]) - end + Given 'I have team with projects and members' do + team = create :user_team, owner: current_user + project = create :project + user = create :user + team.add_member(current_user, UserTeam.access_roles["Master"], true) + team.add_member(user, UserTeam.access_roles["Developer"], false) + team.assign_to_project(project, UserTeam.access_roles["Master"]) + end - Given 'project from team has issues assigned to teams members' do - team = UserTeam.last - team.projects.each do |project| - team.members.each do |member| - project.issues << create(:issue, assignee: member) - end + Given 'project from team has issues assigned to teams members' do + team = UserTeam.last + team.projects.each do |project| + team.members.each do |member| + project.issues << create(:issue, assignee: member) end end + end - Then 'I should see issues from this team assigned to teams members' do - team = UserTeam.last - team.projects.each do |project| - team.members.each do |member| - project.issues.assigned(member).each do |issue| - page.should have_content issue.title - end + Then 'I should see issues from this team assigned to teams members' do + team = UserTeam.last + team.projects.each do |project| + team.members.each do |member| + project.issues.assigned(member).each do |issue| + page.should have_content issue.title end end end + end - Given 'project from team has merge requests assigned to me' do - team = UserTeam.last - team.projects.each do |project| - team.members.each do |member| - 3.times { project.merge_requests << create(:merge_request, assignee: member) } - end + Given 'project from team has merge requests assigned to me' do + team = UserTeam.last + team.projects.each do |project| + team.members.each do |member| + 3.times { project.merge_requests << create(:merge_request, assignee: member) } end end + end - When 'I visit team merge requests page' do - team = UserTeam.last - visit merge_requests_team_path(team) - end + When 'I visit team merge requests page' do + team = UserTeam.last + visit merge_requests_team_path(team) + end - Then 'I should see merge requests from this team assigned to me' do - team = UserTeam.last - team.projects.each do |project| - team.members.each do |member| - project.issues.assigned(member).each do |merge_request| - page.should have_content merge_request.title - end + Then 'I should see merge requests from this team assigned to me' do + team = UserTeam.last + team.projects.each do |project| + team.members.each do |member| + project.issues.assigned(member).each do |merge_request| + page.should have_content merge_request.title end end end + end - Given 'project from team has merge requests assigned to team members' do - team = UserTeam.last - team.projects.each do |project| - team.members.each do |member| - 3.times { project.merge_requests << create(:merge_request, assignee: member) } - end + Given 'project from team has merge requests assigned to team members' do + team = UserTeam.last + team.projects.each do |project| + team.members.each do |member| + 3.times { project.merge_requests << create(:merge_request, assignee: member) } end end + end - Then 'I should see merge requests from this team assigned to me' do - team = UserTeam.last - team.projects.each do |project| - team.members.each do |member| - project.issues.assigned(member).each do |merge_request| - page.should have_content merge_request.title - end + Then 'I should see merge requests from this team assigned to me' do + team = UserTeam.last + team.projects.each do |project| + team.members.each do |member| + project.issues.assigned(member).each do |merge_request| + page.should have_content merge_request.title end end end + end - Given 'I have new user "John"' do - create :user, name: "John" - end + Given 'I have new user "John"' do + create :user, name: "John" + end - When 'I visit team people page' do - team = UserTeam.last - visit team_members_path(team) - end + When 'I visit team people page' do + team = UserTeam.last + visit team_members_path(team) + end - And 'I select user "John" from list with role "Reporter"' do - user = User.find_by_name("John") - within "#team_members" do - select "#{user.name} (#{user.username})", from: "user_ids" - select "Reporter", from: "default_project_access" - end - click_button "Add" + And 'I select user "John" from list with role "Reporter"' do + user = User.find_by_name("John") + select2(user.id, from: "#user_ids", multiple: true) + within "#team_members" do + select "Reporter", from: "default_project_access" end + click_button "Add" + end - Then 'I should see user "John" in team list' do - user = User.find_by_name("John") - team_members_list = find(".team-table") - team_members_list.should have_content user.name - end + Then 'I should see user "John" in team list' do + user = User.find_by_name("John") + team_members_list = find(".team-table") + team_members_list.should have_content user.name + end - And 'I have my own project without teams' do - @project = create :project, namespace: current_user.namespace - end + And 'I have my own project without teams' do + @project = create :project, namespace: current_user.namespace + end - And 'I visit my team page' do - team = UserTeam.where(owner_id: current_user.id).last - visit team_path(team) - end + And 'I visit my team page' do + team = UserTeam.where(owner_id: current_user.id).last + visit team_path(team) + end - When 'I click on link "Projects"' do - click_link "Projects" - end + When 'I click on link "Projects"' do + click_link "Projects" + end - And 'I click link "Assign project to Team"' do - click_link "Assign project to Team" - end + And 'I click link "Assign project to Team"' do + click_link "Assign project to Team" + end - Then 'I should see form with my own project in avaliable projects list' do - projects_select = find("#project_ids") - projects_select.should have_content(@project.name) - end + Then 'I should see form with my own project in avaliable projects list' do + projects_select = find("#project_ids") + projects_select.should have_content(@project.name) + end - When 'I submit form with selected project and max access' do - within "#assign_projects" do - select @project.name_with_namespace, from: "project_ids" - select "Reporter", from: "greatest_project_access" - end - click_button "Add" + When 'I submit form with selected project and max access' do + within "#assign_projects" do + select @project.name_with_namespace, from: "project_ids" + select "Reporter", from: "greatest_project_access" end + click_button "Add" + end - Then 'I should see my own project in team projects list' do - projects = find(".projects-table") - projects.should have_content(@project.name) - end + Then 'I should see my own project in team projects list' do + projects = find(".projects-table") + projects.should have_content(@project.name) + end - When 'I click link "New Team Member"' do - click_link "New Team Member" - end + When 'I click link "New Team Member"' do + click_link "New Team Member" + end protected @@ -257,5 +258,4 @@ class Userteams < Spinach::FeatureSteps end entered end - end diff --git a/features/support/env.rb b/features/support/env.rb index 03521af..6f1e4df 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -14,7 +14,7 @@ require 'spinach/capybara' require 'sidekiq/testing/inline' -%w(stubbed_repository valid_commit).each do |f| +%w(stubbed_repository valid_commit select2_helper).each do |f| require Rails.root.join('spec', 'support', f) end diff --git a/features/teams/team.feature b/features/teams/team.feature index e15e3f0..5b7c15a 100644 --- a/features/teams/team.feature +++ b/features/teams/team.feature @@ -46,6 +46,7 @@ Feature: UserTeams When I visit team merge requests page Then I should see merge requests from this team assigned to me + @javascript Scenario: I should add user to projects in Team Given I have team with projects and members Given I have new user "John" diff --git a/spec/support/select2_helper.rb b/spec/support/select2_helper.rb new file mode 100644 index 0000000..20dd9bf --- /dev/null +++ b/spec/support/select2_helper.rb @@ -0,0 +1,25 @@ +# Select2 ajax programatic helper +# It allows you to select value from select2 +# +# Params +# value - real value of selected item +# opts - options containing css selector +# +# Usage: +# +# select2(2, from: '#user_ids') +# + +module Select2Helper + def select2(value, options={}) + raise "Must pass a hash containing 'from'" if not options.is_a?(Hash) or not options.has_key?(:from) + + selector = options[:from] + + if options[:multiple] + page.execute_script("$('#{selector}').select2('val', ['#{value}']);") + else + page.execute_script("$('#{selector}').select2('val', '#{value}');") + end + end +end -- libgit2 0.21.2