Răsfoiți Sursa

Merge pull request #3945 from syndimann/master

Feature: Adds Card Comment Reactions
Lauri Ojansivu 4 ani în urmă
părinte
comite
508c7b7a90
73 a modificat fișierele cu 374 adăugiri și 74 ștergeri
  1. 1 0
      .eslintrc.json
  2. 20 3
      client/components/activities/activities.jade
  3. 54 0
      client/components/activities/activities.js
  4. 54 1
      client/components/activities/activities.styl
  5. 2 1
      i18n/ar-EG.i18n.json
  6. 2 1
      i18n/ar.i18n.json
  7. 2 1
      i18n/bg.i18n.json
  8. 2 1
      i18n/br.i18n.json
  9. 2 1
      i18n/ca.i18n.json
  10. 2 1
      i18n/cs.i18n.json
  11. 2 1
      i18n/da.i18n.json
  12. 2 1
      i18n/de-CH.i18n.json
  13. 2 1
      i18n/de.i18n.json
  14. 2 1
      i18n/el.i18n.json
  15. 2 1
      i18n/en-GB.i18n.json
  16. 2 1
      i18n/en-IT.i18n.json
  17. 1 0
      i18n/en.i18n.json
  18. 2 1
      i18n/eo.i18n.json
  19. 2 1
      i18n/es-AR.i18n.json
  20. 2 1
      i18n/es-CL.i18n.json
  21. 2 1
      i18n/es-LA.i18n.json
  22. 2 1
      i18n/es-MX.i18n.json
  23. 2 1
      i18n/es-PE.i18n.json
  24. 2 1
      i18n/es-PY.i18n.json
  25. 2 1
      i18n/es.i18n.json
  26. 2 1
      i18n/eu.i18n.json
  27. 2 1
      i18n/fa-IR.i18n.json
  28. 2 1
      i18n/fa.i18n.json
  29. 2 1
      i18n/fi.i18n.json
  30. 2 1
      i18n/fr.i18n.json
  31. 2 1
      i18n/gl.i18n.json
  32. 2 1
      i18n/he.i18n.json
  33. 2 1
      i18n/hi.i18n.json
  34. 2 1
      i18n/hr.i18n.json
  35. 2 1
      i18n/hu.i18n.json
  36. 2 1
      i18n/hy.i18n.json
  37. 2 1
      i18n/id.i18n.json
  38. 2 1
      i18n/ig.i18n.json
  39. 2 1
      i18n/it.i18n.json
  40. 2 1
      i18n/ja.i18n.json
  41. 2 1
      i18n/ka.i18n.json
  42. 2 1
      i18n/km.i18n.json
  43. 2 1
      i18n/ko.i18n.json
  44. 2 1
      i18n/lt.i18n.json
  45. 2 1
      i18n/lv.i18n.json
  46. 2 1
      i18n/mk.i18n.json
  47. 2 1
      i18n/mn.i18n.json
  48. 2 1
      i18n/nb.i18n.json
  49. 2 1
      i18n/nl.i18n.json
  50. 2 1
      i18n/oc.i18n.json
  51. 2 1
      i18n/pa.i18n.json
  52. 2 1
      i18n/pl.i18n.json
  53. 2 1
      i18n/pt-BR.i18n.json
  54. 2 1
      i18n/pt.i18n.json
  55. 2 1
      i18n/ro.i18n.json
  56. 2 1
      i18n/ru.i18n.json
  57. 2 1
      i18n/sk.i18n.json
  58. 2 1
      i18n/sl.i18n.json
  59. 2 1
      i18n/sr.i18n.json
  60. 2 1
      i18n/sv.i18n.json
  61. 2 1
      i18n/sw.i18n.json
  62. 2 1
      i18n/ta.i18n.json
  63. 2 1
      i18n/th.i18n.json
  64. 2 1
      i18n/tr.i18n.json
  65. 2 1
      i18n/uk.i18n.json
  66. 2 1
      i18n/vi.i18n.json
  67. 2 1
      i18n/zh-CN.i18n.json
  68. 2 1
      i18n/zh-HK.i18n.json
  69. 2 1
      i18n/zh-TW.i18n.json
  70. 59 0
      models/cardCommentReactions.js
  71. 47 5
      models/cardComments.js
  72. 5 0
      server/publications/boards.js
  73. 5 1
      server/publications/cards.js

+ 1 - 0
.eslintrc.json

@@ -122,6 +122,7 @@
     "Activities": true,
     "Attachments": true,
     "Boards": true,
+    "CardCommentReactions": true,
     "CardComments": true,
     "DatePicker": true,
     "Cards": true,

+ 20 - 3
client/components/activities/activities.jade

@@ -21,6 +21,22 @@ template(name="editOrDeleteComment")
   = ' - '
   a.js-delete-comment {{_ "delete"}}
 
