diff options
author | Angelo Gallarello <angelo.gallarell@gmail.com> | 2018-08-03 19:47:20 +0200 |
---|---|---|
committer | Angelo Gallarello <angelo.gallarell@gmail.com> | 2018-08-03 19:47:20 +0200 |
commit | f63482b58775a2f52fdd5f932ce7d14f16757133 (patch) | |
tree | 886fdeae889b05ea009d67ed2181a5c46985f48a | |
parent | d5870472fbc988d1a4a4fcec0aa46544bbedefab (diff) | |
download | wekan-f63482b58775a2f52fdd5f932ce7d14f16757133.tar.gz wekan-f63482b58775a2f52fdd5f932ce7d14f16757133.tar.bz2 wekan-f63482b58775a2f52fdd5f932ce7d14f16757133.zip |
UI for rules list
-rw-r--r-- | .DS_Store | bin | 0 -> 6148 bytes | |||
-rw-r--r-- | .meteor/packages | 4 | ||||
-rw-r--r-- | RASD.txt | 22 | ||||
-rw-r--r-- | client/components/boards/boardHeader.jade | 9 | ||||
-rw-r--r-- | client/components/boards/boardHeader.js | 3 | ||||
-rw-r--r-- | client/components/lists/listBody.js | 2 | ||||
-rw-r--r-- | client/components/rules/rules.jade | 27 | ||||
-rw-r--r-- | client/components/rules/rules.js | 25 | ||||
-rw-r--r-- | client/components/rules/rules.styl | 34 | ||||
-rw-r--r-- | client/lib/popup.js | 1 | ||||
-rw-r--r-- | i18n/en.i18n.json | 1 | ||||
-rw-r--r-- | models/.DS_Store | bin | 0 -> 6148 bytes | |||
-rw-r--r-- | models/cards.js | 1 | ||||
-rw-r--r-- | models/rules.js | 38 | ||||
-rw-r--r-- | models/triggers.js | 74 | ||||
-rw-r--r-- | server/.DS_Store | bin | 0 -> 6148 bytes | |||
-rw-r--r-- | server/lib/.DS_Store | bin | 0 -> 6148 bytes | |||
-rw-r--r-- | server/lib/utils.js | 3 | ||||
-rw-r--r-- | server/publications/rules.js | 14 |
19 files changed, 256 insertions, 2 deletions
diff --git a/.DS_Store b/.DS_Store Binary files differnew file mode 100644 index 00000000..06b93641 --- /dev/null +++ b/.DS_Store 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 Binary files differnew file mode 100644 index 00000000..5008ddfc --- /dev/null +++ b/models/.DS_Store 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 Binary files differnew file mode 100644 index 00000000..75d47436 --- /dev/null +++ b/server/.DS_Store diff --git a/server/lib/.DS_Store b/server/lib/.DS_Store Binary files differnew file mode 100644 index 00000000..5008ddfc --- /dev/null +++ b/server/lib/.DS_Store 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({}); +}); |