Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4a42d683af | ||
|
|
8faa48fe12 | ||
|
|
67c4fae32b | ||
|
|
42d31901b5 | ||
|
|
72b22a73b6 | ||
|
|
4d30503cb5 | ||
|
|
7b45a0fbfe | ||
|
|
42dee10dbe | ||
|
|
68be12d166 | ||
|
|
fd896c29b5 | ||
|
|
98a4be643e | ||
|
|
b650a89728 | ||
|
|
346dba4969 | ||
|
|
f3b858ca21 | ||
|
|
5bc355f9a5 | ||
|
|
21fa26a1be | ||
|
|
66372271c2 | ||
|
|
e60926f847 | ||
|
|
b04df1d54d | ||
|
|
83f81f4586 | ||
|
|
4785086e2f | ||
|
|
98c38fe58f | ||
|
|
44378fe9d1 | ||
|
|
afcca947e3 | ||
|
|
20526756db | ||
|
|
58724f93c9 | ||
|
|
5d6c68a9cf | ||
|
|
ed4c49090a | ||
|
|
75dc5f226c | ||
|
|
020b663836 | ||
|
|
e5f0dd7dd8 | ||
|
|
4f34adbd44 | ||
|
|
62b72a03c4 | ||
|
|
5696e4a4c6 | ||
|
|
814e264521 | ||
|
|
872ed4b2f9 | ||
|
|
1d8633e7e6 | ||
|
|
b3637f2781 | ||
|
|
68d3cdae58 | ||
|
|
620a362244 | ||
|
|
d5cff1ec48 | ||
|
|
8d7714760c | ||
|
|
a37723f8a4 | ||
|
|
e3a727edec | ||
|
|
4ee88e026e | ||
|
|
55a2473d81 | ||
|
|
03d7fc02ec |
No files matched your search
@@ -1,3 +1,34 @@
|
||||
# v3.46 2019-10-07 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [More black minicard badges](https://github.com/wekan/wekan/commit/68be12d166b21a41b4e2c4021b0966807e5ed1e6).
|
||||
Thanks to sfahrenholz and xet7.
|
||||
- [REST API: fix creation of Checklists](https://github.com/wekan/wekan/pull/2747).
|
||||
Thanks to liske.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v3.45 2019-10-03 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Cards due timeline will be shown in Calendar view](https://github.com/wekan/wekan/pull/2738).
|
||||
Thanks to whowillcare.
|
||||
- [Modified due day reminders in cards.js, so wekan server admin can control the reminder more flexibly](https://github.com/wekan/wekan/pull/2738).
|
||||
i.e. NOTIFY_DUE_DAYS_BEFORE_AND_AFTER = 0 notification will be sent on due day only.
|
||||
NOTIFY_DUE_DAYS_BEFORE_AND_AFTER = 2,0 it means notification will be sent on both due day and two days before.
|
||||
Thanks to whowillcare.
|
||||
- [Added modifications the help files, related to NOTIFY_DUE_DAYS_BEFORE_AND_AFTER](https://github.com/wekan/wekan/pull/2740).
|
||||
Thanks to whowillcare.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Modified list.style regarding .list-header-name when in mobile mode. It was too close to left arrow](https://github.com/wekan/wekan/pull/2740).
|
||||
Thanks to whowillcare.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v3.44 2019-09-17 Wekan release
|
||||
|
||||
This release adds the following languages:
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
||||
appVersion: "v3.44.0"
|
||||
appVersion: "v3.46.0"
|
||||
files:
|
||||
userUploads:
|
||||
- README.md
|
||||
|
||||
@@ -309,26 +309,46 @@ BlazeComponent.extendComponent({
|
||||
events(start, end, timezone, callback) {
|
||||
const currentBoard = Boards.findOne(Session.get('currentBoard'));
|
||||
const events = [];
|
||||
const pushEvent = function(card, title, start, end, extraCls) {
|
||||
start = start || card.startAt;
|
||||
end = end || card.endAt;
|
||||
title = title || card.title;
|
||||
const className =
|
||||
(extraCls ? `${extraCls} ` : '') +
|
||||
(card.color ? `calendar-event-${card.color}` : '');
|
||||
events.push({
|
||||
id: card._id,
|
||||
title,
|
||||
start,
|
||||
end: end || card.endAt,
|
||||
allDay:
|
||||
Math.abs(end.getTime() - start.getTime()) / 1000 === 24 * 3600,
|
||||
url: FlowRouter.url('card', {
|
||||
boardId: currentBoard._id,
|
||||
slug: currentBoard.slug,
|
||||
cardId: card._id,
|
||||
}),
|
||||
className,
|
||||
});
|
||||
};
|
||||
currentBoard
|
||||
.cardsInInterval(start.toDate(), end.toDate())
|
||||
.forEach(function(card) {
|
||||
events.push({
|
||||
id: card._id,
|
||||
title: card.title,
|
||||
start: card.startAt,
|
||||
end: card.endAt,
|
||||
allDay:
|
||||
Math.abs(card.endAt.getTime() - card.startAt.getTime()) /
|
||||
1000 ===
|
||||
24 * 3600,
|
||||
url: FlowRouter.url('card', {
|
||||
boardId: currentBoard._id,
|
||||
slug: currentBoard.slug,
|
||||
cardId: card._id,
|
||||
}),
|
||||
className: card.color ? `calendar-event-${card.color}` : null,
|
||||
});
|
||||
pushEvent(card);
|
||||
});
|
||||
currentBoard
|
||||
.cardsDueInBetween(start.toDate(), end.toDate())
|
||||
.forEach(function(card) {
|
||||
pushEvent(
|
||||
card,
|
||||
`${card.title} ${TAPi18n.__('card-due')}`,
|
||||
card.dueAt,
|
||||
new Date(card.dueAt.getTime() + 36e5),
|
||||
);
|
||||
});
|
||||
events.sort(function(first, second) {
|
||||
return first.id > second.id ? 1 : -1;
|
||||
});
|
||||
callback(events);
|
||||
},
|
||||
eventResize(event, delta, revertFunc) {
|
||||
|
||||
@@ -105,7 +105,8 @@
|
||||
right: 5px;
|
||||
top: 5px;
|
||||
display:none;
|
||||
@media only screen and (max-width: 1199px) {
|
||||
// @media only screen and (max-width: 1199px) {
|
||||
@media only screen and (max-width: 800px) {
|
||||
display:block;
|
||||
}
|
||||
.fa-arrows
|
||||
@@ -127,7 +128,7 @@
|
||||
.badges
|
||||
float: left
|
||||
margin-top: 7px
|
||||
color: darken(white, 50%)
|
||||
color: darken(white, 80%)
|
||||
|
||||
&:empty
|
||||
display: none
|
||||
|
||||
@@ -31,7 +31,7 @@ BlazeComponent.extendComponent({
|
||||
const itemsSelector = '.js-minicard:not(.placeholder, .js-card-composer)';
|
||||
const $cards = this.$('.js-minicards');
|
||||
|
||||
if (window.matchMedia('(max-width: 1199px)').matches) {
|
||||
if (Utils.isMiniScreen()) {
|
||||
$('.js-minicards').sortable({
|
||||
handle: '.handle',
|
||||
});
|
||||
|
||||
@@ -94,7 +94,13 @@ Template.editor.onRendered(() => {
|
||||
currentBoard
|
||||
.activeMembers()
|
||||
.map(member => {
|
||||
const username = Users.findOne(member.userId).username;
|
||||
const user = Users.findOne(member.userId);
|
||||
if (user._id === Meteor.userId()) {
|
||||
return null;
|
||||
}
|
||||
const value = user.username;
|
||||
const username =
|
||||
value && value.match(/\s+/) ? `"${value}"` : value;
|
||||
return username.includes(term) ? username : null;
|
||||
})
|
||||
.filter(Boolean),
|
||||
@@ -120,9 +126,10 @@ Template.editor.onRendered(() => {
|
||||
? [
|
||||
['view', ['fullscreen']],
|
||||
['table', ['table']],
|
||||
['font', ['bold', 'underline']],
|
||||
//['fontsize', ['fontsize']],
|
||||
['font', ['bold']],
|
||||
['color', ['color']],
|
||||
['insert', ['video']], // iframe tag will be sanitized TODO if iframe[class=note-video-clip] can be added into safe list, insert video can be enabled
|
||||
//['fontsize', ['fontsize']],
|
||||
]
|
||||
: [
|
||||
['style', ['style']],
|
||||
@@ -345,11 +352,12 @@ Blaze.Template.registerHelper(
|
||||
}
|
||||
return member;
|
||||
});
|
||||
const mentionRegex = /\B@([\w.]*)/gi;
|
||||
const mentionRegex = /\B@(?:(?:"([\w.\s]*)")|([\w.]+))/gi; // including space in username
|
||||
|
||||
let currentMention;
|
||||
while ((currentMention = mentionRegex.exec(content)) !== null) {
|
||||
const [fullMention, username] = currentMention;
|
||||
const [fullMention, quoteduser, simple] = currentMention;
|
||||
const username = quoteduser || simple;
|
||||
const knowedUser = _.findWhere(knowedUsers, { username });
|
||||
if (!knowedUser) {
|
||||
continue;
|
||||
|
||||
@@ -21,7 +21,15 @@ DatePicker = BlazeComponent.extendComponent({
|
||||
function(evt) {
|
||||
this.find('#date').value = moment(evt.date).format('L');
|
||||
this.error.set('');
|
||||
this.find('#time').focus();
|
||||
const timeInput = this.find('#time');
|
||||
timeInput.focus();
|
||||
if (!timeInput.value) {
|
||||
const currentHour = evt.date.getHours();
|
||||
const defaultMoment = moment(
|
||||
currentHour > 0 ? evt.date : '1970-01-01 08:00:00',
|
||||
); // default to 8:00 am local time
|
||||
timeInput.value = defaultMoment.format('LT');
|
||||
}
|
||||
}.bind(this),
|
||||
);
|
||||
|
||||
|
||||
+2
-2
@@ -271,8 +271,8 @@ services:
|
||||
# dueat startat endat receivedat, also notification to
|
||||
# the watchers and if any card is due, about due or past due.
|
||||
#
|
||||
# Notify due days, default 2 days before and after. 0 = due notifications disabled. Default: 2
|
||||
#- NOTIFY_DUE_DAYS_BEFORE_AND_AFTER=2
|
||||
# Notify due days, default is None, 2 days before and on the event day
|
||||
#- NOTIFY_DUE_DAYS_BEFORE_AND_AFTER=2,0
|
||||
#
|
||||
# Notify due at hour of day. Default every morning at 8am. Can be 0-23.
|
||||
# If env variable has parsing error, use default. Notification sent to watchers.
|
||||
|
||||
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+3
-2
@@ -731,11 +731,12 @@
|
||||
"almostdue": "current due time %s is approaching",
|
||||
"pastdue": "current due time %s is past",
|
||||
"duenow": "current due time %s is today",
|
||||
"act-withDue": "__card__ due reminders [__board__]",
|
||||
"act-newDue": "__list__/__card__ has 1st due reminder [__board__]",
|
||||
"act-withDue": "__list__/__card__ due reminders [__board__]",
|
||||
"act-almostdue": "was reminding the current due (__timeValue__) of __card__ is approaching",
|
||||
"act-pastdue": "was reminding the current due (__timeValue__) of __card__ is past",
|
||||
"act-duenow": "was reminding the current due (__timeValue__) of __card__ is now",
|
||||
"act-atUserComment": "You were mentioned in [__board__] __card__",
|
||||
"act-atUserComment": "You were mentioned in [__board__] __list__/__card__",
|
||||
"delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
|
||||
"accounts-allowUserDelete": "Allow users to self delete their account",
|
||||
"hide-minicard-label-text": "Hide minicard label text",
|
||||
|
||||
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+3
-2
@@ -728,11 +728,12 @@
|
||||
"almostdue": "La date d'échéance %s approche",
|
||||
"pastdue": "La date d'échéance %s est passée",
|
||||
"duenow": "La date d'échéance %s est aujourd'hui",
|
||||
"act-withDue": "__card__ rappel d'échéance [__board__]",
|
||||
"act-newDue": "__list__/__card__ a un 1er rappel d'échéance [__board__]",
|
||||
"act-withDue": "__list__/__card__ rappel d'échéance [__board__]",
|
||||
"act-almostdue": "rappelle que l'échéance (__timeValue__) de __card__ approche",
|
||||
"act-pastdue": "rappelle que l'échéance (__timeValue__) de __card__ est passée",
|
||||
"act-duenow": "rappelle que l'échéance (__timeValue__) de __card__ est maintenant",
|
||||
"act-atUserComment": "Vous avez été mentionné dans [__board__] __card__",
|
||||
"act-atUserComment": "Vous avez été mentionné dans [__board__] __list__/__card__",
|
||||
"delete-user-confirm-popup": "Êtes-vous sûr de vouloir supprimer ce compte ? Cette opération ne peut pas être annulée. ",
|
||||
"accounts-allowUserDelete": "Autoriser les utilisateurs à supprimer leur compte",
|
||||
"hide-minicard-label-text": "Cacher le label de la minicarte",
|
||||
|
||||
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+731
-730
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+740
-739
File diff suppressed because it is too large.
Load diff
+29
-22
@@ -180,28 +180,34 @@ if (Meteor.isServer) {
|
||||
const comment = activity.comment();
|
||||
params.comment = comment.text;
|
||||
if (board) {
|
||||
const atUser = /(?:^|>|\b|\s)@(\S+?)(?:\s|$|<|\b)/g;
|
||||
const comment = params.comment;
|
||||
if (comment.match(atUser)) {
|
||||
const commenter = params.user;
|
||||
while (atUser.exec(comment)) {
|
||||
const username = RegExp.$1;
|
||||
if (commenter === username) {
|
||||
// it's person at himself, ignore it?
|
||||
continue;
|
||||
}
|
||||
const atUser =
|
||||
Users.findOne(username) || Users.findOne({ username });
|
||||
if (atUser && atUser._id) {
|
||||
const uid = atUser._id;
|
||||
params.atUsername = username;
|
||||
params.atEmails = atUser.emails;
|
||||
if (board.hasMember(uid)) {
|
||||
title = 'act-atUserComment';
|
||||
watchers = _.union(watchers, [uid]);
|
||||
}
|
||||
}
|
||||
const knownUsers = board.members.map(member => {
|
||||
const u = Users.findOne(member.userId);
|
||||
if (u) {
|
||||
member.username = u.username;
|
||||
member.emails = u.emails;
|
||||
}
|
||||
return member;
|
||||
});
|
||||
const mentionRegex = /\B@(?:(?:"([\w.\s]*)")|([\w.]+))/gi; // including space in username
|
||||
let currentMention;
|
||||
while ((currentMention = mentionRegex.exec(comment)) !== null) {
|
||||
/*eslint no-unused-vars: ["error", { "varsIgnorePattern": "[iI]gnored" }]*/
|
||||
const [ignored, quoteduser, simple] = currentMention;
|
||||
const username = quoteduser || simple;
|
||||
if (username === params.user) {
|
||||
// ignore commenter mention himself?
|
||||
continue;
|
||||
}
|
||||
const atUser = _.findWhere(knownUsers, { username });
|
||||
if (!atUser) {
|
||||
continue;
|
||||
}
|
||||
const uid = atUser.userId;
|
||||
params.atUsername = username;
|
||||
params.atEmails = atUser.emails;
|
||||
title = 'act-atUserComment';
|
||||
watchers = _.union(watchers, [uid]);
|
||||
}
|
||||
}
|
||||
params.commentId = comment._id;
|
||||
@@ -236,8 +242,8 @@ if (Meteor.isServer) {
|
||||
(!activity.timeKey || activity.timeKey === 'dueAt') &&
|
||||
activity.timeValue
|
||||
) {
|
||||
// due time reminder
|
||||
title = 'act-withDue';
|
||||
// due time reminder, if it doesn't have old value, it's a brand new set, need some differentiation
|
||||
title = activity.timeOldValue ? 'act-withDue' : 'act-newDue';
|
||||
}
|
||||
['timeValue', 'timeOldValue'].forEach(key => {
|
||||
// copy time related keys & values to params
|
||||
@@ -283,6 +289,7 @@ if (Meteor.isServer) {
|
||||
activities: { $in: [description, 'all'] },
|
||||
}).fetch();
|
||||
if (integrations.length > 0) {
|
||||
params.watchers = watchers;
|
||||
integrations.forEach(integration => {
|
||||
Meteor.call(
|
||||
'outgoingWebhooks',
|
||||
|
||||
@@ -699,6 +699,13 @@ Boards.helpers({
|
||||
return result;
|
||||
},
|
||||
|
||||
cardsDueInBetween(start, end) {
|
||||
return Cards.find({
|
||||
boardId: this._id,
|
||||
dueAt: { $gte: start, $lte: end },
|
||||
});
|
||||
},
|
||||
|
||||
cardsInInterval(start, end) {
|
||||
return Cards.find({
|
||||
boardId: this._id,
|
||||
|
||||
+28
-7
@@ -1558,6 +1558,7 @@ function cardRemover(userId, doc) {
|
||||
const findDueCards = days => {
|
||||
const seekDue = ($from, $to, activityType) => {
|
||||
Cards.find({
|
||||
archived: false,
|
||||
dueAt: { $gte: $from, $lt: $to },
|
||||
}).forEach(card => {
|
||||
const username = Users.findOne(card.userId).username;
|
||||
@@ -1578,18 +1579,38 @@ const findDueCards = days => {
|
||||
const now = new Date(),
|
||||
aday = 3600 * 24 * 1e3,
|
||||
then = day => new Date(now.setHours(0, 0, 0, 0) + day * aday);
|
||||
seekDue(then(1), then(days), 'almostdue');
|
||||
seekDue(then(0), then(1), 'duenow');
|
||||
seekDue(then(-days), now, 'pastdue');
|
||||
if (!days) return;
|
||||
if (!days.map) days = [days];
|
||||
days.map(day => {
|
||||
let args = [];
|
||||
if (day === 0) {
|
||||
args = [then(0), then(1), 'duenow'];
|
||||
} else if (day > 0) {
|
||||
args = [then(1), then(day), 'almostdue'];
|
||||
} else {
|
||||
args = [then(day), now, 'pastdue'];
|
||||
}
|
||||
seekDue(...args);
|
||||
});
|
||||
};
|
||||
const addCronJob = _.debounce(
|
||||
Meteor.bindEnvironment(function findDueCardsDebounced() {
|
||||
const notifydays =
|
||||
parseInt(process.env.NOTIFY_DUE_DAYS_BEFORE_AND_AFTER, 10) || 2; // default as 2 days before and after
|
||||
if (!(notifydays > 0 && notifydays < 15)) {
|
||||
// notifying due is disabled
|
||||
const envValue = process.env.NOTIFY_DUE_DAYS_BEFORE_AND_AFTER;
|
||||
if (!envValue) {
|
||||
return;
|
||||
}
|
||||
const notifydays = envValue
|
||||
.split(',')
|
||||
.map(value => {
|
||||
const iValue = parseInt(value, 10);
|
||||
if (!(iValue > 0 && iValue < 15)) {
|
||||
// notifying due is disabled
|
||||
return false;
|
||||
} else {
|
||||
return iValue;
|
||||
}
|
||||
})
|
||||
.filter(Boolean);
|
||||
const notifyitvl = process.env.NOTIFY_DUE_AT_HOUR_OF_DAY; //passed in the itvl has to be a number standing for the hour of current time
|
||||
const defaultitvl = 8; // default every morning at 8am, if the passed env variable has parsing error use default
|
||||
const itvl = parseInt(notifyitvl, 10) || defaultitvl;
|
||||
|
||||
+11
-2
@@ -276,6 +276,7 @@ if (Meteor.isServer) {
|
||||
* @param {string} boardId the board ID
|
||||
* @param {string} cardId the card ID
|
||||
* @param {string} title the title of the new checklist
|
||||
* @param {string} [items] the list of items on the new checklist
|
||||
* @return_type {_id: string}
|
||||
*/
|
||||
JsonRoutes.add(
|
||||
@@ -291,11 +292,19 @@ if (Meteor.isServer) {
|
||||
sort: 0,
|
||||
});
|
||||
if (id) {
|
||||
req.body.items.forEach(function(item, idx) {
|
||||
let items = req.body.items || [];
|
||||
if (_.isString(items)) {
|
||||
if (items === '') {
|
||||
items = [];
|
||||
} else {
|
||||
items = [items];
|
||||
}
|
||||
}
|
||||
items.forEach(function(item, idx) {
|
||||
ChecklistItems.insert({
|
||||
cardId: paramCardId,
|
||||
checklistId: id,
|
||||
title: item.title,
|
||||
title: item,
|
||||
sort: idx,
|
||||
});
|
||||
});
|
||||
|
||||
@@ -541,6 +541,7 @@ Users.mutations({
|
||||
Meteor.methods({
|
||||
setUsername(username, userId) {
|
||||
check(username, String);
|
||||
check(userId, String);
|
||||
const nUsersWithUsername = Users.find({ username }).count();
|
||||
if (nUsersWithUsername > 0) {
|
||||
throw new Meteor.Error('username-already-taken');
|
||||
|
||||
Generated
+4
-4
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v3.44.0",
|
||||
"version": "v3.46.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@@ -25,9 +25,9 @@
|
||||
}
|
||||
},
|
||||
"@babel/runtime": {
|
||||
"version": "7.5.5",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz",
|
||||
"integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==",
|
||||
"version": "7.6.2",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.2.tgz",
|
||||
"integrity": "sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg==",
|
||||
"requires": {
|
||||
"regenerator-runtime": "^0.13.2"
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v3.44.0",
|
||||
"version": "v3.46.0",
|
||||
"description": "Open-Source kanban",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
@@ -53,7 +53,7 @@
|
||||
"prettier-eslint": "^8.8.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.5.5",
|
||||
"@babel/runtime": "^7.6.2",
|
||||
"ajv": "^5.0.0",
|
||||
"babel-runtime": "^6.26.0",
|
||||
"bcrypt": "^3.0.2",
|
||||
|
||||
+12
-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.44">Wekan REST API v3.44</a>
|
||||
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v3.46">Wekan REST API v3.46</a>
|
||||
|
||||
</li>
|
||||
|
||||
@@ -2017,7 +2017,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.44</h1>
|
||||
<h1 id="wekan-rest-api">Wekan REST API v3.46</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>
|
||||
@@ -4479,7 +4479,8 @@ $.ajax({
|
||||
</code></pre>
|
||||
<pre class="highlight tab tab-javascript--nodejs"><code><span class="hljs-keyword">const</span> fetch = <span class="hljs-built_in">require</span>(<span class="hljs-string">'node-fetch'</span>);
|
||||
<span class="hljs-keyword">const</span> inputBody = <span class="hljs-string">'{
|
||||
"title": "string"
|
||||
"title": "string",
|
||||
"items": "string"
|
||||
}'</span>;
|
||||
<span class="hljs-keyword">const</span> headers = {
|
||||
<span class="hljs-string">'Content-Type'</span>:<span class="hljs-string">'multipart/form-data'</span>,
|
||||
@@ -4573,6 +4574,7 @@ System.out.println(response.toString());
|
||||
<p>Body parameter</p>
|
||||
</blockquote>
|
||||
<pre class="highlight tab tab-yaml"><code><span class="hljs-attr">title:</span> <span class="hljs-string">string</span>
|
||||
<span class="hljs-attr">items:</span> <span class="hljs-string">string</span>
|
||||
|
||||
</code></pre>
|
||||
<h3 id="post_board_card_checklists-parameters">Parameters</h3>
|
||||
@@ -4615,6 +4617,13 @@ System.out.println(response.toString());
|
||||
<td>true</td>
|
||||
<td>the title value</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>» items</td>
|
||||
<td>body</td>
|
||||
<td>string</td>
|
||||
<td>true</td>
|
||||
<td>the items value</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="post_board_card_checklists-responses">Responses</h3>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
swagger: '2.0'
|
||||
info:
|
||||
title: Wekan REST API
|
||||
version: v3.44
|
||||
version: v3.46
|
||||
description: |
|
||||
The REST API allows you to control and extend Wekan with ease.
|
||||
|
||||
@@ -319,6 +319,11 @@ paths:
|
||||
description: the title value
|
||||
type: string
|
||||
required: true
|
||||
- name: items
|
||||
in: formData
|
||||
description: the items value
|
||||
type: string
|
||||
required: true
|
||||
- name: board
|
||||
in: path
|
||||
description: the board value
|
||||
|
||||
@@ -70,8 +70,9 @@
|
||||
# dueat startat endat receivedat, also notification to
|
||||
# the watchers and if any card is due, about due or past due.
|
||||
#
|
||||
# Notify due days, default 2 days before and after. 0 = due notifications disabled. Default: 2
|
||||
#export NOTIFY_DUE_DAYS_BEFORE_AND_AFTER=2
|
||||
# Notify due days, default is None.
|
||||
#export NOTIFY_DUE_DAYS_BEFORE_AND_AFTER=2,0
|
||||
# it will notify user 2 days before due day and on the due day
|
||||
#
|
||||
# Notify due at hour of day. Default every morning at 8am. Can be 0-23.
|
||||
# If env variable has parsing error, use default. Notification sent to watchers.
|
||||
|
||||
@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
|
||||
appTitle = (defaultText = "Wekan"),
|
||||
# The name of the app as it is displayed to the user.
|
||||
|
||||
appVersion = 346,
|
||||
appVersion = 348,
|
||||
# Increment this for every release.
|
||||
|
||||
appMarketingVersion = (defaultText = "3.44.0~2019-09-17"),
|
||||
appMarketingVersion = (defaultText = "3.46.0~2019-10-07"),
|
||||
# Human-readable presentation of the app version.
|
||||
|
||||
minUpgradableAppVersion = 0,
|
||||
|
||||
@@ -13,11 +13,14 @@ Meteor.startup(() => {
|
||||
const lan = user.getLanguage();
|
||||
const subject = TAPi18n.__(title, params, lan); // the original function has a fault, i believe the title should be used according to original author
|
||||
const existing = user.getEmailBuffer().length > 0;
|
||||
const text = `${existing ? `<br/>\n${subject}<br/>\n` : ''}${
|
||||
const htmlEnabled =
|
||||
Meteor.settings.public &&
|
||||
Meteor.settings.public.RICHER_CARD_COMMENT_EDITOR !== false;
|
||||
const text = `${existing ? `\n${subject}\n` : ''}${
|
||||
params.user
|
||||
} ${TAPi18n.__(description, quoteParams, lan)}<br/>\n${params.url}`;
|
||||
} ${TAPi18n.__(description, quoteParams, lan)}\n${params.url}`;
|
||||
|
||||
user.addEmailBuffer(text);
|
||||
user.addEmailBuffer(htmlEnabled ? text.replace(/\n/g, '<br/>') : text);
|
||||
|
||||
// unlike setTimeout(func, delay, args),
|
||||
// Meteor.setTimeout(func, delay) does not accept args :-(
|
||||
|
||||
+1
-1
@@ -108,7 +108,7 @@ DESCRIPTION_BIGEVENTS_PATTERN="Big events pattern: Notify always due etc regardl
|
||||
DEFAULT_BIGEVENTS_PATTERN="NONE"
|
||||
KEY_BIGEVENTS_PATTERN="bigevents-pattern"
|
||||
|
||||
DESCRIPTION_NOTIFY_DUE_DAYS_BEFORE_AND_AFTER="Notify due days, default 2 days before and after. 0 = due notifications disabled. Default: 2"
|
||||
DESCRIPTION_NOTIFY_DUE_DAYS_BEFORE_AND_AFTER="Notify due days, accepts ',' delimited string, i.e. 2,0 means notify will be sent out 2 days before and right on due day. Default: empty"
|
||||
DEFAULT_NOTIFY_DUE_DAYS_BEFORE_AND_AFTER=""
|
||||
KEY_NOTIFY_DUE_DAYS_BEFORE_AND_AFTER="notify-due-days-before-and-after"
|
||||
|
||||
|
||||
@@ -104,13 +104,10 @@ echo -e "\t$ snap set $SNAP_NAME bigevents-pattern='NONE'"
|
||||
echo -e "\n"
|
||||
echo -e "EMAIL DUE DATE NOTIFICATION https://github.com/wekan/wekan/pull/2536"
|
||||
echo -e "System timelines will be showing any user modification for dueat startat endat receivedat, also notification to the watchers and if any card is due, about due or past due."
|
||||
echo -e "Notify due days, default 2 days before and after. 0 = due notifications disabled. Default: 2"
|
||||
echo -e "To enable different Notify Due Days Before And After than default 2:"
|
||||
echo -e "\t$ snap set $SNAP_NAME notify-due-days-before-and-after='4'"
|
||||
echo -e "Notify due days, number less than 15 or negative number accepted, you can specify multiple days delimited by ','. Default: NONE"
|
||||
echo -e "To enable different Notify for Due Days on 2 days before, and on the event day "
|
||||
echo -e "\t$ snap set $SNAP_NAME notify-due-days-before-and-after='2,0'"
|
||||
echo -e "\t-Disable Notifying for Due Days:"
|
||||
echo -e "\t$ snap set $SNAP_NAME notify-due-days-before-and-after='0'"
|
||||
echo -e "\n"
|
||||
echo -e "\t-To set back to default 2:"
|
||||
echo -e "\t$ snap set $SNAP_NAME notify-due-days-before-and-after=''"
|
||||
echo -e "\n"
|
||||
echo -e "Notify due at hour of day. Default every morning at 8am. Can be 0-23."
|
||||
|
||||
+2
-2
@@ -64,8 +64,8 @@ REM # https://github.com/wekan/wekan/pull/2536
|
||||
REM # System timelines will be showing any user modification for
|
||||
REM # dueat startat endat receivedat, also notification to
|
||||
REM # the watchers and if any card is due, about due or past due.
|
||||
REM # Notify due days, default 2 days before and after. 0 = due notifications disabled. Default: 2
|
||||
REM SET NOTIFY_DUE_DAYS_BEFORE_AND_AFTER=2
|
||||
REM # Notify due days, default is None.
|
||||
REM # SET NOTIFY_DUE_DAYS_BEFORE_AND_AFTER=2,0
|
||||
REM # Notify due at hour of day. Default every morning at 8am. Can be 0-23.
|
||||
REM # If env variable has parsing error, use default. Notification sent to watchers.
|
||||
REM SET NOTIFY_DUE_AT_HOUR_OF_DAY=8
|
||||
|
||||
+3
-2
@@ -71,8 +71,9 @@
|
||||
# dueat startat endat receivedat, also notification to
|
||||
# the watchers and if any card is due, about due or past due.
|
||||
#
|
||||
# Notify due days, default 2 days before and after. 0 = due notifications disabled. Default: 2
|
||||
#export NOTIFY_DUE_DAYS_BEFORE_AND_AFTER=2
|
||||
# Notify due days, default is None.
|
||||
#export NOTIFY_DUE_DAYS_BEFORE_AND_AFTER=2,0
|
||||
# it will notify user 2 days before due day and on the due day
|
||||
#
|
||||
# Notify due at hour of day. Default every morning at 8am. Can be 0-23.
|
||||
# If env variable has parsing error, use default. Notification sent to watchers.
|
||||
|
||||
Reference in new issue
Block a user