+template(name="commentReactions")
+  .reactions
+    each reaction in reactions
+      span.reaction(class="{{#if isSelected reaction.userIds}}selected{{/if}}" data-codepoint="#{reaction.reactionCodepoint}" title="{{userNames reaction.userIds}}")
+        span.reaction-codepoint !{reaction.reactionCodepoint}
+        span.reaction-count #{reaction.userIds.length}
+    if (currentUser.isBoardMember)
+      a.open-comment-reaction-popup(title="{{_ 'addReactionPopup-title'}}")
+        i.fa.fa-smile-o
+        i.fa.fa-plus
+
+template(name="addReactionPopup")
+  .reactions-popup
+    each codepoint in codepoints
+      span.add-comment-reaction(data-codepoint="#{codepoint}") !{codepoint}
+
 template(name="activity")
   .activity
     +userAvatar(userId=activity.user._id)
@@ -124,6 +140,7 @@ template(name="activity")
             .activity-comment
               +viewer
                 = activity.comment.text
+            +commentReactions(reactions=activity.comment.reactions commentId=activity.comment._id)
             span(title=activity.createdAt).activity-meta {{ moment activity.createdAt }}
               if($eq currentUser._id activity.comment.userId)
                 +editOrDeleteComment
@@ -150,20 +167,20 @@ template(name="activity")
 
         if($eq activity.activityType 'a-startAt')
           | {{{_ 'activity-startDate' (sanitize startDate) cardLink}}}.
-        
+
         if($eq activity.activityType 'a-dueAt')
           | {{{_ 'activity-dueDate' (sanitize dueDate) cardLink}}}.
 
         if($eq activity.activityType 'a-endAt')
           | {{{_ 'activity-endDate' (sanitize endDate) cardLink}}}.
-      
+
       if($eq mode 'board')
         if($eq activity.activityType 'a-receivedAt')
           | {{{_ 'activity-receivedDate' (sanitize receivedDate) cardLink}}}.
 
         if($eq activity.activityType 'a-startAt')
           | {{{_ 'activity-startDate' (sanitize startDate) cardLink}}}.
-        
+
         if($eq activity.activityType 'a-dueAt')
           | {{{_ 'activity-dueDate' (sanitize dueDate) cardLink}}}.
 

+ 54 - 0
client/components/activities/activities.js

@@ -240,6 +240,60 @@ Template.activity.helpers({
   },
 });
 
+Template.commentReactions.events({
+  'click .reaction'(event) {
+    if (Meteor.user().isBoardMember()) {
+      const codepoint = event.currentTarget.dataset['codepoint'];
+      const commentId = Template.instance().data.commentId;
+      const cardComment = CardComments.findOne({_id: commentId});
+      cardComment.toggleReaction(codepoint);
+    }
+  },
+  'click .open-comment-reaction-popup': Popup.open('addReaction'),
+})
+
+Template.addReactionPopup.events({
+  'click .add-comment-reaction'(event) {
+    if (Meteor.user().isBoardMember()) {
+      const codepoint = event.currentTarget.dataset['codepoint'];
+      const commentId = Template.instance().data.commentId;
+      const cardComment = CardComments.findOne({_id: commentId});
+      cardComment.toggleReaction(codepoint);
+    }
+    Popup.close();
+  },
+})
+
+Template.addReactionPopup.helpers({
+  codepoints() {
+    // Starting set of unicode codepoints as comment reactions
+    return [
+      '👍',
+      '👎',
+      '👀',
+      '✅',
+      '❌',
+      '🙏',
+      '👏',
+      '🎉',
+      '🚀',
+      '😊',
+      '🤔',
+      '😔'];
+  }
+})
+
+Template.commentReactions.helpers({
+  isSelected(userIds) {
+    return userIds.includes(Meteor.user()._id);
+  },
+  userNames(userIds) {
+    return Users.find({_id: {$in: userIds}})
+                .map(user => user.profile.fullname)
+                .join(', ');
+  }
+})
+
 function createCardLink(card) {
   if (!card) return '';
   return (

+ 54 - 1
client/components/activities/activities.styl

@@ -5,6 +5,20 @@
   display: flex
   justify-content:space-between
 
+.reactions-popup
+  .add-comment-reaction
+    display: inline-block
+    cursor: pointer
+    border-radius: 5px
+    font-size: 22px
+    text-align: center
+    line-height: 30px
+    width: 40px
+
+    &:hover {
+      background-color: #b0c4de
+    }
+
 .activities
   clear: both
 
@@ -18,7 +32,7 @@
       height: @width
 
     .activity-member
-      font-weight: 700      
+      font-weight: 700
 
     .activity-desc
       word-wrap: break-word
@@ -39,6 +53,45 @@
         margin-top: 5px
         padding: 5px
 
+      .reactions
+        display: flex
+        margin-top: 5px
+        gap: 5px
+
+        .open-comment-reaction-popup
+          display: flex
+          align-items: center
+          text-decoration: none
+          height: 24px;
+
+          i.fa.fa-smile-o
+            font-size: 17px
+            font-weight: 500
+            margin-left: 2px
+
+          i.fa.fa-plus
+            font-size: 8px;
+            margin-top: -7px;
+            margin-left: 1px;
+
+        .reaction
+          cursor: pointer
+          border: 1px solid grey
+          border-radius: 15px
+          display: flex
+          padding: 2px 5px
+
+          &.selected {
+            background-color: #b0c4de
+          }
+
+          &:hover {
+            background-color: #b0c4de
+          }
+
+          .reaction-count
+            font-size: 12px
+
       .activity-checklist
         display: block
         border-radius: 3px

+ 2 - 1
i18n/ar-EG.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/ar.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "تغيير تاريخ البدء",
     "editCardDueDatePopup-title": "تغيير تاريخ الاستحقاق",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "تعديل العلامة",
     "editNotificationPopup-title": "تصحيح الإشعار",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/bg.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Промени началната дата",
     "editCardDueDatePopup-title": "Промени датата за готовност",
     "editCustomFieldPopup-title": "Промени Полето",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Промени изработеното време",
     "editLabelPopup-title": "Промяна на Етикета",
     "editNotificationPopup-title": "Промени известията",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/br.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/ca.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Canvia data d'inici",
     "editCardDueDatePopup-title": "Canvia data de finalització",
     "editCustomFieldPopup-title": "Modificar camp",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Canvia temps dedicat",
     "editLabelPopup-title": "Canvia etiqueta",
     "editNotificationPopup-title": "Edita la notificació",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/cs.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Změnit datum startu úkolu",
     "editCardDueDatePopup-title": "Změnit datum dokončení úkolu",
     "editCustomFieldPopup-title": "Upravit pole",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Změnit strávený čas",
     "editLabelPopup-title": "Změnit štítek",
     "editNotificationPopup-title": "Změnit notifikace",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimalizovat kartu",
     "delete-org-warning-message": "Tuto organizaci není možné smazat, protože do ní patří uživatel(é)",
     "delete-team-warning-message": "Tento tým není možné smazat, protože do nej patří uživatel(é)"
-}
+}

