2
0
Эх сурвалжийг харах

Merge branch 'Angtrim-feature-rules' into devel

Lauri Ojansivu 6 жил өмнө
parent
commit
c1b4aae573

+ 27 - 1
client/components/rules/actions/boardActions.jade

@@ -36,7 +36,33 @@ template(name="boardActions")
       div.trigger-text 
         | {{_'r-card'}}
     div.trigger-button.js-add-arch-action.js-goto-rules
-      i.fa.fa-plus  
+      i.fa.fa-plus
+
+  div.trigger-item
+    div.trigger-content
+      div.trigger-text 
+        | {{_'r-add-swimlane'}}
+      div.trigger-dropdown
+        input(id="swimlane-name",type=text,placeholder="{{_'r-name'}}")
+    div.trigger-button.js-add-swimlane-action.js-goto-rules
+      i.fa.fa-plus
+
+  div.trigger-item
+    div.trigger-content
+      div.trigger-text 
+        | {{_'r-create-card'}}
+      div.trigger-dropdown
+        input(id="card-name",type=text,placeholder="{{_'r-name'}}")
+      div.trigger-text 
+        | {{_'r-in-list'}}
+      div.trigger-dropdown
+        input(id="list-name",type=text,placeholder="{{_'r-name'}}")
+      div.trigger-text 
+        | {{_'r-in-swimlane'}}
+      div.trigger-dropdown
+        input(id="swimlane-name2",type=text,placeholder="{{_'r-name'}}")
+    div.trigger-button.js-create-card-action.js-goto-rules
+      i.fa.fa-plus
 
 
    

+ 46 - 0
client/components/rules/actions/boardActions.js

