Compare commits

...
36 Commits
Author SHA1 Message Date
Lauri Ojansivu a320a71467 v0.80 2018-04-04 23:26:25 +03:00
Lauri Ojansivu bda6ee26d7 Added meteor packages for security:
- browser-policy
- eluck:accounts-lockout

Thanks to xet7 !
2018-04-04 23:20:19 +03:00
Lauri Ojansivu 40d438a517 Added meteor packages for security:
- browser-policy
- eluck:accounts-lockout

Thanks to xet7 !
2018-04-04 23:18:06 +03:00
Lauri Ojansivu 5d2dd66450 - Changed icon of checklist name to unchecked
Thanks to quantazelle ! Related #1568
2018-04-04 21:49:33 +03:00
Lauri Ojansivu f9539aa2a8 Changed icon of checklist name. Related #1568 2018-04-04 21:44:53 +03:00
Lauri Ojansivu 75512043e8 Try to fix travis 2018-04-04 17:36:19 +03:00
Lauri Ojansivu 09c59ff562 Update translations. 2018-04-04 17:33:54 +03:00
Lauri Ojansivu e3d1fbc7f4 Update all from wekan-mongodb to main wekan repo docker-compose.yml file 2018-04-04 14:22:59 +03:00
Lauri Ojansivu 05f1d197f5 Remove warnings about Docker. MongoDB to 3.2.19. 2018-04-04 13:42:45 +03:00
Lauri Ojansivu fe79a3e763 Update translations. 2018-04-03 19:39:08 +03:00
Lauri Ojansivu add5d22c4e v0.79 2018-03-31 21:20:46 +03:00
Lauri Ojansivu 08af6a0cf1 Update translations. 2018-03-31 20:41:11 +03:00
Lauri Ojansivu 38a8d82735 Fix lint errors. 2018-03-31 20:29:17 +03:00
Lauri Ojansivu 42a4ca3678 Merge branch 'andresmanelli-fixDragInListsView' into devel 2018-03-31 20:04:47 +03:00
Lauri Ojansivu 66c20df5ba - Fix drag in lists view
- Set fixed width for swimlane header

Thanks to andresmanelli !

Closes #1553, closes #1546
2018-03-31 20:02:16 +03:00
Lauri Ojansivu 4505495762 Merge branch 'fixDragInListsView' of https://github.com/andresmanelli/wekan into andresmanelli-fixDragInListsView 2018-03-31 19:38:33 +03:00
Andrés Manelli 679e50af64 Fix drag in lists view 2018-03-31 13:19:14 -03:00
Andrés Manelli 2e8f8924dd Set fixed width for swimlane header 2018-03-31 13:11:22 -03:00
Lauri Ojansivu 5e88cb24cb Merge branch 'rjevnikar-additionalDates' into devel 2018-03-29 15:03:59 +03:00
Lauri Ojansivu 023b41b205 - Add Received Date and End Date. Between them is already existing Start and Due Date.
Thanks to rjevnikar !
2018-03-29 15:02:24 +03:00
Lauri Ojansivu cca4a3e372 Merge branch 'additionalDates' of https://github.com/rjevnikar/wekan into rjevnikar-additionalDates 2018-03-29 14:54:46 +03:00
Lauri Ojansivu caca2e34fc Update translations. 2018-03-29 12:31:37 +03:00
RJevnikar 07217d0e51 Add additional dates (received & end), default title of checklists to 'Checklist'
Remove translations

Add additional dates (received & end), default name checklists to Checklist
2018-03-26 20:51:24 +00:00
Lauri Ojansivu 80941e57d3 Update translations. 2018-03-21 13:48:10 +02:00
Lauri Ojansivu 10f24a8a8a Use personal license for non-commercial use only for Caddy.
Related wekan/wekan-snap#39
2018-03-21 12:41:29 +02:00
Lauri Ojansivu a7855f3f58 Merge branch 'andresmanelli-checklistItems' into devel 2018-03-20 22:58:22 +02:00
Lauri Ojansivu ac19904ee8 Checklist items sort fix, and checklist sort capability.
Thanks to andresmanelli !

Closes #876, closes #1483, closes #1237
2018-03-20 22:57:52 +02:00
Lauri Ojansivu ec1630f8dd Merge branch 'checklistItems' of https://github.com/andresmanelli/wekan into andresmanelli-checklistItems 2018-03-20 22:13:18 +02:00
Lauri Ojansivu 90f3f7ba16 Added note about no new issues about Docker. 2018-03-20 21:31:24 +02:00
Andrés Manelli 5e5a5ed9be Fix class name change when clicking check box 2018-03-19 18:49:00 -03:00
Andrés Manelli 3eb6f97291 Fix lint errors 2018-03-19 17:31:53 -03:00
Andrés Manelli 06e64d24a8 Add styling 2018-03-19 17:19:46 -03:00
Andrés Manelli 243af32fc7 Add checklist ordering capability 2018-03-19 16:47:07 -03:00
Andrés Manelli ca89442f3a Clean checklists model 2018-03-19 15:31:38 -03:00
Andrés Manelli 153960742c Fix migration. Replace old checklist-item sort algorithm. 2018-03-19 15:03:44 -03:00
Andrés Manelli bf7de463f1 Add checklist items model, migration and publication 2018-03-19 01:25:33 -03:00
71 changed files with 1042 additions and 483 deletions

No files matched your search