+ 2 - 1
i18n/da.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Skift startdato",
     "editCardDueDatePopup-title": "Skift forfaldsdato",
     "editCustomFieldPopup-title": "Redigér felt",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Tilpas forbrugt tid",
     "editLabelPopup-title": "Skift etikette",
     "editNotificationPopup-title": "Redigér notifikation",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/de-CH.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Startdatum ändern",
     "editCardDueDatePopup-title": "Fälligkeitsdatum ändern",
     "editCustomFieldPopup-title": "Feld bearbeiten",
+    "addReactionPopup-title": "Reaktion hinzufügen",
     "editCardSpentTimePopup-title": "Aufgewendete Zeit ändern",
     "editLabelPopup-title": "Label ändern",
     "editNotificationPopup-title": "Benachrichtigung ändern",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Karte minimieren",
     "delete-org-warning-message": "Diese Organisation kann nicht gelöscht werden. Zumindest ein Benutzer ist ihr noch zugehörig.",
     "delete-team-warning-message": "Dieses Team kann nicht gelöscht werden. Zumindest ein Benutzer ist ihm noch zugehörig."
-}
+}

+ 2 - 1
i18n/de.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Startdatum ändern",
     "editCardDueDatePopup-title": "Fälligkeitsdatum ändern",
     "editCustomFieldPopup-title": "Feld bearbeiten",
+    "addReactionPopup-title": "Reaktion hinzufügen",
     "editCardSpentTimePopup-title": "Aufgewendete Zeit ändern",
     "editLabelPopup-title": "Label ändern",
     "editNotificationPopup-title": "Benachrichtigung ändern",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Karte minimieren",
     "delete-org-warning-message": "Diese Organisation kann nicht gelöscht werden, da wenigstens ein Nutzer dazu gehört.",
     "delete-team-warning-message": "Dieses Team kann nicht gelöscht werden, da wenigstens ein Nutzer dazu gehört."
-}
+}

+ 2 - 1
i18n/el.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Αλλαγή ημερομηνίας έναρξης",
     "editCardDueDatePopup-title": "Αλλαγή ημερομηνίας λήξης προθεσμίας",
     "editCustomFieldPopup-title": "Επεξεργασία Πεδίου",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Αλλαγή δαπανηθέντος χρόνου",
     "editLabelPopup-title": "Αλλαγή Ετικέτας",
     "editNotificationPopup-title": "Επεξεργασία Ειδοποίησης",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/en-GB.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/en-IT.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 1 - 0
i18n/en.i18n.json

