let {pages, view, firstDayOfWeek, globalTaskFilter, dailyNoteFolder, dailyNoteFormat, startPosition, upcomingDays, css, options} = input;
// Error Handling
if (!pages && pages!="") { dv.span('> [!ERROR] Missing pages parameter\n> \n> Please set the pages parameter like\n> \n> `pages: ""`'); return false };
if (!options.includes("style")) { dv.span('> [!ERROR] Missing style parameter\n> \n> Please set a style inside options parameter like\n> \n> `options: "style1"`'); return false };
if (!view) { dv.span('> [!ERROR] Missing view parameter\n> \n> Please set a default view inside view parameter like\n> \n> `view: "month"`'); return false };
if (firstDayOfWeek) {
if (firstDayOfWeek.match(/[|\\0123456]/g) == null) {
dv.span('> [!ERROR] Wrong value inside firstDayOfWeek parameter\n> \n> Please choose a number between 0 and 6');
return false
};
} else {
dv.span('> [!ERROR] Missing firstDayOfWeek parameter\n> \n> Please set the first day of the week inside firstDayOfWeek parameter like\n> \n> `firstDayOfWeek: "1"`');
return false
};
if (startPosition) { if (!startPosition.match(/\d{4}\-\d{1,2}/gm)) { dv.span('> [!ERROR] Wrong startPosition format\n> \n> Please set a startPosition with the following format\n> \n> Month: `YYYY-MM` | Week: `YYYY-ww`'); return false }};
if (dailyNoteFormat) { if (dailyNoteFormat.match(/[|\\YMDWwd.,-: \[\]]/g).length != dailyNoteFormat.length) { dv.span('> [!ERROR] The `dailyNoteFormat` contains invalid characters'); return false }};
// Get, Set, Eval Pages
if (pages=="") { var tasks = dv.pages().file.tasks } else { if (pages.startsWith("dv.pages")) { var tasks = eval(pages) } else { var tasks = dv.pages(pages).file.tasks } };
// Variables
var done, doneWithoutCompletionDate, due, recurrence, overdue, start, scheduled, process, cancelled, dailyNote, dailyNoteRegEx;
if (!dailyNoteFormat) { dailyNoteFormat = "YYYY-MM-DD" };
var dailyNoteRegEx = momentToRegex(dailyNoteFormat)
var tToday = moment().format("YYYY-MM-DD");
var tMonth = moment().format("M");
var tDay = moment().format("d");
var tYear = moment().format("YYYY");
var tid = (new Date()).getTime();
if (startPosition) { var selectedMonth = moment(startPosition, "YYYY-MM").date(1); var selectedList = moment(startPosition, "YYYY-MM").date(1); var selectedWeek = moment(startPosition, "YYYY-ww").startOf("week") } else { var selectedMonth = moment(startPosition).date(1); var selectedWeek = moment(startPosition).startOf("week"); var selectedList = moment(startPosition).date(1); };
var selectedDate = eval("selected"+capitalize(view));
var arrowLeftIcon = '';
var arrowRightIcon = '';
var filterIcon = '';
var monthIcon = '';
var weekIcon = '';
var listIcon = '';
var calendarClockIcon = '';
var calendarCheckIcon = '';
var calendarHeartIcon = '';
var cellTemplate = "
";
var taskTemplate = "{{note}}
{{icon}}
{{taskContent}}
";
const rootNode = dv.el("div", "", {cls: "tasksCalendar "+options, attr: {id: "tasksCalendar"+tid, view: view, style: 'position:relative;-webkit-user-select:none!important'}});
if (css) { var style = document.createElement("style"); style.innerHTML = css; rootNode.append(style) };
var taskDoneIcon = "β
";
var taskDueIcon = "π
";
var taskScheduledIcon = "β³";
var taskRecurrenceIcon = "π";
var taskOverdueIcon = "β οΈ";
var taskProcessIcon = "βΊοΈ";
var taskCancelledIcon = "π«";
var taskStartIcon = "π«";
var taskDailyNoteIcon = "π";
// Initialze
getMeta(tasks);
setButtons();
setStatisticPopUp();
setWeekViewContext();
eval("get"+capitalize(view))(tasks, selectedDate);
function getMeta(tasks) {
for (i=0;i> 16) + amt, B = (num >> 8 & 0x00FF) + amt, G = (num & 0x0000FF) + amt;
return "#" + (0x1000000 + (R<255?R<1?0:R:255)*0x10000 + (B<255?B<1?0:B:255)*0x100 + (G<255?G<1?0:G:255)).toString(16).slice(1);
};
function momentToRegex(momentFormat) {
momentFormat = momentFormat.replaceAll(".", "\\.");
momentFormat = momentFormat.replaceAll(",", "\\,");
momentFormat = momentFormat.replaceAll("-", "\\-");
momentFormat = momentFormat.replaceAll(":", "\\:");
momentFormat = momentFormat.replaceAll(" ", "\\s");
momentFormat = momentFormat.replace("dddd", "\\w{1,}");
momentFormat = momentFormat.replace("ddd", "\\w{1,3}");
momentFormat = momentFormat.replace("dd", "\\w{2}");
momentFormat = momentFormat.replace("d", "\\d{1}");
momentFormat = momentFormat.replace("YYYY", "\\d{4}");
momentFormat = momentFormat.replace("YY", "\\d{2}");
momentFormat = momentFormat.replace("MMMM", "\\w{1,}");
momentFormat = momentFormat.replace("MMM", "\\w{3}");
momentFormat = momentFormat.replace("MM", "\\d{2}");
momentFormat = momentFormat.replace("DDDD", "\\d{3}");
momentFormat = momentFormat.replace("DDD", "\\d{1,3}");
momentFormat = momentFormat.replace("DD", "\\d{2}");
momentFormat = momentFormat.replace("D", "\\d{1,2}");
momentFormat = momentFormat.replace("ww", "\\d{1,2}");
regEx = "/^(" + momentFormat + ")$/";
return regEx;
};
function getTasks(date) {
done = tasks.filter(t=>t.completed && t.checked && t.completion && moment(t.completion.toString()).isSame(date)).sort(t=>t.completion);
doneWithoutCompletionDate = tasks.filter(t=>t.completed && t.checked && !t.completion && t.due && moment(t.due.toString()).isSame(date)).sort(t=>t.due);
done = done.concat(doneWithoutCompletionDate);
due = tasks.filter(t=>!t.completed && !t.checked && !t.recurrence && t.due && moment(t.due.toString()).isSame(date)).sort(t=>t.due);
recurrence = tasks.filter(t=>!t.completed && !t.checked && t.recurrence && t.due && moment(t.due.toString()).isSame(date)).sort(t=>t.due);
overdue = tasks.filter(t=>!t.completed && !t.checked && t.due && moment(t.due.toString()).isBefore(date)).sort(t=>t.due);
start = tasks.filter(t=>!t.completed && !t.checked && t.start && moment(t.start.toString()).isSame(date)).sort(t=>t.start);
scheduled = tasks.filter(t=>!t.completed && !t.checked && t.scheduled && moment(t.scheduled.toString()).isSame(date)).sort(t=>t.scheduled);
process = tasks.filter(t=>!t.completed && !t.checked && t.due && t.start && moment(t.due.toString()).isAfter(date) && moment(t.start.toString()).isBefore(date) );
cancelled = tasks.filter(t=>!t.completed && t.checked && t.due && moment(t.due.toString()).isSame(date)).sort(t=>t.due);
dailyNote = tasks.filter(t=>!t.completed && !t.checked && t.dailyNote && moment(t.dailyNote.toString()).isSame(date)).sort(t=>t.dailyNote);
};
function setTask(obj, cls) {
var lighter = 25;
var darker = -40;
var noteColor = getMetaFromNote(obj, "color");
var textColor = getMetaFromNote(obj, "textColor");
var noteIcon = getMetaFromNote(obj, "icon");
var taskText = obj.text.replace("'", "'");
var taskPath = obj.link.path.replace("'", "'");
var taskIcon = eval("task"+capitalize(cls)+"Icon");
if (obj.due) { var relative = moment(obj.due).fromNow() } else { var relative = "" };
var noteFilename = getFilename(taskPath);
if (noteIcon) { noteFilename = noteIcon+" "+noteFilename } else { noteFilename = taskIcon+" "+noteFilename; cls += " noNoteIcon" };
var taskSubpath = obj.header.subpath;
var taskLine = taskSubpath ? taskPath+"#"+taskSubpath : taskPath;
if (noteColor && textColor) {
var style = "--task-background:"+noteColor+"33;--task-color:"+noteColor+";--dark-task-text-color:"+textColor+";--light-task-text-color:"+textColor;
} else if (noteColor && !textColor){
var style = "--task-background:"+noteColor+"33;--task-color:"+noteColor+";--dark-task-text-color:"+transColor(noteColor, darker)+";--light-task-text-color:"+transColor(noteColor, lighter);
var style = "--task-background:"+noteColor+"33;--task-color:"+noteColor+";--dark-task-text-color:"+transColor(noteColor, darker)+";--light-task-text-color:"+transColor(noteColor, lighter);
} else if (!noteColor && textColor ){
var style = "--task-background:#7D7D7D33;--task-color:#7D7D7D;--dark-task-text-color:"+transColor(textColor, darker)+";--light-task-text-color:"+transColor(textColor, lighter);
} else {
var style = "--task-background:#7D7D7D33;--task-color:#7D7D7D;--dark-task-text-color:"+transColor("#7D7D7D", darker)+";--light-task-text-color:"+transColor("#7D7D7D", lighter);
};
var newTask = taskTemplate.replace("{{taskContent}}", taskText).replace("{{class}}", cls).replace("{{taskPath}}", taskLine).replace("{{due}}","done").replaceAll("{{style}}",style).replace("{{title}}", noteFilename + ": " + taskText).replace("{{note}}",noteFilename).replace("{{icon}}",taskIcon).replace("{{relative}}",relative);
return newTask;
};
function setTaskContentContainer(currentDate) {
var cellContent = "";
function compareFn(a, b) {
if (a.priority.toUpperCase() < b.priority.toUpperCase()) {
return -1;
};
if (a.priority.toUpperCase() > b.priority.toUpperCase()) {
return 1;
};
if (a.priority == b.priority) {
if (a.text.toUpperCase() < b.text.toUpperCase()) {
return -1;
};
if (a.text.toUpperCase() > b.text.toUpperCase()) {
return 1;
};
return 0;
};
};
function showTasks(tasksToShow, type) {
const sorted = [...tasksToShow].sort(compareFn);
for (var t = 0; t < sorted.length; t++) {
cellContent += setTask(sorted[t], type)
};
};
if (tToday == currentDate) {
showTasks(overdue, "overdue");
};
showTasks(due, "due");
showTasks(recurrence, "recurrence");
showTasks(start, "start");
showTasks(scheduled, "scheduled");
showTasks(process, "process");
showTasks(dailyNote, "dailyNote");
showTasks(done, "done");
showTasks(cancelled, "cancelled");
return cellContent;
};
function setButtons() {
var buttons = "";
rootNode.querySelector("span").appendChild(dv.el("div", buttons, {cls: "buttons", attr: {}}));
setButtonEvents();
};
function setButtonEvents() {
rootNode.querySelectorAll('button').forEach(btn => btn.addEventListener('click', (() => {
var activeView = rootNode.getAttribute("view");
if ( btn.className == "previous" ) {
if (activeView == "month") {
selectedDate = moment(selectedDate).subtract(1, "months");
getMonth(tasks, selectedDate);
} else if (activeView == "week") {
selectedDate = moment(selectedDate).subtract(7, "days").startOf("week");
getWeek(tasks, selectedDate);
} else if (activeView == "list") {
selectedDate = moment(selectedDate).subtract(1, "months");
getList(tasks, selectedDate);
}
} else if ( btn.className == "current") {
if (activeView == "month") {
selectedDate = moment().date(1);
getMonth(tasks, selectedDate);
} else if (activeView == "week") {
selectedDate = moment().startOf("week");
getWeek(tasks, selectedDate);
} else if (activeView == "list") {
selectedDate = moment().date(1);
getList(tasks, selectedDate);
};
} else if ( btn.className == "next" ) {
if (activeView == "month") {
selectedDate = moment(selectedDate).add(1, "months");
getMonth(tasks, selectedDate);
} else if (activeView == "week") {
selectedDate = moment(selectedDate).add(7, "days").startOf("week");
getWeek(tasks, selectedDate);
} else if (activeView == "list") {
selectedDate = moment(selectedDate).add(1, "months");
getList(tasks, selectedDate);
};
} else if ( btn.className == "filter" ) {
rootNode.classList.toggle("filter");
rootNode.querySelector('#statisticDone').classList.remove("active");
rootNode.classList.remove("focusDone");
} else if ( btn.className == "monthView" ) {
if ( moment().format("ww-YYYY") == moment(selectedDate).format("ww-YYYY") ) {
selectedDate = moment().date(1);
} else {
selectedDate = moment(selectedDate).date(1);
};
getMonth(tasks, selectedDate);
} else if ( btn.className == "listView" ) {
if ( moment().format("ww-YYYY") == moment(selectedDate).format("ww-YYYY") ) {
selectedDate = moment().date(1);
} else {
selectedDate = moment(selectedDate).date(1);
};
getList(tasks, selectedDate);
} else if ( btn.className == "weekView" ) {
if (rootNode.getAttribute("view") == "week") {
var leftPos = rootNode.querySelector("button.weekView").offsetLeft;
rootNode.querySelector(".weekViewContext").style.left = leftPos+"px";
rootNode.querySelector(".weekViewContext").classList.toggle("active");
if (rootNode.querySelector(".weekViewContext").classList.contains("active")) {
var closeContextListener = function() {
rootNode.querySelector(".weekViewContext").classList.remove("active");
rootNode.removeEventListener("click", closeContextListener, false);
};
setTimeout(function() {
rootNode.addEventListener("click", closeContextListener, false);
}, 100);
};
} else {
if (moment().format("MM-YYYY") != moment(selectedDate).format("MM-YYYY")) {
selectedDate = moment(selectedDate).startOf("month").startOf("week");
} else {
selectedDate = moment().startOf("week");
};
getWeek(tasks, selectedDate);
};
} else if ( btn.className == "statistic" ) {
rootNode.querySelector(".statisticPopup").classList.toggle("active");
};
btn.blur();
})));
rootNode.addEventListener('contextmenu', function(event) {
event.preventDefault();
});
};
function setWrapperEvents() {
rootNode.querySelectorAll('.wrapperButton').forEach(wBtn => wBtn.addEventListener('click', (() => {
var week = wBtn.getAttribute("data-week");
var year = wBtn.getAttribute("data-year");
selectedDate = moment(moment(year).add(week, "weeks")).startOf("week");
rootNode.querySelector(`#tasksCalendar${tid} .grid`).remove();
getWeek(tasks, selectedDate);
})));
};
function setStatisticPopUpEvents() {
rootNode.querySelectorAll('.statisticPopup li').forEach(li => li.addEventListener('click', (() => {
var group = li.getAttribute("data-group");
const liElements = rootNode.querySelectorAll('.statisticPopup li');
if (li.classList.contains("active")) {
const liElements = rootNode.querySelectorAll('.statisticPopup li');
for (const liElement of liElements) {
liElement.classList.remove('active');
};
rootNode.classList.remove("focus"+capitalize(group));
} else {
for (const liElement of liElements) {
liElement.classList.remove('active');
};
li.classList.add("active");
rootNode.classList.remove.apply(rootNode.classList, Array.from(rootNode.classList).filter(v=>v.startsWith("focus")));
rootNode.classList.add("focus"+capitalize(group));
};
})));
};
function setStatisticPopUp() {
var statistic = "";
statistic += "";
statistic += "";
statistic += "";
statistic += "";
statistic += "";
statistic += "";
statistic += "";
statistic += "";
rootNode.querySelector("span").appendChild(dv.el("ul", statistic, {cls: "statisticPopup"}));
setStatisticPopUpEvents();
};
function setWeekViewContextEvents() {
rootNode.querySelectorAll('.weekViewContext li').forEach(li => li.addEventListener('click', (() => {
var selectedStyle = li.getAttribute("data-style");
const liElements = rootNode.querySelectorAll('.weekViewContext li');
if (!li.classList.contains("active")) {
for (const liElement of liElements) {
liElement.classList.remove('active');
};
li.classList.add("active");
rootNode.classList.remove.apply(rootNode.classList, Array.from(rootNode.classList).filter(v=>v.startsWith("style")));
rootNode.classList.add(selectedStyle);
};
rootNode.querySelector(".weekViewContext").classList.toggle("active");
})));
};
function setWeekViewContext() {
var activeStyle = Array.from(rootNode.classList).filter(v=>v.startsWith("style"));
var liElements = "";
var styles = 11;
for (i=1;i";
liElements += ""+liIcon+"Style "+i+"";
};
rootNode.querySelector("span").appendChild(dv.el("ul", liElements, {cls: "weekViewContext"}));
rootNode.querySelector(".weekViewContext li[data-style="+activeStyle+"]").classList.add("active");
setWeekViewContextEvents();
};
function setStatisticValues(dueCounter, doneCounter, overdueCounter, startCounter, scheduledCounter, recurrenceCounter, dailyNoteCounter) {
var taskCounter = parseInt(dueCounter+doneCounter+overdueCounter);
var tasksRemaining = taskCounter - doneCounter;
var percentage = Math.round(100/(dueCounter+doneCounter+overdueCounter)*doneCounter);
percentage = isNaN(percentage) ? 100 : percentage;
if (dueCounter == 0 && doneCounter == 0) {
rootNode.querySelector("button.statistic").innerHTML = calendarHeartIcon;
} else if (tasksRemaining > 0) {
rootNode.querySelector("button.statistic").innerHTML = calendarClockIcon;
} else if (dueCounter == 0 && doneCounter != 0) {
rootNode.querySelector("button.statistic").innerHTML = calendarCheckIcon;
};
if (tasksRemaining > 99) {tasksRemaining = "β οΈ"};
rootNode.querySelector("button.statistic").setAttribute("data-percentage", percentage);
rootNode.querySelector("button.statistic").setAttribute("data-remaining", tasksRemaining);
rootNode.querySelector("#statisticDone").innerText = "β
Done: " + doneCounter + "/" + taskCounter;
rootNode.querySelector("#statisticDue").innerText = "π
Due: " + dueCounter;
rootNode.querySelector("#statisticOverdue").innerText = "β οΈ Overdue: " + overdueCounter;
rootNode.querySelector("#statisticStart").innerText = "π« Start: " + startCounter;
rootNode.querySelector("#statisticScheduled").innerText = "β³ Scheduled: " + scheduledCounter;
rootNode.querySelector("#statisticRecurrence").innerText = "π Recurrence: " + recurrenceCounter;
rootNode.querySelector("#statisticDailyNote").innerText = "π Daily Notes: " + dailyNoteCounter;
};
function removeExistingView() {
if (rootNode.querySelector(`#tasksCalendar${tid} .grid`)) {
rootNode.querySelector(`#tasksCalendar${tid} .grid`).remove();
} else if (rootNode.querySelector(`#tasksCalendar${tid} .list`)) {
rootNode.querySelector(`#tasksCalendar${tid} .list`).remove();
};
};
function getMonth(tasks, month) {
removeExistingView();
var currentTitle = ""+moment(month).format("MMMM")+" "+moment(month).format("YYYY")+"";
rootNode.querySelector('button.current').innerHTML = currentTitle;
var gridContent = "";
var firstDayOfMonth = moment(month).format("d");
var firstDateOfMonth = moment(month).startOf("month").format("D");
var lastDateOfMonth = moment(month).endOf("month").format("D");
var dueCounter = 0;
var doneCounter = 0;
var overdueCounter = 0;
var startCounter = 0;
var scheduledCounter = 0;
var recurrenceCounter = 0;
var dailyNoteCounter = 0;
// Move First Week Of Month To Second Week In Month View
if (firstDayOfMonth == 0) { firstDayOfMonth = 7};
// Set Grid Heads
var gridHeads = "";
for (h=0-firstDayOfMonth+parseInt(firstDayOfWeek);h<7-firstDayOfMonth+parseInt(firstDayOfWeek);h++) {
var weekDayNr = moment(month).add(h, "days").format("d");
var weekDayName = moment(month).add(h, "days").format("ddd");
if ( tDay == weekDayNr && tMonth == moment(month).format("M") && tYear == moment(month).format("YYYY") ) {
gridHeads += "" + weekDayName + "
";
} else {
gridHeads += "" + weekDayName + "
";
};
};
// Set Wrappers
var wrappers = "";
var starts = 0-firstDayOfMonth+parseInt(firstDayOfWeek);
for (w=1; w<7; w++) {
var wrapper = "";
var weekNr = "";
var yearNr = "";
var monthName = moment(month).format("MMM").replace(".","").substring(0,3);
for (i=starts;i= 0 && i < lastDateOfMonth && tToday !== currentDate) {
cell = cell.replace("{{class}}", "currentMonth");
} else if ( i >= 0 && i< lastDateOfMonth && tToday == currentDate) {
cell = cell.replace("{{class}}", "currentMonth today");
} else if (i >= lastDateOfMonth) {
cell = cell.replace("{{class}}", "nextMonth");
};
wrapper += cell;
};
wrappers += "";
starts += 7;
};
gridContent += "";
gridContent += ""+wrappers+"
";
rootNode.querySelector("span").appendChild(dv.el("div", gridContent, {cls: "grid"}));
setWrapperEvents();
setStatisticValues(dueCounter, doneCounter, overdueCounter, startCounter, scheduledCounter, recurrenceCounter, dailyNoteCounter);
rootNode.setAttribute("view", "month");
};
function getWeek(tasks, week) {
removeExistingView();
var currentTitle = ""+moment(week).format("YYYY")+" "+moment(week).format("[W]w")+"";
rootNode.querySelector('button.current').innerHTML = currentTitle
var gridContent = "";
var currentWeekday = moment(week).format("d");
var weekNr = moment(week).format("[W]w");
var dueCounter = 0;
var doneCounter = 0;
var overdueCounter = 0;
var startCounter = 0;
var scheduledCounter = 0;
var recurrenceCounter = 0;
var dailyNoteCounter = 0;
for (i=0-currentWeekday+parseInt(firstDayOfWeek);i<7-currentWeekday+parseInt(firstDayOfWeek);i++) {
var currentDate = moment(week).add(i, "days").format("YYYY-MM-DD");
if (!dailyNoteFolder) {var dailyNotePath = currentDate} else {var dailyNotePath = dailyNoteFolder+"/"+currentDate};
var weekDay = moment(week).add(i, "days").format("d");
var dayName = moment(currentDate).format("ddd D.");
var longDayName = moment(currentDate).format("ddd, D. MMM");
// Filter Tasks
getTasks(currentDate);
// Count Events From Selected Week
dueCounter += due.length;
dueCounter += recurrence.length;
dueCounter += scheduled.length;
dueCounter += dailyNote.length;
doneCounter += done.length;
startCounter += start.length;
scheduledCounter += scheduled.length;
recurrenceCounter += recurrence.length;
dailyNoteCounter += dailyNote.length;
if (moment().format("YYYY-MM-DD") == moment(week).add(i, "days").format("YYYY-MM-DD")) {
overdueCounter = overdue.length;
};
// Set New Content Container
var cellContent = setTaskContentContainer(currentDate);
// Set Cell Name And Weekday
var cell = cellTemplate.replace("{{date}}", currentDate).replace("{{cellName}}", longDayName).replace("{{cellContent}}", cellContent).replace("{{weekday}}", weekDay).replace("{{dailyNote}}", dailyNotePath);
// Set Cell Name And Weekday
if ( moment(week).add(i, "days").format("D") == 1 ) {
var cell = cellTemplate.replace("{{date}}", currentDate).replace("{{cellName}}", longDayName).replace("{{cellContent}}", cellContent).replace("{{weekday}}", weekDay).replace("{{dailyNote}}", dailyNotePath);
} else {
var cell = cellTemplate.replace("{{date}}", currentDate).replace("{{cellName}}", dayName).replace("{{cellContent}}", cellContent).replace("{{weekday}}", weekDay).replace("{{dailyNote}}", dailyNotePath);
};
// Set Today, Before Today, After Today
if (currentDate < tToday) {
cell = cell.replace("{{class}}", "beforeToday");
} else if (currentDate == tToday) {
cell = cell.replace("{{class}}", "today");
} else if (currentDate > tToday) {
cell = cell.replace("{{class}}", "afterToday");
};
gridContent += cell;
};
rootNode.querySelector("span").appendChild(dv.el("div", gridContent, {cls: "grid", attr:{'data-week': weekNr}}));
setStatisticValues(dueCounter, doneCounter, overdueCounter, startCounter, scheduledCounter, recurrenceCounter, dailyNoteCounter);
rootNode.setAttribute("view", "week");
};
function getList(tasks, month) {
removeExistingView();
var currentTitle = ""+moment(month).format("MMMM")+" "+moment(month).format("YYYY")+"";
rootNode.querySelector('button.current').innerHTML = currentTitle;
var listContent = "";
var dueCounter = 0;
var doneCounter = 0;
var overdueCounter = 0;
var startCounter = 0;
var scheduledCounter = 0;
var recurrenceCounter = 0;
var dailyNoteCounter = 0;
// Loop Days From Current Month
for (i=0;i";
var todayDetails = "Today
" + setTaskContentContainer(currentDate) + " ";
// Upcoming
if (!upcomingDays) { upcomingDays = "7" };
var upcomingContent = "";
for (t=1;t";
listContent += "" + moment(currentDate).format("dddd, D") + " " + moment(currentDate).format("[W]w") + "
" + overdueDetails + todayDetails + upcomingDetails + "
"
} else {
listContent += "" + moment(currentDate).format("dddd, D") + " " + moment(currentDate).format("[W]w") + "
" + setTaskContentContainer(currentDate) + "
"
};
};
rootNode.querySelector("span").appendChild(dv.el("div", listContent, {cls: "list", attr:{"data-month": monthName}}));
setStatisticValues(dueCounter, doneCounter, overdueCounter, startCounter, scheduledCounter, recurrenceCounter, dailyNoteCounter);
rootNode.setAttribute("view", "list");
// Scroll To Today If Selected Month Is Current Month
if ( moment().format("YYYY-MM") == moment(month).format("YYYY-MM") ) {
var listElement = rootNode.querySelector(".list");
var todayElement = rootNode.querySelector(".today")
var scrollPos = todayElement.offsetTop - todayElement.offsetHeight + 85;
listElement.scrollTo(0, scrollPos);
};
};