Browse Source

Merge branch 'edge' of github.com:wekan/wekan into edge

Lauri Ojansivu 6 years ago
parent
commit
c5e72d1a2b

+ 6 - 0
client/components/activities/activities.jade

@@ -114,6 +114,12 @@ template(name="boardActivities")
         if($eq activityType 'removedLabel')
           | {{{_ 'activity-removed-label' lastLabel cardLink}}}.
 
+        if($eq activityType 'setCustomField')
+          | {{{_ 'activity-set-customfield' lastCustomField lastCustomFieldValue cardLink}}}.
+
+        if($eq activityType 'unsetCustomField')
+          | {{{_ 'activity-unset-customfield' lastCustomField cardLink}}}.
+
         if($eq activityType 'unjoinMember')
           if($eq user._id member._id)
             | {{{_ 'activity-unjoined' cardLink}}}.

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

@@ -82,6 +82,24 @@ BlazeComponent.extendComponent({
     }
   },
 
+  lastCustomField(){
+    const lastCustomField = CustomFields.findOne(this.currentData().customFieldId);
+    return lastCustomField.name;
+  },
+
+  lastCustomFieldValue(){
+    const lastCustomField = CustomFields.findOne(this.currentData().customFieldId);
+    const value = this.currentData().value;
+    if (lastCustomField.settings.dropdownItems && lastCustomField.settings.dropdownItems.length > 0) {
+      const dropDownValue = _.find(lastCustomField.settings.dropdownItems, (item) => {
+        return item._id === value;
+      });
+      if (dropDownValue)
+        return dropDownValue.name;
+    }
+    return value;
+  },
+
   listLabel() {
     return this.currentData().list().title;
   },

+ 2 - 0
i18n/en.i18n.json

@@ -567,6 +567,8 @@
     "activity-added-label-card": "added label '%s'",
     "activity-removed-label-card": "removed label '%s'",
     "activity-delete-attach-card": "deleted an attachment",
+    "activity-set-customfield": "set custom field '%s' to '%s' in %s",
+    "activity-unset-customfield": "unset custom field '%s' in %s",
     "r-rule": "Rule",
     "r-add-trigger": "Add trigger",
     "r-add-action": "Add action",

+ 55 - 0
models/cards.js

@@ -1400,6 +1400,56 @@ function cardLabels(userId, doc, fieldNames, modifier) {
   }
 }
 
+function cardCustomFields(userId, doc, fieldNames, modifier) {
+  if (!_.contains(fieldNames, 'customFields'))
+    return;
+
+  // Say hello to the new customField value
+  if (modifier.$set) {
+    _.each(modifier.$set, (value, key) => {
+      if (key.startsWith('customFields')) {
+        const dotNotation = key.split('.');
+
+        // only individual changes are registered
+        if (dotNotation.length > 1) {
+          const customFieldId = doc.customFields[dot_notation[1]]._id;
+          const act = {
+            userId,
+            customFieldId,
+            value,
+            activityType: 'setCustomField',
+            boardId: doc.boardId,
+            cardId: doc._id,
+          };
+          Activities.insert(act);
+        }
+      }
+    });
+  }
+
+  // Say goodbye to the former customField value
+  if (modifier.$unset) {
+    _.each(modifier.$unset, (value, key) => {
+      if (key.startsWith('customFields')) {
+        const dotNotation = key.split('.');
+
+        // only individual changes are registered
+        if (dotNotation.length > 1) {
+          const customFieldId = doc.customFields[dot_notation[1]]._id;
+          const act = {
+            userId,
+            customFieldId,
+            activityType: 'unsetCustomField',
+            boardId: doc.boardId,
+            cardId: doc._id,
+          };
+          Activities.insert(act);
+        }
+      }
+    });
+  }
+}
+
 function cardCreation(userId, doc) {
   Activities.insert({
     userId,
@@ -1471,6 +1521,11 @@ if (Meteor.isServer) {
     cardLabels(userId, doc, fieldNames, modifier);
   });
 
+  // Add a new activity if we edit a custom field
+  Cards.before.update((userId, doc, fieldNames, modifier) => {
+    cardCustomFields(userId, doc, fieldNames, modifier);
+  });
+
   // Remove all activities associated with a card if we remove the card
   // Remove also card_comments / checklists / attachments
   Cards.after.remove((userId, doc) => {