@@ -322,6 +322,7 @@
   "editCardStartDatePopup-title": "Change start date",
   "editCardDueDatePopup-title": "Change due date",
   "editCustomFieldPopup-title": "Edit Field",
+  "addReactionPopup-title": "Add reaction",
   "editCardSpentTimePopup-title": "Change spent time",
   "editLabelPopup-title": "Change Label",
   "editNotificationPopup-title": "Edit Notification",

+ 2 - 1
i18n/eo.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Redakti komencdaton",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Ŝanĝi etikedon",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/es-AR.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Cambiar fecha de inicio",
     "editCardDueDatePopup-title": "Cambiar fecha de vencimiento",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Agregar reacción",
     "editCardSpentTimePopup-title": "Cambiar tiempo empleado",
     "editLabelPopup-title": "Cambiar Etiqueta",
     "editNotificationPopup-title": "Editar Notificación",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/es-CL.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Cambiar la fecha de comienzo",
     "editCardDueDatePopup-title": "Cambiar la fecha de vencimiento",
     "editCustomFieldPopup-title": "Editar el campo",
+    "addReactionPopup-title": "Agregar reacción",
     "editCardSpentTimePopup-title": "Cambiar el tiempo consumido",
     "editLabelPopup-title": "Cambiar la etiqueta",
     "editNotificationPopup-title": "Editar las notificaciones",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/es-LA.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/es-MX.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/es-PE.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Cambiar la fecha de inicio",
     "editCardDueDatePopup-title": "Cambiar la fecha de vencimiento",
     "editCustomFieldPopup-title": "Editar el campo",
+    "addReactionPopup-title": "Agregar reacción",
     "editCardSpentTimePopup-title": "Cambiar el tiempo consumido",
     "editLabelPopup-title": "Cambiar la etiqueta",
     "editNotificationPopup-title": "Editar las notificaciones",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/es-PY.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/es.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Cambiar la fecha de comienzo",
     "editCardDueDatePopup-title": "Cambiar la fecha de vencimiento",
     "editCustomFieldPopup-title": "Editar el campo",
+    "addReactionPopup-title": "Agregar reacción",
     "editCardSpentTimePopup-title": "Cambiar el tiempo consumido",
     "editLabelPopup-title": "Cambiar la etiqueta",
     "editNotificationPopup-title": "Editar las notificaciones",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/eu.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Aldatu hasiera data",
     "editCardDueDatePopup-title": "Aldatu epemuga data",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Aldatu erabilitako denbora",
     "editLabelPopup-title": "Aldatu etiketa",
     "editNotificationPopup-title": "Editatu jakinarazpena",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/fa-IR.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/fa.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "تغییر تاریخ آغاز",
     "editCardDueDatePopup-title": "تغییر تاریخ پایان",
     "editCustomFieldPopup-title": "ویرایش فیلد",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "تغییر زمان صرف شده",
     "editLabelPopup-title": "تغیر لیبل",
     "editNotificationPopup-title": "اصلاح اعلان",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/fi.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Muokkaa aloituspäivää",
     "editCardDueDatePopup-title": "Muokkaa eräpäivää",
     "editCustomFieldPopup-title": "Muokkaa kenttää",
+    "addReactionPopup-title": "Lisää reaktio",
     "editCardSpentTimePopup-title": "Muuta käytettyä aikaa",
     "editLabelPopup-title": "Muokkaa nimilappua",
     "editNotificationPopup-title": "Muokkaa ilmoituksia",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Pienennä kortti",
     "delete-org-warning-message": "Ei voi poistaa tätä organisaatiota, ainakin yksi käyttäjä kuuluu siihen",
     "delete-team-warning-message": "Ei voi poistaa tätä tiimiä, ainakin yksi käyttäjä kuuluu siihen"
-}
+}

+ 2 - 1
i18n/fr.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Modifier la date de début",
     "editCardDueDatePopup-title": "Modifier la date d'échéance",
     "editCustomFieldPopup-title": "Éditer le champ personnalisé",
+    "addReactionPopup-title": "Ajouter une réaction",
     "editCardSpentTimePopup-title": "Modifier le temps passé",
     "editLabelPopup-title": "Modifier l'étiquette",
     "editNotificationPopup-title": "Modifier la notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimiser la carte",
     "delete-org-warning-message": "Impossible de supprimer cette organisation, au moins un utilisateur lui appartient",
     "delete-team-warning-message": "Impossible de supprimer cette équipe, au moins un utilisateur lui appartient"
-}
+}

+ 2 - 1
i18n/gl.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Cambiar a data de inicio",
     "editCardDueDatePopup-title": "Cambiar a data límite",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Cambiar a etiqueta",
     "editNotificationPopup-title": "Editar a notificación",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/he.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "שינוי מועד התחלה",
     "editCardDueDatePopup-title": "שינוי מועד סיום",
     "editCustomFieldPopup-title": "עריכת שדה",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "שינוי הזמן שהושקע",
     "editLabelPopup-title": "שינוי תווית",
     "editNotificationPopup-title": "שינוי דיווח",
