Commit b2118872 authored by Fatih Acet's avatar Fatih Acet

Merge branch...

Merge branch '21508-inconsistency-personal-dashboard-todos-page-uses-old-interface-wrong-dropdown-filter-buttons' into 'master'

Update todo view filter dropdowns

## What does this MR do?

Swaps out old `select2` dropdowns on todo page with newer dropdowns.

Also removes todo inline JS.

## Are there points in the code the reviewer needs to double check?

## Why was this MR needed?

## Screenshots (if relevant)

### Project

![2016-08-29_14.02.57](/uploads/73d610fd41d202540f3770afa7e5266f/2016-08-29_14.02.57.gif)

### Author

![2016-08-29_14.03.40](/uploads/8ce97b81c91db06111f6a930cd5fb293/2016-08-29_14.03.40.gif)

### Type

![2016-08-29_14.04.32](/uploads/1aa050a7822de1d99ee7fdc3bbc621a3/2016-08-29_14.04.32.gif)

### Action

![2016-08-29_14.05.23](/uploads/680d19c56723a222274c3677f941cfcd/2016-08-29_14.05.23.gif)

## Does this MR meet the acceptance criteria?

- [ ] [CHANGELOG](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CHANGELOG) entry added
- [ ] [Documentation created/updated](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/development/doc_styleguide.md)
- [ ] API support added
- Tests
  - [ ] Added for this feature/bug
  - [ ] All builds are passing
