Compare commits

..
52 Commits
Author SHA1 Message Date
Lauri Ojansivu 417fed8605 v3.47 2019-10-09 14:15:12 +03:00
Lauri Ojansivu 4eca27498c Update translations. 2019-10-09 14:01:39 +03:00
Lauri Ojansivu d962ecd77f Update ChangeLog. 2019-10-09 14:00:05 +03:00
Lauri Ojansivu 6feb35c079 Merge pull request #2751 from liske/fixes/rest-card-members
REST API: fix handling of members property on card creation
2019-10-09 13:56:11 +03:00
Thomas Liske ea90ce8784 REST API: fix handling of members property on card creation 2019-10-09 07:23:21 +02:00
Lauri Ojansivu 4a42d683af v3.46 2019-10-07 00:39:52 +03:00
Lauri Ojansivu 8faa48fe12 Update translations. 2019-10-07 00:30:08 +03:00
Lauri Ojansivu 67c4fae32b Update ChangeLog. 2019-10-07 00:28:00 +03:00
Lauri Ojansivu 42d31901b5 Merge pull request #2747 from liske/fixes/rest-create-checklist-2746
REST API: fix creation of Checklists (closes wekan/wekan#2746)
2019-10-07 00:22:49 +03:00
Thomas Liske 72b22a73b6 REST API: fix creation of Checklists (closes wekan/wekan#2746) 2019-10-06 22:53:43 +02:00
Lauri Ojansivu 4d30503cb5 Update translations. 2019-10-05 12:58:46 +03:00
Lauri Ojansivu 7b45a0fbfe Update ChangeLog. 2019-10-05 12:57:17 +03:00
Lauri Ojansivu 42dee10dbe Merge branch 'master' of github.com:wekan/wekan 2019-10-05 12:55:05 +03:00
Lauri Ojansivu 68be12d166 More black minicard badges.
Thanks to sfahrenholz and xet7 !

Closes #2745
2019-10-05 12:54:16 +03:00
Lauri Ojansivu fd896c29b5 More black minicard badges.
Thanks to sfahrenholz and xet7 !
2019-10-05 12:52:57 +03:00
Lauri Ojansivu 98a4be643e Update translation. 2019-10-04 23:01:57 +03:00
Lauri Ojansivu b650a89728 v3.45 2019-10-03 07:51:50 +03:00
Lauri Ojansivu 346dba4969 Update translations. 2019-10-03 07:46:50 +03:00
Lauri Ojansivu f3b858ca21 Revert drag handle changes. 2019-10-03 06:03:11 +03:00
Lauri Ojansivu 5bc355f9a5 Drag handles. In progress. 2019-10-03 04:23:33 +03:00
Lauri Ojansivu 21fa26a1be Update ChangeLog. 2019-10-01 21:09:27 +03:00
Lauri Ojansivu 66372271c2 Merge pull request #2740 from whowillcare/master
#2738 adding all pertinent help file for due days, plus modified the …
2019-10-01 18:41:01 +03:00
Sam X. Chen e60926f847 #2738 adding all pertinent help file for due days, plus modified the .list-header-name when in mobile mode 2019-10-01 10:39:36 -04:00
Lauri Ojansivu b04df1d54d Update translations. 2019-10-01 16:18:38 +03:00
Lauri Ojansivu 83f81f4586 Fix prettier. 2019-10-01 01:05:02 +03:00
Lauri Ojansivu 4785086e2f Fix lint. 2019-10-01 00:58:12 +03:00
Lauri Ojansivu 98c38fe58f Drag handles continue. In progress.
Thanks to xet7 !
2019-10-01 00:48:36 +03:00
Lauri Ojansivu 44378fe9d1 Update translations. 2019-09-30 21:31:49 +03:00
Lauri Ojansivu afcca947e3 Update translations. 2019-09-30 15:03:15 +03:00
Lauri Ojansivu 20526756db Update translations. 2019-09-28 15:15:23 +03:00
Lauri Ojansivu 58724f93c9 Update ChangeLog. 2019-09-28 15:05:53 +03:00
Lauri Ojansivu 5d6c68a9cf Merge branch 'master' of github.com:wekan/wekan 2019-09-28 14:56:51 +03:00
Lauri Ojansivu ed4c49090a Merge pull request #2738 from whowillcare/master
Add feature: Add due timeline into Calendar view
2019-09-28 14:57:00 +03:00
Lauri Ojansivu 75dc5f226c Merge branch 'feature-drag-handle' 2019-09-28 14:55:09 +03:00
Sam X. Chen 020b663836 Feature enhancement: Allow wekan master have more flexiblity on setting up due reminder 2019-09-26 12:24:40 -04:00
Sam X. Chen e5f0dd7dd8 Add feature: Add due timeline into Calendar view 2019-09-26 12:20:14 -04:00
Sam X. Chen 4f34adbd44 Merge remote-tracking branch 'upstream/master' 2019-09-26 10:53:58 -04:00
Sam X. Chen 62b72a03c4 Add feature: Add due timeline into Calendar view 2019-09-26 10:53:40 -04:00
Lauri Ojansivu 5696e4a4c6 Update translations. 2019-09-25 21:37:25 +03:00
Lauri Ojansivu 814e264521 Merge pull request #2720 from whowillcare/master
if username contains space, @ functions will fail at certain point
2019-09-25 20:51:51 +03:00
Lauri Ojansivu 872ed4b2f9 Drag handles continue. In progress. 2019-09-25 20:49:19 +03:00
Lauri Ojansivu 1d8633e7e6 Update translations. 2019-09-25 20:46:35 +03:00
Lauri Ojansivu b3637f2781 Merge branch 'master' of github.com:wekan/wekan 2019-09-25 20:44:46 +03:00
Lauri Ojansivu 68d3cdae58 Merge pull request #2734 from jernejh/patch-1
Update sl.i18n.json
2019-09-25 20:44:53 +03:00
jernejh 620a362244 Update sl.i18n.json 2019-09-25 19:08:18 +02:00
Sam X. Chen d5cff1ec48 Add feature: differentiating new due time and modified due time 2019-09-25 11:48:20 -04:00
Sam X. Chen 8d7714760c BUG FIX: archived cards still sent out notification 2019-09-25 11:26:46 -04:00
Sam X. Chen a37723f8a4 Fixing method in users.js didn't have check userId 2019-09-21 15:32:21 -04:00
Sam X. Chen e3a727edec Merge remote-tracking branch 'upstream/master' 2019-09-19 15:17:01 -04:00
Sam X. Chen 4ee88e026e Buxfixed: if username contains space, it will cause @ commment failed to send out email and other 2019-09-19 15:16:48 -04:00
Lauri Ojansivu 55a2473d81 Merge branch 'feature-drag-handle' 2019-09-19 01:12:04 +03:00
Lauri Ojansivu 03d7fc02ec Drag handles. In Progress. 2019-09-17 01:39:10 +03:00
76 changed files with 35029 additions and 34833 deletions

No files matched your search

+39
View File
@@ -1,3 +1,42 @@
# v3.47 2019-10-09 Wekan release
This release fixes the following bugs:
- [REST API: fix handling of members property on card creation](https://github.com/wekan/wekan/pull/2751).
Thanks to above GitHub users for their contributions and translators for their translations.
# 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
View File
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
appVersion: "v3.44.0"
appVersion: "v3.47.0"
files:
userUploads:
- README.md
+36 -16
View File
@@ -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) {
+3 -2
View File
@@ -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
+1 -1
View File
@@ -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',
});
+13 -5
View File
@@ -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;
+9 -1
View File
@@ -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
View File
@@ -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
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+3 -2
View File
@@ -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
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+3 -2
View File
@@ -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
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+11 -10
View File
@@ -352,7 +352,7 @@
"language": "Taal",
"last-admin-desc": "Je kunt de permissies niet veranderen omdat er minimaal een administrator moet zijn.",
"leave-board": "Verlaat bord",
"leave-board-pop": "Weet u zeker dat u __boardTitle__ wilt verlaten? U wordt verwijderd van alle kaarten binnen dit bord",
"leave-board-pop": "Weet je zeker dat je __boardTitle__ wilt verlaten? Je wordt verwijderd van alle kaarten binnen dit bord",
"leaveBoardPopup-title": "Bord verlaten?",
"link-card": "Link naar deze kaart",
"list-archive-cards": "Verplaats alle kaarten in deze lijst naar Archief",
@@ -472,7 +472,7 @@
"warn-list-archived": "Let op: deze kaart zit in gearchiveerde lijst",
"watch": "Bekijk",
"watching": "Bekijken",
"watching-info": "Je zal op de hoogte worden gesteld als er een verandering gebeurt op dit bord.",
"watching-info": "Je zal op de hoogte worden gesteld als er een verandering plaatsvind op dit bord.",
"welcome-board": "Welkom Bord",
"welcome-swimlane": "Mijlpaal 1",
"welcome-list1": "Basis",
@@ -502,12 +502,12 @@
"smtp-password": "Wachtwoord",
"smtp-tls": "TLS ondersteuning",
"send-from": "Van",
"send-smtp-test": "Verzend een test email naar uzelf",
"send-smtp-test": "Verzend een test email naar jezelf",
"invitation-code": "Uitnodigings code",
"email-invite-register-subject": "__inviter__ heeft je een uitnodiging gestuurd",
"email-invite-register-text": "Beste __user__,\n\n__inviter__ nodigt je uit voor een Kanban-bord om samen te werken.\n\nHet bord vind je via onderstaande link:\n__url__\n\nJe uitnodigingscode is: __icode__\n\nBedankt en tot ziens.",
"email-smtp-test-subject": "SMTP Test Email",
"email-smtp-test-text": "U heeft met succes een email verzonden",
"email-smtp-test-text": "Je hebt met succes een email verzonden",
"error-invitation-code-not-exist": "Uitnodigings code bestaat niet",
"error-notAuthorized": "Je bent niet toegestaan om deze pagina te bekijken.",
"webhook-title": "Webhook Naam",
@@ -728,13 +728,14 @@
"almostdue": "huidige vervaldatum %s nadert",
"pastdue": "huidige vervaldatum %s is verlopen",
"duenow": "huidige vervaldatum %s is vandaag",
"act-withDue": "__card__ verval herinneringen [__board__]",
"act-almostdue": "was aan het herinneren aan dat de huidige vervaldatum (__timeValue__) van __card__ nadert",
"act-pastdue": "was aan het herinneren aan dat de huidige vervaldatum (__timeValue__) van __card__ is verlopen",
"act-duenow": "was aan het herinneren aan dat de huidige vervaldatum (__timeValue__) van __card__ is nu",
"act-atUserComment": "Je bent genoemd op [__board__] op __card__",
"act-newDue": "__list__/__card__ heeft eerste vervaldatum herinnering [__board__]",
"act-withDue": "__list__/__card__ vervaldatum herinneringen [__board__]",
"act-almostdue": "wil je herinneren aan het naderen van de huidige vervaldatum (__timeValue__) van __card__ ",
"act-pastdue": "wil je herinneren aan het verlopen van de huidige vervaldatum (__timeValue__) van __card__ ",
"act-duenow": "wil je herinneren aan het vandaag verlopen van de huidige vervaldatum (__timeValue__) van __card__ ",
"act-atUserComment": "Je werd genoemd in [__board__] __list__/__card__",
"delete-user-confirm-popup": "Weet je zeker dat je dit account wilt verwijderen? Er is geen herstelmogelijkheid.",
"accounts-allowUserDelete": "Sta gebruikers toe om hun eigen account te verwijderen",
"hide-minicard-label-text": "Verberg minikaart labeltekst",
"show-desktop-drag-handles": "Show desktop drag handles"
"show-desktop-drag-handles": "Toon sleep gereedschap op werkblad"
}
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+731 -730
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+6 -5
View File
@@ -728,13 +728,14 @@
"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__",
"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",
"act-atUserComment": "You were mentioned in [__board__] __list__/__card__",
"delete-user-confirm-popup": "Bu kullanıcı hesabını silmek istediğinize emin misiniz? Bu işlemi geri alamazsınız.",
"accounts-allowUserDelete": "Kullanıcılara hesaplarını silmek için izin ver.",
"hide-minicard-label-text": "Mini kart etiklerini gizle",
"show-desktop-drag-handles": "Show desktop drag handles"
}
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+3 -2
View File
@@ -728,11 +728,12 @@
"almostdue": "当前到期时间%s即将到来",
"pastdue": "当前到期时间%s已过",
"duenow": "当前到期时间%s为今天",
"act-withDue": "__card__ 到期提醒[__board__]",
"act-newDue": "__list__/__card__ 有 1st 到期提醒 [__board__]",
"act-withDue": "__list__/__card__ 到期提醒 [__board__]",
"act-almostdue": "__card__ 的当前到期提醒(__timeValue__) 正在接近",
"act-pastdue": "__card__ 的当前到期提醒(__timeValue__) 已经过去了",
"act-duenow": "__card__ 的当前到期提醒(__timeValue__) 现在到期",
"act-atUserComment": "您在 [__board__] __card__中被提到",
"act-atUserComment": "[__board__] __list__/__card__ 提到了您",
"delete-user-confirm-popup": "确实要删除此帐户吗?此操作无法撤销。",
"accounts-allowUserDelete": "允许用户自行删除其帐户",
"hide-minicard-label-text": "隐藏迷你卡片标签文本",
+740 -739
View File
File diff suppressed because it is too large. Load diff
+740 -739
View File
File diff suppressed because it is too large. Load diff
+29 -22
View File
@@ -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',
+7
View File
@@ -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,
+36 -8
View File
@@ -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;
@@ -1831,8 +1852,15 @@ if (Meteor.isServer) {
const check = Users.findOne({
_id: req.body.authorId,
});
const members = req.body.members || [req.body.authorId];
if (typeof check !== 'undefined') {
let members = req.body.members || [];
if (_.isString(members)) {
if (members === '') {
members = [];
} else {
members = [members];
}
}
const id = Cards.direct.insert({
title: req.body.title,
boardId: paramBoardId,
+11 -2
View File
@@ -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,
});
});
+1
View File
@@ -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');
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v3.44.0",
"version": "v3.47.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
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v3.44.0",
"version": "v3.47.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
View File
@@ -1524,7 +1524,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
<ul class="toc-list-h1">
<li>
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v3.44">Wekan REST API v3.44</a>
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v3.47">Wekan REST API v3.47</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.47</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>
+6 -1
View File
@@ -1,7 +1,7 @@
swagger: '2.0'
info:
title: Wekan REST API
version: v3.44
version: v3.47
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
+3 -2
View File
@@ -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.
+2 -2
View File
@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
appTitle = (defaultText = "Wekan"),
# The name of the app as it is displayed to the user.
appVersion = 346,
appVersion = 349,
# Increment this for every release.
appMarketingVersion = (defaultText = "3.44.0~2019-09-17"),
appMarketingVersion = (defaultText = "3.47.0~2019-10-09"),
# Human-readable presentation of the app version.
minUpgradableAppVersion = 0,
+6 -3
View File
@@ -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
View File
@@ -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"
+3 -6
View File
@@ -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
View File
@@ -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
View File
@@ -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.