Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
3d252244
Commit
3d252244
authored
Oct 29, 2018
by
Heinrich Lee Yu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
EE port of 52385-search-bar-for-dashboard-list
parent
1ee35e6b
Changes
33
Show whitespace changes
Inline
Side-by-side
Showing
33 changed files
with
167 additions
and
258 deletions
+167
-258
app/assets/javascripts/init_legacy_filters.js
app/assets/javascripts/init_legacy_filters.js
+0
-14
app/assets/javascripts/pages/dashboard/issues/index.js
app/assets/javascripts/pages/dashboard/issues/index.js
+8
-2
app/assets/javascripts/pages/dashboard/merge_requests/index.js
...ssets/javascripts/pages/dashboard/merge_requests/index.js
+10
-2
app/assets/javascripts/search_autocomplete.js
app/assets/javascripts/search_autocomplete.js
+4
-5
app/controllers/dashboard_controller.rb
app/controllers/dashboard_controller.rb
+5
-1
app/controllers/root_controller.rb
app/controllers/root_controller.rb
+2
-2
app/helpers/application_helper.rb
app/helpers/application_helper.rb
+4
-2
app/helpers/dashboard_helper.rb
app/helpers/dashboard_helper.rb
+2
-2
app/helpers/search_helper.rb
app/helpers/search_helper.rb
+13
-2
app/views/dashboard/issues.html.haml
app/views/dashboard/issues.html.haml
+2
-2
app/views/dashboard/merge_requests.html.haml
app/views/dashboard/merge_requests.html.haml
+2
-2
app/views/shared/issuable/_filter.html.haml
app/views/shared/issuable/_filter.html.haml
+0
-32
app/views/shared/issuable/_search_bar.html.haml
app/views/shared/issuable/_search_bar.html.haml
+2
-3
changelogs/unreleased/52385-search-bar-for-dashboard-list.yml
...gelogs/unreleased/52385-search-bar-for-dashboard-list.yml
+5
-0
doc/user/search/img/dashboard_links.png
doc/user/search/img/dashboard_links.png
+0
-0
doc/user/search/img/issues_assigned_to_you.png
doc/user/search/img/issues_assigned_to_you.png
+0
-0
doc/user/search/img/left_menu_bar.png
doc/user/search/img/left_menu_bar.png
+0
-0
doc/user/search/index.md
doc/user/search/index.md
+8
-8
ee/app/helpers/ee/search_helper.rb
ee/app/helpers/ee/search_helper.rb
+3
-3
spec/controllers/root_controller_spec.rb
spec/controllers/root_controller_spec.rb
+2
-2
spec/features/atom/dashboard_issues_spec.rb
spec/features/atom/dashboard_issues_spec.rb
+6
-6
spec/features/dashboard/issuables_counter_spec.rb
spec/features/dashboard/issuables_counter_spec.rb
+2
-2
spec/features/dashboard/issues_filter_spec.rb
spec/features/dashboard/issues_filter_spec.rb
+9
-22
spec/features/dashboard/issues_spec.rb
spec/features/dashboard/issues_spec.rb
+6
-21
spec/features/dashboard/label_filter_spec.rb
spec/features/dashboard/label_filter_spec.rb
+9
-6
spec/features/dashboard/merge_requests_spec.rb
spec/features/dashboard/merge_requests_spec.rb
+7
-8
spec/features/dashboard/milestone_filter_spec.rb
spec/features/dashboard/milestone_filter_spec.rb
+0
-77
spec/features/issues/user_sorts_issues_spec.rb
spec/features/issues/user_sorts_issues_spec.rb
+1
-1
spec/features/merge_requests/user_sorts_merge_requests_spec.rb
...features/merge_requests/user_sorts_merge_requests_spec.rb
+2
-2
spec/features/search/user_uses_header_search_field_spec.rb
spec/features/search/user_uses_header_search_field_spec.rb
+12
-4
spec/helpers/search_helper_spec.rb
spec/helpers/search_helper_spec.rb
+35
-0
spec/javascripts/search_autocomplete_spec.js
spec/javascripts/search_autocomplete_spec.js
+6
-6
spec/support/helpers/filter_item_select_helper.rb
spec/support/helpers/filter_item_select_helper.rb
+0
-19
No files found.
app/assets/javascripts/init_legacy_filters.js
deleted
100644 → 0
View file @
1ee35e6b
/* eslint-disable no-new */
import
LabelsSelect
from
'
./labels_select
'
;
import
subscriptionSelect
from
'
./subscription_select
'
;
import
UsersSelect
from
'
./users_select
'
;
import
issueStatusSelect
from
'
./issue_status_select
'
;
import
MilestoneSelect
from
'
./milestone_select
'
;
export
default
()
=>
{
new
UsersSelect
();
new
LabelsSelect
();
new
MilestoneSelect
();
issueStatusSelect
();
subscriptionSelect
();
};
app/assets/javascripts/pages/dashboard/issues/index.js
View file @
3d252244
import
projectSelect
from
'
~/project_select
'
;
import
initLegacyFilters
from
'
~/init_legacy_filters
'
;
import
initFilteredSearch
from
'
~/pages/search/init_filtered_search
'
;
import
IssuableFilteredSearchTokenKeys
from
'
~/filtered_search/issuable_filtered_search_token_keys
'
;
import
{
FILTERED_SEARCH
}
from
'
~/pages/constants
'
;
document
.
addEventListener
(
'
DOMContentLoaded
'
,
()
=>
{
initFilteredSearch
({
page
:
FILTERED_SEARCH
.
ISSUES
,
filteredSearchTokenKeys
:
IssuableFilteredSearchTokenKeys
,
});
projectSelect
();
initLegacyFilters
();
});
app/assets/javascripts/pages/dashboard/merge_requests/index.js
View file @
3d252244
import
projectSelect
from
'
~/project_select
'
;
import
initLegacyFilters
from
'
~/init_legacy_filters
'
;
import
initFilteredSearch
from
'
~/pages/search/init_filtered_search
'
;
import
IssuableFilteredSearchTokenKeys
from
'
~/filtered_search/issuable_filtered_search_token_keys
'
;
import
{
FILTERED_SEARCH
}
from
'
~/pages/constants
'
;
document
.
addEventListener
(
'
DOMContentLoaded
'
,
()
=>
{
IssuableFilteredSearchTokenKeys
.
addExtraTokensForMergeRequests
();
initFilteredSearch
({
page
:
FILTERED_SEARCH
.
MERGE_REQUESTS
,
filteredSearchTokenKeys
:
IssuableFilteredSearchTokenKeys
,
});
projectSelect
();
initLegacyFilters
();
});
app/assets/javascripts/search_autocomplete.js
View file @
3d252244
...
...
@@ -253,7 +253,6 @@ export class SearchAutocomplete {
}
getCategoryContents
()
{
const
userId
=
gon
.
current_user_id
;
const
userName
=
gon
.
current_username
;
const
{
projectOptions
,
groupOptions
,
dashboardOptions
}
=
gl
;
...
...
@@ -279,21 +278,21 @@ export class SearchAutocomplete {
const
issueItems
=
[
{
text
:
s__
(
'
SearchAutocomplete|Issues assigned to me
'
),
url
:
`
${
issuesPath
}
/?assignee_
id=
${
userId
}
`
,
url
:
`
${
issuesPath
}
/?assignee_
username=
${
userName
}
`
,
},
{
text
:
s__
(
"
SearchAutocomplete|Issues I've created
"
),
url
:
`
${
issuesPath
}
/?author_
id=
${
userId
}
`
,
url
:
`
${
issuesPath
}
/?author_
username=
${
userName
}
`
,
},
];
const
mergeRequestItems
=
[
{
text
:
s__
(
'
SearchAutocomplete|Merge requests assigned to me
'
),
url
:
`
${
mrPath
}
/?assignee_
id=
${
userId
}
`
,
url
:
`
${
mrPath
}
/?assignee_
username=
${
userName
}
`
,
},
{
text
:
s__
(
"
SearchAutocomplete|Merge requests I've created
"
),
url
:
`
${
mrPath
}
/?author_
id=
${
userId
}
`
,
url
:
`
${
mrPath
}
/?author_
username=
${
userName
}
`
,
},
];
...
...
app/controllers/dashboard_controller.rb
View file @
3d252244
...
...
@@ -5,11 +5,15 @@ class DashboardController < Dashboard::ApplicationController
include
MergeRequestsAction
FILTER_PARAMS
=
[
# author_id and assignee_id are kept so old RSS links still work
:author_id
,
:assignee_id
,
:author_username
,
:assignee_username
,
:milestone_title
,
:weight
,
:label_name
:label_name
,
:my_reaction_emoji
].
freeze
before_action
:event_filter
,
only: :activity
...
...
app/controllers/root_controller.rb
View file @
3d252244
...
...
@@ -45,9 +45,9 @@ class RootController < Dashboard::ProjectsController
when
'todos'
redirect_to
(
dashboard_todos_path
)
when
'issues'
redirect_to
(
issues_dashboard_path
(
assignee_
id:
current_user
.
id
))
redirect_to
(
issues_dashboard_path
(
assignee_
username:
current_user
.
username
))
when
'merge_requests'
redirect_to
(
merge_requests_dashboard_path
(
assignee_
id:
current_user
.
id
))
redirect_to
(
merge_requests_dashboard_path
(
assignee_
username:
current_user
.
username
))
end
end
...
...
app/helpers/application_helper.rb
View file @
3d252244
...
...
@@ -182,10 +182,12 @@ module ApplicationHelper
state:
params
[
:state
],
scope:
params
[
:scope
],
milestone_title:
params
[
:milestone_title
],
assignee_
id:
params
[
:assignee_id
],
author_
id:
params
[
:author_id
],
assignee_
username:
params
[
:assignee_username
],
author_
username:
params
[
:author_username
],
search:
params
[
:search
],
label_name:
params
[
:label_name
],
my_reaction_emoji:
params
[
:my_reaction_emoji
],
wip:
params
[
:wip
],
weight:
params
[
:weight
]
}
...
...
app/helpers/dashboard_helper.rb
View file @
3d252244
...
...
@@ -4,11 +4,11 @@ module DashboardHelper
prepend
EE
::
DashboardHelper
def
assigned_issues_dashboard_path
issues_dashboard_path
(
assignee_
id:
current_user
.
id
)
issues_dashboard_path
(
assignee_
username:
current_user
.
username
)
end
def
assigned_mrs_dashboard_path
merge_requests_dashboard_path
(
assignee_
id:
current_user
.
id
)
merge_requests_dashboard_path
(
assignee_
username:
current_user
.
username
)
end
def
dashboard_nav_links
...
...
app/helpers/search_helper.rb
View file @
3d252244
...
...
@@ -165,15 +165,26 @@ module SearchHelper
if
@project
.
present?
opts
[
:data
][
'project-id'
]
=
@project
.
id
opts
[
:data
][
'base-endpoint'
]
=
project_path
(
@project
)
else
# Group context
elsif
@group
.
present?
opts
[
:data
][
'group-id'
]
=
@group
.
id
opts
[
:data
][
'base-endpoint'
]
=
group_canonical_path
(
@group
)
else
opts
[
:data
][
'base-endpoint'
]
=
root_dashboard_path
end
opts
end
def
search_history_storage_prefix
if
@project
.
present?
@project
.
full_path
elsif
@group
.
present?
@group
.
full_path
else
'dashboard'
end
end
# Sanitize a HTML field for search display. Most tags are stripped out and the
# maximum length is set to 200 characters.
def
search_md_sanitize
(
object
,
field
)
...
...
app/views/dashboard/issues.html.haml
View file @
3d252244
-
@hide_top_links
=
true
-
page_title
_
(
"Issues"
)
-
@breadcrumb_link
=
issues_dashboard_path
(
assignee_
id:
current_user
.
id
)
-
@breadcrumb_link
=
issues_dashboard_path
(
assignee_
username:
current_user
.
username
)
=
content_for
:meta_tags
do
=
auto_discovery_link_tag
(
:atom
,
safe_params
.
merge
(
rss_url_options
).
to_h
,
title:
"
#{
current_user
.
name
}
issues"
)
...
...
@@ -18,7 +18,7 @@
.nav-controls
=
render
'shared/issuable/feed_buttons'
=
render
'shared/issuable/
filte
r'
,
type: :issues
=
render
'shared/issuable/
search_ba
r'
,
type: :issues
-
if
current_user
&&
@no_filters_set
=
render
'shared/dashboard/no_filter_selected'
...
...
app/views/dashboard/merge_requests.html.haml
View file @
3d252244
-
@hide_top_links
=
true
-
page_title
_
(
"Merge Requests"
)
-
@breadcrumb_link
=
merge_requests_dashboard_path
(
assignee_
id:
current_user
.
id
)
-
@breadcrumb_link
=
merge_requests_dashboard_path
(
assignee_
username:
current_user
.
username
)
=
render_if_exists
"shared/gold_trial_callout"
...
...
@@ -14,7 +14,7 @@
.top-area
=
render
'shared/issuable/nav'
,
type: :merge_requests
,
display_count:
!
@no_filters_set
=
render
'shared/issuable/
filte
r'
,
type: :merge_requests
=
render
'shared/issuable/
search_ba
r'
,
type: :merge_requests
-
if
current_user
&&
@no_filters_set
=
render
'shared/dashboard/no_filter_selected'
...
...
app/views/shared/issuable/_filter.html.haml
deleted
100644 → 0
View file @
1ee35e6b
.issues-filters
.issues-details-filters.row-content-block.second-block
=
form_tag
page_filter_path
(
without:
[
:assignee_id
,
:author_id
,
:milestone_title
,
:label_name
,
:search
]),
method: :get
,
class:
'filter-form js-filter-form'
do
-
if
params
[
:search
].
present?
=
hidden_field_tag
:search
,
params
[
:search
]
.issues-other-filters
.filter-item.inline
-
if
params
[
:author_id
].
present?
=
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
,
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
,
current_user:
true
,
project_id:
@project
&
.
id
,
group_id:
@group
&
.
id
,
selected:
params
[
:author_id
],
field_name:
"author_id"
,
default_label:
"Author"
}
})
.filter-item.inline
-
if
params
[
:assignee_id
].
present?
=
hidden_field_tag
(
:assignee_id
,
params
[
:assignee_id
])
=
dropdown_tag
(
user_dropdown_label
(
params
[
:assignee_id
],
"Assignee"
),
options:
{
toggle_class:
"js-user-search js-filter-submit js-assignee-search"
,
title:
"Filter by assignee"
,
filter:
true
,
dropdown_class:
"dropdown-menu-user dropdown-menu-selectable dropdown-menu-assignee js-filter-submit"
,
placeholder:
"Search assignee"
,
data:
{
any_user:
"Any Assignee"
,
first_user:
current_user
&
.
username
,
null_user:
true
,
current_user:
true
,
project_id:
@project
&
.
id
,
group_id:
@group
&
.
id
,
selected:
params
[
:assignee_id
],
field_name:
"assignee_id"
,
default_label:
"Assignee"
}
})
.filter-item.inline.milestone-filter
=
render
"shared/issuable/milestone_dropdown"
,
selected:
finder
.
milestones
.
try
(
:first
),
name: :milestone_title
,
show_any:
true
,
show_upcoming:
true
,
show_started:
true
.filter-item.inline.labels-filter
=
render
"shared/issuable/label_dropdown"
,
selected:
selected_labels
,
use_id:
false
,
selected_toggle:
params
[
:label_name
],
data_options:
{
field_name:
"label_name[]"
}
-
unless
@no_filters_set
.float-right
=
render
'shared/sort_dropdown'
-
has_labels
=
@labels
&&
@labels
.
any?
.row-content-block.second-block.filtered-labels
{
class:
(
"hidden"
unless
has_labels
)
}
-
if
has_labels
=
render
'shared/labels_row'
,
labels:
@labels
app/views/shared/issuable/_search_bar.html.haml
View file @
3d252244
-
type
=
local_assigns
.
fetch
(
:type
)
-
board
=
local_assigns
.
fetch
(
:board
,
nil
)
-
block_css_class
=
type
!=
:boards_modal
?
'row-content-block second-block'
:
''
-
full_path
=
@project
.
present?
?
@project
.
full_path
:
@group
.
full_path
-
user_can_admin_list
=
board
&&
can?
(
current_user
,
:admin_list
,
board
.
parent
)
-
show_sorting_dropdown
=
local_assigns
.
fetch
(
:show_sorting_dropdown
,
true
)
...
...
@@ -10,7 +9,7 @@
-
if
type
==
:boards
#js-multiple-boards-switcher
.inline.boards-switcher
{
"v-cloak"
=>
true
}
=
render_if_exists
"shared/boards/switcher"
,
board:
board
=
form_tag
page_filter_path
(
without:
[
:assignee_id
,
:author_id
,
:milestone_title
,
:label_name
,
:search
])
,
method: :get
,
class:
'filter-form js-filter-form'
do
=
form_tag
page_filter_path
,
method: :get
,
class:
'filter-form js-filter-form'
do
-
if
params
[
:search
].
present?
=
hidden_field_tag
:search
,
params
[
:search
]
-
if
@can_bulk_update
...
...
@@ -25,7 +24,7 @@
dropdown_class:
"filtered-search-history-dropdown"
,
content_class:
"filtered-search-history-dropdown-content"
,
title:
"Recent searches"
})
do
.js-filtered-search-history-dropdown
{
data:
{
full_path:
full_path
}
}
.js-filtered-search-history-dropdown
{
data:
{
full_path:
search_history_storage_prefix
}
}
.filtered-search-box-input-container.droplab-dropdown
.scroll-container
%ul
.tokens-container.list-unstyled
...
...
changelogs/unreleased/52385-search-bar-for-dashboard-list.yml
0 → 100644
View file @
3d252244
---
title
:
Use search bar for filtering in dashboard issues / MRs
merge_request
:
22641
author
:
Heinrich Lee Yu
type
:
changed
doc/user/search/img/dashboard_links.png
0 → 100644
View file @
3d252244
26.5 KB
doc/user/search/img/issues_assigned_to_you.png
View replaced file @
1ee35e6b
View file @
3d252244
47.9 KB
|
W:
|
H:
49.3 KB
|
W:
|
H:
2-up
Swipe
Onion skin
doc/user/search/img/left_menu_bar.png
deleted
100644 → 0
View file @
1ee35e6b
36.6 KB
doc/user/search/index.md
View file @
3d252244
...
...
@@ -2,27 +2,27 @@
## Issues and merge requests
To search through issues and merge requests in multiple projects, you can use the left-sidebar.
To search through issues and merge requests in multiple projects, you can use the
**Issues**
or
**Merge Requests**
links
in the top-right part of your screen.
Click the menu bar, then
**Issues**
or
**Merge Requests**
, which work in the same way,
therefore, the following notes are valid for both.
Both of them work in the same way, therefore, the following notes are valid for both.
The number displayed on their right represents the number of issues and merge requests assigned to you.
![
menu bar - issues and MRs assigned to you
](
img/left_menu_bar
.png
)
![
issues and MRs dashboard links
](
img/dashboard_links
.png
)
When you click
**Issues**
, you'll see the opened issues assigned to you straight away:
![
Issues assigned to you
](
img/issues_assigned_to_you.png
)
You can filter them by
**Author**
,
**Assignee**
,
**Milestone**
, and
**Labels**
,
searching through
**Open**
,
**Closed**
, and
**All**
issues.
You can search through
**Open**
,
**Closed**
, or
**All**
issues.
Of course, you can combine all filters together.
You can also filter the results using the search and filter field. This works in the same way as the ones found in the
per project pages described below.
### Issues and MRs assigned to you or created by you
You'll
find a shortcut to issues and merge requests create
by you or assigned to you
You'll
also find shortcuts to issues and merge requests created
by you or assigned to you
on the search field on the top-right of your screen:
![
shortcut to your issues and mrs
](
img/issues_mrs_shortcut.png
)
...
...
ee/app/helpers/ee/search_helper.rb
View file @
3d252244
...
...
@@ -38,10 +38,10 @@ module EE
private
def
search_multiple_assignees?
(
type
)
context
=
@project
.
presence
||
@group
context
=
@project
.
presence
||
@group
.
presence
||
:dashboard
type
==
:issues
&&
context
.
feature_available?
(
:multiple_issue_assignees
)
type
==
:issues
&&
(
context
==
:dashboard
||
context
.
feature_available?
(
:multiple_issue_assignees
)
)
end
end
end
spec/controllers/root_controller_spec.rb
View file @
3d252244
...
...
@@ -98,7 +98,7 @@ describe RootController do
it
'redirects to their assigned issues'
do
get
:index
expect
(
response
).
to
redirect_to
issues_dashboard_path
(
assignee_
id:
user
.
id
)
expect
(
response
).
to
redirect_to
issues_dashboard_path
(
assignee_
username:
user
.
username
)
end
end
...
...
@@ -110,7 +110,7 @@ describe RootController do
it
'redirects to their assigned merge requests'
do
get
:index
expect
(
response
).
to
redirect_to
merge_requests_dashboard_path
(
assignee_
id:
user
.
id
)
expect
(
response
).
to
redirect_to
merge_requests_dashboard_path
(
assignee_
username:
user
.
username
)
end
end
...
...
spec/features/atom/dashboard_issues_spec.rb
View file @
3d252244
...
...
@@ -25,35 +25,35 @@ describe "Dashboard Issues Feed" do
it
"renders atom feed via personal access token"
do
personal_access_token
=
create
(
:personal_access_token
,
user:
user
)
visit
issues_dashboard_path
(
:atom
,
private_token:
personal_access_token
.
token
,
assignee_
id:
user
.
id
)
visit
issues_dashboard_path
(
:atom
,
private_token:
personal_access_token
.
token
,
assignee_
username:
user
.
username
)
expect
(
response_headers
[
'Content-Type'
]).
to
have_content
(
'application/atom+xml'
)
expect
(
body
).
to
have_selector
(
'title'
,
text:
"
#{
user
.
name
}
issues"
)
end
it
"renders atom feed via feed token"
do
visit
issues_dashboard_path
(
:atom
,
feed_token:
user
.
feed_token
,
assignee_
id:
user
.
id
)
visit
issues_dashboard_path
(
:atom
,
feed_token:
user
.
feed_token
,
assignee_
username:
user
.
username
)
expect
(
response_headers
[
'Content-Type'
]).
to
have_content
(
'application/atom+xml'
)
expect
(
body
).
to
have_selector
(
'title'
,
text:
"
#{
user
.
name
}
issues"
)
end
it
"renders atom feed with url parameters"
do
visit
issues_dashboard_path
(
:atom
,
feed_token:
user
.
feed_token
,
state:
'opened'
,
assignee_
id:
user
.
id
)
visit
issues_dashboard_path
(
:atom
,
feed_token:
user
.
feed_token
,
state:
'opened'
,
assignee_
username:
user
.
username
)
link
=
find
(
'link[type="application/atom+xml"]'
)
params
=
CGI
.
parse
(
URI
.
parse
(
link
[
:href
]).
query
)
expect
(
params
).
to
include
(
'feed_token'
=>
[
user
.
feed_token
])
expect
(
params
).
to
include
(
'state'
=>
[
'opened'
])
expect
(
params
).
to
include
(
'assignee_
id'
=>
[
user
.
id
.
to_s
])
expect
(
params
).
to
include
(
'assignee_
username'
=>
[
user
.
username
.
to_s
])
end
context
"issue with basic fields"
do
let!
(
:issue2
)
{
create
(
:issue
,
author:
user
,
assignees:
[
assignee
],
project:
project2
,
description:
'test desc'
)
}
it
"renders issue fields"
do
visit
issues_dashboard_path
(
:atom
,
feed_token:
user
.
feed_token
,
assignee_
id:
assignee
.
id
)
visit
issues_dashboard_path
(
:atom
,
feed_token:
user
.
feed_token
,
assignee_
username:
assignee
.
username
)
entry
=
find
(
:xpath
,
"//feed/entry[contains(summary/text(),'
#{
issue2
.
title
}
')]"
)
...
...
@@ -76,7 +76,7 @@ describe "Dashboard Issues Feed" do
end
it
"renders issue label and milestone info"
do
visit
issues_dashboard_path
(
:atom
,
feed_token:
user
.
feed_token
,
assignee_
id:
assignee
.
id
)
visit
issues_dashboard_path
(
:atom
,
feed_token:
user
.
feed_token
,
assignee_
username:
assignee
.
username
)
entry
=
find
(
:xpath
,
"//feed/entry[contains(summary/text(),'
#{
issue1
.
title
}
')]"
)
...
...
spec/features/dashboard/issuables_counter_spec.rb
View file @
3d252244
...
...
@@ -45,11 +45,11 @@ describe 'Navigation bar counter', :use_clean_rails_memory_store_caching do
end
def
issues_path
issues_dashboard_path
(
assignee_
id:
user
.
id
)
issues_dashboard_path
(
assignee_
username:
user
.
username
)
end
def
merge_requests_path
merge_requests_dashboard_path
(
assignee_
id:
user
.
id
)
merge_requests_dashboard_path
(
assignee_
username:
user
.
username
)
end
def
expect_counters
(
issuable_type
,
count
)
...
...
spec/features/dashboard/issues_filter_spec.rb
View file @
3d252244
...
...
@@ -2,6 +2,7 @@ require 'spec_helper'
describe
'Dashboard Issues filtering'
,
:js
do
include
Spec
::
Support
::
Helpers
::
Features
::
SortingHelpers
include
FilteredSearchHelpers
let
(
:user
)
{
create
(
:user
)
}
let
(
:project
)
{
create
(
:project
)
}
...
...
@@ -25,27 +26,21 @@ describe 'Dashboard Issues filtering', :js do
context
'filtering by milestone'
do
it
'shows all issues with no milestone'
do
show_milestone_dropdown
click_link
'No Milestone'
input_filtered_search
(
"milestone:none"
)
expect
(
page
).
to
have_issuable_counts
(
open:
1
,
closed:
0
,
all:
1
)
expect
(
page
).
to
have_selector
(
'.issue'
,
count:
1
)
end
it
'shows all issues with the selected milestone'
do
show_milestone_dropdown
page
.
within
'.dropdown-content'
do
click_link
milestone
.
title
end
input_filtered_search
(
"milestone:%
\"
#{
milestone
.
title
}
\"
"
)
expect
(
page
).
to
have_issuable_counts
(
open:
1
,
closed:
0
,
all:
1
)
expect
(
page
).
to
have_selector
(
'.issue'
,
count:
1
)
end
it
'updates atom feed link'
do
visit_issues
(
milestone_title:
''
,
assignee_
id:
user
.
id
)
visit_issues
(
milestone_title:
''
,
assignee_
username:
user
.
username
)
link
=
find
(
'.nav-controls a[title="Subscribe to RSS feed"]'
)
params
=
CGI
.
parse
(
URI
.
parse
(
link
[
:href
]).
query
)
...
...
@@ -54,10 +49,10 @@ describe 'Dashboard Issues filtering', :js do
expect
(
params
).
to
include
(
'feed_token'
=>
[
user
.
feed_token
])
expect
(
params
).
to
include
(
'milestone_title'
=>
[
''
])
expect
(
params
).
to
include
(
'assignee_
id'
=>
[
user
.
id
.
to_s
])
expect
(
params
).
to
include
(
'assignee_
username'
=>
[
user
.
username
.
to_s
])
expect
(
auto_discovery_params
).
to
include
(
'feed_token'
=>
[
user
.
feed_token
])
expect
(
auto_discovery_params
).
to
include
(
'milestone_title'
=>
[
''
])
expect
(
auto_discovery_params
).
to
include
(
'assignee_
id'
=>
[
user
.
id
.
to_s
])
expect
(
auto_discovery_params
).
to
include
(
'assignee_
username'
=>
[
user
.
username
.
to_s
])
end
end
...
...
@@ -66,10 +61,7 @@ describe 'Dashboard Issues filtering', :js do
let!
(
:label_link
)
{
create
(
:label_link
,
label:
label
,
target:
issue
)
}
it
'shows all issues with the selected label'
do
page
.
within
'.labels-filter'
do
find
(
'.dropdown'
).
click
click_link
label
.
title
end
input_filtered_search
(
"label:~
#{
label
.
title
}
"
)
page
.
within
'ul.content-list'
do
expect
(
page
).
to
have_content
issue
.
title
...
...
@@ -80,12 +72,12 @@ describe 'Dashboard Issues filtering', :js do
context
'sorting'
do
before
do
visit_issues
(
assignee_
id:
user
.
id
)
visit_issues
(
assignee_
username:
user
.
username
)
end
it
'remembers last sorting value'
do
sort_by
(
'Created date'
)
visit_issues
(
assignee_
id:
user
.
id
)
visit_issues
(
assignee_
username:
user
.
username
)
expect
(
find
(
'.issues-filters'
)).
to
have_content
(
'Created date'
)
end
...
...
@@ -98,11 +90,6 @@ describe 'Dashboard Issues filtering', :js do
end
end
def
show_milestone_dropdown
click_button
'Milestone'
expect
(
page
).
to
have_selector
(
'.dropdown-content'
,
visible:
true
)
end
def
visit_issues
(
*
args
)
visit
issues_dashboard_path
(
*
args
)
end
...
...
spec/features/dashboard/issues_spec.rb
View file @
3d252244
require
'spec_helper'
RSpec
.
describe
'Dashboard Issues'
do
include
FilteredSearchHelpers
let
(
:current_user
)
{
create
:user
}
let
(
:user
)
{
current_user
}
# Shared examples depend on this being available
let!
(
:public_project
)
{
create
(
:project
,
:public
)
}
...
...
@@ -14,7 +16,7 @@ RSpec.describe 'Dashboard Issues' do
before
do
[
project
,
project_with_issues_disabled
].
each
{
|
project
|
project
.
add_maintainer
(
current_user
)
}
sign_in
(
current_user
)
visit
issues_dashboard_path
(
assignee_
id:
current_user
.
id
)
visit
issues_dashboard_path
(
assignee_
username:
current_user
.
username
)
end
describe
'issues'
do
...
...
@@ -24,26 +26,9 @@ RSpec.describe 'Dashboard Issues' do
expect
(
page
).
not_to
have_content
(
other_issue
.
title
)
end
it
'shows checkmark when unassigned is selected for assignee'
,
:js
do
find
(
'.js-assignee-search'
).
click
find
(
'li'
,
text:
'Unassigned'
).
click
find
(
'.js-assignee-search'
).
click
expect
(
find
(
'li[data-user-id="0"] a.is-active'
)).
to
be_visible
end
it
'shows issues when current user is author'
,
:js
do
execute_script
(
"document.querySelector('#assignee_id').value=''"
)
find
(
'.js-author-search'
,
match: :first
).
click
expect
(
find
(
'li[data-user-id="null"] a.is-active'
)).
to
be_visible
find
(
'.dropdown-menu-author li a'
,
match: :first
,
text:
current_user
.
to_reference
).
click
find
(
'.js-author-search'
,
match: :first
).
click
page
.
within
'.dropdown-menu-user'
do
expect
(
find
(
'.dropdown-menu-author li a.is-active'
,
match: :first
,
text:
current_user
.
to_reference
)).
to
be_visible
end
reset_filters
input_filtered_search
(
"author:
#{
current_user
.
to_reference
}
"
)
expect
(
page
).
to
have_content
(
authored_issue
.
title
)
expect
(
page
).
to
have_content
(
authored_issue_on_public_project
.
title
)
...
...
@@ -53,7 +38,7 @@ RSpec.describe 'Dashboard Issues' do
it
'state filter tabs work'
do
find
(
'#state-closed'
).
click
expect
(
page
).
to
have_current_path
(
issues_dashboard_url
(
assignee_
id:
current_user
.
id
,
state:
'closed'
),
url:
true
)
expect
(
page
).
to
have_current_path
(
issues_dashboard_url
(
assignee_
username:
current_user
.
username
,
state:
'closed'
),
url:
true
)
end
it_behaves_like
"it has an RSS button with current_user's feed token"
...
...
spec/features/dashboard/label_filter_spec.rb
View file @
3d252244
require
'spec_helper'
describe
'Dashboard > label filter'
,
:js
do
include
FilteredSearchHelpers
let
(
:filtered_search
)
{
find
(
'.filtered-search'
)
}
let
(
:filter_dropdown
)
{
find
(
"#js-dropdown-label .filter-dropdown"
)
}
let
(
:user
)
{
create
(
:user
)
}
let
(
:project
)
{
create
(
:project
,
name:
'test'
,
namespace:
user
.
namespace
)
}
let
(
:project2
)
{
create
(
:project
,
name:
'test2'
,
path:
'test2'
,
namespace:
user
.
namespace
)
}
...
...
@@ -13,17 +18,15 @@ describe 'Dashboard > label filter', :js do
sign_in
(
user
)
visit
issues_dashboard_path
init_label_search
end
context
'duplicate labels'
do
it
'removes duplicate labels'
do
page
.
within
(
'.labels-filter'
)
do
click_button
'Label'
end
filtered_search
.
send_keys
(
'bu'
)
page
.
within
(
'.dropdown-menu-labels'
)
do
expect
(
page
).
to
have_selector
(
'.dropdown-content a'
,
text:
'bug'
,
count:
1
)
end
expect
(
filter_dropdown
).
to
have_selector
(
'.filter-dropdown-item'
,
text:
'bug'
,
count:
1
)
end
end
end
spec/features/dashboard/merge_requests_spec.rb
View file @
3d252244
...
...
@@ -2,7 +2,7 @@ require 'spec_helper'
describe
'Dashboard Merge Requests'
do
include
Spec
::
Support
::
Helpers
::
Features
::
SortingHelpers
include
Filter
ItemSelectHelper
include
Filter
edSearchHelpers
include
ProjectForksHelper
let
(
:current_user
)
{
create
:user
}
...
...
@@ -37,7 +37,7 @@ describe 'Dashboard Merge Requests' do
context
'no merge requests exist'
do
it
'shows an empty state'
do
visit
merge_requests_dashboard_path
(
assignee_
id:
current_user
.
id
)
visit
merge_requests_dashboard_path
(
assignee_
username:
current_user
.
username
)
expect
(
page
).
to
have_selector
(
'.empty-state'
)
end
...
...
@@ -80,7 +80,7 @@ describe 'Dashboard Merge Requests' do
end
before
do
visit
merge_requests_dashboard_path
(
assignee_
id:
current_user
.
id
)
visit
merge_requests_dashboard_path
(
assignee_
username:
current_user
.
username
)
end
it
'shows assigned merge requests'
do
...
...
@@ -93,8 +93,8 @@ describe 'Dashboard Merge Requests' do
end
it
'shows authored merge requests'
,
:js
do
filter_item_select
(
'Any Assignee'
,
'.js-assignee-search'
)
filter_item_select
(
current_user
.
to_reference
,
'.js-author-search'
)
reset_filters
input_filtered_search
(
"author:
#{
current_user
.
to_reference
}
"
)
expect
(
page
).
to
have_content
(
authored_merge_request
.
title
)
expect
(
page
).
to
have_content
(
authored_merge_request_from_fork
.
title
)
...
...
@@ -105,8 +105,7 @@ describe 'Dashboard Merge Requests' do
end
it
'shows error message without filter'
,
:js
do
filter_item_select
(
'Any Assignee'
,
'.js-assignee-search'
)
filter_item_select
(
'Any Author'
,
'.js-author-search'
)
reset_filters
expect
(
page
).
to
have_content
(
'Please select at least one filter to see results'
)
end
...
...
@@ -114,7 +113,7 @@ describe 'Dashboard Merge Requests' do
it
'shows sorted merge requests'
do
sort_by
(
'Created date'
)
visit
merge_requests_dashboard_path
(
assignee_
id:
current_user
.
id
)
visit
merge_requests_dashboard_path
(
assignee_
username:
current_user
.
username
)
expect
(
find
(
'.issues-filters'
)).
to
have_content
(
'Created date'
)
end
...
...
spec/features/dashboard/milestone_filter_spec.rb
deleted
100644 → 0
View file @
1ee35e6b
require
'spec_helper'
describe
'Dashboard > milestone filter'
,
:js
do
include
FilterItemSelectHelper
let
(
:user
)
{
create
(
:user
)
}
let
(
:project
)
{
create
(
:project
,
name:
'test'
,
namespace:
user
.
namespace
)
}
let
(
:milestone
)
{
create
(
:milestone
,
title:
'v1.0'
,
project:
project
)
}
let
(
:milestone2
)
{
create
(
:milestone
,
title:
'v2.0'
,
project:
project
)
}
let!
(
:issue
)
{
create
:issue
,
author:
user
,
project:
project
,
milestone:
milestone
}
let!
(
:issue2
)
{
create
:issue
,
author:
user
,
project:
project
,
milestone:
milestone2
}
dropdown_toggle_button
=
'.js-milestone-select'
before
do
sign_in
(
user
)
end
context
'default state'
do
it
'shows issues with Any Milestone'
do
visit
issues_dashboard_path
(
author_id:
user
.
id
)
page
.
all
(
'.issue-info'
).
each
do
|
issue_info
|
expect
(
issue_info
.
text
).
to
match
(
/v\d.0/
)
end
end
end
context
'filtering by milestone'
do
before
do
visit
issues_dashboard_path
(
author_id:
user
.
id
)
filter_item_select
(
'v1.0'
,
dropdown_toggle_button
)
find
(
dropdown_toggle_button
).
click
wait_for_requests
end
it
'shows issues with Milestone v1.0'
do
expect
(
find
(
'.issues-list'
)).
to
have_selector
(
'.issue'
,
count:
1
)
expect
(
find
(
'.milestone-filter .dropdown-content'
)).
to
have_selector
(
'a.is-active'
,
count:
1
)
end
it
'should not change active Milestone unless clicked'
do
page
.
within
'.milestone-filter'
do
expect
(
find
(
'.dropdown-content'
)).
to
have_selector
(
'a.is-active'
,
count:
1
)
find
(
'.dropdown-menu-close'
).
click
expect
(
page
).
not_to
have_selector
(
'.dropdown.open'
)
find
(
dropdown_toggle_button
).
click
expect
(
find
(
'.dropdown-content'
)).
to
have_selector
(
'a.is-active'
,
count:
1
)
expect
(
find
(
'.dropdown-content a.is-active'
)).
to
have_content
(
'v1.0'
)
end
end
end
context
'with milestone filter in URL'
do
before
do
visit
issues_dashboard_path
(
author_id:
user
.
id
,
milestone_title:
milestone
.
title
)
find
(
dropdown_toggle_button
).
click
wait_for_requests
end
it
'has milestone selected'
do
expect
(
find
(
'.milestone-filter .dropdown-content'
)).
to
have_css
(
'.is-active'
,
text:
milestone
.
title
)
end
it
'removes milestone filter from URL after clicking "Any Milestone"'
do
expect
(
current_url
).
to
include
(
"milestone_title=
#{
milestone
.
title
}
"
)
find
(
'.milestone-filter .dropdown-content li'
,
text:
'Any Milestone'
).
click
expect
(
current_url
).
not_to
include
(
'milestone_title'
)
end
end
end
spec/features/issues/user_sorts_issues_spec.rb
View file @
3d252244
...
...
@@ -26,7 +26,7 @@ describe "User sorts issues" do
click_link
(
'Milestone'
)
end
visit
(
issues_dashboard_path
(
assignee_
id:
user
.
id
))
visit
(
issues_dashboard_path
(
assignee_
username:
user
.
username
))
expect
(
find
(
'.issues-filters a.is-active'
)).
to
have_content
(
'Milestone'
)
...
...
spec/features/merge_requests/user_sorts_merge_requests_spec.rb
View file @
3d252244
...
...
@@ -25,7 +25,7 @@ describe 'User sorts merge requests' do
click_link
(
'Milestone'
)
end
visit
(
merge_requests_dashboard_path
(
assignee_
id:
user
.
id
))
visit
(
merge_requests_dashboard_path
(
assignee_
username:
user
.
username
))
expect
(
find
(
'.issues-filters a.is-active'
)).
to
have_content
(
'Milestone'
)
...
...
@@ -41,7 +41,7 @@ describe 'User sorts merge requests' do
it
'fallbacks to issuable_sort cookie key when remembering the sorting option'
do
set_cookie
(
'issuable_sort'
,
'milestone'
)
visit
(
merge_requests_dashboard_path
(
assignee_
id:
user
.
id
))
visit
(
merge_requests_dashboard_path
(
assignee_
username:
user
.
username
))
expect
(
find
(
'.issues-filters a.is-active'
)).
to
have_content
(
'Milestone'
)
end
...
...
spec/features/search/user_uses_header_search_field_spec.rb
View file @
3d252244
...
...
@@ -21,13 +21,17 @@ describe 'User uses header search field' do
it
'shows assigned issues'
do
find
(
'.search-input-container .dropdown-menu'
).
click_link
(
'Issues assigned to me'
)
expect
(
find
(
'.js-assignee-search'
)).
to
have_content
(
user
.
name
)
expect
(
page
).
to
have_selector
(
'.filtered-search'
)
expect_tokens
([
assignee_token
(
user
.
name
)])
expect_filtered_search_input_empty
end
it
'shows created issues'
do
find
(
'.search-input-container .dropdown-menu'
).
click_link
(
"Issues I've created"
)
expect
(
find
(
'.js-author-search'
)).
to
have_content
(
user
.
name
)
expect
(
page
).
to
have_selector
(
'.filtered-search'
)
expect_tokens
([
author_token
(
user
.
name
)])
expect_filtered_search_input_empty
end
end
...
...
@@ -37,13 +41,17 @@ describe 'User uses header search field' do
it
'shows assigned merge requests'
do
find
(
'.search-input-container .dropdown-menu'
).
click_link
(
'Merge requests assigned to me'
)
expect
(
find
(
'.js-assignee-search'
)).
to
have_content
(
user
.
name
)
expect
(
page
).
to
have_selector
(
'.filtered-search'
)
expect_tokens
([
assignee_token
(
user
.
name
)])
expect_filtered_search_input_empty
end
it
'shows created merge requests'
do
find
(
'.search-input-container .dropdown-menu'
).
click_link
(
"Merge requests I've created"
)
expect
(
find
(
'.js-author-search'
)).
to
have_content
(
user
.
name
)
expect
(
page
).
to
have_selector
(
'.filtered-search'
)
expect_tokens
([
author_token
(
user
.
name
)])
expect_filtered_search_input_empty
end
end
end
...
...
spec/helpers/search_helper_spec.rb
View file @
3d252244
...
...
@@ -135,5 +135,40 @@ describe SearchHelper do
expect
(
search_filter_input_options
(
''
)[
:data
][
'base-endpoint'
]).
to
eq
(
"/groups
#{
group_path
(
@group
)
}
"
)
end
end
context
'dashboard'
do
it
'does not include group-id and project-id'
do
expect
(
search_filter_input_options
(
''
)[
:data
][
'project-id'
]).
to
eq
(
nil
)
expect
(
search_filter_input_options
(
''
)[
:data
][
'group-id'
]).
to
eq
(
nil
)
end
it
'includes dashboard base-endpoint'
do
expect
(
search_filter_input_options
(
''
)[
:data
][
'base-endpoint'
]).
to
eq
(
"/dashboard"
)
end
end
end
describe
'search_history_storage_prefix'
do
context
'project'
do
it
'returns project full_path'
do
@project
=
create
(
:project
,
:repository
)
expect
(
search_history_storage_prefix
).
to
eq
(
@project
.
full_path
)
end
end
context
'group'
do
it
'returns group full_path'
do
@group
=
create
(
:group
,
:nested
,
name:
'group-name'
)
expect
(
search_history_storage_prefix
).
to
eq
(
@group
.
full_path
)
end
end
context
'dashboard'
do
it
'returns dashboard'
do
expect
(
search_history_storage_prefix
).
to
eq
(
"dashboard"
)
end
end
end
end
spec/javascripts/search_autocomplete_spec.js
View file @
3d252244
/* eslint-disable no-var, one-var, no-unused-expressions, consistent-return, no-param-reassign, default-case, no-return-assign, object-shorthand,
prefer-template,
vars-on-top */
/* eslint-disable no-var, one-var, no-unused-expressions, consistent-return, no-param-reassign, default-case, no-return-assign, object-shorthand, vars-on-top */
import
$
from
'
jquery
'
;
import
'
~/gl_dropdown
'
;
...
...
@@ -109,16 +109,16 @@ describe('Search autocomplete dropdown', () => {
assertLinks
=
function
(
list
,
issuesPath
,
mrsPath
)
{
if
(
issuesPath
)
{
const
issuesAssignedToMeLink
=
`a[href="
${
issuesPath
}
/?assignee_
id=
${
userId
}
"]`
;
const
issuesIHaveCreatedLink
=
`a[href="
${
issuesPath
}
/?author_
id=
${
userId
}
"]`
;
const
issuesAssignedToMeLink
=
`a[href="
${
issuesPath
}
/?assignee_
username=
${
userName
}
"]`
;
const
issuesIHaveCreatedLink
=
`a[href="
${
issuesPath
}
/?author_
username=
${
userName
}
"]`
;
expect
(
list
.
find
(
issuesAssignedToMeLink
).
length
).
toBe
(
1
);
expect
(
list
.
find
(
issuesAssignedToMeLink
).
text
()).
toBe
(
'
Issues assigned to me
'
);
expect
(
list
.
find
(
issuesIHaveCreatedLink
).
length
).
toBe
(
1
);
expect
(
list
.
find
(
issuesIHaveCreatedLink
).
text
()).
toBe
(
"
Issues I've created
"
);
}
const
mrsAssignedToMeLink
=
`a[href="
${
mrsPath
}
/?assignee_
id=
${
userId
}
"]`
;
const
mrsIHaveCreatedLink
=
`a[href="
${
mrsPath
}
/?author_
id=
${
userId
}
"]`
;
const
mrsAssignedToMeLink
=
`a[href="
${
mrsPath
}
/?assignee_
username=
${
userName
}
"]`
;
const
mrsIHaveCreatedLink
=
`a[href="
${
mrsPath
}
/?author_
username=
${
userName
}
"]`
;
expect
(
list
.
find
(
mrsAssignedToMeLink
).
length
).
toBe
(
1
);
expect
(
list
.
find
(
mrsAssignedToMeLink
).
text
()).
toBe
(
'
Merge requests assigned to me
'
);
...
...
@@ -186,7 +186,7 @@ describe('Search autocomplete dropdown', () => {
widget
.
searchInput
.
val
(
'
help
'
);
widget
.
searchInput
.
triggerHandler
(
'
focus
'
);
list
=
widget
.
wrap
.
find
(
'
.dropdown-menu
'
).
find
(
'
ul
'
);
link
=
"
a[href='
"
+
projectIssuesPath
+
'
/?assignee_id=
'
+
userId
+
"
']
"
;
link
=
`a[href='
${
projectIssuesPath
}
/?assignee_username=
${
userName
}
']`
;
expect
(
list
.
find
(
link
).
length
).
toBe
(
0
);
});
...
...
spec/support/helpers/filter_item_select_helper.rb
deleted
100644 → 0
View file @
1ee35e6b
# Helper allows you to select value from filter-items
#
# Params
# value - value for select
# selector - css selector of item
#
# Usage:
#
# filter_item_select('Any Author', '.js-author-search')
#
module
FilterItemSelectHelper
def
filter_item_select
(
value
,
selector
)
find
(
selector
).
click
wait_for_requests
page
.
within
(
'.dropdown-content'
)
do
click_link
value
end
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment