Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9a07649b8a | ||
|
|
9a6ac544dd | ||
|
|
06a1e26655 | ||
|
|
626e7c2c61 | ||
|
|
a7aeb491ba | ||
|
|
7ba8f72d7b | ||
|
|
d0f74d7a99 | ||
|
|
7f33fa5368 | ||
|
|
0ab97266f6 | ||
|
|
32f896f19d | ||
|
|
6f0e0748e1 | ||
|
|
8e5fc13ba4 | ||
|
|
7a35099fb9 | ||
|
|
d08bee6817 | ||
|
|
4fc96904d6 | ||
|
|
66bc1f28dd | ||
|
|
30d082e709 | ||
|
|
1b11123797 | ||
|
|
654c2add0d | ||
|
|
6d179d6d3d | ||
|
|
361faa6646 | ||
|
|
7fc22ba0b7 | ||
|
|
9c82e6ab68 | ||
|
|
78c18d4ffe | ||
|
|
978dafc62b | ||
|
|
8919d8fb7d | ||
|
|
cdb7dd9175 |
No files matched your search
+2
-2
@@ -143,8 +143,8 @@ reload@1.1.11
|
||||
retry@1.0.9
|
||||
routepolicy@1.0.12
|
||||
rzymek:fullcalendar@3.8.0
|
||||
salleman:accounts-oidc@1.0.9
|
||||
salleman:oidc@1.0.9
|
||||
salleman:accounts-oidc@1.0.10
|
||||
salleman:oidc@1.0.10
|
||||
service-configuration@1.0.11
|
||||
session@1.1.7
|
||||
sha@1.0.9
|
||||
|
||||
+68
-2
@@ -1,13 +1,79 @@
|
||||
# 2.16 2019-02-03 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Part 2](https://github.com/ChronikEwok/wekan/commit/9a6ac544dd5618e58ce107352124fd9b495e5c30):
|
||||
[Fix: Not displaying card content of public board: Snap, Docker and Sandstorm Shared Wekan Board
|
||||
Link](https://github.com/wekan/wekan/issues/1623) with
|
||||
[code from ChronikEwok](https://github.com/ChronikEwok/wekan/commit/cad9b20451bb6149bfb527a99b5001873b06c3de).
|
||||
|
||||
Thanks to ChronikEwok for contributions.
|
||||
|
||||
# v2.15 2019-02-03 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fix: Not displaying card content of public board: Snap, Docker and Sandstorm Shared Wekan Board
|
||||
Link](https://github.com/wekan/wekan/issues/1623) with
|
||||
[code from ChronikEwok](https://github.com/ChronikEwok/wekan/commit/cad9b20451bb6149bfb527a99b5001873b06c3de).
|
||||
|
||||
Thanks to ChronikEwok for contributions.
|
||||
|
||||
# v2.14 2019-02-02 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fix Sandstorm export board from web](https://github.com/wekan/wekan/issues/2157).
|
||||
- [Fix Error when logging in to Wekan REST API when using Sandstorm Wekan](https://github.com/wekan/wekan/issues/1279).
|
||||
Sandstorm API works this way: Make API key, and from that key copy API URL and API KEY to below. It saves Wekan board to file.
|
||||
`curl http://Bearer:APIKEY@api-12345.local.sandstorm.io:6080/api/boards/sandstorm/export?authToken=#APIKEY > wekanboard.json`
|
||||
If later API key does not work, you need to remove it and make a new one.
|
||||
|
||||
Thanks to GitHub user xet7 for contributions.
|
||||
|
||||
# v2.13 2019-02-01 Wekan release
|
||||
|
||||
This release adds the following new features with Apache I-CLA, thanks to bentiss:
|
||||
|
||||
- [Use infinite-scrolling on lists](https://github.com/wekan/wekan/pull/2144).
|
||||
This allows to reduce the loading time of a big board.
|
||||
Note that there is an infinite scroll implementation in the mixins,
|
||||
but this doesn't fit well as the cards in the list can have arbitrary
|
||||
height.
|
||||
The idea to rely on the visibility of a spinner is based on
|
||||
http://www.meteorpedia.com/read/Infinite_Scrolling
|
||||
- [When writing to minicard, press Shift-Enter on minicard to go to next line
|
||||
below](https://github.com/wekan/wekan/commit/7a35099fb9778d5f3656a57c74af426cfb20fba3),
|
||||
to continue writing on same minicard 2nd line.
|
||||
|
||||
Thanks to GitHub user bentiss for contributions.
|
||||
|
||||
# v2.12 2019-01-31 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Bumped the salleman oidc packages versions to include an upstream bug fix](https://github.com/wekan/wekan/commit/361faa6646556de68ad78dc90d9eb9f78956ce0f).
|
||||
|
||||
Thanks to GitHub user danpatdav for contributions.
|
||||
|
||||
# v2.11 2019-01-31 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fix: Bug: Not logged in public board page has calendar](https://github.com/wekan/wekan/issues/2061). Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users and translators for contributions.
|
||||
|
||||
# v2.10 2019-01-30 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- Translations: Add Macedonian. [Copied Bulgarian to Macedonian](https://github.com/wekan/wekan/commit/6e4a6515e00fe68b8615d850cfb3cb290418e176)
|
||||
so that required changes will be faster to add. Thanks to translators and therampagerado.
|
||||
so that required changes will be faster to add. Thanks to translators and therampagerado;
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- Revert [Sandstorm API changes](https://github.com/wekan/wekan/commit/be03a191c4321c2f80116c0ee1ae6c826d882535
|
||||
- Revert [Sandstorm API changes](https://github.com/wekan/wekan/commit/be03a191c4321c2f80116c0ee1ae6c826d882535)
|
||||
that were done at [Wekan v2.05](https://github.com/wekan/wekan/blob/devel/CHANGELOG.md#v205-2019-01-27-wekan-release)
|
||||
to fix #2143. Thanks to pantraining and xet7.
|
||||
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
||||
appVersion: "v2.10.0"
|
||||
appVersion: "v2.16.0"
|
||||
files:
|
||||
userUploads:
|
||||
- README.md
|
||||
|
||||
@@ -29,7 +29,8 @@ template(name="boardBody")
|
||||
+calendarView
|
||||
|
||||
template(name="calendarView")
|
||||
.calendar-view.swimlane
|
||||
if currentCard
|
||||
+cardDetails(currentCard)
|
||||
+fullcalendar(calendarOptions)
|
||||
if isViewCalendar
|
||||
.calendar-view.swimlane
|
||||
if currentCard
|
||||
+cardDetails(currentCard)
|
||||
+fullcalendar(calendarOptions)
|
||||
@@ -134,7 +134,7 @@ BlazeComponent.extendComponent({
|
||||
|
||||
isViewCalendar() {
|
||||
const currentUser = Meteor.user();
|
||||
if (!currentUser) return true;
|
||||
if (!currentUser) return false;
|
||||
return (currentUser.profile.boardView === 'board-view-cal');
|
||||
},
|
||||
|
||||
@@ -264,4 +264,9 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
};
|
||||
},
|
||||
isViewCalendar() {
|
||||
const currentUser = Meteor.user();
|
||||
if (!currentUser) return false;
|
||||
return (currentUser.profile.boardView === 'board-view-cal');
|
||||
},
|
||||
}).register('calendarView');
|
||||
@@ -211,6 +211,9 @@
|
||||
max-height: 250px
|
||||
overflow: hidden
|
||||
|
||||
.sk-spinner-list
|
||||
margin-top: unset !important
|
||||
|
||||
list-header-color(background, color...)
|
||||
border-bottom: 6px solid background
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ template(name="listBody")
|
||||
if cards.count
|
||||
+inlinedForm(autoclose=false position="top")
|
||||
+addCardForm(listId=_id position="top")
|
||||
each (cards (idOrNull ../../_id))
|
||||
each (cardsWithLimit (idOrNull ../../_id))
|
||||
a.minicard-wrapper.js-minicard(href=absoluteUrl
|
||||
class="{{#if cardIsSelected}}is-selected{{/if}}"
|
||||
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
|
||||
@@ -12,6 +12,16 @@ template(name="listBody")
|
||||
.materialCheckBox.multi-selection-checkbox.js-toggle-multi-selection(
|
||||
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
|
||||
+minicard(this)
|
||||
if (showSpinner (idOrNull ../../_id))
|
||||
.sk-spinner.sk-spinner-wave.sk-spinner-list(
|
||||
class=currentBoard.colorClass
|
||||
id="showMoreResults")
|
||||
.sk-rect1
|
||||
.sk-rect2
|
||||
.sk-rect3
|
||||
.sk-rect4
|
||||
.sk-rect5
|
||||
|
||||
if canSeeAddCard
|
||||
+inlinedForm(autoclose=false position="bottom")
|
||||
+addCardForm(listId=_id position="bottom")
|
||||
|
||||
@@ -1,6 +1,34 @@
|
||||
const subManager = new SubsManager();
|
||||
const InfiniteScrollIter = 10;
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
onCreated() {
|
||||
// for infinite scrolling
|
||||
this.cardlimit = new ReactiveVar(InfiniteScrollIter);
|
||||
},
|
||||
|
||||
onRendered() {
|
||||
const domElement = this.find('.js-perfect-scrollbar');
|
||||
|
||||
this.$(domElement).on('scroll', () => this.updateList(domElement));
|
||||
$(window).on(`resize.${this.data().listId}`, () => this.updateList(domElement));
|
||||
|
||||
// we add a Mutation Observer to allow propagations of cardlimit
|
||||
// when the spinner stays in the current view (infinite scrolling)
|
||||
this.mutationObserver = new MutationObserver(() => this.updateList(domElement));
|
||||
|
||||
this.mutationObserver.observe(domElement, {
|
||||
childList: true,
|
||||
});
|
||||
|
||||
this.updateList(domElement);
|
||||
},
|
||||
|
||||
onDestroyed() {
|
||||
$(window).off(`resize.${this.data().listId}`);
|
||||
this.mutationObserver.disconnect();
|
||||
},
|
||||
|
||||
mixins() {
|
||||
return [Mixins.PerfectScrollbar];
|
||||
},
|
||||
@@ -60,6 +88,13 @@ BlazeComponent.extendComponent({
|
||||
type: 'cardType-card',
|
||||
});
|
||||
|
||||
// if the displayed card count is less than the total cards in the list,
|
||||
// we need to increment the displayed card count to prevent the spinner
|
||||
// to appear
|
||||
const cardCount = this.data().cards(this.idOrNull(swimlaneId)).count();
|
||||
if (this.cardlimit.get() < cardCount) {
|
||||
this.cardlimit.set(this.cardlimit.get() + InfiniteScrollIter);
|
||||
}
|
||||
|
||||
// In case the filter is active we need to add the newly inserted card in
|
||||
// the list of exceptions -- cards that are not filtered. Otherwise the
|
||||
@@ -119,6 +154,52 @@ BlazeComponent.extendComponent({
|
||||
return undefined;
|
||||
},
|
||||
|
||||
cardsWithLimit(swimlaneId) {
|
||||
const limit = this.cardlimit.get();
|
||||
const selector = {
|
||||
listId: this.currentData()._id,
|
||||
archived: false,
|
||||
};
|
||||
if (swimlaneId)
|
||||
selector.swimlaneId = swimlaneId;
|
||||
return Cards.find(Filter.mongoSelector(selector), {
|
||||
sort: ['sort'],
|
||||
limit,
|
||||
});
|
||||
},
|
||||
|
||||
spinnerInView(container) {
|
||||
const parentViewHeight = container.clientHeight;
|
||||
const bottomViewPosition = container.scrollTop + parentViewHeight;
|
||||
|
||||
const spinner = this.find('.sk-spinner-list');
|
||||
|
||||
const threshold = spinner.offsetTop;
|
||||
|
||||
return bottomViewPosition > threshold;
|
||||
},
|
||||
|
||||
showSpinner(swimlaneId) {
|
||||
const list = Template.currentData();
|
||||
return list.cards(swimlaneId).count() > this.cardlimit.get();
|
||||
},
|
||||
|
||||
updateList(container) {
|
||||
// first, if the spinner is not rendered, we have reached the end of
|
||||
// the list of cards, so skip and disable firing the events
|
||||
const target = this.find('.sk-spinner-list');
|
||||
if (!target) {
|
||||
this.$(container).off('scroll');
|
||||
$(window).off(`resize.${this.data().listId}`);
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.spinnerInView(container)) {
|
||||
this.cardlimit.set(this.cardlimit.get() + InfiniteScrollIter);
|
||||
Ps.update(container);
|
||||
}
|
||||
},
|
||||
|
||||
canSeeAddCard() {
|
||||
return !this.reachedWipLimit() && Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
|
||||
},
|
||||
@@ -179,7 +260,7 @@ BlazeComponent.extendComponent({
|
||||
|
||||
pressKey(evt) {
|
||||
// Pressing Enter should submit the card
|
||||
if (evt.keyCode === 13) {
|
||||
if (evt.keyCode === 13 && !evt.shiftKey) {
|
||||
evt.preventDefault();
|
||||
const $form = $(evt.currentTarget).closest('form');
|
||||
// XXX For some reason $form.submit() does not work (it's probably a bug
|
||||
|
||||
@@ -3,14 +3,18 @@ const { calculateIndex, enableClickOnTouch } = Utils;
|
||||
function currentCardIsInThisList(listId, swimlaneId) {
|
||||
const currentCard = Cards.findOne(Session.get('currentCard'));
|
||||
const currentUser = Meteor.user();
|
||||
if (currentUser.profile.boardView === 'board-view-lists')
|
||||
return currentCard && currentCard.listId === listId;
|
||||
else if (currentUser.profile.boardView === 'board-view-swimlanes')
|
||||
if (currentUser && currentUser.profile.boardView === 'board-view-swimlanes')
|
||||
return currentCard && currentCard.listId === listId && currentCard.swimlaneId === swimlaneId;
|
||||
else if (currentUser.profile.boardView === 'board-view-cal')
|
||||
return currentCard;
|
||||
else
|
||||
return false;
|
||||
else // Default view: board-view-lists
|
||||
return currentCard && currentCard.listId === listId;
|
||||
// https://github.com/wekan/wekan/issues/1623
|
||||
// https://github.com/ChronikEwok/wekan/commit/cad9b20451bb6149bfb527a99b5001873b06c3de
|
||||
// TODO: In public board, if you would like to switch between List/Swimlane view, you could
|
||||
// 1) If there is no view cookie, save to cookie board-view-lists
|
||||
// board-view-lists / board-view-swimlanes / board-view-cal
|
||||
// 2) If public user changes clicks board-view-lists then change view and
|
||||
// then change view and save cookie with view value
|
||||
// without using currentuser above, because currentuser is null.
|
||||
}
|
||||
|
||||
function initSortable(boardComponent, $listsDom) {
|
||||
|
||||
+30
-30
@@ -147,8 +147,8 @@
|
||||
"cards-count": "卡片",
|
||||
"casSignIn": "以 CAS 登入",
|
||||
"cardType-card": "卡片",
|
||||
"cardType-linkedCard": "Linked Card",
|
||||
"cardType-linkedBoard": "Linked Board",
|
||||
"cardType-linkedCard": "已連結卡片",
|
||||
"cardType-linkedBoard": "已連結看板",
|
||||
"change": "變更",
|
||||
"change-avatar": "更換大頭貼",
|
||||
"change-password": "變更密碼",
|
||||
@@ -161,50 +161,50 @@
|
||||
"changeSettingsPopup-title": "更改設定",
|
||||
"subtasks": "子任務",
|
||||
"checklists": "待辦清單",
|
||||
"click-to-star": "點此來標記該看板",
|
||||
"click-to-unstar": "點此來去除該看板的標記",
|
||||
"click-to-star": "點擊以添加標記於此看板。",
|
||||
"click-to-unstar": "點擊以移除標記於此看板。",
|
||||
"clipboard": "剪貼簿貼上或者拖曳檔案",
|
||||
"close": "關閉",
|
||||
"close-board": "關閉看板",
|
||||
"close-board-pop": "您可以通過點擊主頁眉中的「封存」按鈕來恢復看板。",
|
||||
"color-black": "黑色",
|
||||
"color-blue": "藍色",
|
||||
"color-crimson": "crimson",
|
||||
"color-darkgreen": "darkgreen",
|
||||
"color-gold": "gold",
|
||||
"color-gray": "gray",
|
||||
"color-crimson": "艷紅",
|
||||
"color-darkgreen": "暗綠",
|
||||
"color-gold": "金色",
|
||||
"color-gray": "灰色",
|
||||
"color-green": "綠色",
|
||||
"color-indigo": "indigo",
|
||||
"color-indigo": "紫藍",
|
||||
"color-lime": "綠黃",
|
||||
"color-magenta": "magenta",
|
||||
"color-mistyrose": "mistyrose",
|
||||
"color-navy": "navy",
|
||||
"color-magenta": "洋紅",
|
||||
"color-mistyrose": "玫瑰粉",
|
||||
"color-navy": "藏青",
|
||||
"color-orange": "橙色",
|
||||
"color-paleturquoise": "paleturquoise",
|
||||
"color-peachpuff": "peachpuff",
|
||||
"color-paleturquoise": "淡藍綠",
|
||||
"color-peachpuff": "桃色",
|
||||
"color-pink": "粉紅",
|
||||
"color-plum": "plum",
|
||||
"color-plum": "梅色",
|
||||
"color-purple": "紫色",
|
||||
"color-red": "紅色",
|
||||
"color-saddlebrown": "saddlebrown",
|
||||
"color-silver": "silver",
|
||||
"color-saddlebrown": "馬鞍棕",
|
||||
"color-silver": "銀色",
|
||||
"color-sky": "天藍",
|
||||
"color-slateblue": "slateblue",
|
||||
"color-white": "white",
|
||||
"color-slateblue": "青藍",
|
||||
"color-white": "白色",
|
||||
"color-yellow": "黃色",
|
||||
"unset-color": "Unset",
|
||||
"unset-color": "未設置",
|
||||
"comment": "評論",
|
||||
"comment-placeholder": "撰寫評論",
|
||||
"comment-only": "只能發表評論",
|
||||
"comment-only-desc": "只能在卡片上發表評論",
|
||||
"no-comments": "沒有評論",
|
||||
"no-comments-desc": "Can not see comments and activities.",
|
||||
"no-comments-desc": "無法檢視評論和活動。",
|
||||
"computer": "從本機上傳",
|
||||
"confirm-subtask-delete-dialog": "你確定要刪除子任務嗎?",
|
||||
"confirm-checklist-delete-dialog": "你確定要刪除待辦清單嗎?",
|
||||
"copy-card-link-to-clipboard": "將卡片連結複製到剪貼簿",
|
||||
"linkCardPopup-title": "Link Card",
|
||||
"searchCardPopup-title": "Search Card",
|
||||
"linkCardPopup-title": "連結卡片",
|
||||
"searchCardPopup-title": "搜尋卡片",
|
||||
"copyCardPopup-title": "複製卡片",
|
||||
"copyChecklistToManyCardsPopup-title": "複製待辦清單的樣板到多個卡片",
|
||||
"copyChecklistToManyCardsPopup-instructions": "使用此 JSON 格式來表示目標卡片的標題和描述",
|
||||
@@ -216,14 +216,14 @@
|
||||
"createCustomField": "建立欄位",
|
||||
"createCustomFieldPopup-title": "建立欄位",
|
||||
"current": "目前",
|
||||
"custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.",
|
||||
"custom-field-checkbox": "Checkbox",
|
||||
"custom-field-delete-pop": "此操作將會從所有卡片中移除自訂欄位以及銷毀歷史紀錄,並且無法撤消。",
|
||||
"custom-field-checkbox": "複選框",
|
||||
"custom-field-date": "日期",
|
||||
"custom-field-dropdown": "Dropdown List",
|
||||
"custom-field-dropdown-none": "(none)",
|
||||
"custom-field-dropdown-options": "下拉式選單",
|
||||
"custom-field-dropdown": "下拉式選單",
|
||||
"custom-field-dropdown-none": "(無)",
|
||||
"custom-field-dropdown-options": "清單選項",
|
||||
"custom-field-dropdown-options-placeholder": "按下 Enter 新增更多選項",
|
||||
"custom-field-dropdown-unknown": "(unknown)",
|
||||
"custom-field-dropdown-unknown": "(未知)",
|
||||
"custom-field-number": "數字",
|
||||
"custom-field-text": "文字",
|
||||
"custom-fields": "自訂欄位",
|
||||
@@ -255,7 +255,7 @@
|
||||
"email-enrollAccount-subject": "您在 __siteName__ 的帳號已經建立",
|
||||
"email-enrollAccount-text": "親愛的 __user__,\n\n點選下面的連結,即刻開始使用這項服務。\n\n__url__\n\n謝謝。",
|
||||
"email-fail": "郵件寄送失敗",
|
||||
"email-fail-text": "Error trying to send email",
|
||||
"email-fail-text": "嘗試發送郵件時出現錯誤",
|
||||
"email-invalid": "電子郵件地址錯誤",
|
||||
"email-invite": "寄送郵件邀請",
|
||||
"email-invite-subject": "__inviter__ 向您發出邀請",
|
||||
|
||||
+1
-1
@@ -31,7 +31,7 @@ if (Meteor.isServer) {
|
||||
user = Meteor.users.findOne({
|
||||
'services.resume.loginTokens.hashedToken': hashToken,
|
||||
});
|
||||
} else {
|
||||
} else if (!Meteor.settings.public.sandstorm) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
user = Users.findOne({ _id: req.userId, isAdmin: true });
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v2.10.0",
|
||||
"version": "v2.16.0",
|
||||
"description": "Open-Source kanban",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
|
||||
appTitle = (defaultText = "Wekan"),
|
||||
# The name of the app as it is displayed to the user.
|
||||
|
||||
appVersion = 212,
|
||||
appVersion = 218,
|
||||
# Increment this for every release.
|
||||
|
||||
appMarketingVersion = (defaultText = "2.10.0~2019-01-30"),
|
||||
appMarketingVersion = (defaultText = "2.16.0~2019-02-03"),
|
||||
# Human-readable presentation of the app version.
|
||||
|
||||
minUpgradableAppVersion = 0,
|
||||
|
||||
Reference in new issue
Block a user