Refactoring wysiwyg mentions service
parent
3e3187dc0a
commit
4a75ed08bd
|
@ -32,82 +32,7 @@ class WysiwygMentionService
|
|||
|
||||
constructor: (@projectService, @wysiwygService, @navurls, @rs) ->
|
||||
@.cancelablePromise = null
|
||||
|
||||
searchEmoji: (name, cb) ->
|
||||
filteredEmojis = @wysiwygService.searchEmojiByName(name)
|
||||
filteredEmojis = filteredEmojis.slice(0, 10)
|
||||
|
||||
cb(filteredEmojis)
|
||||
|
||||
searchUser: (term, cb) ->
|
||||
searchProps = ['username', 'full_name', 'full_name_display']
|
||||
|
||||
users = @projectService.project.toJS().members.filter (user) =>
|
||||
for prop in searchProps
|
||||
if taiga.slugify(user[prop]).indexOf(term) >= 0
|
||||
return true
|
||||
else if user[prop].indexOf(term) >= 0
|
||||
return true
|
||||
|
||||
return false
|
||||
|
||||
users = users.slice(0, 10).map (it) =>
|
||||
it.url = @navurls.resolve('user-profile', {
|
||||
project: @projectService.project.get('slug'),
|
||||
username: it.username
|
||||
})
|
||||
|
||||
return it
|
||||
|
||||
cb(users)
|
||||
|
||||
searchItem: (term) ->
|
||||
return new Promise (resolve, reject) =>
|
||||
term = taiga.slugify(term)
|
||||
|
||||
searchTypes = ['issues', 'tasks', 'userstories']
|
||||
|
||||
urls = {
|
||||
issues: "project-issues-detail",
|
||||
tasks: "project-tasks-detail",
|
||||
userstories: "project-userstories-detail"
|
||||
}
|
||||
|
||||
searchProps = ['ref', 'subject']
|
||||
|
||||
filter = (item) =>
|
||||
for prop in searchProps
|
||||
if taiga.slugify(item[prop]).indexOf(term) >= 0
|
||||
return true
|
||||
return false
|
||||
|
||||
@.cancelablePromise.abort() if @.cancelablePromise
|
||||
|
||||
@.cancelablePromise = @rs.search.do(@projectService.project.get('id'), term)
|
||||
|
||||
@.cancelablePromise.then (res) =>
|
||||
# ignore wikipages if they're the only results. can't exclude them in search
|
||||
if res.count < 1 or res.count == res.wikipages.length
|
||||
resolve([])
|
||||
else
|
||||
result = []
|
||||
for type in searchTypes
|
||||
if res[type] and res[type].length > 0
|
||||
items = res[type].filter(filter)
|
||||
items = items.map (it) =>
|
||||
it.url = @navurls.resolve(urls[type], {
|
||||
project: @projectService.project.get('slug'),
|
||||
ref: it.ref
|
||||
})
|
||||
|
||||
return it
|
||||
|
||||
result = result.concat(items)
|
||||
|
||||
result = _.sortBy result, ["ref"]
|
||||
|
||||
resolve(result.slice(0, 10))
|
||||
|
||||
@.projectSlug = @projectService.project.get('slug')
|
||||
|
||||
search: (mention) ->
|
||||
return new Promise (resolve) =>
|
||||
|
@ -118,5 +43,57 @@ class WysiwygMentionService
|
|||
else if ':'.indexOf(mention[0]) != -1
|
||||
@.searchEmoji(mention.replace(':', ''), resolve)
|
||||
|
||||
searchItem: (term) ->
|
||||
return new Promise (resolve, reject) =>
|
||||
term = taiga.slugify(term)
|
||||
|
||||
filter = (item) ->
|
||||
return ['subject', 'ref'].some((attr) ->
|
||||
taiga.slugify(item[attr]).indexOf(term) >= 0
|
||||
)
|
||||
|
||||
@rs.search.do(@projectService.project.get('id'), term).then (res) =>
|
||||
result = []
|
||||
if !res.count or res.count == res.wikipages.length
|
||||
resolve(result)
|
||||
else
|
||||
typeURLs = {
|
||||
issues: 'project-issues-detail'
|
||||
userstories: 'project-userstories-detail'
|
||||
tasks: 'project-tasks-detail'
|
||||
}
|
||||
|
||||
for type in ['issues', 'tasks', 'userstories']
|
||||
if not res[type]
|
||||
continue
|
||||
items = res[type].filter(filter).map (item) =>
|
||||
item.url = @navurls.resolve(typeURLs[type], {
|
||||
project: @.projectSlug,
|
||||
ref: item.ref
|
||||
})
|
||||
return item
|
||||
result = result.concat(items)
|
||||
resolve(_.sortBy(result, ["ref"]).slice(0, 10))
|
||||
|
||||
searchUser: (term, callback) ->
|
||||
users = @projectService.project.toJS().members.filter (user) ->
|
||||
return ['username', 'full_name', 'full_name_display'].some((attr) ->
|
||||
taiga.slugify(user[attr]).indexOf(term) >= 0 || user[attr].indexOf(term) >= 0
|
||||
)
|
||||
|
||||
users = users.slice(0, 10).map (item) =>
|
||||
item.url = @navurls.resolve('user-profile', {
|
||||
project: @.projectSlug,
|
||||
username: item.username
|
||||
})
|
||||
return item
|
||||
|
||||
callback(users)
|
||||
|
||||
searchEmoji: (name, callback) ->
|
||||
filteredEmojis = @wysiwygService.searchEmojiByName(name)
|
||||
filteredEmojis = filteredEmojis.slice(0, 10)
|
||||
|
||||
callback(filteredEmojis)
|
||||
|
||||
angular.module("taigaComponents").service("tgWysiwygMentionService", WysiwygMentionService)
|
||||
|
|
Loading…
Reference in New Issue