mirror of
https://github.com/wekan/wekan.git
synced 2026-01-07 01:58:49 +01:00
Merge branch 'devel'
This commit is contained in:
commit
30a4494af2
13 changed files with 157 additions and 135 deletions
|
|
@ -1,11 +1,16 @@
|
|||
# Upcoming Wekan release
|
||||
# v0.79 2018-03-31 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Checklist items sort fix, and checklist sort capability](https://github.com/wekan/wekan/pull/1543);
|
||||
- [Add Received Date and End Date. Between them is already existing Start and Due Date](https://github.com/wekan/wekan/pull/1550).
|
||||
|
||||
Thanks to GitHub users andresmanelli and rjevnikar for their contributions.
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix drag in lists view](https://github.com/wekan/wekan/pull/1559/commits/679e50af6449a680f958256570e8b9f1944a3a92);
|
||||
- [Set fixed width for swimlane header](https://github.com/wekan/wekan/pull/1559/commits/2e8f8924dd0d985ae4634450cfbef04e88e5d954).
|
||||
|
||||
Thanks to GitHub users andresmanelli, rjevnikar and xet7 for their contributions.
|
||||
|
||||
# v0.78 2018-03-17 Wekan release
|
||||
|
||||
|
|
|
|||
|
|
@ -1,13 +0,0 @@
|
|||
BlazeComponent.extendComponent({
|
||||
currentCardIsInThisList(listId, swimlaneId) {
|
||||
const currentCard = Cards.findOne(Session.get('currentCard'));
|
||||
const currentBoardId = Session.get('currentBoard');
|
||||
const board = Boards.findOne(currentBoardId);
|
||||
if (board.view === 'board-view-lists')
|
||||
return currentCard && currentCard.listId === listId;
|
||||
else if (board.view === 'board-view-swimlanes')
|
||||
return currentCard && currentCard.listId === listId && currentCard.swimlaneId === swimlaneId;
|
||||
else
|
||||
return false;
|
||||
},
|
||||
}).register('listsGroup');
|
||||
|
|
@ -1,5 +1,85 @@
|
|||
const { calculateIndex } = Utils;
|
||||
|
||||
function currentCardIsInThisList(listId, swimlaneId) {
|
||||
const currentCard = Cards.findOne(Session.get('currentCard'));
|
||||
const currentBoardId = Session.get('currentBoard');
|
||||
const board = Boards.findOne(currentBoardId);
|
||||
if (board.view === 'board-view-lists')
|
||||
return currentCard && currentCard.listId === listId;
|
||||
else if (board.view === 'board-view-swimlanes')
|
||||
return currentCard && currentCard.listId === listId && currentCard.swimlaneId === swimlaneId;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
function initSortable(boardComponent, $listsDom) {
|
||||
// We want to animate the card details window closing. We rely on CSS
|
||||
// transition for the actual animation.
|
||||
$listsDom._uihooks = {
|
||||
removeElement(node) {
|
||||
const removeNode = _.once(() => {
|
||||
node.parentNode.removeChild(node);
|
||||
});
|
||||
if ($(node).hasClass('js-card-details')) {
|
||||
$(node).css({
|
||||
flexBasis: 0,
|
||||
padding: 0,
|
||||
});
|
||||
$listsDom.one(CSSEvents.transitionend, removeNode);
|
||||
} else {
|
||||
removeNode();
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
$listsDom.sortable({
|
||||
tolerance: 'pointer',
|
||||
helper: 'clone',
|
||||
handle: '.js-list-header',
|
||||
items: '.js-list:not(.js-list-composer)',
|
||||
placeholder: 'list placeholder',
|
||||
distance: 7,
|
||||
start(evt, ui) {
|
||||
ui.placeholder.height(ui.helper.height());
|
||||
EscapeActions.executeUpTo('popup-close');
|
||||
boardComponent.setIsDragging(true);
|
||||
},
|
||||
stop(evt, ui) {
|
||||
// To attribute the new index number, we need to get the DOM element
|
||||
// of the previous and the following card -- if any.
|
||||
const prevListDom = ui.item.prev('.js-list').get(0);
|
||||
const nextListDom = ui.item.next('.js-list').get(0);
|
||||
const sortIndex = calculateIndex(prevListDom, nextListDom, 1);
|
||||
|
||||
$listsDom.sortable('cancel');
|
||||
const listDomElement = ui.item.get(0);
|
||||
const list = Blaze.getData(listDomElement);
|
||||
|
||||
Lists.update(list._id, {
|
||||
$set: {
|
||||
sort: sortIndex.base,
|
||||
},
|
||||
});
|
||||
|
||||
boardComponent.setIsDragging(false);
|
||||
},
|
||||
});
|
||||
|
||||
function userIsMember() {
|
||||
return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
|
||||
}
|
||||
|
||||
// Disable drag-dropping while in multi-selection mode, or if the current user
|
||||
// is not a board member
|
||||
boardComponent.autorun(() => {
|
||||
const $listDom = $listsDom;
|
||||
if ($listDom.data('sortable')) {
|
||||
$listsDom.sortable('option', 'disabled',
|
||||
MultiSelection.isActive() || !userIsMember());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
onRendered() {
|
||||
const boardComponent = this.parentComponent();
|
||||
|
|
@ -9,71 +89,7 @@ BlazeComponent.extendComponent({
|
|||
boardComponent.scrollLeft();
|
||||
}
|
||||
|
||||
// We want to animate the card details window closing. We rely on CSS
|
||||
// transition for the actual animation.
|
||||
$listsDom._uihooks = {
|
||||
removeElement(node) {
|
||||
const removeNode = _.once(() => {
|
||||
node.parentNode.removeChild(node);
|
||||
});
|
||||
if ($(node).hasClass('js-card-details')) {
|
||||
$(node).css({
|
||||
flexBasis: 0,
|
||||
padding: 0,
|
||||
});
|
||||
$listsDom.one(CSSEvents.transitionend, removeNode);
|
||||
} else {
|
||||
removeNode();
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
$listsDom.sortable({
|
||||
tolerance: 'pointer',
|
||||
helper: 'clone',
|
||||
handle: '.js-list-header',
|
||||
items: '.js-list:not(.js-list-composer)',
|
||||
placeholder: 'list placeholder',
|
||||
distance: 7,
|
||||
start(evt, ui) {
|
||||
ui.placeholder.height(ui.helper.height());
|
||||
EscapeActions.executeUpTo('popup-close');
|
||||
boardComponent.setIsDragging(true);
|
||||
},
|
||||
stop(evt, ui) {
|
||||
// To attribute the new index number, we need to get the DOM element
|
||||
// of the previous and the following card -- if any.
|
||||
const prevListDom = ui.item.prev('.js-list').get(0);
|
||||
const nextListDom = ui.item.next('.js-list').get(0);
|
||||
const sortIndex = calculateIndex(prevListDom, nextListDom, 1);
|
||||
|
||||
$listsDom.sortable('cancel');
|
||||
const listDomElement = ui.item.get(0);
|
||||
const list = Blaze.getData(listDomElement);
|
||||
|
||||
Lists.update(list._id, {
|
||||
$set: {
|
||||
sort: sortIndex.base,
|
||||
},
|
||||
});
|
||||
|
||||
boardComponent.setIsDragging(false);
|
||||
},
|
||||
});
|
||||
|
||||
function userIsMember() {
|
||||
return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
|
||||
}
|
||||
|
||||
// Disable drag-dropping while in multi-selection mode, or if the current user
|
||||
// is not a board member
|
||||
boardComponent.autorun(() => {
|
||||
const $listDom = $listsDom;
|
||||
if ($listDom.data('sortable')) {
|
||||
$listsDom.sortable('option', 'disabled',
|
||||
MultiSelection.isActive() || !userIsMember());
|
||||
}
|
||||
});
|
||||
initSortable(boardComponent, $listsDom);
|
||||
},
|
||||
onCreated() {
|
||||
this.draggingActive = new ReactiveVar(false);
|
||||
|
|
@ -87,15 +103,7 @@ BlazeComponent.extendComponent({
|
|||
},
|
||||
|
||||
currentCardIsInThisList(listId, swimlaneId) {
|
||||
const currentCard = Cards.findOne(Session.get('currentCard'));
|
||||
const currentBoardId = Session.get('currentBoard');
|
||||
const board = Boards.findOne(currentBoardId);
|
||||
if (board.view === 'board-view-lists')
|
||||
return currentCard && currentCard.listId === listId;
|
||||
else if (board.view === 'board-view-swimlanes')
|
||||
return currentCard && currentCard.listId === listId && currentCard.swimlaneId === swimlaneId;
|
||||
else
|
||||
return false;
|
||||
return currentCardIsInThisList(listId, swimlaneId);
|
||||
},
|
||||
|
||||
events() {
|
||||
|
|
@ -210,3 +218,19 @@ Template.swimlane.helpers({
|
|||
return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
|
||||
},
|
||||
});
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
currentCardIsInThisList(listId, swimlaneId) {
|
||||
return currentCardIsInThisList(listId, swimlaneId);
|
||||
},
|
||||
onRendered() {
|
||||
const boardComponent = this.parentComponent();
|
||||
const $listsDom = this.$('.js-lists');
|
||||
|
||||
if (!Session.get('currentCard')) {
|
||||
boardComponent.scrollLeft();
|
||||
}
|
||||
|
||||
initSortable(boardComponent, $listsDom);
|
||||
},
|
||||
}).register('listsGroup');
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@
|
|||
margin-top: 50px;
|
||||
font-weight: bold;
|
||||
min-height: 9px;
|
||||
min-width: 30px;
|
||||
width: 50px;
|
||||
overflow: hidden;
|
||||
-o-text-overflow: ellipsis;
|
||||
text-overflow: ellipsis;
|
||||
|
|
|
|||
|
|
@ -436,10 +436,10 @@
|
|||
"createdAt": "Erstellt am",
|
||||
"verified": "Geprüft",
|
||||
"active": "Aktiv",
|
||||
"card-received": "Received",
|
||||
"card-received-on": "Received on",
|
||||
"card-end": "End",
|
||||
"card-end-on": "Ends on",
|
||||
"editCardReceivedDatePopup-title": "Change received date",
|
||||
"editCardEndDatePopup-title": "Change end date"
|
||||
"card-received": "Empfangen",
|
||||
"card-received-on": "Empfangen am",
|
||||
"card-end": "Ende",
|
||||
"card-end-on": "Endet am",
|
||||
"editCardReceivedDatePopup-title": "Empfangsdatum ändern",
|
||||
"editCardEndDatePopup-title": "Enddatum ändern"
|
||||
}
|
||||
|
|
@ -436,10 +436,10 @@
|
|||
"createdAt": "Creado en",
|
||||
"verified": "Verificado",
|
||||
"active": "Activo",
|
||||
"card-received": "Received",
|
||||
"card-received-on": "Received on",
|
||||
"card-end": "End",
|
||||
"card-end-on": "Ends on",
|
||||
"editCardReceivedDatePopup-title": "Change received date",
|
||||
"editCardEndDatePopup-title": "Change end date"
|
||||
"card-received": "Recibido",
|
||||
"card-received-on": "Recibido el",
|
||||
"card-end": "Termina",
|
||||
"card-end-on": "Termina el",
|
||||
"editCardReceivedDatePopup-title": "Cambiar la fecha de recepción",
|
||||
"editCardEndDatePopup-title": "Cambiar la fecha de finalización"
|
||||
}
|
||||
|
|
@ -436,10 +436,10 @@
|
|||
"createdAt": "ساخته شده در",
|
||||
"verified": "معتبر",
|
||||
"active": "فعال",
|
||||
"card-received": "Received",
|
||||
"card-received-on": "Received on",
|
||||
"card-end": "End",
|
||||
"card-end-on": "Ends on",
|
||||
"editCardReceivedDatePopup-title": "Change received date",
|
||||
"editCardEndDatePopup-title": "Change end date"
|
||||
"card-received": "رسیده",
|
||||
"card-received-on": "رسیده در",
|
||||
"card-end": "پایان",
|
||||
"card-end-on": "پایان در",
|
||||
"editCardReceivedDatePopup-title": "تغییر تاریخ رسید",
|
||||
"editCardEndDatePopup-title": "تغییر تاریخ پایان"
|
||||
}
|
||||
|
|
@ -436,10 +436,10 @@
|
|||
"createdAt": "Créé à",
|
||||
"verified": "Vérifié",
|
||||
"active": "Actif",
|
||||
"card-received": "Received",
|
||||
"card-received-on": "Received on",
|
||||
"card-end": "End",
|
||||
"card-end-on": "Ends on",
|
||||
"editCardReceivedDatePopup-title": "Change received date",
|
||||
"editCardEndDatePopup-title": "Change end date"
|
||||
"card-received": "Reçue",
|
||||
"card-received-on": "Reçue le",
|
||||
"card-end": "Fin",
|
||||
"card-end-on": "Se termine le",
|
||||
"editCardReceivedDatePopup-title": "Changer la date de réception",
|
||||
"editCardEndDatePopup-title": "Changer la date de fin"
|
||||
}
|
||||
|
|
@ -245,7 +245,7 @@
|
|||
"import-show-user-mapping": "Review pemetaan partisipan",
|
||||
"import-user-select": "Pilih nama pengguna yang Anda mau gunakan sebagai anggota ini",
|
||||
"importMapMembersAddPopup-title": "Pilih anggota Wekan",
|
||||
"info": "Version",
|
||||
"info": "Versi",
|
||||
"initials": "Inisial",
|
||||
"invalid-date": "Tanggal tidak sah",
|
||||
"invalid-time": "Invalid time",
|
||||
|
|
|
|||
|
|
@ -435,5 +435,11 @@
|
|||
"accounts-allowEmailChange": "Allow Email Change",
|
||||
"createdAt": "Created at",
|
||||
"verified": "Verified",
|
||||
"active": "Active"
|
||||
"active": "Active",
|
||||
"card-received": "Received",
|
||||
"card-received-on": "Received on",
|
||||
"card-end": "End",
|
||||
"card-end-on": "Ends on",
|
||||
"editCardReceivedDatePopup-title": "Change received date",
|
||||
"editCardEndDatePopup-title": "Change end date"
|
||||
}
|
||||
|
|
@ -12,7 +12,7 @@
|
|||
"act-archivedBoard": "归档看板 __board__",
|
||||
"act-archivedCard": "归档卡片 __card__",
|
||||
"act-archivedList": "归档列表 __list__",
|
||||
"act-archivedSwimlane": "archived __swimlane__",
|
||||
"act-archivedSwimlane": "归档泳道 __swimlane__",
|
||||
"act-importBoard": "导入看板 __board__",
|
||||
"act-importCard": "导入卡片 __card__",
|
||||
"act-importList": "导入列表 __list__",
|
||||
|
|
@ -69,7 +69,7 @@
|
|||
"archive-board": "归档看板",
|
||||
"archive-card": "归档卡片",
|
||||
"archive-list": "归档列表",
|
||||
"archive-swimlane": "Archive Swimlane",
|
||||
"archive-swimlane": "归档泳道图",
|
||||
"archive-selection": "归档所选内容",
|
||||
"archiveBoardPopup-title": "确定要归档看板吗?",
|
||||
"archived-items": "已归档项目",
|
||||
|
|
@ -159,9 +159,9 @@
|
|||
"confirm-checklist-delete-dialog": "确认要删除清单吗",
|
||||
"copy-card-link-to-clipboard": "复制卡片链接到剪贴板",
|
||||
"copyCardPopup-title": "复制卡片",
|
||||
"copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"copyChecklistToManyCardsPopup-title": "复制清单模板至多个卡片",
|
||||
"copyChecklistToManyCardsPopup-instructions": "以JSON格式表示目标卡片的标题和描述",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"第一个卡片的标题\", \"description\":\"第一个卡片的描述\"}, {\"title\":\"第二个卡片的标题\",\"description\":\"第二个卡片的描述\"},{\"title\":\"最后一个卡片的标题\",\"description\":\"最后一个卡片的描述\"} ]",
|
||||
"create": "创建",
|
||||
"createBoardPopup-title": "创建看板",
|
||||
"chooseBoardSourcePopup-title": "导入看板",
|
||||
|
|
@ -268,7 +268,7 @@
|
|||
"list-move-cards": "移动列表中的所有卡片",
|
||||
"list-select-cards": "选择列表中的所有卡片",
|
||||
"listActionPopup-title": "列表操作",
|
||||
"swimlaneActionPopup-title": "Swimlane Actions",
|
||||
"swimlaneActionPopup-title": "泳道图操作",
|
||||
"listImportCardPopup-title": "导入 Trello 卡片",
|
||||
"listMorePopup-title": "更多",
|
||||
"link-list": "关联到这个列表",
|
||||
|
|
@ -295,7 +295,7 @@
|
|||
"name": "名称",
|
||||
"no-archived-cards": "没有已归档的卡片",
|
||||
"no-archived-lists": "没有已归档的列表。",
|
||||
"no-archived-swimlanes": "No archived swimlanes.",
|
||||
"no-archived-swimlanes": "没有已归档的泳道图",
|
||||
"no-results": "无结果",
|
||||
"normal": "普通",
|
||||
"normal-desc": "可以创建以及编辑卡片,无法更改设置。",
|
||||
|
|
@ -331,8 +331,8 @@
|
|||
"restore": "还原",
|
||||
"save": "保存",
|
||||
"search": "搜索",
|
||||
"search-cards": "Search from card titles and descriptions on this board",
|
||||
"search-example": "Text to search for?",
|
||||
"search-cards": "搜索当前看板上的卡片标题和描述",
|
||||
"search-example": "搜索",
|
||||
"select-color": "选择颜色",
|
||||
"set-wip-limit-value": "设置此列表中的最大任务数",
|
||||
"setWipLimitPopup-title": "设置最大任务数",
|
||||
|
|
@ -378,7 +378,7 @@
|
|||
"watching": "关注",
|
||||
"watching-info": "当此看板发生变更时会通知你",
|
||||
"welcome-board": "“欢迎”看板",
|
||||
"welcome-swimlane": "Milestone 1",
|
||||
"welcome-swimlane": "里程碑 1",
|
||||
"welcome-list1": "基本",
|
||||
"welcome-list2": "高阶",
|
||||
"what-to-do": "要做什么?",
|
||||
|
|
@ -436,10 +436,10 @@
|
|||
"createdAt": "创建于",
|
||||
"verified": "已验证",
|
||||
"active": "活跃",
|
||||
"card-received": "Received",
|
||||
"card-received-on": "Received on",
|
||||
"card-end": "End",
|
||||
"card-end-on": "Ends on",
|
||||
"editCardReceivedDatePopup-title": "Change received date",
|
||||
"editCardEndDatePopup-title": "Change end date"
|
||||
"card-received": "已接收",
|
||||
"card-received-on": "接收于",
|
||||
"card-end": "终止",
|
||||
"card-end-on": "终止于",
|
||||
"editCardReceivedDatePopup-title": "修改接收日期",
|
||||
"editCardEndDatePopup-title": "修改终止日期"
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "wekan",
|
||||
"version": "0.78.0",
|
||||
"version": "0.79.0",
|
||||
"description": "The open-source Trello-like 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 = 63,
|
||||
appVersion = 64,
|
||||
# Increment this for every release.
|
||||
|
||||
appMarketingVersion = (defaultText = "0.78.0~2018-03-17"),
|
||||
appMarketingVersion = (defaultText = "0.79.0~2018-03-31"),
|
||||
# Human-readable presentation of the app version.
|
||||
|
||||
minUpgradableAppVersion = 0,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue