gitlab-org--gitlab-foss/app/assets/javascripts/users_select.js.coffee

257 lines
7.9 KiB
CoffeeScript
Raw Normal View History

class @UsersSelect
constructor: ->
@usersPath = "/autocomplete/users.json"
@userPath = "/autocomplete/users/:id.json"
2016-03-07 12:17:11 -05:00
$('.js-user-search').each (i, dropdown) =>
$dropdown = $(dropdown)
@projectId = $dropdown.data('project-id')
@showCurrentUser = $dropdown.data('current-user')
showNullUser = $dropdown.data('null-user')
showAnyUser = $dropdown.data('any-user')
firstUser = $dropdown.data('first-user')
selectedId = $dropdown.data('selected')
defaultLabel = $dropdown.data('default-label')
issueURL = $dropdown.data('issueUpdate')
$selectbox = $dropdown.closest('.selectbox')
$block = $selectbox.closest('.block')
$value = $block.find('.value')
$loading = $block.find('.block-loading').fadeOut()
2016-03-07 12:17:11 -05:00
$dropdown.glDropdown(
2016-03-08 04:09:39 -05:00
data: (term, callback) =>
@users term, (users) =>
if term.length is 0
showDivider = 0
2016-03-08 04:09:39 -05:00
if firstUser
# Move current user to the front of the list
for obj, index in users
if obj.username == firstUser
users.splice(index, 1)
users.unshift(obj)
break
if showNullUser
showDivider += 1
2016-03-08 04:09:39 -05:00
users.unshift(
2016-03-22 05:49:14 -04:00
beforeDivider: true
2016-03-08 04:09:39 -05:00
name: 'Unassigned',
id: 0
)
if showAnyUser
showDivider += 1
2016-03-08 04:09:39 -05:00
name = showAnyUser
name = 'Any User' if name == true
anyUser = {
2016-03-22 05:49:14 -04:00
beforeDivider: true
2016-03-08 04:09:39 -05:00
name: name,
id: null
}
users.unshift(anyUser)
2016-03-07 12:17:11 -05:00
if showDivider
users.splice(showDivider, 0, "divider")
2016-03-07 12:17:11 -05:00
# Send the data back
callback users
filterable: true
2016-03-08 04:09:39 -05:00
filterRemote: true
2016-03-07 12:17:11 -05:00
search:
fields: ['name', 'username']
selectable: true
fieldName: $dropdown.data('field-name')
toggleLabel: (selected) ->
2016-03-18 06:14:39 -04:00
if selected && 'id' of selected
selected.name
else
defaultLabel
hidden: ->
$selectbox.hide()
$value.show()
2016-03-07 12:17:11 -05:00
clicked: ->
page = $('body').data 'page'
isIssueIndex = page is 'projects:issues:index'
isMRIndex = page is page is 'projects:merge_requests:index'
if $dropdown.hasClass('js-filter-submit') and (isIssueIndex or isMRIndex)
Issues.filterResults $dropdown.closest('form')
else if $dropdown.hasClass 'js-filter-submit'
$dropdown.closest('form').submit()
2016-03-15 18:26:50 -04:00
else
selected = $dropdown
.closest('.selectbox')
.find("input[name='#{$dropdown.data('field-name')}']").val()
$loading
.fadeIn()
$.ajax(
type: 'PUT'
url: issueURL
data:
issue:
assignee_id: selected
).done (data) ->
$loading.fadeOut()
$selectbox.hide()
href = $value
.show()
.find('.author')
.text(data.assignee.name)
.end()
.find('a')
.attr('href')
splitHref = href.split('/')
splitHref[splitHref.length - 1] = data.assignee.username
$value
.find('a')
.attr('href',splitHref.join('/'))
2016-03-07 12:17:11 -05:00
renderRow: (user) ->
username = if user.username then "@#{user.username}" else ""
avatar = if user.avatar_url then user.avatar_url else false
2016-03-07 12:17:11 -05:00
selected = if user.id is selectedId then "is-active" else ""
img = ""
2016-03-22 05:49:14 -04:00
if user.beforeDivider?
"<li>
<a href='#' class='#{selected}'>
2016-03-07 12:17:11 -05:00
#{user.name}
2016-03-22 05:49:14 -04:00
</a>
</li>"
else
if avatar
img = "<img src='#{avatar}' class='avatar avatar-inline' width='30' />"
"<li>
<a href='#' class='dropdown-menu-user-link #{selected}'>
#{img}
<strong class='dropdown-menu-user-full-name'>
#{user.name}
</strong>
<span class='dropdown-menu-user-username'>
#{username}
</span>
</a>
</li>"
2016-03-07 12:17:11 -05:00
)
$('.ajax-users-select').each (i, select) =>
@projectId = $(select).data('project-id')
@groupId = $(select).data('group-id')
@showCurrentUser = $(select).data('current-user')
showNullUser = $(select).data('null-user')
showAnyUser = $(select).data('any-user')
showEmailUser = $(select).data('email-user')
firstUser = $(select).data('first-user')
$(select).select2
placeholder: "Search for a user"
multiple: $(select).hasClass('multiselect')
minimumInputLength: 0
query: (query) =>
@users query.term, (users) =>
data = { results: users }
if query.term.length == 0
if firstUser
# Move current user to the front of the list
for obj, index in data.results
if obj.username == firstUser
data.results.splice(index, 1)
data.results.unshift(obj)
break
if showNullUser
nullUser = {
name: 'Unassigned',
id: 0
}
data.results.unshift(nullUser)
if showAnyUser
name = showAnyUser
name = 'Any User' if name == true
anyUser = {
name: name,
id: null
}
data.results.unshift(anyUser)
if showEmailUser && data.results.length == 0 && query.term.match(/^[^@]+@[^@]+$/)
emailUser = {
name: "Invite \"#{query.term}\"",
username: query.term,
id: query.term
}
data.results.unshift(emailUser)
query.callback(data)
initSelection: (args...) =>
@initSelection(args...)
formatResult: (args...) =>
@formatResult(args...)
formatSelection: (args...) =>
@formatSelection(args...)
dropdownCssClass: "ajax-users-dropdown"
escapeMarkup: (m) -> # we do not want to escape markup since we are displaying html in results
m
initSelection: (element, callback) ->
id = $(element).val()
if id == "0"
nullUser = { name: 'Unassigned' }
callback(nullUser)
else if id != ""
@user(id, callback)
formatResult: (user) ->
if user.avatar_url
avatar = user.avatar_url
else
avatar = gon.default_avatar_url
"<div class='user-result #{'no-username' unless user.username}'>
<div class='user-image'><img class='avatar s24' src='#{avatar}'></div>
<div class='user-name'>#{user.name}</div>
<div class='user-username'>#{user.username || ""}</div>
</div>"
2013-03-13 15:37:13 -04:00
formatSelection: (user) ->
2013-03-13 15:42:14 -04:00
user.name
user: (user_id, callback) =>
url = @buildUrl(@userPath)
url = url.replace(':id', user_id)
$.ajax(
url: url
dataType: "json"
).done (user) ->
callback(user)
# Return users list. Filtered by query
# Only active users retrieved
users: (query, callback) =>
url = @buildUrl(@usersPath)
$.ajax(
url: url
data:
search: query
per_page: 20
active: true
project_id: @projectId
group_id: @groupId
current_user: @showCurrentUser
dataType: "json"
).done (users) ->
callback(users)
buildUrl: (url) ->
2015-12-17 07:15:29 -05:00
url = gon.relative_url_root.replace(/\/$/, '') + url if gon.relative_url_root?
return url