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
670d8df5
Commit
670d8df5
authored
Jun 13, 2017
by
Timothy Andrew
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/fix-9-2-stable-conflicts-for-mr-11744' into 9-2-stable
parents
b83972f9
af97988a
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
123 additions
and
7 deletions
+123
-7
gl_dropdown.js
app/assets/javascripts/gl_dropdown.js
+8
-2
users_select.js
app/assets/javascripts/users_select.js
+32
-2
_assignee.html.haml
...ws/projects/boards/components/sidebar/_assignee.html.haml
+4
-1
_sidebar_assignees.html.haml
app/views/shared/issuable/_sidebar_assignees.html.haml
+1
-1
_metadata_issue_assignee.html.haml
...s/shared/issuable/form/_metadata_issue_assignee.html.haml
+1
-1
form_spec.rb
spec/features/issues/form_spec.rb
+60
-0
issue_sidebar_spec.rb
spec/features/issues/issue_sidebar_spec.rb
+17
-0
No files found.
app/assets/javascripts/gl_dropdown.js
View file @
670d8df5
...
...
@@ -469,8 +469,8 @@ GitLabDropdown = (function() {
// Process the data to make sure rendered data
// matches the correct layout
if
(
this
.
fullData
&&
hasMultiSelect
&&
this
.
options
.
processData
)
{
const
inputValue
=
this
.
filterInput
.
val
();
const
inputValue
=
this
.
filterInput
.
val
();
if
(
this
.
fullData
&&
hasMultiSelect
&&
this
.
options
.
processData
&&
inputValue
.
length
===
0
)
{
this
.
options
.
processData
.
call
(
this
.
options
,
inputValue
,
this
.
filteredFullData
(),
this
.
parseData
.
bind
(
this
));
}
...
...
@@ -741,6 +741,12 @@ GitLabDropdown = (function() {
$input
.
attr
(
'id'
,
this
.
options
.
inputId
);
}
if
(
this
.
options
.
multiSelect
)
{
Object
.
keys
(
selectedObject
).
forEach
((
attribute
)
=>
{
$input
.
attr
(
`data-
${
attribute
}
`
,
selectedObject
[
attribute
]);
});
}
if
(
this
.
options
.
inputMeta
)
{
$input
.
attr
(
'data-meta'
,
selectedObject
[
this
.
options
.
inputMeta
]);
}
...
...
app/assets/javascripts/users_select.js
View file @
670d8df5
...
...
@@ -40,6 +40,7 @@ window.emitSidebarEvent = window.emitSidebarEvent || $.noop;
options
.
showCurrentUser
=
$dropdown
.
data
(
'current-user'
);
options
.
todoFilter
=
$dropdown
.
data
(
'todo-filter'
);
options
.
todoStateFilter
=
$dropdown
.
data
(
'todo-state-filter'
);
options
.
perPage
=
$dropdown
.
data
(
'per-page'
);
showNullUser
=
$dropdown
.
data
(
'null-user'
);
defaultNullUser
=
$dropdown
.
data
(
'null-user-default'
);
showMenuAbove
=
$dropdown
.
data
(
'showMenuAbove'
);
...
...
@@ -219,7 +220,36 @@ window.emitSidebarEvent = window.emitSidebarEvent || $.noop;
glDropdown
.
options
.
processData
(
term
,
users
,
callback
);
}.
bind
(
this
));
},
processData
:
function
(
term
,
users
,
callback
)
{
processData
:
function
(
term
,
data
,
callback
)
{
let
users
=
data
;
// Only show assigned user list when there is no search term
if
(
$dropdown
.
hasClass
(
'js-multiselect'
)
&&
term
.
length
===
0
)
{
const
selectedInputs
=
getSelectedUserInputs
();
// Potential duplicate entries when dealing with issue board
// because issue board is also managed by vue
const
selectedUsers
=
_
.
uniq
(
selectedInputs
,
false
,
a
=>
a
.
value
)
.
filter
((
input
)
=>
{
const
userId
=
parseInt
(
input
.
value
,
10
);
const
inUsersArray
=
users
.
find
(
u
=>
u
.
id
===
userId
);
return
!
inUsersArray
&&
userId
!==
0
;
})
.
map
((
input
)
=>
{
const
userId
=
parseInt
(
input
.
value
,
10
);
const
{
avatarUrl
,
avatar_url
,
name
,
username
}
=
input
.
dataset
;
return
{
avatar_url
:
avatarUrl
||
avatar_url
,
id
:
userId
,
name
,
username
,
};
});
users
=
data
.
concat
(
selectedUsers
);
}
let
anyUser
;
let
index
;
let
j
;
...
...
@@ -650,7 +680,7 @@ window.emitSidebarEvent = window.emitSidebarEvent || $.noop;
url
:
url
,
data
:
{
search
:
query
,
per_page
:
20
,
per_page
:
options
.
perPage
||
20
,
active
:
true
,
project_id
:
options
.
projectId
||
null
,
group_id
:
options
.
groupId
||
null
,
...
...
app/views/projects/boards/components/sidebar/_assignee.html.haml
View file @
670d8df5
...
...
@@ -14,7 +14,10 @@
name:
"issue[assignee_ids][]"
,
":value"
=>
"assignee.id"
,
"v-if"
=>
"issue.assignees"
,
"v-for"
=>
"assignee in issue.assignees"
}
"v-for"
=>
"assignee in issue.assignees"
,
":data-avatar_url"
=>
"assignee.avatar"
,
":data-name"
=>
"assignee.name"
,
":data-username"
=>
"assignee.username"
}
.dropdown
%button
.dropdown-menu-toggle.js-user-search.js-author-search.js-multiselect.js-save-user-data.js-issue-board-sidebar
{
type:
"button"
,
ref:
"assigneeDropdown"
,
data:
{
toggle:
"dropdown"
,
field_name:
"issue[assignee_ids][]"
,
first_user:
(
current_user
.
username
if
current_user
),
current_user:
"true"
,
project_id:
@project
.
id
,
null_user:
"true"
,
multi_select:
"true"
,
'max-select'
=>
1
,
dropdown:
{
header:
'Assignee'
}
},
":data-issuable-id"
=>
"issue.id"
,
...
...
app/views/shared/issuable/_sidebar_assignees.html.haml
View file @
670d8df5
...
...
@@ -32,7 +32,7 @@
.selectbox.hide-collapsed
-
issuable
.
assignees
.
each
do
|
assignee
|
=
hidden_field_tag
"
#{
issuable
.
to_ability_name
}
[assignee_ids][]"
,
assignee
.
id
,
id:
nil
=
hidden_field_tag
"
#{
issuable
.
to_ability_name
}
[assignee_ids][]"
,
assignee
.
id
,
id:
nil
,
data:
{
avatar_url:
assignee
.
avatar_url
,
name:
assignee
.
name
,
username:
assignee
.
username
}
-
options
=
{
toggle_class:
'js-user-search js-author-search'
,
title:
'Assign to'
,
filter:
true
,
dropdown_class:
'dropdown-menu-user dropdown-menu-selectable dropdown-menu-author'
,
placeholder:
'Search users'
,
data:
{
first_user:
(
current_user
.
username
if
current_user
),
current_user:
true
,
project_id:
(
@project
.
id
if
@project
),
author_id:
issuable
.
author_id
,
field_name:
"
#{
issuable
.
to_ability_name
}
[assignee_ids][]"
,
issue_update:
issuable_json_path
(
issuable
),
ability_name:
issuable
.
to_ability_name
,
null_user:
true
}
}
...
...
app/views/shared/issuable/form/_metadata_issue_assignee.html.haml
View file @
670d8df5
...
...
@@ -2,7 +2,7 @@
.col-sm-10
{
class:
(
"col-lg-8"
if
has_due_date
)
}
.issuable-form-select-holder.selectbox
-
issuable
.
assignees
.
each
do
|
assignee
|
=
hidden_field_tag
"
#{
issuable
.
to_ability_name
}
[assignee_ids][]"
,
assignee
.
id
,
id:
nil
,
data:
{
meta:
assignee
.
name
}
=
hidden_field_tag
"
#{
issuable
.
to_ability_name
}
[assignee_ids][]"
,
assignee
.
id
,
id:
nil
,
data:
{
meta:
assignee
.
name
,
avatar_url:
assignee
.
avatar_url
,
name:
assignee
.
name
,
username:
assignee
.
username
}
-
if
issuable
.
assignees
.
length
===
0
=
hidden_field_tag
"
#{
issuable
.
to_ability_name
}
[assignee_ids][]"
,
0
,
id:
nil
,
data:
{
meta:
''
}
...
...
spec/features/issues/form_spec.rb
View file @
670d8df5
...
...
@@ -3,6 +3,7 @@ require 'rails_helper'
describe
'New/edit issue'
,
feature:
true
,
js:
true
do
include
GitlabRoutingHelper
include
ActionView
::
Helpers
::
JavaScriptHelper
include
FormHelper
let!
(
:project
)
{
create
(
:project
)
}
let!
(
:user
)
{
create
(
:user
)}
...
...
@@ -23,6 +24,65 @@ describe 'New/edit issue', feature: true, js: true do
visit
new_namespace_project_issue_path
(
project
.
namespace
,
project
)
end
describe
'shorten users API pagination limit'
do
before
do
allow_any_instance_of
(
FormHelper
).
to
receive
(
:issue_dropdown_options
).
and_wrap_original
do
|
original
,
*
args
|
has_multiple_assignees
=
*
args
[
1
]
options
=
{
toggle_class:
'js-user-search js-assignee-search js-multiselect js-save-user-data'
,
title:
'Select assignee'
,
filter:
true
,
dropdown_class:
'dropdown-menu-user dropdown-menu-selectable dropdown-menu-assignee'
,
placeholder:
'Search users'
,
data:
{
per_page:
1
,
null_user:
true
,
current_user:
true
,
project_id:
project
.
try
(
:id
),
field_name:
"issue[assignee_ids][]"
,
default_label:
'Assignee'
,
'max-select'
:
1
,
'dropdown-header'
:
'Assignee'
,
multi_select:
true
,
'input-meta'
:
'name'
,
'always-show-selectbox'
:
true
}
}
if
has_multiple_assignees
options
[
:title
]
=
'Select assignee(s)'
options
[
:data
][
:'dropdown-header'
]
=
'Assignee(s)'
options
[
:data
].
delete
(
:'max-select'
)
end
options
end
visit
new_namespace_project_issue_path
(
project
.
namespace
,
project
)
click_button
'Unassigned'
wait_for_ajax
end
it
'should display selected users even if they are not part of the original API call'
do
find
(
'.dropdown-input-field'
).
native
.
send_keys
user2
.
name
page
.
within
'.dropdown-menu-user'
do
expect
(
page
).
to
have_content
user2
.
name
click_link
user2
.
name
end
find
(
'.js-dropdown-input-clear'
).
click
page
.
within
'.dropdown-menu-user'
do
expect
(
page
).
to
have_content
user
.
name
expect
(
find
(
'.dropdown-menu-user a.is-active'
).
first
(
:xpath
,
'..'
)[
'data-user-id'
]).
to
eq
(
user2
.
id
.
to_s
)
end
end
end
describe
'single assignee'
do
before
do
click_button
'Unassigned'
...
...
spec/features/issues/issue_sidebar_spec.rb
View file @
670d8df5
...
...
@@ -57,6 +57,23 @@ feature 'Issue Sidebar', feature: true do
expect
(
page
.
find
(
'.dropdown-menu-user-link.is-active'
)).
to
have_content
(
user
.
name
)
end
end
it
'keeps your filtered term after filtering and dismissing the dropdown'
do
find
(
'.dropdown-input-field'
).
native
.
send_keys
user2
.
name
wait_for_ajax
page
.
within
'.dropdown-menu-user'
do
expect
(
page
).
not_to
have_content
'Unassigned'
click_link
user2
.
name
end
find
(
'.js-right-sidebar'
).
click
find
(
'.block.assignee .edit-link'
).
click
expect
(
page
.
all
(
'.dropdown-menu-user li'
).
length
).
to
eq
(
1
)
expect
(
find
(
'.dropdown-input-field'
).
value
).
to
eq
(
user2
.
name
)
end
end
context
'as a allowed user'
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