BigW Consortium Gitlab
Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gitlab-ce
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Forest Godfrey
gitlab-ce
Commits
8724d587
Commit
8724d587
authored
Nov 09, 2016
by
Regis
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into auto-pipelines-vue
parents
1c85514a
5368b9f2
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
143 additions
and
94 deletions
+143
-94
users_select.js
app/assets/javascripts/users_select.js
+4
-0
autocomplete_controller.rb
app/controllers/autocomplete_controller.rb
+5
-1
user.rb
app/models/user.rb
+1
-0
index.html.haml
app/views/dashboard/todos/index.html.haml
+1
-1
22588-todos-filter-shows-all-users.yml
changelogs/unreleased/22588-todos-filter-shows-all-users.yml
+4
-0
project_hooks.rb
lib/api/project_hooks.rb
+69
-84
todos_filtering_spec.rb
spec/features/todos/todos_filtering_spec.rb
+45
-8
user_spec.rb
spec/models/user_spec.rb
+14
-0
No files found.
app/assets/javascripts/users_select.js
View file @
8724d587
...
...
@@ -23,6 +23,8 @@
$dropdown
=
$
(
dropdown
);
options
.
projectId
=
$dropdown
.
data
(
'project-id'
);
options
.
showCurrentUser
=
$dropdown
.
data
(
'current-user'
);
options
.
todoFilter
=
$dropdown
.
data
(
'todo-filter'
);
options
.
todoStateFilter
=
$dropdown
.
data
(
'todo-state-filter'
);
showNullUser
=
$dropdown
.
data
(
'null-user'
);
showMenuAbove
=
$dropdown
.
data
(
'showMenuAbove'
);
showAnyUser
=
$dropdown
.
data
(
'any-user'
);
...
...
@@ -394,6 +396,8 @@
project_id
:
options
.
projectId
||
null
,
group_id
:
options
.
groupId
||
null
,
skip_ldap
:
options
.
skipLdap
||
null
,
todo_filter
:
options
.
todoFilter
||
null
,
todo_state_filter
:
options
.
todoStateFilter
||
null
,
current_user
:
options
.
showCurrentUser
||
null
,
push_code_to_protected_branches
:
options
.
pushCodeToProtectedBranches
||
null
,
author_id
:
options
.
authorId
||
null
,
...
...
app/controllers/autocomplete_controller.rb
View file @
8724d587
...
...
@@ -11,9 +11,13 @@ class AutocompleteController < ApplicationController
@users
=
@users
.
reorder
(
:name
)
@users
=
@users
.
page
(
params
[
:page
])
if
params
[
:todo_filter
].
present?
@users
=
@users
.
todo_authors
(
current_user
.
id
,
params
[
:todo_state_filter
])
end
if
params
[
:search
].
blank?
# Include current user if available to filter by "Me"
if
params
[
:current_user
]
&&
current_user
if
params
[
:current_user
]
.
present?
&&
current_user
@users
=
[
*
@users
,
current_user
]
end
...
...
app/models/user.rb
View file @
8724d587
...
...
@@ -173,6 +173,7 @@ class User < ActiveRecord::Base
scope
:active
,
->
{
with_state
(
:active
)
}
scope
:not_in_project
,
->
(
project
)
{
project
.
users
.
present?
?
where
(
"id not in (:ids)"
,
ids:
project
.
users
.
map
(
&
:
id
)
)
:
all
}
scope
:without_projects
,
->
{
where
(
'id NOT IN (SELECT DISTINCT(user_id) FROM members)'
)
}
scope
:todo_authors
,
->
(
user_id
,
state
)
{
where
(
id:
Todo
.
where
(
user_id:
user_id
,
state:
state
).
select
(
:author_id
))
}
def
self
.
with_two_factor
joins
(
"LEFT OUTER JOIN u2f_registrations AS u2f ON u2f.user_id = users.id"
).
...
...
app/views/dashboard/todos/index.html.haml
View file @
8724d587
...
...
@@ -37,7 +37,7 @@
-
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
,
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
'
}
})
placeholder:
'Search authors'
,
data:
{
any_user:
'Any Author'
,
first_user:
(
current_user
.
username
if
current_user
),
project_id:
(
@project
.
id
if
@project
),
selected:
params
[
:author_id
],
field_name:
'author_id'
,
default_label:
'Author'
,
todo_filter:
true
,
todo_state_filter:
params
[
:state
]
||
'pending
'
}
})
.filter-item.inline
-
if
params
[
:type
].
present?
=
hidden_field_tag
(
:type
,
params
[
:type
])
...
...
changelogs/unreleased/22588-todos-filter-shows-all-users.yml
0 → 100644
View file @
8724d587
---
title
:
'
Fix:
Todos
Filter
Shows
All
Users'
merge_request
:
author
:
lib/api/project_hooks.rb
View file @
8724d587
module
API
# Projects API
class
ProjectHooks
<
Grape
::
API
helpers
do
params
:project_hook_properties
do
requires
:url
,
type:
String
,
desc:
"The URL to send the request to"
optional
:push_events
,
type:
Boolean
,
desc:
"Trigger hook on push events"
optional
:issues_events
,
type:
Boolean
,
desc:
"Trigger hook on issues events"
optional
:merge_requests_events
,
type:
Boolean
,
desc:
"Trigger hook on merge request events"
optional
:tag_push_events
,
type:
Boolean
,
desc:
"Trigger hook on tag push events"
optional
:note_events
,
type:
Boolean
,
desc:
"Trigger hook on note(comment) events"
optional
:build_events
,
type:
Boolean
,
desc:
"Trigger hook on build events"
optional
:pipeline_events
,
type:
Boolean
,
desc:
"Trigger hook on pipeline events"
optional
:wiki_events
,
type:
Boolean
,
desc:
"Trigger hook on wiki events"
optional
:enable_ssl_verification
,
type:
Boolean
,
desc:
"Do SSL verification when triggering the hook"
optional
:token
,
type:
String
,
desc:
"Secret token to validate received payloads; this will not be returned in the response"
end
end
before
{
authenticate!
}
before
{
authorize_admin_project
}
params
do
requires
:id
,
type:
String
,
desc:
'The ID of a project'
end
resource
:projects
do
# Get project hooks
#
# Parameters:
# id (required) - The ID of a project
# Example Request:
# GET /projects/:id/hooks
desc
'Get project hooks'
do
success
Entities
::
ProjectHook
end
get
":id/hooks"
do
@hooks
=
paginate
user_project
.
hooks
present
@hooks
,
with:
Entities
::
ProjectHook
hooks
=
paginate
user_project
.
hooks
present
hooks
,
with:
Entities
::
ProjectHook
end
# Get a project hook
#
# Parameters:
# id (required) - The ID of a project
# hook_id (required) - The ID of a project hook
# Example Request:
# GET /projects/:id/hooks/:hook_id
desc
'Get a project hook'
do
success
Entities
::
ProjectHook
end
params
do
requires
:hook_id
,
type:
Integer
,
desc:
'The ID of a project hook'
end
get
":id/hooks/:hook_id"
do
@
hook
=
user_project
.
hooks
.
find
(
params
[
:hook_id
])
present
@
hook
,
with:
Entities
::
ProjectHook
hook
=
user_project
.
hooks
.
find
(
params
[
:hook_id
])
present
hook
,
with:
Entities
::
ProjectHook
end
# Add hook to project
#
# Parameters:
# id (required) - The ID of a project
# url (required) - The hook URL
# Example Request:
# POST /projects/:id/hooks
desc
'Add hook to project'
do
success
Entities
::
ProjectHook
end
params
do
use
:project_hook_properties
end
post
":id/hooks"
do
required_attributes!
[
:url
]
attrs
=
attributes_for_keys
[
:url
,
:push_events
,
:issues_events
,
:merge_requests_events
,
:tag_push_events
,
:note_events
,
:build_events
,
:pipeline_events
,
:wiki_page_events
,
:enable_ssl_verification
,
:token
]
@hook
=
user_project
.
hooks
.
new
(
attrs
)
new_hook_params
=
declared
(
params
,
include_missing:
false
,
include_parent_namespaces:
false
).
to_h
hook
=
user_project
.
hooks
.
new
(
new_hook_params
)
if
@
hook
.
save
present
@
hook
,
with:
Entities
::
ProjectHook
if
hook
.
save
present
hook
,
with:
Entities
::
ProjectHook
else
if
@hook
.
errors
[
:url
].
present?
error!
(
"Invalid url given"
,
422
)
end
not_found!
(
"Project hook
#{
@hook
.
errors
.
messages
}
"
)
error!
(
"Invalid url given"
,
422
)
if
hook
.
errors
[
:url
].
present?
not_found!
(
"Project hook
#{
hook
.
errors
.
messages
}
"
)
end
end
# Update an existing project hook
#
# Parameters:
# id (required) - The ID of a project
# hook_id (required) - The ID of a project hook
# url (required) - The hook URL
# Example Request:
# PUT /projects/:id/hooks/:hook_id
desc
'Update an existing project hook'
do
success
Entities
::
ProjectHook
end
params
do
requires
:hook_id
,
type:
Integer
,
desc:
"The ID of the hook to update"
use
:project_hook_properties
end
put
":id/hooks/:hook_id"
do
@hook
=
user_project
.
hooks
.
find
(
params
[
:hook_id
])
required_attributes!
[
:url
]
attrs
=
attributes_for_keys
[
:url
,
:push_events
,
:issues_events
,
:merge_requests_events
,
:tag_push_events
,
:note_events
,
:build_events
,
:pipeline_events
,
:wiki_page_events
,
:enable_ssl_verification
,
:token
]
hook
=
user_project
.
hooks
.
find
(
params
[
:hook_id
])
new_params
=
declared
(
params
,
include_missing:
false
,
include_parent_namespaces:
false
).
to_h
new_params
.
delete
(
'hook_id'
)
if
@hook
.
update_attributes
attrs
present
@
hook
,
with:
Entities
::
ProjectHook
if
hook
.
update_attributes
(
new_params
)
present
hook
,
with:
Entities
::
ProjectHook
else
if
@hook
.
errors
[
:url
].
present?
error!
(
"Invalid url given"
,
422
)
end
not_found!
(
"Project hook
#{
@hook
.
errors
.
messages
}
"
)
error!
(
"Invalid url given"
,
422
)
if
hook
.
errors
[
:url
].
present?
not_found!
(
"Project hook
#{
hook
.
errors
.
messages
}
"
)
end
end
# Deletes project hook. This is an idempotent function.
#
# Parameters:
# id (required) - The ID of a project
# hook_id (required) - The ID of hook to delete
# Example Request:
# DELETE /projects/:id/hooks/:hook_id
desc
'Deletes project hook'
do
success
Entities
::
ProjectHook
end
params
do
requires
:hook_id
,
type:
Integer
,
desc:
'The ID of the hook to delete'
end
delete
":id/hooks/:hook_id"
do
required_attributes!
[
:hook_id
]
begin
@hook
=
user_project
.
hooks
.
destroy
(
params
[
:hook_id
])
present
user_project
.
hooks
.
destroy
(
params
[
:hook_id
]),
with:
Entities
::
ProjectHook
rescue
# ProjectHook can raise Error if hook_id not found
not_found!
(
"Error deleting hook
#{
params
[
:hook_id
]
}
"
)
...
...
spec/features/todos/todos_filtering_spec.rb
View file @
8724d587
...
...
@@ -36,17 +36,54 @@ describe 'Dashboard > User filters todos', feature: true, js: true do
expect
(
page
).
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
context
"Author filter"
do
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
(
find
(
'.todos-list'
)).
to
have_content
user_1
.
name
expect
(
find
(
'.todos-list'
)).
not_to
have_content
user_2
.
name
end
wait_for_ajax
it
"shows only authors of existing todos"
do
click_button
'Author'
within
'.dropdown-menu-author'
do
# It should contain two users + "Any Author"
expect
(
page
).
to
have_selector
(
'.dropdown-menu-user-link'
,
count:
3
)
expect
(
page
).
to
have_content
(
user_1
.
name
)
expect
(
page
).
to
have_content
(
user_2
.
name
)
end
end
expect
(
find
(
'.todos-list'
)).
to
have_content
user_1
.
name
expect
(
find
(
'.todos-list'
)).
not_to
have_content
user_2
.
name
it
"shows only authors of existing done todos"
do
user_3
=
create
:user
user_4
=
create
:user
create
(
:todo
,
user:
user_1
,
author:
user_3
,
project:
project_1
,
target:
issue
,
action:
1
,
state: :done
)
create
(
:todo
,
user:
user_1
,
author:
user_4
,
project:
project_2
,
target:
merge_request
,
action:
2
,
state: :done
)
project_1
.
team
<<
[
user_3
,
:developer
]
project_2
.
team
<<
[
user_4
,
:developer
]
visit
dashboard_todos_path
(
state:
'done'
)
click_button
'Author'
within
'.dropdown-menu-author'
do
# It should contain two users + "Any Author"
expect
(
page
).
to
have_selector
(
'.dropdown-menu-user-link'
,
count:
3
)
expect
(
page
).
to
have_content
(
user_3
.
name
)
expect
(
page
).
to
have_content
(
user_4
.
name
)
expect
(
page
).
not_to
have_content
(
user_1
.
name
)
expect
(
page
).
not_to
have_content
(
user_2
.
name
)
end
end
end
it
'filters by type'
do
...
...
spec/models/user_spec.rb
View file @
8724d587
...
...
@@ -256,6 +256,20 @@ describe User, models: true do
expect
(
users_without_two_factor
).
not_to
include
(
user_with_2fa
.
id
)
end
end
describe
'.todo_authors'
do
it
'filters users'
do
create
:user
user_2
=
create
:user
user_3
=
create
:user
current_user
=
create
:user
create
(
:todo
,
user:
current_user
,
author:
user_2
,
state: :done
)
create
(
:todo
,
user:
current_user
,
author:
user_3
,
state: :pending
)
expect
(
User
.
todo_authors
(
current_user
.
id
,
'pending'
)).
to
eq
[
user_3
]
expect
(
User
.
todo_authors
(
current_user
.
id
,
'done'
)).
to
eq
[
user_2
]
end
end
end
describe
"Respond to"
do
...
...
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