Compare commits

...
64 Commits
Author SHA1 Message Date
Lauri Ojansivu df54863e72 v5.07 2021-03-19 11:12:32 +02:00
Lauri Ojansivu 8f340326b0 Updated translations. 2021-03-19 11:08:36 +02:00
Lauri Ojansivu 42975bc8ab Updated ChangeLog. 2021-03-19 11:05:29 +02:00
Lauri Ojansivu adb5487cdc Merge pull request #3662 from ednamaeG/sort-fix
Fixed sort cards feature
2021-03-19 11:03:10 +02:00
mae 4aad9ca498 fix sort cards feature 2021-03-19 12:13:20 +08:00
Lauri Ojansivu 972d023e95 v5.06 2021-03-18 18:36:13 +02:00
Lauri Ojansivu acabef4652 Updated translations. 2021-03-18 18:15:52 +02:00
Lauri Ojansivu f77651ba05 Updated ChangeLog. 2021-03-18 17:42:17 +02:00
Lauri Ojansivu 23e349d277 Merge pull request #3661 from Majed6/copy_href
Fixed Bug: copy to clipboard uses pathname
2021-03-18 17:41:47 +02:00
Lauri Ojansivu 37d9a6659a Merge pull request #3648 from Majed6/relative-url-fixes
Fixed Bug: Calendar & parent cards URLs used absolute URLs
2021-03-18 17:37:55 +02:00
Majed6 8796c46810 Fixed Bug: copy to clipboard uses pathname 2021-03-18 16:48:53 +03:00
Lauri Ojansivu 4960891bd9 Updated translations. 2021-03-16 17:33:03 +02:00
Majed6 43482d9e48 Fixed Bug: Calendar & parent cards URLs used absolute URLs 2021-03-13 15:08:28 +03:00
Lauri Ojansivu ee323d97b4 v5.05 2021-03-11 00:05:25 +02:00
Lauri Ojansivu d6b447f70a Updated translations. 2021-03-10 23:59:12 +02:00
Lauri Ojansivu 203fafdf7c Updated translations. 2021-03-08 22:16:18 +02:00
Lauri Ojansivu 62e90723d1 Updated ChangeLog. 2021-03-08 22:13:50 +02:00
Lauri Ojansivu 77372ccce1 Merge pull request #3641 from chrisi51/master
change url scheme recognition for allowing abasurl to link
2021-03-08 22:10:49 +02:00
Christian Hillebrand fdb4980b68 change url scheme recognition for allowing abasurl to link
autolinking is not working for abasurl as it contains not url conform characters so you would still have to link it manually but it is not sanitized anymore.
2021-03-08 10:48:50 +01:00
Lauri Ojansivu ff4f5e6c04 v5.04 2021-03-07 18:06:27 +02:00
Lauri Ojansivu 0bb3b67075 Fixed generating API docs and Wekan Custom Fields REST API.
Thanks to xet7 !
2021-03-07 17:57:24 +02:00
Lauri Ojansivu e16b06b44a Updated ChangeLog. 2021-03-07 16:19:17 +02:00
Lauri Ojansivu ac9b23f00f OpenPower MiniCloud emergency maintenance has finished, so can now build Wekan for ppc64le.
Thanks to OpenPower Minicloud !
2021-03-07 16:16:12 +02:00
Lauri Ojansivu f562bdd801 Updated translations. 2021-03-07 16:06:22 +02:00
Lauri Ojansivu 0c05942b45 Updated ChangeLog. 2021-03-07 16:03:29 +02:00
Lauri Ojansivu 9db3c93116 Speed improvement: Delete presences older than one week, and add index to presences serverId.
Thanks to xet7 !

Related #3345
2021-03-07 15:58:15 +02:00
Lauri Ojansivu ce1f3365bb Updated translations. 2021-03-07 12:38:04 +02:00
Lauri Ojansivu 3ce3612047 Updated ChangeLog. 2021-03-05 21:15:31 +02:00
Lauri Ojansivu 44c9eebc4c Merge branch 'flawless-execution-feat/edit-custom-field' 2021-03-05 21:13:52 +02:00
Lauri Ojansivu cf6cc0e59d Merge branch 'feat/edit-custom-field' of https://github.com/flawless-execution/wekan into flawless-execution-feat/edit-custom-field 2021-03-05 21:13:41 +02:00
Lauri Ojansivu 2b1fc8d07f Updated ChangeLog. 2021-03-05 21:13:13 +02:00
Lauri Ojansivu e7d7ddd698 Merge pull request #3635 from Majed6/originRelativeUrl
Fixed Bug: inconsistent use of relative/absolute URLs
2021-03-05 21:11:42 +02:00
Lauri Ojansivu 1d6bfc5dd6 Updated ChangeLog. 2021-03-05 20:54:40 +02:00
Lauri Ojansivu 0ccdbdcbe9 Merge pull request #3633 from chrisi51/autolink-settings
Added autolinking settings in admin backend - tbc
2021-03-05 20:52:13 +02:00
Lauri Ojansivu 463346b867 Updated ChangeLog. 2021-03-05 20:37:16 +02:00
Lauri Ojansivu f293700db3 Merge pull request #3634 from jrsupplee/issue-3587
Fix search on labels server error
2021-03-05 19:40:24 +02:00
Majed6 b4e343369a Fixed Bug: inconsistent use of relative/absolute URLs
Some pages use relative links such as boards link at the home page.
 Others use absolute url such as cards in boards' lists.
 This commits goal is to allow for consistent use of relative
  urls.