- [ ] Conform by the [style guides](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#style-guides)
- [ ] Branch has no merge conflicts with `master` (if you do - rebase it please)
- [ ] [Squashed related commits together](https://git-scm.com/book/en/Git-Tools-Rewriting-History#Squashing-Commits)

## What are the relevant issue numbers?

Closes #21508 

Related to #19866

See merge request !6072
parents 2c3586d2 28db37de
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
this.perPage = this.el.data('perPage'); this.perPage = this.el.data('perPage');
this.clearListeners(); this.clearListeners();
this.initBtnListeners(); this.initBtnListeners();
this.initFilters();
} }
Todos.prototype.clearListeners = function() { Todos.prototype.clearListeners = function() {
...@@ -27,6 +28,31 @@ ...@@ -27,6 +28,31 @@
return $('.todo').on('click', this.goToTodoUrl); return $('.todo').on('click', this.goToTodoUrl);
}; };
Todos.prototype.initFilters = function() {
new UsersSelect();
this.initFilterDropdown($('.js-project-search'), 'project_id', ['text']);
this.initFilterDropdown($('.js-type-search'), 'type');
this.initFilterDropdown($('.js-action-search'), 'action_id');
$('form.filter-form').on('submit', function (event) {
event.preventDefault();
Turbolinks.visit(this.action + '&' + $(this).serialize());
});
};
Todos.prototype.initFilterDropdown = function($dropdown, fieldName, searchFields) {
$dropdown.glDropdown({
selectable: true,
filterable: searchFields ? true : false,
fieldName: fieldName,
search: { fields: searchFields },
data: $dropdown.data('data'),
clicked: function() {
return $dropdown.closest('form.filter-form').submit();
}
})
};
Todos.prototype.doneClicked = function(e) { Todos.prototype.doneClicked = function(e) {
var $this; var $this;
e.preventDefault(); e.preventDefault();
......
...@@ -49,6 +49,19 @@ module IssuablesHelper ...@@ -49,6 +49,19 @@ module IssuablesHelper
end end
end end
def project_dropdown_label(project_id, default_label)
return default_label if project_id.nil?
return "Any project" if project_id == "0"
project = Project.find_by(id: project_id)
if project
project.name_with_namespace
else
default_label
end
end
def milestone_dropdown_label(milestone_title, default_label = "Milestone") def milestone_dropdown_label(milestone_title, default_label = "Milestone")
if milestone_title == Milestone::Upcoming.name if milestone_title == Milestone::Upcoming.name
milestone_title = Milestone::Upcoming.title milestone_title = Milestone::Upcoming.title
......
...@@ -78,13 +78,11 @@ module TodosHelper ...@@ -78,13 +78,11 @@ module TodosHelper
end end
def todo_actions_options def todo_actions_options
actions = [ [
OpenStruct.new(id: '', title: 'Any Action'), { id: '', text: 'Any Action' },
OpenStruct.new(id: Todo::ASSIGNED, title: 'Assigned'), { id: Todo::ASSIGNED, text: 'Assigned' },
OpenStruct.new(id: Todo::MENTIONED, title: 'Mentioned') { id: Todo::MENTIONED, text: 'Mentioned' }
] ]
options_from_collection_for_select(actions, 'id', 'title', params[:action_id])
end end
def todo_projects_options def todo_projects_options
...@@ -92,22 +90,28 @@ module TodosHelper ...@@ -92,22 +90,28 @@ module TodosHelper
projects = projects.includes(:namespace) projects = projects.includes(:namespace)
projects = projects.map do |project| projects = projects.map do |project|
OpenStruct.new(id: project.id, title: project.name_with_namespace) { id: project.id, text: project.name_with_namespace }
end end
projects.unshift(OpenStruct.new(id: '', title: 'Any Project')) projects.unshift({ id: '', text: 'Any Project' }).to_json
options_from_collection_for_select(projects, 'id', 'title', params[:project_id])
end end
def todo_types_options def todo_types_options
types = [ [
OpenStruct.new(title: 'Any Type', name: ''), { id: '', text: 'Any Type' },
OpenStruct.new(title: 'Issue', name: 'Issue'), { id: 'Issue', text: 'Issue' },
OpenStruct.new(title: 'Merge Request', name: 'MergeRequest') { id: 'MergeRequest', text: 'Merge Request' }
] ]
end
def todo_actions_dropdown_label(selected_action_id, default_action)
selected_action = todo_actions_options.find { |action| action[:id] == selected_action_id.to_i}
selected_action ? selected_action[:text] : default_action
end
options_from_collection_for_select(types, 'name', 'title', params[:type]) def todo_types_dropdown_label(selected_type, default_type)
selected_type = todo_types_options.find { |type| type[:id] == selected_type && type[:id] != '' }
selected_type ? selected_type[:text] : default_type
end end
private private
......
...@@ -28,21 +28,25 @@ ...@@ -28,21 +28,25 @@
.row-content-block.second-block .row-content-block.second-block
= form_tag todos_filter_path(without: [:project_id, :author_id, :type, :action_id]), method: :get, class: 'filter-form' do = form_tag todos_filter_path(without: [:project_id, :author_id, :type, :action_id]), method: :get, class: 'filter-form' do
.filter-item.inline .filter-item.inline
= select_tag('project_id', todo_projects_options, - if params[:project_id].present?
class: 'select2 trigger-submit', include_blank: true, = hidden_field_tag(:project_id, params[:project_id])
data: {placeholder: 'Project'}) = dropdown_tag(project_dropdown_label(params[:project_id], 'Project'), options: { toggle_class: 'js-project-search js-filter-submit', title: 'Filter by project', filter: true, filterInput: 'input#project-search', dropdown_class: 'dropdown-menu-selectable dropdown-menu-project js-filter-submit',
placeholder: 'Search projects', data: { data: todo_projects_options } })
.filter-item.inline .filter-item.inline
= users_select_tag(:author_id, selected: params[:author_id], - if params[:author_id].present?
placeholder: 'Author', class: 'trigger-submit', any_user: "Any Author", first_user: true, current_user: true) = hidden_field_tag(:author_id, params[:author_id])
= dropdown_tag(user_dropdown_label(params[:author_id], 'Author'), options: { toggle_class: 'js-user-search js-filter-submit js-author-search', title: 'Filter by author', filter: true, filterInput: 'input#author-search', dropdown_class: 'dropdown-menu-user dropdown-menu-selectable dropdown-menu-author js-filter-submit',
placeholder: 'Search authors', data: { any_user: 'Any Author', first_user: (current_user.username if current_user), current_user: true, project_id: (@project.id if @project), selected: params[:author_id], field_name: 'author_id', default_label: 'Author' } })
.filter-item.inline .filter-item.inline
= select_tag('type', todo_types_options, - if params[:type].present?
class: 'select2 trigger-submit', include_blank: true, = hidden_field_tag(:type, params[:type])
data: {placeholder: 'Type'}) = dropdown_tag(todo_types_dropdown_label(params[:type], 'Type'), options: { toggle_class: 'js-type-search js-filter-submit', dropdown_class: 'dropdown-menu-selectable dropdown-menu-type js-filter-submit',
data: { data: todo_types_options } })
.filter-item.inline.actions-filter .filter-item.inline.actions-filter
= select_tag('action_id', todo_actions_options, - if params[:action_id].present?
class: 'select2 trigger-submit', include_blank: true, = hidden_field_tag(:action_id, params[:action_id])
data: {placeholder: 'Action'}) = dropdown_tag(todo_actions_dropdown_label(params[:action_id], 'Action'), options: { toggle_class: 'js-action-search js-filter-submit', dropdown_class: 'dropdown-menu-selectable dropdown-menu-action js-filter-submit',
data: { data: todo_actions_options }})
.pull-right .pull-right
.dropdown.inline.prepend-left-10 .dropdown.inline.prepend-left-10
%button.dropdown-toggle.btn{type: 'button', 'data-toggle' => 'dropdown'} %button.dropdown-toggle.btn{type: 'button', 'data-toggle' => 'dropdown'}
...@@ -76,11 +80,3 @@ ...@@ -76,11 +80,3 @@
= paginate @todos, theme: "gitlab" = paginate @todos, theme: "gitlab"
- else - else
.nothing-here-block You're all done! .nothing-here-block You're all done!
:javascript
new UsersSelect();
$('form.filter-form').on('submit', function (event) {
event.preventDefault();
Turbolinks.visit(this.action + '&' + $(this).serialize());
});
...@@ -22,26 +22,6 @@ Feature: Dashboard Todos ...@@ -22,26 +22,6 @@ Feature: Dashboard Todos
And I mark all todos as done And I mark all todos as done
Then I should see all todos marked as done Then I should see all todos marked as done
@javascript
Scenario: I filter by project
Given I filter by "Enterprise"
Then I should not see todos
@javascript
Scenario: I filter by author
Given I filter by "John Doe"
Then I should not see todos related to "Mary Jane" in the list
@javascript
Scenario: I filter by type
Given I filter by "Issue"
Then I should not see todos related to "Merge Requests" in the list
@javascript
Scenario: I filter by action
Given I filter by "Mentioned"
Then I should not see todos related to "Assignments" in the list
@javascript @javascript
Scenario: I click on a todo row Scenario: I click on a todo row
Given I click on the todo Given I click on the todo
......
...@@ -3,7 +3,6 @@ class Spinach::Features::DashboardTodos < Spinach::FeatureSteps ...@@ -3,7 +3,6 @@ class Spinach::Features::DashboardTodos < Spinach::FeatureSteps
include SharedPaths include SharedPaths
include SharedProject include SharedProject
include SharedUser include SharedUser
include Select2Helper
step '"John Doe" is a developer of project "Shop"' do step '"John Doe" is a developer of project "Shop"' do
project.team << [john_doe, :developer] project.team << [john_doe, :developer]
...@@ -55,7 +54,7 @@ class Spinach::Features::DashboardTodos < Spinach::FeatureSteps ...@@ -55,7 +54,7 @@ class Spinach::Features::DashboardTodos < Spinach::FeatureSteps
expect(page).to have_content 'To do 0' expect(page).to have_content 'To do 0'
expect(page).to have_content 'Done 4' expect(page).to have_content 'Done 4'
expect(page).to have_content "You're all done!" expect(page).to have_content "You're all done!"
expect(page).not_to have_link project.name_with_namespace expect('.prepend-top-default').not_to have_link project.name_with_namespace
should_not_see_todo "John Doe assigned you merge request #{merge_request.to_reference}" should_not_see_todo "John Doe assigned you merge request #{merge_request.to_reference}"
should_not_see_todo "John Doe mentioned you on issue #{issue.to_reference}" should_not_see_todo "John Doe mentioned you on issue #{issue.to_reference}"
should_not_see_todo "John Doe assigned you issue #{issue.to_reference}" should_not_see_todo "John Doe assigned you issue #{issue.to_reference}"
...@@ -80,19 +79,31 @@ class Spinach::Features::DashboardTodos < Spinach::FeatureSteps ...@@ -80,19 +79,31 @@ class Spinach::Features::DashboardTodos < Spinach::FeatureSteps
end end
step 'I filter by "Enterprise"' do step 'I filter by "Enterprise"' do
select2(enterprise.id, from: "#project_id") click_button 'Project'
page.within '.dropdown-menu-project' do
click_link enterprise.name_with_namespace
end
end end
step 'I filter by "John Doe"' do step 'I filter by "John Doe"' do
select2(john_doe.id, from: "#author_id") click_button 'Author'
page.within '.dropdown-menu-author' do
click_link john_doe.username
end
end end
step 'I filter by "Issue"' do step 'I filter by "Issue"' do
select2('Issue', from: "#type") click_button 'Type'
page.within '.dropdown-menu-type' do
click_link 'Issue'
end
end end
step 'I filter by "Mentioned"' do step 'I filter by "Mentioned"' do
select2("#{Todo::MENTIONED}", from: '#action_id') click_button 'Action'
page.within '.dropdown-menu-action' do
click_link 'Mentioned'
end
end end
step 'I should not see todos' do step 'I should not see todos' do
......
require 'spec_helper'
describe 'Dashboard > User filters todos', feature: true, js: true do
include WaitForAjax
let(:user_1) { create(:user, username: 'user_1', name: 'user_1') }
let(:user_2) { create(:user, username: 'user_2', name: 'user_2') }
let(:project_1) { create(:empty_project, name: 'project_1') }
let(:project_2) { create(:empty_project, name: 'project_2') }
let(:issue) { create(:issue, title: 'issue', project: project_1) }
let!(:merge_request) { create(:merge_request, source_project: project_2, title: 'merge_request') }
before do
create(:todo, user: user_1, author: user_2, project: project_1, target: issue, action: 1)
create(:todo, user: user_1, author: user_1, project: project_2, target: merge_request, action: 2)
project_1.team << [user_1, :developer]
project_2.team << [user_1, :developer]
login_as(user_1)
visit dashboard_todos_path
end
it 'filters by project' do
click_button 'Project'
within '.dropdown-menu-project' do
fill_in 'Search projects', with: project_1.name_with_namespace
click_link project_1.name_with_namespace
end
wait_for_ajax
expect('.prepend-top-default').not_to have_content project_2.name_with_namespace
end
it 'filters by author' do
click_button 'Author'
within '.dropdown-menu-author' do
fill_in 'Search authors', with: user_1.name
click_link user_1.name
end
wait_for_ajax
expect('.prepend-top-default').not_to have_content user_2.name
end
it 'filters by type' do
click_button 'Type'
within '.dropdown-menu-type' do
click_link 'Issue'
end
wait_for_ajax
expect('.prepend-top-default').not_to have_content ' merge request !'
end
it 'filters by action' do
click_button 'Action'
within '.dropdown-menu-action' do
click_link 'Assigned'
end
wait_for_ajax
expect('.prepend-top-default').not_to have_content ' mentioned '
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment