Compare commits

...
33 Commits
Author SHA1 Message Date
Lauri Ojansivu 7856692946 v3.91 2020-04-08 20:37:43 +03:00
Lauri Ojansivu 7e7c8fd001 Update translations. 2020-04-08 20:29:31 +03:00
Lauri Ojansivu feb602ecd4 Update translations. 2020-04-08 19:59:23 +03:00
Lauri Ojansivu 6ed26e373a Update ChangeLog. 2020-04-08 19:54:12 +03:00
Lauri Ojansivu 4fba0fb1a1 Clarify translation. 2020-04-08 19:43:25 +03:00
Lauri Ojansivu 968ae122b0 Fix typos. 2020-04-08 19:38:30 +03:00
Lauri Ojansivu 06c32cb497 Update translations. 2020-04-08 19:37:41 +03:00
Lauri Ojansivu d2a4925cae Merge branch 'NicoP-S-master' 2020-04-08 19:17:00 +03:00
Lauri Ojansivu 9c97c301bd Merge branch 'master' of https://github.com/NicoP-S/wekan into NicoP-S-master 2020-04-08 19:15:05 +03:00
Lauri Ojansivu d4a91d30ff Update ChangeLog. 2020-04-08 19:14:13 +03:00
Lauri Ojansivu 6a56a495ad Update translations. 2020-04-08 18:47:17 +03:00
Lauri Ojansivu 3330aff12c Merge branch 'daniel-eder-feature/filter-assignee' 2020-04-08 18:39:32 +03:00
Lauri Ojansivu 43bdd56a41 Merge branch 'feature/filter-assignee' of https://github.com/daniel-eder/wekan into daniel-eder-feature/filter-assignee 2020-04-08 18:39:09 +03:00
Lauri Ojansivu a602f4b9ec Update ChangeLog. 2020-04-08 18:38:02 +03:00
Lauri Ojansivu 053e47173f Merge pull request #2996 from ckavili/master
Route template added to helm chart
2020-04-08 18:30:51 +03:00
Daniel Eder fe285c62e1 Add filter option for assignee
Works exactly like member
2020-04-08 16:59:59 +03:00
Cansu Kavili a3d44b0774 README updated 2020-04-08 14:38:55 +02:00
Cansu Kavili 0e79bd25ed values file updated 2020-04-08 14:33:29 +02:00
Cansu Kavili 71f7a680b6 Openshift Route def added 2020-04-08 13:59:33 +02:00
Nico 411b8d3f56 Merge branch 'vote' 2020-04-07 20:43:55 +02:00
Nico 2bbc312ad0 Voteing feature 2020-04-07 20:43:35 +02:00
NicoP-S 14de17b667 Merge pull request #4 from wekan/master
Update
2020-04-07 20:20:41 +02:00
Lauri Ojansivu 9083c341c1 Merge pull request #2990 from doggy8088/langzhtwfix
Correct zh-TW language name (the right way)
2020-04-07 13:03:21 +03:00
Will e0930c32a6 Correct zh-TW language name (the right way) 2020-04-07 09:43:23 +00:00
Lauri Ojansivu f438d04c42 v3.90 2020-04-06 16:25:12 +03:00
Lauri Ojansivu d798f6e3ef Update dependencies. 2020-04-06 15:46:59 +03:00
Lauri Ojansivu c96ca4e875 Update translations. 2020-04-06 15:37:09 +03:00
Lauri Ojansivu 8a71fe39c5 Update ChangeLog. 2020-04-06 15:35:19 +03:00
Lauri Ojansivu e4ec5c38b7 Merge branch 'doggy8088-patch-1' 2020-04-06 15:27:53 +03:00
Will 保哥 b849d4c2ba Update layouts.js 2020-04-06 18:16:17 +08:00
NicoP-S a376fb2fab Merge pull request #3 from wekan/master
Update
2020-04-04 23:14:32 +02:00
NicoP-S e47ff25d45 Merge pull request #2 from wekan/master
Merge Wekan
2020-04-02 20:43:36 +02:00
NicoP-S 7fa9603f9d Merge pull request #1 from wekan/master
update
2020-03-26 21:17:17 +01:00
75 changed files with 39985 additions and 39205 deletions