+1
View File
@@ -131,6 +131,7 @@
"AccountSettings": true,
"Announcements": true,
"Swimlanes": true,
"ChecklistItems": true,
"Npm": true
}
}
+4 -4
View File
@@ -1,16 +1,16 @@
## Issue
**Impacted version**: xxxx
**Server Setup Information**:
* Operating System:
* Deployment Method(tar/sandstorm/snap/docker/etc /http frontend (nginx, httpd, ...)):
* Deployment Method(snap/sandstorm/mongodb bundle):
* Http frontend (Caddy, Nginx, Apache, see config examples from Wekan GitHub wiki first):
* Node Version:
* MongoDB Version:
* ROOT_URL environment variable (Is there a subfolder?):
* ROOT_URL environment variable http(s)://(subdomain).example.com(/suburl):
**Problem description**:
- *be as explicit as you can*
- *describe the problem and its symptoms*
- *explain how to reproduce*
- *attach whatever information that can help understanding the context (screen capture, log files)*
- *attach whatever information that can help understanding the context (screen capture, log files in .zip file)*
+2
View File
@@ -82,3 +82,5 @@ staringatlights:flow-router
mixmax:smart-disconnect
accounts-password@1.5.0
cfs:gridfs
browser-policy
eluck:accounts-lockout
+5
View File
@@ -18,6 +18,10 @@ binary-heap@1.0.10
blaze@2.3.2
blaze-tools@1.0.10
boilerplate-generator@1.3.1
browser-policy@1.1.0
browser-policy-common@1.0.11
browser-policy-content@1.1.0
browser-policy-framing@1.1.0
caching-compiler@1.1.9
caching-html-compiler@1.1.2
callback-hook@1.0.10
@@ -57,6 +61,7 @@ ecmascript-runtime@0.5.0
ecmascript-runtime-client@0.5.0
ecmascript-runtime-server@0.5.0
ejson@1.1.0
eluck:accounts-lockout@0.9.0
email@1.2.3
es5-shim@4.6.15
fastclick@1.0.13
+25
View File
@@ -1,3 +1,28 @@
# v0.80 2018-04-04 Wekan release
This release adds the following new features:
- [Changed icon of checklist name to unchecked](https://github.com/wekan/wekan/pull/1559/commits/f9539aa2a8d806e5a158d1c32f74788d051d40cb);
- [Added meteor packages](https://github.com/wekan/wekan/commit/40d438a517f0d807894e04873358aecf44fa7c4d)
for security: [browser-policy](https://atmospherejs.com/meteor/browser-policy) and
[eluck:accounts-lockout](https://atmospherejs.com/eluck/accounts-lockout).
Thanks to GitHub users quantazelle and xet7 for their contributions.
# 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).
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
This release adds the following new features:
+124 -2
View File
@@ -1,4 +1,4 @@
// Edit start & due dates
// Edit received, start, due & end dates
const EditCardDate = BlazeComponent.extendComponent({
template() {
return 'editCardDate';
@@ -92,6 +92,23 @@ Template.dateBadge.helpers({
},
});
// editCardReceivedDatePopup
(class extends EditCardDate {
onCreated() {
super.onCreated();
this.data().receivedAt && this.date.set(moment(this.data().receivedAt));
}
_storeDate(date) {
this.card.setReceived(date);
}
_deleteDate() {
this.card.unsetReceived();
}
}).register('editCardReceivedDatePopup');
// editCardStartDatePopup
(class extends EditCardDate {
onCreated() {
@@ -99,6 +116,13 @@ Template.dateBadge.helpers({
this.data().startAt && this.date.set(moment(this.data().startAt));
}
onRendered() {
super.onRendered();
if (moment.isDate(this.card.receivedAt)) {
this.$('.js-datepicker').datepicker('setStartDate', this.card.receivedAt);
}
}
_storeDate(date) {
this.card.setStart(date);
}
@@ -131,8 +155,31 @@ Template.dateBadge.helpers({
}
}).register('editCardDueDatePopup');
// editCardEndDatePopup
(class extends EditCardDate {
onCreated() {
super.onCreated();
this.data().endAt && this.date.set(moment(this.data().endAt));
}
// Display start & due dates
onRendered() {
super.onRendered();
if (moment.isDate(this.card.startAt)) {
this.$('.js-datepicker').datepicker('setStartDate', this.card.startAt);
}
}
_storeDate(date) {
this.card.setEnd(date);
}
_deleteDate() {
this.card.unsetEnd();
}
}).register('editCardEndDatePopup');
// Display received, start, due & end dates
const CardDate = BlazeComponent.extendComponent({
template() {
return 'dateBadge';
@@ -161,6 +208,36 @@ const CardDate = BlazeComponent.extendComponent({
},
});
class CardReceivedDate extends CardDate {
onCreated() {
super.onCreated();
const self = this;
self.autorun(() => {
self.date.set(moment(self.data().receivedAt));
});
}
classes() {
let classes = 'received-date' + ' ';
if (this.date.get().isBefore(this.now.get(), 'minute') &&
this.now.get().isBefore(this.data().dueAt)) {
classes += 'current';
}
return classes;
}
showTitle() {
return `${TAPi18n.__('card-received-on')} ${this.date.get().format('LLLL')}`;
}
events() {
return super.events().concat({
'click .js-edit-date': Popup.open('editCardReceivedDate'),
});
}
}
CardReceivedDate.register('cardReceivedDate');
class CardStartDate extends CardDate {
onCreated() {
super.onCreated();
@@ -223,6 +300,44 @@ class CardDueDate extends CardDate {
}
CardDueDate.register('cardDueDate');
class CardEndDate extends CardDate {
onCreated() {
super.onCreated();
const self = this;
self.autorun(() => {
self.date.set(moment(self.data().endAt));
});
}
classes() {
let classes = 'end-date' + ' ';
if (this.data.dueAt.diff(this.date.get(), 'days') >= 2)
classes += 'long-overdue';
else if (this.data.dueAt.diff(this.date.get(), 'days') >= 0)
classes += 'due';
else if (this.data.dueAt.diff(this.date.get(), 'days') >= -2)
classes += 'almost-due';
return classes;
}
showTitle() {
return `${TAPi18n.__('card-end-on')} ${this.date.get().format('LLLL')}`;
}
events() {
return super.events().concat({
'click .js-edit-date': Popup.open('editCardEndDate'),
});
}
}
CardEndDate.register('cardEndDate');
(class extends CardReceivedDate {
showDate() {
return this.date.get().format('l');
}
}).register('minicardReceivedDate');
(class extends CardStartDate {
showDate() {
return this.date.get().format('l');
@@ -234,3 +349,10 @@ CardDueDate.register('cardDueDate');
return this.date.get().format('l');
}
}).register('minicardDueDate');
(class extends CardEndDate {
showDate() {
return this.date.get().format('l');
}
}).register('minicardEndDate');
+10
View File
@@ -49,6 +49,11 @@
&:hover, &.is-active
background-color: darken(#fd5d47, 7)
&.end-date
time
&::before
content: "\f253" // symbol: fa-hourglass-end
&.due-date
time
&::before
@@ -59,6 +64,11 @@
&::before
content: "\f08b" // symbol: fa-sign-out
&.received-date
time
&::before
content: "\f251" // symbol: fa-hourglass-start
time
&::before
font: normal normal normal 14px/1 FontAwesome
+33 -12
View File
@@ -17,6 +17,35 @@ template(name="cardDetails")
if archived
p.warning {{_ 'card-archived'}}
.card-details-items
.card-details-item.card-details-item-received
h3.card-details-item-title {{_ 'card-received'}}
if receivedAt
+cardReceivedDate
else
a.js-received-date {{_ 'add'}}
.card-details-item.card-details-item-start
h3.card-details-item-title {{_ 'card-start'}}
if startAt
+cardStartDate
else
a.js-start-date {{_ 'add'}}
.card-details-item.card-details-item-due
h3.card-details-item-title {{_ 'card-due'}}
if dueAt
+cardDueDate
else
a.js-due-date {{_ 'add'}}
.card-details-item.card-details-item-end
h3.card-details-item-title {{_ 'card-end'}}
if endAt
+cardEndDate
else
a.js-end-date {{_ 'add'}}
.card-details-items
.card-details-item.card-details-item-members
h3.card-details-item-title {{_ 'members'}}
@@ -36,16 +65,6 @@ template(name="cardDetails")
a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}")
i.fa.fa-plus
if startAt
.card-details-item.card-details-item-start
h3.card-details-item-title {{_ 'card-start'}}
+cardStartDate
if dueAt
.card-details-item.card-details-item-due
h3.card-details-item-title {{_ 'card-due'}}
+cardDueDate
.card-details-items
if spentTime
.card-details-item.card-details-item-spent
@@ -86,7 +105,7 @@ template(name="cardDetails")
+checklists(cardId = _id)
hr
h2
h3
i.fa.fa-paperclip
| {{_ 'attachments'}}
@@ -94,7 +113,7 @@ template(name="cardDetails")
hr
.activity-title
h2 {{ _ 'activity'}}
h3 {{ _ 'activity'}}
if currentUser.isBoardMember
.material-toggle-switch
span.toggle-switch-title {{_ 'hide-system-messages'}}
@@ -124,8 +143,10 @@ template(name="cardDetailsActionsPopup")
li: a.js-members {{_ 'card-edit-members'}}
li: a.js-labels {{_ 'card-edit-labels'}}
li: a.js-attachments {{_ 'card-edit-attachments'}}
li: a.js-received-date {{_ 'editCardReceivedDatePopup-title'}}
li: a.js-start-date {{_ 'editCardStartDatePopup-title'}}
li: a.js-due-date {{_ 'editCardDueDatePopup-title'}}
li: a.js-end-date {{_ 'editCardEndDatePopup-title'}}
li: a.js-spent-time {{_ 'editCardSpentTimePopup-title'}}
hr
ul.pop-over-list
+52
View File
@@ -1,4 +1,5 @@
const subManager = new SubsManager();
const { calculateIndexData } = Utils;
BlazeComponent.extendComponent({
mixins() {
@@ -66,6 +67,51 @@ BlazeComponent.extendComponent({
onRendered() {
if (!Utils.isMiniScreen()) this.scrollParentContainer();
const $checklistsDom = this.$('.card-checklist-items');
$checklistsDom.sortable({
tolerance: 'pointer',
helper: 'clone',
handle: '.checklist-title',
items: '.js-checklist',
placeholder: 'checklist placeholder',
distance: 7,
start(evt, ui) {
ui.placeholder.height(ui.helper.height());
EscapeActions.executeUpTo('popup-close');
},
stop(evt, ui) {
let prevChecklist = ui.item.prev('.js-checklist').get(0);
if (prevChecklist) {
prevChecklist = Blaze.getData(prevChecklist).checklist;
}
let nextChecklist = ui.item.next('.js-checklist').get(0);
if (nextChecklist) {
nextChecklist = Blaze.getData(nextChecklist).checklist;
}
const sortIndex = calculateIndexData(prevChecklist, nextChecklist, 1);
$checklistsDom.sortable('cancel');
const checklist = Blaze.getData(ui.item.get(0)).checklist;
Checklists.update(checklist._id, {
$set: {
sort: sortIndex.base,
},
});
},
});
function userIsMember() {
return Meteor.user() && Meteor.user().isBoardMember();
}
// Disable sorting if the current user is not a board member
this.autorun(() => {
if ($checklistsDom.data('sortable')) {
$checklistsDom.sortable('option', 'disabled', !userIsMember());
}
});
},
onDestroyed() {
@@ -103,6 +149,10 @@ BlazeComponent.extendComponent({
'click .js-member': Popup.open('cardMember'),
'click .js-add-members': Popup.open('cardMembers'),
'click .js-add-labels': Popup.open('cardLabels'),
'click .js-received-date': Popup.open('editCardReceivedDate'),
'click .js-start-date': Popup.open('editCardStartDate'),
'click .js-due-date': Popup.open('editCardDueDate'),
'click .js-end-date': Popup.open('editCardEndDate'),
'mouseenter .js-card-details' () {
this.parentComponent().parentComponent().showOverlay.set(true);
this.parentComponent().parentComponent().mouseHasEnterCardDetails = true;
@@ -165,8 +215,10 @@ Template.cardDetailsActionsPopup.events({
'click .js-members': Popup.open('cardMembers'),
'click .js-labels': Popup.open('cardLabels'),
'click .js-attachments': Popup.open('cardAttachments'),
'click .js-received-date': Popup.open('editCardReceivedDate'),
'click .js-start-date': Popup.open('editCardStartDate'),
'click .js-due-date': Popup.open('editCardDueDate'),
'click .js-end-date': Popup.open('editCardEndDate'),
'click .js-spent-time': Popup.open('editCardSpentTime'),
'click .js-move-card': Popup.open('moveCard'),
'click .js-copy-card': Popup.open('copyCard'),
+3 -1
View File
@@ -77,8 +77,10 @@
margin-right: 0
&.card-details-item-labels,
&.card-details-item-members,
&.card-details-item-received,
&.card-details-item-start,
&.card-details-item-due
&.card-details-item-due,
&.card-details-item-end
width: 50%
flex-shrink: 1
+21 -20
View File
@@ -1,5 +1,5 @@
template(name="checklists")
h2 {{_ 'checklists'}}
h3 {{_ 'checklists'}}
if toggleDeleteDialog.get
.board-overlay#card-details-overlay
+checklistDeleteDialog(checklist = checklistToDelete)
@@ -18,24 +18,25 @@ template(name="checklists")
| {{_ 'add-checklist'}}...
template(name="checklistDetail")
+inlinedForm(classNames="js-edit-checklist-title" checklist = checklist)
+editChecklistItemForm(checklist = checklist)
else
.checklist-title
.checkbox.fa.fa-check-square-o
if canModifyCard
a.js-delete-checklist.toggle-delete-checklist-dialog {{_ "delete"}}...
span.checklist-stat(class="{{#if checklist.isFinished}}is-finished{{/if}}") {{checklist.finishedCount}}/{{checklist.itemCount}}
if canModifyCard
h2.title.js-open-inlined-form.is-editable
+viewer
= checklist.title
else
h2.title
+viewer
.js-checklist.checklist
+inlinedForm(classNames="js-edit-checklist-title" checklist = checklist)
+editChecklistItemForm(checklist = checklist)
else
.checklist-title
.checkbox.fa.fa-square-o
if canModifyCard
a.js-delete-checklist.toggle-delete-checklist-dialog {{_ "delete"}}...
span.checklist-stat(class="{{#if checklist.isFinished}}is-finished{{/if}}") {{checklist.finishedCount}}/{{checklist.itemCount}}
if canModifyCard
h2.title.js-open-inlined-form.is-editable
+viewer
= checklist.title
+checklistItems(checklist = checklist)
else
h2.title
+viewer
= checklist.title
+checklistItems(checklist = checklist)
template(name="checklistDeleteDialog")
.js-confirm-checklist-delete
@@ -70,7 +71,7 @@ template(name="editChecklistItemForm")
template(name="checklistItems")
.checklist-items.js-checklist-items
each item in checklist.getItemsSorted
each item in checklist.items
+inlinedForm(classNames="js-edit-checklist-item" item = item checklist = checklist)
+editChecklistItemForm(type = 'item' item = item checklist = checklist)
else
@@ -84,7 +85,7 @@ template(name="checklistItems")
| {{_ 'add-checklist-item'}}...
template(name='itemDetail')
.item.js-checklist-item
.js-checklist-item.checklist-item
if canModifyCard
.check-box.materialCheckBox(class="{{#if item.isFinished }}is-checked{{/if}}")
.item-title.js-open-inlined-form.is-editable(class="{{#if item.isFinished }}is-checked{{/if}}")
+57 -53
View File
@@ -1,11 +1,14 @@
const { calculateIndexData } = Utils;
function initSorting(items) {
items.sortable({
tolerance: 'pointer',
helper: 'clone',
items: '.js-checklist-item:not(.placeholder)',
axis: 'y',
connectWith: '.js-checklist-items',
appendTo: '.board-canvas',
distance: 7,
placeholder: 'placeholder',
placeholder: 'checklist-item placeholder',
scroll: false,
start(evt, ui) {
ui.placeholder.height(ui.helper.height());
@@ -13,57 +16,54 @@ function initSorting(items) {
},
stop(evt, ui) {
const parent = ui.item.parents('.js-checklist-items');
const orderedItems = [];
parent.find('.js-checklist-item').each(function(i, item) {
const checklistItem = Blaze.getData(item).item;
orderedItems.push(checklistItem._id);
});
items.sortable('cancel');
const formerParent = ui.item.parents('.js-checklist-items');
const checklist = Blaze.getData(parent.get(0)).checklist;
const oldChecklist = Blaze.getData(formerParent.get(0)).checklist;
if (oldChecklist._id !== checklist._id) {
const currentItem = Blaze.getData(ui.item.get(0)).item;
for (let i = 0; i < orderedItems.length; i++) {
const itemId = orderedItems[i];
if (itemId !== currentItem._id) continue;
const newItem = {
_id: checklist.getNewItemId(),
title: currentItem.title,
sort: i,
isFinished: currentItem.isFinished,
};
checklist.addFullItem(newItem);
orderedItems[i] = currentItem._id;
oldChecklist.removeItem(itemId);
}
} else {
checklist.sortItems(orderedItems);
const checklistId = Blaze.getData(parent.get(0)).checklist._id;
let prevItem = ui.item.prev('.js-checklist-item').get(0);
if (prevItem) {
prevItem = Blaze.getData(prevItem).item;
}
let nextItem = ui.item.next('.js-checklist-item').get(0);
if (nextItem) {
nextItem = Blaze.getData(nextItem).item;
}
const nItems = 1;
const sortIndex = calculateIndexData(prevItem, nextItem, nItems);
const checklistDomElement = ui.item.get(0);
const checklistData = Blaze.getData(checklistDomElement);
const checklistItem = checklistData.item;
items.sortable('cancel');
checklistItem.move(checklistId, sortIndex.base);
},
});
}
Template.checklists.onRendered(function () {
const self = BlazeComponent.getComponentForElement(this.firstNode);
self.itemsDom = this.$('.card-checklist-items');
initSorting(self.itemsDom);
self.itemsDom.mousedown(function(evt) {
evt.stopPropagation();
});
BlazeComponent.extendComponent({
onRendered() {
const self = this;
self.itemsDom = this.$('.js-checklist-items');
initSorting(self.itemsDom);
self.itemsDom.mousedown(function(evt) {
evt.stopPropagation();
});
function userIsMember() {
return Meteor.user() && Meteor.user().isBoardMember();
}
// Disable sorting if the current user is not a board member
self.autorun(() => {
const $itemsDom = $(self.itemsDom);
if ($itemsDom.data('sortable')) {
$(self.itemsDom).sortable('option', 'disabled', !userIsMember());
function userIsMember() {
return Meteor.user() && Meteor.user().isBoardMember();
}
});
});
// Disable sorting if the current user is not a board member
self.autorun(() => {
const $itemsDom = $(self.itemsDom);
if ($itemsDom.data('sortable')) {
$(self.itemsDom).sortable('option', 'disabled', !userIsMember());
}
});
},
canModifyCard() {
return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
},
}).register('checklistDetail');
BlazeComponent.extendComponent({
@@ -95,7 +95,12 @@ BlazeComponent.extendComponent({
const checklist = this.currentData().checklist;
if (title) {
checklist.addItem(title);
ChecklistItems.insert({
title,
checklistId: checklist._id,
cardId: checklist.cardId,
sort: checklist.itemCount(),
});
}
// We keep the form opened, empty it.
textarea.value = '';
@@ -118,7 +123,7 @@ BlazeComponent.extendComponent({
const checklist = this.currentData().checklist;
const item = this.currentData().item;
if (checklist && item && item._id) {
checklist.removeItem(item._id);
ChecklistItems.remove(item._id);
}
},
@@ -135,9 +140,8 @@ BlazeComponent.extendComponent({
const textarea = this.find('textarea.js-edit-checklist-item');
const title = textarea.value.trim();
const itemId = this.currentData().item._id;
const checklist = this.currentData().checklist;
checklist.editItem(itemId, title);
const item = this.currentData().item;
item.setTitle(title);
},
onCreated() {
@@ -211,12 +215,12 @@ BlazeComponent.extendComponent({
const checklist = this.currentData().checklist;
const item = this.currentData().item;
if (checklist && item && item._id) {
checklist.toggleItem(item._id);
item.toggleItem();
}
},
events() {
return [{
'click .item .check-box': this.toggleItem,
'click .js-checklist-item .check-box': this.toggleItem,
}];
},
}).register('itemDetail');
+51 -25
View File
@@ -78,34 +78,60 @@ textarea.js-add-checklist-item, textarea.js-edit-checklist-item
bottom: -600px
right: 0
.checklist-items
.checklist
background: darken(white, 3%)
&.placeholder
background: darken(white, 20%)
border-radius: 2px
&.ui-sortable-helper
box-shadow: -2px 2px 8px rgba(0, 0, 0, .3),
0 0 1px rgba(0, 0, 0, .5)
transform: rotate(4deg)
cursor: grabbing
.checklist-item
margin: 0 0 0.5em 1.33em
line-height: 25px
font-size: 1.1em
margin-top: 3px
display: flex
background: darken(white, 3%)
.item
line-height: 25px
font-size: 1.1em
margin-top: 3px
display: flex
&:hover
background-color: darken(white, 8%)
&.placeholder
background: darken(white, 20%)
border-radius: 2px
.check-box
margin-top: 5px
&.is-checked
border-bottom: 2px solid #3cb500
border-right: 2px solid #3cb500
&.ui-sortable-helper
box-shadow: -2px 2px 8px rgba(0, 0, 0, .3),
0 0 1px rgba(0, 0, 0, .5)
transform: rotate(4deg)
cursor: grabbing
.item-title
flex: 1
padding-left: 10px;
&.is-checked
color: #8c8c8c
font-style: italic
&:hover
background-color: darken(white, 8%)
.js-delete-checklist-item
@extends .delete-text
padding: 12px 0 0 0
.check-box
margin-top: 5px
&.is-checked
border-bottom: 2px solid #3cb500
border-right: 2px solid #3cb500
.add-checklist-item
padding-top: 0.5em
display: inline-block
.item-title
flex: 1
padding-left: 10px;
&.is-checked
color: #8c8c8c
font-style: italic
.js-delete-checklist-item
margin: 0 0 0.5em 1.33em
@extends .delete-text
padding: 12px 0 0 0
.add-checklist-item
margin: 0 0 0.5em 1.33em
padding-top: 0.5em
display: inline-block
-13
View File
@@ -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');
+98 -74
View File
@@ -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');
+1 -1
View File
@@ -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;
+31
View File
@@ -33,6 +33,37 @@ Utils = {
return $(window).width() <= 800;
},
calculateIndexData(prevData, nextData, nItems = 1) {
let base, increment;
// If we drop the card to an empty column
if (!prevData && !nextData) {
base = 0;
increment = 1;
// If we drop the card in the first position
} else if (!prevData) {
base = nextData.sort - 1;
increment = -1;
// If we drop the card in the last position
} else if (!nextData) {
base = prevData.sort + 1;
increment = 1;
}
// In the general case take the average of the previous and next element
// sort indexes.
else {
const prevSortIndex = prevData.sort;
const nextSortIndex = nextData.sort;
increment = (nextSortIndex - prevSortIndex) / (nItems + 1);
base = prevSortIndex + increment;
}
// XXX Return a generator that yield values instead of a base with a
// increment number.
return {
base,
increment,
};
},
// Determine the new sort index
calculateIndex(prevCardDomElement, nextCardDomElement, nCards = 1) {
let base, increment;
+2 -2
View File
@@ -3,7 +3,7 @@ version: '2'
services:
wekandb:
image: mongo:3.2.18
image: mongo:3.2.19
container_name: wekan-db
restart: always
command: mongod --smallfiles --oplogSize 128
@@ -16,7 +16,7 @@ services:
- wekan-db-dump:/dump
wekan:
image: wekanteam/wekan:latest
image: quay.io/wekan/wekan
container_name: wekan-app
restart: always
networks:
+7 -1
View File
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "السماح بتغيير البريد الإلكتروني",
"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"
}
+7 -1
View File
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "Разреши промяна на имейла",
"createdAt": "Създаден на",
"verified": "Потвърден",
"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"
}
+7 -1
View File
@@ -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"
}
+7 -1
View File
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "Permet modificar correu electrònic",
"createdAt": "Creat ",
"verified": "Verificat",
"active": "Actiu"
"active": "Actiu",
"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"
}
+7 -1
View File
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "Povolit změnu Emailu",
"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"
}
+10 -4
View File
@@ -107,8 +107,8 @@
"card-delete-notice": "Löschen ist unwiderruflich. Alle Aktionen die dieser Karte zugeordnet sind werden ebenfalls gelöscht.",
"card-delete-pop": "Alle Aktionen werden vom Aktivitätsfeed entfernt und die Karte kann nicht mehr geöffnet werden. Das Löschen kann nicht widerrufen werden!",
"card-delete-suggest-archive": "Sie können eine Karte archivieren, um sie vom Board zu entfernen und die Aktivitäten zu behalten.",
"card-due": "Ende",
"card-due-on": "Ende am",
"card-due": "Fällig",
"card-due-on": "Fällig am",
"card-spent": "Aufgewendete Zeit",
"card-edit-attachments": "Anhänge ändern",
"card-edit-labels": "Labels ändern",
@@ -184,7 +184,7 @@
"edit-wip-limit": "WIP-Limit bearbeiten",
"soft-wip-limit": "Soft WIP-Limit",
"editCardStartDatePopup-title": "Startdatum ändern",
"editCardDueDatePopup-title": "Enddatum ändern",
"editCardDueDatePopup-title": "Fälligkeitsdatum ändern",
"editCardSpentTimePopup-title": "Aufgewendete Zeit ändern",
"editLabelPopup-title": "Label ändern",
"editNotificationPopup-title": "Benachrichtigung ändern",
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "Ändern der E-Mailadresse zulassen",
"createdAt": "Erstellt am",
"verified": "Geprüft",
"active": "Aktiv"
"active": "Aktiv",
"card-received": "Empfangen",
"card-received-on": "Empfangen am",
"card-end": "Ende",
"card-end-on": "Endet am",
"editCardReceivedDatePopup-title": "Empfangsdatum ändern",
"editCardEndDatePopup-title": "Enddatum ändern"
}
+7 -1
View File
@@ -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"
}
+7 -1
View File
@@ -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"
}
+7 -1
View File
@@ -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"
}
+7 -1
View File
@@ -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"
}
+7 -1
View File
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "Permitir Cambio de Email",
"createdAt": "Creado en",
"verified": "Verificado",
"active": "Activo"
"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"
}
+7 -1
View File
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "Permitir cambiar el correo electrónico",
"createdAt": "Creado en",
"verified": "Verificado",
"active": "Activo"
"active": "Activo",
"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"
}
+7 -1
View File
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "Baimendu e-mail aldaketa",
"createdAt": "Noiz sortua",
"verified": "Egiaztatuta",
"active": "Gaituta"
"active": "Gaituta",
"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"
}
+7 -1
View File
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "اجازه تغییر رایانامه",
"createdAt": "ساخته شده در",
"verified": "معتبر",
"active": "فعال"
"active": "فعال",
"card-received": "رسیده",
"card-received-on": "رسیده در",
"card-end": "پایان",
"card-end-on": "پایان در",
"editCardReceivedDatePopup-title": "تغییر تاریخ رسید",
"editCardEndDatePopup-title": "تغییر تاریخ پایان"
}
+7 -1
View File
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "Salli sähköpostiosoitteen muuttaminen",
"createdAt": "Luotu",
"verified": "Varmistettu",
"active": "Aktiivinen"
"active": "Aktiivinen",
"card-received": "Vastaanotettu",
"card-received-on": "Vastaanotettu",
"card-end": "Loppuu",
"card-end-on": "Loppuu",
"editCardReceivedDatePopup-title": "Vaihda vastaanottamispäivää",
"editCardEndDatePopup-title": "Vaihda loppumispäivää"
}
+10 -4
View File
@@ -40,7 +40,7 @@
"activity-sent": "a envoyé %s vers %s",
"activity-unjoined": "a quitté %s",
"activity-checklist-added": "a ajouté une checklist à %s",
"activity-checklist-item-added": "a ajouté une checklist à '%s' dans %s",
"activity-checklist-item-added": "a ajouté un élément à la checklist '%s' dans %s",
"add": "Ajouter",
"add-attachment": "Ajouter une pièce jointe",
"add-board": "Ajouter un tableau",
@@ -156,7 +156,7 @@
"comment-only": "Commentaire uniquement",
"comment-only-desc": "Ne peut que commenter des cartes.",
"computer": "Ordinateur",
"confirm-checklist-delete-dialog": "Êtes-vous sûr de vouloir supprimer cette checklist ?",
"confirm-checklist-delete-dialog": "Êtes-vous sûr de vouloir supprimer la checklist",
"copy-card-link-to-clipboard": "Copier le lien vers la carte dans le presse-papier",
"copyCardPopup-title": "Copier la carte",
"copyChecklistToManyCardsPopup-title": "Copier le modèle de checklist vers plusieurs cartes",
@@ -433,7 +433,13 @@
"no": "Non",
"accounts": "Comptes",
"accounts-allowEmailChange": "Autoriser le changement d'adresse mail",
"createdAt": "Créé à",
"createdAt": "Créé le",
"verified": "Vérifié",
"active": "Actif"
"active": "Actif",
"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"
}
+7 -1
View File
@@ -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"
}
+7 -1
View File
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "אפשר שינוי דוא\"ל",
"createdAt": "נוצר ב",
"verified": "עבר אימות",
"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"
}
+9 -3
View File
@@ -331,8 +331,8 @@
"restore": "Visszaállítás",
"save": "Mentés",
"search": "Keresés",
"search-cards": "Search from card titles and descriptions on this board",
"search-example": "Text to search for?",
"search-cards": "Keresés a táblán lévő kártyák címében illetve leírásában",
"search-example": "keresőkifejezés",
"select-color": "Szín kiválasztása",
"set-wip-limit-value": "Korlát beállítása a listán lévő feladatok legnagyobb számához",
"setWipLimitPopup-title": "WIP korlát beállítása",
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "E-mail megváltoztatásának engedélyezése",
"createdAt": "Létrehozva",
"verified": "Ellenőrizve",
"active": "Aktív"
"active": "Aktív",
"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"
}
+7 -1
View File
@@ -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"
}
+8 -2
View File
@@ -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"
}
+7 -1
View File
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "Allow Email Change",
"createdAt": "Ekere na",
"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"
}
+7 -1
View File
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "Permetti modifica dell'email",
"createdAt": "creato alle",
"verified": "Verificato",
"active": "Attivo"
"active": "Attivo",
"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"
}
+7 -1
View File
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "メールアドレスの変更を許可",
"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"
}
+7 -1
View File
@@ -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"
}
+7 -1
View File
@@ -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"
}
+7 -1
View File
@@ -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"
}
+7 -1
View File
@@ -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"
}
+35 -29
View File
@@ -5,22 +5,22 @@
"act-addChecklist": "__checklist__ toegevoegd aan __card__",
"act-addChecklistItem": "__checklistItem__ aan checklist toegevoegd aan __checklist__ op __card__",
"act-addComment": "gereageerd op __card__:__comment__",
"act-createBoard": "aangemaakte__bord__",
"act-createCard": "toegevoegd__kaart__aan__lijst__",
"act-createList": "toegevoegd__lijst__aan_bord__",
"act-addBoardMember": "__member__to__board__ toegevoegd",
"act-archivedBoard": "gearchiveerd __board__",
"act-archivedCard": "gearchiveerd __card__",
"act-archivedList": "gearchiveerd __list__",
"act-archivedSwimlane": "archived __swimlane__",
"act-createBoard": "aangemaakte __bord__",
"act-createCard": "toegevoegd __kaart__ aan __lijst__",
"act-createList": "toegevoegd __lijst__ aan __bord__",
"act-addBoardMember": "__member__ aan __board__ toegevoegd",
"act-archivedBoard": "__board__ gearchiveerd",
"act-archivedCard": "__card__ gearchiveerd",
"act-archivedList": "__list__ gearchiveerd",
"act-archivedSwimlane": "__swimlane__ gearchiveerd",
"act-importBoard": " __board__ geïmporteerd",
"act-importCard": "__card__ geimporteerd",
"act-importList": "__list__ geimporteerd",
"act-joinMember": "toegevoegd __member__to__card__",
"act-moveCard": "verplaatst __card__from__oldList__to__list__",
"act-removeBoardMember": "verwijderd __member__from__board__",
"act-restoredCard": "hersteld __card__to__board__",
"act-unjoinMember": "verwijderd __member__from__card__",
"act-importCard": "__card__ geïmporteerd",
"act-importList": "__list__ geïmporteerd",
"act-joinMember": "__member__ aan __card__ toegevoegd",
"act-moveCard": "verplaatst __card__ van __oldList__ naar __list__",
"act-removeBoardMember": "verwijderd __member__ van __board__",
"act-restoredCard": "hersteld __card__ naar __board__",
"act-unjoinMember": "verwijderd __member__ van __card__",
"act-withBoardTitle": "[Wekan] __board__",
"act-withCardTitle": "[__board__] __card__",
"actions": "Acties",
@@ -45,7 +45,7 @@
"add-attachment": "Voeg Bijlage Toe",
"add-board": "Voeg Bord Toe",
"add-card": "Voeg Kaart Toe",
"add-swimlane": "Add Swimlane",
"add-swimlane": "Swimlane Toevoegen",
"add-checklist": "Voeg Checklist Toe",
"add-checklist-item": "Voeg item toe aan checklist",
"add-cover": "Voeg Cover Toe",
@@ -69,7 +69,7 @@
"archive-board": "Archiveer Bord",
"archive-card": "Archiveer Kaart",
"archive-list": "Archiveer Lijst",
"archive-swimlane": "Archive Swimlane",
"archive-swimlane": "Swimlane Archiveren",
"archive-selection": "Archiveer Selectie",
"archiveBoardPopup-title": "Archiveer Bord?",
"archived-items": "Gearchiveerde Items",
@@ -97,7 +97,7 @@
"boardChangeWatchPopup-title": "Verander naar 'Watch'",
"boardMenuPopup-title": "Bord menu",
"boards": "Borden",
"board-view": "Board View",
"board-view": "Bord overzicht",
"board-view-swimlanes": "Swimlanes",
"board-view-lists": "Lijsten",
"bucket-example": "Zoals \"Bucket List\" bijvoorbeeld",
@@ -159,9 +159,9 @@
"confirm-checklist-delete-dialog": "Weet u zeker dat u de checklist wilt verwijderen",
"copy-card-link-to-clipboard": "Kopieer kaart link naar klembord",
"copyCardPopup-title": "Kopieer kaart",
"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": "Checklist sjabloon kopiëren naar meerdere kaarten",
"copyChecklistToManyCardsPopup-instructions": "Doel kaart titels en omschrijvingen in dit JSON formaat",
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Titel eerste kaart\", \"description\":\"Omschrijving eerste kaart\"}, {\"title\":\"Titel tweede kaart\",\"description\":\"Omschrijving tweede kaart\"},{\"title\":\"Titel laatste kaart\",\"description\":\"Omschrijving laatste kaart\"} ]",
"create": "Aanmaken",
"createBoardPopup-title": "Bord aanmaken",
"chooseBoardSourcePopup-title": "Importeer bord",
@@ -268,7 +268,7 @@
"list-move-cards": "Verplaats alle kaarten in deze lijst",
"list-select-cards": "Selecteer alle kaarten in deze lijst",
"listActionPopup-title": "Lijst acties",
"swimlaneActionPopup-title": "Swimlane Actions",
"swimlaneActionPopup-title": "Swimlane handelingen",
"listImportCardPopup-title": "Importeer een Trello kaart",
"listMorePopup-title": "Meer",
"link-list": "Link naar deze lijst",
@@ -280,7 +280,7 @@
"log-in": "Inloggen",
"loginPopup-title": "Inloggen",
"memberMenuPopup-title": "Instellingen van leden",
"members": "Lede",
"members": "Leden",
"menu": "Menu",
"move-selection": "Verplaats selectie",
"moveCardPopup-title": "Verplaats kaart",
@@ -295,7 +295,7 @@
"name": "Naam",
"no-archived-cards": "Geen gearchiveerde kaarten.",
"no-archived-lists": "Geen gearchiveerde lijsten.",
"no-archived-swimlanes": "No archived swimlanes.",
"no-archived-swimlanes": "Geen gearchiveerde swimlanes.",
"no-results": "Geen resultaten",
"normal": "Normaal",
"normal-desc": "Kan de kaarten zien en wijzigen. Kan de instellingen niet wijzigen.",
@@ -331,8 +331,8 @@
"restore": "Herstel",
"save": "Opslaan",
"search": "Zoek",
"search-cards": "Search from card titles and descriptions on this board",
"search-example": "Text to search for?",
"search-cards": "Zoeken in kaart titels en omschrijvingen op dit bord",
"search-example": "Tekst om naar te zoeken?",
"select-color": "Selecteer kleur",
"set-wip-limit-value": "Zet een limiet voor het maximaal aantal taken in deze lijst",
"setWipLimitPopup-title": "Zet een WIP limiet",
@@ -360,7 +360,7 @@
"overtime-hours": "Overwerk (in uren)",
"overtime": "Overwerk",
"has-overtime-cards": "Heeft kaarten met overwerk",
"has-spenttime-cards": "Has spent time cards",
"has-spenttime-cards": "Heeft tijd besteed aan kaarten",
"time": "Tijd",
"title": "Titel",
"tracking": "Volgen",
@@ -378,7 +378,7 @@
"watching": "Bekijken",
"watching-info": "Je zal op de hoogte worden gesteld als er een verandering gebeurt op dit bord.",
"welcome-board": "Welkom Bord",
"welcome-swimlane": "Milestone 1",
"welcome-swimlane": "Mijlpaal 1",
"welcome-list1": "Basis",
"welcome-list2": "Geadvanceerd",
"what-to-do": "Wat wil je doen?",
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "Sta E-mailadres wijzigingen toe",
"createdAt": "Gemaakt op",
"verified": "Geverifieerd",
"active": "Actief"
"active": "Actief",
"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"
}
+10 -4
View File
@@ -1,9 +1,9 @@
{
"accept": "Akceptuj",
"act-activity-notify": "[Wekan] Activity Notification",
"act-activity-notify": "[Wekan] Powiadomienia - aktywności",
"act-addAttachment": "attached __attachment__ to __card__",
"act-addChecklist": "added checklist __checklist__ to __card__",
"act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
"act-addChecklist": "dodano listę zadań __checklist__ to __card__",
"act-addChecklistItem": "dodano __checklistItem__ do listy zadań __checklist__ na karcie __card__",
"act-addComment": "commented on __card__: __comment__",
"act-createBoard": "created __board__",
"act-createCard": "added __card__ to __list__",
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "Zezwól na zmianę adresu email",
"createdAt": "Stworzono o",
"verified": "Zweryfikowane",
"active": "Aktywny"
"active": "Aktywny",
"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"
}
+14 -8
View File
@@ -97,7 +97,7 @@
"boardChangeWatchPopup-title": "Alterar observação",
"boardMenuPopup-title": "Menu do Quadro",
"boards": "Quadros",
"board-view": "Board View",
"board-view": "Visão de quadro",
"board-view-swimlanes": "Swimlanes",
"board-view-lists": "Listas",
"bucket-example": "\"Bucket List\", por exemplo",
@@ -159,9 +159,9 @@
"confirm-checklist-delete-dialog": "Tem a certeza de que pretende eliminar lista de verificação",
"copy-card-link-to-clipboard": "Copiar link do cartão para a área de transferência",
"copyCardPopup-title": "Copiar o cartão",
"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": "Copiar modelo de checklist para vários cartões",
"copyChecklistToManyCardsPopup-instructions": "Títulos e descrições do cartão de destino neste formato JSON",
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Título do primeiro cartão\", \"description\":\"Descrição do primeiro cartão\"}, {\"title\":\"Título do segundo cartão\",\"description\":\"Descrição do segundo cartão\"},{\"title\":\"Título do último cartão\",\"description\":\"Descrição do último cartão\"} ]",
"create": "Criar",
"createBoardPopup-title": "Criar Quadro",
"chooseBoardSourcePopup-title": "Importar quadro",
@@ -182,7 +182,7 @@
"edit-avatar": "Alterar Avatar",
"edit-profile": "Editar Perfil",
"edit-wip-limit": "Editar Limite WIP",
"soft-wip-limit": "Soft WIP Limit",
"soft-wip-limit": "Limite de WIP",
"editCardStartDatePopup-title": "Altera data de início",
"editCardDueDatePopup-title": "Altera data fim",
"editCardSpentTimePopup-title": "Editar tempo gasto",
@@ -331,8 +331,8 @@
"restore": "Restaurar",
"save": "Salvar",
"search": "Buscar",
"search-cards": "Search from card titles and descriptions on this board",
"search-example": "Text to search for?",
"search-cards": "Pesquisa em títulos e descrições de cartões neste quadro",
"search-example": "Texto para procurar",
"select-color": "Selecionar Cor",
"set-wip-limit-value": "Defina um limite máximo para o número de tarefas nesta lista",
"setWipLimitPopup-title": "Definir Limite WIP",
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "Permitir Mudança de Email",
"createdAt": "Criado em",
"verified": "Verificado",
"active": "Ativo"
"active": "Ativo",
"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"
}
+7 -1
View File
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "Allow Email Change",
"createdAt": "Created at",
"verified": "Verificado",
"active": "Ativo"
"active": "Ativo",
"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"
}
+7 -1
View File
@@ -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 -6
View File
@@ -107,15 +107,15 @@
"card-delete-notice": "Это действие невозможно будет отменить. Все изменения, которые вы вносили в карточку будут потеряны.",
"card-delete-pop": "Все действия будут удалены из ленты активности участников и вы не сможете заново открыть карточку. Действие необратимо",
"card-delete-suggest-archive": "Вы можете заархивировать карточку, чтобы убрать ее с доски, сохранив всю историю действий участников.",
"card-due": "До",
"card-due-on": "Завершить до",
"card-due": "Выполнить к",
"card-due-on": "Выполнить до",
"card-spent": "Затраченное время",
"card-edit-attachments": "Изменить вложения",
"card-edit-labels": "Изменить метку",
"card-edit-members": "Изменить участников",
"card-labels-title": "Изменить метки для этой карточки.",
"card-members-title": "Добавить или удалить с карточки участников доски.",
"card-start": "Начать",
"card-start": "Начало",
"card-start-on": "Начнётся с",
"cardAttachmentsPopup-title": "Прикрепить из",
"cardDeletePopup-title": "Удалить карточку?",
@@ -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": "Задать лимит на кол-во задач",
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "Разрешить изменение электронной почты",
"createdAt": "Создано на",
"verified": "Проверено",
"active": "Действующий"
"active": "Действующий",
"card-received": "Получено",
"card-received-on": "Получено с",
"card-end": "Завершение",
"card-end-on": "Завершится до",
"editCardReceivedDatePopup-title": "Изменить дату получения",
"editCardEndDatePopup-title": "Изменить дату завершения"
}
+7 -1
View File
@@ -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"
}
+7 -1
View File
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "Tillåt e-poständring",
"createdAt": "Skapad vid",
"verified": "Verifierad",
"active": "Aktiv"
"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"
}
+7 -1
View File
@@ -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"
}
+7 -1
View File
@@ -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"
}
+7 -1
View File
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "E-posta Değiştirmeye İzin Ver",
"createdAt": "Oluşturulma tarihi",
"verified": "Doğrulanmış",
"active": "Aktif"
"active": "Aktif",
"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"
}
+7 -1
View File
@@ -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"
}
+7 -1
View File
@@ -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"
}
+17 -11
View File
@@ -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": "要做什么?",
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "允许邮箱变更",
"createdAt": "创建于",
"verified": "已验证",
"active": "活跃"
"active": "活跃",
"card-received": "已接收",
"card-received-on": "接收于",
"card-end": "终止",
"card-end-on": "终止于",
"editCardReceivedDatePopup-title": "修改接收日期",
"editCardEndDatePopup-title": "修改终止日期"
}
+7 -1
View File
@@ -435,5 +435,11 @@
"accounts-allowEmailChange": "准許變更電子信箱",
"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"
}
+1 -1
View File
@@ -42,7 +42,7 @@ Activities.helpers({
return Checklists.findOne(this.checklistId);
},
checklistItem() {
return Checklists.findOne(this.checklistId).getItem(this.checklistItemId);
return ChecklistItems.findOne(this.checklistItemId);
},
});
+25 -1
View File
@@ -59,6 +59,10 @@ Cards.attachSchema(new SimpleSchema({
type: [String],
optional: true,
},
receivedAt: {
type: Date,
optional: true,
},
startAt: {
type: Date,
optional: true,
@@ -67,6 +71,10 @@ Cards.attachSchema(new SimpleSchema({
type: Date,
optional: true,
},
endAt: {
type: Date,
optional: true,
},
spentTime: {
type: Number,
decimal: true,
@@ -155,7 +163,7 @@ Cards.helpers({
},
checklists() {
return Checklists.find({cardId: this._id}, {sort: {createdAt: 1}});
return Checklists.find({cardId: this._id}, {sort: { sort: 1 } });
},
checklistItemCount() {
@@ -271,6 +279,14 @@ Cards.mutations({
return {$unset: {coverId: ''}};
},
setReceived(receivedAt) {
return {$set: {receivedAt}};
},
unsetReceived() {
return {$unset: {receivedAt: ''}};
},
setStart(startAt) {
return {$set: {startAt}};
},
@@ -287,6 +303,14 @@ Cards.mutations({
return {$unset: {dueAt: ''}};
},
setEnd(endAt) {
return {$set: {endAt}};
},
unsetEnd() {
return {$unset: {endAt: ''}};
},
setOvertime(isOvertime) {
return {$set: {isOvertime}};
},
+95
View File
@@ -0,0 +1,95 @@
ChecklistItems = new Mongo.Collection('checklistItems');
ChecklistItems.attachSchema(new SimpleSchema({
title: {
type: String,
},
sort: {
type: Number,
decimal: true,
},
isFinished: {
type: Boolean,
defaultValue: false,
},
checklistId: {
type: String,
},
cardId: {
type: String,
},
}));
ChecklistItems.allow({
insert(userId, doc) {
return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
},
update(userId, doc) {
return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
},
remove(userId, doc) {
return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId));
},
fetch: ['userId', 'cardId'],
});
ChecklistItems.before.insert((userId, doc) => {
if (!doc.userId) {
doc.userId = userId;
}
});
// Mutations
ChecklistItems.mutations({
setTitle(title) {
return { $set: { title } };
},
toggleItem() {
return { $set: { isFinished: !this.isFinished } };
},
move(checklistId, sortIndex) {
const cardId = Checklists.findOne(checklistId).cardId;
const mutatedFields = {
cardId,
checklistId,
sort: sortIndex,
};
return {$set: mutatedFields};
},
});
// Activities helper
function itemCreation(userId, doc) {
const card = Cards.findOne(doc.cardId);
const boardId = card.boardId;
Activities.insert({
userId,
activityType: 'addChecklistItem',
cardId: doc.cardId,
boardId,
checklistId: doc.checklistId,
checklistItemId: doc._id,
});
}
function itemRemover(userId, doc) {
Activities.remove({
checklistItemId: doc._id,
});
}
// Activities
if (Meteor.isServer) {
Meteor.startup(() => {
ChecklistItems._collection._ensureIndex({ checklistId: 1 });
});
ChecklistItems.after.insert((userId, doc) => {
itemCreation(userId, doc);
});
ChecklistItems.after.remove((userId, doc) => {
itemRemover(userId, doc);
});
}
+10 -163
View File
@@ -6,24 +6,7 @@ Checklists.attachSchema(new SimpleSchema({
},
title: {
type: String,
},
items: {
type: [Object],
defaultValue: [],
},
'items.$._id': {
type: String,
},
'items.$.title': {
type: String,
},
'items.$.sort': {
type: Number,
decimal: true,
},
'items.$.isFinished': {
type: Boolean,
defaultValue: false,
defaultValue: 'Checklist',
},
finishedAt: {
type: Date,
@@ -46,40 +29,28 @@ Checklists.attachSchema(new SimpleSchema({
},
}));
const self = Checklists;
Checklists.helpers({
itemCount() {
return this.items.length;
return ChecklistItems.find({ checklistId: this._id }).count();
},
getItemsSorted() {
return _.sortBy(this.items, 'sort');
items() {
return ChecklistItems.find(Filter.mongoSelector({
checklistId: this._id,
}), { sort: ['sort'] });
},
finishedCount() {
return this.items.filter((item) => {
return item.isFinished;
}).length;
return ChecklistItems.find({
checklistId: this._id,
isFinished: true,
}).count();
},
isFinished() {
return 0 !== this.itemCount() && this.itemCount() === this.finishedCount();
},
getItem(_id) {
return _.findWhere(this.items, { _id });
},
itemIndex(itemId) {
const items = self.findOne({_id : this._id}).items;
return _.pluck(items, '_id').indexOf(itemId);
},
getNewItemId() {
const itemCount = this.itemCount();
let idx = 0;
if (itemCount > 0) {
const lastId = this.items[itemCount - 1]._id;
const lastIdSuffix = lastId.substr(this._id.length);
idx = parseInt(lastIdSuffix, 10) + 1;
}
return `${this._id}${idx}`;
},
});
Checklists.allow({
@@ -103,108 +74,9 @@ Checklists.before.insert((userId, doc) => {
});
Checklists.mutations({
//for checklist itself
setTitle(title) {
return { $set: { title } };
},
//for items in checklist
addItem(title) {
const _id = this.getNewItemId();
return {
$addToSet: {
items: {
_id, title,
isFinished: false,
sort: this.itemCount(),
},
},
};
},
addFullItem(item) {
const itemsUpdate = {};
this.items.forEach(function(iterItem, index) {
if (iterItem.sort >= item.sort) {
itemsUpdate[`items.${index}.sort`] = iterItem.sort + 1;
}
});
if (!_.isEmpty(itemsUpdate)) {
self.direct.update({ _id: this._id }, { $set: itemsUpdate });
}
return { $addToSet: { items: item } };
},
removeItem(itemId) {
const item = this.getItem(itemId);
const itemsUpdate = {};
this.items.forEach(function(iterItem, index) {
if (iterItem.sort > item.sort) {
itemsUpdate[`items.${index}.sort`] = iterItem.sort - 1;
}
});
if (!_.isEmpty(itemsUpdate)) {
self.direct.update({ _id: this._id }, { $set: itemsUpdate });
}
return { $pull: { items: { _id: itemId } } };
},
editItem(itemId, title) {
if (this.getItem(itemId)) {
const itemIndex = this.itemIndex(itemId);
return {
$set: {
[`items.${itemIndex}.title`]: title,
},
};
}
return {};
},
finishItem(itemId) {
if (this.getItem(itemId)) {
const itemIndex = this.itemIndex(itemId);
return {
$set: {
[`items.${itemIndex}.isFinished`]: true,
},
};
}
return {};
},
resumeItem(itemId) {
if (this.getItem(itemId)) {
const itemIndex = this.itemIndex(itemId);
return {
$set: {
[`items.${itemIndex}.isFinished`]: false,
},
};
}
return {};
},
toggleItem(itemId) {
const item = this.getItem(itemId);
if (item) {
const itemIndex = this.itemIndex(itemId);
return {
$set: {
[`items.${itemIndex}.isFinished`]: !item.isFinished,
},
};
}
return {};
},
sortItems(itemIDs) {
const validItems = [];
itemIDs.forEach((itemID) => {
if (this.getItem(itemID)) {
validItems.push(this.itemIndex(itemID));
}
});
const modifiedValues = {};
for (let i = 0; i < validItems.length; i++) {
modifiedValues[`items.${validItems[i]}.sort`] = i;
}
return {
$set: modifiedValues,
};
},
});
if (Meteor.isServer) {
@@ -222,30 +94,6 @@ if (Meteor.isServer) {
});
});
//TODO: so there will be no activity for adding item into checklist, maybe will be implemented in the future.
// The future is now
Checklists.after.update((userId, doc, fieldNames, modifier) => {
if (fieldNames.includes('items')) {
if (modifier.$addToSet) {
Activities.insert({
userId,
activityType: 'addChecklistItem',
cardId: doc.cardId,
boardId: Cards.findOne(doc.cardId).boardId,
checklistId: doc._id,
checklistItemId: modifier.$addToSet.items._id,
});
} else if (modifier.$pull) {
const activity = Activities.findOne({
checklistItemId: modifier.$pull.items._id,
});
if (activity) {
Activities.remove(activity._id);
}
}
}
});
Checklists.before.remove((userId, doc) => {
const activities = Activities.find({ checklistId: doc._id });
if (activities) {
@@ -256,7 +104,6 @@ if (Meteor.isServer) {
});
}
//CARD COMMENT REST API
if (Meteor.isServer) {
JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists', function (req, res) {
try {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "0.78.0",
"version": "0.80.0",
"description": "The open-source Trello-like kanban",
"private": true,
"scripts": {
+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 = 63,
appVersion = 65,
# Increment this for every release.
appMarketingVersion = (defaultText = "0.78.0~2018-03-17"),
appMarketingVersion = (defaultText = "0.80.0~2018-04-04"),
# Human-readable presentation of the app version.
minUpgradableAppVersion = 0,
+21
View File
@@ -187,3 +187,24 @@ Migrations.add('add-views', () => {
}
});
});
Migrations.add('add-checklist-items', () => {
Checklists.find().forEach((checklist) => {
// Create new items
_.sortBy(checklist.items, 'sort').forEach((item, index) => {
ChecklistItems.direct.insert({
title: item.title,
sort: index,
isFinished: item.isFinished,
checklistId: checklist._id,
cardId: checklist.cardId,
});
});
// Delete old ones
Checklists.direct.update({ _id: checklist._id },
{ $unset: { items : 1 } },
noValidate
);
});
});
+1
View File
@@ -101,6 +101,7 @@ Meteor.publishRelations('board', function(boardId) {
this.cursor(CardComments.find({ cardId }));
this.cursor(Attachments.find({ cardId }));
this.cursor(Checklists.find({ cardId }));
this.cursor(ChecklistItems.find({ cardId }));
});
if (board.members) {
+1 -1
View File
@@ -40,7 +40,7 @@ DESCRIPTION_DISABLE_MONGODB="Disable mongodb service: use only if binding to dat
DEFAULT_DISABLE_MONGODB="false"
KEY_DISABLE_MONGODB="disable-mongodb"
DESCRIPTION_CADDY_ENABLED="Enable caddy service (caddy - Every Site on HTTPS). Set to 'true' to enable caddy\n\t\tcaddy settings are handled through $SNAP_COMMON/Caddyfile"
DESCRIPTION_CADDY_ENABLED="Enable caddy service (caddy - Every Site on HTTPS) personal license for non-commercial use only, see https://caddyserver.com/products/licenses . Set to 'true' to enable caddy\n\t\tcaddy settings are handled through $SNAP_COMMON/Caddyfile"
DEFAULT_CADDY_ENABLED="false"
KEY_CADDY_ENABLED="caddy-enabled"
+2 -2
View File
@@ -65,7 +65,7 @@ apps:
parts:
mongodb:
source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-3.2.18.tgz
source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-3.2.19.tgz
plugin: dump
stage-packages: [libssl1.0.0]
filesets:
@@ -140,7 +140,7 @@ parts:
caddy:
plugin: dump
source: https://caddyserver.com/download/linux/amd64?plugins=
source: https://caddyserver.com/download/linux/amd64?license=personal&plugins=
source-type: tar
organize:
caddy: bin/caddy