Fixed #1543: Emojis support on subjects
parent
2fcfec7b18
commit
e1d9b8d0aa
|
@ -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
|
||||
#############################################################################
|
||||
|
|
|
@ -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) ->
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
)
|
||||
|
|
|
@ -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'])"
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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 ->
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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")
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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) { %>
|
||||
|
|
Loading…
Reference in New Issue