-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathdataviewjs.js
More file actions
68 lines (67 loc) · 2.33 KB
/
Copy pathdataviewjs.js
File metadata and controls
68 lines (67 loc) · 2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// dataviewjs-habit-tracker | https://github.com/adamhl8/dataviewjs-habit-tracker
// Looking to make modifications? See the TypeScript source here: https://github.com/adamhl8/dataviewjs-habit-tracker/blob/main/src/index.ts"
const defaultHeaders = ["Day"]
const getPageDay = (currentPage) => {
const pageDay = currentPage.file.day
if (!pageDay)
throw {
stack:
'(If this note is your template, this error is expected.) Unable to get note\'s day. Note should be named in the "YYYY-MM-DD" format.',
}
return pageDay
}
const getDailyNotesPages = (pageDay) =>
dv
.pages('"Daily Notes"')
.where((p) => getPageDay(p) >= pageDay.minus({ days: 7 }))
.where((p) => getPageDay(p) <= pageDay)
.sort((p) => p.file.day, "desc")
const getCleanHabitText = (habit) => {
let habitText = habit.text.split(" ✅")[0] ?? ""
for (const tag of habit.tags) habitText = habitText.replace(tag, "")
return habitText.trim()
}
const getPageHabits = (page) => {
const habitTasks = page.file.tasks.filter((t) => t.section.subpath === "Habits" || t.tags.includes("#habit"))
const habits = {}
for (const habitTask of habitTasks) {
const habitText = getCleanHabitText(habitTask)
habits[habitText] = habitTask.completed
}
return habits
}
const createRow = (pageData, headers) => {
const pageDay = getPageDay(pageData.page)
const pageLink = pageData.page.file.link
pageLink.display = pageDay.weekdayLong ?? ""
const row = [pageLink]
for (const header of headers) {
if (defaultHeaders.includes(header)) continue
let habitStatus = "➖"
if (Object.hasOwn(pageData.habits, header)) habitStatus = pageData.habits[header] ? "✔" : "❌"
row.push(habitStatus)
}
return row
}
const main = async () => {
const currentPage = dv.current()
const pageDay = getPageDay(currentPage)
const pages = getDailyNotesPages(pageDay)
const headers = new Set(defaultHeaders)
const pageDataArray = pages.map((page) => {
const habits = getPageHabits(page)
for (const habit of Object.keys(habits)) headers.add(habit)
return {
page,
habits,
}
})
const rows = []
for (const pageData of pageDataArray) {
const row = createRow(pageData, headers)
if (row.slice(defaultHeaders.length).every((status) => status === "➖")) continue
rows.push(row)
}
await dv.table([...headers], rows)
}
await main()