mirror of
https://github.com/wekan/wekan.git
synced 2026-11-06 05:52:33 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
df54863e72 | ||
|
|
8f340326b0 | ||
|
|
42975bc8ab | ||
|
|
adb5487cdc | ||
|
|
4aad9ca498 | ||
|
|
972d023e95 | ||
|
|
acabef4652 | ||
|
|
f77651ba05 | ||
|
|
23e349d277 | ||
|
|
37d9a6659a | ||
|
|
8796c46810 | ||
|
|
4960891bd9 | ||
|
|
43482d9e48 | ||
|
|
ee323d97b4 | ||
|
|
d6b447f70a | ||
|
|
203fafdf7c | ||
|
|
62e90723d1 | ||
|
|
77372ccce1 | ||
|
|
fdb4980b68 | ||
|
|
ff4f5e6c04 | ||
|
|
0bb3b67075 | ||
|
|
e16b06b44a | ||
|
|
ac9b23f00f | ||
|
|
f562bdd801 | ||
|
|
0c05942b45 | ||
|
|
9db3c93116 | ||
|
|
ce1f3365bb | ||
|
|
3ce3612047 | ||
|
|
44c9eebc4c | ||
|
|
cf6cc0e59d | ||
|
|
2b1fc8d07f | ||
|
|
e7d7ddd698 | ||
|
|
1d6bfc5dd6 | ||
|
|
0ccdbdcbe9 | ||
|
|
463346b867 | ||
|
|
f293700db3 | ||
|
|
b4e343369a | ||
|
|
da1d94775c | ||
|
|
28582b7e77 | ||
|
|
0f4a97f3a6 | ||
|
|
0f75234ed2 | ||
|
|
bc2556139a | ||
|
|
c1f52a5e5a | ||
|
|
ab24b3262c | ||
|
|
42994efa9d | ||
|
|
44cf82caab | ||
|
|
a44ca39eb8 | ||
|
|
3f70c395e1 | ||
|
|
04383c0302 | ||
|
|
55d022eefc | ||
|
|
7d3917adb7 | ||
|
|
7eeeab8486 | ||
|
|
88a46ef59a | ||
|
|
e4a9dc25ec | ||
|
|
dfb563a330 | ||
|
|
16dbb88ee3 | ||
|
|
626f435edf | ||
|
|
9cbef4ba4b | ||
|
|
24035329b8 | ||
|
|
457977f954 | ||
|
|
373dc5cadb | ||
|
|
a35cfe660e | ||
|
|
db666eec65 | ||
|
|
586473aaa7 |
No files matched your search
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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}}")
|
||||
|
||||
@@ -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();
|
||||
},
|
||||
}
|
||||
},
|
||||
];
|
||||
},
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Vendored
BIN
Binary file not shown.
@@ -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
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
@@ -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
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
+983
-982
File diff suppressed because it is too large.
Load diff
@@ -1,3 +1,5 @@
|
||||
import { Meteor } from 'meteor/meteor';
|
||||
|
||||
Actions = new Mongo.Collection('actions');
|
||||
|
||||
Actions.allow({
|
||||
|
||||
@@ -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}`;
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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 });
|
||||
},
|
||||
|
||||
@@ -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 });
|
||||
});
|
||||
}
|
||||
@@ -1,3 +1,5 @@
|
||||
import { Meteor } from 'meteor/meteor';
|
||||
|
||||
Rules = new Mongo.Collection('rules');
|
||||
|
||||
Rules.attachSchema(
|
||||
|
||||
@@ -62,6 +62,10 @@ Settings.attachSchema(
|
||||
type: String,
|
||||
optional: true,
|
||||
},
|
||||
automaticLinkedUrlSchemes: {
|
||||
type: String,
|
||||
optional: true,
|
||||
},
|
||||
customTopLeftCornerLogoImageUrl: {
|
||||
type: String,
|
||||
optional: true,
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { Meteor } from 'meteor/meteor';
|
||||
|
||||
Triggers = new Mongo.Collection('triggers');
|
||||
|
||||
Triggers.mutations({
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#!/bin/env python3
|
||||
|
||||
import argparse
|
||||
import esprima
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
|
||||
Generated
+1433
-1017
File diff suppressed because it is too large.
Load diff
+2
-2
@@ -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",
|
||||
|
||||
@@ -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
File diff suppressed because it is too large.
Load diff
+1
-3450
File diff suppressed because it is too large.
Load diff
@@ -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/
|
||||
@@ -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
@@ -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
|
||||
@@ -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,
|
||||
|
||||
@@ -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]}"`;
|
||||
});
|
||||
|
||||
@@ -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 => {
|
||||
|
||||
@@ -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
Reference in new issue
Block a user