@@ -5,6 +5,52 @@ BlazeComponent.extendComponent({
 
   events() {
     return [{
+      'click .js-create-card-action' (event) {
+        const ruleName = this.data().ruleName.get();
+        const trigger = this.data().triggerVar.get();
+        const cardName = this.find('#card-name').value;
+        const listName = this.find('#list-name').value;
+        const swimlaneName = this.find('#swimlane-name2').value;
+        const boardId = Session.get('currentBoard');
+        const desc = Utils.getTriggerActionDesc(event, this);
+        const triggerId = Triggers.insert(trigger);
+        const actionId = Actions.insert({
+          actionType: 'createCard',
+          swimlaneName,
+          cardName,
+          listName,
+          boardId,
+          desc,
+        });
+        Rules.insert({
+          title: ruleName,
+          triggerId,
+          actionId,
+          boardId,
+        });
+
+      },
+      'click .js-add-swimlane-action' (event) {
+        const ruleName = this.data().ruleName.get();
+        const trigger = this.data().triggerVar.get();
+        const swimlaneName = this.find('#swimlane-name').value;
+        const boardId = Session.get('currentBoard');
+        const desc = Utils.getTriggerActionDesc(event, this);
+        const triggerId = Triggers.insert(trigger);
+        const actionId = Actions.insert({
+          actionType: 'addSwimlane',
+          swimlaneName,
+          boardId,
+          desc,
+        });
+        Rules.insert({
+          title: ruleName,
+          triggerId,
+          actionId,
+          boardId,
+        });
+
+      },
       'click .js-add-spec-move-action' (event) {
         const ruleName = this.data().ruleName.get();
         const trigger = this.data().triggerVar.get();

+ 19 - 0
client/components/rules/actions/checklistActions.jade

@@ -43,6 +43,25 @@ template(name="checklistActions")
     div.trigger-button.js-add-check-item-action.js-goto-rules
       i.fa.fa-plus
 
+  div.trigger-item
+      div.trigger-content
+        div.trigger-text 
+          | {{{_'r-add-checklist'}}}
+        div.trigger-dropdown
+          input(id="checklist-name-3",type=text,placeholder="{{{_'r-name'}}}")
+        div.trigger-text 
+          | {{{_'r-with-items'}}}
+        div.trigger-dropdown
+          input(id="checklist-items",type=text,placeholder="{{{_'r-items-list'}}}")    
+      div.trigger-button.js-add-checklist-items-action.js-goto-rules
+        i.fa.fa-plus  
+
+  div.trigger-item
+      div.trigger-content
+        div.trigger-text 
+          | {{{_'r-checklist-note'}}}
+
+
 
    
   

+ 23 - 0
client/components/rules/actions/checklistActions.js

@@ -4,6 +4,29 @@ BlazeComponent.extendComponent({
   },
   events() {
     return [{
+      'click .js-add-checklist-items-action' (event) {
+        const ruleName = this.data().ruleName.get();
+        const trigger = this.data().triggerVar.get();
+        const checklistName = this.find('#checklist-name-3').value;
+        const checklistItems = this.find('#checklist-items').value;
+        const boardId = Session.get('currentBoard');
+        const desc = Utils.getTriggerActionDesc(event, this);
+        const triggerId = Triggers.insert(trigger);
+        const actionId = Actions.insert({
+          actionType: 'addChecklistWithItems',
+          checklistName,
+          checklistItems,
+          boardId,
+          desc,
+        });
+        Rules.insert({
+          title: ruleName,
+          triggerId,
+          actionId,
+          boardId,
+        });
+
+      },
       'click .js-add-checklist-action' (event) {
         const ruleName = this.data().ruleName.get();
         const trigger = this.data().triggerVar.get();

+ 15 - 1
client/components/rules/rules.styl

@@ -10,7 +10,10 @@
   	display: inline-block
   	float: left
   	margin: revert
-
+.hide-element
+  display:none !important
+.user-details
+  display:inline-block 
 .rules-btns-group
   position: absolute
   right: 0
@@ -120,6 +123,15 @@
             .trigger-text
               font-size: 16px
               display:inline-block
+            .trigger-inline-button
+              font-size: 16px
+              display: inline;
+              padding: 6px;
+              border: 1px solid #eee
+              border-radius: 4px
+              box-shadow: inset -1px -1px 3px rgba(0,0,0,.05) 
+              &:hover, &.is-active
+                box-shadow: 0 0 0 2px darken(white, 60%) inset
             .trigger-text.trigger-text-email
               margin-left: 5px;
               margin-top: 10px;
@@ -160,6 +172,8 @@
             box-shadow: 0 0 0 2px darken(white, 60%) inset
         .trigger-button.trigger-button-email
           top:30px
+        .trigger-button.trigger-button-person
+          right:-40px
       .trigger-item.trigger-item-mail
         height:300px
   

+ 28 - 1
client/components/rules/rulesMain.js

@@ -9,7 +9,13 @@ BlazeComponent.extendComponent({
   setTrigger() {
     this.rulesCurrentTab.set('trigger');
   },
-
+  sanitizeObject(obj){
+    Object.keys(obj).forEach((key) => {
+      if(obj[key] === '' || obj[key] === undefined){
+        obj[key] = '*';
+      }}
+    );
+  },
   setRulesList() {
     this.rulesCurrentTab.set('rulesList');
   },
@@ -42,8 +48,27 @@ BlazeComponent.extendComponent({
       },
       'click .js-goto-action' (event) {
         event.preventDefault();
+        // Add user to the trigger
+        const username = $(event.currentTarget.offsetParent).find('.user-name').val();
+        let trigger = this.triggerVar.get();
+        trigger.userId = '*';
+        if(username !== undefined ){
+          const userFound = Users.findOne({username});
+          if(userFound !== undefined){
+            trigger.userId = userFound._id;
+            this.triggerVar.set(trigger);
+          }
+        }
+        // Sanitize trigger
+        trigger = this.triggerVar.get();
+        this.sanitizeObject(trigger);
+        this.triggerVar.set(trigger);
         this.setAction();
       },
+      'click .js-show-user-field' (event) {
+        event.preventDefault();
+        $(event.currentTarget.offsetParent).find('.user-details').removeClass('hide-element');
+      },
       'click .js-goto-rules' (event) {
         event.preventDefault();
         this.setRulesList();
@@ -68,3 +93,5 @@ BlazeComponent.extendComponent({
   },
 
 }).register('rulesMain');
+
+

+ 74 - 25
client/components/rules/triggers/boardTriggers.jade

@@ -1,43 +1,58 @@
 template(name="boardTriggers")
-  div.trigger-item
+  div.trigger-item#trigger-two
     div.trigger-content
       div.trigger-text 
-        | {{_'r-when-a-card-is'}}
-      div.trigger-dropdown
-        select(id="gen-action")
-          option(value="created") {{_'r-added-to'}}
-          option(value="removed") {{_'r-removed-from'}}
+        | {{_'r-when-a-card'}}
+      div.trigger-inline-button.js-open-card-title-popup 
+        i.fa.fa-filter
       div.trigger-text 
-        | {{_'r-the-board'}}
-    div.trigger-button.js-add-gen-trigger.js-goto-action
-      i.fa.fa-plus
-
-  div.trigger-item
-    div.trigger-content
+        | {{_'r-is'}}
       div.trigger-text 
-        | {{_'r-when-a-card-is'}}
-      div.trigger-dropdown
-        select(id="create-action")
-          option(value="created") {{_'r-added-to'}}
-          option(value="removed") {{_'r-removed-from'}}
+        | {{_'r-added-to'}}
       div.trigger-text 
         | {{_'r-list'}}
       div.trigger-dropdown
-        input(id="create-list-name",type=text,placeholder="{{_'r-list-name'}}")  
+        input(id="create-list-name",type=text,placeholder="{{_'r-list-name'}}")
+      div.trigger-text 
+        | {{_'r-swimlane'}}
+      div.trigger-dropdown
+        input(id="create-swimlane-name",type=text,placeholder="{{_'r-swimlane-name'}}") 
+      div.trigger-button.trigger-button-person.js-show-user-field
+        i.fa.fa-user
+      div.user-details.hide-element
+        div.trigger-text
+          | {{_'r-by'}}
+        div.trigger-dropdown
+          input(class="user-name",type=text,placeholder="{{_'r-user-name'}}")     
     div.trigger-button.js-add-create-trigger.js-goto-action
       i.fa.fa-plus
 
-  div.trigger-item
+  div.trigger-item#trigger-three
     div.trigger-content
       div.trigger-text 
-        | {{_'r-when-a-card-is-moved'}}
+        | {{_'r-when-a-card'}}
+      div.trigger-inline-button.js-open-card-title-popup 
+        i.fa.fa-filter
+      div.trigger-text 
+        | {{_'r-is-moved'}}
+      div.trigger-button.trigger-button-person.js-show-user-field
+        i.fa.fa-user
+      div.user-details.hide-element
+        div.trigger-text
+          | {{_'r-by'}}
+        div.trigger-dropdown
+          input(class="user-name",type=text,placeholder="{{_'r-user-name'}}")
     div.trigger-button.js-add-gen-moved-trigger.js-goto-action
       i.fa.fa-plus
 
-  div.trigger-item
+  div.trigger-item#trigger-four
     div.trigger-content
       div.trigger-text 
-        | {{_'r-when-a-card-is'}}
+        | {{_'r-when-a-card'}}
+      div.trigger-inline-button.js-open-card-title-popup 
+        i.fa.fa-filter
+      div.trigger-text 
+        | {{_'r-is'}}
       div.trigger-dropdown
         select(id="move-action")
           option(value="moved-to") {{_'r-moved-to'}}
@@ -45,21 +60,55 @@ template(name="boardTriggers")
       div.trigger-text 
         | {{_'r-list'}}
       div.trigger-dropdown
-        input(id="move-list-name",type=text,placeholder="{{_'r-list-name'}}")  
+        input(id="move-list-name",type=text,placeholder="{{_'r-list-name'}}")
+      div.trigger-text 
+        | {{_'r-swimlane'}}
+      div.trigger-dropdown
+        input(id="create-swimlane-name",type=text,placeholder="{{_'r-swimlane-name'}}") 
+      div.trigger-button.trigger-button-person.js-show-user-field  
+      div.trigger-button.trigger-button-person.js-show-user-field
+        i.fa.fa-user
+      div.user-details.hide-element
+        div.trigger-text
+          | {{_'r-by'}}
+        div.trigger-dropdown
+          input(class="user-name",type=text,placeholder="{{_'r-user-name'}}")
     div.trigger-button.js-add-moved-trigger.js-goto-action
       i.fa.fa-plus
 
-  div.trigger-item
+  div.trigger-item#trigger-five
     div.trigger-content
       div.trigger-text 
-        | {{_'r-when-a-card-is'}}
+        | {{_'r-when-a-card'}}
+      div.trigger-inline-button.js-open-card-title-popup 
+        i.fa.fa-filter
+      div.trigger-text 
+        | {{_'r-is'}}
       div.trigger-dropdown
         select(id="arch-action")
           option(value="archived") {{_'r-archived'}}
           option(value="unarchived") {{_'r-unarchived'}}
+      div.trigger-button.trigger-button-person.js-show-user-field
+        i.fa.fa-user
+      div.user-details.hide-element
+        div.trigger-text
+          | {{_'r-by'}}
+        div.trigger-dropdown
+          input(class="user-name",type=text,placeholder="{{_'r-user-name'}}")
     div.trigger-button.js-add-arch-trigger.js-goto-action
       i.fa.fa-plus
 
+  div.trigger-item
+      div.trigger-content
+        div.trigger-text 
+          | {{{_'r-board-note'}}}
+
+template(name="boardCardTitlePopup")
+    form
+      label
+        | Card Title Filter
+        input.js-card-filter-name(type="text" value=title autofocus)
+      input.js-card-filter-button.primary.wide(type="submit" value="{{_ 'set-filter'}}")
 
    
   

+ 40 - 41
client/components/rules/triggers/boardTriggers.js

@@ -1,59 +1,45 @@
 BlazeComponent.extendComponent({
   onCreated() {
-
+    this.provaVar = new ReactiveVar('');
+    this.currentPopupTriggerId = 'def';
+    this.cardTitleFilters = {};
+  },
+  setNameFilter(name){
+    this.cardTitleFilters[this.currentPopupTriggerId] =  name;
   },
 
   events() {
     return [{
-      'click .js-add-gen-trigger' (event) {
-        const desc = Utils.getTriggerActionDesc(event, this);
-        const datas = this.data();
-        const actionSelected = this.find('#gen-action').value;
-        const boardId = Session.get('currentBoard');
-        if (actionSelected === 'created') {
-          datas.triggerVar.set({
-            activityType: 'createCard',
-            boardId,
-            'listName': '*',
-            desc,
-          });
-        }
-        if (actionSelected === 'removed') {
-          datas.triggerVar.set({
-            activityType: 'removeCard',
-            boardId,
-            desc,
-          });
-        }
-
+      'click .js-open-card-title-popup'(event){
+        const funct = Popup.open('boardCardTitle');
+        const divId = $(event.currentTarget.parentNode.parentNode).attr('id');
+        //console.log('current popup');
+        //console.log(this.currentPopupTriggerId);
+        this.currentPopupTriggerId = divId;
+        funct.call(this, event);
       },
       'click .js-add-create-trigger' (event) {
         const desc = Utils.getTriggerActionDesc(event, this);
         const datas = this.data();
-        const actionSelected = this.find('#create-action').value;
         const listName = this.find('#create-list-name').value;
+        const swimlaneName = this.find('#create-swimlane-name').value;
         const boardId = Session.get('currentBoard');
-        if (actionSelected === 'created') {
-          datas.triggerVar.set({
-            activityType: 'createCard',
-            boardId,
-            listName,
-            desc,
-          });
-        }
-        if (actionSelected === 'removed') {
-          datas.triggerVar.set({
-            activityType: 'removeCard',
-            boardId,
-            listName,
-            desc,
-          });
-        }
+        const divId = $(event.currentTarget.parentNode).attr('id');
+        const cardTitle = this.cardTitleFilters[divId];
+        // move to generic funciont
+        datas.triggerVar.set({
+          activityType: 'createCard',
+          boardId,
+          cardTitle,
+          swimlaneName,
+          listName,
+          desc,
+        });
       },
       'click .js-add-moved-trigger' (event) {
         const datas = this.data();
         const desc = Utils.getTriggerActionDesc(event, this);
-
+        const swimlaneName = this.find('#create-swimlane-name').value;
         const actionSelected = this.find('#move-action').value;
         const listName = this.find('#move-list-name').value;
         const boardId = Session.get('currentBoard');
@@ -62,6 +48,7 @@ BlazeComponent.extendComponent({
             activityType: 'moveCard',
             boardId,
             listName,
+            swimlaneName,
             'oldListName': '*',
             desc,
           });
@@ -70,6 +57,7 @@ BlazeComponent.extendComponent({
           datas.triggerVar.set({
             activityType: 'moveCard',
             boardId,
+            swimlaneName,
             'listName': '*',
             'oldListName': listName,
             desc,
@@ -82,8 +70,9 @@ BlazeComponent.extendComponent({
         const boardId = Session.get('currentBoard');
 
         datas.triggerVar.set({
-          activityType: 'moveCard',
+          'activityType': 'moveCard',
           boardId,
+          'swimlaneName': '*',
           'listName':'*',
           'oldListName': '*',
           desc,
@@ -114,3 +103,13 @@ BlazeComponent.extendComponent({
   },
 
 }).register('boardTriggers');
+
+
+Template.boardCardTitlePopup.events({
+  submit(evt, tpl) {
+    const title = tpl.$('.js-card-filter-name').val().trim();
+    Popup.getOpenerComponent().setNameFilter(title);
+    evt.preventDefault();
+    Popup.close();
+  },
+});

+ 35 - 0
client/components/rules/triggers/cardTriggers.jade

@@ -9,6 +9,13 @@ template(name="cardTriggers")
           option(value="removed") {{_'r-removed-from'}}
       div.trigger-text 
         | {{_'r-a-card'}}
+      div.trigger-button.trigger-button-person.js-show-user-field
+        i.fa.fa-user
+      div.user-details.hide-element
+        div.trigger-text
+          | {{_'r-by'}}
+        div.trigger-dropdown
+          input(class="user-name",type=text,placeholder="{{_'r-user-name'}}")
     div.trigger-button.js-add-gen-label-trigger.js-goto-action
       i.fa.fa-plus
 
@@ -29,6 +36,13 @@ template(name="cardTriggers")
           option(value="removed") {{_'r-removed-from'}}
       div.trigger-text 
         | {{_'r-a-card'}}
+      div.trigger-button.trigger-button-person.js-show-user-field
+        i.fa.fa-user
+      div.user-details.hide-element
+        div.trigger-text
+          | {{_'r-by'}}
+        div.trigger-dropdown
+          input(class="user-name",type=text,placeholder="{{_'r-user-name'}}")
     div.trigger-button.js-add-spec-label-trigger.js-goto-action
       i.fa.fa-plus
 
@@ -42,6 +56,13 @@ template(name="cardTriggers")
           option(value="removed") {{_'r-removed-from'}}
       div.trigger-text 
         | {{_'r-a-card'}}
+      div.trigger-button.trigger-button-person.js-show-user-field
+        i.fa.fa-user
+      div.user-details.hide-element
+        div.trigger-text
+          | {{_'r-by'}}
+        div.trigger-dropdown
+          input(class="user-name",type=text,placeholder="{{_'r-user-name'}}")
     div.trigger-button.js-add-gen-member-trigger.js-goto-action
       i.fa.fa-plus
 
@@ -60,6 +81,13 @@ template(name="cardTriggers")
           option(value="removed") {{_'r-removed-from'}}
       div.trigger-text 
         | {{_'r-a-card'}}
+      div.trigger-button.trigger-button-person.js-show-user-field
+        i.fa.fa-user
+      div.user-details.hide-element
+        div.trigger-text
+          | {{_'r-by'}}
+        div.trigger-dropdown
+          input(class="user-name",type=text,placeholder="{{_'r-user-name'}}")
     div.trigger-button.js-add-spec-member-trigger.js-goto-action
       i.fa.fa-plus
 
@@ -75,5 +103,12 @@ template(name="cardTriggers")
           option(value="removed") {{_'r-removed-from'}}
       div.trigger-text 
         | {{_'r-a-card'}}
+      div.trigger-button.trigger-button-person.js-show-user-field
+        i.fa.fa-user
+      div.user-details.hide-element
+        div.trigger-text
+          | {{_'r-by'}}
+        div.trigger-dropdown
+          input(class="user-name",type=text,placeholder="{{_'r-user-name'}}")
     div.trigger-button.js-add-attachment-trigger.js-goto-action
       i.fa.fa-plus

+ 42 - 0
client/components/rules/triggers/checklistTriggers.jade

@@ -9,6 +9,13 @@ template(name="checklistTriggers")
           option(value="removed") {{_'r-removed-from'}}
       div.trigger-text 
         | {{_'r-a-card'}}
+      div.trigger-button.trigger-button-person.js-show-user-field
+        i.fa.fa-user
+      div.user-details.hide-element
+        div.trigger-text
+          | {{_'r-by'}}
+        div.trigger-dropdown
+          input(class="user-name",type=text,placeholder="{{_'r-user-name'}}")
     div.trigger-button.js-add-gen-check-trigger.js-goto-action
       i.fa.fa-plus
 
@@ -27,6 +34,13 @@ template(name="checklistTriggers")
           option(value="removed") {{_'r-removed-from'}}
       div.trigger-text 
         | {{_'r-a-card'}}
+      div.trigger-button.trigger-button-person.js-show-user-field
+        i.fa.fa-user
+      div.user-details.hide-element
+        div.trigger-text
+          | {{_'r-by'}}
+        div.trigger-dropdown
+          input(class="user-name",type=text,placeholder="{{_'r-user-name'}}")
     div.trigger-button.js-add-spec-check-trigger.js-goto-action
       i.fa.fa-plus
 
@@ -38,6 +52,13 @@ template(name="checklistTriggers")
         select(id="gen-comp-check-action")
           option(value="completed") {{_'r-completed'}}
           option(value="uncompleted") {{_'r-made-incomplete'}}
+      div.trigger-button.trigger-button-person.js-show-user-field
+        i.fa.fa-user
+      div.user-details.hide-element
+        div.trigger-text
+          | {{_'r-by'}}
+        div.trigger-dropdown
+          input(class="user-name",type=text,placeholder="{{_'r-user-name'}}")
     div.trigger-button.js-add-gen-comp-trigger.js-goto-action
       i.fa.fa-plus
 
@@ -53,6 +74,13 @@ template(name="checklistTriggers")
         select(id="spec-comp-check-action")
           option(value="completed") {{_'r-completed'}}
           option(value="uncompleted") {{_'r-made-incomplete'}}
+      div.trigger-button.trigger-button-person.js-show-user-field
+        i.fa.fa-user
+      div.user-details.hide-element
+        div.trigger-text
+          | {{_'r-by'}}
+        div.trigger-dropdown
+          input(class="user-name",type=text,placeholder="{{_'r-user-name'}}")
     div.trigger-button.js-add-spec-comp-trigger.js-goto-action
       i.fa.fa-plus
 
@@ -64,6 +92,13 @@ template(name="checklistTriggers")
         select(id="check-item-gen-action")
           option(value="checked") {{_'r-checked'}}
           option(value="unchecked") {{_'r-unchecked'}}
+      div.trigger-button.trigger-button-person.js-show-user-field
+        i.fa.fa-user
+      div.user-details.hide-element
+        div.trigger-text
+          | {{_'r-by'}}
+        div.trigger-dropdown
+          input(class="user-name",type=text,placeholder="{{_'r-user-name'}}")
     div.trigger-button.js-add-gen-check-item-trigger.js-goto-action
       i.fa.fa-plus
 
@@ -79,5 +114,12 @@ template(name="checklistTriggers")
         select(id="check-item-spec-action")
           option(value="checked") {{_'r-checked'}}
           option(value="unchecked") {{_'r-unchecked'}}
+      div.trigger-button.trigger-button-person.js-show-user-field
+        i.fa.fa-user
+      div.user-details.hide-element
+        div.trigger-text
+          | {{_'r-by'}}
+        div.trigger-dropdown
+          input(class="user-name",type=text,placeholder="{{_'r-user-name'}}")
     div.trigger-button.js-add-spec-check-item-trigger.js-goto-action
       i.fa.fa-plus

+ 2 - 4
client/lib/popup.js

@@ -27,11 +27,9 @@ window.Popup = new class {
   open(name) {
     const self = this;
     const popupName = `${name}Popup`;
-
     function clickFromPopup(evt) {
       return $(evt.target).closest('.js-pop-over').length !== 0;
     }
-
     return function(evt) {
       // If a popup is already opened, clicking again on the opener element
       // should close it -- and interrupt the current `open` function.
@@ -57,7 +55,6 @@ window.Popup = new class {
         self._stack = [];
         openerElement = evt.currentTarget;
       }
-
       $(openerElement).addClass('is-active');
       evt.preventDefault();
 
@@ -139,6 +136,7 @@ window.Popup = new class {
       const openerElement = this._getTopStack().openerElement;
       $(openerElement).removeClass('is-active');
 
+
       this._stack = [];
     }
   }
@@ -200,7 +198,7 @@ escapeActions.forEach((actionName) => {
     () => Popup[actionName](),
     () => Popup.isOpen(),
     {
-      noClickEscapeOn: '.js-pop-over',
+      noClickEscapeOn: '.js-pop-over,.js-open-card-title-popup',
       enabledOnClick: actionName === 'close',
     }
   );

+ 11 - 1
client/lib/utils.js

@@ -218,10 +218,20 @@ Utils = {
       const element = tempInstance.$(triggerEls[i]);
       if (element.hasClass('trigger-text')) {
         finalString += element.text().toLowerCase();
+      } else if (element.hasClass('user-details')) {
+        let username = element.find('input').val();
+        if(username === undefined || username === ''){
+          username = '*';
+        }
+        finalString += `${element.find('.trigger-text').text().toLowerCase() } ${  username}`;
       } else if (element.find('select').length > 0) {
         finalString += element.find('select option:selected').text().toLowerCase();
       } else if (element.find('input').length > 0) {
-        finalString += element.find('input').val();
+        let inputvalue = element.find('input').val();
+        if(inputvalue === undefined || inputvalue === ''){
+          inputvalue = '*';
+        }
+        finalString += inputvalue;
       }
       // Add space
       if (i !== length - 1) {

+ 20 - 2
i18n/en.i18n.json

@@ -467,6 +467,7 @@
     "error-notAuthorized": "You are not authorized to view this page.",
     "outgoing-webhooks": "Outgoing Webhooks",
     "outgoingWebhooksPopup-title": "Outgoing Webhooks",
+    "boardCardTitlePopup-title": "Card Title Filter",
     "new-outgoing-webhook": "New Outgoing Webhook",
     "no-name": "(Unknown)",
     "Node_version": "Node version",
@@ -537,11 +538,14 @@
     "r-delete-rule": "Delete rule",
     "r-new-rule-name": "New rule title",
     "r-no-rules": "No rules",
-    "r-when-a-card-is": "When a card is",
+    "r-when-a-card": "When a card",
+    "r-is": "is",
+    "r-is-moved": "is moved",
     "r-added-to": "Added to",
     "r-removed-from": "Removed from",
     "r-the-board": "the board",
     "r-list": "list",
+    "set-filter":"Set Filter",
     "r-moved-to": "Moved to",
     "r-moved-from": "Moved from",
     "r-archived": "Moved to Archive",
@@ -549,7 +553,7 @@
     "r-a-card": "a card",
     "r-when-a-label-is": "When a label is",
     "r-when-the-label-is": "When the label is",
-    "r-list-name": "List name",
+    "r-list-name": "list name",
     "r-when-a-member": "When a member is",
     "r-when-the-member": "When the member",
     "r-name": "name",
@@ -600,6 +604,9 @@
     "r-d-unarchive": "Restore card from Archive",
     "r-d-add-label": "Add label",
     "r-d-remove-label": "Remove label",
+    "r-create-card": "Create new card",
+    "r-in-list": "in list",
+    "r-in-swimlane": "in swimlane",
     "r-d-add-member": "Add member",
     "r-d-remove-member": "Remove member",
     "r-d-remove-all-member": "Remove all member",
@@ -610,6 +617,17 @@
     "r-d-check-of-list": "of checklist",
     "r-d-add-checklist": "Add checklist",
     "r-d-remove-checklist": "Remove checklist",
+    "r-by": "by",
+    "r-add-checklist": "Add checklist",
+    "r-with-items": "with items",
+    "r-items-list": "item1,item2,item3",
+    "r-add-swimlane": "Add swimlane",
+    "r-swimlane": "in swimlane",
+    "r-swimlane-name": "swimlane name",
+    "r-user-name": "username",
+    "r-board-note": "Note: leave a field empty to match every possible value. ",
+    "r-checklist-note": "Note: checklist's items have to be written as comma separated values.",
+    "r-added-to": "added to",
     "r-when-a-card-is-moved": "When a card is moved to another list",
     "ldap": "LDAP",
     "oauth2": "OAuth2",

+ 3 - 0
models/cards.js

@@ -1128,6 +1128,7 @@ function cardMove(userId, doc, fieldNames, oldListId, oldSwimlaneId) {
       listId: doc.listId,
       boardId: doc.boardId,
       cardId: doc._id,
+      swimlaneName: Swimlanes.findOne(doc.swimlaneId).title,
       swimlaneId: doc.swimlaneId,
       oldSwimlaneId,
     });
@@ -1237,6 +1238,8 @@ function cardCreation(userId, doc) {
     listName: Lists.findOne(doc.listId).title,
     listId: doc.listId,
     cardId: doc._id,
+    cardTitle:doc.title,
+    swimlaneName: Swimlanes.findOne(doc.swimlaneId).title,
     swimlaneId: doc.swimlaneId,
   });
 }

+ 30 - 0
server/rulesHelper.js

@@ -132,6 +132,36 @@ RulesHelper = {
     if(action.actionType === 'removeChecklist'){
       Checklists.remove({'title':action.checklistName, 'cardId':card._id, 'sort':0});
     }
+    if(action.actionType === 'addSwimlane'){
+      Swimlanes.insert({
+        title: action.swimlaneName,
+        boardId,
+      });
+    }
+    if(action.actionType === 'addChecklistWithItems'){
+      const checkListId = Checklists.insert({'title':action.checklistName, 'cardId':card._id, 'sort':0});
+      const itemsArray = action.checklistItems.split(',');
+      for(let i = 0; i <itemsArray.length; i++){
+        ChecklistItems.insert({title:itemsArray[i], checklistId:checkListId, cardId:card._id, 'sort':0});
+      }
+    }
+    if(action.actionType === 'createCard'){
+      const list = Lists.findOne({title:action.listName, boardId});
+      let listId = '';
+      let swimlaneId = '';
+      const swimlane = Swimlanes.findOne({title:action.swimlaneName, boardId});
+      if(list === undefined){
+        listId = '';
+      }else{
+        listId = list._id;
+      }
+      if(swimlane === undefined){
+        swimlaneId = Swimlanes.findOne({title:'Default', boardId})._id;
+      }else{
+        swimlaneId = swimlane._id;
+      }
+      Cards.insert({title:action.cardName, listId, swimlaneId, sort:0, boardId});
+    }
 
   },
 

+ 18 - 18
server/triggersDef.js

@@ -1,57 +1,57 @@
 TriggersDef = {
   createCard:{
-    matchingFields: ['boardId', 'listName'],
+    matchingFields: ['boardId', 'listName', 'userId', 'swimlaneName', 'cardTitle'],
   },
   moveCard:{
-    matchingFields: ['boardId', 'listName', 'oldListName'],
+    matchingFields: ['boardId', 'listName', 'oldListName', 'userId', 'swimlaneName'],
   },
   archivedCard:{
-    matchingFields: ['boardId'],
+    matchingFields: ['boardId', 'userId'],
   },
   restoredCard:{
-    matchingFields: ['boardId'],
+    matchingFields: ['boardId', 'userId'],
   },
   joinMember:{
-    matchingFields: ['boardId', 'username'],
+    matchingFields: ['boardId', 'username', 'userId'],
   },
   unjoinMember:{
-    matchingFields: ['boardId', 'username'],
+    matchingFields: ['boardId', 'username', 'userId'],
   },
   addChecklist:{
-    matchingFields: ['boardId', 'checklistName'],
+    matchingFields: ['boardId', 'checklistName', 'userId'],
   },
   removeChecklist:{
-    matchingFields: ['boardId', 'checklistName'],
+    matchingFields: ['boardId', 'checklistName', 'userId'],
   },
   completeChecklist:{
-    matchingFields: ['boardId', 'checklistName'],
+    matchingFields: ['boardId', 'checklistName', 'userId'],
   },
   uncompleteChecklist:{
-    matchingFields: ['boardId', 'checklistName'],
+    matchingFields: ['boardId', 'checklistName', 'userId'],
   },
   addedChecklistItem:{
-    matchingFields: ['boardId', 'checklistItemName'],
+    matchingFields: ['boardId', 'checklistItemName', 'userId'],
   },
   removedChecklistItem:{
-    matchingFields: ['boardId', 'checklistItemName'],
+    matchingFields: ['boardId', 'checklistItemName', 'userId'],
   },
   checkedItem:{
-    matchingFields: ['boardId', 'checklistItemName'],
+    matchingFields: ['boardId', 'checklistItemName', 'userId'],
   },
   uncheckedItem:{
-    matchingFields: ['boardId', 'checklistItemName'],
+    matchingFields: ['boardId', 'checklistItemName', 'userId'],
   },
   addAttachment:{
-    matchingFields: ['boardId'],
+    matchingFields: ['boardId', 'userId'],
   },
   deleteAttachment:{
-    matchingFields: ['boardId'],
+    matchingFields: ['boardId', 'userId'],
   },
   addedLabel:{
-    matchingFields: ['boardId', 'labelId'],
+    matchingFields: ['boardId', 'labelId', 'userId'],
   },
   removedLabel:{
-    matchingFields: ['boardId', 'labelId'],
+    matchingFields: ['boardId', 'labelId', 'userId'],
   },
 };