From 4a75ed08bdf55fe68767176951d9ee77af909264 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa?= Date: Thu, 30 Aug 2018 11:11:03 +0200 Subject: [PATCH] Refactoring wysiwyg mentions service --- .../wysiwyg/wysiwyg-mention.service.coffee | 129 +++++++----------- 1 file changed, 53 insertions(+), 76 deletions(-) diff --git a/app/modules/components/wysiwyg/wysiwyg-mention.service.coffee b/app/modules/components/wysiwyg/wysiwyg-mention.service.coffee index 0e1a2073..9fdfba96 100644 --- a/app/modules/components/wysiwyg/wysiwyg-mention.service.coffee +++ b/app/modules/components/wysiwyg/wysiwyg-mention.service.coffee @@ -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)