Refactoring wysiwyg mentions service

stable
Daniel García 2018-08-30 11:11:03 +02:00 committed by Alex Hermida
parent 3e3187dc0a
commit 4a75ed08bd
1 changed files with 53 additions and 76 deletions

View File

@ -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)