Origin relative URLs also helps decoupling Wekan from the infrastructure
 it's deployed on. i.e if it's being served, it should work.
2021-03-05 15:05:53 +03:00
John R. Supplee da1d94775c Fix search on labels crashing bug 2021-03-04 18:35:02 +02:00
Christian Hillebrand 28582b7e77 correction of a typo 2021-03-04 17:04:29 +01:00
Christian Hillebrand 0f4a97f3a6 add automatic-linked-url-schemes 2021-03-04 16:45:16 +01:00
Christian Hillebrand 0f75234ed2 add automaticLinkedUrlSchemes 2021-03-04 16:42:35 +01:00
Christian Hillebrand bc2556139a add automaticLinkedUrlSchemes 2021-03-04 16:40:03 +01:00
Christian Hillebrand c1f52a5e5a add automaticLinkedUrlSchemes 2021-03-04 16:38:47 +01:00
Christian Hillebrand ab24b3262c add automaticLinkedUrlSchemes 2021-03-04 16:36:48 +01:00
chrisi51 42994efa9d Added real autolinking and simpler adding of new url schemes
to add additional URL Schemes just put your scheme to urlschemes
2021-03-04 16:30:06 +01:00
Lauri Ojansivu 44cf82caab Updated ChangeLog. 2021-03-03 18:19:32 +02:00
Lauri Ojansivu a44ca39eb8 Try to fix Snap: Removed fibers multi arch from Snap, because Snap build servers do not build corretly with it.
Thanks to xet7.
2021-03-03 18:16:29 +02:00
Lauri Ojansivu 3f70c395e1 v5.03 2021-03-03 16:56:02 +02:00
Lauri Ojansivu 04383c0302 Removed temporary file. 2021-03-03 16:52:15 +02:00
Lauri Ojansivu 55d022eefc Updated ChangeLog. 2021-03-03 16:44:13 +02:00
Lauri Ojansivu 7d3917adb7 Fixed Bug: Link at board title can not be edited.
Thanks to jonesrussell42, aiac, bbyszio and xet7 !

Fixes #3622
2021-03-03 16:39:34 +02:00
Lauri Ojansivu 7eeeab8486 Updated translations. 2021-03-03 15:34:37 +02:00
Lauri Ojansivu 88a46ef59a Updated ChangeLog. 2021-03-03 15:26:20 +02:00
Lauri Ojansivu e4a9dc25ec Revert Removed extra imports of Meteor. Hopefully fixes email notifications
and rules on old cars not working.

Thanks to xet7 !
2021-03-03 15:23:43 +02:00
Lauri Ojansivu dfb563a330 Add link to issue template about email settings. 2021-03-03 15:18:04 +02:00
Lauri Ojansivu 16dbb88ee3 Updated ChangeLog. 2021-03-02 18:50:18 +02:00
Lauri Ojansivu 626f435edf Hide email settings from Sandstorm Wekan Admin Panel.
Thanks to ocdtrekkie and xet7 !

Related https://github.com/wekan/wekan/commit/65b8220fe53349695a335bdb8b9692f82d4b3329
2021-03-02 18:45:02 +02:00
Louis Orleans 9cbef4ba4b 🔒 fix warning from deepcode 2021-02-20 14:11:17 -08:00
Louis Orleans 24035329b8 ✨ edit custom field dropdown item 2021-02-20 13:50:24 -08:00
Louis Orleans 457977f954 ✨ add and remove dropdown items 2021-02-20 12:46:29 -08:00
Louis Orleans 373dc5cadb ⏪ Revert "🎨 format with Prettier"
This reverts commit a35cfe660e.
2021-02-20 09:27:33 -08:00
Louis Orleans a35cfe660e 🎨 format with Prettier 2021-02-20 09:02:36 -08:00
Louis Orleans db666eec65 🐛 fix updating fields 2021-02-20 09:02:12 -08:00
Louis Orleans 586473aaa7 ✨ add custom field edit REST API 2021-02-19 11:21:13 -08:00
101 changed files with 61049 additions and 79665 deletions

No files matched your search