@@ -1060,4 +1061,4 @@
     "minimize-card": "מזעור כרטיס",
     "delete-org-warning-message": "לא ניתן למחוק את הארגון הזה, יש לפחות משתמש אחד ששייך אליו",
     "delete-team-warning-message": "לא ניתן למחוק את הצוות הזה, יש לפחות משתמש אחד ששייך אליו"
-}
+}

+ 2 - 1
i18n/hi.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "संपादित करें Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "संपादित करें Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/hr.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Promijeni datum početka",
     "editCardDueDatePopup-title": "Promijeni datum dospijeća",
     "editCustomFieldPopup-title": "Uredi polje",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Promijeni oznaku",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/hu.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Kezdődátum megváltoztatása",
     "editCardDueDatePopup-title": "Határidő dátumának megváltoztatása",
     "editCustomFieldPopup-title": "Mező szerkesztése",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Eltöltött idő megváltoztatása",
     "editLabelPopup-title": "Címke megváltoztatása",
     "editNotificationPopup-title": "Értesítés szerkesztése",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/hy.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/id.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Ubah tanggal mulai",
     "editCardDueDatePopup-title": "Ubah tanggal selesai",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Ubah Label",
     "editNotificationPopup-title": "Sunting Pemberitahuan",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/ig.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/it.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Cambia data di inizio",
     "editCardDueDatePopup-title": "Cambia data di scadenza",
     "editCustomFieldPopup-title": "Modifica campo",
+    "addReactionPopup-title": "Aggiungi reazione",
     "editCardSpentTimePopup-title": "Cambia tempo trascorso",
     "editLabelPopup-title": "Modifica etichetta",
     "editNotificationPopup-title": "Modifica notifiche",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/ja.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "開始日の変更",
     "editCardDueDatePopup-title": "期限の変更",
     "editCustomFieldPopup-title": "フィールドを編集",
+    "addReactionPopup-title": "反応を追加します",
     "editCardSpentTimePopup-title": "作業時間の変更",
     "editLabelPopup-title": "ラベルの変更",
     "editNotificationPopup-title": "通知の変更",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/ka.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "დაწყების დროის შეცვლა",
     "editCardDueDatePopup-title": "შეცვალეთ დედლაინი",
     "editCustomFieldPopup-title": "ველების შესწორება",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "დახარჯული დროის შეცვლა",
     "editLabelPopup-title": "ნიშნის შეცვლა",
     "editNotificationPopup-title": "შეტყობინებების შესწორება",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/km.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/ko.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "시작일 변경",
     "editCardDueDatePopup-title": "종료일 변경",
     "editCustomFieldPopup-title": "필드 수정",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "라벨 변경",
     "editNotificationPopup-title": "알림 수정",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/lt.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/lv.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Mainīt sākuma datumu",
     "editCardDueDatePopup-title": "Mainīt termiņu",
     "editCustomFieldPopup-title": "Labot lauku",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Mainīt patērēto laiku",
     "editLabelPopup-title": "Mainīt birku",
     "editNotificationPopup-title": "Labot ziņojumu",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/mk.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Промени началната дата",
     "editCardDueDatePopup-title": "Промени датата за готовност",
     "editCustomFieldPopup-title": "Промени Полето",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Промени изработеното време",
     "editLabelPopup-title": "Промяна на Етикета",
     "editNotificationPopup-title": "Промени известията",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/mn.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Эхлэх өдрийг өөрчлөх",
     "editCardDueDatePopup-title": "Дуусах өдрийг өөрчлөх",
     "editCustomFieldPopup-title": "Талбарыг засварлах",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Зарцуулсан хугацааг засварлах",
     "editLabelPopup-title": "Шошгыг өөрчлөх",
     "editNotificationPopup-title": "Мэдэгдэл тохируулах",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/nb.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Endre start dato",
     "editCardDueDatePopup-title": "Endre forfallsdato",
     "editCustomFieldPopup-title": "Redigere felt",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Endre forbrukt tid",
     "editLabelPopup-title": "Endre Etikett",
     "editNotificationPopup-title": "Endre Varsel",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimer Kort",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/nl.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Wijzig start datum",
     "editCardDueDatePopup-title": "Wijzig vervaldatum",
     "editCustomFieldPopup-title": "Wijzig Veld",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Verander gespendeerde tijd",
     "editLabelPopup-title": "Wijzig label",
     "editNotificationPopup-title": "Wijzig notificatie",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimaliseer Kaart",
     "delete-org-warning-message": "Kan deze organisatie niet verwijderen want er is nog minimaal 1 gebruiker lid van.",
     "delete-team-warning-message": "Kan dit team niet verwijderen want er is nog minimaal 1 gebruiker lid van."
