class taskFunc { relDateString(d, luxon) { if (!(d instanceof luxon.DateTime)) return '–' const now = luxon.DateTime.now() const days = Math.ceil(d.diff(now, 'days').days) if (days < 0) return 'Overdue ' + d.toFormat('L/d') if (days === 0) return 'Today' if (days === 1) return 'Tomorrow' if (days < 7) return d.toFormat('cccc') return d.toFormat('ccc L/d') } getButtonStrings(status) { const completed = status === 'Completed' const btnStr = completed ? 'Undo' : 'Done' const updateStr = completed ? 'To-Do' : 'Completed' return { btnStr, updateStr } } getCustomLink(name, target) { return `[[${target}|${name}]]` } getTodayTasks(args) { const { luxon, dv, that, theme } = args const finalDate = luxon.DateTime.now().toISODate() //?? dv.current().file.name return this.getTasksTable({ ...args, filterFn: t => this.getPoint(t, "type") == 'Task' && this.getPoint(t, "status") != 'Completed' && this.getPoint(t, "duedate") && this.getPoint(t, "duedate")?.hasSame(luxon.DateTime.fromISO(finalDate), 'day') }) } getAllTasks(args) { const { luxon, dv, that, theme } = args return this.getTasksTable({ ...args, filterFn: t => this.getPoint(t, "type") == 'Task' && this.getPoint(t, "reviewdate") }) } getOverdueTasks(args) { const { luxon, dv, that, theme } = args const finalDate = luxon.DateTime.now().toISODate() //date ?? dv.current().file.name return this.getTasksTable({ ...args, filterFn: t => this.getPoint(t, "type") == 'Task' && this.getPoint(t, "duedate") && this.getPoint(t, "duedate") < luxon.DateTime.fromISO(finalDate) && this.getPoint(t, "status") != 'Completed' }) } getLateReviewTasks(args) { const { luxon, dv, that, theme } = args const finalDate = luxon.DateTime.now().toISODate() //date ?? dv.current().file.name return this.getTasksTable({ ...args, filterFn: t => this.getPoint(t, "type") == 'Task' && this.getPoint(t, "reviewdate") && this.getPoint(t, "reviewdate") < luxon.DateTime.fromISO(finalDate) && this.getPoint(t, "status") != 'Completed' }) } getTasksNoDueDate(args) { return this.getTasksTable({ ...args, // prependText: 'No Due Date', filterFn: t => this.getPoint(t, "type") == 'Task' && !this.getPoint(t, "duedate") }) } getPriorityTasks(args) { const { luxon, dv, that, theme } = args return this.getTasksTable({ ...args, filterFn: t => this.getPoint(t, "type") == 'Task' && this.getPoint(t, "reviewdate") && this.getPoint(t, "priority") == 'High' }) } getTasksTable(args) { const { that, app, dv, luxon, theme, getSortProp = t => this.getPoint(t, "reviewdate"), sortOrder = 'asc', filterFn = t => {this.getPoint(t, "type") == 'Task'}, completedCol = false, prependHeaderLevel = 3, prependText } = args; const { metaedit, buttons } = app.plugins.plugins const { update } = metaedit.api const { createButton } = buttons const pFilter = '#' + theme const dueStr = completedCol ? 'Completed' : 'Review Date'; const pages = dv.pages(pFilter).sort(getSortProp, sortOrder).where(filterFn) if (pages.length === 0) { // console.log('Empty dataview:', args) return dv.el('b', '🗓 ✅ No pending task') } if (prependText) { dv.header(prependHeaderLevel, prependText) } dv.table(["Name", "Category", "Priority", dueStr, "", ""], pages .map(t => { const { btnStr, updateStr } = this.getButtonStrings(this.getPoint(t, "status")) return [ this.getCustomLink(t.file.name, t.file.name), this.getPoint(t, "tag"), this.getPoint(t, "priority"), this.relDateString(this.getPoint(t, "reviewdate"), luxon), createButton({ app, el: that.container, args: { name: btnStr }, clickOverride: { click: update, params: ['Status', updateStr, t.file.path] } }), ] }) ) } getPoint(p, datapoint) { let result = null switch(datapoint) { case 'reviewdate': result = p.NextReviewDate break; case 'duedate': result = p.DueDate break; case 'startdate': result = p.StartDate break; case 'priority': result = p.Priority break; case 'timestamp': result = p.TimeStamp break; case 'status': result = p.Status break; case 'type': result = p.DocType break; case 'createddate': result = p.Date break; case 'tag': result = p.Tag break; case 'hierarchy': result = p.Hierarchy break; case 'alias': result = p.Alias break; case 'location': result = p.location break; } return result } }