No files matched your search

+6 -6
View File
@@ -11,7 +11,7 @@ allow-deny@1.1.0
arillo:flow-router-helpers@0.5.2
audit-argument-checks@1.0.7
autoupdate@1.6.0
babel-compiler@7.5.2
babel-compiler@7.5.3
babel-runtime@1.5.0
base64@1.0.12
binary-heap@1.0.11
@@ -20,7 +20,7 @@ blaze-tools@1.0.10
boilerplate-generator@1.7.0
browser-policy-common@1.0.11
browser-policy-framing@1.1.0
caching-compiler@1.2.1
caching-compiler@1.2.2
caching-html-compiler@1.1.3
callback-hook@1.3.0
cfs:access-point@0.1.49
@@ -55,9 +55,9 @@ ddp-rate-limiter@1.0.7
ddp-server@2.3.1
deps@1.0.12
diff-sequence@1.1.1
dynamic-import@0.5.1
dynamic-import@0.5.2
easylogic:summernote@0.8.8
ecmascript@0.14.2
ecmascript@0.14.3
ecmascript-runtime@0.7.0
ecmascript-runtime-client@0.10.0
ecmascript-runtime-server@0.9.0
@@ -110,7 +110,7 @@ modern-browsers@0.1.5
modules@0.15.0
modules-runtime@0.12.0
momentjs:moment@2.24.0
mongo@1.9.0
mongo@1.9.1
mongo-decimal@0.1.1
mongo-dev-server@1.1.0
mongo-id@1.0.7
@@ -186,7 +186,7 @@ useraccounts:core@1.14.2
useraccounts:flow-routing@1.14.2
useraccounts:unstyled@1.14.2
verron:autosize@3.0.8
webapp@1.9.0
webapp@1.9.1
webapp-hashing@1.0.9
wekan-accounts-cas@0.1.0
wekan-accounts-oidc@1.0.10
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v3.89.0",
"version": "v3.91.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v3.89.0",
"version": "v3.91.0",
"description": "Open-Source kanban",
"private": true,
"scripts": {
+27
View File
@@ -1,3 +1,30 @@
# v3.91 2020-04-08 Wekan release
This release adds the following new features:
- [OpenShift: Route template added to helm chart for Openshift v4x
cluster](https://github.com/wekan/wekan/pull/2996).
Thanks to ckavili.
- [Filter by Assignee](https://github.com/wekan/wekan/pull/2997).
Thanks to daniel-eder.
- [Vote on Card](https://github.com/wekan/wekan/pull/2994).
Thanks to NicoP-S and xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v3.90 2020-04-06 Wekan release
This release makes the following updates:
- [Update dependencies](https://github.com/wekan/wekan/commit/d798f6e3ef09595ce4f1d1fbc053eec70fc91fb9).
and updates the following translations:
- [Update layouts.js for zh-TW language name](https://github.com/wekan/wekan/pull/2988).
Thanks to doggy8088.
Thanks to above GitHub users for their contributions and translators for their translations.
# v3.89 2020-04-05 Wekan release
This release adds the following new features:
+1 -1
View File
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
appVersion: "v3.89.0"
appVersion: "v3.91.0"
files:
userUploads:
- README.md
+37
View File
@@ -199,6 +199,24 @@ template(name="cardDetails")
+viewer
= getAssignedBy
if getVoteQuestion
hr
.vote-title
h3
i.fa.fa-thumbs-up
card-details-item-title {{_ 'vote-question'}}
.vote-result
.card-label.card-label-green
+viewer
= voteCountPositive
.card-label.card-label-red
+viewer
= voteCountNegative
+viewer
= getVoteQuestion
button.card-details-green.js-vote.js-vote-positive(class="{{#if voteState}}voted{{/if}}") {{_ 'vote-for-it'}}
button.card-details-red.js-vote.js-vote-negative(class="{{#if $eq voteState false}}voted{{/if}}") {{_ 'vote-against'}}
//- XXX We should use "editable" to avoid repetiting ourselves
if canModifyCard
unless currentUser.isWorker
@@ -315,6 +333,16 @@ template(name="cardDetailsActionsPopup")
//li: a.js-members {{_ 'card-edit-members'}}
//li: a.js-labels {{_ 'card-edit-labels'}}
//li: a.js-attachments {{_ 'card-edit-attachments'}}
if getVoteQuestion
li
a.js-cancel-voting
i.fa.fa-thumbs-up
| {{_ 'card-cancel-voting'}}
else
li
a.js-start-voting
i.fa.fa-thumbs-up
| {{_ 'card-start-voting'}}
li
a.js-custom-fields
i.fa.fa-list-alt
@@ -538,3 +566,12 @@ template(name="cardDeletePopup")
unless archived
p {{_ "card-delete-suggest-archive"}}
button.js-confirm.negate.full(type="submit") {{_ 'delete'}}
template(name="cardStartVotingPopup")
form.edit-vote-question
.fields
label(for="vote") {{_ 'vote-question'}}
input.js-vote-field#vote(type="text" name="vote" value="{{card.getVoteQuestion}}" autofocus)
button.primary.confirm.js-submit {{_ 'save'}}
//- button.js-remove-color.negate.wide.right {{_ 'delete'}}
+72 -5
View File
@@ -38,6 +38,34 @@ BlazeComponent.extendComponent({
Meteor.subscribe('unsaved-edits');
},
voteState() {
const card = this.currentData();
const userId = Meteor.userId()
let state
if (card.vote) {
if (card.vote.positive) {
state = _.contains(card.vote.positive, userId);
if (state === true) return true
}
if (card.vote.negative) {
state = _.contains(card.vote.negative, userId);
if (state === true) return false
}
}
return null
},
voteCountPositive() {
const card = this.currentData();
if (card.vote && card.vote.positive)
return card.vote.positive.length
return null
},
voteCountNegative() {
const card = this.currentData();
if (card.vote && card.vote.negative)
return card.vote.negative.length
return null
},
isWatching() {
const card = this.currentData();
return card.findWatcher(Meteor.userId());
@@ -379,6 +407,18 @@ BlazeComponent.extendComponent({
'click #toggleButton'() {
Meteor.call('toggleSystemMessages');
},
'click .js-vote'(e) {
const forIt = $(e.target).hasClass('js-vote-positive')
let newState = null
if (
this.voteState() == null ||
this.voteState() == false && forIt ||
this.voteState() == true && !forIt
) {
newState = forIt
}
this.data().setVote(Meteor.userId(), newState)
}
},
];
},
@@ -560,6 +600,7 @@ Template.cardDetailsActionsPopup.events({
'click .js-assignees': Popup.open('cardAssignees'),
'click .js-labels': Popup.open('cardLabels'),
'click .js-attachments': Popup.open('cardAttachments'),
'click .js-start-voting': Popup.open('cardStartVoting'),
'click .js-custom-fields': Popup.open('cardCustomFields'),
'click .js-received-date': Popup.open('editCardReceivedDate'),
'click .js-start-date': Popup.open('editCardStartDate'),
@@ -570,6 +611,11 @@ Template.cardDetailsActionsPopup.events({
'click .js-copy-card': Popup.open('copyCard'),
'click .js-copy-checklist-cards': Popup.open('copyChecklistToManyCards'),
'click .js-set-card-color': Popup.open('setCardColor'),
'click .js-cancel-voting'(event) {
event.preventDefault();
this.unsetVote()
Popup.close();
},
'click .js-move-card-to-top'(event) {
event.preventDefault();
const minOrder = _.min(
@@ -603,7 +649,7 @@ Template.cardDetailsActionsPopup.events({
},
});
Template.editCardTitleForm.onRendered(function() {
Template.editCardTitleForm.onRendered(function () {
autosize(this.$('.js-edit-card-title'));
});
@@ -617,7 +663,7 @@ Template.editCardTitleForm.events({
},
});
Template.editCardRequesterForm.onRendered(function() {
Template.editCardRequesterForm.onRendered(function () {
autosize(this.$('.js-edit-card-requester'));
});
@@ -630,7 +676,7 @@ Template.editCardRequesterForm.events({
},
});
Template.editCardAssignerForm.onRendered(function() {
Template.editCardAssignerForm.onRendered(function () {
autosize(this.$('.js-edit-card-assigner'));
});
@@ -770,7 +816,7 @@ Template.copyChecklistToManyCardsPopup.events({
// copy subtasks
cursor = Cards.find({ parentId: oldId });
cursor.forEach(function() {
cursor.forEach(function () {
'use strict';
const subtask = arguments[0];
subtask.parentId = _id;
@@ -919,7 +965,7 @@ BlazeComponent.extendComponent({
}
}
},
'click .js-delete': Popup.afterConfirm('cardDelete', function() {
'click .js-delete': Popup.afterConfirm('cardDelete', function () {
Popup.close();
Cards.remove(this._id);
Utils.goBoardId(this.boardId);
@@ -945,6 +991,27 @@ BlazeComponent.extendComponent({
},
}).register('cardMorePopup');
BlazeComponent.extendComponent({
onCreated() {
this.currentCard = this.currentData();
this.voteQuestion = new ReactiveVar(this.currentCard.voteQuestion);
},
events() {
return [
{
'submit .edit-vote-question'(evt) {
evt.preventDefault();
const voteQuestion = evt.target.vote.value;
this.currentCard.setVoteQuestion(voteQuestion)
Popup.close();
},
},
];
},
}).register('cardStartVotingPopup');
// Close the card details pane by pressing escape
EscapeActions.register(
'detailsPane',
+11 -3
View File
@@ -100,11 +100,11 @@ avatar-radius = 50%
.ps-scrollbar-y-rail
pointer-event: all
position: absolute;
position: absolute
.card-details-canvas
width: 470px
padding-left: 20px;
padding-left: 20px
.card-details-header
margin: 0 -20px 5px
@@ -241,7 +241,7 @@ input[type="submit"].attachment-add-link-submit
.card-details-canvas
width: 100%
padding-left: 0px;
padding-left: 0px
.card-details-header
.close-card-details
@@ -330,3 +330,11 @@ card-details-color(background, color...)
.card-details-indigo
card-details-color(#4b0082, #ffffff) //White text for better visibility
.voted
opacity: .7
.vote-title
display: flex
justify-content: space-between
.vote-result
display: flex
+4
View File
@@ -100,6 +100,10 @@ template(name="minicard")
if getDescription
.badge.badge-state-image-only(title=getDescription)
span.badge-icon.fa.fa-align-left
if getVoteQuestion
.badge.badge-state-image-only(title=getVoteQuestion)
span.badge-icon.fa.fa-thumbs-up
span.badge-icon.fa.fa-thumbs-down
if attachments.count
.badge
span.badge-icon.fa.fa-paperclip
+2
View File
@@ -73,6 +73,8 @@ Template.userFormsLayout.helpers({
name = 'Igbo';
} else if (lang.name === 'oc') {
name = 'Occitan';
} else if (lang.name === '繁体中文(台湾)') {
name = '繁體中文(台灣)';
}
return { tag, name };
}).sort(function(a, b) {
@@ -45,6 +45,24 @@ template(name="filterSidebar")
if Filter.members.isSelected _id
i.fa.fa-check
hr
ul.sidebar-list
li(class="{{#if Filter.assignees.isSelected undefined}}active{{/if}}")
a.name.js-toggle-assignee-filter
span.sidebar-list-item-description
| {{_ 'filter-no-assignee'}}
if Filter.assignees.isSelected undefined
i.fa.fa-check
each currentBoard.activeMembers
with getUser userId
li(class="{{#if Filter.assignees.isSelected _id}}active{{/if}}")
a.name.js-toggle-assignee-filter
+userAvatar(userId=this._id)
span.sidebar-list-item-description
= profile.fullname
| (<span class="username">{{ username }}</span>)
if Filter.assignees.isSelected _id
i.fa.fa-check
hr
ul.sidebar-list
li(class="{{#if Filter.customFields.isSelected undefined}}active{{/if}}")
a.name.js-toggle-custom-fields-filter
@@ -18,6 +18,11 @@ BlazeComponent.extendComponent({
Filter.members.toggle(this.currentData()._id);
Filter.resetExceptions();
},
'click .js-toggle-assignee-filter'(evt) {
evt.preventDefault();
Filter.assignees.toggle(this.currentData()._id);
Filter.resetExceptions();
},
'click .js-toggle-archive-filter'(evt) {
evt.preventDefault();
Filter.archive.toggle(this.currentData()._id);
+2
View File
@@ -166,6 +166,8 @@ Template.changeLanguagePopup.helpers({
name = 'Igbo';
} else if (lang.name === 'oc') {
name = 'Occitan';
} else if (lang.name === '繁体中文(台湾)') {
name = '繁體中文(台灣)';
}
return { tag, name };
}).sort(function(a, b) {
+9 -1
View File
@@ -459,13 +459,21 @@ Filter = {
// before changing the schema.
labelIds: new SetFilter(),
members: new SetFilter(),
assignees: new SetFilter(),
archive: new SetFilter(),
hideEmpty: new SetFilter(),
customFields: new SetFilter('_id'),
advanced: new AdvancedFilter(),
lists: new AdvancedFilter(), // we need the ability to filter list by name as well
_fields: ['labelIds', 'members', 'archive', 'hideEmpty', 'customFields'],
_fields: [
'labelIds',
'members',
'assignees',
'archive',
'hideEmpty',
'customFields',
],
// We don't filter cards that have been added after the last filter change. To
// implement this we keep the id of these cards in this `_exceptions` fields
+7
View File
@@ -56,3 +56,10 @@ mongodb-replicaset:
This section controls the scale of the MongoDB redundant Replica Set.
**replicas:** This is the number of MongoDB instances to include in the set. You can set this to 1 for a single server - this will still allow you to scale-up later with a helm upgrade.
### Install OCP route
If you use this chart to deploy Wekan on an OCP cluster, you can create route instead of ingress with following command:
``` bash
$ helm template --set route.enabled=true,ingress.enabled=false values.yaml . | oc apply -f-
```
+23
View File
@@ -0,0 +1,23 @@
{{- if .Values.route.enabled -}}
{{- $fullName := include "wekan.fullname" . -}}
apiVersion: route.openshift.io/v1
kind: Route
metadata:
annotations:
haproxy.router.openshift.io/timeout: 4m
openshift.io/host.generated: "true"
labels:
app: {{ template "wekan.name" . }}
service: {{ template "wekan.name" . }}
name: {{ template "wekan.name" . }}
spec:
port:
targetPort: http
tls:
termination: edge
to:
kind: Service
name: {{ template "wekan.name" . }}
weight: 100
wildcardPolicy: None
{{- end }}
+3
View File
@@ -59,6 +59,9 @@ ingress:
# hosts:
# - wekan-example.local
route:
enabled: false
resources:
requests:
memory: 128Mi
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+7
View File
@@ -152,6 +152,8 @@
"card-spent": "Spent Time",
"card-edit-attachments": "Edit attachments",
"card-edit-custom-fields": "Edit custom fields",
"card-start-voting": "Start voting",
"card-cancel-voting": "Delete voting and all votes",
"card-edit-labels": "Edit labels",
"card-edit-members": "Edit members",
"card-labels-title": "Change the labels for the card.",
@@ -161,6 +163,10 @@
"cardAttachmentsPopup-title": "Attach From",
"cardCustomField-datePopup-title": "Change date",
"cardCustomFieldsPopup-title": "Edit custom fields",
"cardStartVotingPopup-title": "Start a vote",
"vote-question": "Voting question",
"vote-for-it": "for it",
"vote-against": "against",
"cardDeletePopup-title": "Delete Card?",
"cardDetailsActionsPopup-title": "Card Actions",
"cardLabelsPopup-title": "Labels",
@@ -319,6 +325,7 @@
"filter-clear": "Clear filter",
"filter-no-label": "No label",
"filter-no-member": "No member",
"filter-no-assignee": "No assignee",
"filter-no-custom-fields": "No Custom Fields",
"filter-show-archive": "Show archived lists",
"filter-hide-empty": "Hide empty lists",
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+775 -768
View File
File diff suppressed because it is too large. Load diff
+110 -11
View File
@@ -304,6 +304,38 @@ Cards.attachSchema(
optional: true,
defaultValue: '',
},
vote: {
/**
* vote object, see below
*/
type: Object,
optional: true,
},
'vote.question': {
type: String,
defaultValue: '',
},
'vote.positive': {
/**
* list of members (user IDs)
*/
type: [String],
optional: true,
defaultValue: [],
},
'vote.negative': {
/**
* list of members (user IDs)
*/
type: [String],
optional: true,
defaultValue: [],
},
'vote.end': {
type: Date,
optional: true,
defaultValue: null
}
}),
);
@@ -696,7 +728,7 @@ Cards.helpers({
parentString(sep) {
return this.parentList()
.map(function(elem) {
.map(function (elem) {
return elem.title;
})
.join(sep);
@@ -980,6 +1012,22 @@ Cards.helpers({
}
},
getVoteQuestion() {
if (this.isLinkedCard()) {
const card = Cards.findOne({ _id: this.linkedId });
if (card && card.vote) return card.vote.question;
else return null;
} else if (this.isLinkedBoard()) {
const board = Boards.findOne({ _id: this.linkedId });
if (board && board.vote) return board.vote.question;
else return null;
} else if (this.vote) {
return this.vote.question;
} else {
return null;
}
},
getId() {
if (this.isLinked()) {
return this.linkedId;
@@ -1396,6 +1444,57 @@ Cards.mutations({
},
};
},
setVoteQuestion(question) {
return {
$set: {
vote: {
question,
positive:[],
negative:[]
},
}
}
},
unsetVote() {
return {
$unset: {
vote: '',
},
};
},
setVote(userId, forIt) {
switch (forIt) {
case true:
// vote for it
return {
$pull:{
"vote.negative": userId
},
$addToSet: {
"vote.positive": userId
}
}
case false:
// vote against
return {
$pull:{
"vote.positive": userId
},
$addToSet: {
"vote.negative" : userId
}
}
default:
// Remove votes
return {
$pull:{
"vote.positive": userId,
"vote.negative" : userId
},
}
}
},
});
//FUNCTIONS FOR creation of Activities
@@ -1798,7 +1897,7 @@ if (Meteor.isServer) {
});
//New activity for card moves
Cards.after.update(function(userId, doc, fieldNames) {
Cards.after.update(function (userId, doc, fieldNames) {
const oldListId = this.previous.listId;
const oldSwimlaneId = this.previous.swimlaneId;
const oldBoardId = this.previous.boardId;
@@ -1844,7 +1943,7 @@ if (Meteor.isServer) {
// change list modifiedAt, when user modified the key values in timingaction array, if it's endAt, put the modifiedAt of list back to one year ago for sorting purpose
const modifiedAt = new Date(
new Date(value).getTime() -
(action === 'endAt' ? 365 * 24 * 3600 * 1e3 : 0),
(action === 'endAt' ? 365 * 24 * 3600 * 1e3 : 0),
); // set it as 1 year before
const boardId = list.boardId;
Lists.direct.update(
@@ -1898,7 +1997,7 @@ if (Meteor.isServer) {
JsonRoutes.add(
'GET',
'/api/boards/:boardId/swimlanes/:swimlaneId/cards',
function(req, res) {
function (req, res) {
const paramBoardId = req.params.boardId;
const paramSwimlaneId = req.params.swimlaneId;
Authentication.checkBoardAccess(req.userId, paramBoardId);
@@ -1908,7 +2007,7 @@ if (Meteor.isServer) {
boardId: paramBoardId,
swimlaneId: paramSwimlaneId,
archived: false,
}).map(function(doc) {
}).map(function (doc) {
return {
_id: doc._id,
title: doc.title,
@@ -1932,7 +2031,7 @@ if (Meteor.isServer) {
* title: string,
* description: string}]
*/
JsonRoutes.add('GET', '/api/boards/:boardId/lists/:listId/cards', function(
JsonRoutes.add('GET', '/api/boards/:boardId/lists/:listId/cards', function (
req,
res,
) {
@@ -1945,7 +2044,7 @@ if (Meteor.isServer) {
boardId: paramBoardId,
listId: paramListId,
archived: false,
}).map(function(doc) {
}).map(function (doc) {
return {
_id: doc._id,
title: doc.title,
@@ -1967,7 +2066,7 @@ if (Meteor.isServer) {
JsonRoutes.add(
'GET',
'/api/boards/:boardId/lists/:listId/cards/:cardId',
function(req, res) {
function (req, res) {
const paramBoardId = req.params.boardId;
const paramListId = req.params.listId;
const paramCardId = req.params.cardId;
@@ -1999,7 +2098,7 @@ if (Meteor.isServer) {
* @param {string} [assignees] the array of maximum one ID of assignee of the new card
* @return_type {_id: string}
*/
JsonRoutes.add('POST', '/api/boards/:boardId/lists/:listId/cards', function(
JsonRoutes.add('POST', '/api/boards/:boardId/lists/:listId/cards', function (
req,
res,
) {
@@ -2106,7 +2205,7 @@ if (Meteor.isServer) {
JsonRoutes.add(
'PUT',
'/api/boards/:boardId/lists/:listId/cards/:cardId',
function(req, res) {
function (req, res) {
Authentication.checkUserId(req.userId);
const paramBoardId = req.params.boardId;
const paramCardId = req.params.cardId;
@@ -2405,7 +2504,7 @@ if (Meteor.isServer) {
JsonRoutes.add(
'DELETE',
'/api/boards/:boardId/lists/:listId/cards/:cardId',
function(req, res) {
function (req, res) {
Authentication.checkUserId(req.userId);
const paramBoardId = req.params.boardId;
const paramListId = req.params.listId;
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v3.89.0",
"version": "v3.91.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v3.89.0",
"version": "v3.91.0",
"description": "Open-Source kanban",
"private": true,
"scripts": {
+81 -3
View File
@@ -1524,7 +1524,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
<ul class="toc-list-h1">
<li>
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v3.89">Wekan REST API v3.89</a>
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v3.91">Wekan REST API v3.91</a>
</li>
@@ -1937,6 +1937,11 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
</li>
<li>
<a href="#tocscardsvote" class="toc-h2 toc-link" data-title="CardsVote">CardsVote</a>
</li>
<li>
<a href="#tocscardscustomfields" class="toc-h2 toc-link" data-title="CardsCustomfields">CardsCustomfields</a>
@@ -2017,7 +2022,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
<div class="page-wrapper">
<div class="dark-box"></div>
<div class="content">
<h1 id="wekan-rest-api">Wekan REST API v3.89</h1>
<h1 id="wekan-rest-api">Wekan REST API v3.91</h1>
<blockquote>
<p>Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.</p>
</blockquote>
@@ -14376,7 +14381,17 @@ UserSecurity
<span class="hljs-attr">"sort"</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">"subtaskSort"</span>: <span class="hljs-number">0</span>,
<span class="hljs-attr">"type"</span>: <span class="hljs-string">"string"</span>,
<span class="hljs-attr">"linkedId"</span>: <span class="hljs-string">"string"</span>
<span class="hljs-attr">"linkedId"</span>: <span class="hljs-string">"string"</span>,
<span class="hljs-attr">"vote"</span>: {
<span class="hljs-attr">"question"</span>: <span class="hljs-string">"string"</span>,
<span class="hljs-attr">"positive"</span>: [
<span class="hljs-string">"string"</span>
],
<span class="hljs-attr">"negative"</span>: [
<span class="hljs-string">"string"</span>
],
<span class="hljs-attr">"end"</span>: <span class="hljs-string">"string"</span>
}
}
</code></pre>
@@ -14595,6 +14610,13 @@ UserSecurity
<td>none</td>
<td>ID of the linked card</td>
</tr>
<tr>
<td>vote</td>
<td><a href="#schemacardsvote">CardsVote</a></td>
<td>false</td>
<td>none</td>
<td>vote object, see below</td>
</tr>
</tbody>
</table>
<h4 id="enumerated-values">Enumerated Values</h4>
@@ -14708,6 +14730,62 @@ UserSecurity
</tr>
</tbody>
</table>
<h2 id="tocscardsvote">CardsVote</h2>
<p><a id="schemacardsvote"></a></p>
<pre class="highlight tab tab-json"><code>{
<span class="hljs-attr">"question"</span>: <span class="hljs-string">"string"</span>,
<span class="hljs-attr">"positive"</span>: [
<span class="hljs-string">"string"</span>
],
<span class="hljs-attr">"negative"</span>: [
<span class="hljs-string">"string"</span>
],
<span class="hljs-attr">"end"</span>: <span class="hljs-string">"string"</span>
}
</code></pre>
<h3 id="properties">Properties</h3>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Required</th>
<th>Restrictions</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>question</td>
<td>string</td>
<td>true</td>
<td>none</td>
<td>none</td>
</tr>
<tr>
<td>positive</td>
<td>[string]</td>
<td>false</td>
<td>none</td>
<td>list of members (user IDs)</td>
</tr>
<tr>
<td>negative</td>
<td>[string]</td>
<td>false</td>
<td>none</td>
<td>list of members (user IDs)</td>
</tr>
<tr>
<td>end</td>
<td>string</td>
<td>false</td>
<td>none</td>
<td>none</td>
</tr>
</tbody>
</table>
<h2 id="tocscardscustomfields">CardsCustomfields</h2>
<p><a id="schemacardscustomfields"></a></p>
<pre class="highlight tab tab-json"><code>{}
+29 -1
View File
@@ -1,7 +1,7 @@
swagger: '2.0'
info:
title: Wekan REST API
version: v3.89
version: v3.91
description: |
The REST API allows you to control and extend Wekan with ease.
@@ -2523,6 +2523,11 @@ definitions:
ID of the linked card
type: string
x-nullable: true
vote:
description: |
vote object, see below
$ref: "#/definitions/CardsVote"
x-nullable: true
required:
- archived
- swimlaneId
@@ -2532,6 +2537,29 @@ definitions:
- userId
- sort
- type
CardsVote:
type: object
properties:
question:
type: string
positive:
description: |
list of members (user IDs)
type: array
items:
type: string
x-nullable: true
negative:
description: |
list of members (user IDs)
type: array
items:
type: string
x-nullable: true
end:
type: string
required:
- question
CardsCustomfields:
type: object
ChecklistItems:
+2 -2
View File
@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
appTitle = (defaultText = "Wekan"),
# The name of the app as it is displayed to the user.
appVersion = 389,
appVersion = 391,
# Increment this for every release.
appMarketingVersion = (defaultText = "3.89.0~2020-04-05"),
appMarketingVersion = (defaultText = "3.91.0~2020-04-08"),
# Human-readable presentation of the app version.
minUpgradableAppVersion = 0,