Add two way binding of card/board times

This commit is contained in:
Andrés Manelli 2018-04-17 23:17:44 -03:00
parent 0a62089df0
commit 724d26379c
7 changed files with 250 additions and 52 deletions

View file

@ -96,7 +96,7 @@ Template.dateBadge.helpers({
(class extends DatePicker { (class extends DatePicker {
onCreated() { onCreated() {
super.onCreated(); super.onCreated();
this.data().receivedAt && this.date.set(moment(this.data().receivedAt)); this.data().getReceived() && this.date.set(moment(this.data().getReceived()));
} }
_storeDate(date) { _storeDate(date) {
@ -104,7 +104,7 @@ Template.dateBadge.helpers({
} }
_deleteDate() { _deleteDate() {
this.card.unsetReceived(); this.card.setReceived(null);
} }
}).register('editCardReceivedDatePopup'); }).register('editCardReceivedDatePopup');
@ -113,13 +113,13 @@ Template.dateBadge.helpers({
(class extends DatePicker { (class extends DatePicker {
onCreated() { onCreated() {
super.onCreated(); super.onCreated();
this.data().startAt && this.date.set(moment(this.data().startAt)); this.data().getStart() && this.date.set(moment(this.data().getStart()));
} }
onRendered() { onRendered() {
super.onRendered(); super.onRendered();
if (moment.isDate(this.card.receivedAt)) { if (moment.isDate(this.card.getReceived())) {
this.$('.js-datepicker').datepicker('setStartDate', this.card.receivedAt); this.$('.js-datepicker').datepicker('setStartDate', this.card.getReceived());
} }
} }
@ -128,7 +128,7 @@ Template.dateBadge.helpers({
} }
_deleteDate() { _deleteDate() {
this.card.unsetStart(); this.card.setStart(null);
} }
}).register('editCardStartDatePopup'); }).register('editCardStartDatePopup');
@ -136,13 +136,13 @@ Template.dateBadge.helpers({
(class extends DatePicker { (class extends DatePicker {
onCreated() { onCreated() {
super.onCreated(); super.onCreated();
this.data().dueAt && this.date.set(moment(this.data().dueAt)); this.data().getDue() && this.date.set(moment(this.data().getDue()));
} }
onRendered() { onRendered() {
super.onRendered(); super.onRendered();
if (moment.isDate(this.card.startAt)) { if (moment.isDate(this.card.getStart())) {
this.$('.js-datepicker').datepicker('setStartDate', this.card.startAt); this.$('.js-datepicker').datepicker('setStartDate', this.card.getStart());
} }
} }
@ -151,7 +151,7 @@ Template.dateBadge.helpers({
} }
_deleteDate() { _deleteDate() {
this.card.unsetDue(); this.card.setDue(null);
} }
}).register('editCardDueDatePopup'); }).register('editCardDueDatePopup');
@ -159,13 +159,13 @@ Template.dateBadge.helpers({
(class extends DatePicker { (class extends DatePicker {
onCreated() { onCreated() {
super.onCreated(); super.onCreated();
this.data().endAt && this.date.set(moment(this.data().endAt)); this.data().getEnd() && this.date.set(moment(this.data().getEnd()));
} }
onRendered() { onRendered() {
super.onRendered(); super.onRendered();
if (moment.isDate(this.card.startAt)) { if (moment.isDate(this.card.getStart())) {
this.$('.js-datepicker').datepicker('setStartDate', this.card.startAt); this.$('.js-datepicker').datepicker('setStartDate', this.card.getStart());
} }
} }
@ -174,7 +174,7 @@ Template.dateBadge.helpers({
} }
_deleteDate() { _deleteDate() {
this.card.unsetEnd(); this.card.setEnd(null);
} }
}).register('editCardEndDatePopup'); }).register('editCardEndDatePopup');
@ -213,15 +213,15 @@ class CardReceivedDate extends CardDate {
super.onCreated(); super.onCreated();
const self = this; const self = this;
self.autorun(() => { self.autorun(() => {
self.date.set(moment(self.data().receivedAt)); self.date.set(moment(self.data().getReceived()));
}); });
} }
classes() { classes() {
let classes = 'received-date '; let classes = 'received-date ';
const dueAt = this.data().dueAt; const dueAt = this.data().getDue();
const endAt = this.data().endAt; const endAt = this.data().getEnd();
const startAt = this.data().startAt; const startAt = this.data().getStart();
const theDate = this.date.get(); const theDate = this.date.get();
// if dueAt, endAt and startAt exist & are > receivedAt, receivedAt doesn't need to be flagged // if dueAt, endAt and startAt exist & are > receivedAt, receivedAt doesn't need to be flagged
if (((startAt) && (theDate.isAfter(dueAt))) || if (((startAt) && (theDate.isAfter(dueAt))) ||
@ -250,12 +250,13 @@ class CardStartDate extends CardDate {
super.onCreated(); super.onCreated();
const self = this; const self = this;
self.autorun(() => { self.autorun(() => {
self.date.set(moment(self.data().startAt)); self.date.set(moment(self.data().getStart()));
}); });
} }
classes() { classes() {
let classes = 'start-date' + ' '; let classes = 'start-date' + ' ';
<<<<<<< HEAD
const dueAt = this.data().dueAt; const dueAt = this.data().dueAt;
const endAt = this.data().endAt; const endAt = this.data().endAt;
const theDate = this.date.get(); const theDate = this.date.get();
@ -267,6 +268,10 @@ class CardStartDate extends CardDate {
else if (theDate.isBefore(now, 'minute')) else if (theDate.isBefore(now, 'minute'))
classes += 'almost-due'; classes += 'almost-due';
else else
=======
if (this.date.get().isBefore(this.now.get(), 'minute') &&
this.now.get().isBefore(this.data().getDue())) {
>>>>>>> Add two way binding of card/board times
classes += 'current'; classes += 'current';
return classes; return classes;
} }
@ -288,7 +293,7 @@ class CardDueDate extends CardDate {
super.onCreated(); super.onCreated();
const self = this; const self = this;
self.autorun(() => { self.autorun(() => {
self.date.set(moment(self.data().dueAt)); self.date.set(moment(self.data().getDue()));
}); });
} }
@ -330,12 +335,13 @@ class CardEndDate extends CardDate {
super.onCreated(); super.onCreated();
const self = this; const self = this;
self.autorun(() => { self.autorun(() => {
self.date.set(moment(self.data().endAt)); self.date.set(moment(self.data().getEnd()));
}); });
} }
classes() { classes() {
let classes = 'end-date' + ' '; let classes = 'end-date' + ' ';
<<<<<<< HEAD
const dueAt = this.data.dueAt; const dueAt = this.data.dueAt;
const theDate = this.date.get(); const theDate = this.date.get();
// if dueAt exists & is after endAt, endAt doesn't need to be flagged // if dueAt exists & is after endAt, endAt doesn't need to be flagged
@ -343,6 +349,14 @@ class CardEndDate extends CardDate {
classes += 'long-overdue'; classes += 'long-overdue';
else else
classes += 'current'; classes += 'current';
=======
if (this.date.get().diff(this.data().getDue(), 'days') >= 2)
classes += 'long-overdue';
else if (this.date.get().diff(this.data().getDue(), 'days') >= 0)
classes += 'due';
else if (this.date.get().diff(this.data().getDue(), 'days') >= -2)
classes += 'almost-due';
>>>>>>> Add two way binding of card/board times
return classes; return classes;
} }

View file

@ -26,21 +26,28 @@ template(name="cardDetails")
.card-details-items .card-details-items
.card-details-item.card-details-item-received .card-details-item.card-details-item-received
h3.card-details-item-title {{_ 'card-received'}} h3.card-details-item-title {{_ 'card-received'}}
if receivedAt if getReceived
+cardReceivedDate +cardReceivedDate
else else
a.js-received-date {{_ 'add'}} a.js-received-date {{_ 'add'}}
.card-details-item.card-details-item-start .card-details-item.card-details-item-start
h3.card-details-item-title {{_ 'card-start'}} h3.card-details-item-title {{_ 'card-start'}}
if startAt if getStart
+cardStartDate +cardStartDate
else else
a.js-start-date {{_ 'add'}} a.js-start-date {{_ 'add'}}
.card-details-item.card-details-item-due
h3.card-details-item-title {{_ 'card-due'}}
if getDue
+cardDueDate
else
a.js-due-date {{_ 'add'}}
.card-details-item.card-details-item-end .card-details-item.card-details-item-end
h3.card-details-item-title {{_ 'card-end'}} h3.card-details-item-title {{_ 'card-end'}}
if endAt if getEnd
+cardEndDate +cardEndDate
else else
a.js-end-date {{_ 'add'}} a.js-end-date {{_ 'add'}}
@ -79,9 +86,9 @@ template(name="cardDetails")
+cardCustomField +cardCustomField
.card-details-items .card-details-items
if spentTime if getSpentTime
.card-details-item.card-details-item-spent .card-details-item.card-details-item-spent
if isOvertime if getIsOvertime
h3.card-details-item-title {{_ 'overtime-hours'}} h3.card-details-item-title {{_ 'overtime-hours'}}
else else
h3.card-details-item-title {{_ 'spent-time-hours'}} h3.card-details-item-title {{_ 'spent-time-hours'}}

View file

@ -3,10 +3,10 @@ template(name="editCardSpentTime")
form.edit-time form.edit-time
.fields .fields
label(for="time") {{_ 'time'}} label(for="time") {{_ 'time'}}
input.js-time-field#time(type="number" step="0.01" name="time" value="{{card.spentTime}}" placeholder=timeFormat autofocus) input.js-time-field#time(type="number" step="0.01" name="time" value="{{card.getSpentTime}}" placeholder=timeFormat autofocus)
label(for="overtime") {{_ 'overtime'}} label(for="overtime") {{_ 'overtime'}}
a.js-toggle-overtime a.js-toggle-overtime
.materialCheckBox#overtime(class="{{#if card.isOvertime}}is-checked{{/if}}" name="overtime") .materialCheckBox#overtime(class="{{#if card.getIsOvertime}}is-checked{{/if}}" name="overtime")
if error.get if error.get
.warning {{_ error.get}} .warning {{_ error.get}}
@ -15,8 +15,8 @@ template(name="editCardSpentTime")
template(name="timeBadge") template(name="timeBadge")
if canModifyCard if canModifyCard
a.js-edit-time.card-time(title="{{showTitle}}" class="{{#if isOvertime}}card-label-red{{else}}card-label-green{{/if}}") a.js-edit-time.card-time(title="{{showTitle}}" class="{{#if getIsOvertime}}card-label-red{{else}}card-label-green{{/if}}")
| {{showTime}} | {{showTime}}
else else
a.card-time(title="{{showTitle}}" class="{{#if isOvertime}}card-label-red{{else}}card-label-green{{/if}}") a.card-time(title="{{showTitle}}" class="{{#if getIsOvertime}}card-label-red{{else}}card-label-green{{/if}}")
| {{showTime}} | {{showTime}}

View file

@ -7,17 +7,17 @@ BlazeComponent.extendComponent({
this.card = this.data(); this.card = this.data();
}, },
toggleOvertime() { toggleOvertime() {
this.card.isOvertime = !this.card.isOvertime; this.card.setIsOvertime(!this.card.getIsOvertime());
$('#overtime .materialCheckBox').toggleClass('is-checked'); $('#overtime .materialCheckBox').toggleClass('is-checked');
$('#overtime').toggleClass('is-checked'); $('#overtime').toggleClass('is-checked');
}, },
storeTime(spentTime, isOvertime) { storeTime(spentTime, isOvertime) {
this.card.setSpentTime(spentTime); this.card.setSpentTime(spentTime);
this.card.setOvertime(isOvertime); this.card.setIsOvertime(isOvertime);
}, },
deleteTime() { deleteTime() {
this.card.unsetSpentTime(); this.card.setSpentTime(null);
}, },
events() { events() {
return [{ return [{
@ -26,7 +26,7 @@ BlazeComponent.extendComponent({
evt.preventDefault(); evt.preventDefault();
const spentTime = parseFloat(evt.target.time.value); const spentTime = parseFloat(evt.target.time.value);
const isOvertime = this.card.isOvertime; const isOvertime = this.card.getIsOvertime();
if (spentTime >= 0) { if (spentTime >= 0) {
this.storeTime(spentTime, isOvertime); this.storeTime(spentTime, isOvertime);
@ -55,17 +55,17 @@ BlazeComponent.extendComponent({
self.time = ReactiveVar(); self.time = ReactiveVar();
}, },
showTitle() { showTitle() {
if (this.data().isOvertime) { if (this.data().getIsOvertime()) {
return `${TAPi18n.__('overtime')} ${this.data().spentTime} ${TAPi18n.__('hours')}`; return `${TAPi18n.__('overtime')} ${this.data().getSpentTime()} ${TAPi18n.__('hours')}`;
} else { } else {
return `${TAPi18n.__('card-spent')} ${this.data().spentTime} ${TAPi18n.__('hours')}`; return `${TAPi18n.__('card-spent')} ${this.data().getSpentTime()} ${TAPi18n.__('hours')}`;
} }
}, },
showTime() { showTime() {
return this.data().spentTime; return this.data().getSpentTime();
}, },
isOvertime() { isOvertime() {
return this.data().isOvertime; return this.data().getIsOvertime();
}, },
events() { events() {
return [{ return [{

View file

@ -27,23 +27,19 @@ template(name="minicard")
| {{ parentCardName }} | {{ parentCardName }}
.dates .dates
if receivedAt if getReceived
unless startAt unless getStart
unless dueAt unless getDue
unless endAt unless getEnd
.date .date
+minicardReceivedDate +minicardReceivedDate
if startAt if getStart
.date .date
+minicardStartDate +minicardStartDate
if dueAt if getDue
unless endAt
.date
+minicardDueDate
if endAt
.date .date
+minicardEndDate +minicardDueDate
if spentTime if getSpentTime
.date .date
+cardSpentTime +cardSpentTime

View file

@ -177,6 +177,28 @@ Boards.attachSchema(new SimpleSchema({
optional: true, optional: true,
defaultValue: 'no-parent', defaultValue: 'no-parent',
}, },
startAt: {
type: Date,
optional: true,
},
dueAt: {
type: Date,
optional: true,
},
endAt: {
type: Date,
optional: true,
},
spentTime: {
type: Number,
decimal: true,
optional: true,
},
isOvertime: {
type: Boolean,
defaultValue: false,
optional: true,
},
})); }));

View file

@ -494,6 +494,166 @@ Cards.helpers({
return this.assignMember(memberId); return this.assignMember(memberId);
} }
}, },
getReceived() {
if (this.isImportedCard()) {
const card = Cards.findOne({_id: this.importedId});
return card.receivedAt;
} else {
return this.receivedAt;
}
},
setReceived(receivedAt) {
if (this.isImportedCard()) {
return Cards.update(
{_id: this.importedId},
{$set: {receivedAt}}
);
} else {
return {$set: {receivedAt}};
}
},
getStart() {
if (this.isImportedCard()) {
const card = Cards.findOne({_id: this.importedId});
return card.startAt;
} else if (this.isImportedBoard()) {
const board = Boards.findOne({_id: this.importedId});
return board.startAt
} else {
return this.startAt;
}
},
setStart(startAt) {
if (this.isImportedCard()) {
return Cards.update(
{ _id: this.importedId },
{$set: {startAt}}
);
} else if (this.isImportedBoard()) {
return Boards.update(
{_id: this.importedId},
{$set: {startAt}}
);
} else {
return {$set: {startAt}};
}
},
getDue() {
if (this.isImportedCard()) {
const card = Cards.findOne({_id: this.importedId});
return card.dueAt;
} else if (this.isImportedBoard()) {
const board = Boards.findOne({_id: this.importedId});
return board.dueAt
} else {
return this.dueAt;
}
},
setDue(dueAt) {
if (this.isImportedCard()) {
return Cards.update(
{ _id: this.importedId },
{$set: {dueAt}}
);
} else if (this.isImportedBoard()) {
return Boards.update(
{_id: this.importedId},
{$set: {dueAt}}
);
} else {
return {$set: {dueAt}};
}
},
getEnd() {
if (this.isImportedCard()) {
const card = Cards.findOne({_id: this.importedId});
return card.endAt;
} else if (this.isImportedBoard()) {
const board = Boards.findOne({_id: this.importedId});
return board.endAt;
} else {
return this.endAt;
}
},
setEnd(endAt) {
if (this.isImportedCard()) {
return Cards.update(
{ _id: this.importedId },
{$set: {endAt}}
);
} else if (this.isImportedBoard()) {
return Boards.update(
{_id: this.importedId},
{$set: {endAt}}
);
} else {
return {$set: {endAt}};
}
},
getIsOvertime() {
if (this.isImportedCard()) {
const card = Cards.findOne({ _id: this.importedId });
return card.isOvertime;
} else if (this.isImportedBoard()) {
const board = Boards.findOne({ _id: this.importedId});
return board.isOvertime;
} else {
return this.isOvertime;
}
},
setIsOvertime(isOvertime) {
if (this.isImportedCard()) {
return Cards.update(
{ _id: this.importedId },
{$set: {isOvertime}}
);
} else if (this.isImportedBoard()) {
return Boards.update(
{_id: this.importedId},
{$set: {isOvertime}}
);
} else {
return {$set: {isOvertime}};
}
},
getSpentTime() {
if (this.isImportedCard()) {
const card = Cards.findOne({ _id: this.importedId });
return card.spentTime;
} else if (this.isImportedBoard()) {
const board = Boards.findOne({ _id: this.importedId});
return board.spentTime;
} else {
return this.spentTime;
}
},
setSpentTime(spentTime) {
if (this.isImportedCard()) {
return Cards.update(
{ _id: this.importedId },
{$set: {spentTime}}
);
} else if (this.isImportedBoard()) {
return Boards.update(
{_id: this.importedId},
{$set: {spentTime}}
);
} else {
return {$set: {spentTime}};
}
},
}); });
Cards.mutations({ Cards.mutations({
@ -657,7 +817,6 @@ Cards.mutations({
setParentId(parentId) { setParentId(parentId) {
return {$set: {parentId}}; return {$set: {parentId}};
}, },
}); });