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
c4094b7e
Commit
c4094b7e
authored
May 04, 2017
by
Clement Ho
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix specs
parent
3f6477fd
Hide whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
93 additions
and
58 deletions
+93
-58
file_template_mediator.js
app/assets/javascripts/blob/file_template_mediator.js
+5
-1
file_template_selector.js
app/assets/javascripts/blob/file_template_selector.js
+9
-1
ci_yaml_selector.js
...s/javascripts/blob/template_selectors/ci_yaml_selector.js
+1
-1
dockerfile_selector.js
...avascripts/blob/template_selectors/dockerfile_selector.js
+1
-1
gitignore_selector.js
...javascripts/blob/template_selectors/gitignore_selector.js
+1
-1
license_selector.js
...s/javascripts/blob/template_selectors/license_selector.js
+11
-2
type_selector.js
...sets/javascripts/blob/template_selectors/type_selector.js
+1
-1
protected_tag_access_dropdown.js
...vascripts/protected_tags/protected_tag_access_dropdown.js
+2
-2
protected_tag_dropdown.js
...sets/javascripts/protected_tags/protected_tag_dropdown.js
+2
-2
users_select.js
app/assets/javascripts/users_select.js
+25
-16
dropdowns.scss
app/assets/stylesheets/framework/dropdowns.scss
+4
-0
form_helper.rb
app/helpers/form_helper.rb
+5
-6
_create_protected_branch.html.haml
...cts/protected_branches/_create_protected_branch.html.haml
+2
-2
_update_protected_branch.html.haml
...cts/protected_branches/_update_protected_branch.html.haml
+2
-2
_dropdown.html.haml
app/views/projects/protected_tags/_dropdown.html.haml
+1
-1
_update_protected_tag.haml
app/views/projects/protected_tags/_update_protected_tag.haml
+1
-1
_metadata.html.haml
app/views/shared/issuable/form/_metadata.html.haml
+4
-1
form_spec.rb
spec/features/issues/form_spec.rb
+6
-7
issues_spec.rb
spec/features/issues_spec.rb
+1
-1
issue_policy_spec.rb
spec/policies/issue_policy_spec.rb
+4
-4
authorized_destroy_service_spec.rb
spec/services/members/authorized_destroy_service_spec.rb
+3
-3
destroy_service_spec.rb
spec/services/users/destroy_service_spec.rb
+2
-2
No files found.
app/assets/javascripts/blob/file_template_mediator.js
View file @
c4094b7e
...
@@ -99,7 +99,7 @@ export default class FileTemplateMediator {
...
@@ -99,7 +99,7 @@ export default class FileTemplateMediator {
});
});
}
}
selectTemplateType
(
item
,
e
l
,
e
)
{
selectTemplateType
(
item
,
e
)
{
if
(
e
)
{
if
(
e
)
{
e
.
preventDefault
();
e
.
preventDefault
();
}
}
...
@@ -117,6 +117,10 @@ export default class FileTemplateMediator {
...
@@ -117,6 +117,10 @@ export default class FileTemplateMediator {
this
.
cacheToggleText
();
this
.
cacheToggleText
();
}
}
selectTemplateTypeOptions
(
options
)
{
this
.
selectTemplateType
(
options
.
selectedObj
,
options
.
e
);
}
selectTemplateFile
(
selector
,
query
,
data
)
{
selectTemplateFile
(
selector
,
query
,
data
)
{
selector
.
renderLoading
();
selector
.
renderLoading
();
// in case undo menu is already already there
// in case undo menu is already already there
...
...
app/assets/javascripts/blob/file_template_selector.js
View file @
c4094b7e
...
@@ -52,9 +52,17 @@ export default class FileTemplateSelector {
...
@@ -52,9 +52,17 @@ export default class FileTemplateSelector {
.
removeClass
(
'fa-spinner fa-spin'
);
.
removeClass
(
'fa-spinner fa-spin'
);
}
}
reportSelection
(
query
,
el
,
e
,
data
)
{
reportSelection
(
options
)
{
const
{
query
,
e
,
data
}
=
options
;
e
.
preventDefault
();
e
.
preventDefault
();
return
this
.
mediator
.
selectTemplateFile
(
this
,
query
,
data
);
return
this
.
mediator
.
selectTemplateFile
(
this
,
query
,
data
);
}
}
reportSelectionName
(
options
)
{
const
opts
=
options
;
opts
.
query
=
options
.
selectedObj
.
name
;
this
.
reportSelection
(
opts
);
}
}
}
app/assets/javascripts/blob/template_selectors/ci_yaml_selector.js
View file @
c4094b7e
...
@@ -25,7 +25,7 @@ export default class BlobCiYamlSelector extends FileTemplateSelector {
...
@@ -25,7 +25,7 @@ export default class BlobCiYamlSelector extends FileTemplateSelector {
search
:
{
search
:
{
fields
:
[
'name'
],
fields
:
[
'name'
],
},
},
clicked
:
(
query
,
el
,
e
)
=>
this
.
reportSelection
(
query
.
name
,
el
,
e
),
clicked
:
options
=>
this
.
reportSelectionName
(
options
),
text
:
item
=>
item
.
name
,
text
:
item
=>
item
.
name
,
});
});
}
}
...
...
app/assets/javascripts/blob/template_selectors/dockerfile_selector.js
View file @
c4094b7e
...
@@ -25,7 +25,7 @@ export default class DockerfileSelector extends FileTemplateSelector {
...
@@ -25,7 +25,7 @@ export default class DockerfileSelector extends FileTemplateSelector {
search
:
{
search
:
{
fields
:
[
'name'
],
fields
:
[
'name'
],
},
},
clicked
:
(
query
,
el
,
e
)
=>
this
.
reportSelection
(
query
.
name
,
el
,
e
),
clicked
:
options
=>
this
.
reportSelectionName
(
options
),
text
:
item
=>
item
.
name
,
text
:
item
=>
item
.
name
,
});
});
}
}
...
...
app/assets/javascripts/blob/template_selectors/gitignore_selector.js
View file @
c4094b7e
...
@@ -24,7 +24,7 @@ export default class BlobGitignoreSelector extends FileTemplateSelector {
...
@@ -24,7 +24,7 @@ export default class BlobGitignoreSelector extends FileTemplateSelector {
search
:
{
search
:
{
fields
:
[
'name'
],
fields
:
[
'name'
],
},
},
clicked
:
(
query
,
el
,
e
)
=>
this
.
reportSelection
(
query
.
name
,
el
,
e
),
clicked
:
options
=>
this
.
reportSelectionName
(
options
),
text
:
item
=>
item
.
name
,
text
:
item
=>
item
.
name
,
});
});
}
}
...
...
app/assets/javascripts/blob/template_selectors/license_selector.js
View file @
c4094b7e
...
@@ -24,13 +24,22 @@ export default class BlobLicenseSelector extends FileTemplateSelector {
...
@@ -24,13 +24,22 @@ export default class BlobLicenseSelector extends FileTemplateSelector {
search
:
{
search
:
{
fields
:
[
'name'
],
fields
:
[
'name'
],
},
},
clicked
:
(
query
,
el
,
e
)
=>
{
clicked
:
(
options
)
=>
{
const
{
e
}
=
options
;
const
el
=
options
.
$el
;
const
query
=
options
.
selectedObj
;
const
data
=
{
const
data
=
{
project
:
this
.
$dropdown
.
data
(
'project'
),
project
:
this
.
$dropdown
.
data
(
'project'
),
fullname
:
this
.
$dropdown
.
data
(
'fullname'
),
fullname
:
this
.
$dropdown
.
data
(
'fullname'
),
};
};
this
.
reportSelection
(
query
.
id
,
el
,
e
,
data
);
this
.
reportSelection
({
query
:
query
.
id
,
el
,
e
,
data
,
});
},
},
text
:
item
=>
item
.
name
,
text
:
item
=>
item
.
name
,
});
});
...
...
app/assets/javascripts/blob/template_selectors/type_selector.js
View file @
c4094b7e
...
@@ -17,7 +17,7 @@ export default class FileTemplateTypeSelector extends FileTemplateSelector {
...
@@ -17,7 +17,7 @@ export default class FileTemplateTypeSelector extends FileTemplateSelector {
filterable
:
false
,
filterable
:
false
,
selectable
:
true
,
selectable
:
true
,
toggleLabel
:
item
=>
item
.
name
,
toggleLabel
:
item
=>
item
.
name
,
clicked
:
(
item
,
el
,
e
)
=>
this
.
mediator
.
selectTemplateType
(
item
,
el
,
e
),
clicked
:
options
=>
this
.
mediator
.
selectTemplateTypeOptions
(
options
),
text
:
item
=>
item
.
name
,
text
:
item
=>
item
.
name
,
});
});
}
}
...
...
app/assets/javascripts/protected_tags/protected_tag_access_dropdown.js
View file @
c4094b7e
...
@@ -17,8 +17,8 @@ export default class ProtectedTagAccessDropdown {
...
@@ -17,8 +17,8 @@ export default class ProtectedTagAccessDropdown {
}
}
return
'Select'
;
return
'Select'
;
},
},
clicked
(
item
,
$el
,
e
)
{
clicked
(
options
)
{
e
.
preventDefault
();
options
.
e
.
preventDefault
();
onSelect
();
onSelect
();
},
},
});
});
...
...
app/assets/javascripts/protected_tags/protected_tag_dropdown.js
View file @
c4094b7e
...
@@ -39,8 +39,8 @@ export default class ProtectedTagDropdown {
...
@@ -39,8 +39,8 @@ export default class ProtectedTagDropdown {
return
_
.
escape
(
protectedTag
.
id
);
return
_
.
escape
(
protectedTag
.
id
);
},
},
onFilter
:
this
.
toggleCreateNewButton
.
bind
(
this
),
onFilter
:
this
.
toggleCreateNewButton
.
bind
(
this
),
clicked
:
(
item
,
$el
,
e
)
=>
{
clicked
:
(
options
)
=>
{
e
.
preventDefault
();
options
.
e
.
preventDefault
();
this
.
onSelect
();
this
.
onSelect
();
},
},
});
});
...
...
app/assets/javascripts/users_select.js
View file @
c4094b7e
...
@@ -77,7 +77,11 @@ import eventHub from './sidebar/event_hub';
...
@@ -77,7 +77,11 @@ import eventHub from './sidebar/event_hub';
input
.
value
=
_this
.
currentUser
.
id
;
input
.
value
=
_this
.
currentUser
.
id
;
}
}
$dropdown
.
before
(
input
);
if
(
$selectbox
)
{
$dropdown
.
parent
().
before
(
input
);
}
else
{
$dropdown
.
after
(
input
);
}
};
};
if
(
$block
[
0
])
{
if
(
$block
[
0
])
{
...
@@ -95,6 +99,24 @@ import eventHub from './sidebar/event_hub';
...
@@ -95,6 +99,24 @@ import eventHub from './sidebar/event_hub';
.
get
();
.
get
();
};
};
const
checkMaxSelect
=
function
()
{
const
maxSelect
=
$dropdown
.
data
(
'max-select'
);
if
(
maxSelect
)
{
const
selected
=
getSelected
();
if
(
selected
.
length
>
maxSelect
)
{
const
firstSelectedId
=
selected
[
0
];
const
firstSelected
=
$dropdown
.
closest
(
'.selectbox'
)
.
find
(
`input[name='
${
$dropdown
.
data
(
'field-name'
)}
'][value=
${
firstSelectedId
}
]`
);
firstSelected
.
remove
();
eventHub
.
$emit
(
'sidebar.removeAssignee'
,
{
id
:
firstSelectedId
,
});
}
}
};
const
getMultiSelectDropdownTitle
=
function
(
selectedUser
,
isSelected
)
{
const
getMultiSelectDropdownTitle
=
function
(
selectedUser
,
isSelected
)
{
const
selectedUsers
=
getSelected
()
const
selectedUsers
=
getSelected
()
.
filter
(
u
=>
u
!==
0
);
.
filter
(
u
=>
u
!==
0
);
...
@@ -125,6 +147,7 @@ import eventHub from './sidebar/event_hub';
...
@@ -125,6 +147,7 @@ import eventHub from './sidebar/event_hub';
if
(
$dropdown
.
data
(
'multiSelect'
))
{
if
(
$dropdown
.
data
(
'multiSelect'
))
{
assignYourself
();
assignYourself
();
checkMaxSelect
();
const
currentUserInfo
=
$dropdown
.
data
(
'currentUserInfo'
);
const
currentUserInfo
=
$dropdown
.
data
(
'currentUserInfo'
);
$dropdown
.
find
(
'.dropdown-toggle-text'
).
text
(
getMultiSelectDropdownTitle
(
currentUserInfo
)).
removeClass
(
'is-default'
);
$dropdown
.
find
(
'.dropdown-toggle-text'
).
text
(
getMultiSelectDropdownTitle
(
currentUserInfo
)).
removeClass
(
'is-default'
);
...
@@ -333,21 +356,7 @@ import eventHub from './sidebar/event_hub';
...
@@ -333,21 +356,7 @@ import eventHub from './sidebar/event_hub';
// Enables support for limiting the number of users selected
// Enables support for limiting the number of users selected
// Automatically removes the first on the list if more users are selected
// Automatically removes the first on the list if more users are selected
const
maxSelect
=
$dropdown
.
data
(
'max-select'
);
checkMaxSelect
();
if
(
maxSelect
)
{
const
selected
=
getSelected
();
if
(
selected
.
length
>
maxSelect
)
{
const
firstSelectedId
=
selected
[
0
];
const
firstSelected
=
$dropdown
.
closest
(
'.selectbox'
)
.
find
(
`input[name='
${
$dropdown
.
data
(
'field-name'
)}
'][value=
${
firstSelectedId
}
]`
);
firstSelected
.
remove
();
eventHub
.
$emit
(
'sidebar.removeAssignee'
,
{
id
:
firstSelectedId
,
});
}
}
if
(
user
.
beforeDivider
&&
user
.
name
.
toLowerCase
()
===
'unassigned'
)
{
if
(
user
.
beforeDivider
&&
user
.
name
.
toLowerCase
()
===
'unassigned'
)
{
// Unassigned selected
// Unassigned selected
...
...
app/assets/stylesheets/framework/dropdowns.scss
View file @
c4094b7e
...
@@ -257,6 +257,10 @@
...
@@ -257,6 +257,10 @@
padding
:
0
16px
;
padding
:
0
16px
;
}
}
&
.capitalize-header
.dropdown-header
{
text-transform
:
capitalize
;
}
.separator
+
.dropdown-header
{
.separator
+
.dropdown-header
{
padding-top
:
2px
;
padding-top
:
2px
;
}
}
...
...
app/helpers/form_helper.rb
View file @
c4094b7e
...
@@ -18,7 +18,7 @@ module FormHelper
...
@@ -18,7 +18,7 @@ module FormHelper
def
issue_dropdown_options
(
issuable
,
has_multiple_assignees
=
true
)
def
issue_dropdown_options
(
issuable
,
has_multiple_assignees
=
true
)
options
=
{
options
=
{
toggle_class:
'js-user-search js-assignee-search'
,
toggle_class:
'js-user-search js-assignee-search
js-multiselect js-save-user-data
'
,
title:
'Select assignee'
,
title:
'Select assignee'
,
filter:
true
,
filter:
true
,
dropdown_class:
'dropdown-menu-user dropdown-menu-selectable dropdown-menu-assignee'
,
dropdown_class:
'dropdown-menu-user dropdown-menu-selectable dropdown-menu-assignee'
,
...
@@ -32,16 +32,15 @@ module FormHelper
...
@@ -32,16 +32,15 @@ module FormHelper
default_label:
'Assignee'
,
default_label:
'Assignee'
,
'max-select'
:
1
,
'max-select'
:
1
,
'dropdown-header'
:
'Assignee'
,
'dropdown-header'
:
'Assignee'
,
multi_select:
true
,
'input-meta'
:
'name'
,
'always-show-selectbox'
:
true
,
current_user_info:
current_user
.
to_json
(
only:
[
:id
,
:name
])
}
}
}
}
if
has_multiple_assignees
if
has_multiple_assignees
options
[
:toggle_class
]
+=
' js-multiselect js-save-user-data'
options
[
:title
]
=
'Select assignee(s)'
options
[
:title
]
=
'Select assignee(s)'
options
[
:data
][
:multi_select
]
=
true
options
[
:data
][
:'input-meta'
]
=
'name'
options
[
:data
][
:'always-show-selectbox'
]
=
true
options
[
:data
][
:current_user_info
]
=
current_user
.
to_json
(
only:
[
:id
,
:name
])
options
[
:data
][
:'dropdown-header'
]
=
'Assignee(s)'
options
[
:data
][
:'dropdown-header'
]
=
'Assignee(s)'
options
[
:data
].
delete
(
:'max-select'
)
options
[
:data
].
delete
(
:'max-select'
)
end
end
...
...
app/views/projects/protected_branches/_create_protected_branch.html.haml
View file @
c4094b7e
...
@@ -25,7 +25,7 @@
...
@@ -25,7 +25,7 @@
.merge_access_levels-container
.merge_access_levels-container
=
dropdown_tag
(
'Select'
,
=
dropdown_tag
(
'Select'
,
options:
{
toggle_class:
'js-allowed-to-merge wide'
,
options:
{
toggle_class:
'js-allowed-to-merge wide'
,
dropdown_class:
'dropdown-menu-selectable'
,
dropdown_class:
'dropdown-menu-selectable
capitalize-header
'
,
data:
{
field_name:
'protected_branch[merge_access_levels_attributes][0][access_level]'
,
input_id:
'merge_access_levels_attributes'
}})
data:
{
field_name:
'protected_branch[merge_access_levels_attributes][0][access_level]'
,
input_id:
'merge_access_levels_attributes'
}})
.form-group
.form-group
%label
.col-md-2.text-right
{
for:
'push_access_levels_attributes'
}
%label
.col-md-2.text-right
{
for:
'push_access_levels_attributes'
}
...
@@ -34,7 +34,7 @@
...
@@ -34,7 +34,7 @@
.push_access_levels-container
.push_access_levels-container
=
dropdown_tag
(
'Select'
,
=
dropdown_tag
(
'Select'
,
options:
{
toggle_class:
'js-allowed-to-push wide'
,
options:
{
toggle_class:
'js-allowed-to-push wide'
,
dropdown_class:
'dropdown-menu-selectable'
,
dropdown_class:
'dropdown-menu-selectable
capitalize-header
'
,
data:
{
field_name:
'protected_branch[push_access_levels_attributes][0][access_level]'
,
input_id:
'push_access_levels_attributes'
}})
data:
{
field_name:
'protected_branch[push_access_levels_attributes][0][access_level]'
,
input_id:
'push_access_levels_attributes'
}})
.panel-footer
.panel-footer
...
...
app/views/projects/protected_branches/_update_protected_branch.html.haml
View file @
c4094b7e
%td
%td
=
hidden_field_tag
"allowed_to_merge_
#{
protected_branch
.
id
}
"
,
protected_branch
.
merge_access_levels
.
first
.
access_level
=
hidden_field_tag
"allowed_to_merge_
#{
protected_branch
.
id
}
"
,
protected_branch
.
merge_access_levels
.
first
.
access_level
=
dropdown_tag
(
(
protected_branch
.
merge_access_levels
.
first
.
humanize
||
'Select'
)
,
=
dropdown_tag
(
(
protected_branch
.
merge_access_levels
.
first
.
humanize
||
'Select'
)
,
options:
{
toggle_class:
'js-allowed-to-merge'
,
dropdown_class:
'dropdown-menu-selectable js-allowed-to-merge-container'
,
options:
{
toggle_class:
'js-allowed-to-merge'
,
dropdown_class:
'dropdown-menu-selectable js-allowed-to-merge-container
capitalize-header
'
,
data:
{
field_name:
"allowed_to_merge_
#{
protected_branch
.
id
}
"
,
access_level_id:
protected_branch
.
merge_access_levels
.
first
.
id
}})
data:
{
field_name:
"allowed_to_merge_
#{
protected_branch
.
id
}
"
,
access_level_id:
protected_branch
.
merge_access_levels
.
first
.
id
}})
%td
%td
=
hidden_field_tag
"allowed_to_push_
#{
protected_branch
.
id
}
"
,
protected_branch
.
push_access_levels
.
first
.
access_level
=
hidden_field_tag
"allowed_to_push_
#{
protected_branch
.
id
}
"
,
protected_branch
.
push_access_levels
.
first
.
access_level
=
dropdown_tag
(
(
protected_branch
.
push_access_levels
.
first
.
humanize
||
'Select'
)
,
=
dropdown_tag
(
(
protected_branch
.
push_access_levels
.
first
.
humanize
||
'Select'
)
,
options:
{
toggle_class:
'js-allowed-to-push'
,
dropdown_class:
'dropdown-menu-selectable js-allowed-to-push-container'
,
options:
{
toggle_class:
'js-allowed-to-push'
,
dropdown_class:
'dropdown-menu-selectable js-allowed-to-push-container
capitalize-header
'
,
data:
{
field_name:
"allowed_to_push_
#{
protected_branch
.
id
}
"
,
access_level_id:
protected_branch
.
push_access_levels
.
first
.
id
}})
data:
{
field_name:
"allowed_to_push_
#{
protected_branch
.
id
}
"
,
access_level_id:
protected_branch
.
push_access_levels
.
first
.
id
}})
app/views/projects/protected_tags/_dropdown.html.haml
View file @
c4094b7e
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
=
dropdown_tag
(
'Select tag or create wildcard'
,
=
dropdown_tag
(
'Select tag or create wildcard'
,
options:
{
toggle_class:
'js-protected-tag-select js-filter-submit wide'
,
options:
{
toggle_class:
'js-protected-tag-select js-filter-submit wide'
,
filter:
true
,
dropdown_class:
"dropdown-menu-selectable"
,
placeholder:
"Search protected tag"
,
filter:
true
,
dropdown_class:
"dropdown-menu-selectable
capitalize-header
"
,
placeholder:
"Search protected tag"
,
footer_content:
true
,
footer_content:
true
,
data:
{
show_no:
true
,
show_any:
true
,
show_upcoming:
true
,
data:
{
show_no:
true
,
show_any:
true
,
show_upcoming:
true
,
selected:
params
[
:protected_tag_name
],
selected:
params
[
:protected_tag_name
],
...
...
app/views/projects/protected_tags/_update_protected_tag.haml
View file @
c4094b7e
%td
%td
=
hidden_field_tag
"allowed_to_create_
#{
protected_tag
.
id
}
"
,
protected_tag
.
create_access_levels
.
first
.
access_level
=
hidden_field_tag
"allowed_to_create_
#{
protected_tag
.
id
}
"
,
protected_tag
.
create_access_levels
.
first
.
access_level
=
dropdown_tag
(
(
protected_tag
.
create_access_levels
.
first
.
humanize
||
'Select'
)
,
=
dropdown_tag
(
(
protected_tag
.
create_access_levels
.
first
.
humanize
||
'Select'
)
,
options:
{
toggle_class:
'js-allowed-to-create'
,
dropdown_class:
'dropdown-menu-selectable js-allowed-to-create-container'
,
options:
{
toggle_class:
'js-allowed-to-create'
,
dropdown_class:
'dropdown-menu-selectable
capitalize-header
js-allowed-to-create-container'
,
data:
{
field_name:
"allowed_to_create_
#{
protected_tag
.
id
}
"
,
access_level_id:
protected_tag
.
create_access_levels
.
first
.
id
}})
data:
{
field_name:
"allowed_to_create_
#{
protected_tag
.
id
}
"
,
access_level_id:
protected_tag
.
create_access_levels
.
first
.
id
}})
app/views/shared/issuable/form/_metadata.html.haml
View file @
c4094b7e
...
@@ -17,7 +17,10 @@
...
@@ -17,7 +17,10 @@
-
issuable
.
assignees
.
each
do
|
assignee
|
-
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
}
=
dropdown_tag
(
users_dropdown_label
(
issuable
.
assignees
),
options:
issue_dropdown_options
(
issuable
,
true
))
-
if
issuable
.
assignees
.
length
===
0
=
hidden_field_tag
"
#{
issuable
.
to_ability_name
}
[assignee_ids][]"
,
0
,
id:
nil
,
data:
{
meta:
''
}
=
dropdown_tag
(
users_dropdown_label
(
issuable
.
assignees
),
options:
issue_dropdown_options
(
issuable
,
false
))
=
link_to
'Assign to me'
,
'#'
,
class:
"assign-to-me-link
#{
'hide'
if
issuable
.
assignees
.
include?
(
current_user
)
}
"
=
link_to
'Assign to me'
,
'#'
,
class:
"assign-to-me-link
#{
'hide'
if
issuable
.
assignees
.
include?
(
current_user
)
}
"
-
else
-
else
=
form
.
label
:assignee_id
,
"Assignee"
,
class:
"control-label
#{
"col-lg-4"
if
has_due_date
}
"
=
form
.
label
:assignee_id
,
"Assignee"
,
class:
"control-label
#{
"col-lg-4"
if
has_due_date
}
"
...
...
spec/features/issues/form_spec.rb
View file @
c4094b7e
...
@@ -77,11 +77,10 @@ describe 'New/edit issue', feature: true, js: true do
...
@@ -77,11 +77,10 @@ describe 'New/edit issue', feature: true, js: true do
click_link
'Assign to me'
click_link
'Assign to me'
assignee_ids
=
page
.
all
(
'input[name="issue[assignee_ids][]"]'
,
visible:
false
)
assignee_ids
=
page
.
all
(
'input[name="issue[assignee_ids][]"]'
,
visible:
false
)
expect
(
assignee_ids
[
0
].
value
).
to
match
(
user2
.
id
.
to_s
)
expect
(
assignee_ids
[
0
].
value
).
to
match
(
user
.
id
.
to_s
)
expect
(
assignee_ids
[
1
].
value
).
to
match
(
user
.
id
.
to_s
)
page
.
within
'.js-assignee-search'
do
page
.
within
'.js-assignee-search'
do
expect
(
page
).
to
have_content
"
#{
user2
.
name
}
+ 1 more"
expect
(
page
).
to
have_content
user
.
name
end
end
expect
(
find
(
'a'
,
text:
'Assign to me'
,
visible:
false
)).
not_to
be_visible
expect
(
find
(
'a'
,
text:
'Assign to me'
,
visible:
false
)).
not_to
be_visible
...
@@ -109,7 +108,7 @@ describe 'New/edit issue', feature: true, js: true do
...
@@ -109,7 +108,7 @@ describe 'New/edit issue', feature: true, js: true do
page
.
within
'.issuable-sidebar'
do
page
.
within
'.issuable-sidebar'
do
page
.
within
'.assignee'
do
page
.
within
'.assignee'
do
expect
(
page
).
to
have_content
"
2 Assignees
"
expect
(
page
).
to
have_content
"
Assignee
"
end
end
page
.
within
'.milestone'
do
page
.
within
'.milestone'
do
...
@@ -148,12 +147,12 @@ describe 'New/edit issue', feature: true, js: true do
...
@@ -148,12 +147,12 @@ describe 'New/edit issue', feature: true, js: true do
end
end
it
'correctly updates the selected user when changing assignee'
do
it
'correctly updates the selected user when changing assignee'
do
click_button
'
Assignee
'
click_button
'
Unassigned
'
page
.
within
'.dropdown-menu-user'
do
page
.
within
'.dropdown-menu-user'
do
click_link
user
.
name
click_link
user
.
name
end
end
expect
(
find
(
'input[name="issue[assignee_id]"]'
,
visible:
false
).
value
).
to
match
(
user
.
id
.
to_s
)
expect
(
find
(
'input[name="issue[assignee_id
s][
]"]'
,
visible:
false
).
value
).
to
match
(
user
.
id
.
to_s
)
click_button
user
.
name
click_button
user
.
name
...
@@ -167,7 +166,7 @@ describe 'New/edit issue', feature: true, js: true do
...
@@ -167,7 +166,7 @@ describe 'New/edit issue', feature: true, js: true do
click_link
user2
.
name
click_link
user2
.
name
end
end
expect
(
find
(
'input[name="issue[assignee_id]"]'
,
visible:
false
).
value
).
to
match
(
user2
.
id
.
to_s
)
expect
(
find
(
'input[name="issue[assignee_id
s][
]"]'
,
visible:
false
).
value
).
to
match
(
user2
.
id
.
to_s
)
click_button
user2
.
name
click_button
user2
.
name
...
...
spec/features/issues_spec.rb
View file @
c4094b7e
...
@@ -710,7 +710,7 @@ describe 'Issues', feature: true do
...
@@ -710,7 +710,7 @@ describe 'Issues', feature: true do
include
WaitForVueResource
include
WaitForVueResource
it
'updates the title'
,
js:
true
do
it
'updates the title'
,
js:
true
do
issue
=
create
(
:issue
,
author:
@user
,
assignee
:
@user
,
project:
project
,
title:
'new title'
)
issue
=
create
(
:issue
,
author:
@user
,
assignee
s:
[
@user
]
,
project:
project
,
title:
'new title'
)
visit
namespace_project_issue_path
(
project
.
namespace
,
project
,
issue
)
visit
namespace_project_issue_path
(
project
.
namespace
,
project
,
issue
)
...
...
spec/policies/issue_policy_spec.rb
View file @
c4094b7e
...
@@ -15,7 +15,7 @@ describe IssuePolicy, models: true do
...
@@ -15,7 +15,7 @@ describe IssuePolicy, models: true do
context
'a private project'
do
context
'a private project'
do
let
(
:non_member
)
{
create
(
:user
)
}
let
(
:non_member
)
{
create
(
:user
)
}
let
(
:project
)
{
create
(
:empty_project
,
:private
)
}
let
(
:project
)
{
create
(
:empty_project
,
:private
)
}
let
(
:issue
)
{
create
(
:issue
,
project:
project
,
assignee
:
assignee
,
author:
author
)
}
let
(
:issue
)
{
create
(
:issue
,
project:
project
,
assignee
s:
[
assignee
]
,
author:
author
)
}
let
(
:issue_no_assignee
)
{
create
(
:issue
,
project:
project
)
}
let
(
:issue_no_assignee
)
{
create
(
:issue
,
project:
project
)
}
before
do
before
do
...
@@ -69,7 +69,7 @@ describe IssuePolicy, models: true do
...
@@ -69,7 +69,7 @@ describe IssuePolicy, models: true do
end
end
context
'with confidential issues'
do
context
'with confidential issues'
do
let
(
:confidential_issue
)
{
create
(
:issue
,
:confidential
,
project:
project
,
assignee
:
assignee
,
author:
author
)
}
let
(
:confidential_issue
)
{
create
(
:issue
,
:confidential
,
project:
project
,
assignee
s:
[
assignee
]
,
author:
author
)
}
let
(
:confidential_issue_no_assignee
)
{
create
(
:issue
,
:confidential
,
project:
project
)
}
let
(
:confidential_issue_no_assignee
)
{
create
(
:issue
,
:confidential
,
project:
project
)
}
it
'does not allow non-members to read confidential issues'
do
it
'does not allow non-members to read confidential issues'
do
...
@@ -110,7 +110,7 @@ describe IssuePolicy, models: true do
...
@@ -110,7 +110,7 @@ describe IssuePolicy, models: true do
context
'a public project'
do
context
'a public project'
do
let
(
:project
)
{
create
(
:empty_project
,
:public
)
}
let
(
:project
)
{
create
(
:empty_project
,
:public
)
}
let
(
:issue
)
{
create
(
:issue
,
project:
project
,
assignee
:
assignee
,
author:
author
)
}
let
(
:issue
)
{
create
(
:issue
,
project:
project
,
assignee
s:
[
assignee
]
,
author:
author
)
}
let
(
:issue_no_assignee
)
{
create
(
:issue
,
project:
project
)
}
let
(
:issue_no_assignee
)
{
create
(
:issue
,
project:
project
)
}
before
do
before
do
...
@@ -157,7 +157,7 @@ describe IssuePolicy, models: true do
...
@@ -157,7 +157,7 @@ describe IssuePolicy, models: true do
end
end
context
'with confidential issues'
do
context
'with confidential issues'
do
let
(
:confidential_issue
)
{
create
(
:issue
,
:confidential
,
project:
project
,
assignee
:
assignee
,
author:
author
)
}
let
(
:confidential_issue
)
{
create
(
:issue
,
:confidential
,
project:
project
,
assignee
s:
[
assignee
]
,
author:
author
)
}
let
(
:confidential_issue_no_assignee
)
{
create
(
:issue
,
:confidential
,
project:
project
)
}
let
(
:confidential_issue_no_assignee
)
{
create
(
:issue
,
:confidential
,
project:
project
)
}
it
'does not allow guests to read confidential issues'
do
it
'does not allow guests to read confidential issues'
do
...
...
spec/services/members/authorized_destroy_service_spec.rb
View file @
c4094b7e
...
@@ -14,8 +14,8 @@ describe Members::AuthorizedDestroyService, services: true do
...
@@ -14,8 +14,8 @@ describe Members::AuthorizedDestroyService, services: true do
it
"unassigns issues and merge requests"
do
it
"unassigns issues and merge requests"
do
group
.
add_developer
(
member_user
)
group
.
add_developer
(
member_user
)
issue
=
create
:issue
,
project:
group_project
,
assignee
:
member_user
issue
=
create
:issue
,
project:
group_project
,
assignee
s:
[
member_user
]
create
:issue
,
assignee
:
member_user
create
:issue
,
assignee
s:
[
member_user
]
merge_request
=
create
:merge_request
,
target_project:
group_project
,
source_project:
group_project
,
assignee:
member_user
merge_request
=
create
:merge_request
,
target_project:
group_project
,
source_project:
group_project
,
assignee:
member_user
create
:merge_request
,
target_project:
project
,
source_project:
project
,
assignee:
member_user
create
:merge_request
,
target_project:
project
,
source_project:
project
,
assignee:
member_user
...
@@ -33,7 +33,7 @@ describe Members::AuthorizedDestroyService, services: true do
...
@@ -33,7 +33,7 @@ describe Members::AuthorizedDestroyService, services: true do
it
"unassigns issues and merge requests"
do
it
"unassigns issues and merge requests"
do
project
.
team
<<
[
member_user
,
:developer
]
project
.
team
<<
[
member_user
,
:developer
]
create
:issue
,
project:
project
,
assignee
:
member_user
create
:issue
,
project:
project
,
assignee
s:
[
member_user
]
create
:merge_request
,
target_project:
project
,
source_project:
project
,
assignee:
member_user
create
:merge_request
,
target_project:
project
,
source_project:
project
,
assignee:
member_user
member
=
project
.
members
.
find_by
(
user_id:
member_user
.
id
)
member
=
project
.
members
.
find_by
(
user_id:
member_user
.
id
)
...
...
spec/services/users/destroy_service_spec.rb
View file @
c4094b7e
...
@@ -47,7 +47,7 @@ describe Users::DestroyService, services: true do
...
@@ -47,7 +47,7 @@ describe Users::DestroyService, services: true do
end
end
context
"for an issue the user was assigned to"
do
context
"for an issue the user was assigned to"
do
let!
(
:issue
)
{
create
(
:issue
,
project:
project
,
assignee
:
user
)
}
let!
(
:issue
)
{
create
(
:issue
,
project:
project
,
assignee
s:
[
user
]
)
}
before
do
before
do
service
.
execute
(
user
)
service
.
execute
(
user
)
...
@@ -60,7 +60,7 @@ describe Users::DestroyService, services: true do
...
@@ -60,7 +60,7 @@ describe Users::DestroyService, services: true do
it
'migrates the issue so that it is "Unassigned"'
do
it
'migrates the issue so that it is "Unassigned"'
do
migrated_issue
=
Issue
.
find_by_id
(
issue
.
id
)
migrated_issue
=
Issue
.
find_by_id
(
issue
.
id
)
expect
(
migrated_issue
.
assignee
).
to
be_nil
expect
(
migrated_issue
.
assignee
s
).
to
be_nil
end
end
end
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