-}
+}

+ 2 - 1
i18n/oc.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Cambiar la data de debuta",
     "editCardDueDatePopup-title": "Cambiar la data de fin",
     "editCustomFieldPopup-title": "Modificar los camps",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Cambiar lo temp passat",
     "editLabelPopup-title": "Cambiar l'etiqueta",
     "editNotificationPopup-title": "Modificar la notificacion",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/pa.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/pl.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Zmień datę rozpoczęcia",
     "editCardDueDatePopup-title": "Zmień datę wykonania",
     "editCustomFieldPopup-title": "Edytuj pole",
+    "addReactionPopup-title": "Dodaj reakcję",
     "editCardSpentTimePopup-title": "Zmień ilość przepracowanego czasu",
     "editLabelPopup-title": "Zmień etykietę",
     "editNotificationPopup-title": "Zmień tryb powiadamiania",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/pt-BR.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Altera data de início",
     "editCardDueDatePopup-title": "Altera prazo final",
     "editCustomFieldPopup-title": "Editar campo",
+    "addReactionPopup-title": "Adicionar reação",
     "editCardSpentTimePopup-title": "Editar tempo gasto",
     "editLabelPopup-title": "Alterar Etiqueta",
     "editNotificationPopup-title": "Editar Notificações",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimizar Cartão",
     "delete-org-warning-message": "Não é possível excluir esta organização. Existe pelo menos um usuário que pertence a ela.",
     "delete-team-warning-message": "Não é possível excluir este time. Existe pelo menos um usuário que pertence a ele."
-}
+}

+ 2 - 1
i18n/pt.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Alterar a data de início",
     "editCardDueDatePopup-title": "Alterar a data limite",
     "editCustomFieldPopup-title": "Editar Campo",
+    "addReactionPopup-title": "Adicionar reação",
     "editCardSpentTimePopup-title": "Alterar o tempo gasto",
     "editLabelPopup-title": "Alterar a Etiqueta",
     "editNotificationPopup-title": "Editar a Notificação",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimizar Cartão",
     "delete-org-warning-message": "Não pode apagar esta organização, tem no mínimo um utilizador associado",
     "delete-team-warning-message": "Não pode apagar esta equipa, tem no mínimo um utilizador associado"
-}
+}

+ 2 - 1
i18n/ro.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/ru.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Изменить дату начала",
     "editCardDueDatePopup-title": "Изменить дату выполнения",
     "editCustomFieldPopup-title": "Редактировать поле",
+    "addReactionPopup-title": "Добавить реакцию",
     "editCardSpentTimePopup-title": "Изменить затраченное время",
     "editLabelPopup-title": "Изменить метки",
     "editNotificationPopup-title": "Редактировать уведомления",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Минимизировать карточку",
     "delete-org-warning-message": "Невозможно удалить эту организацию, она включает в себя как минимум одного пользователя",
     "delete-team-warning-message": "Невозможно удалить эту команду, она включает в себя как минимум одного пользователя"
-}
+}

+ 2 - 1
i18n/sk.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimalizovať kartu",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/sl.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Spremeni začetni datum",
     "editCardDueDatePopup-title": "Spremeni datum zapadlosti",
     "editCustomFieldPopup-title": "Uredi polje",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Spremeni porabljen čas",
     "editLabelPopup-title": "Spremeni oznako",
     "editNotificationPopup-title": "Uredi obvestilo",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/sr.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Izmeni početni datum",
     "editCardDueDatePopup-title": "Izmeni krajnji datum",
     "editCustomFieldPopup-title": "Izmeni polje",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Izmeni oznaku",
     "editNotificationPopup-title": "Izmeni obaveštenje",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/sv.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Ändra startdatum",
     "editCardDueDatePopup-title": "Ändra förfallodatum",
     "editCustomFieldPopup-title": "Redigera fält",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Ändra spenderad tid",
     "editLabelPopup-title": "Ändra etikett",
     "editNotificationPopup-title": "Redigera notis",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/sw.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/ta.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/th.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "เปลี่ยนวันเริ่มต้น",
     "editCardDueDatePopup-title": "เปลี่ยนวันครบกำหนด",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "เปลี่ยนป้ายกำกับ",
     "editNotificationPopup-title": "แก้ไขการแจ้งเตือน",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/tr.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Başlangıç tarihini değiştir",
     "editCardDueDatePopup-title": "Bitiş tarihini değiştir",
     "editCustomFieldPopup-title": "Alanı düzenle",