+3
View File
@@ -1,5 +1,8 @@
## Issue
Email settings:
- https://github.com/wekan/wekan/wiki/Troubleshooting-Mail
Add these issues to elsewhere:
- SECURITY ISSUES: https://github.com/wekan/wekan/blob/master/SECURITY.md
- UCS: https://github.com/wekan/univention/issues
+82
View File
@@ -1,3 +1,85 @@
# v5.07 2021-03-19 Wekan release
This release fixes the following bugs:
- [Fixed sort cards feature](https://github.com/wekan/wekan/pull/3662).
Thanks to ednamaeG.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.06 2021-03-18 Wekan release
This release fixes the following bugs:
- [Fixed Bug: Calendar & parent cards URLs used absolute URLs](https://github.com/wekan/wekan/pull/3648).
Thanks to Majed6.
- [Fixed Bug: copy to clipboard uses pathname](https://github.com/wekan/wekan/pull/3661).
Thanks to Majed6.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.05 2021-03-11 Wekan release
This release fixes the following bugs:
- [Change URL scheme recognition for allowing abasurl to link](https://github.com/wekan/wekan/pull/3641).
Thanks to tod31 and chrisi51.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.04 2021-03-07 Wekan release
This release adds the following speed improvements:
- [Speed improvement: Delete presences older than one week, and add database index to presences
serverId](https://github.com/wekan/wekan/commit/9db3c931161adfbeb6fc52d3e4cf621fb9a4955f).
Thanks to xet7.
and adds the following new features:
- [Added autolinking settings in Admin Panel](https://github.com/wekan/wekan/pull/3633).
Thanks to chrisi51.
- [Add custom field editing to the REST API](https://github.com/wekan/wekan/pull/3593).
Thanks to dudeofawesome.
- [Related to custom field editing, Fixed generating API docs and Wekan Custom Fields
REST API](https://github.com/wekan/wekan/commit/0bb3b670753c6ba20b0ad63f63d273036f609ee5).
Thanks to xet7.
and adds back the following platforms:
- [OpenPower Minicloud emergency maintenance has finished, so can now build Wekan for
ppc64le](https://github.com/wekan/wekan/commit/ac9b23f00f10b0170b8693e1e997bfb54f807adc).
Thanks to OpenPower Minicloud.
and fixes the following bugs:
- [Try to fix Snap: Removed fibers multi arch from Snap, because Snap build servers do not build correctly with
it](https://github.com/wekan/wekan/commit/a44ca39eb84508441f0f8bdac852745f417f12e7).
Thanks to xet7.
- [Fix search on labels server error](https://github.com/wekan/wekan/pull/3634).
Thanks to jrsupplee.
- [Fixed Bug: inconsistent use of relative/absolute URLs](https://github.com/wekan/wekan/pull/3635).
Thanks to Majed6.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.03 2021-03-03 Wekan release
This release adds the following changes:
- [Hide email settings from Sandstorm Wekan Admin Panel](https://github.com/wekan/wekan/commit/626f435edf75fac68448ba2e14c62acb749f9c9b).
Thanks to ocdtrekkie and xet7.
and fixes the following bugs:
- [Revert Removed extra imports of Meteor. Hopefully fixes email notifications and rules
on old cars not working](https://github.com/wekan/wekan/commit/e4a9dc25ecc230829afea07dbb3915b96115f7f7).
Thanks to xet7.
- [Fixed Bug: Link at board title can not be edited](https://github.com/wekan/wekan/commit/7d3917adb79be09356d32612585029392bac1e49).
Thanks to jonesrussell42, aiac, bbyszio and xet7.
Thanks to above GitHub and Wekan vanila.io community users for their contributions and translators for their translations.
# v5.02 2021-03-02 Wekan release
This release adds the following improvements:
+1 -1
View File
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
appVersion: "v5.02.0"
appVersion: "v5.07.0"
files:
userUploads:
- README.md
+3 -3
View File
@@ -82,7 +82,7 @@ template(name="activity")
+viewer
= activity.checklist.title
else
a.activity-checklist(href="{{ activity.card.absoluteUrl }}")
a.activity-checklist(href="{{ activity.card.originRelativeUrl }}")
+viewer
= activity.checklist.title
@@ -103,7 +103,7 @@ template(name="activity")
if($eq activity.activityType 'addChecklistItem')
| {{{_ 'activity-checklist-item-added' (sanitize activity.checklist.title) cardLink}}}.
.activity-checklist(href="{{ activity.card.absoluteUrl }}")
.activity-checklist(href="{{ activity.card.originRelativeUrl }}")
+viewer
= activity.checklistItem.title
@@ -139,7 +139,7 @@ template(name="activity")
//- if we are not in card mode we only display a summary of the comment
if($eq activity.activityType 'addComment')
| {{{_ 'activity-on' cardLink}}}
a.activity-comment(href="{{ activity.card.absoluteUrl }}")
a.activity-comment(href="{{ activity.card.originRelativeUrl }}")
+viewer
= activity.comment.text
+2 -2
View File
@@ -243,7 +243,7 @@ function createCardLink(card) {
Blaze.toHTML(
HTML.A(
{
href: card.absoluteUrl(),
href: card.originRelativeUrl(),
class: 'action-card',
},
sanitizeXss(card.title),
@@ -260,7 +260,7 @@ function createBoardLink(board, list) {
Blaze.toHTML(
HTML.A(
{
href: board.absoluteUrl(),
href: board.originRelativeUrl(),
class: 'action-board',
},
sanitizeXss(text),
+1 -1
View File
@@ -360,7 +360,7 @@ BlazeComponent.extendComponent({
end: end || card.endAt,
allDay:
Math.abs(end.getTime() - start.getTime()) / 1000 === 24 * 3600,
url: FlowRouter.url('card', {
url: FlowRouter.path('card', {
boardId: currentBoard._id,
slug: currentBoard.slug,
cardId: card._id,
+15 -5
View File
@@ -1,14 +1,17 @@
template(name="boardHeaderBar")
h1.header-board-menu
with currentBoard
a(class="{{#if currentUser.isBoardAdmin}}js-edit-board-title{{else}}is-disabled{{/if}}")
+viewer
= title
+viewer
= title
.board-header-btns.left
unless isMiniScreen
if currentBoard
if currentUser
with currentBoard
a.board-header-btn(class="{{#if currentUser.isBoardAdmin}}js-edit-board-title{{else}}is-disabled{{/if}}" title="{{_ 'edit'}}" value=title)
i.fa.fa-pencil-square-o
a.board-header-btn.js-star-board(class="{{#if isStarred}}is-active{{/if}}"
title="{{#if isStarred}}{{_ 'click-to-unstar'}}{{else}}{{_ 'click-to-star'}}{{/if}} {{_ 'starred-boards-description'}}")
i.fa(class="fa-star{{#unless isStarred}}-o{{/unless}}")
@@ -31,9 +34,12 @@ template(name="boardHeaderBar")
if $eq watchLevel "muted"
i.fa.fa-bell-slash
span {{_ watchLevel}}
a.board-header-btn.js-sort-cards(title="{{_ 'sort-cards'}}")
a.board-header-btn(title="{{_ 'sort-cards'}}" class="{{#if isSortActive }}emphasis{{else}} js-sort-cards {{/if}}")
i.fa.fa-sort
| {{_ 'sort-cards'}} {{sortCardsBy.get}}
span {{#if isSortActive }}{{_ 'Sort is on'}}{{else}}{{_ 'sort-cards'}}{{/if}}
if isSortActive
a.board-header-btn-close.js-sort-reset(title="Remove Sort")
i.fa.fa-times-thin
else
a.board-header-btn.js-log-in(
@@ -45,6 +51,10 @@ template(name="boardHeaderBar")
if currentBoard
if isMiniScreen
if currentUser
with currentBoard
a.board-header-btn(class="{{#if currentUser.isBoardAdmin}}js-edit-board-title{{else}}is-disabled{{/if}}" title="{{_ 'edit'}}" value=title)
i.fa.fa-pencil-square-o
a.board-header-btn.js-star-board(class="{{#if isStarred}}is-active{{/if}}"
title="{{#if isStarred}}{{_ 'click-to-unstar'}}{{else}}{{_ 'click-to-star'}}{{/if}} {{_ 'starred-boards-description'}}")
i.fa(class="fa-star{{#unless isStarred}}-o{{/unless}}")
+11 -9
View File
@@ -54,6 +54,10 @@ Template.boardChangeTitlePopup.events({
});
BlazeComponent.extendComponent({
onCreated(){
// set sort to default
Session.set('sortBy','')
},
watchLevel() {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
return currentBoard && currentBoard.getWatchLevel(Meteor.userId());
@@ -129,6 +133,9 @@ BlazeComponent.extendComponent({
Sidebar.setView();
Filter.reset();
},
'click .js-sort-reset'() {
Session.set('sortBy','')
},
'click .js-open-search-view'() {
Sidebar.setView('search');
},
@@ -162,6 +169,9 @@ Template.boardHeaderBar.helpers({
boardView() {
return Utils.boardView();
},
isSortActive(){
return Session.get('sortBy') ? true : false;
}
});
Template.boardChangeViewPopup.events({
@@ -406,15 +416,7 @@ BlazeComponent.extendComponent({
Session.set('sortBy', sortBy);
sortCardsBy.set(TAPi18n.__('date-created-oldest-first'));
Popup.close();
},
'click .js-sort-default'() {
const sortBy = {
sort: 1,
};
Session.set('sortBy', sortBy);
sortCardsBy.set(TAPi18n.__('default'));
Popup.close();
},
}
},
];
},
+2 -3
View File
@@ -8,11 +8,10 @@ template(name="cardDetails")
a.fa.fa-times-thin.close-card-details.js-close-card-details
if currentUser.isBoardMember
a.fa.fa-navicon.card-details-menu.js-open-card-details-menu
input.inline-input(type="text" id="cardURL_copy" value="{{ absoluteUrl }}")
input.inline-input(type="text" id="cardURL_copy" value="{{ originRelativeUrl }}")
a.fa.fa-link.card-copy-button.js-copy-link(
class="fa-link"
title="{{_ 'copy-card-link-to-clipboard'}}"
value="{{ absoluteUrl }}"
)
if isMiniScreen
a.fa.fa-times-thin.close-card-details-mobile-web.js-close-card-details
@@ -533,7 +532,7 @@ template(name="cardMorePopup")
span {{_ 'link-card'}}
= ' '
i.fa.colorful(class="{{#if board.isPublic}}fa-globe{{else}}fa-lock{{/if}}")
input.inline-input(type="text" id="cardURL" readonly value="{{ absoluteUrl }}" autofocus="autofocus")
input.inline-input(type="text" id="cardURL" readonly value="{{ originRelativeUrl }}" autofocus="autofocus")
button.js-copy-card-link-to-clipboard(class="btn" id="clipboard") {{_ 'copy-card-link-to-clipboard'}}
span.clearfix
br
+3 -1
View File
@@ -114,7 +114,7 @@ BlazeComponent.extendComponent({
if (card) {
const board = Boards.findOne(card.boardId);
if (board) {
result = FlowRouter.url('card', {
result = FlowRouter.path('card', {
boardId: card.boardId,
slug: board.slug,
cardId: card._id,
@@ -291,6 +291,8 @@ BlazeComponent.extendComponent({
},
'click .js-copy-link'() {
StringToCopyElement = document.getElementById('cardURL_copy');
StringToCopyElement.value =
window.location.origin + window.location.pathname;
StringToCopyElement.select();
if (document.execCommand('copy')) {
StringToCopyElement.blur();
+1 -1
View File
@@ -1,6 +1,6 @@
template(name="resultCard")
.result-card-wrapper
a.minicard-wrapper.card-title(href=absoluteUrl)
a.minicard-wrapper.card-title(href=originRelativeUrl)
+minicard(this)
//= card.title
ul.result-card-context-list
+1 -1
View File
@@ -5,7 +5,7 @@ template(name="listBody")
+inlinedForm(autoclose=false position="top")
+addCardForm(listId=_id position="top")
each (cardsWithLimit (idOrNull ../../_id))
a.minicard-wrapper.js-minicard(href=absoluteUrl
a.minicard-wrapper.js-minicard(href=originRelativeUrl
class="{{#if cardIsSelected}}is-selected{{/if}}"
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
if MultiSelection.isActive
+3 -3
View File
@@ -30,8 +30,8 @@ template(name="myCards")
each board in myCardsList
.my-cards-board-wrapper
.my-cards-board-title(class=board.colorClass, id="header")
a(href=board.absoluteUrl)
+viewer
a(href=board.originRelativeUrl)
+viewer
= board.title
each swimlane in board.mySwimlanes
.my-cards-swimlane-title(class="{{#if swimlane.colorClass}}{{ swimlane.colorClass }}{{else}}swimlane-default-color{{/if}}")
@@ -44,7 +44,7 @@ template(name="myCards")
= list.title
each card in list.myCards
.my-cards-card-wrapper
a.minicard-wrapper(href=card.absoluteUrl)
a.minicard-wrapper(href=card.originRelativeUrl)
+minicard(card)
else
.my-cards-dueat-list-wrapper
Binary file not shown.
+45 -39
View File
@@ -13,10 +13,11 @@ template(name="setting")
a.js-setting-menu(data-id="registration-setting")
i.fa.fa-sign-in
| {{_ 'registration'}}
li
a.js-setting-menu(data-id="email-setting")
i.fa.fa-envelope
| {{_ 'email'}}
unless isSandstorm
li
a.js-setting-menu(data-id="email-setting")
i.fa.fa-envelope
| {{_ 'email'}}
li
a.js-setting-menu(data-id="account-setting")
i.fa.fa-users
@@ -39,7 +40,8 @@ template(name="setting")
else if generalSetting.get
+general
else if emailSetting.get
+email
unless isSandstorm
+email
else if accountSetting.get
+accountSettings
else if announcementSetting.get
@@ -80,40 +82,40 @@ template(name="general")
template(name='email')
ul#email-setting.setting-detail
if isSandstorm
li.smtp-form
.title {{_ 'smtp-host'}}
.description {{_ 'smtp-host-description'}}
.form-group
input.wekan-form-control#mail-server-host(type="text", placeholder="smtp.domain.com" value="{{currentSetting.mailServer.host}}")
li.smtp-form
.title {{_ 'smtp-port'}}
.description {{_ 'smtp-port-description'}}
.form-group
input.wekan-form-control#mail-server-port(type="text", placeholder="25" value="{{currentSetting.mailServer.port}}")
li.smtp-form
.title {{_ 'smtp-username'}}
.form-group
input.wekan-form-control#mail-server-username(type="text", placeholder="{{_ 'username'}}" value="{{currentSetting.mailServer.username}}")
li.smtp-form
.title {{_ 'smtp-password'}}
.form-group
input.wekan-form-control#mail-server-password(type="password", placeholder="{{_ 'password'}}" value="")
li.smtp-form
.title {{_ 'smtp-tls'}}
.form-group
a.flex.js-toggle-tls
.materialCheckBox#mail-server-tls(class="{{#if currentSetting.mailServer.enableTLS}}is-checked{{/if}}")
span {{_ 'smtp-tls-description'}}
li.smtp-form
.title {{_ 'send-from'}}
.form-group
input.wekan-form-control#mail-server-from(type="email", placeholder="no-reply@domain.com" value="{{currentSetting.mailServer.from}}")
li
button.js-save.primary {{_ 'save'}}
//if isSandstorm
// li.smtp-form
// .title {{_ 'smtp-host'}}
// .description {{_ 'smtp-host-description'}}
// .form-group
// input.wekan-form-control#mail-server-host(type="text", placeholder="smtp.domain.com" value="{{currentSetting.mailServer.host}}")
// li.smtp-form
// .title {{_ 'smtp-port'}}
// .description {{_ 'smtp-port-description'}}
// .form-group
// input.wekan-form-control#mail-server-port(type="text", placeholder="25" value="{{currentSetting.mailServer.port}}")
// li.smtp-form
// .title {{_ 'smtp-username'}}
// .form-group
// input.wekan-form-control#mail-server-username(type="text", placeholder="{{_ 'username'}}" value="{{currentSetting.mailServer.username}}")
// li.smtp-form
// .title {{_ 'smtp-password'}}
// .form-group
// input.wekan-form-control#mail-server-password(type="password", placeholder="{{_ 'password'}}" value="")
// li.smtp-form
// .title {{_ 'smtp-tls'}}
// .form-group
// a.flex.js-toggle-tls
// .materialCheckBox#mail-server-tls(class="{{#if currentSetting.mailServer.enableTLS}}is-checked{{/if}}")
//
// span {{_ 'smtp-tls-description'}}
//
// li.smtp-form
// .title {{_ 'send-from'}}
// .form-group
// input.wekan-form-control#mail-server-from(type="email", placeholder="no-reply@domain.com" value="{{currentSetting.mailServer.from}}")
//
// li
// button.js-save.primary {{_ 'save'}}
li
button.js-send-smtp-test-email.primary {{_ 'send-smtp-test'}}
@@ -209,6 +211,10 @@ template(name='layoutSettings')
.title {{_ 'custom-top-left-corner-logo-height'}}
.form-group
input.wekan-form-control#custom-top-left-corner-logo-height(type="text", placeholder="" value="{{currentSetting.customTopLeftCornerLogoHeight}}")
li.layout-form
.title {{_ 'automatic-linked-url-schemes'}}
.form-group
textarea#automatic-linked-url-schemes.wekan-form-control= currentSetting.automaticLinkedUrlSchemes
li
button.js-save-layout.primary {{_ 'save'}}
@@ -176,6 +176,9 @@ BlazeComponent.extendComponent({
const textBelowCustomLoginLogo = $('#text-below-custom-login-logo')
.val()
.trim();
const automaticLinkedUrlSchemes = $('#automatic-linked-url-schemes')
.val()
.trim();
const customTopLeftCornerLogoImageUrl = $(
'#custom-top-left-corner-logo-image-url',
)
@@ -209,6 +212,7 @@ BlazeComponent.extendComponent({
customTopLeftCornerLogoHeight,
displayAuthenticationMethod,
defaultAuthenticationMethod,
automaticLinkedUrlSchemes,
},
});
} catch (e) {
@@ -4,9 +4,9 @@ template(name="searchSidebar")
.list-body
.minilists.clearfix.js-minilists
each (lists)
a.minilist-wrapper.js-minilist(href=absoluteUrl)
a.minilist-wrapper.js-minilist(href=originRelativeUrl)
+minilist(this)
.minicards.clearfix.js-minicards
each (results)
a.minicard-wrapper.js-minicard(href=absoluteUrl)
a.minicard-wrapper.js-minicard(href=originRelativeUrl)
+minicard(this)
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+1
View File
@@ -532,6 +532,7 @@
"custom-login-logo-image-url": "Custom Login Logo Image URL",
"custom-login-logo-link-url": "Custom Login Logo Link URL",
"text-below-custom-login-logo": "Text below Custom Login Logo",
"automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line",
"username": "Username",
"import-usernames": "Import Usernames",
"view-it": "View it",
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+983 -982
View File
File diff suppressed because it is too large. Load diff
+2
View File
@@ -1,3 +1,5 @@
import { Meteor } from 'meteor/meteor';
Actions = new Mongo.Collection('actions');
Actions.allow({
+3
View File
@@ -777,6 +777,9 @@ Boards.helpers({
absoluteUrl() {
return FlowRouter.url('board', { id: this._id, slug: this.slug });
},
originRelativeUrl() {
return FlowRouter.path('board', { id: this._id, slug: this.slug });
},
colorClass() {
return `board-color-${this.color}`;
+8
View File
@@ -758,6 +758,14 @@ Cards.helpers({
cardId: this._id,
});
},
originRelativeUrl() {
const board = this.board();
return FlowRouter.path('card', {
boardId: board._id,
slug: board.slug,
cardId: this._id,
});
},
canBeRestored() {
const list = Lists.findOne({
+188 -1
View File
@@ -307,7 +307,8 @@ if (Meteor.isServer) {
*
* @param {string} boardID the ID of the board
* @param {string} customFieldId the ID of the custom field
* @return_type CustomFields
* @return_type [{_id: string,
* boardIds: string}]
*/
JsonRoutes.add(
'GET',
@@ -370,6 +371,192 @@ if (Meteor.isServer) {
});
});
/**
* @operation edit_custom_field
* @summary Update a Custom Field
*
* @param {string} name the name of the custom field
* @param {string} type the type of the custom field
* @param {string} settings the settings object of the custom field
* @param {boolean} showOnCard should we show the custom field on cards
* @param {boolean} automaticallyOnCard should the custom fields automatically be added on cards
* @param {boolean} showLabelOnMiniCard should the label of the custom field be shown on minicards
* @return_type {_id: string}
*/
JsonRoutes.add(
'PUT',
'/api/boards/:boardId/custom-fields/:customFieldId',
(req, res) => {
Authentication.checkUserId(req.userId);
const paramFieldId = req.params.customFieldId;
if (req.body.hasOwnProperty('name')) {
CustomFields.direct.update(
{ _id: paramFieldId },
{ $set: { name: req.body.name } },
);
}
if (req.body.hasOwnProperty('type')) {
CustomFields.direct.update(
{ _id: paramFieldId },
{ $set: { type: req.body.type } },
);
}
if (req.body.hasOwnProperty('settings')) {
CustomFields.direct.update(
{ _id: paramFieldId },
{ $set: { settings: req.body.settings } },
);
}
if (req.body.hasOwnProperty('showOnCard')) {
CustomFields.direct.update(
{ _id: paramFieldId },
{ $set: { showOnCard: req.body.showOnCard } },
);
}
if (req.body.hasOwnProperty('automaticallyOnCard')) {
CustomFields.direct.update(
{ _id: paramFieldId },
{ $set: { automaticallyOnCard: req.body.automaticallyOnCard } },
);
}
if (req.body.hasOwnProperty('alwaysOnCard')) {
CustomFields.direct.update(
{ _id: paramFieldId },
{ $set: { alwaysOnCard: req.body.alwaysOnCard } },
);
}
if (req.body.hasOwnProperty('showLabelOnMiniCard')) {
CustomFields.direct.update(
{ _id: paramFieldId },
{ $set: { showLabelOnMiniCard: req.body.showLabelOnMiniCard } },
);
}
JsonRoutes.sendResult(res, {
code: 200,
data: { _id: paramFieldId },
});
},
);
/**
* @operation add_custom_field_dropdown_items
* @summary Update a Custom Field's dropdown items
*
* @param {string} [items] names of the custom field
* @return_type {_id: string}
*/
JsonRoutes.add(
'POST',
'/api/boards/:boardId/custom-fields/:customFieldId/dropdown-items',
(req, res) => {
Authentication.checkUserId(req.userId);
const paramCustomFieldId = req.params.customFieldId;
const paramItems = req.body.items;
if (req.body.hasOwnProperty('items')) {
if (Array.isArray(paramItems)) {
CustomFields.direct.update(
{ _id: paramCustomFieldId },
{
$push: {
'settings.dropdownItems': {
$each: paramItems
.filter(name => typeof name === 'string')
.map(name => ({
_id: Random.id(6),
name,
})),
},
},
},
);
}
}
JsonRoutes.sendResult(res, {
code: 200,
data: { _id: paramCustomFieldId },
});
},
);
/**
* @operation edit_custom_field_dropdown_item
* @summary Update a Custom Field's dropdown item
*
* @param {string} name names of the custom field
* @return_type {_id: string}
*/
JsonRoutes.add(
'PUT',
'/api/boards/:boardId/custom-fields/:customFieldId/dropdown-items/:dropdownItemId',
(req, res) => {
Authentication.checkUserId(req.userId);
const paramDropdownItemId = req.params.dropdownItemId;
const paramCustomFieldId = req.params.customFieldId;
const paramName = req.body.name;
if (req.body.hasOwnProperty('name')) {
CustomFields.direct.update(
{
_id: paramCustomFieldId,
'settings.dropdownItems._id': paramDropdownItemId,
},
{
$set: {
'settings.dropdownItems.$': {
_id: paramDropdownItemId,
name: paramName,
},
},
},
);
}
JsonRoutes.sendResult(res, {
code: 200,
data: { _id: customFieldId },
});
},
);
/**
* @operation delete_custom_field_dropdown_item
* @summary Update a Custom Field's dropdown items
*
* @param {string} itemId ID of the dropdown item
* @return_type {_id: string}
*/
JsonRoutes.add(
'DELETE',
'/api/boards/:boardId/custom-fields/:customFieldId/dropdown-items/:dropdownItemId',
(req, res) => {
Authentication.checkUserId(req.userId);
paramCustomFieldId = req.params.customFieldId;
paramDropdownItemId = req.params.dropdownItemId;
CustomFields.direct.update(
{ _id: paramCustomFieldId },
{
$pull: {
'settings.dropdownItems': { _id: paramDropdownItemId },
},
},
);
JsonRoutes.sendResult(res, {
code: 200,
data: { _id: paramCustomFieldId },
});
},
);
/**
* @operation delete_custom_field
* @summary Delete a Custom Fields attached to a board
+4
View File
@@ -280,6 +280,10 @@ Lists.helpers({
const card = Cards.findOne({ listId: this._id });
return card && card.absoluteUrl();
},
originRelativeUrl() {
const card = Cards.findOne({ listId: this._id });
return card && card.originRelativeUrl();
},
remove() {
Lists.remove({ _id: this._id });
},
+12
View File
@@ -0,0 +1,12 @@
if (Meteor.isServer) {
Meteor.startup(() => {
// Date of 7 days ago
let lastWeek = new Date();
lastWeek.setDate(lastWeek.getDate() - 7);
presences.remove({ ttl: { $lte: lastWeek } });
// Create index for serverId that is queried often
presences._collection._ensureIndex({ serverId: -1 });
});
}
+2
View File
@@ -1,3 +1,5 @@
import { Meteor } from 'meteor/meteor';
Rules = new Mongo.Collection('rules');
Rules.attachSchema(
+4
View File
@@ -62,6 +62,10 @@ Settings.attachSchema(
type: String,
optional: true,
},
automaticLinkedUrlSchemes: {
type: String,
optional: true,
},
customTopLeftCornerLogoImageUrl: {
type: String,
optional: true,
+2
View File
@@ -1,3 +1,5 @@
import { Meteor } from 'meteor/meteor';
Triggers = new Mongo.Collection('triggers');
Triggers.mutations({
-1
View File
@@ -1,7 +1,6 @@
#!/bin/env python3
import argparse
import esprima
import json
import logging
import os
+1433 -1017
View File
File diff suppressed because it is too large. Load diff
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "v5.02.0",
"version": "v5.07.0",
"description": "Open-Source kanban",
"private": true,
"scripts": {
@@ -72,7 +72,7 @@
"ldapjs": "^2.2.3",
"markdown-it": "^12.0.4",
"markdown-it-emoji": "^2.0.0",
"meteor-node-stubs": "^1.0.1",
"meteor-node-stubs": "^1.0.2",
"mongodb": "^3.6.4",
"os": "^0.1.1",
"page": "^1.11.5",
+28 -11
View File
@@ -6,23 +6,40 @@ var Markdown = require('markdown-it')({
breaks: true,
});
// Static URL Scheme Listing
var urlschemes = [
"aodroplink",
"thunderlink",
"cbthunderlink",
"onenote",
"file",
"abasurl",
"conisio",
"mailspring"
];
// Better would be a field in the admin backend to set this dynamically
// instead of putting all known or wanted url schemes here hard into code
// but i was not able to access those settings
// var urlschemes = currentSetting.automaticLinkedUrlSchemes.split('\n');
// put all url schemes into the linkify configuration to automatically make it clickable
for(var i=0; i<urlschemes.length;i++){
//console.log("adding autolink for "+urlschemes[i]);
Markdown.linkify.add(urlschemes[i]+":",'http:');
}
// Additional safeAttrValue function to allow for other specific protocols
// See https://github.com/leizongmin/js-xss/issues/52#issuecomment-241354114
function mySafeAttrValue(tag, name, value, cssFilter) {
// only when the tag is 'a' and attribute is 'href'
// then use your custom function
if (tag === 'a' && name === 'href') {
// only filter the value if starts with 'cbthunderlink:' or 'aodroplink'
if (/^thunderlink:/ig.test(value) ||
/^cbthunderlink:/ig.test(value) ||
/^aodroplink:/ig.test(value) ||
/^onenote:/ig.test(value) ||
/^file:/ig.test(value) ||
/^abasurl:/ig.test(value) ||
/^conisio:/ig.test(value) ||
/^mailspring:/ig.test(value)) {
return value;
}
// only filter the value if starts with an registered url scheme
urlscheme = value.split(/:/);
//console.log("validating "+urlscheme[0]);
if(urlschemes.includes(urlscheme[0])) return value;
else {
// use the default safeAttrValue function to process all non cbthunderlinks
return sanitizeXss.safeAttrValue(tag, name, value, cssFilter);
+178 -16159
View File
File diff suppressed because it is too large. Load diff
+1 -3450
View File
File diff suppressed because it is too large. Load diff
+5 -11
View File
@@ -1,21 +1,15 @@
# Generate docs.
# Extract the OpenAPI specification.
# extract the OpenAPI specification
# Install dependencies.
sudo apt-get install python3-pip
sudo pip3 install -U setuptools wheel
sudo npm install -g api2html@0.3.3
sudo npm install -g --unsafe-perm api2html@0.3.0
sudo npm install -g --unsafe-perm mkdirp
mkdir -p ~/python
cd ~/python
git clone --depth 1 -b master https://github.com/Kronuz/esprima-python
cd ~/python/esprima-python
sudo python3 setup.py install --record files.txt
sudo npm install -g api2html
cd ~/repos/wekan
mkdir -p public/api
# Generate docs.
python3 ./openapi/generate_openapi.py --release $(git describe --tags --abbrev=0) > ./public/api/wekan.yml
api2html -c ./public/logo-header.png -o ./public/api/wekan.html ./public/api/wekan.yml
# Copy docs to bundle
#cp -pR ./public/api ~/repos/wekan/.build/bundle/programs/web.browser/app/
#cp -pR ./public/api ~/repos/wekan/.build/bundle/programs/web.browser.legacy/app/
+2 -7
View File
@@ -5,18 +5,13 @@ sudo apt-get -y install parallel
cd ~/repos/wekan/.build
zip -r wekan-$1.zip bundle
# Can not build ppc64le version because
# OpenPower Minicloud is having
# emergency maintenance.
# scp wekan-$1.zip o:/home/ubuntu/
# echo "Bundle uploaded to x2/a/s/o."
{
scp wekan-$1.zip x2:/var/snap/wekan/common/releases.wekan.team/
scp wekan-$1.zip a:/home/wekan/repos/
scp wekan-$1.zip s:/home/linux1/
scp wekan-$1.zip o:/home/ubuntu/
} | parallel -k
cd ..
echo "Bundle uploaded to x2/a/s."
echo "Bundle uploaded to x2/a/s/o."
+1 -5
View File
@@ -2,12 +2,8 @@
sudo apt-get -y install parallel
# Can not build ppc64le version because
# OpenPower Minicloud is having
# emergency maintenance.
# ~/repos/wekan/releases/up-o.sh $1
{
~/repos/wekan/releases/up-a.sh $1
~/repos/wekan/releases/up-s.sh $1
~/repos/wekan/releases/up-o.sh $1
} | parallel -k
+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 = 502,
appVersion = 507,
# Increment this for every release.
appMarketingVersion = (defaultText = "5.02.0~2021-03-02"),
appMarketingVersion = (defaultText = "5.07.0~2021-03-19"),
# Human-readable presentation of the app version.
minUpgradableAppVersion = 0,
+2 -2
View File
@@ -63,7 +63,7 @@ if (Meteor.isServer) {
'swimlaneId',
'customField',
'customFieldValue',
'attachmentId'
'attachmentId',
];
const responseFunc = data => {
const paramCommentId = data.commentId;
@@ -125,7 +125,7 @@ if (Meteor.isServer) {
'oldSwimlane',
'label',
'attachment',
'attachmentId'
'attachmentId',
].forEach(key => {
if (quoteParams[key]) quoteParams[key] = `"${params[key]}"`;
});
+3
View File
@@ -501,6 +501,9 @@ Meteor.publish('globalSearch', function(sessionId, queryParams) {
boards.forEach(board => {
board.labels
.filter(boardLabel => {
if (!boardLabel.name) {
return false;
}
return boardLabel.name.match(reLabel);
})
.forEach(boardLabel => {
+1
View File
@@ -15,6 +15,7 @@ Meteor.publish('setting', () => {
customLoginLogoImageUrl: 1,
customLoginLogoLinkUrl: 1,
textBelowCustomLoginLogo: 1,
automaticLinkedUrlSchemes: 1,
customTopLeftCornerLogoImageUrl: 1,
customTopLeftCornerLogoLinkUrl: 1,
customTopLeftCornerLogoHeight: 1,
Loaded 100 of 101 files, more files were not shown because too many files have changed in this diff. Show more