summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAngelo Gallarello <angelo.gallarell@gmail.com>2018-08-03 19:47:20 +0200
committerAngelo Gallarello <angelo.gallarell@gmail.com>2018-08-03 19:47:20 +0200
commitf63482b58775a2f52fdd5f932ce7d14f16757133 (patch)
tree886fdeae889b05ea009d67ed2181a5c46985f48a
parentd5870472fbc988d1a4a4fcec0aa46544bbedefab (diff)
downloadwekan-f63482b58775a2f52fdd5f932ce7d14f16757133.tar.gz
wekan-f63482b58775a2f52fdd5f932ce7d14f16757133.tar.bz2
wekan-f63482b58775a2f52fdd5f932ce7d14f16757133.zip
UI for rules list
-rw-r--r--.DS_Storebin0 -> 6148 bytes
-rw-r--r--.meteor/packages4
-rw-r--r--RASD.txt22
-rw-r--r--client/components/boards/boardHeader.jade9
-rw-r--r--client/components/boards/boardHeader.js3
-rw-r--r--client/components/lists/listBody.js2
-rw-r--r--client/components/rules/rules.jade27
-rw-r--r--client/components/rules/rules.js25
-rw-r--r--client/components/rules/rules.styl34
-rw-r--r--client/lib/popup.js1
-rw-r--r--i18n/en.i18n.json1
-rw-r--r--models/.DS_Storebin0 -> 6148 bytes
-rw-r--r--models/cards.js1
-rw-r--r--models/rules.js38
-rw-r--r--models/triggers.js74
-rw-r--r--server/.DS_Storebin0 -> 6148 bytes
-rw-r--r--server/lib/.DS_Storebin0 -> 6148 bytes
-rw-r--r--server/lib/utils.js3
-rw-r--r--server/publications/rules.js14
19 files changed, 256 insertions, 2 deletions
diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 00000000..06b93641
--- /dev/null
+++ b/.DS_Store
Binary files differ
diff --git a/.meteor/packages b/.meteor/packages
index e76e15fb..2ea5e19f 100644
--- a/.meteor/packages
+++ b/.meteor/packages
@@ -6,7 +6,7 @@
meteor-base@1.2.0
# Build system
-ecmascript@0.9.0
+ecmascript
stylus@2.513.13
standard-minifier-css@1.3.5
standard-minifier-js@2.2.0
@@ -85,4 +85,4 @@ browser-policy
eluck:accounts-lockout
rzymek:fullcalendar
momentjs:moment@2.22.2
-atoy40:accounts-cas \ No newline at end of file
+atoy40:accounts-cas
diff --git a/RASD.txt b/RASD.txt
new file mode 100644
index 00000000..fc1b4190
--- /dev/null
+++ b/RASD.txt
@@ -0,0 +1,22 @@
+Rules
+
+ Triggers
+
+ Board: create card, card moved to, card moved from
+ Card: [label, attachement, person ] added/removed, name starts with
+ Checklists : checklist added/removed, check item checked/unchecked, checklist completed
+
+ Actions
+ Board: move card to list, move to top/bottom, archive/unarchive
+ Card: [label, attachement, person ] add/remove, set title/description
+ Checklists : checklist add/remove, check/uncheck item
+ Mail: send email to
+
+Calendar
+
+ Triggers
+ Recurrent day/month/year/day of the week
+
+ Actions
+ Board: create card with [title, description, label, checklist, person, date]
+ \ No newline at end of file
diff --git a/client/components/boards/boardHeader.jade b/client/components/boards/boardHeader.jade
index 1c6c8f8c..5116de28 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-cutlery
+ 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..bf36da7d 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.open('rules');
+ },
'click .js-multiselection-activate'() {
const currentCard = Session.get('currentCard');
MultiSelection.activate();
diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js
index 0a10f7d5..b93b7e67 100644
--- a/client/components/lists/listBody.js
+++ b/client/components/lists/listBody.js
@@ -95,6 +95,8 @@ BlazeComponent.extendComponent({
evt.preventDefault();
Utils.goBoardId(Session.get('currentBoard'));
}
+ console.log(evt)
+
},
cardIsSelected() {
diff --git a/client/components/rules/rules.jade b/client/components/rules/rules.jade
new file mode 100644
index 00000000..8f482b06
--- /dev/null
+++ b/client/components/rules/rules.jade
@@ -0,0 +1,27 @@
+template(name="rules")
+ .rules
+ h2
+ i.fa.fa-cutlery
+ | Project rules
+
+ ul.rules-lists
+ each triggers
+ li.rules-lists-item
+ p
+ = toId
+ div.rules-btns-group
+ button
+ i.fa.fa-eye
+ | View rule
+ button
+ i.fa.fa-trash-o
+ | Delete rule
+ else
+ li.no-items-message No rules
+ div.rules-add
+ button
+ i.fa.fa-plus
+ | Add rule
+ input(type=text)
+
+
diff --git a/client/components/rules/rules.js b/client/components/rules/rules.js
new file mode 100644
index 00000000..e679431a
--- /dev/null
+++ b/client/components/rules/rules.js
@@ -0,0 +1,25 @@
+
+BlazeComponent.extendComponent({
+ onCreated() {
+ this.subscribe('allTriggers');
+ },
+
+ triggers() {
+ return Triggers.find({});
+ },
+ events() {
+ return [{'click .js-add-trigger'(event) {
+
+ event.preventDefault();
+ const toName = this.find('#toName').value;
+ const fromName = this.find('#fromName').value;
+ const toId = Triggers.findOne().findList(toName)._id;
+ const fromId = Triggers.findOne().findList(fromName)._id;
+ console.log(toId);
+ console.log(fromId);
+ Triggers.insert({group: "cards", activityType: "moveCard","fromId":fromId,"toId":toId });
+
+
+ },}];
+ },
+}).register('rules');
diff --git a/client/components/rules/rules.styl b/client/components/rules/rules.styl
new file mode 100644
index 00000000..2aab1b40
--- /dev/null
+++ b/client/components/rules/rules.styl
@@ -0,0 +1,34 @@
+.rules-list
+ overflow-y: scroll
+.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: 25px
+ margin-bottom: 5px
+ input
+ display: inline-block
+ float: right
+ margin: auto
+ margin-right: 10px
+ button
+ display: inline-block
+ float: right
+ margin: auto
+
+ \ No newline at end of file
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/i18n/en.i18n.json b/i18n/en.i18n.json
index 9244af9c..38d200e6 100644
--- a/i18n/en.i18n.json
+++ b/i18n/en.i18n.json
@@ -362,6 +362,7 @@
"restore": "Restore",
"save": "Save",
"search": "Search",
+ "rules": "Rules",
"search-cards": "Search from card titles and descriptions on this board",
"search-example": "Text to search for?",
"select-color": "Select Color",
diff --git a/models/.DS_Store b/models/.DS_Store
new file mode 100644
index 00000000..5008ddfc
--- /dev/null
+++ b/models/.DS_Store
Binary files differ
diff --git a/models/cards.js b/models/cards.js
index b6a7b4c6..618c191e 100644
--- a/models/cards.js
+++ b/models/cards.js
@@ -806,3 +806,4 @@ if (Meteor.isServer) {
});
}
+
diff --git a/models/rules.js b/models/rules.js
new file mode 100644
index 00000000..2304d2dc
--- /dev/null
+++ b/models/rules.js
@@ -0,0 +1,38 @@
+Rules = new Mongo.Collection('rules');
+
+Rules.attachSchema(new SimpleSchema({
+ title: {
+ type: String,
+ optional: true,
+ },
+ description: {
+ type: String,
+ optional: true,
+ },
+}));
+
+Rules.mutations({
+ rename(description) {
+ return { $set: { description } };
+ },
+});
+
+Rules.allow({
+ update: function () {
+ // add custom authentication code here
+ return true;
+ },
+});
+
+
+
+
+if (Meteor.isServer) {
+ Meteor.startup(() => {
+ const rules = Rules.findOne({});
+ if(!rules){
+ Rules.insert({title: "regola1", description: "bella"});
+ Rules.insert({title: "regola2", description: "bella2"});
+ }
+ });
+}
diff --git a/models/triggers.js b/models/triggers.js
new file mode 100644
index 00000000..f8dbb50d
--- /dev/null
+++ b/models/triggers.js
@@ -0,0 +1,74 @@
+Triggers = new Mongo.Collection('triggers');
+
+
+
+Triggers.mutations({
+ rename(description) {
+ return { $set: { description } };
+ },
+});
+
+Triggers.allow({
+ update: function () {
+ // add custom authentication code here
+ return true;
+ },
+ insert: function () {
+ // add custom authentication code here
+ return true;
+ }
+});
+
+
+Triggers.helpers({
+ fromList() {
+ return Lists.findOne(this.fromId);
+ },
+
+ toList() {
+ return Lists.findOne(this.toId);
+ },
+
+ findList(title) {
+ return Lists.findOne({title:title});
+ },
+
+ labels() {
+ const boardLabels = this.board().labels;
+ const cardLabels = _.filter(boardLabels, (label) => {
+ return _.contains(this.labelIds, label._id);
+ });
+ return cardLabels;
+ }});
+
+
+
+if (Meteor.isServer) {
+ Meteor.startup(() => {
+ const rules = Triggers.findOne({});
+ if(!rules){
+ Triggers.insert({group: "cards", activityType: "moveCard","fromId":-1,"toId":-1 });
+ }
+ });
+}
+
+
+
+ Activities.after.insert((userId, doc) => {
+ const activity = Activities._transform(doc);
+ const matchedTriggers = Triggers.find({activityType: activity.activityType,fromId:activity.oldListId,toId:activity.listId})
+ if(matchedTriggers.count() > 0){
+ const card = activity.card();
+ const oldTitle = card.title;
+ const fromListTitle = activity.oldList().title;
+ Cards.direct.update({_id: card._id, listId: card.listId, boardId: card.boardId, archived: false},
+ {$set: {title: "[From "+fromListTitle +"] "+ oldTitle}});
+ }
+ });
+
+
+
+
+
+
+
diff --git a/server/.DS_Store b/server/.DS_Store
new file mode 100644
index 00000000..75d47436
--- /dev/null
+++ b/server/.DS_Store
Binary files differ
diff --git a/server/lib/.DS_Store b/server/lib/.DS_Store
new file mode 100644
index 00000000..5008ddfc
--- /dev/null
+++ b/server/lib/.DS_Store
Binary files differ
diff --git a/server/lib/utils.js b/server/lib/utils.js
index c7763933..bdf914ef 100644
--- a/server/lib/utils.js
+++ b/server/lib/utils.js
@@ -14,3 +14,6 @@ allowIsBoardMemberByCard = function(userId, card) {
const board = card.board();
return board && board.hasMember(userId);
};
+
+
+
diff --git a/server/publications/rules.js b/server/publications/rules.js
new file mode 100644
index 00000000..ae4b898e
--- /dev/null
+++ b/server/publications/rules.js
@@ -0,0 +1,14 @@
+Meteor.publish('rules', (ruleId) => {
+ check(ruleId, String);
+ return Rules.find({ _id: ruleId });
+});
+
+
+Meteor.publish('allRules', () => {
+ return Rules.find({});
+});
+
+
+Meteor.publish('allTriggers', () => {
+ return Triggers.find({});
+});