+    "addReactionPopup-title": "Reaksiyon ekle",
     "editCardSpentTimePopup-title": "Harcanan zamanı değiştir",
     "editLabelPopup-title": "Etiket Değiştir",
     "editNotificationPopup-title": "Bildirimi değiştir",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/uk.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/vi.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Thay đổi ngày bắt đầu",
     "editCardDueDatePopup-title": "Thay đổi ngày đến hạn",
     "editCustomFieldPopup-title": "Sửa Trường",
+    "addReactionPopup-title": "Thêm phản ứng",
     "editCardSpentTimePopup-title": "Thay đổi thời gian đã sử dụng",
     "editLabelPopup-title": "Thay đổi nhãn",
     "editNotificationPopup-title": "Sửa Thông báo",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/zh-CN.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "修改起始日期",
     "editCardDueDatePopup-title": "修改截止日期",
     "editCustomFieldPopup-title": "编辑字段",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "修改耗时",
     "editLabelPopup-title": "更改标签",
     "editNotificationPopup-title": "编辑通知",
@@ -1060,4 +1061,4 @@
     "minimize-card": "最小化卡片",
     "delete-org-warning-message": "无法删除该组织,至少还有一个用户属于该组织。",
     "delete-team-warning-message": "无法删除该团队,至少还有一个用户属于该团队。"
-}
+}

+ 2 - 1
i18n/zh-HK.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "Change start date",
     "editCardDueDatePopup-title": "Change due date",
     "editCustomFieldPopup-title": "Edit Field",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "Change spent time",
     "editLabelPopup-title": "Change Label",
     "editNotificationPopup-title": "Edit Notification",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 2 - 1
i18n/zh-TW.i18n.json

@@ -322,6 +322,7 @@
     "editCardStartDatePopup-title": "變更開始日期",
     "editCardDueDatePopup-title": "變更到期日期",
     "editCustomFieldPopup-title": "編輯欄位",
+    "addReactionPopup-title": "Add reaction",
     "editCardSpentTimePopup-title": "變更耗費時間",
     "editLabelPopup-title": "更改標籤",
     "editNotificationPopup-title": "更改通知",
@@ -1060,4 +1061,4 @@
     "minimize-card": "Minimize Card",
     "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it",
     "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it"
-}
+}

+ 59 - 0
models/cardCommentReactions.js

@@ -0,0 +1,59 @@
+const commentReactionSchema = new SimpleSchema({
+  reactionCodepoint: { type: String, optional: false },
+  userIds: { type: [String], defaultValue: [] }
+});
+
+CardCommentReactions = new Mongo.Collection('card_comment_reactions');
+
+/**
+ * All reactions of a card comment
+ */
+CardCommentReactions.attachSchema(
+  new SimpleSchema({
+    boardId: {
+      /**
+       * the board ID
+       */
+      type: String,
+      optional: false
+    },
+    cardId: {
+      /**
+       * the card ID
+       */
+      type: String,
+      optional: false
+    },
+    cardCommentId: {
+      /**
+       * the card comment ID
+       */
+      type: String,
+      optional: false
+    },
+    reactions: {
+      type: [commentReactionSchema],
+      defaultValue: []
+    }
+  }),
+);
+
+CardCommentReactions.allow({
+  insert(userId, doc) {
+    return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
+  },
+  update(userId, doc) {
+    return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
+  },
+  remove(userId, doc) {
+    return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
+  },
+  fetch: ['boardId'],
+});
+
+
+if (Meteor.isServer) {
+  Meteor.startup(() => {
+    CardCommentReactions._collection._ensureIndex({ cardCommentId: 1 }, { unique: true });
+  });
+}

+ 47 - 5
models/cardComments.js

@@ -93,6 +93,48 @@ CardComments.helpers({
   user() {
     return Users.findOne(this.userId);
   },
+
+  reactions() {
+    const cardCommentReactions = CardCommentReactions.findOne({cardCommentId: this._id});
+    return !!cardCommentReactions ? cardCommentReactions.reactions : [];
+  },
+
+  toggleReaction(reactionCodepoint) {
+
+    const cardCommentReactions = CardCommentReactions.findOne({cardCommentId: this._id});
+    const reactions = !!cardCommentReactions ? cardCommentReactions.reactions : [];
+    const userId = Meteor.userId();
+    const reaction = reactions.find(r => r.reactionCodepoint === reactionCodepoint);
+
+    // If no reaction is set for the codepoint, add this
+    if (!reaction) {
+      reactions.push({ reactionCodepoint, userIds: [userId] });
+    } else {
+
+      // toggle user reaction upon previous reaction state
+      const userHasReacted = reaction.userIds.includes(userId);
+      if (userHasReacted) {
+        reaction.userIds.splice(reaction.userIds.indexOf(userId), 1);
+        if (reaction.userIds.length === 0) {
+          reactions.splice(reactions.indexOf(reaction), 1);
+        }
+      } else {
+        reaction.userIds.push(userId);
+      }
+    }
+
+    // If no reaction doc exists yet create otherwise update reaction set
+    if (!!cardCommentReactions) {
+      return CardCommentReactions.update({ _id: cardCommentReactions._id }, { $set: { reactions } });
+    } else {
+      return CardCommentReactions.insert({
+        boardId: this.boardId,
+        cardCommentId: this._id,
+        cardId: this.cardId,
+        reactions
+      });
+    }
+  }
 });
 
 CardComments.hookOptions.after.update = { fetchPrevious: false };
