Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7856692946 | ||
|
|
7e7c8fd001 | ||
|
|
feb602ecd4 | ||
|
|
6ed26e373a | ||
|
|
4fba0fb1a1 | ||
|
|
968ae122b0 | ||
|
|
06c32cb497 | ||
|
|
d2a4925cae | ||
|
|
9c97c301bd | ||
|
|
d4a91d30ff | ||
|
|
6a56a495ad | ||
|
|
3330aff12c | ||
|
|
43bdd56a41 | ||
|
|
a602f4b9ec | ||
|
|
053e47173f | ||
|
|
fe285c62e1 | ||
|
|
a3d44b0774 | ||
|
|
0e79bd25ed | ||
|
|
71f7a680b6 | ||
|
|
411b8d3f56 | ||
|
|
2bbc312ad0 | ||
|
|
14de17b667 | ||
|
|
9083c341c1 | ||
|
|
e0930c32a6 | ||
|
|
f438d04c42 | ||
|
|
d798f6e3ef | ||
|
|
c96ca4e875 | ||
|
|
8a71fe39c5 | ||
|
|
e4ec5c38b7 | ||
|
|
b849d4c2ba | ||
|
|
a376fb2fab | ||
|
|
e47ff25d45 | ||
|
|
7fa9603f9d |
No files matched your search
+6
-6
@@ -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
|
||||
|
||||
Generated
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v3.89.0",
|
||||
"version": "v3.91.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v3.89.0",
|
||||
"version": "v3.91.0",
|
||||
"description": "Open-Source kanban",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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'}}
|
||||
@@ -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',
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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-
|
||||
```
|
||||
@@ -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 }}
|
||||
@@ -59,6 +59,9 @@ ingress:
|
||||
# hosts:
|
||||
# - wekan-example.local
|
||||
|
||||
route:
|
||||
enabled: false
|
||||
|
||||
resources:
|
||||
requests:
|
||||
memory: 128Mi
|
||||
|
||||
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
@@ -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
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+775
-768
File diff suppressed because it is too large.
Load diff
+110
-11
@@ -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;
|
||||
|
||||
Generated
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v3.89.0",
|
||||
"version": "v3.91.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v3.89.0",
|
||||
"version": "v3.91.0",
|
||||
"description": "Open-Source kanban",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
+81
-3
@@ -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
@@ -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:
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in new issue
Block a user