Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a320a71467 | ||
|
|
bda6ee26d7 | ||
|
|
40d438a517 | ||
|
|
5d2dd66450 | ||
|
|
f9539aa2a8 | ||
|
|
75512043e8 | ||
|
|
09c59ff562 | ||
|
|
e3d1fbc7f4 | ||
|
|
05f1d197f5 | ||
|
|
fe79a3e763 | ||
|
|
add5d22c4e | ||
|
|
08af6a0cf1 | ||
|
|
38a8d82735 | ||
|
|
42a4ca3678 | ||
|
|
66c20df5ba | ||
|
|
4505495762 | ||
|
|
679e50af64 | ||
|
|
2e8f8924dd | ||
|
|
5e88cb24cb | ||
|
|
023b41b205 | ||
|
|
cca4a3e372 | ||
|
|
caca2e34fc | ||
|
|
07217d0e51 | ||
|
|
80941e57d3 | ||
|
|
10f24a8a8a | ||
|
|
a7855f3f58 | ||
|
|
ac19904ee8 | ||
|
|
ec1630f8dd | ||
|
|
90f3f7ba16 | ||
|
|
5e5a5ed9be | ||
|
|
3eb6f97291 | ||
|
|
06e64d24a8 | ||
|
|
243af32fc7 | ||
|
|
ca89442f3a | ||
|
|
153960742c | ||
|
|
bf7de463f1 |
No files matched your search
@@ -131,6 +131,7 @@
|
||||
"AccountSettings": true,
|
||||
"Announcements": true,
|
||||
"Swimlanes": true,
|
||||
"ChecklistItems": true,
|
||||
"Npm": true
|
||||
}
|
||||
}
|
||||
@@ -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)*
|
||||
@@ -82,3 +82,5 @@ staringatlights:flow-router
|
||||
mixmax:smart-disconnect
|
||||
accounts-password@1.5.0
|
||||
cfs:gridfs
|
||||
browser-policy
|
||||
eluck:accounts-lockout
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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}}")
|
||||
|
||||
@@ -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');
|
||||
@@ -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
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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"
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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"
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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": "修改终止日期"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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
@@ -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}};
|
||||
},
|
||||
|
||||
@@ -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
@@ -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
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "0.78.0",
|
||||
"version": "0.80.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 = 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,
|
||||
|
||||
@@ -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
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
Reference in new issue
Block a user