summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorLauri Ojansivu <x@xet7.org>2018-09-16 00:10:40 +0300
committerLauri Ojansivu <x@xet7.org>2018-09-16 00:10:40 +0300
commit6673b79738720651f186039808d4e22ef14e4c3c (patch)
tree464eb186f382f14b93c9c9ca7b21a14851746770 /client
parent053757f135b54241b4899a83cd3bb749b1e81bc9 (diff)
parent36c04edb9f7cf16fb450b76598c4957968d4674b (diff)
downloadwekan-6673b79738720651f186039808d4e22ef14e4c3c.tar.gz
wekan-6673b79738720651f186039808d4e22ef14e4c3c.tar.bz2
wekan-6673b79738720651f186039808d4e22ef14e4c3c.zip
Merge branch 'feature-rules' of https://github.com/Angtrim/wekan into Angtrim-feature-rules
Diffstat (limited to 'client')
-rw-r--r--client/components/activities/activities.jade51
-rw-r--r--client/components/activities/activities.js16
-rw-r--r--client/components/boards/boardHeader.jade9
-rw-r--r--client/components/boards/boardHeader.js3
-rw-r--r--client/components/forms/forms.styl1
-rw-r--r--client/components/lists/listBody.js2
-rw-r--r--client/components/main/layouts.jade17
-rw-r--r--client/components/main/layouts.styl17
-rw-r--r--client/components/rules/.DS_Storebin0 -> 6148 bytes
-rw-r--r--client/components/rules/actions/boardActions.jade46
-rw-r--r--client/components/rules/actions/boardActions.js121
-rw-r--r--client/components/rules/actions/cardActions.jade43
-rw-r--r--client/components/rules/actions/cardActions.js119
-rw-r--r--client/components/rules/actions/checklistActions.jade51
-rw-r--r--client/components/rules/actions/checklistActions.js128
-rw-r--r--client/components/rules/actions/mailActions.jade11
-rw-r--r--client/components/rules/actions/mailActions.js35
-rw-r--r--client/components/rules/ruleDetails.jade18
-rw-r--r--client/components/rules/ruleDetails.js36
-rw-r--r--client/components/rules/rules.styl156
-rw-r--r--client/components/rules/rulesActions.jade25
-rw-r--r--client/components/rules/rulesActions.js58
-rw-r--r--client/components/rules/rulesList.jade27
-rw-r--r--client/components/rules/rulesList.js15
-rw-r--r--client/components/rules/rulesMain.jade9
-rw-r--r--client/components/rules/rulesMain.js58
-rw-r--r--client/components/rules/rulesTriggers.jade21
-rw-r--r--client/components/rules/rulesTriggers.js53
-rw-r--r--client/components/rules/triggers/boardTriggers.jade61
-rw-r--r--client/components/rules/triggers/boardTriggers.js103
-rw-r--r--client/components/rules/triggers/cardTriggers.jade79
-rw-r--r--client/components/rules/triggers/cardTriggers.js130
-rw-r--r--client/components/rules/triggers/checklistTriggers.jade83
-rw-r--r--client/components/rules/triggers/checklistTriggers.js146
-rw-r--r--client/lib/modal.js14
-rw-r--r--client/lib/popup.js1
-rw-r--r--client/lib/utils.js29
37 files changed, 1782 insertions, 10 deletions
diff --git a/client/components/activities/activities.jade b/client/components/activities/activities.jade
index d3e3d5ba..bddc4dad 100644
--- a/client/components/activities/activities.jade
+++ b/client/components/activities/activities.jade
@@ -14,6 +14,9 @@ template(name="boardActivities")
p.activity-desc
+memberName(user=user)
+ if($eq activityType 'deleteAttachment')
+ | {{{_ 'activity-delete-attach' cardLink}}}.
+
if($eq activityType 'addAttachment')
| {{{_ 'activity-attached' attachmentLink cardLink}}}.
@@ -31,12 +34,28 @@ template(name="boardActivities")
.activity-checklist(href="{{ card.absoluteUrl }}")
+viewer
= checklist.title
+ if($eq activityType 'removeChecklist')
+ | {{{_ 'activity-checklist-removed' cardLink}}}.
+
+ if($eq activityType 'checkedItem')
+ | {{{_ 'activity-checked-item' checkItem checklist.title cardLink}}}.
+
+ if($eq activityType 'uncheckedItem')
+ | {{{_ 'activity-unchecked-item' checkItem checklist.title cardLink}}}.
+
+ if($eq activityType 'checklistCompleted')
+ | {{{_ 'activity-checklist-completed' checklist.title cardLink}}}.
+
+ if($eq activityType 'checklistUncompleted')
+ | {{{_ 'activity-checklist-uncompleted' checklist.title cardLink}}}.
if($eq activityType 'addChecklistItem')
| {{{_ 'activity-checklist-item-added' checklist.title cardLink}}}.
.activity-checklist(href="{{ card.absoluteUrl }}")
+viewer
= checklistItem.title
+ if($eq activityType 'removedChecklistItem')
+ | {{{_ 'activity-checklist-item-removed' checklist.title cardLink}}}.
if($eq activityType 'archivedCard')
| {{{_ 'activity-archived' cardLink}}}.
@@ -89,6 +108,12 @@ template(name="boardActivities")
if($eq activityType 'restoredCard')
| {{{_ 'activity-sent' cardLink boardLabel}}}.
+ if($eq activityType 'addedLabel')
+ | {{{_ 'activity-added-label' lastLabel cardLink}}}.
+
+ if($eq activityType 'removedLabel')
+ | {{{_ 'activity-removed-label' lastLabel cardLink}}}.
+
if($eq activityType 'unjoinMember')
if($eq user._id member._id)
| {{{_ 'activity-unjoined' cardLink}}}.
@@ -119,6 +144,28 @@ template(name="cardActivities")
| {{{_ 'activity-removed' cardLabel memberLink}}}.
if($eq activityType 'archivedCard')
| {{_ 'activity-archived' cardLabel}}.
+
+ if($eq activityType 'addedLabel')
+ | {{{_ 'activity-added-label-card' lastLabel }}}.
+
+ if($eq activityType 'removedLabel')
+ | {{{_ 'activity-removed-label-card' lastLabel }}}.
+
+ if($eq activityType 'removeChecklist')
+ | {{{_ 'activity-checklist-removed' cardLabel}}}.
+
+ if($eq activityType 'checkedItem')
+ | {{{_ 'activity-checked-item-card' checkItem checklist.title }}}.
+
+ if($eq activityType 'uncheckedItem')
+ | {{{_ 'activity-unchecked-item-card' checkItem checklist.title }}}.
+
+ if($eq activityType 'checklistCompleted')
+ | {{{_ 'activity-checklist-completed-card' checklist.title }}}.
+
+ if($eq activityType 'checklistUncompleted')
+ | {{{_ 'activity-checklist-uncompleted-card' checklist.title }}}.
+
if($eq activityType 'restoredCard')
| {{_ 'activity-sent' cardLabel boardLabel}}.
if($eq activityType 'moveCard')
@@ -127,6 +174,10 @@ template(name="cardActivities")
| {{{_ 'activity-attached' attachmentLink cardLabel}}}.
if attachment.isImage
img.attachment-image-preview(src=attachment.url)
+ if($eq activityType 'deleteAttachment')
+ | {{{_ 'activity-delete-attach' cardLabel}}}.
+ if($eq activityType 'removedChecklist')
+ | {{{_ 'activity-checklist-removed' cardLabel}}}.
if($eq activityType 'addChecklist')
| {{{_ 'activity-checklist-added' cardLabel}}}.
.activity-checklist
diff --git a/client/components/activities/activities.js b/client/components/activities/activities.js
index 25e151fd..6633a91a 100644
--- a/client/components/activities/activities.js
+++ b/client/components/activities/activities.js
@@ -49,6 +49,12 @@ BlazeComponent.extendComponent({
this.loadNextPageLocked = true;
}
},
+
+ checkItem(){
+ const checkItemId = this.currentData().checklistItemId;
+ const checkItem = ChecklistItems.findOne({_id:checkItemId});
+ return checkItem.title;
+ },
boardLabel() {
return TAPi18n.__('this-board');
@@ -66,6 +72,16 @@ BlazeComponent.extendComponent({
}, card.title));
},
+ lastLabel(){
+ const lastLabelId = this.currentData().labelId;
+ const lastLabel = Boards.findOne(Session.get('currentBoard')).getLabelById(lastLabelId);
+ if(lastLabel.name == undefined || lastLabel.name == ""){
+ return lastLabel.color;
+ }else{
+ return lastLabel.name;
+ }
+ },
+
listLabel() {
return this.currentData().list().title;
},
diff --git a/client/components/boards/boardHeader.jade b/client/components/boards/boardHeader.jade
index 1c6c8f8c..dfd281de 100644
--- a/client/components/boards/boardHeader.jade
+++ b/client/components/boards/boardHeader.jade
@@ -88,6 +88,10 @@ template(name="boardHeaderBar")
a.board-header-btn-close.js-filter-reset(title="{{_ 'filter-clear'}}")
i.fa.fa-times-thin
+ a.board-header-btn.js-open-rules-view(title="{{_ 'rules'}}")
+ i.fa.fa-magic
+ span {{_ 'rules'}}
+
a.board-header-btn.js-open-search-view(title="{{_ 'search'}}")
i.fa.fa-search
span {{_ 'search'}}
@@ -290,6 +294,11 @@ template(name="boardChangeTitlePopup")
textarea.js-board-desc= description
input.primary.wide(type="submit" value="{{_ 'rename'}}")
+template(name="boardCreateRulePopup")
+ p {{_ 'close-board-pop'}}
+ button.js-confirm.negate.full(type="submit") {{_ 'archive'}}
+
+
template(name="archiveBoardPopup")
p {{_ 'close-board-pop'}}
button.js-confirm.negate.full(type="submit") {{_ 'archive'}}
diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js
index 2dfd58c1..89f686ab 100644
--- a/client/components/boards/boardHeader.js
+++ b/client/components/boards/boardHeader.js
@@ -108,6 +108,9 @@ BlazeComponent.extendComponent({
'click .js-open-search-view'() {
Sidebar.setView('search');
},
+ 'click .js-open-rules-view'() {
+ Modal.openWide('rulesMain');
+ },
'click .js-multiselection-activate'() {
const currentCard = Session.get('currentCard');
MultiSelection.activate();
diff --git a/client/components/forms/forms.styl b/client/components/forms/forms.styl
index 5be70b7a..892a6e74 100644
--- a/client/components/forms/forms.styl
+++ b/client/components/forms/forms.styl
@@ -1,5 +1,6 @@
@import 'nib'
+select,
textarea,
input:not([type=file]),
button
diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js
index d99d9dc8..ce8396b9 100644
--- a/client/components/lists/listBody.js
+++ b/client/components/lists/listBody.js
@@ -98,6 +98,8 @@ BlazeComponent.extendComponent({
evt.preventDefault();
Utils.goBoardId(Session.get('currentBoard'));
}
+ console.log(evt)
+
},
cardIsSelected() {
diff --git a/client/components/main/layouts.jade b/client/components/main/layouts.jade
index b0024b33..ac7da3af 100644
--- a/client/components/main/layouts.jade
+++ b/client/components/main/layouts.jade
@@ -36,11 +36,18 @@ template(name="defaultLayout")
if (Modal.isOpen)
#modal
.overlay
- .modal-content
- a.modal-close-btn.js-close-modal
- i.fa.fa-times-thin
- +Template.dynamic(template=Modal.getHeaderName)
- +Template.dynamic(template=Modal.getTemplateName)
+ if (Modal.isWide)
+ .modal-content-wide.modal-container
+ a.modal-close-btn.js-close-modal
+ i.fa.fa-times-thin
+ +Template.dynamic(template=Modal.getHeaderName)
+ +Template.dynamic(template=Modal.getTemplateName)
+ else
+ .modal-content.modal-container
+ a.modal-close-btn.js-close-modal
+ i.fa.fa-times-thin
+ +Template.dynamic(template=Modal.getHeaderName)
+ +Template.dynamic(template=Modal.getTemplateName)
template(name="notFound")
+message(label='page-not-found')
diff --git a/client/components/main/layouts.styl b/client/components/main/layouts.styl
index a79ff337..3457a028 100644
--- a/client/components/main/layouts.styl
+++ b/client/components/main/layouts.styl
@@ -61,6 +61,23 @@ body
display: block
float: right
font-size: 24px
+
+ .modal-content-wide
+ width: 800px
+ min-height: 0px
+ margin: 42px auto
+ padding: 12px
+ border-radius: 4px
+ background: darken(white, 13%)
+ z-index: 110
+
+ h2
+ margin-bottom: 25px
+
+ .modal-close-btn
+ display: block
+ float: right
+ font-size: 24px
h1
font-size: 22px
diff --git a/client/components/rules/.DS_Store b/client/components/rules/.DS_Store
new file mode 100644
index 00000000..5008ddfc
--- /dev/null
+++ b/client/components/rules/.DS_Store
Binary files differ
diff --git a/client/components/rules/actions/boardActions.jade b/client/components/rules/actions/boardActions.jade
new file mode 100644
index 00000000..dfeb3d84
--- /dev/null
+++ b/client/components/rules/actions/boardActions.jade
@@ -0,0 +1,46 @@
+template(name="boardActions")
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ | {{{_'r-move-card-to'}}}
+ div.trigger-dropdown
+ select(id="move-gen-action")
+ option(value="top") {{{_'r-top-of'}}}
+ option(value="bottom") {{{_'r-bottom-of'}}}
+ div.trigger-text
+ | {{{_'r-its-list'}}}
+ div.trigger-button.js-add-gen-move-action.js-goto-rules
+ i.fa.fa-plus
+
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ | {{{_'r-move-card-to'}}}
+ div.trigger-dropdown
+ select(id="move-spec-action")
+ option(value="top") {{{_'r-top-of'}}}
+ option(value="bottom") {{{_'r-bottom-of'}}}
+ div.trigger-text
+ | {{{_'r-list'}}}
+ div.trigger-dropdown
+ input(id="listName",type=text,placeholder="{{{_'r-name'}}}")
+ div.trigger-button.js-add-spec-move-action.js-goto-rules
+ i.fa.fa-plus
+
+ div.trigger-item
+ div.trigger-content
+ div.trigger-dropdown
+ select(id="arch-action")
+ option(value="archive") {{{_'r-archive'}}}
+ option(value="unarchive") {{{_'r-unarchive'}}}
+ div.trigger-text
+ | {{{_'r-card'}}}
+ div.trigger-button.js-add-arch-action.js-goto-rules
+ i.fa.fa-plus
+
+
+
+
+
+
+
diff --git a/client/components/rules/actions/boardActions.js b/client/components/rules/actions/boardActions.js
new file mode 100644
index 00000000..3eda039f
--- /dev/null
+++ b/client/components/rules/actions/boardActions.js
@@ -0,0 +1,121 @@
+BlazeComponent.extendComponent({
+ onCreated() {
+
+ },
+
+ events() {
+ return [{
+ 'click .js-add-spec-move-action' (event) {
+ const ruleName = this.data().ruleName.get();
+ const trigger = this.data().triggerVar.get();
+ const actionSelected = this.find('#move-spec-action').value;
+ const listTitle = this.find('#listName').value;
+ const boardId = Session.get('currentBoard');
+ const desc = Utils.getTriggerActionDesc(event, this);
+ if (actionSelected == "top") {
+ const triggerId = Triggers.insert(trigger);
+ const actionId = Actions.insert({
+ actionType: "moveCardToTop",
+ "listTitle": listTitle,
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId
+ });
+ }
+ if (actionSelected == "bottom") {
+ const triggerId = Triggers.insert(trigger);
+ const actionId = Actions.insert({
+ actionType: "moveCardToBottom",
+ "listTitle": listTitle,
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId
+ });
+ }
+ },
+ 'click .js-add-gen-move-action' (event) {
+ const desc = Utils.getTriggerActionDesc(event, this);
+ const boardId = Session.get('currentBoard');
+ const ruleName = this.data().ruleName.get();
+ const trigger = this.data().triggerVar.get();
+ const actionSelected = this.find('#move-gen-action').value;
+ if (actionSelected == "top") {
+ const triggerId = Triggers.insert(trigger);
+ const actionId = Actions.insert({
+ actionType: "moveCardToTop",
+ "listTitle": "*",
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId
+ });
+ }
+ if (actionSelected == "bottom") {
+ const triggerId = Triggers.insert(trigger);
+ const actionId = Actions.insert({
+ actionType: "moveCardToBottom",
+ "listTitle": "*",
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId
+ });
+ }
+ },
+ 'click .js-add-arch-action' (event) {
+ const desc = Utils.getTriggerActionDesc(event, this);
+ const boardId = Session.get('currentBoard');
+ const ruleName = this.data().ruleName.get();
+ const trigger = this.data().triggerVar.get();
+ const actionSelected = this.find('#arch-action').value;
+ if (actionSelected == "archive") {
+ const triggerId = Triggers.insert(trigger);
+ const actionId = Actions.insert({
+ actionType: "archive",
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId
+ });
+ }
+ if (actionSelected == "unarchive") {
+ const triggerId = Triggers.insert(trigger);
+ const actionId = Actions.insert({
+ actionType: "unarchive",
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId
+ });
+ }
+ },
+ }];
+ },
+
+}).register('boardActions'); \ No newline at end of file
diff --git a/client/components/rules/actions/cardActions.jade b/client/components/rules/actions/cardActions.jade
new file mode 100644
index 00000000..74ad9ab5
--- /dev/null
+++ b/client/components/rules/actions/cardActions.jade
@@ -0,0 +1,43 @@
+template(name="cardActions")
+ div.trigger-item
+ div.trigger-content
+ div.trigger-dropdown
+ select(id="label-action")
+ option(value="add") {{{_'r-add'}}}
+ option(value="remove") {{{_'r-remove'}}}
+ div.trigger-text
+ | {{{_'r-label'}}}
+ div.trigger-dropdown
+ select(id="label-id")
+ each labels
+ option(value="#{_id}")
+ = name
+ div.trigger-button.js-add-label-action.js-goto-rules
+ i.fa.fa-plus
+
+ div.trigger-item
+ div.trigger-content
+ div.trigger-dropdown
+ select(id="member-action")
+ option(value="add") {{{_'r-add'}}}
+ option(value="remove") {{{_'r-remove'}}}
+ div.trigger-text
+ | {{{_'r-member'}}}
+ div.trigger-dropdown
+ input(id="member-name",type=text,placeholder="{{{_'r-name'}}}")
+ div.trigger-button.js-add-member-action.js-goto-rules
+ i.fa.fa-plus
+
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ | {{{_'r-remove-all'}}}
+ div.trigger-button.js-add-removeall-action.js-goto-rules
+ i.fa.fa-plus
+
+
+
+
+
+
+
diff --git a/client/components/rules/actions/cardActions.js b/client/components/rules/actions/cardActions.js
new file mode 100644
index 00000000..a6e74fe9
--- /dev/null
+++ b/client/components/rules/actions/cardActions.js
@@ -0,0 +1,119 @@
+BlazeComponent.extendComponent({
+ onCreated() {
+ this.subscribe('allRules');
+ },
+
+ labels() {
+ const labels = Boards.findOne(Session.get('currentBoard')).labels;
+ for (let i = 0; i < labels.length; i++) {
+ if (labels[i].name == "" || labels[i].name == undefined) {
+ labels[i].name = labels[i].color.toUpperCase();
+ }
+ }
+ console.log(labels);
+ return labels;
+ },
+
+ events() {
+ return [{
+ 'click .js-add-label-action' (event) {
+ const ruleName = this.data().ruleName.get();
+ const trigger = this.data().triggerVar.get();
+ const actionSelected = this.find('#label-action').value;
+ const labelId = this.find('#label-id').value;
+ const boardId = Session.get('currentBoard');
+ const desc = Utils.getTriggerActionDesc(event, this);
+ if (actionSelected == "add") {
+ const triggerId = Triggers.insert(trigger);
+ const actionId = Actions.insert({
+ actionType: "addLabel",
+ "labelId": labelId,
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId
+ });
+ }
+ if (actionSelected == "remove") {
+ const triggerId = Triggers.insert(trigger);
+ const actionId = Actions.insert({
+ actionType: "removeLabel",
+ "labelId": labelId,
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId
+ });
+ }
+
+ },
+ 'click .js-add-member-action' (event) {
+ const ruleName = this.data().ruleName.get();
+ const trigger = this.data().triggerVar.get();
+ const actionSelected = this.find('#member-action').value;
+ const memberName = this.find('#member-name').value;
+ const boardId = Session.get('currentBoard');
+ const desc = Utils.getTriggerActionDesc(event, this);
+ if (actionSelected == "add") {
+ const triggerId = Triggers.insert(trigger);
+ const actionId = Actions.insert({
+ actionType: "addMember",
+ "memberName": memberName,
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId,
+ "desc": desc
+ });
+ }
+ if (actionSelected == "remove") {
+ const triggerId = Triggers.insert(trigger);
+ const actionId = Actions.insert({
+ actionType: "removeMember",
+ "memberName": memberName,
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId
+ });
+ }
+ },
+ 'click .js-add-removeall-action' (event) {
+ const ruleName = this.data().ruleName.get();
+ const trigger = this.data().triggerVar.get();
+ const triggerId = Triggers.insert(trigger);
+ const desc = Utils.getTriggerActionDesc(event, this);
+ const boardId = Session.get('currentBoard');
+ const actionId = Actions.insert({
+ actionType: "removeMember",
+ "memberName": "*",
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId
+ });
+ },
+ }];
+ },
+
+}).register('cardActions'); \ No newline at end of file
diff --git a/client/components/rules/actions/checklistActions.jade b/client/components/rules/actions/checklistActions.jade
new file mode 100644
index 00000000..8414a1a5
--- /dev/null
+++ b/client/components/rules/actions/checklistActions.jade
@@ -0,0 +1,51 @@
+template(name="checklistActions")
+ div.trigger-item
+ div.trigger-content
+ div.trigger-dropdown
+ select(id="check-action")
+ option(value="add") {{{_'r-add'}}}
+ option(value="remove") {{{_'r-remove'}}}
+ div.trigger-text
+ | {{{_'r-checklist'}}}
+ div.trigger-dropdown
+ input(id="checklist-name",type=text,placeholder="{{{_'r-name'}}}")
+ div.trigger-button.js-add-checklist-action.js-goto-rules
+ i.fa.fa-plus
+
+ div.trigger-item
+ div.trigger-content
+ div.trigger-dropdown
+ select(id="checkall-action")
+ option(value="check") {{{_'r-check-all'}}}
+ option(value="uncheck") {{{_'r-uncheck-all'}}}
+ div.trigger-text
+ | {{{_'r-items-check'}}}
+ div.trigger-dropdown
+ input(id="checklist-name2",type=text,placeholder="{{{_'r-name'}}}")
+ div.trigger-button.js-add-checkall-action.js-goto-rules
+ i.fa.fa-plus
+
+
+ div.trigger-item
+ div.trigger-content
+ div.trigger-dropdown
+ select(id="check-item-action")
+ option(value="check") {{{_'r-check'}}}
+ option(value="uncheck") {{{_'r-uncheck'}}}
+ div.trigger-text
+ | {{{_'r-item'}}}
+ div.trigger-dropdown
+ input(id="checkitem-name",type=text,placeholder="{{{_'r-name'}}}")
+ div.trigger-text
+ | {{{_'r-of-checklist'}}}
+ div.trigger-dropdown
+ input(id="checklist-name3",type=text,placeholder="{{{_'r-name'}}}")
+ div.trigger-button.js-add-check-item-action.js-goto-rules
+ i.fa.fa-plus
+
+
+
+
+
+
+
diff --git a/client/components/rules/actions/checklistActions.js b/client/components/rules/actions/checklistActions.js
new file mode 100644
index 00000000..0b4c2167
--- /dev/null
+++ b/client/components/rules/actions/checklistActions.js
@@ -0,0 +1,128 @@
+BlazeComponent.extendComponent({
+ onCreated() {
+ this.subscribe('allRules');
+ },
+ events() {
+ return [{
+ 'click .js-add-checklist-action' (event) {
+ const ruleName = this.data().ruleName.get();
+ const trigger = this.data().triggerVar.get();
+ const actionSelected = this.find('#check-action').value;
+ const checklistName = this.find('#checklist-name').value;
+ const boardId = Session.get('currentBoard');
+ const desc = Utils.getTriggerActionDesc(event, this);
+ if (actionSelected == "add") {
+ const triggerId = Triggers.insert(trigger);
+ const actionId = Actions.insert({
+ actionType: "addChecklist",
+ "checklistName": checklistName,
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId
+ });
+ }
+ if (actionSelected == "remove") {
+ const triggerId = Triggers.insert(trigger);
+ const actionId = Actions.insert({
+ actionType: "removeChecklist",
+ "checklistName": checklistName,
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId
+ });
+ }
+
+ },
+ 'click .js-add-checkall-action' (event) {
+ const ruleName = this.data().ruleName.get();
+ const trigger = this.data().triggerVar.get();
+ const actionSelected = this.find('#checkall-action').value;
+ const checklistName = this.find('#checklist-name2').value;
+ const boardId = Session.get('currentBoard');
+ const desc = Utils.getTriggerActionDesc(event, this);
+ if (actionSelected == "check") {
+ const triggerId = Triggers.insert(trigger);
+ const actionId = Actions.insert({
+ actionType: "checkAll",
+ "checklistName": checklistName,
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId
+ });
+ }
+ if (actionSelected == "uncheck") {
+ const triggerId = Triggers.insert(trigger);
+ const actionId = Actions.insert({
+ actionType: "uncheckAll",
+ "checklistName": checklistName,
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId
+ });
+ }
+ },
+ 'click .js-add-check-item-action' (event) {
+ const ruleName = this.data().ruleName.get();
+ const trigger = this.data().triggerVar.get();
+ const checkItemName = this.find("#checkitem-name");
+ const checklistName = this.find("#checklist-name3");
+ const actionSelected = this.find('#check-item-action').value;
+ const boardId = Session.get('currentBoard');
+ const desc = Utils.getTriggerActionDesc(event, this);
+ if (actionSelected == "check") {
+ const triggerId = Triggers.insert(trigger);
+ const actionId = Actions.insert({
+ actionType: "checkItem",
+ "checklistName": checklistName,
+ "checkItemName": checkItemName,
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId
+ });
+ }
+ if (actionSelected == "uncheck") {
+ const triggerId = Triggers.insert(trigger);
+ const actionId = Actions.insert({
+ actionType: "uncheckItem",
+ "checklistName": checklistName,
+ "checkItemName": checkItemName,
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId
+ });
+ }
+ },
+ }];
+ },
+
+}).register('checklistActions'); \ No newline at end of file
diff --git a/client/components/rules/actions/mailActions.jade b/client/components/rules/actions/mailActions.jade
new file mode 100644
index 00000000..c10fb384
--- /dev/null
+++ b/client/components/rules/actions/mailActions.jade
@@ -0,0 +1,11 @@
+template(name="mailActions")
+ div.trigger-item.trigger-item-mail
+ div.trigger-content.trigger-content-mail
+ div.trigger-text.trigger-text-email
+ | {{{_'r-send-email'}}}
+ div.trigger-dropdown-mail
+ input(id="email-to",type=text,placeholder="{{{_'r-to'}}}")
+ input(id="email-subject",type=text,placeholder="{{{_'r-subject'}}}")
+ textarea(id="email-msg")
+ div.trigger-button.trigger-button-email.js-mail-action.js-goto-rules
+ i.fa.fa-plus \ No newline at end of file
diff --git a/client/components/rules/actions/mailActions.js b/client/components/rules/actions/mailActions.js
new file mode 100644
index 00000000..dae7d08d
--- /dev/null
+++ b/client/components/rules/actions/mailActions.js
@@ -0,0 +1,35 @@
+BlazeComponent.extendComponent({
+ onCreated() {
+
+ },
+
+ events() {
+ return [{
+ 'click .js-mail-action' (event) {
+ const emailTo = this.find('#email-to').value;
+ const emailSubject = this.find('#email-subject').value;
+ const emailMsg = this.find('#email-msg').value;
+ const trigger = this.data().triggerVar.get();
+ const ruleName = this.data().ruleName.get();
+ const triggerId = Triggers.insert(trigger);
+ const boardId = Session.get('currentBoard');
+ const desc = Utils.getTriggerActionDesc(event, this);
+ const actionId = Actions.insert({
+ actionType: "sendEmail",
+ "emailTo": emailTo,
+ "emailSubject": emailSubject,
+ "emailMsg": emailMsg,
+ "boardId": boardId,
+ "desc": desc
+ });
+ Rules.insert({
+ title: ruleName,
+ triggerId: triggerId,
+ actionId: actionId,
+ "boardId": boardId
+ });
+ },
+ }];
+ },
+
+}).register('mailActions'); \ No newline at end of file
diff --git a/client/components/rules/ruleDetails.jade b/client/components/rules/ruleDetails.jade
new file mode 100644
index 00000000..b9a1351c
--- /dev/null
+++ b/client/components/rules/ruleDetails.jade
@@ -0,0 +1,18 @@
+template(name="ruleDetails")
+ .rules
+ h2
+ i.fa.fa-magic
+ | {{{_ 'r-rule-details' }}}
+ .triggers-content
+ .triggers-body
+ .triggers-main-body
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ = trigger
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ = action
+
+ \ No newline at end of file
diff --git a/client/components/rules/ruleDetails.js b/client/components/rules/ruleDetails.js
new file mode 100644
index 00000000..385b0bae
--- /dev/null
+++ b/client/components/rules/ruleDetails.js
@@ -0,0 +1,36 @@
+BlazeComponent.extendComponent({
+ onCreated() {
+ this.subscribe('allRules');
+ this.subscribe('allTriggers');
+ this.subscribe('allActions');
+
+ },
+
+ trigger() {
+ const ruleId = this.data().ruleId;
+ const rule = Rules.findOne({
+ _id: ruleId.get()
+ });
+ const trigger = Triggers.findOne({
+ _id: rule.triggerId
+ });
+ console.log(trigger);
+ return trigger.description();
+ },
+ action() {
+ const ruleId = this.data().ruleId;
+ const rule = Rules.findOne({
+ _id: ruleId.get()
+ });
+ const action = Actions.findOne({
+ _id: rule.actionId
+ });
+ console.log(action);
+ return action.description();
+ },
+
+ events() {
+ return [{}];
+ },
+
+}).register('ruleDetails'); \ No newline at end of file
diff --git a/client/components/rules/rules.styl b/client/components/rules/rules.styl
new file mode 100644
index 00000000..68d74d32
--- /dev/null
+++ b/client/components/rules/rules.styl
@@ -0,0 +1,156 @@
+.rules-list
+ overflow:hidden
+ overflow-y:scroll
+ max-height: 400px
+.rules-lists-item
+ display: block
+ position: relative
+ overflow: auto
+ p
+ display: inline-block
+ float: left
+ margin: revert
+
+.rules-btns-group
+ position: absolute
+ right: 0
+ top: 50%
+ transform: translateY(-50%)
+ button
+ margin: auto
+.rules-add
+ display: block
+ overflow: auto
+ margin-top: 15px
+ margin-bottom: 5px
+ input
+ display: inline-block
+ float: right
+ margin: auto
+ margin-right: 10px
+ button
+ display: inline-block
+ float: right
+ margin: auto
+.flex
+ display: -webkit-box
+ display: -moz-box
+ display: -webkit-flex
+ display: -moz-flex
+ display: -ms-flexbox
+ display: flex
+
+
+
+.triggers-content
+ color: #727479
+ background: #dedede
+ .triggers-body
+ display flex
+ padding-top 15px
+ height 100%
+
+ .triggers-side-menu
+ background-color: #f7f7f7
+ border: 1px solid #f0f0f0
+ border-radius: 4px
+ height: intrinsic
+ box-shadow: inset -1px -1px 3px rgba(0,0,0,.05)
+
+ ul
+
+ li
+ margin: 0.1rem 0.2rem;
+ width:50px
+ height:50px
+ text-align:center
+ font-size: 25px
+ position: relative
+
+ i
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ box-shadow: none
+ transform: translate(-50%,-50%);
+
+
+ &.active
+ background #fff
+ box-shadow 0 1px 2px rgba(0,0,0,0.15);
+
+ &:hover
+ background #fff
+ box-shadow 0 1px 2px rgba(0,0,0,0.15);
+ a
+ @extends .flex
+ padding: 1rem 0 1rem 1rem
+ width: 100% - 5rem
+
+
+ span
+ font-size: 13px
+ .triggers-main-body
+ padding: 0.1em 1em
+ width:100%
+ .trigger-item
+ overflow:auto
+ padding:10px
+ height:40px
+ margin-bottom:5px
+ border-radius: 3px
+ position: relative
+ background-color: white
+ .trigger-content
+ position:absolute
+ top:50%
+ transform: translateY(-50%)
+ left:10px
+ .trigger-text
+ font-size: 16px
+ display:inline-block
+ .trigger-text.trigger-text-email
+ margin-left: 5px;
+ margin-top: 10px;
+ margin-bottom: 10px;
+ .trigger-dropdown
+ display:inline-block
+ select
+ width:100px
+ height:30px
+ margin:0px
+ margin-left:5px
+ input
+ display: inline-block
+ width: 80px;
+ margin: 0;
+ .trigger-content-mail
+ left:20px
+ right:100px
+ .trigger-button
+ position:absolute
+ top:50%
+ transform: translateY(-50%)
+ width:30px
+ height:30px
+ border: 1px solid #eee
+ border-radius: 4px
+ box-shadow: inset -1px -1px 3px rgba(0,0,0,.05)
+ text-align:center
+ font-size: 20px
+ right:10px
+ i
+ position: absolute
+ top: 50%
+ left: 50%
+ box-shadow: none
+ transform: translate(-50%,-50%)
+ &:hover, &.is-active
+ box-shadow: 0 0 0 2px darken(white, 60%) inset
+ .trigger-button.trigger-button-email
+ top:30px
+ .trigger-item.trigger-item-mail
+ height:300px
+
+
+
diff --git a/client/components/rules/rulesActions.jade b/client/components/rules/rulesActions.jade
new file mode 100644
index 00000000..8dfceeeb
--- /dev/null
+++ b/client/components/rules/rulesActions.jade
@@ -0,0 +1,25 @@
+template(name="rulesActions")
+ h2
+ i.fa.fa-magic
+ | {{{_ 'r-rule' }}} "#{data.ruleName.get}" - {{{_ 'r-add-action'}}}
+ .triggers-content
+ .triggers-body
+ .triggers-side-menu
+ ul
+ li.active.js-set-board-actions
+ i.fa.fa-columns
+ li.js-set-card-actions
+ i.fa.fa-sticky-note
+ li.js-set-checklist-actions
+ i.fa.fa-check
+ li.js-set-mail-actions
+ i.fa.fa-at
+ .triggers-main-body
+ if ($eq currentActions.get 'board')
+ +boardActions(ruleName=data.ruleName triggerVar=data.triggerVar)
+ else if ($eq currentActions.get 'card')
+ +cardActions(ruleName=data.ruleName triggerVar=data.triggerVar)
+ else if ($eq currentActions.get 'checklist')
+ +checklistActions(ruleName=data.ruleName triggerVar=data.triggerVar)
+ else if ($eq currentActions.get 'mail')
+ +mailActions(ruleName=data.ruleName triggerVar=data.triggerVar) \ No newline at end of file
diff --git a/client/components/rules/rulesActions.js b/client/components/rules/rulesActions.js
new file mode 100644
index 00000000..d492cbd5
--- /dev/null
+++ b/client/components/rules/rulesActions.js
@@ -0,0 +1,58 @@
+BlazeComponent.extendComponent({
+ onCreated() {
+ this.currentActions = new ReactiveVar("board");
+ },
+
+ setBoardActions() {
+ this.currentActions.set("board");
+ $('.js-set-card-actions').removeClass('active');
+ $('.js-set-board-actions').addClass('active');
+ $('.js-set-checklist-actions').removeClass('active');
+ $('.js-set-mail-actions').removeClass('active');
+ },
+ setCardActions() {
+ this.currentActions.set("card");
+ $('.js-set-card-actions').addClass('active');
+ $('.js-set-board-actions').removeClass('active');
+ $('.js-set-checklist-actions').removeClass('active');
+ $('.js-set-mail-actions').removeClass('active');
+ },
+ setChecklistActions() {
+ this.currentActions.set("checklist");
+ $('.js-set-card-actions').removeClass('active');
+ $('.js-set-board-actions').removeClass('active');
+ $('.js-set-checklist-actions').addClass('active');
+ $('.js-set-mail-actions').removeClass('active');
+ },
+ setMailActions() {
+ this.currentActions.set("mail");
+ $('.js-set-card-actions').removeClass('active');
+ $('.js-set-board-actions').removeClass('active');
+ $('.js-set-checklist-actions').removeClass('active');
+ $('.js-set-mail-actions').addClass('active');
+ },
+
+ rules() {
+ return Rules.find({});
+ },
+
+ name() {
+ console.log(this.data());
+ },
+ events() {
+ return [{
+ 'click .js-set-board-actions' (event) {
+ this.setBoardActions();
+ },
+ 'click .js-set-card-actions' (event) {
+ this.setCardActions();
+ },
+ 'click .js-set-mail-actions' (event) {
+ this.setMailActions();
+ },
+ 'click .js-set-checklist-actions' (event) {
+ this.setChecklistActions();
+ },
+ }];
+ },
+}).register('rulesActions'); \ No newline at end of file
diff --git a/client/components/rules/rulesList.jade b/client/components/rules/rulesList.jade
new file mode 100644
index 00000000..c2676aa7
--- /dev/null
+++ b/client/components/rules/rulesList.jade
@@ -0,0 +1,27 @@
+template(name="rulesList")
+ .rules
+ h2
+ i.fa.fa-magic
+ | {{{_ 'r-board-rules' }}}
+
+ ul.rules-list
+ each rules
+ li.rules-lists-item
+ p
+ = title
+ div.rules-btns-group
+ button.js-goto-details
+ i.fa.fa-eye
+ | {{{_ 'r-view-rule'}}}
+ if currentUser.isAdmin
+ button.js-delete-rule
+ i.fa.fa-trash-o
+ | {{{_ 'r-delete-rule'}}}
+ else
+ li.no-items-message {{{_ 'r-no-rules' }}}
+ if currentUser.isAdmin
+ div.rules-add
+ button.js-goto-trigger
+ i.fa.fa-plus
+ | {{{_ 'r-add-rule'}}}
+ input(type=text,placeholder="{{{_ 'r-new-rule-name' }}}",id="ruleTitle") \ No newline at end of file
diff --git a/client/components/rules/rulesList.js b/client/components/rules/rulesList.js
new file mode 100644
index 00000000..e7b4660a
--- /dev/null
+++ b/client/components/rules/rulesList.js
@@ -0,0 +1,15 @@
+BlazeComponent.extendComponent({
+ onCreated() {
+ this.subscribe('allRules');
+ },
+
+ rules() {
+ const boardId = Session.get('currentBoard');
+ return Rules.find({
+ "boardId": boardId
+ });
+ },
+ events() {
+ return [{}];
+ },
+}).register('rulesList'); \ No newline at end of file
diff --git a/client/components/rules/rulesMain.jade b/client/components/rules/rulesMain.jade
new file mode 100644
index 00000000..dc33ee4e
--- /dev/null
+++ b/client/components/rules/rulesMain.jade
@@ -0,0 +1,9 @@
+template(name="rulesMain")
+ if($eq rulesCurrentTab.get 'rulesList')
+ +rulesList
+ if($eq rulesCurrentTab.get 'trigger')
+ +rulesTriggers(ruleName=ruleName triggerVar=triggerVar)
+ if($eq rulesCurrentTab.get 'action')
+ +rulesActions(ruleName=ruleName triggerVar=triggerVar)
+ if($eq rulesCurrentTab.get 'ruleDetails')
+ +ruleDetails(ruleId=ruleId) \ No newline at end of file
diff --git a/client/components/rules/rulesMain.js b/client/components/rules/rulesMain.js
new file mode 100644
index 00000000..e4cac03d
--- /dev/null
+++ b/client/components/rules/rulesMain.js
@@ -0,0 +1,58 @@
+BlazeComponent.extendComponent({
+ onCreated() {
+ this.rulesCurrentTab = new ReactiveVar("rulesList")
+ this.ruleName = new ReactiveVar("");
+ this.triggerVar = new ReactiveVar();
+ this.ruleId = new ReactiveVar();
+ },
+
+ setTrigger() {
+ this.rulesCurrentTab.set("trigger")
+ },
+
+ setRulesList() {
+ this.rulesCurrentTab.set("rulesList")
+ },
+
+ setAction() {
+ this.rulesCurrentTab.set("action")
+ },
+ setRuleDetails() {
+ this.rulesCurrentTab.set("ruleDetails")
+ },
+
+ events() {
+ return [{
+ 'click .js-delete-rule' (event) {
+ const rule = this.currentData();
+ Rules.remove(rule._id);
+ Actions.remove(rule.actionId);
+ Triggers.remove(rule.triggerId);
+
+ },
+ 'click .js-goto-trigger' (event) {
+ event.preventDefault();
+ const ruleTitle = this.find('#ruleTitle').value;
+ this.find('#ruleTitle').value = "";
+ this.ruleName.set(ruleTitle)
+ this.setTrigger();
+ },
+ 'click .js-goto-action' (event) {
+ event.preventDefault();
+ this.setAction();
+ },
+ 'click .js-goto-rules' (event) {
+ event.preventDefault();
+ this.setRulesList();
+ },
+ 'click .js-goto-details' (event) {
+ event.preventDefault();
+ const rule = this.currentData();
+ this.ruleId.set(rule._id)
+ this.setRuleDetails();
+ },
+
+ }];
+ },
+
+}).register('rulesMain'); \ No newline at end of file
diff --git a/client/components/rules/rulesTriggers.jade b/client/components/rules/rulesTriggers.jade
new file mode 100644
index 00000000..0ef5edfa
--- /dev/null
+++ b/client/components/rules/rulesTriggers.jade
@@ -0,0 +1,21 @@
+template(name="rulesTriggers")
+ h2
+ i.fa.fa-magic
+ | {{{_ 'r-rule' }}} "#{data.ruleName.get}" - {{{_ 'r-add-trigger'}}}
+ .triggers-content
+ .triggers-body
+ .triggers-side-menu
+ ul
+ li.active.js-set-board-triggers
+ i.fa.fa-columns
+ li.js-set-card-triggers
+ i.fa.fa-sticky-note
+ li.js-set-checklist-triggers
+ i.fa.fa-check
+ .triggers-main-body
+ if showBoardTrigger.get
+ +boardTriggers
+ else if showCardTrigger.get
+ +cardTriggers
+ else if showChecklistTrigger.get
+ +checklistTriggers \ No newline at end of file
diff --git a/client/components/rules/rulesTriggers.js b/client/components/rules/rulesTriggers.js
new file mode 100644
index 00000000..f9dd4ecc
--- /dev/null
+++ b/client/components/rules/rulesTriggers.js
@@ -0,0 +1,53 @@
+BlazeComponent.extendComponent({
+ onCreated() {
+ this.showBoardTrigger = new ReactiveVar(true);
+ this.showCardTrigger = new ReactiveVar(false);
+ this.showChecklistTrigger = new ReactiveVar(false);
+ },
+
+ setBoardTriggers() {
+ this.showBoardTrigger.set(true);
+ this.showCardTrigger.set(false);
+ this.showChecklistTrigger.set(false);
+ $('.js-set-card-triggers').removeClass('active');
+ $('.js-set-board-triggers').addClass('active');
+ $('.js-set-checklist-triggers').removeClass('active');
+ },
+ setCardTriggers() {
+ this.showBoardTrigger.set(false);
+ this.showCardTrigger.set(true);
+ this.showChecklistTrigger.set(false);
+ $('.js-set-card-triggers').addClass('active');
+ $('.js-set-board-triggers').removeClass('active');
+ $('.js-set-checklist-triggers').removeClass('active');
+ },
+ setChecklistTriggers() {
+ this.showBoardTrigger.set(false);
+ this.showCardTrigger.set(false);
+ this.showChecklistTrigger.set(true);
+ $('.js-set-card-triggers').removeClass('active');
+ $('.js-set-board-triggers').removeClass('active');
+ $('.js-set-checklist-triggers').addClass('active');
+ },
+
+ rules() {
+ return Rules.find({});
+ },
+
+ name() {
+ console.log(this.data());
+ },
+ events() {
+ return [{
+ 'click .js-set-board-triggers' (event) {
+ this.setBoardTriggers();
+ },
+ 'click .js-set-card-triggers' (event) {
+ this.setCardTriggers();
+ },
+ 'click .js-set-checklist-triggers' (event) {
+ this.setChecklistTriggers();
+ },
+ }];
+ },
+}).register('rulesTriggers'); \ No newline at end of file
diff --git a/client/components/rules/triggers/boardTriggers.jade b/client/components/rules/triggers/boardTriggers.jade
new file mode 100644
index 00000000..b5e08c8c
--- /dev/null
+++ b/client/components/rules/triggers/boardTriggers.jade
@@ -0,0 +1,61 @@
+template(name="boardTriggers")
+ div.trigger-item
+ 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'}}}
+ 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
+ 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'}}}
+ div.trigger-text
+ | {{{_'r-list'}}}
+ div.trigger-dropdown
+ input(id="create-list-name",type=text,placeholder="{{{_'r-list-name'}}}")
+ div.trigger-button.js-add-create-trigger.js-goto-action
+ i.fa.fa-plus
+
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ | {{{_'r-when-a-card-is'}}}
+ div.trigger-dropdown
+ select(id="move-action")
+ option(value="moved-to") {{{_'r-moved-to'}}}
+ option(value="moved-from") {{{_'r-moved-from'}}}
+ div.trigger-text
+ | {{{_'r-list'}}}
+ div.trigger-dropdown
+ input(id="move-list-name",type=text,placeholder="{{{_'r-list-name'}}}")
+ div.trigger-button.js-add-moved-trigger.js-goto-action
+ i.fa.fa-plus
+
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ | {{{_'r-when-a-card-is'}}}
+ div.trigger-dropdown
+ select(id="arch-action")
+ option(value="archived") {{{_'r-archived'}}}
+ option(value="unarchived") {{{_'r-unarchived'}}}
+ div.trigger-button.js-add-arch-trigger.js-goto-action
+ i.fa.fa-plus
+
+
+
+
+
+
+
diff --git a/client/components/rules/triggers/boardTriggers.js b/client/components/rules/triggers/boardTriggers.js
new file mode 100644
index 00000000..95c10a5b
--- /dev/null
+++ b/client/components/rules/triggers/boardTriggers.js
@@ -0,0 +1,103 @@
+BlazeComponent.extendComponent({
+ onCreated() {
+
+ },
+
+ events() {
+ return [{
+ 'click .js-add-gen-trigger' (event) {
+ const desc = Utils.getTriggerActionDesc(event, this);
+ let datas = this.data();
+ const actionSelected = this.find('#gen-action').value;
+ const boardId = Session.get('currentBoard')
+ if (actionSelected == "created") {
+ datas.triggerVar.set({
+ activityType: "createCard",
+ "boardId": boardId,
+ "listName": "*",
+ "desc": desc
+ });
+ }
+ if (actionSelected == "removed") {
+ datas.triggerVar.set({
+ activityType: "removeCard",
+ "boardId": boardId,
+ "desc": desc
+ });
+ }
+
+ },
+ 'click .js-add-create-trigger' (event) {
+ const desc = Utils.getTriggerActionDesc(event, this);
+ let datas = this.data();
+ const actionSelected = this.find('#create-action').value;
+ const listName = this.find('#create-list-name').value;
+ const boardId = Session.get('currentBoard')
+ if (actionSelected == "created") {
+ datas.triggerVar.set({
+ activityType: "createCard",
+ "boardId": boardId,
+ "listName": listName,
+ "desc": desc
+ });
+ }
+ if (actionSelected == "removed") {
+ datas.triggerVar.set({
+ activityType: "removeCard",
+ "boardId": boardId,
+ "listName": listName,
+ "desc": desc
+ });
+ }
+ },
+ 'click .js-add-moved-trigger' (event) {
+ let datas = this.data();
+ const desc = Utils.getTriggerActionDesc(event, this);
+
+ const actionSelected = this.find('#move-action').value;
+ const listName = this.find('#move-list-name').value;
+ const boardId = Session.get('currentBoard')
+ if (actionSelected == "moved-to") {
+ datas.triggerVar.set({
+ activityType: "moveCard",
+ "boardId": boardId,
+ "listName": listName,
+ "oldListName": "*",
+ "desc": desc
+ });
+ }
+ if (actionSelected == "moved-from") {
+ datas.triggerVar.set({
+ activityType: "moveCard",
+ "boardId": boardId,
+ "listName": "*",
+ "oldListName": listName,
+ "desc": desc
+ });
+ }
+ },
+ 'click .js-add-arc-trigger' (event) {
+ let datas = this.data();
+ const desc = Utils.getTriggerActionDesc(event, this);
+ const actionSelected = this.find('#arch-action').value;
+ const boardId = Session.get('currentBoard')
+ if (actionSelected == "archived") {
+ datas.triggerVar.set({
+ activityType: "archivedCard",
+ "boardId": boardId,
+ "desc": desc
+ });
+ }
+ if (actionSelected == "unarchived") {
+ datas.triggerVar.set({
+ activityType: "restoredCard",
+ "boardId": boardId,
+ "desc": desc
+ });
+ }
+ }
+
+ }];
+ },
+
+}).register('boardTriggers'); \ No newline at end of file
diff --git a/client/components/rules/triggers/cardTriggers.jade b/client/components/rules/triggers/cardTriggers.jade
new file mode 100644
index 00000000..dd02413c
--- /dev/null
+++ b/client/components/rules/triggers/cardTriggers.jade
@@ -0,0 +1,79 @@
+template(name="cardTriggers")
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ | {{{_'r-when-a-label-is'}}}
+ div.trigger-dropdown
+ select(id="label-action")
+ option(value="added") {{{_'r-added-to'}}}
+ option(value="removed") {{{_'r-removed-from'}}}
+ div.trigger-text
+ | {{{_'r-a-card'}}}
+ div.trigger-button.js-add-gen-label-trigger.js-goto-action
+ i.fa.fa-plus
+
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ | {{{_'r-when-the-label-is'}}}
+ div.trigger-dropdown
+ select(id="spec-label")
+ each labels
+ option(value="#{_id}")
+ = name
+ div.trigger-text
+ | {{{_'r-is'}}}
+ div.trigger-dropdown
+ select(id="spec-label-action")
+ option(value="added") {{{_'r-added-to'}}}
+ option(value="removed") {{{_'r-removed-from'}}}
+ div.trigger-text
+ | {{{_'r-a-card'}}}
+ div.trigger-button.js-add-spec-label-trigger.js-goto-action
+ i.fa.fa-plus
+
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ | {{{_'r-when-a-member'}}}
+ div.trigger-dropdown
+ select(id="gen-member-action")
+ option(value="added") {{{_'r-added-to'}}}
+ option(value="removed") {{{_'r-removed-from'}}}
+ div.trigger-text
+ | {{{_'r-a-card'}}}
+ div.trigger-button.js-add-gen-member-trigger.js-goto-action
+ i.fa.fa-plus
+
+
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ | {{{_'r-when-the-member'}}}
+ div.trigger-dropdown
+ input(id="spec-member",type=text,placeholder="{{{_'r-name'}}}")
+ div.trigger-text
+ | {{{_'r-is'}}}
+ div.trigger-dropdown
+ select(id="spec-member-action")
+ option(value="added") {{{_'r-added-to'}}}
+ option(value="removed") {{{_'r-removed-from'}}}
+ div.trigger-text
+ | {{{_'r-a-card'}}}
+ div.trigger-button.js-add-spec-member-trigger.js-goto-action
+ i.fa.fa-plus
+
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ | {{{_'r-when-a-attach'}}}
+ div.trigger-text
+ | {{{_'r-is'}}}
+ div.trigger-dropdown
+ select(id="attach-action")
+ option(value="added") {{{_'r-added-to'}}}
+ option(value="removed") {{{_'r-removed-from'}}}
+ div.trigger-text
+ | {{{_'r-a-card'}}}
+ div.trigger-button.js-add-attachment-trigger.js-goto-action
+ i.fa.fa-plus \ No newline at end of file
diff --git a/client/components/rules/triggers/cardTriggers.js b/client/components/rules/triggers/cardTriggers.js
new file mode 100644
index 00000000..c0a5ec1a
--- /dev/null
+++ b/client/components/rules/triggers/cardTriggers.js
@@ -0,0 +1,130 @@
+BlazeComponent.extendComponent({
+ onCreated() {
+ this.subscribe('allRules');
+ },
+ labels() {
+ const labels = Boards.findOne(Session.get('currentBoard')).labels;
+ console.log(labels);
+ for (let i = 0; i < labels.length; i++) {
+ if (labels[i].name == "" || labels[i].name == undefined) {
+ labels[i].name = labels[i].color.toUpperCase();
+ }
+ }
+ console.log(labels);
+ return labels;
+ },
+ events() {
+ return [{
+ 'click .js-add-gen-label-trigger' (event) {
+ const desc = Utils.getTriggerActionDesc(event, this);
+ let datas = this.data();
+ const actionSelected = this.find('#label-action').value;
+ const boardId = Session.get('currentBoard')
+ if (actionSelected == "added") {
+ datas.triggerVar.set({
+ activityType: "addedLabel",
+ "boardId": boardId,
+ "labelId": "*",
+ "desc": desc
+ });
+ }
+ if (actionSelected == "removed") {
+ datas.triggerVar.set({
+ activityType: "removedLabel",
+ "boardId": boardId,
+ "labelId": "*",
+ "desc": desc
+ });
+ }
+ },
+ 'click .js-add-spec-label-trigger' (event) {
+ const desc = Utils.getTriggerActionDesc(event, this);
+ let datas = this.data();
+ const actionSelected = this.find('#spec-label-action').value;
+ const labelId = this.find('#spec-label').value;
+ const boardId = Session.get('currentBoard')
+ if (actionSelected == "added") {
+ datas.triggerVar.set({
+ activityType: "addedLabel",
+ "boardId": boardId,
+ "labelId": labelId,
+ "desc": desc
+ });
+ }
+ if (actionSelected == "removed") {
+ datas.triggerVar.set({
+ activityType: "removedLabel",
+ "boardId": boardId,
+ "labelId": labelId,
+ "desc": desc
+ });
+ }
+ },
+ 'click .js-add-gen-member-trigger' (event) {
+ const desc = Utils.getTriggerActionDesc(event, this);
+ let datas = this.data();
+ const actionSelected = this.find('#gen-member-action').value;
+ const boardId = Session.get('currentBoard')
+ if (actionSelected == "added") {
+ datas.triggerVar.set({
+ activityType: "joinMember",
+ "boardId": boardId,
+ "memberId": "*",
+ "desc": desc
+ });
+ }
+ if (actionSelected == "removed") {
+ datas.triggerVar.set({
+ activityType: "unjoinMember",
+ "boardId": boardId,
+ "memberId": "*",
+ "desc": desc
+ });
+ }
+ },
+ 'click .js-add-spec-member-trigger' (event) {
+ const desc = Utils.getTriggerActionDesc(event, this);
+ let datas = this.data();
+ const actionSelected = this.find('#spec-member-action').value;
+ const memberId = this.find('#spec-member').value;
+ const boardId = Session.get('currentBoard')
+ if (actionSelected == "added") {
+ datas.triggerVar.set({
+ activityType: "joinMember",
+ "boardId": boardId,
+ "memberId": memberId,
+ "desc": desc
+ });
+ }
+ if (actionSelected == "removed") {
+ datas.triggerVar.set({
+ activityType: "unjoinMember",
+ "boardId": boardId,
+ "memberId": memberId,
+ "desc": desc
+ });
+ }
+ },
+ 'click .js-add-attachment-trigger' (event) {
+ const desc = Utils.getTriggerActionDesc(event, this);
+ let datas = this.data();
+ const actionSelected = this.find('#attach-action').value;
+ const boardId = Session.get('currentBoard')
+ if (actionSelected == "added") {
+ datas.triggerVar.set({
+ activityType: "addAttachment",
+ "boardId": boardId,
+ "desc": desc
+ });
+ }
+ if (actionSelected == "removed") {
+ datas.triggerVar.set({
+ activityType: "deleteAttachment",
+ "boardId": boardId,
+ "desc": desc
+ });
+ }
+ },
+ }];
+ },
+}).register('cardTriggers'); \ No newline at end of file
diff --git a/client/components/rules/triggers/checklistTriggers.jade b/client/components/rules/triggers/checklistTriggers.jade
new file mode 100644
index 00000000..465713c8
--- /dev/null
+++ b/client/components/rules/triggers/checklistTriggers.jade
@@ -0,0 +1,83 @@
+template(name="checklistTriggers")
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ | {{{_'r-when-a-checklist'}}}
+ div.trigger-dropdown
+ select(id="gen-check-action")
+ option(value="created") {{{_'r-added-to'}}}
+ option(value="removed") {{{_'r-removed-from'}}}
+ div.trigger-text
+ | {{{_'r-a-card'}}}
+ div.trigger-button.js-add-gen-check-trigger.js-goto-action
+ i.fa.fa-plus
+
+
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ | {{{_'r-when-the-checklist'}}}
+ div.trigger-dropdown
+ input(id="check-name",type=text,placeholder="{{{_'r-name'}}}")
+ div.trigger-text
+ | {{{_'r-is'}}}
+ div.trigger-dropdown
+ select(id="spec-check-action")
+ option(value="created") {{{_'r-added-to'}}}
+ option(value="removed") {{{_'r-removed-from'}}}
+ div.trigger-text
+ | {{{_'r-a-card'}}}
+ div.trigger-button.js-add-spec-check-trigger.js-goto-action
+ i.fa.fa-plus
+
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ | {{{_'r-when-a-checklist'}}}
+ div.trigger-dropdown
+ select(id="gen-comp-check-action")
+ option(value="completed") {{{_'r-completed'}}}
+ option(value="uncompleted") {{{_'r-made-incomplete'}}}
+ div.trigger-button.js-add-gen-comp-trigger.js-goto-action
+ i.fa.fa-plus
+
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ | {{{_'r-when-the-checklist'}}}
+ div.trigger-dropdown
+ input(id="spec-comp-check-name",type=text,placeholder="{{{_'r-name'}}}")
+ div.trigger-text
+ | {{{_'r-is'}}}
+ div.trigger-dropdown
+ select(id="spec-comp-check-action")
+ option(value="completed") {{{_'r-completed'}}}
+ option(value="uncompleted") {{{_'r-made-incomplete'}}}
+ div.trigger-button.js-add-spec-comp-trigger.js-goto-action
+ i.fa.fa-plus
+
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ | {{{_'r-when-a-item'}}}
+ div.trigger-dropdown
+ select(id="check-item-gen-action")
+ option(value="checked") {{{_'r-checked'}}}
+ option(value="unchecked") {{{_'r-unchecked'}}}
+ div.trigger-button.js-add-gen-check-item-trigger.js-goto-action
+ i.fa.fa-plus
+
+ div.trigger-item
+ div.trigger-content
+ div.trigger-text
+ | {{{_'r-when-the-item'}}}
+ div.trigger-dropdown
+ input(id="check-item-name",type=text,placeholder="{{{_'r-name'}}}")
+ div.trigger-text
+ | {{{_'r-is'}}}
+ div.trigger-dropdown
+ select(id="check-item-spec-action")
+ option(value="checked") {{{_'r-checked'}}}
+ option(value="unchecked") {{{_'r-unchecked'}}}
+ div.trigger-button.js-add-spec-check-item-trigger.js-goto-action
+ i.fa.fa-plus \ No newline at end of file
diff --git a/client/components/rules/triggers/checklistTriggers.js b/client/components/rules/triggers/checklistTriggers.js
new file mode 100644
index 00000000..6e7b3445
--- /dev/null
+++ b/client/components/rules/triggers/checklistTriggers.js
@@ -0,0 +1,146 @@
+BlazeComponent.extendComponent({
+ onCreated() {
+ this.subscribe('allRules');
+ },
+ events() {
+ return [{
+ 'click .js-add-gen-check-trigger' (event) {
+ const desc = Utils.getTriggerActionDesc(event, this);
+ let datas = this.data();
+ const actionSelected = this.find('#gen-check-action').value;
+ const boardId = Session.get('currentBoard')
+ if (actionSelected == "created") {
+ datas.triggerVar.set({
+ activityType: "addChecklist",
+ "boardId": boardId,
+ "checklistName": "*",
+ "desc": desc
+ });
+ }
+ if (actionSelected == "removed") {
+ datas.triggerVar.set({
+ activityType: "removeChecklist",
+ "boardId": boardId,
+ "checklistName": "*",
+ "desc": desc
+ });
+ }
+ },
+ 'click .js-add-spec-check-trigger' (event) {
+ const desc = Utils.getTriggerActionDesc(event, this);
+ let datas = this.data();
+ const actionSelected = this.find('#spec-check-action').value;
+ const checklistId = this.find('#check-name').value;
+ const boardId = Session.get('currentBoard')
+ if (actionSelected == "created") {
+ datas.triggerVar.set({
+ activityType: "addChecklist",
+ "boardId": boardId,
+ "checklistName": checklistId,
+ "desc": desc
+ });
+ }
+ if (actionSelected == "removed") {
+ datas.triggerVar.set({
+ activityType: "removeChecklist",
+ "boardId": boardId,
+ "checklistName": checklistId,
+ "desc": desc
+ });
+ }
+ },
+ 'click .js-add-gen-comp-trigger' (event) {
+ const desc = Utils.getTriggerActionDesc(event, this);
+
+ let datas = this.data();
+ const actionSelected = this.find('#gen-comp-check-action').value;
+ const boardId = Session.get('currentBoard')
+ if (actionSelected == "completed") {
+ datas.triggerVar.set({
+ activityType: "completeChecklist",
+ "boardId": boardId,
+ "checklistName": "*",
+ "desc": desc
+ });
+ }
+ if (actionSelected == "uncompleted") {
+ datas.triggerVar.set({
+ activityType: "uncompleteChecklist",
+ "boardId": boardId,
+ "checklistName": "*",
+ "desc": desc
+ });
+ }
+ },
+ 'click .js-add-spec-comp-trigger' (event) {
+ const desc = Utils.getTriggerActionDesc(event, this);
+ let datas = this.data();
+ const actionSelected = this.find('#spec-comp-check-action').value;
+ const checklistId = this.find('#spec-comp-check-name').value;
+ const boardId = Session.get('currentBoard')
+ if (actionSelected == "added") {
+ datas.triggerVar.set({
+ activityType: "completeChecklist",
+ "boardId": boardId,
+ "checklistName": checklistId,
+ "desc": desc
+ });
+ }
+ if (actionSelected == "removed") {
+ datas.triggerVar.set({
+ activityType: "uncompleteChecklist",
+ "boardId": boardId,
+ "checklistName": checklistId,
+ "desc": desc
+ });
+ }
+ },
+ 'click .js-add-gen-check-item-trigger' (event) {
+ const desc = Utils.getTriggerActionDesc(event, this);
+ let datas = this.data();
+ const actionSelected = this.find('#check-item-gen-action').value;
+ const boardId = Session.get('currentBoard')
+ if (actionSelected == "checked") {
+ datas.triggerVar.set({
+ activityType: "checkedItem",
+ "boardId": boardId,
+ "checklistItemName": "*",
+ "desc": desc
+ });
+ }
+ if (actionSelected == "unchecked") {
+ datas.triggerVar.set({
+ activityType: "uncheckedItem",
+ "boardId": boardId,
+ "checklistItemName": "*",
+ "desc": desc
+ });
+ }
+ },
+ 'click .js-add-spec-check-item-trigger' (event) {
+ const desc = Utils.getTriggerActionDesc(event, this);
+ let datas = this.data();
+ const actionSelected = this.find('#check-item-spec-action').value;
+ const checklistItemId = this.find('#check-item-name').value;
+ const boardId = Session.get('currentBoard')
+ if (actionSelected == "checked") {
+ datas.triggerVar.set({
+ activityType: "checkedItem",
+ "boardId": boardId,
+ "checklistItemName": checklistItemId,
+ "desc": desc
+ });
+ }
+ if (actionSelected == "unchecked") {
+ datas.triggerVar.set({
+ activityType: "uncheckedItem",
+ "boardId": boardId,
+ "checklistItemName": checklistItemId,
+ "desc": desc
+ });
+ }
+ },
+ }];
+ },
+
+}).register('checklistTriggers'); \ No newline at end of file
diff --git a/client/lib/modal.js b/client/lib/modal.js
index d5350264..3c27a179 100644
--- a/client/lib/modal.js
+++ b/client/lib/modal.js
@@ -4,6 +4,7 @@ window.Modal = new class {
constructor() {
this._currentModal = new ReactiveVar(closedValue);
this._onCloseGoTo = '';
+ this._isWideModal = false;
}
getHeaderName() {
@@ -20,6 +21,10 @@ window.Modal = new class {
return this.getTemplateName() !== closedValue;
}
+ isWide(){
+ return this._isWideModal;
+ }
+
close() {
this._currentModal.set(closedValue);
if (this._onCloseGoTo) {
@@ -27,9 +32,16 @@ window.Modal = new class {
}
}
+ openWide(modalName, { header = '', onCloseGoTo = ''} = {}) {
+ this._currentModal.set({ header, modalName });
+ this._onCloseGoTo = onCloseGoTo;
+ this._isWideModal = true;
+ }
+
open(modalName, { header = '', onCloseGoTo = ''} = {}) {
this._currentModal.set({ header, modalName });
this._onCloseGoTo = onCloseGoTo;
+
}
}();
@@ -38,5 +50,5 @@ Blaze.registerHelper('Modal', Modal);
EscapeActions.register('modalWindow',
() => Modal.close(),
() => Modal.isOpen(),
- { noClickEscapeOn: '.modal-content' }
+ { noClickEscapeOn: '.modal-container' }
);
diff --git a/client/lib/popup.js b/client/lib/popup.js
index 0a700f82..cb56858f 100644
--- a/client/lib/popup.js
+++ b/client/lib/popup.js
@@ -83,6 +83,7 @@ window.Popup = new class {
// our internal dependency, and since we just changed the top element of
// our internal stack, the popup will be updated with the new data.
if (!self.isOpen()) {
+ console.log(self.template)
self.current = Blaze.renderWithData(self.template, () => {
self._dep.depend();
return { ...self._getTopStack(), stack: self._stack };
diff --git a/client/lib/utils.js b/client/lib/utils.js
index 5349e500..a15dac39 100644
--- a/client/lib/utils.js
+++ b/client/lib/utils.js
@@ -39,11 +39,11 @@ Utils = {
if (!prevData && !nextData) {
base = 0;
increment = 1;
- // If we drop the card in the first position
+ // If we drop the card in the first position
} else if (!prevData) {
base = nextData.sort - 1;
increment = -1;
- // If we drop the card in the last position
+ // If we drop the card in the last position
} else if (!nextData) {
base = prevData.sort + 1;
increment = 1;
@@ -71,11 +71,11 @@ Utils = {
if (!prevCardDomElement && !nextCardDomElement) {
base = 0;
increment = 1;
- // If we drop the card in the first position
+ // If we drop the card in the first position
} else if (!prevCardDomElement) {
base = Blaze.getData(nextCardDomElement).sort - 1;
increment = -1;
- // If we drop the card in the last position
+ // If we drop the card in the last position
} else if (!nextCardDomElement) {
base = Blaze.getData(prevCardDomElement).sort + 1;
increment = 1;
@@ -145,6 +145,7 @@ Utils = {
});
},
+<<<<<<< HEAD
setMatomo(data){
window._paq = window._paq || [];
window._paq.push(['setDoNotTrack', data.doNotTrack]);
@@ -188,6 +189,26 @@ Utils = {
} else if (matomo) {
window._paq.push(['trackPageView']);
}
+
+ getTriggerActionDesc(event, tempInstance) {
+ const jqueryEl = tempInstance.$(event.currentTarget.parentNode);
+ const triggerEls = jqueryEl.find(".trigger-content").children();
+ let finalString = "";
+ for (let i = 0; i < triggerEls.length; i++) {
+ const element = tempInstance.$(triggerEls[i]);
+ if (element.hasClass("trigger-text")) {
+ finalString += element.text().toLowerCase();
+ } 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();
+ }
+ // Add space
+ if (i != length - 1) {
+ finalString += " ";
+ }
+ }
+ return finalString;
},
};