From e1d9b8d0aadc21b34dc88f6772dcc1ba6cbb3e97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Wed, 25 Oct 2017 18:56:09 +0200 Subject: [PATCH] Fixed #1543: Emojis support on subjects --- app/coffee/modules/common/components.coffee | 86 ------------------- app/coffee/modules/related-tasks.coffee | 10 ++- .../belong-to-epics/belong-to-epics-text.jade | 3 +- .../card/card-templates/card-tasks.jade | 3 +- .../card/card-templates/card-title.jade | 2 +- .../detail/header/detail-header.jade | 13 +-- .../epics/dashboard/epic-row/epic-row.jade | 3 +- .../epics/dashboard/story-row/story-row.jade | 3 +- .../related-userstory-row.jade | 3 +- .../home/duties/duty.directive.spec.coffee | 6 ++ app/modules/home/duties/duty.jade | 2 +- .../profile/profile-favs/items/ticket.jade | 12 ++- .../includes/components/backlog-row.jade | 2 +- .../includes/modules/issues-table.jade | 2 +- .../includes/modules/search-result-table.jade | 8 +- app/partials/includes/modules/sprint.jade | 2 +- .../includes/modules/taskboard-table.jade | 2 +- app/partials/task/related-task-row.jade | 2 +- 18 files changed, 50 insertions(+), 114 deletions(-) diff --git a/app/coffee/modules/common/components.coffee b/app/coffee/modules/common/components.coffee index cd341457..e043c05a 100644 --- a/app/coffee/modules/common/components.coffee +++ b/app/coffee/modules/common/components.coffee @@ -495,92 +495,6 @@ DeleteButtonDirective = ($log, $repo, $confirm, $location, $template) -> module.directive("tgDeleteButton", ["$log", "$tgRepo", "$tgConfirm", "$tgLocation", "$tgTemplate", DeleteButtonDirective]) -############################################################################# -## Editable subject directive -############################################################################# - -EditableSubjectDirective = ($rootscope, $repo, $confirm, $loading, $modelTransform, $template) -> - template = $template.get("common/components/editable-subject.html") - - link = ($scope, $el, $attrs, $model) -> - - $scope.$on "object:updated", () -> - $el.find('.edit-subject').hide() - $el.find('.view-subject').show() - - isEditable = -> - return $scope.project.my_permissions.indexOf($attrs.requiredPerm) != -1 - - save = (subject) -> - currentLoading = $loading() - .target($el.find('.save-container')) - .start() - - transform = $modelTransform.save (item) -> - - item.subject = subject - - return item - - transform.then => - $confirm.notify("success") - $rootscope.$broadcast("object:updated") - $el.find('.edit-subject').hide() - $el.find('.view-subject').show() - - transform.then null, -> - $confirm.notify("error") - - transform.finally -> - currentLoading.finish() - - return transform - - $el.click -> - return if not isEditable() - $el.find('.edit-subject').show() - $el.find('.view-subject').hide() - $el.find('input').focus() - - $el.on "click", ".save", (e) -> - e.preventDefault() - - subject = $scope.item.subject - save(subject) - - $el.on "keyup", "input", (event) -> - if event.keyCode == 13 - subject = $scope.item.subject - save(subject) - else if event.keyCode == 27 - $scope.$apply () => $model.$modelValue.revert() - - $el.find('.edit-subject').hide() - $el.find('.view-subject').show() - - $el.find('.edit-subject').hide() - - $scope.$watch $attrs.ngModel, (value) -> - return if not value - $scope.item = value - - if not isEditable() - $el.find('.view-subject .edit').remove() - - $scope.$on "$destroy", -> - $el.off() - - - return { - link: link - restrict: "EA" - require: "ngModel" - template: template - } - -module.directive("tgEditableSubject", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQueueModelTransformation", - "$tgTemplate", EditableSubjectDirective]) - ############################################################################# ## Common list directives ############################################################################# diff --git a/app/coffee/modules/related-tasks.coffee b/app/coffee/modules/related-tasks.coffee index 6faeb43a..5f6fa132 100644 --- a/app/coffee/modules/related-tasks.coffee +++ b/app/coffee/modules/related-tasks.coffee @@ -29,7 +29,7 @@ debounce = @.taiga.debounce module = angular.module("taigaRelatedTasks", []) -RelatedTaskRowDirective = ($repo, $compile, $confirm, $rootscope, $loading, $template, $translate) -> +RelatedTaskRowDirective = ($repo, $compile, $confirm, $rootscope, $loading, $template, $translate, $emojis) -> templateView = $template.get("task/related-task-row.html", true) templateEdit = $template.get("task/related-task-row-edit.html", true) @@ -82,7 +82,11 @@ RelatedTaskRowDirective = ($repo, $compile, $confirm, $rootscope, $loading, $tem delete_task: $scope.project.my_permissions.indexOf("delete_task") != -1 } - $el.html($compile(templateView({task: task, perms: perms}))($scope)) + $el.html($compile(templateView({ + task: task, + perms: perms, + emojify: (text) -> $emojis.replaceEmojiNameByHtmlImgs(_.escape(text)) + }))($scope)) $el.on "click", ".edit-task", -> renderEdit($model.$modelValue) @@ -119,7 +123,7 @@ RelatedTaskRowDirective = ($repo, $compile, $confirm, $rootscope, $loading, $tem return {link:link, require:"ngModel"} module.directive("tgRelatedTaskRow", ["$tgRepo", "$compile", "$tgConfirm", "$rootScope", "$tgLoading", - "$tgTemplate", "$translate", RelatedTaskRowDirective]) + "$tgTemplate", "$translate", "$tgEmojis", RelatedTaskRowDirective]) RelatedTaskCreateFormDirective = ($repo, $compile, $confirm, $tgmodel, $loading, $analytics) -> diff --git a/app/modules/components/belong-to-epics/belong-to-epics-text.jade b/app/modules/components/belong-to-epics/belong-to-epics-text.jade index c9feb9ef..1774aa34 100644 --- a/app/modules/components/belong-to-epics/belong-to-epics-text.jade +++ b/app/modules/components/belong-to-epics/belong-to-epics-text.jade @@ -3,7 +3,8 @@ span.belong-to-epic-text-wrapper(tg-repeat="epic in immutable_epics track by epi a.belong-to-epic-text( href="" tg-nav="project-epics-detail:project=epic.getIn(['project', 'slug']),ref=epic.get('ref')" - ) #{hash}{{epic.get('ref')}} {{epic.get('subject')}} + ng-bind-html="'#'+epic.get('ref')+' '+epic.get('subject') | emojify" + ) span.belong-to-epic-label( ng-style="::{'background-color': epic.get('color')}" translate="EPICS.EPIC" diff --git a/app/modules/components/card/card-templates/card-tasks.jade b/app/modules/components/card/card-templates/card-tasks.jade index d029bc1e..2e694713 100644 --- a/app/modules/components/card/card-templates/card-tasks.jade +++ b/app/modules/components/card/card-templates/card-tasks.jade @@ -4,4 +4,5 @@ ul.card-tasks(ng-if="vm.isRelatedTasksVisible()") href="#" tg-nav="project-tasks-detail:project=vm.project.slug,ref=task.get('ref')", ng-class="{'closed-task': task.get('is_closed'), 'blocked-task': task.get('is_blocked')}" - ) {{"#" + task.get('ref')}} {{task.get('subject')}} + ng-bind-html="'#'+task.get('ref')+' '+task.get('subject') | emojify" + ) diff --git a/app/modules/components/card/card-templates/card-title.jade b/app/modules/components/card/card-templates/card-title.jade index 94df8825..20868a0b 100644 --- a/app/modules/components/card/card-templates/card-title.jade +++ b/app/modules/components/card/card-templates/card-title.jade @@ -6,7 +6,7 @@ h2.card-title title="#{{ ::vm.item.getIn(['model', 'ref']) }} {{ vm.item.getIn(['model', 'subject'])}}" ) span(ng-if="vm.visible('ref')") {{::"#" + vm.item.getIn(['model', 'ref'])}} - span.e2e-title(ng-if="vm.visible('subject')") {{vm.item.getIn(['model', 'subject'])}} + span.e2e-title(ng-if="vm.visible('subject')", ng-bind-html="vm.item.getIn(['model', 'subject']) | emojify") tg-belong-to-epics( format="pill" ng-if="vm.item.getIn(['model', 'epics'])" diff --git a/app/modules/components/detail/header/detail-header.jade b/app/modules/components/detail/header/detail-header.jade index bc59f086..9c1ea6fb 100644 --- a/app/modules/components/detail/header/detail-header.jade +++ b/app/modules/components/detail/header/detail-header.jade @@ -7,10 +7,12 @@ span.detail-subject.e2e-title-subject( ng-click="vm.editSubject(true)" ng-if="vm.permissions.canEdit" - ) {{vm.item.subject}} + ng-bind-html="vm.item.subject | emojify" + ) span.detail-subject.e2e-title-subject( ng-if="!vm.permissions.canEdit" - ) {{vm.item.subject}} + ng-bind-html="vm.item.subject | emojify" + ) a( href="" ng-if="vm.permissions.canEdit" @@ -55,7 +57,7 @@ title="{{'TASK.TITLE_LINK_GO_OWNER' | translate}}" ) span.item-ref {{'#' + vm.item.user_story_extra_info.ref}} - span {{::vm.item.user_story_extra_info.subject}} + span(ng-bind-html="vm.item.user_story_extra_info.subject | emojify") tg-belong-to-epics( ng-if="::vm.item.user_story_extra_info.epics" epics="::vm.item.user_story_extra_info.epics" @@ -69,7 +71,8 @@ ng-repeat="userstory in vm.item.generated_user_stories track by userstory.id" tg-check-permission="view_us" tg-nav="project-userstories-detail:project=vm.project.slug,ref=userstory.ref" - ) {{'#' + userstory.ref}} {{userstory.subject}} + ng-bind-html="'#'+userstory.ref+' '+userstory.subject | emojify" + ) //- Issue origin from github .issue-external-reference(ng-if="vm.item.external_reference") @@ -91,7 +94,7 @@ title="{{'US.TITLE_LINK_GO_TO_ISSUE' | translate}}" ) span.item-ref {{'#' + vm.item.origin_issue.ref}} - span {{vm.item.origin_issue.subject}} + span(ng-bind-html="vm.item.origin_issue.subject | emojify") //- Blocked description .block-desc-container(ng-show="vm.item.is_blocked") diff --git a/app/modules/epics/dashboard/epic-row/epic-row.jade b/app/modules/epics/dashboard/epic-row/epic-row.jade index db4f1147..0cdea845 100644 --- a/app/modules/epics/dashboard/epic-row/epic-row.jade +++ b/app/modules/epics/dashboard/epic-row/epic-row.jade @@ -20,7 +20,8 @@ a( tg-nav="project-epics-detail:project=vm.project.slug,ref=vm.epic.get('ref')" ng-attr-title="{{::vm.epic.get('subject')}}" - ) #{hash}{{::vm.epic.get('ref')}} {{::vm.epic.get('subject')}} + ng-bind-html="'#'+vm.epic.get('ref')+' '+vm.epic.get('subject') | emojify" + ) span.epic-pill( ng-style="::{'background-color': vm.epic.get('color')}" translate="EPICS.EPIC" diff --git a/app/modules/epics/dashboard/story-row/story-row.jade b/app/modules/epics/dashboard/story-row/story-row.jade index ae5bee27..0bb870d0 100644 --- a/app/modules/epics/dashboard/story-row/story-row.jade +++ b/app/modules/epics/dashboard/story-row/story-row.jade @@ -13,7 +13,8 @@ a( tg-nav="project-userstories-detail:project=vm.story.getIn(['project_extra_info', 'slug']),ref=vm.story.get('ref')" ng-attr-title="{{::vm.story.get('subject')}}" - ) #{hash}{{::vm.story.get('ref')}} {{::vm.story.get('subject')}} + ng-bind-html="'#'+vm.story.get('ref')+' '+vm.story.get('subject') | emojify" + ) tg-belong-to-epics( ng-if="vm.story.get('epics')" format="pill" diff --git a/app/modules/epics/related-userstories/related-userstory-row/related-userstory-row.jade b/app/modules/epics/related-userstories/related-userstory-row/related-userstory-row.jade index 9b6fd6f0..61e7ae4b 100644 --- a/app/modules/epics/related-userstories/related-userstory-row/related-userstory-row.jade +++ b/app/modules/epics/related-userstories/related-userstory-row/related-userstory-row.jade @@ -8,7 +8,8 @@ tg-svg.icon-drag( a( tg-nav="project-userstories-detail:project=vm.userstory.getIn(['project_extra_info', 'slug']),ref=vm.userstory.get('ref')" ng-attr-title="{{vm.userstory.get('subject')}}" - ) #{hash}{{vm.userstory.get('ref')}} {{vm.userstory.get('subject')}} + ng-bind-html="'#'+vm.userstory.get('ref')+' '+vm.userstory.get('subject') | emojify" + ) tg-belong-to-epics( format="pill" diff --git a/app/modules/home/duties/duty.directive.spec.coffee b/app/modules/home/duties/duty.directive.spec.coffee index 9ca24ded..afd64195 100644 --- a/app/modules/home/duties/duty.directive.spec.coffee +++ b/app/modules/home/duties/duty.directive.spec.coffee @@ -39,6 +39,11 @@ describe "dutyDirective", () -> return value provide.value "translateFilter", mockTranslateFilter + _mockEmojifyFilter = () -> + mockEmojifyFilter = (value) -> + return value + provide.value "emojifyFilter", mockEmojifyFilter + _mockTgProjectsService = () -> mockTgProjectsService = { projectsById: { @@ -60,6 +65,7 @@ describe "dutyDirective", () -> _mockTgProjectsService() _mockTranslate() _mockTranslateFilter() + _mockEmojifyFilter() return null beforeEach -> diff --git a/app/modules/home/duties/duty.jade b/app/modules/home/duties/duty.jade index 970a3a4c..49766d47 100644 --- a/app/modules/home/duties/duty.jade +++ b/app/modules/home/duties/duty.jade @@ -39,4 +39,4 @@ a.list-itemtype-ticket( ng-if="::vm.duty.get('is_blocked')" title="{{::vm.duty.get('blocked_note')}}" ) {{ 'COMMON.BLOCKED' | translate }} - span {{ ::duty.get('subject') }} + span(ng-bind-html="duty.get('subject') | emojify") diff --git a/app/modules/profile/profile-favs/items/ticket.jade b/app/modules/profile/profile-favs/items/ticket.jade index 60bee680..6db190a7 100644 --- a/app/modules/profile/profile-favs/items/ticket.jade +++ b/app/modules/profile/profile-favs/items/ticket.jade @@ -53,25 +53,29 @@ ng-if="::vm.item.get('type') === 'epic'" tg-nav="project-epics-detail:project=vm.item.get('project_slug'),ref=vm.item.get('ref')" title="#{{ ::vm.item.get('ref') }} {{ ::vm.item.get('subject') }}" - ) {{ ::vm.item.get('subject') }} + ng-bind-html="vm.item.get('subject') | emojify" + ) a.ticket-title( href="#" ng-if="::vm.item.get('type') === 'userstory'" tg-nav="project-userstories-detail:project=vm.item.get('project_slug'),ref=vm.item.get('ref')" title="#{{ ::vm.item.get('ref') }} {{ ::vm.item.get('subject') }}" - ) {{ ::vm.item.get('subject') }} + ng-bind-html="vm.item.get('subject') | emojify" + ) a.ticket-title( href="#" ng-if="::vm.item.get('type') === 'task'" tg-nav="project-tasks-detail:project=vm.item.get('project_slug'),ref=vm.item.get('ref')" title="#{{ ::vm.item.get('ref') }} {{ ::vm.item.get('subject') }}" - ) {{ ::vm.item.get('subject') }} + ng-bind-html="vm.item.get('subject') | emojify" + ) a.ticket-title( href="#" ng-if="::vm.item.get('type') === 'issue'" tg-nav="project-issues-detail:project=vm.item.get('project_slug'),ref=vm.item.get('ref')" title="#{{ ::vm.item.get('ref') }} {{ ::vm.item.get('subject') }}" - ) {{ ::vm.item.get('subject') }} + ng-bind-html="vm.item.get('subject') | emojify" + ) div.list-itemtype-track span.list-itemtype-track-likers( diff --git a/app/partials/includes/components/backlog-row.jade b/app/partials/includes/components/backlog-row.jade index e3fafd2d..10af8afe 100644 --- a/app/partials/includes/components/backlog-row.jade +++ b/app/partials/includes/components/backlog-row.jade @@ -26,7 +26,7 @@ title="#{{ us.ref }} {{ us.subject }}" ) span(tg-bo-ref="us.ref") - span(ng-bind="us.subject") + span(ng-bind-html="us.subject | emojify") tg-belong-to-epics( format="pill" ng-if="us.epics" diff --git a/app/partials/includes/modules/issues-table.jade b/app/partials/includes/modules/issues-table.jade index c1a5fcfe..3a3e35c0 100644 --- a/app/partials/includes/modules/issues-table.jade +++ b/app/partials/includes/modules/issues-table.jade @@ -53,7 +53,7 @@ section.issues-table.basic-table(ng-class="{empty: !issues.length}") ng-if="issue.is_blocked" title="{{issue.blocked_note}}" ) {{'ISSUES.TABLE.BLOCKED' | translate}} - span(ng-bind="issue.subject") + span(ng-bind-html="issue.subject | emojify") div.issue-field(tg-issue-status-inline-edition="issue") diff --git a/app/partials/includes/modules/search-result-table.jade b/app/partials/includes/modules/search-result-table.jade index f794f480..3c889e38 100644 --- a/app/partials/includes/modules/search-result-table.jade +++ b/app/partials/includes/modules/search-result-table.jade @@ -14,7 +14,7 @@ script(type="text/ng-template", id="search-issues") div.user-stories div.user-story-name a(href="", tg-nav="project-issues-detail:project=project.slug,ref=issue.ref", - tg-bo-bind="issue.subject") + tg-bind-html="issue.subject | emojify") div.status(tg-listitem-issue-status="issue") div.assigned-to(tg-listitem-assignedto="issue") @@ -34,7 +34,7 @@ script(type="text/ng-template", id="search-epics") div.user-stories div.user-story-name a(href="", tg-nav="project-epics-detail:project=project.slug,ref=epic.ref", - tg-bo-bind="epic.subject") + tg-bind-html="epic.subject | emojify") div.status(tg-listitem-epic-status="epic") div.empty-search-results(ng-class="{'hidden': epics.length}") @@ -56,7 +56,7 @@ script(type="text/ng-template", id="search-userstories") div.user-stories div.user-story-name a(href="", tg-nav="project-userstories-detail:project=project.slug,ref=us.ref", - tg-bo-bind="us.subject") + tg-bind-html="us.subject | emojify") div.sprint div.sprint-link a(href="", tg-nav="project-taskboard:project=project.slug,sprint=us.milestone_slug", @@ -81,7 +81,7 @@ script(type="text/ng-template", id="search-tasks") div.user-stories div.user-story-name a(href="", tg-nav="project-tasks-detail:project=project.slug,ref=task.ref", - tg-bo-bind="task.subject") + tg-bind-html="task.subject | emojify") div.status(tg-listitem-task-status="task") div.assigned-to(tg-listitem-assignedto="task") diff --git a/app/partials/includes/modules/sprint.jade b/app/partials/includes/modules/sprint.jade index 429db948..6ed9f428 100644 --- a/app/partials/includes/modules/sprint.jade +++ b/app/partials/includes/modules/sprint.jade @@ -18,7 +18,7 @@ div.sprint-table(tg-bind-scope, ng-class="{'sprint-empty-wrapper': !sprint.user_ tg-bo-title="'#' + us.ref + ' ' + us.subject", ng-class="{closed: us.is_closed, blocked: us.is_blocked}") span(tg-bo-ref="us.ref") - span(tg-bo-bind="us.subject") + span(tg-bind-html="us.subject | emojify") tg-belong-to-epics( format="pill" ng-if="us.epics" diff --git a/app/partials/includes/modules/taskboard-table.jade b/app/partials/includes/modules/taskboard-table.jade index 1b7bad37..1da302f6 100644 --- a/app/partials/includes/modules/taskboard-table.jade +++ b/app/partials/includes/modules/taskboard-table.jade @@ -53,7 +53,7 @@ div.taskboard-table( tg-nav-get-params="{\"milestone\": {{us.milestone}}}", tg-bo-title="'#' + us.ref + ' ' + us.subject") span.us-ref(tg-bo-ref="us.ref") - span(ng-bind="us.subject") + span(ng-bind-html="us.subject | emojify") tg-belong-to-epics( format="pill" ng-if="us.epics" diff --git a/app/partials/task/related-task-row.jade b/app/partials/task/related-task-row.jade index 83fec325..cde848b1 100644 --- a/app/partials/task/related-task-row.jade +++ b/app/partials/task/related-task-row.jade @@ -2,7 +2,7 @@ a.clickable( tg-nav="project-tasks-detail:project=project.slug,ref=task.ref") span #<%- task.ref %> - span(ng-non-bindable) <%- task.subject %> + span(ng-non-bindable) <%= emojify(task.subject) %> .task-settings <% if(perms.modify_task) { %>