@@ -187,7 +229,7 @@ if (Meteor.isServer) {
    *                comment: string,
    *                authorId: string}]
    */
-  JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/comments', function(
+  JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/comments', function (
     req,
     res,
   ) {
@@ -200,7 +242,7 @@ if (Meteor.isServer) {
         data: CardComments.find({
           boardId: paramBoardId,
           cardId: paramCardId,
-        }).map(function(doc) {
+        }).map(function (doc) {
           return {
             _id: doc._id,
             comment: doc.text,
@@ -228,7 +270,7 @@ if (Meteor.isServer) {
   JsonRoutes.add(
     'GET',
     '/api/boards/:boardId/cards/:cardId/comments/:commentId',
-    function(req, res) {
+    function (req, res) {
       try {
         const paramBoardId = req.params.boardId;
         Authentication.checkBoardAccess(req.userId, paramBoardId);
@@ -264,7 +306,7 @@ if (Meteor.isServer) {
   JsonRoutes.add(
     'POST',
     '/api/boards/:boardId/cards/:cardId/comments',
-    function(req, res) {
+    function (req, res) {
       try {
         const paramBoardId = req.params.boardId;
         Authentication.checkBoardAccess(req.userId, paramBoardId);
@@ -310,7 +352,7 @@ if (Meteor.isServer) {
   JsonRoutes.add(
     'DELETE',
     '/api/boards/:boardId/cards/:cardId/comments/:commentId',
-    function(req, res) {
+    function (req, res) {
       try {
         const paramBoardId = req.params.boardId;
         Authentication.checkBoardAccess(req.userId, paramBoardId);

+ 5 - 0
server/publications/boards.js

@@ -129,6 +129,7 @@ Meteor.publishRelations('board', function(boardId, isArchived) {
       this.cursor(Lists.find({ boardId, archived: isArchived }));
       this.cursor(Swimlanes.find({ boardId, archived: isArchived }));
       this.cursor(Integrations.find({ boardId }));
+      this.cursor(CardCommentReactions.find({ boardId }));
       this.cursor(
         CustomFields.find(
           { boardIds: { $in: [boardId] } },
@@ -161,6 +162,8 @@ Meteor.publishRelations('board', function(boardId, isArchived) {
       // Gather queries and send in bulk
       const cardComments = this.join(CardComments);
       cardComments.selector = _ids => ({ cardId: _ids });
+      const cardCommentReactions = this.join(CardCommentReactions);
+      cardCommentReactions.selector = _ids => ({ cardId: _ids });
       const attachments = this.join(Attachments);
       attachments.selector = _ids => ({ cardId: _ids });
       const checklists = this.join(Checklists);
@@ -194,12 +197,14 @@ Meteor.publishRelations('board', function(boardId, isArchived) {
           checklists.push(cardId);
           checklistItems.push(cardId);
           parentCards.push(cardId);
+          cardCommentReactions.push(cardId)
         },
       );
 
       // Send bulk queries for all found ids
       subCards.send();
       cardComments.send();
+      cardCommentReactions.send();
       attachments.send();
       checklists.send();
       checklistItems.send();

+ 5 - 1
server/publications/cards.js

@@ -5,6 +5,7 @@ import Lists from '../../models/lists';
 import Swimlanes from '../../models/swimlanes';
 import Cards from '../../models/cards';
 import CardComments from '../../models/cardComments';
+import CardCommentReactions from '../../models/cardCommentReactions';
 import Attachments from '../../models/attachments';
 import Checklists from '../../models/checklists';
 import ChecklistItems from '../../models/checklistItems';
@@ -699,6 +700,8 @@ function findCards(sessionId, query) {
       type: 1,
     };
 
+    const comments = CardComments.find({ cardId: { $in: cards.map(c => c._id) } });
+
     return [
       cards,
       Boards.find(
@@ -714,7 +717,8 @@ function findCards(sessionId, query) {
       Users.find({ _id: { $in: users } }, { fields: Users.safeFields }),
       Checklists.find({ cardId: { $in: cards.map(c => c._id) } }),
       Attachments.find({ cardId: { $in: cards.map(c => c._id) } }),
-      CardComments.find({ cardId: { $in: cards.map(c => c._id) } }),
+      comments,
+      CardCommentReactions.find({cardCommentId: {$in: comments.map(c => c._id) }}),
       SessionData.find({ userId, sessionId }),
     ];
   }