Merge branch 'calendar' of https://github.com/TNick/wekan into TNick-calendar

This commit is contained in:
Lauri Ojansivu 2018-06-27 23:55:06 +03:00
commit 72d0db7a59
11 changed files with 143 additions and 25 deletions

View file

@ -25,3 +25,5 @@ template(name="boardBody")
+swimlane(this)
if isViewLists
+listsGroup
if isViewCalendar
+fullcalendar(calendarOptions)

View file

@ -98,6 +98,12 @@ BlazeComponent.extendComponent({
return (currentUser.profile.boardView === 'board-view-lists');
},
isViewCalendar() {
const currentUser = Meteor.user();
if (!currentUser) return true;
return (currentUser.profile.boardView === 'board-view-cal');
},
openNewListForm() {
if (this.isViewSwimlanes()) {
this.childComponents('swimlane')[0]
@ -108,6 +114,62 @@ BlazeComponent.extendComponent({
}
},
calendarOptions() {
return {
id: 'calendar-view',
defaultView: 'basicWeek',
header: {
left: 'title',
center: 'agendaDay,listDay,timelineDay agendaWeek,listWeek,timelineWeek month,timelineMonth timelineYear',
right: 'today prev,next',
},
views: {
basic: {
// options apply to basicWeek and basicDay views
},
agenda: {
// options apply to agendaWeek and agendaDay views
},
week: {
// options apply to basicWeek and agendaWeek views
},
day: {
// options apply to basicDay and agendaDay views
},
},
themeSystem: 'jquery-ui',
height: 'parent',
/* TODO: lists as resources: https://fullcalendar.io/docs/vertical-resource-view */
navLinks: true,
nowIndicator: true,
businessHours: {
// days of week. an array of zero-based day of week integers (0=Sunday)
dow: [ 1, 2, 3, 4, 5 ], // Monday - Thursday
start: '8:00',
end: '18:00',
},
locale: TAPi18n.getLanguage(),
events(start, end, timezone, callback) {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
const events = [];
currentBoard.cardsInInterval(start.toDate(), end.toDate()).forEach(function(card){
events.push({
id: card.id,
title: card.title,
start: card.startAt,
end: card.endAt,
url: FlowRouter.url('card', {
boardId: currentBoard._id,
slug: currentBoard.slug,
cardId: card._id,
}),
});
});
callback(events);
},
};
},
events() {
return [{
// XXX The board-overlay div should probably be moved to the parent

View file

@ -89,9 +89,11 @@ BlazeComponent.extendComponent({
'click .js-toggle-board-view'() {
const currentUser = Meteor.user();
if (currentUser.profile.boardView === 'board-view-swimlanes') {
currentUser.setBoardView('board-view-lists');
currentUser.setBoardView('board-view-cal');
} else if (currentUser.profile.boardView === 'board-view-lists') {
currentUser.setBoardView('board-view-swimlanes');
} else if (currentUser.profile.boardView === 'board-view-cal') {
currentUser.setBoardView('board-view-lists');
}
},
'click .js-open-filter-view'() {

View file

@ -218,10 +218,13 @@ class CardReceivedDate extends CardDate {
}
classes() {
let classes = 'received-date' + ' ';
if (this.date.get().isBefore(this.now.get(), 'minute') &&
this.now.get().isBefore(this.data().dueAt)) {
classes += 'current';
let classes = 'received-date ';
const dueAt = this.data().dueAt;
if (dueAt) {
if (this.date.get().isBefore(this.now.get(), 'minute') &&
this.now.get().isBefore(dueAt)) {
classes += 'current';
}
}
return classes;
}
@ -249,9 +252,12 @@ class CardStartDate extends CardDate {
classes() {
let classes = 'start-date' + ' ';
if (this.date.get().isBefore(this.now.get(), 'minute') &&
this.now.get().isBefore(this.data().dueAt)) {
classes += 'current';
const dueAt = this.data().dueAt;
if (dueAt) {
if (this.date.get().isBefore(this.now.get(), 'minute') &&
this.now.get().isBefore(dueAt)) {
classes += 'current';
}
}
return classes;
}
@ -279,18 +285,23 @@ class CardDueDate extends CardDate {
classes() {
let classes = 'due-date' + ' ';
// if endAt exists & is < dueAt, dueAt doesn't need to be flagged
if ((this.data().endAt !== 0) &&
(this.data().endAt !== null) &&
(this.data().endAt !== '') &&
(this.data().endAt !== undefined) &&
(this.date.get().isBefore(this.data().endAt)))
const endAt = this.data().endAt;
const theDate = this.date.get();
const now = this.now.get();
if ((endAt !== 0) &&
(endAt !== null) &&
(endAt !== '') &&
(endAt !== undefined) &&
(theDate.isBefore(endAt)))
classes += 'current';
else if (this.now.get().diff(this.date.get(), 'days') >= 2)
else if (now.diff(theDate, 'days') >= 2)
classes += 'long-overdue';
else if (this.now.get().diff(this.date.get(), 'minute') >= 0)
else if (now.diff(theDate, 'minute') >= 0)
classes += 'due';
else if (this.now.get().diff(this.date.get(), 'days') >= -1)
else if (now.diff(theDate, 'days') >= -1)
classes += 'almost-due';
return classes;
}
@ -318,12 +329,16 @@ class CardEndDate extends CardDate {
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') <= 0)
classes += 'current';
const dueAt = this.data.dueAt;
if (dueAt) {
const diff = dueAt.diff(this.date.get(), 'days');
if (diff >= 2)
classes += 'long-overdue';
else if (diff > 0)
classes += 'due';
else if (diff <= 0)
classes += 'current';
}
return classes;
}

View file

@ -45,7 +45,7 @@ BlazeComponent.extendComponent({
const boardView = Meteor.user().profile.boardView;
if (boardView === 'board-view-swimlanes')
swimlaneId = this.parentComponent().parentComponent().data()._id;
else if (boardView === 'board-view-lists')
else if ((boardView === 'board-view-lists') || (boardView === 'board-view-cal'))
swimlaneId = Swimlanes.findOne({boardId})._id;
if (title) {

View file

@ -7,6 +7,8 @@ function currentCardIsInThisList(listId, swimlaneId) {
return currentCard && currentCard.listId === listId;
else if (currentUser.profile.boardView === 'board-view-swimlanes')
return currentCard && currentCard.listId === listId && currentCard.swimlaneId === swimlaneId;
else if (currentUser.profile.boardView === 'board-view-cal')
return currentCard;
else
return false;
}