mirror of
https://github.com/wekan/wekan.git
synced 2025-04-23 05:27:14 -04:00
commit
7c25542976
83 changed files with 36895 additions and 36179 deletions
2
.sandstorm-meteor-1.8/package-lock.json
generated
2
.sandstorm-meteor-1.8/package-lock.json
generated
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "wekan",
|
||||
"version": "v3.90.0",
|
||||
"version": "v3.92.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "wekan",
|
||||
"version": "v3.90.0",
|
||||
"version": "v3.92.0",
|
||||
"description": "Open-Source kanban",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
|
29
CHANGELOG.md
29
CHANGELOG.md
|
@ -1,3 +1,32 @@
|
|||
# v3.92 2020-04-09 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Scheduler to clean up read notifications. Also added a button to manually remove all
|
||||
read notifications, and a fix to prevent users form getting notifications for their own
|
||||
actions](https://github.com/wekan/wekan/pull/2998).
|
||||
Thanks to jtbairdsr.
|
||||
- [Add setting](https://github.com/wekan/wekan/commit/5ebb47cb0ec7272894a37d99579ede872251f55c)
|
||||
default [NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE=2](https://github.com/wekan/wekan/pull/2998)
|
||||
to all Wekan platforms.
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# 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:
|
||||
|
|
|
@ -26,6 +26,7 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
|
|||
ATTACHMENTS_STORE_PATH="" \
|
||||
MAX_IMAGE_PIXEL="" \
|
||||
IMAGE_COMPRESS_RATIO="" \
|
||||
NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE="" \
|
||||
BIGEVENTS_PATTERN=NONE \
|
||||
NOTIFY_DUE_DAYS_BEFORE_AND_AFTER="" \
|
||||
NOTIFY_DUE_AT_HOUR_OF_DAY="" \
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
||||
appVersion: "v3.90.0"
|
||||
appVersion: "v3.92.0"
|
||||
files:
|
||||
userUploads:
|
||||
- README.md
|
||||
|
|
|
@ -40,31 +40,29 @@ BlazeComponent.extendComponent({
|
|||
|
||||
voteState() {
|
||||
const card = this.currentData();
|
||||
const userId = Meteor.userId()
|
||||
let state
|
||||
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 (state === true) return true;
|
||||
}
|
||||
if (card.vote.negative) {
|
||||
state = _.contains(card.vote.negative, userId);
|
||||
if (state === true) return false
|
||||
if (state === true) return false;
|
||||
}
|
||||
}
|
||||
return null
|
||||
return null;
|
||||
},
|
||||
voteCountPositive() {
|
||||
const card = this.currentData();
|
||||
if (card.vote && card.vote.positive)
|
||||
return card.vote.positive.length
|
||||
return null
|
||||
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
|
||||
if (card.vote && card.vote.negative) return card.vote.negative.length;
|
||||
return null;
|
||||
},
|
||||
isWatching() {
|
||||
const card = this.currentData();
|
||||
|
@ -408,17 +406,17 @@ BlazeComponent.extendComponent({
|
|||
Meteor.call('toggleSystemMessages');
|
||||
},
|
||||
'click .js-vote'(e) {
|
||||
const forIt = $(e.target).hasClass('js-vote-positive')
|
||||
let newState = null
|
||||
const forIt = $(e.target).hasClass('js-vote-positive');
|
||||
let newState = null;
|
||||
if (
|
||||
this.voteState() == null ||
|
||||
this.voteState() == false && forIt ||
|
||||
this.voteState() == true && !forIt
|
||||
(this.voteState() == false && forIt) ||
|
||||
(this.voteState() == true && !forIt)
|
||||
) {
|
||||
newState = forIt
|
||||
newState = forIt;
|
||||
}
|
||||
this.data().setVote(Meteor.userId(), newState)
|
||||
}
|
||||
this.data().setVote(Meteor.userId(), newState);
|
||||
},
|
||||
},
|
||||
];
|
||||
},
|
||||
|
@ -613,7 +611,7 @@ Template.cardDetailsActionsPopup.events({
|
|||
'click .js-set-card-color': Popup.open('setCardColor'),
|
||||
'click .js-cancel-voting'(event) {
|
||||
event.preventDefault();
|
||||
this.unsetVote()
|
||||
this.unsetVote();
|
||||
Popup.close();
|
||||
},
|
||||
'click .js-move-card-to-top'(event) {
|
||||
|
@ -649,7 +647,7 @@ Template.cardDetailsActionsPopup.events({
|
|||
},
|
||||
});
|
||||
|
||||
Template.editCardTitleForm.onRendered(function () {
|
||||
Template.editCardTitleForm.onRendered(function() {
|
||||
autosize(this.$('.js-edit-card-title'));
|
||||
});
|
||||
|
||||
|
@ -663,7 +661,7 @@ Template.editCardTitleForm.events({
|
|||
},
|
||||
});
|
||||
|
||||
Template.editCardRequesterForm.onRendered(function () {
|
||||
Template.editCardRequesterForm.onRendered(function() {
|
||||
autosize(this.$('.js-edit-card-requester'));
|
||||
});
|
||||
|
||||
|
@ -676,7 +674,7 @@ Template.editCardRequesterForm.events({
|
|||
},
|
||||
});
|
||||
|
||||
Template.editCardAssignerForm.onRendered(function () {
|
||||
Template.editCardAssignerForm.onRendered(function() {
|
||||
autosize(this.$('.js-edit-card-assigner'));
|
||||
});
|
||||
|
||||
|
@ -816,7 +814,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;
|
||||
|
@ -965,7 +963,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);
|
||||
|
@ -1003,9 +1001,8 @@ BlazeComponent.extendComponent({
|
|||
'submit .edit-vote-question'(evt) {
|
||||
evt.preventDefault();
|
||||
const voteQuestion = evt.target.vote.value;
|
||||
this.currentCard.setVoteQuestion(voteQuestion)
|
||||
this.currentCard.setVoteQuestion(voteQuestion);
|
||||
Popup.close();
|
||||
|
||||
},
|
||||
},
|
||||
];
|
||||
|
|
|
@ -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
|
||||
|
@ -334,7 +334,7 @@ card-details-color(background, color...)
|
|||
.voted
|
||||
opacity: .7
|
||||
.vote-title
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
display: flex
|
||||
justify-content: space-between
|
||||
.vote-result
|
||||
display: flex;
|
||||
display: flex
|
||||
|
|
|
@ -22,11 +22,20 @@ BlazeComponent.extendComponent({
|
|||
const listId = targetBoard.getDefaultSubtasksListId();
|
||||
|
||||
//Get the full swimlane data for the parent task.
|
||||
const parentSwimlane = Swimlanes.findOne({boardId: crtBoard._id, _id: card.swimlaneId});
|
||||
const parentSwimlane = Swimlanes.findOne({
|
||||
boardId: crtBoard._id,
|
||||
_id: card.swimlaneId,
|
||||
});
|
||||
//find the swimlane of the same name in the target board.
|
||||
const targetSwimlane = Swimlanes.findOne({boardId: targetBoard._id, title: parentSwimlane.title});
|
||||
const targetSwimlane = Swimlanes.findOne({
|
||||
boardId: targetBoard._id,
|
||||
title: parentSwimlane.title,
|
||||
});
|
||||
//If no swimlane with a matching title exists in the target board, fall back to the default swimlane.
|
||||
const swimlaneId = targetSwimlane === undefined ? targetBoard.getDefaultSwimline()._id : targetSwimlane._id;
|
||||
const swimlaneId =
|
||||
targetSwimlane === undefined
|
||||
? targetBoard.getDefaultSwimline()._id
|
||||
: targetSwimlane._id;
|
||||
|
||||
if (title) {
|
||||
const _id = Cards.insert({
|
||||
|
|
|
@ -14,3 +14,7 @@ template(name='notificationsDrawer')
|
|||
+notification(activityData=activity index=dbIndex read=read)
|
||||
if($gt unreadNotifications 0)
|
||||
a.all-read {{_ 'mark-all-as-read'}}
|
||||
if ($and ($.Session.get 'showReadNotifications') ($gt readNotifications 0))
|
||||
a.remove-read
|
||||
i.fa.fa-trash
|
||||
| {{_ 'remove-all-read'}}
|
||||
|
|
|
@ -16,6 +16,13 @@ Template.notificationsDrawer.helpers({
|
|||
transformedProfile() {
|
||||
return Users.findOne(Meteor.userId());
|
||||
},
|
||||
readNotifications() {
|
||||
const readNotifications = _.filter(
|
||||
Meteor.user().profile.notifications,
|
||||
v => !!v.read,
|
||||
);
|
||||
return readNotifications.length;
|
||||
},
|
||||
});
|
||||
|
||||
Template.notificationsDrawer.events({
|
||||
|
@ -35,4 +42,12 @@ Template.notificationsDrawer.events({
|
|||
'click .toggle-read'() {
|
||||
Session.set('showReadNotifications', !Session.get('showReadNotifications'));
|
||||
},
|
||||
'click .remove-read'() {
|
||||
const user = Meteor.user();
|
||||
for (const notification of user.profile.notifications) {
|
||||
if (notification.read) {
|
||||
user.removeNotification(notification.activity);
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
|
|
@ -45,12 +45,23 @@ section#notifications-drawer
|
|||
line-height: 24px
|
||||
opacity 1
|
||||
|
||||
.all-read
|
||||
.all-read,
|
||||
.remove-read
|
||||
color belize
|
||||
background-color: #fafafa
|
||||
margin 8px 16px 12px
|
||||
display inline-block
|
||||
|
||||
.remove-read
|
||||
float right
|
||||
|
||||
&:hover
|
||||
color #eb4646 !important
|
||||
|
||||
i.fa
|
||||
color inherit
|
||||
|
||||
|
||||
ul.notifications
|
||||
display: block
|
||||
padding: 0px 16px
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -254,6 +254,11 @@ services:
|
|||
#-MAX_IMAGE_PIXEL=1024
|
||||
#-IMAGE_COMPRESS_RATIO=80
|
||||
#---------------------------------------------------------------
|
||||
# ==== NOTIFICATION TRAY AFTER READ DAYS BEFORE REMOVE =====
|
||||
# Number of days after a notification is read before we remove it.
|
||||
# Default: 2
|
||||
#- NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE=2
|
||||
#---------------------------------------------------------------
|
||||
# ==== BIGEVENTS DUE ETC NOTIFICATIONS =====
|
||||
# https://github.com/wekan/wekan/pull/2541
|
||||
# Introduced a system env var BIGEVENTS_PATTERN default as "NONE",
|
||||
|
|
|
@ -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
helm/wekan/templates/route.yaml
Normal file
23
helm/wekan/templates/route.yaml
Normal 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 }}
|
|
@ -59,6 +59,9 @@ ingress:
|
|||
# hosts:
|
||||
# - wekan-example.local
|
||||
|
||||
route:
|
||||
enabled: false
|
||||
|
||||
resources:
|
||||
requests:
|
||||
memory: 128Mi
|
||||
|
|
1544
i18n/ar.i18n.json
1544
i18n/ar.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/bg.i18n.json
1544
i18n/bg.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/br.i18n.json
1544
i18n/br.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/ca.i18n.json
1544
i18n/ca.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/cs.i18n.json
1544
i18n/cs.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/da.i18n.json
1544
i18n/da.i18n.json
File diff suppressed because it is too large
Load diff
|
@ -152,6 +152,8 @@
|
|||
"card-spent": "Aufgewendete Zeit",
|
||||
"card-edit-attachments": "Anhänge ändern",
|
||||
"card-edit-custom-fields": "Benutzerdefinierte Felder editieren",
|
||||
"card-start-voting": "Abstimmung starten",
|
||||
"card-cancel-voting": "Abstimmung mit allen Stimmen löschen ",
|
||||
"card-edit-labels": "Labels ändern",
|
||||
"card-edit-members": "Mitglieder ändern",
|
||||
"card-labels-title": "Labels für diese Karte ändern.",
|
||||
|
@ -161,6 +163,10 @@
|
|||
"cardAttachmentsPopup-title": "Anhängen von",
|
||||
"cardCustomField-datePopup-title": "Datum ändern",
|
||||
"cardCustomFieldsPopup-title": "Benutzerdefinierte Felder editieren",
|
||||
"cardStartVotingPopup-title": "Abstimmung starten",
|
||||
"vote-question": "Abstimmen über",
|
||||
"vote-for-it": "Dafür",
|
||||
"vote-against": "Dagegen",
|
||||
"cardDeletePopup-title": "Karte löschen?",
|
||||
"cardDetailsActionsPopup-title": "Kartenaktionen",
|
||||
"cardLabelsPopup-title": "Labels",
|
||||
|
@ -319,6 +325,7 @@
|
|||
"filter-clear": "Filter entfernen",
|
||||
"filter-no-label": "Kein Label",
|
||||
"filter-no-member": "Kein Mitglied",
|
||||
"filter-no-assignee": "No assignee",
|
||||
"filter-no-custom-fields": "Keine benutzerdefinierten Felder",
|
||||
"filter-show-archive": "Archivierte Listen anzeigen",
|
||||
"filter-hide-empty": "Leere Listen verstecken",
|
||||
|
@ -763,7 +770,8 @@
|
|||
"notifications": "Benachrichtigungen",
|
||||
"view-all": "Alle anzeigen",
|
||||
"filter-by-unread": "Nach Ungelesenen filtern",
|
||||
"mark-all-as-read": "Als ungelesen markieren",
|
||||
"mark-all-as-read": "Alle als gelesen markieren",
|
||||
"remove-all-read": "Alle gelesenen entfernen",
|
||||
"allow-rename": "Umbenennen erlauben",
|
||||
"allowRenamePopup-title": "Umbenennen erlauben"
|
||||
}
|
||||
|
|
1544
i18n/el.i18n.json
1544
i18n/el.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/en-GB.i18n.json
1544
i18n/en-GB.i18n.json
File diff suppressed because it is too large
Load diff
|
@ -153,7 +153,7 @@
|
|||
"card-edit-attachments": "Edit attachments",
|
||||
"card-edit-custom-fields": "Edit custom fields",
|
||||
"card-start-voting": "Start voting",
|
||||
"card-cancel-voting": "Delete 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.",
|
||||
|
@ -325,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",
|
||||
|
@ -773,6 +774,7 @@
|
|||
"view-all": "View All",
|
||||
"filter-by-unread": "Filter by Unread",
|
||||
"mark-all-as-read": "Mark all as read",
|
||||
"remove-all-read": "Remove all read",
|
||||
"allow-rename": "Allow Rename",
|
||||
"allowRenamePopup-title": "Allow Rename"
|
||||
}
|
||||
|
|
1544
i18n/eo.i18n.json
1544
i18n/eo.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/es-AR.i18n.json
1544
i18n/es-AR.i18n.json
File diff suppressed because it is too large
Load diff
|
@ -152,6 +152,8 @@
|
|||
"card-spent": "Tiempo consumido",
|
||||
"card-edit-attachments": "Editar los adjuntos",
|
||||
"card-edit-custom-fields": "Editar los campos personalizados",
|
||||
"card-start-voting": "Start voting",
|
||||
"card-cancel-voting": "Delete voting and all votes",
|
||||
"card-edit-labels": "Editar las etiquetas",
|
||||
"card-edit-members": "Editar los miembros",
|
||||
"card-labels-title": "Cambia las etiquetas de la tarjeta",
|
||||
|
@ -161,6 +163,10 @@
|
|||
"cardAttachmentsPopup-title": "Adjuntar desde",
|
||||
"cardCustomField-datePopup-title": "Cambiar la fecha",
|
||||
"cardCustomFieldsPopup-title": "Editar los campos personalizados",
|
||||
"cardStartVotingPopup-title": "Start a vote",
|
||||
"vote-question": "Voting question",
|
||||
"vote-for-it": "for it",
|
||||
"vote-against": "against",
|
||||
"cardDeletePopup-title": "¿Eliminar la tarjeta?",
|
||||
"cardDetailsActionsPopup-title": "Acciones de la tarjeta",
|
||||
"cardLabelsPopup-title": "Etiquetas",
|
||||
|
@ -319,6 +325,7 @@
|
|||
"filter-clear": "Limpiar el filtro",
|
||||
"filter-no-label": "Sin etiqueta",
|
||||
"filter-no-member": "Sin miembro",
|
||||
"filter-no-assignee": "No assignee",
|
||||
"filter-no-custom-fields": "Sin campos personalizados",
|
||||
"filter-show-archive": "Mostrar las listas archivadas",
|
||||
"filter-hide-empty": "Ocultar las listas vacías",
|
||||
|
@ -764,6 +771,7 @@
|
|||
"view-all": "Ver todo",
|
||||
"filter-by-unread": "Filtrar por no leído",
|
||||
"mark-all-as-read": "Marcar todo como leido",
|
||||
"remove-all-read": "Remove all read",
|
||||
"allow-rename": "Permitir renombrar",
|
||||
"allowRenamePopup-title": "Permitir renombrar"
|
||||
}
|
||||
|
|
1544
i18n/eu.i18n.json
1544
i18n/eu.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/fa.i18n.json
1544
i18n/fa.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/fi.i18n.json
1544
i18n/fi.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/fr.i18n.json
1544
i18n/fr.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/gl.i18n.json
1544
i18n/gl.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/he.i18n.json
1544
i18n/he.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/hi.i18n.json
1544
i18n/hi.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/hu.i18n.json
1544
i18n/hu.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/hy.i18n.json
1544
i18n/hy.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/id.i18n.json
1544
i18n/id.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/ig.i18n.json
1544
i18n/ig.i18n.json
File diff suppressed because it is too large
Load diff
|
@ -152,6 +152,8 @@
|
|||
"card-spent": "Tempo trascorso",
|
||||
"card-edit-attachments": "Modifica allegati",
|
||||
"card-edit-custom-fields": "Modifica campo personalizzato",
|
||||
"card-start-voting": "Start voting",
|
||||
"card-cancel-voting": "Delete voting and all votes",
|
||||
"card-edit-labels": "Modifica etichette",
|
||||
"card-edit-members": "Modifica membri",
|
||||
"card-labels-title": "Cambia le etichette per questa scheda.",
|
||||
|
@ -161,6 +163,10 @@
|
|||
"cardAttachmentsPopup-title": "Allega da",
|
||||
"cardCustomField-datePopup-title": "Cambia data",
|
||||
"cardCustomFieldsPopup-title": "Modifica campo personalizzato",
|
||||
"cardStartVotingPopup-title": "Start a vote",
|
||||
"vote-question": "Voting question",
|
||||
"vote-for-it": "for it",
|
||||
"vote-against": "against",
|
||||
"cardDeletePopup-title": "Elimina scheda?",
|
||||
"cardDetailsActionsPopup-title": "Azioni scheda",
|
||||
"cardLabelsPopup-title": "Etichette",
|
||||
|
@ -319,6 +325,7 @@
|
|||
"filter-clear": "Pulisci filtri",
|
||||
"filter-no-label": "Nessuna etichetta",
|
||||
"filter-no-member": "Nessun membro",
|
||||
"filter-no-assignee": "No assignee",
|
||||
"filter-no-custom-fields": "Nessun campo personalizzato",
|
||||
"filter-show-archive": "Mostra le liste archiviate",
|
||||
"filter-hide-empty": "Nascondi liste vuote",
|
||||
|
@ -764,6 +771,7 @@
|
|||
"view-all": "Mostra Tutto",
|
||||
"filter-by-unread": "Filtra per non letto",
|
||||
"mark-all-as-read": "Segna come letto",
|
||||
"remove-all-read": "Remove all read",
|
||||
"allow-rename": "Consenti Rinomina",
|
||||
"allowRenamePopup-title": "Consenti Rinomina"
|
||||
}
|
||||
|
|
1544
i18n/ja.i18n.json
1544
i18n/ja.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/ka.i18n.json
1544
i18n/ka.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/km.i18n.json
1544
i18n/km.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/ko.i18n.json
1544
i18n/ko.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/lv.i18n.json
1544
i18n/lv.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/mk.i18n.json
1544
i18n/mk.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/mn.i18n.json
1544
i18n/mn.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/nb.i18n.json
1544
i18n/nb.i18n.json
File diff suppressed because it is too large
Load diff
|
@ -152,6 +152,8 @@
|
|||
"card-spent": "Gespendeerde tijd",
|
||||
"card-edit-attachments": "Wijzig bijlagen",
|
||||
"card-edit-custom-fields": "Wijzig maatwerkvelden",
|
||||
"card-start-voting": "Start voting",
|
||||
"card-cancel-voting": "Delete voting and all votes",
|
||||
"card-edit-labels": "Wijzig labels",
|
||||
"card-edit-members": "Wijzig leden",
|
||||
"card-labels-title": "Wijzig de labels van de kaart.",
|
||||
|
@ -161,6 +163,10 @@
|
|||
"cardAttachmentsPopup-title": "Voeg bestand toe vanuit",
|
||||
"cardCustomField-datePopup-title": "Wijzigingsdatum",
|
||||
"cardCustomFieldsPopup-title": "Wijzig maatwerkvelden",
|
||||
"cardStartVotingPopup-title": "Start a vote",
|
||||
"vote-question": "Voting question",
|
||||
"vote-for-it": "for it",
|
||||
"vote-against": "against",
|
||||
"cardDeletePopup-title": "Kaart verwijderen?",
|
||||
"cardDetailsActionsPopup-title": "Kaart actie ondernemen",
|
||||
"cardLabelsPopup-title": "Labels",
|
||||
|
@ -319,6 +325,7 @@
|
|||
"filter-clear": "Wis filter",
|
||||
"filter-no-label": "Geen label",
|
||||
"filter-no-member": "Geen lid",
|
||||
"filter-no-assignee": "No assignee",
|
||||
"filter-no-custom-fields": "Geen maatwerkvelden",
|
||||
"filter-show-archive": "Toon gearchiveerde lijsten",
|
||||
"filter-hide-empty": "Verberg lege lijsten",
|
||||
|
@ -764,6 +771,7 @@
|
|||
"view-all": "Bekijk alles",
|
||||
"filter-by-unread": "Filter op Ongelezen",
|
||||
"mark-all-as-read": "Markeer alles als gelezen",
|
||||
"remove-all-read": "Remove all read",
|
||||
"allow-rename": "Sta Hernoemen toe",
|
||||
"allowRenamePopup-title": "Sta Hernoemen toe"
|
||||
}
|
||||
|
|
1544
i18n/oc.i18n.json
1544
i18n/oc.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/pl.i18n.json
1544
i18n/pl.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/pt-BR.i18n.json
1544
i18n/pt-BR.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/pt.i18n.json
1544
i18n/pt.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/ro.i18n.json
1544
i18n/ro.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/ru.i18n.json
1544
i18n/ru.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/sl.i18n.json
1544
i18n/sl.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/sr.i18n.json
1544
i18n/sr.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/sv.i18n.json
1544
i18n/sv.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/sw.i18n.json
1544
i18n/sw.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/ta.i18n.json
1544
i18n/ta.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/th.i18n.json
1544
i18n/th.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/tr.i18n.json
1544
i18n/tr.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/uk.i18n.json
1544
i18n/uk.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/vi.i18n.json
1544
i18n/vi.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/zh-CN.i18n.json
1544
i18n/zh-CN.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/zh-HK.i18n.json
1544
i18n/zh-HK.i18n.json
File diff suppressed because it is too large
Load diff
1544
i18n/zh-TW.i18n.json
1544
i18n/zh-TW.i18n.json
File diff suppressed because it is too large
Load diff
|
@ -282,7 +282,10 @@ if (Meteor.isServer) {
|
|||
);
|
||||
}
|
||||
Notifications.getUsers(watchers).forEach(user => {
|
||||
Notifications.notify(user, title, description, params);
|
||||
// don't notify a user of their own behavior
|
||||
if (user._id !== userId) {
|
||||
Notifications.notify(user, title, description, params);
|
||||
}
|
||||
});
|
||||
|
||||
const integrations = Integrations.find({
|
||||
|
|
|
@ -334,8 +334,8 @@ Cards.attachSchema(
|
|||
'vote.end': {
|
||||
type: Date,
|
||||
optional: true,
|
||||
defaultValue: null
|
||||
}
|
||||
defaultValue: null,
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
|
@ -728,7 +728,7 @@ Cards.helpers({
|
|||
|
||||
parentString(sep) {
|
||||
return this.parentList()
|
||||
.map(function (elem) {
|
||||
.map(function(elem) {
|
||||
return elem.title;
|
||||
})
|
||||
.join(sep);
|
||||
|
@ -1449,11 +1449,11 @@ Cards.mutations({
|
|||
$set: {
|
||||
vote: {
|
||||
question,
|
||||
positive:[],
|
||||
negative:[]
|
||||
positive: [],
|
||||
negative: [],
|
||||
},
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
},
|
||||
unsetVote() {
|
||||
return {
|
||||
|
@ -1467,32 +1467,32 @@ Cards.mutations({
|
|||
case true:
|
||||
// vote for it
|
||||
return {
|
||||
$pull:{
|
||||
"vote.negative": userId
|
||||
$pull: {
|
||||
'vote.negative': userId,
|
||||
},
|
||||
$addToSet: {
|
||||
"vote.positive": userId
|
||||
}
|
||||
}
|
||||
'vote.positive': userId,
|
||||
},
|
||||
};
|
||||
case false:
|
||||
// vote against
|
||||
return {
|
||||
$pull:{
|
||||
"vote.positive": userId
|
||||
$pull: {
|
||||
'vote.positive': userId,
|
||||
},
|
||||
$addToSet: {
|
||||
"vote.negative" : userId
|
||||
}
|
||||
}
|
||||
'vote.negative': userId,
|
||||
},
|
||||
};
|
||||
|
||||
default:
|
||||
// Remove votes
|
||||
return {
|
||||
$pull:{
|
||||
"vote.positive": userId,
|
||||
"vote.negative" : userId
|
||||
$pull: {
|
||||
'vote.positive': userId,
|
||||
'vote.negative': userId,
|
||||
},
|
||||
}
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
@ -1897,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;
|
||||
|
@ -1943,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(
|
||||
|
@ -1997,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);
|
||||
|
@ -2007,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,
|
||||
|
@ -2031,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,
|
||||
) {
|
||||
|
@ -2044,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,
|
||||
|
@ -2066,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;
|
||||
|
@ -2098,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,
|
||||
) {
|
||||
|
@ -2205,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;
|
||||
|
@ -2504,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,3 +1,5 @@
|
|||
import { SyncedCron } from 'meteor/percolate:synced-cron';
|
||||
|
||||
// Sandstorm context is detected using the METEOR_SETTINGS environment variable
|
||||
// in the package definition.
|
||||
const isSandstorm =
|
||||
|
@ -926,6 +928,38 @@ if (Meteor.isServer) {
|
|||
});
|
||||
}
|
||||
|
||||
const addCronJob = _.debounce(
|
||||
Meteor.bindEnvironment(function notificationCleanupDebounced() {
|
||||
// passed in the removeAge has to be a number standing for the number of days after a notification is read before we remove it
|
||||
const envRemoveAge =
|
||||
process.env.NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE;
|
||||
// default notifications will be removed 2 days after they are read
|
||||
const defaultRemoveAge = 2;
|
||||
const removeAge = parseInt(envRemoveAge, 10) || defaultRemoveAge;
|
||||
|
||||
SyncedCron.add({
|
||||
name: 'notification_cleanup',
|
||||
schedule: parser => parser.text('every 1 days'),
|
||||
job: () => {
|
||||
for (const user of Users.find()) {
|
||||
for (const notification of user.profile.notifications) {
|
||||
if (notification.read) {
|
||||
const removeDate = new Date(notification.read);
|
||||
removeDate.setDate(removeDate.getDate() + removeAge);
|
||||
if (removeDate <= new Date()) {
|
||||
user.removeNotification(notification.activity);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
SyncedCron.start();
|
||||
}),
|
||||
500,
|
||||
);
|
||||
|
||||
if (Meteor.isServer) {
|
||||
// Let mongoDB ensure username unicity
|
||||
Meteor.startup(() => {
|
||||
|
@ -939,6 +973,9 @@ if (Meteor.isServer) {
|
|||
},
|
||||
{ unique: true },
|
||||
);
|
||||
Meteor.defer(() => {
|
||||
addCronJob();
|
||||
});
|
||||
});
|
||||
|
||||
// OLD WAY THIS CODE DID WORK: When user is last admin of board,
|
||||
|
|
2
package-lock.json
generated
2
package-lock.json
generated
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "wekan",
|
||||
"version": "v3.90.0",
|
||||
"version": "v3.92.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "wekan",
|
||||
"version": "v3.90.0",
|
||||
"version": "v3.92.0",
|
||||
"description": "Open-Source kanban",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
|
|
@ -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.90">Wekan REST API v3.90</a>
|
||||
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v3.92">Wekan REST API v3.92</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.90</h1>
|
||||
<h1 id="wekan-rest-api">Wekan REST API v3.92</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>{}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
swagger: '2.0'
|
||||
info:
|
||||
title: Wekan REST API
|
||||
version: v3.90
|
||||
version: v3.92
|
||||
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 = 390,
|
||||
appVersion = 392,
|
||||
# Increment this for every release.
|
||||
|
||||
appMarketingVersion = (defaultText = "3.90.0~2020-04-06"),
|
||||
appMarketingVersion = (defaultText = "3.92.0~2020-04-09"),
|
||||
# Human-readable presentation of the app version.
|
||||
|
||||
minUpgradableAppVersion = 0,
|
||||
|
@ -242,6 +242,7 @@ const myCommand :Spk.Manifest.Command = (
|
|||
(key = "SCROLLINERTIA", value="0"),
|
||||
(key = "SCROLLAMOUNT", value="auto"),
|
||||
(key = "CARD_OPENED_WEBHOOK_ENABLED", value="false"),
|
||||
(key = "NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE", value=""),
|
||||
(key = "BIGEVENTS_PATTERN", value="NONE"),
|
||||
(key = "MATOMO_ADDRESS", value=""),
|
||||
(key = "MATOMO_SITE_ID", value=""),
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
# All supported keys are defined here together with descriptions and default values
|
||||
|
||||
# list of supported keys
|
||||
keys="DEBUG MONGO_URL MONGODB_BIND_UNIX_SOCKET MONGO_URL MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API RICHER_CARD_COMMENT_EDITOR CARD_OPENED_WEBHOOK_ENABLED ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW MAX_IMAGE_PIXEL IMAGE_COMPRESS_RATIO BIGEVENTS_PATTERN NOTIFY_DUE_DAYS_BEFORE_AND_AFTER NOTIFY_DUE_AT_HOUR_OF_DAY EMAIL_NOTIFICATION_TIMEOUT CORS CORS_ALLOW_HEADERS CORS_EXPOSE_HEADERS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_LOGIN_STYLE OAUTH2_CLIENT_ID OAUTH2_SECRET OAUTH2_SERVER_URL OAUTH2_AUTH_ENDPOINT OAUTH2_USERINFO_ENDPOINT OAUTH2_TOKEN_ENDPOINT OAUTH2_ID_MAP OAUTH2_USERNAME_MAP OAUTH2_FULLNAME_MAP OAUTH2_ID_TOKEN_WHITELIST_FIELDS OAUTH2_EMAIL_MAP OAUTH2_REQUEST_PERMISSIONS LDAP_ENABLE LDAP_PORT LDAP_HOST LDAP_BASEDN LDAP_LOGIN_FALLBACK LDAP_RECONNECT LDAP_TIMEOUT LDAP_IDLE_TIMEOUT LDAP_CONNECT_TIMEOUT LDAP_AUTHENTIFICATION LDAP_AUTHENTIFICATION_USERDN LDAP_AUTHENTIFICATION_PASSWORD LDAP_LOG_ENABLED LDAP_BACKGROUND_SYNC LDAP_BACKGROUND_SYNC_INTERVAL LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS LDAP_ENCRYPTION LDAP_CA_CERT LDAP_REJECT_UNAUTHORIZED LDAP_USER_AUTHENTICATION LDAP_USER_AUTHENTICATION_FIELD LDAP_USER_SEARCH_FILTER LDAP_USER_SEARCH_SCOPE LDAP_USER_SEARCH_FIELD LDAP_SEARCH_PAGE_SIZE LDAP_SEARCH_SIZE_LIMIT LDAP_GROUP_FILTER_ENABLE LDAP_GROUP_FILTER_OBJECTCLASS LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT LDAP_GROUP_FILTER_GROUP_NAME LDAP_UNIQUE_IDENTIFIER_FIELD LDAP_UTF8_NAMES_SLUGIFY LDAP_USERNAME_FIELD LDAP_FULLNAME_FIELD LDAP_MERGE_EXISTING_USERS LDAP_SYNC_USER_DATA LDAP_SYNC_USER_DATA_FIELDMAP LDAP_SYNC_GROUP_ROLES LDAP_DEFAULT_DOMAIN LDAP_EMAIL_MATCH_ENABLE LDAP_EMAIL_MATCH_REQUIRE LDAP_EMAIL_MATCH_VERIFIED LDAP_EMAIL_FIELD LDAP_SYNC_ADMIN_STATUS LDAP_SYNC_ADMIN_GROUPS HEADER_LOGIN_ID HEADER_LOGIN_FIRSTNAME HEADER_LOGIN_LASTNAME HEADER_LOGIN_EMAIL LOGOUT_WITH_TIMER LOGOUT_IN LOGOUT_ON_HOURS LOGOUT_ON_MINUTES DEFAULT_AUTHENTICATION_METHOD ATTACHMENTS_STORE_PATH SCROLLINERTIA SCROLLAMOUNT"
|
||||
keys="DEBUG MONGO_URL MONGODB_BIND_UNIX_SOCKET MONGO_URL MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API RICHER_CARD_COMMENT_EDITOR CARD_OPENED_WEBHOOK_ENABLED ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURES_BEFORE ACCOUNTS_LOCKOUT_KNOWN_USERS_PERIOD ACCOUNTS_LOCKOUT_KNOWN_USERS_FAILURE_WINDOW ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW MAX_IMAGE_PIXEL IMAGE_COMPRESS_RATIO BIGEVENTS_PATTERN NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE NOTIFY_DUE_DAYS_BEFORE_AND_AFTER NOTIFY_DUE_AT_HOUR_OF_DAY EMAIL_NOTIFICATION_TIMEOUT CORS CORS_ALLOW_HEADERS CORS_EXPOSE_HEADERS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_LOGIN_STYLE OAUTH2_CLIENT_ID OAUTH2_SECRET OAUTH2_SERVER_URL OAUTH2_AUTH_ENDPOINT OAUTH2_USERINFO_ENDPOINT OAUTH2_TOKEN_ENDPOINT OAUTH2_ID_MAP OAUTH2_USERNAME_MAP OAUTH2_FULLNAME_MAP OAUTH2_ID_TOKEN_WHITELIST_FIELDS OAUTH2_EMAIL_MAP OAUTH2_REQUEST_PERMISSIONS LDAP_ENABLE LDAP_PORT LDAP_HOST LDAP_BASEDN LDAP_LOGIN_FALLBACK LDAP_RECONNECT LDAP_TIMEOUT LDAP_IDLE_TIMEOUT LDAP_CONNECT_TIMEOUT LDAP_AUTHENTIFICATION LDAP_AUTHENTIFICATION_USERDN LDAP_AUTHENTIFICATION_PASSWORD LDAP_LOG_ENABLED LDAP_BACKGROUND_SYNC LDAP_BACKGROUND_SYNC_INTERVAL LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS LDAP_ENCRYPTION LDAP_CA_CERT LDAP_REJECT_UNAUTHORIZED LDAP_USER_AUTHENTICATION LDAP_USER_AUTHENTICATION_FIELD LDAP_USER_SEARCH_FILTER LDAP_USER_SEARCH_SCOPE LDAP_USER_SEARCH_FIELD LDAP_SEARCH_PAGE_SIZE LDAP_SEARCH_SIZE_LIMIT LDAP_GROUP_FILTER_ENABLE LDAP_GROUP_FILTER_OBJECTCLASS LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT LDAP_GROUP_FILTER_GROUP_NAME LDAP_UNIQUE_IDENTIFIER_FIELD LDAP_UTF8_NAMES_SLUGIFY LDAP_USERNAME_FIELD LDAP_FULLNAME_FIELD LDAP_MERGE_EXISTING_USERS LDAP_SYNC_USER_DATA LDAP_SYNC_USER_DATA_FIELDMAP LDAP_SYNC_GROUP_ROLES LDAP_DEFAULT_DOMAIN LDAP_EMAIL_MATCH_ENABLE LDAP_EMAIL_MATCH_REQUIRE LDAP_EMAIL_MATCH_VERIFIED LDAP_EMAIL_FIELD LDAP_SYNC_ADMIN_STATUS LDAP_SYNC_ADMIN_GROUPS HEADER_LOGIN_ID HEADER_LOGIN_FIRSTNAME HEADER_LOGIN_LASTNAME HEADER_LOGIN_EMAIL LOGOUT_WITH_TIMER LOGOUT_IN LOGOUT_ON_HOURS LOGOUT_ON_MINUTES DEFAULT_AUTHENTICATION_METHOD ATTACHMENTS_STORE_PATH SCROLLINERTIA SCROLLAMOUNT"
|
||||
|
||||
# default values
|
||||
DESCRIPTION_DEBUG="Debug OIDC OAuth2 etc. Example: sudo snap set wekan debug='true'"
|
||||
|
@ -104,6 +104,10 @@ DESCRIPTION_IMAGE_COMPRESS_RATIO="Image compress ratio: Allow to shrink attached
|
|||
DEFAULT_IMAGE_COMPRESS_RATIO=""
|
||||
KEY_IMAGE_COMPRESS_RATIO="image-compress-ratio"
|
||||
|
||||
DESCRIPTION_NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE="Number of days after a notification is read before we remove it. Default: 2."
|
||||
DEFAULT_NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE=""
|
||||
KEY_NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE="notification-tray-after-read-days-before-remove"
|
||||
|
||||
DESCRIPTION_BIGEVENTS_PATTERN="Big events pattern: Notify always due etc regardless of notification settings. Default: NONE, All: received|start|due|end, Disabled: NONE"
|
||||
DEFAULT_BIGEVENTS_PATTERN="NONE"
|
||||
KEY_BIGEVENTS_PATTERN="bigevents-pattern"
|
||||
|
|
|
@ -105,6 +105,11 @@ echo -e "\t$ snap set $SNAP_NAME attachments-store-path='/var/snap/wekan/common/
|
|||
echo -e "Disabled:"
|
||||
echo -e "\t$ snap set $SNAP_NAME attachments-store-path=''"
|
||||
echo -e "\n"
|
||||
echo -e "NOTIFICATION TRAY AFTER READ DAYS BEFORE REMOVE https://github.com/wekan/wekan/pull/2998"
|
||||
echo -e "Number of days after a notification is read before we remove it. Default: 2."
|
||||
echo -e "Default:"
|
||||
echo -e "\t$ snap set $SNAP_NAME notification-tray-after-read-days-before-remove='2'"
|
||||
echo -e "\n"
|
||||
echo -e "BIGEVENTS DUE ETC NOTIFICATIONS https://github.com/wekan/wekan/pull/2541"
|
||||
echo -e "Big events pattern: Notify always due etc regardless of notification settings. Default: due, All: received|start|due|end, Disabled: NONE"
|
||||
echo -e "Default:"
|
||||
|
|
|
@ -48,6 +48,11 @@ REM SET ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE=3
|
|||
REM SET ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60
|
||||
REM SET ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15
|
||||
|
||||
REM # ==== NOTIFICATION TRAY AFTER READ DAYS BEFORE REMOVE =====
|
||||
REM # Number of days after a notification is read before we remove it.
|
||||
REM # Default: 2
|
||||
REM SET NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE=2
|
||||
|
||||
REM # ==== BIGEVENTS DUE ETC NOTIFICATIONS =====
|
||||
REM # https://github.com/wekan/wekan/pull/2541
|
||||
REM # Introduced a system env var BIGEVENTS_PATTERN default as "NONE",
|
||||
|
|
|
@ -54,6 +54,11 @@
|
|||
#export MAX_IMAGE_PIXEL=1024
|
||||
#export IMAGE_COMPRESS_RATIO=80
|
||||
#---------------------------------------------------------------
|
||||
# ==== NOTIFICATION TRAY AFTER READ DAYS BEFORE REMOVE =====
|
||||
# Number of days after a notification is read before we remove it.
|
||||
# Default: 2
|
||||
#- NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE=2
|
||||
#---------------------------------------------------------------
|
||||
# ==== BIGEVENTS DUE ETC NOTIFICATIONS =====
|
||||
# https://github.com/wekan/wekan/pull/2541
|
||||
# Introduced a system env var BIGEVENTS_PATTERN default as "NONE",
|
||||
|
|
|
@ -244,6 +244,11 @@ services:
|
|||
#-MAX_IMAGE_PIXEL=1024
|
||||
#-IMAGE_COMPRESS_RATIO=80
|
||||
#---------------------------------------------------------------
|
||||
# ==== NOTIFICATION TRAY AFTER READ DAYS BEFORE REMOVE =====
|
||||
# Number of days after a notification is read before we remove it.
|
||||
# Default: 2
|
||||
#- NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE=2
|
||||
#---------------------------------------------------------------
|
||||
# ==== BIGEVENTS DUE ETC NOTIFICATIONS =====
|
||||
# https://github.com/wekan/wekan/pull/2541
|
||||
# Introduced a system env var BIGEVENTS_PATTERN default as "NONE",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue