Obsidian plugin · 4.17.0 · Generated from source

Generated default Base templates

Exact default Obsidian Base files generated by the current TaskNotes source and default settings.

These are the exact templates TaskNotes 4.17.0 produces with default settings. Your generated files reflect your own field mapping and other settings, so customized output can differ.

Regenerating with Update files overwrites configured default Base files. Copy a customized file to a new path before updating it.

mini-calendar-default.base#

Command/template ID: open-calendar-view

# Mini Calendar
# Generated with your TaskNotes settings

filters:
  and:
    - file.hasTag("task")

formulas:
  priorityWeight: >-
    if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,-1))))
  daysUntilDue: >-
    if((due.isEmpty() == false), ((number(date(due)) - number(today())) /
    86400000).floor(), null)
  dueIn: >-
    if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today",
    if(formula.daysUntilDue > 0, (if((formula.daysUntilDue) == 1,
    (if((formula.daysUntilDue) >= 1000 || (formula.daysUntilDue) <= -1000, ("" +
    (formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (formula.daysUntilDue))) + " day"), (if((formula.daysUntilDue) >= 1000 ||
    (formula.daysUntilDue) <= -1000, ("" +
    (formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (formula.daysUntilDue))) + " days"))), (if((formula.daysUntilDue * -1) == 1,
    (if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
    -1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
    ","), ("" + (formula.daysUntilDue * -1))) + " day overdue"),
    (if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
    -1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
    ","), ("" + (formula.daysUntilDue * -1))) + " days overdue"))))))
  daysUntilScheduled: >-
    if((scheduled.isEmpty() == false), ((number(date(scheduled)) -
    number(today())) / 86400000).floor(), null)
  daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
  daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
  isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
  isDueToday: >-
    (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")
  isDueThisWeek: >-
    (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >=
    today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() +
    "7 days").format("YYYY-MM-DD")
  isScheduledToday: >-
    (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")
  isRecurring: recurrence && !recurrence.isEmpty()
  hasTimeEstimate: timeEstimate && timeEstimate > 0
  timeRemaining: >-
    if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries,
    list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
  efficiencyRatio: >-
    if(timeEstimate && timeEstimate > 0 && timeEntries,
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    timeEstimate * 100).round(), null)
  timeTrackedThisWeek: >-
    if(timeEntries, list(timeEntries).filter(value.endTime &&
    date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
  timeTrackedToday: >-
    if(timeEntries, list(timeEntries).filter(value.endTime &&
    date(value.startTime).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
  dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
  dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
  scheduledMonth: >-
    if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not
    scheduled")
  scheduledWeek: >-
    if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"),
    "Not scheduled")
  dueDateCategory: >-
    if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue",
    if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today",
    if(date(due).format("YYYY-MM-DD") == (today() + "1
    day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <=
    (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
  timeEstimateCategory: >-
    if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No
    estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120,
    "Medium (30m-2h)", "Long (>2h)")))
  ageCategory: >-
    if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today",
    if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week",
    if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month",
    "Older")))
  createdMonth: file.ctime.format("YYYY-MM")
  modifiedMonth: file.mtime.format("YYYY-MM")
  priorityCategory: >-
    if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No
    priority"))))
  projectCount: >-
    (if((if(projects, list(projects).length, 0)) == 0, ("No projects"),
    if((if(projects, list(projects).length, 0)) == 1, ("Single project"),
    ("Multiple projects"))))
  contextCount: >-
    (if((if(contexts, list(contexts).length, 0)) == 0, ("No contexts"),
    if((if(contexts, list(contexts).length, 0)) == 1, ("Single context"),
    ("Multiple contexts"))))
  trackingStatus: >-
    if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No
    estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started",
    if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
  nextDate: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), due, scheduled), if((due.isEmpty() == false), due,
    scheduled))
  daysUntilNext: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false),
    min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() ==
    false), formula.daysUntilDue, formula.daysUntilScheduled))
  hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
  isToday: >-
    ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
  isThisWeek: >-
    ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >=
    today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() +
    "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") &&
    date(scheduled).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD"))
  nextDateCategory: >-
    if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() ==
    false) && date(due) < today()) || ((scheduled.isEmpty() == false) &&
    date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) &&
    date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) ||
    ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) &&
    date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"))
    || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD")
    == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty()
    == false) && date(due).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD")), "This week", "Later")))))
  nextDateMonth: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), date(due).format("YYYY-MM"),
    date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false),
    date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false),
    date(scheduled).format("YYYY-MM"), "No date")))
  nextDateWeek: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), date(due).format("YYYY-[W]WW"),
    date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false),
    date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false),
    date(scheduled).format("YYYY-[W]WW"), "No date")))
  urgencyScore: >-
    if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight,
    formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext,
    formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) -
    number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
  timeTrackedFormatted: >-
    if(timeEntries,
    if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60,
    (if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()) >= 1000 ||
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()) <= -1000, ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()))) + "h " +
    if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()) >= 1000 ||
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()) <= -1000, ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()))) + "m"),
    (if((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) >=
    1000 ||
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) <=
    -1000, ("" +
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value,
    0).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()))) +
    "m")), (if((0) >= 1000 || (0) <= -1000, ("" +
    (0)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (0))) + "m"))
  dueDateDisplay: >-
    if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") ==
    (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow",
    if(date(due).format("YYYY-MM-DD") == (today() - "1
    day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(),
    (if((formula.daysUntilDue * -1) == 1, (if((formula.daysUntilDue * -1) >=
    1000 || (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
    -1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
    -1))) + " day ago"), (if((formula.daysUntilDue * -1) >= 1000 ||
    (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
    -1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
    -1))) + " days ago"))), if(date(due).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM
    D")))))))

views:
  - type: tasknotesMiniCalendar
    name: "Due"
    order:
      - status
      - priority
      - due
      - scheduled
      - projects
      - contexts
      - file.tags
      - blockedBy
      - file.name
      - recurrence
      - complete_instances
      - file.tasks
    sort:
      - property: due
        direction: ASC
    dateProperty: due
  - type: tasknotesMiniCalendar
    name: "Scheduled"
    order: []
    dateProperty: scheduled
  - type: tasknotesMiniCalendar
    name: "Created"
    dateProperty: file.ctime
  - type: tasknotesMiniCalendar
    name: "Modified"
    dateProperty: file.mtime

kanban-default.base#

Command/template ID: open-kanban-view

# Kanban Board

filters:
  and:
    - file.hasTag("task")

formulas:
  priorityWeight: >-
    if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,-1))))
  daysUntilDue: >-
    if((due.isEmpty() == false), ((number(date(due)) - number(today())) /
    86400000).floor(), null)
  dueIn: >-
    if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today",
    if(formula.daysUntilDue > 0, (if((formula.daysUntilDue) == 1,
    (if((formula.daysUntilDue) >= 1000 || (formula.daysUntilDue) <= -1000, ("" +
    (formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (formula.daysUntilDue))) + " day"), (if((formula.daysUntilDue) >= 1000 ||
    (formula.daysUntilDue) <= -1000, ("" +
    (formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (formula.daysUntilDue))) + " days"))), (if((formula.daysUntilDue * -1) == 1,
    (if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
    -1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
    ","), ("" + (formula.daysUntilDue * -1))) + " day overdue"),
    (if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
    -1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
    ","), ("" + (formula.daysUntilDue * -1))) + " days overdue"))))))
  daysUntilScheduled: >-
    if((scheduled.isEmpty() == false), ((number(date(scheduled)) -
    number(today())) / 86400000).floor(), null)
  daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
  daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
  isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
  isDueToday: >-
    (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")
  isDueThisWeek: >-
    (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >=
    today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() +
    "7 days").format("YYYY-MM-DD")
  isScheduledToday: >-
    (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")
  isRecurring: recurrence && !recurrence.isEmpty()
  hasTimeEstimate: timeEstimate && timeEstimate > 0
  timeRemaining: >-
    if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries,
    list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
  efficiencyRatio: >-
    if(timeEstimate && timeEstimate > 0 && timeEntries,
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    timeEstimate * 100).round(), null)
  timeTrackedThisWeek: >-
    if(timeEntries, list(timeEntries).filter(value.endTime &&
    date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
  timeTrackedToday: >-
    if(timeEntries, list(timeEntries).filter(value.endTime &&
    date(value.startTime).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
  dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
  dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
  scheduledMonth: >-
    if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not
    scheduled")
  scheduledWeek: >-
    if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"),
    "Not scheduled")
  dueDateCategory: >-
    if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue",
    if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today",
    if(date(due).format("YYYY-MM-DD") == (today() + "1
    day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <=
    (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
  timeEstimateCategory: >-
    if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No
    estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120,
    "Medium (30m-2h)", "Long (>2h)")))
  ageCategory: >-
    if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today",
    if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week",
    if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month",
    "Older")))
  createdMonth: file.ctime.format("YYYY-MM")
  modifiedMonth: file.mtime.format("YYYY-MM")
  priorityCategory: >-
    if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No
    priority"))))
  projectCount: >-
    (if((if(projects, list(projects).length, 0)) == 0, ("No projects"),
    if((if(projects, list(projects).length, 0)) == 1, ("Single project"),
    ("Multiple projects"))))
  contextCount: >-
    (if((if(contexts, list(contexts).length, 0)) == 0, ("No contexts"),
    if((if(contexts, list(contexts).length, 0)) == 1, ("Single context"),
    ("Multiple contexts"))))
  trackingStatus: >-
    if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No
    estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started",
    if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
  nextDate: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), due, scheduled), if((due.isEmpty() == false), due,
    scheduled))
  daysUntilNext: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false),
    min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() ==
    false), formula.daysUntilDue, formula.daysUntilScheduled))
  hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
  isToday: >-
    ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
  isThisWeek: >-
    ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >=
    today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() +
    "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") &&
    date(scheduled).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD"))
  nextDateCategory: >-
    if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() ==
    false) && date(due) < today()) || ((scheduled.isEmpty() == false) &&
    date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) &&
    date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) ||
    ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) &&
    date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"))
    || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD")
    == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty()
    == false) && date(due).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD")), "This week", "Later")))))
  nextDateMonth: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), date(due).format("YYYY-MM"),
    date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false),
    date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false),
    date(scheduled).format("YYYY-MM"), "No date")))
  nextDateWeek: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), date(due).format("YYYY-[W]WW"),
    date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false),
    date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false),
    date(scheduled).format("YYYY-[W]WW"), "No date")))
  urgencyScore: >-
    if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight,
    formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext,
    formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) -
    number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
  timeTrackedFormatted: >-
    if(timeEntries,
    if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60,
    (if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()) >= 1000 ||
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()) <= -1000, ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()))) + "h " +
    if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()) >= 1000 ||
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()) <= -1000, ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()))) + "m"),
    (if((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) >=
    1000 ||
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) <=
    -1000, ("" +
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value,
    0).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()))) +
    "m")), (if((0) >= 1000 || (0) <= -1000, ("" +
    (0)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (0))) + "m"))
  dueDateDisplay: >-
    if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") ==
    (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow",
    if(date(due).format("YYYY-MM-DD") == (today() - "1
    day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(),
    (if((formula.daysUntilDue * -1) == 1, (if((formula.daysUntilDue * -1) >=
    1000 || (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
    -1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
    -1))) + " day ago"), (if((formula.daysUntilDue * -1) >= 1000 ||
    (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
    -1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
    -1))) + " days ago"))), if(date(due).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM
    D")))))))

views:
  - type: tasknotesKanban
    name: "Kanban Board"
    order:
      - status
      - priority
      - due
      - scheduled
      - projects
      - contexts
      - file.tags
      - blockedBy
      - file.name
      - recurrence
      - complete_instances
      - file.tasks
    sort:
      - column: tasknotes_manual_order
        direction: DESC
    groupBy:
      property: status
      direction: ASC
    columnWidth: 280
    hideEmptyColumns: false

tasks-default.base#

Command/template ID: open-tasks-view

# All Tasks

filters:
  and:
    - file.hasTag("task")

formulas:
  priorityWeight: >-
    if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,-1))))
  daysUntilDue: >-
    if((due.isEmpty() == false), ((number(date(due)) - number(today())) /
    86400000).floor(), null)
  dueIn: >-
    if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today",
    if(formula.daysUntilDue > 0, (if((formula.daysUntilDue) == 1,
    (if((formula.daysUntilDue) >= 1000 || (formula.daysUntilDue) <= -1000, ("" +
    (formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (formula.daysUntilDue))) + " day"), (if((formula.daysUntilDue) >= 1000 ||
    (formula.daysUntilDue) <= -1000, ("" +
    (formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (formula.daysUntilDue))) + " days"))), (if((formula.daysUntilDue * -1) == 1,
    (if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
    -1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
    ","), ("" + (formula.daysUntilDue * -1))) + " day overdue"),
    (if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
    -1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
    ","), ("" + (formula.daysUntilDue * -1))) + " days overdue"))))))
  daysUntilScheduled: >-
    if((scheduled.isEmpty() == false), ((number(date(scheduled)) -
    number(today())) / 86400000).floor(), null)
  daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
  daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
  isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
  isDueToday: >-
    (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")
  isDueThisWeek: >-
    (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >=
    today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() +
    "7 days").format("YYYY-MM-DD")
  isScheduledToday: >-
    (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")
  isRecurring: recurrence && !recurrence.isEmpty()
  hasTimeEstimate: timeEstimate && timeEstimate > 0
  timeRemaining: >-
    if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries,
    list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
  efficiencyRatio: >-
    if(timeEstimate && timeEstimate > 0 && timeEntries,
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    timeEstimate * 100).round(), null)
  timeTrackedThisWeek: >-
    if(timeEntries, list(timeEntries).filter(value.endTime &&
    date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
  timeTrackedToday: >-
    if(timeEntries, list(timeEntries).filter(value.endTime &&
    date(value.startTime).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
  dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
  dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
  scheduledMonth: >-
    if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not
    scheduled")
  scheduledWeek: >-
    if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"),
    "Not scheduled")
  dueDateCategory: >-
    if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue",
    if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today",
    if(date(due).format("YYYY-MM-DD") == (today() + "1
    day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <=
    (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
  timeEstimateCategory: >-
    if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No
    estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120,
    "Medium (30m-2h)", "Long (>2h)")))
  ageCategory: >-
    if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today",
    if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week",
    if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month",
    "Older")))
  createdMonth: file.ctime.format("YYYY-MM")
  modifiedMonth: file.mtime.format("YYYY-MM")
  priorityCategory: >-
    if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No
    priority"))))
  projectCount: >-
    (if((if(projects, list(projects).length, 0)) == 0, ("No projects"),
    if((if(projects, list(projects).length, 0)) == 1, ("Single project"),
    ("Multiple projects"))))
  contextCount: >-
    (if((if(contexts, list(contexts).length, 0)) == 0, ("No contexts"),
    if((if(contexts, list(contexts).length, 0)) == 1, ("Single context"),
    ("Multiple contexts"))))
  trackingStatus: >-
    if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No
    estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started",
    if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
  nextDate: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), due, scheduled), if((due.isEmpty() == false), due,
    scheduled))
  daysUntilNext: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false),
    min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() ==
    false), formula.daysUntilDue, formula.daysUntilScheduled))
  hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
  isToday: >-
    ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
  isThisWeek: >-
    ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >=
    today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() +
    "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") &&
    date(scheduled).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD"))
  nextDateCategory: >-
    if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() ==
    false) && date(due) < today()) || ((scheduled.isEmpty() == false) &&
    date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) &&
    date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) ||
    ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) &&
    date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"))
    || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD")
    == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty()
    == false) && date(due).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD")), "This week", "Later")))))
  nextDateMonth: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), date(due).format("YYYY-MM"),
    date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false),
    date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false),
    date(scheduled).format("YYYY-MM"), "No date")))
  nextDateWeek: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), date(due).format("YYYY-[W]WW"),
    date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false),
    date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false),
    date(scheduled).format("YYYY-[W]WW"), "No date")))
  urgencyScore: >-
    if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight,
    formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext,
    formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) -
    number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
  timeTrackedFormatted: >-
    if(timeEntries,
    if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60,
    (if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()) >= 1000 ||
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()) <= -1000, ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()))) + "h " +
    if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()) >= 1000 ||
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()) <= -1000, ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()))) + "m"),
    (if((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) >=
    1000 ||
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) <=
    -1000, ("" +
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value,
    0).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()))) +
    "m")), (if((0) >= 1000 || (0) <= -1000, ("" +
    (0)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (0))) + "m"))
  dueDateDisplay: >-
    if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") ==
    (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow",
    if(date(due).format("YYYY-MM-DD") == (today() - "1
    day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(),
    (if((formula.daysUntilDue * -1) == 1, (if((formula.daysUntilDue * -1) >=
    1000 || (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
    -1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
    -1))) + " day ago"), (if((formula.daysUntilDue * -1) >= 1000 ||
    (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
    -1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
    -1))) + " days ago"))), if(date(due).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM
    D")))))))

views:
  - type: tasknotesTaskList
    name: "Manual Order"
    order:
      - status
      - priority
      - due
      - scheduled
      - projects
      - contexts
      - file.tags
      - blockedBy
      - file.name
      - recurrence
      - complete_instances
      - file.tasks
    sort:
      - column: tasknotes_manual_order
        direction: DESC
    groupBy:
      property: status
      direction: ASC
  - type: tasknotesTaskList
    name: "All Tasks"
    order:
      - status
      - priority
      - due
      - scheduled
      - projects
      - contexts
      - file.tags
      - blockedBy
      - file.name
      - recurrence
      - complete_instances
      - file.tasks
    sort:
      - column: due
        direction: ASC
  - type: tasknotesTaskList
    name: "Not Blocked"
    filters:
      and:
        # Incomplete tasks
        - or:
          # Non-recurring task that's not in any completed status
          - and:
            - recurrence.isEmpty()
            - status != "done"
          # Recurring task where today is not in complete_instances
          - and:
            - recurrence.isEmpty() == false
            - complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
        # Not blocked by any incomplete tasks
        - or:
          # No blocking dependencies at all
          - blockedBy.isEmpty()
          # All blocking tasks are completed (filter returns only incomplete, then check if empty)
          - "list(blockedBy).filter(file(if(value.isType(\"object\"), value.uid, value)).properties.status != \"done\").isEmpty()"
    order:
      - status
      - priority
      - due
      - scheduled
      - projects
      - contexts
      - file.tags
      - blockedBy
      - file.name
      - recurrence
      - complete_instances
      - file.tasks
    sort:
      - column: formula.urgencyScore
        direction: DESC
  - type: tasknotesTaskList
    name: "Today"
    filters:
      and:
        # Incomplete tasks (handles both recurring and non-recurring)
        - or:
          # Non-recurring task that's not in any completed status
          - and:
            - recurrence.isEmpty()
            - status != "done"
          # Recurring task where today is not in complete_instances
          - and:
            - recurrence.isEmpty() == false
            - complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
        # Due or scheduled today
        - or:
          - and:
            - due.isEmpty() == false
            - date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
          - and:
            - scheduled.isEmpty() == false
            - date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")
    order:
      - status
      - priority
      - due
      - scheduled
      - projects
      - contexts
      - file.tags
      - blockedBy
      - file.name
      - recurrence
      - complete_instances
      - file.tasks
    sort:
      - column: formula.urgencyScore
        direction: DESC
  - type: tasknotesTaskList
    name: "Overdue"
    filters:
      and:
        # Incomplete tasks
        - or:
          # Non-recurring task that's not in any completed status
          - and:
            - recurrence.isEmpty()
            - status != "done"
          # Recurring task where today is not in complete_instances
          - and:
            - recurrence.isEmpty() == false
            - complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
        # Due or scheduled in the past
        - or:
          - and:
            - due.isEmpty() == false
            - date(due) < today()
          - and:
            - scheduled.isEmpty() == false
            - date(scheduled) < today()
    order:
      - status
      - priority
      - due
      - scheduled
      - projects
      - contexts
      - file.tags
      - blockedBy
      - file.name
      - recurrence
      - complete_instances
      - file.tasks
    sort:
      - column: formula.urgencyScore
        direction: DESC
  - type: tasknotesTaskList
    name: "This Week"
    filters:
      and:
        # Incomplete tasks
        - or:
          # Non-recurring task that's not in any completed status
          - and:
            - recurrence.isEmpty()
            - status != "done"
          # Recurring task where today is not in complete_instances
          - and:
            - recurrence.isEmpty() == false
            - complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
        # Due or scheduled this week
        - or:
          - and:
            - due.isEmpty() == false
            - date(due).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD")
            - date(due).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
          - and:
            - scheduled.isEmpty() == false
            - date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD")
            - date(scheduled).format("YYYY-MM-DD") <= (today() + "7 days").format("YYYY-MM-DD")
    order:
      - status
      - priority
      - due
      - scheduled
      - projects
      - contexts
      - file.tags
      - blockedBy
      - file.name
      - recurrence
      - complete_instances
      - file.tasks
    sort:
      - column: formula.urgencyScore
        direction: DESC
  - type: tasknotesTaskList
    name: "Unscheduled"
    filters:
      and:
        # Incomplete tasks
        - or:
          # Non-recurring task that's not in any completed status
          - and:
            - recurrence.isEmpty()
            - status != "done"
          # Recurring task where today is not in complete_instances
          - and:
            - recurrence.isEmpty() == false
            - complete_instances.map(date(value).format("YYYY-MM-DD")).contains(today().format("YYYY-MM-DD")) != true
        # No due date and no scheduled date
        - date(due).isEmpty()
        - date(scheduled).isEmpty()
    order:
      - status
      - priority
      - due
      - scheduled
      - projects
      - contexts
      - file.tags
      - blockedBy
      - file.name
      - recurrence
      - complete_instances
      - file.tasks
    sort:
      - column: status
        direction: ASC

calendar-default.base#

Command/template ID: open-advanced-calendar-view

# Calendar

filters:
  and:
    - file.hasTag("task")

formulas:
  priorityWeight: >-
    if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,-1))))
  daysUntilDue: >-
    if((due.isEmpty() == false), ((number(date(due)) - number(today())) /
    86400000).floor(), null)
  dueIn: >-
    if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today",
    if(formula.daysUntilDue > 0, (if((formula.daysUntilDue) == 1,
    (if((formula.daysUntilDue) >= 1000 || (formula.daysUntilDue) <= -1000, ("" +
    (formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (formula.daysUntilDue))) + " day"), (if((formula.daysUntilDue) >= 1000 ||
    (formula.daysUntilDue) <= -1000, ("" +
    (formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (formula.daysUntilDue))) + " days"))), (if((formula.daysUntilDue * -1) == 1,
    (if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
    -1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
    ","), ("" + (formula.daysUntilDue * -1))) + " day overdue"),
    (if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
    -1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
    ","), ("" + (formula.daysUntilDue * -1))) + " days overdue"))))))
  daysUntilScheduled: >-
    if((scheduled.isEmpty() == false), ((number(date(scheduled)) -
    number(today())) / 86400000).floor(), null)
  daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
  daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
  isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
  isDueToday: >-
    (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")
  isDueThisWeek: >-
    (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >=
    today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() +
    "7 days").format("YYYY-MM-DD")
  isScheduledToday: >-
    (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")
  isRecurring: recurrence && !recurrence.isEmpty()
  hasTimeEstimate: timeEstimate && timeEstimate > 0
  timeRemaining: >-
    if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries,
    list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
  efficiencyRatio: >-
    if(timeEstimate && timeEstimate > 0 && timeEntries,
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    timeEstimate * 100).round(), null)
  timeTrackedThisWeek: >-
    if(timeEntries, list(timeEntries).filter(value.endTime &&
    date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
  timeTrackedToday: >-
    if(timeEntries, list(timeEntries).filter(value.endTime &&
    date(value.startTime).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
  dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
  dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
  scheduledMonth: >-
    if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not
    scheduled")
  scheduledWeek: >-
    if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"),
    "Not scheduled")
  dueDateCategory: >-
    if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue",
    if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today",
    if(date(due).format("YYYY-MM-DD") == (today() + "1
    day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <=
    (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
  timeEstimateCategory: >-
    if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No
    estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120,
    "Medium (30m-2h)", "Long (>2h)")))
  ageCategory: >-
    if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today",
    if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week",
    if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month",
    "Older")))
  createdMonth: file.ctime.format("YYYY-MM")
  modifiedMonth: file.mtime.format("YYYY-MM")
  priorityCategory: >-
    if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No
    priority"))))
  projectCount: >-
    (if((if(projects, list(projects).length, 0)) == 0, ("No projects"),
    if((if(projects, list(projects).length, 0)) == 1, ("Single project"),
    ("Multiple projects"))))
  contextCount: >-
    (if((if(contexts, list(contexts).length, 0)) == 0, ("No contexts"),
    if((if(contexts, list(contexts).length, 0)) == 1, ("Single context"),
    ("Multiple contexts"))))
  trackingStatus: >-
    if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No
    estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started",
    if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
  nextDate: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), due, scheduled), if((due.isEmpty() == false), due,
    scheduled))
  daysUntilNext: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false),
    min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() ==
    false), formula.daysUntilDue, formula.daysUntilScheduled))
  hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
  isToday: >-
    ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
  isThisWeek: >-
    ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >=
    today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() +
    "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") &&
    date(scheduled).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD"))
  nextDateCategory: >-
    if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() ==
    false) && date(due) < today()) || ((scheduled.isEmpty() == false) &&
    date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) &&
    date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) ||
    ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) &&
    date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"))
    || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD")
    == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty()
    == false) && date(due).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD")), "This week", "Later")))))
  nextDateMonth: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), date(due).format("YYYY-MM"),
    date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false),
    date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false),
    date(scheduled).format("YYYY-MM"), "No date")))
  nextDateWeek: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), date(due).format("YYYY-[W]WW"),
    date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false),
    date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false),
    date(scheduled).format("YYYY-[W]WW"), "No date")))
  urgencyScore: >-
    if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight,
    formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext,
    formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) -
    number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
  timeTrackedFormatted: >-
    if(timeEntries,
    if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60,
    (if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()) >= 1000 ||
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()) <= -1000, ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()))) + "h " +
    if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()) >= 1000 ||
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()) <= -1000, ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()))) + "m"),
    (if((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) >=
    1000 ||
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) <=
    -1000, ("" +
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value,
    0).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()))) +
    "m")), (if((0) >= 1000 || (0) <= -1000, ("" +
    (0)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (0))) + "m"))
  dueDateDisplay: >-
    if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") ==
    (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow",
    if(date(due).format("YYYY-MM-DD") == (today() - "1
    day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(),
    (if((formula.daysUntilDue * -1) == 1, (if((formula.daysUntilDue * -1) >=
    1000 || (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
    -1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
    -1))) + " day ago"), (if((formula.daysUntilDue * -1) >= 1000 ||
    (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
    -1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
    -1))) + " days ago"))), if(date(due).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM
    D")))))))

views:
  - type: tasknotesCalendar
    name: "Calendar"
    order:
      - status
      - priority
      - due
      - scheduled
      - projects
      - contexts
      - file.tags
      - blockedBy
      - file.name
      - recurrence
      - complete_instances
      - file.tasks
    showScheduled: true
    showDue: true
    showRecurring: true
    showTimeEntries: true
    showTimeblocks: true
    showPropertyBasedEvents: true
    createDailyNotesFromDateLinks: true
    calendarView: "timeGridWeek"
    customDayCount: 3
    firstDay: 1

agenda-default.base#

Command/template ID: open-agenda-view

# Agenda

filters:
  and:
    - file.hasTag("task")

formulas:
  priorityWeight: >-
    if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,-1))))
  daysUntilDue: >-
    if((due.isEmpty() == false), ((number(date(due)) - number(today())) /
    86400000).floor(), null)
  dueIn: >-
    if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today",
    if(formula.daysUntilDue > 0, (if((formula.daysUntilDue) == 1,
    (if((formula.daysUntilDue) >= 1000 || (formula.daysUntilDue) <= -1000, ("" +
    (formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (formula.daysUntilDue))) + " day"), (if((formula.daysUntilDue) >= 1000 ||
    (formula.daysUntilDue) <= -1000, ("" +
    (formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (formula.daysUntilDue))) + " days"))), (if((formula.daysUntilDue * -1) == 1,
    (if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
    -1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
    ","), ("" + (formula.daysUntilDue * -1))) + " day overdue"),
    (if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
    -1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
    ","), ("" + (formula.daysUntilDue * -1))) + " days overdue"))))))
  daysUntilScheduled: >-
    if((scheduled.isEmpty() == false), ((number(date(scheduled)) -
    number(today())) / 86400000).floor(), null)
  daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
  daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
  isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
  isDueToday: >-
    (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")
  isDueThisWeek: >-
    (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >=
    today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() +
    "7 days").format("YYYY-MM-DD")
  isScheduledToday: >-
    (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")
  isRecurring: recurrence && !recurrence.isEmpty()
  hasTimeEstimate: timeEstimate && timeEstimate > 0
  timeRemaining: >-
    if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries,
    list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
  efficiencyRatio: >-
    if(timeEstimate && timeEstimate > 0 && timeEntries,
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    timeEstimate * 100).round(), null)
  timeTrackedThisWeek: >-
    if(timeEntries, list(timeEntries).filter(value.endTime &&
    date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
  timeTrackedToday: >-
    if(timeEntries, list(timeEntries).filter(value.endTime &&
    date(value.startTime).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
  dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
  dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
  scheduledMonth: >-
    if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not
    scheduled")
  scheduledWeek: >-
    if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"),
    "Not scheduled")
  dueDateCategory: >-
    if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue",
    if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today",
    if(date(due).format("YYYY-MM-DD") == (today() + "1
    day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <=
    (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
  timeEstimateCategory: >-
    if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No
    estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120,
    "Medium (30m-2h)", "Long (>2h)")))
  ageCategory: >-
    if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today",
    if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week",
    if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month",
    "Older")))
  createdMonth: file.ctime.format("YYYY-MM")
  modifiedMonth: file.mtime.format("YYYY-MM")
  priorityCategory: >-
    if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No
    priority"))))
  projectCount: >-
    (if((if(projects, list(projects).length, 0)) == 0, ("No projects"),
    if((if(projects, list(projects).length, 0)) == 1, ("Single project"),
    ("Multiple projects"))))
  contextCount: >-
    (if((if(contexts, list(contexts).length, 0)) == 0, ("No contexts"),
    if((if(contexts, list(contexts).length, 0)) == 1, ("Single context"),
    ("Multiple contexts"))))
  trackingStatus: >-
    if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No
    estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started",
    if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
  nextDate: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), due, scheduled), if((due.isEmpty() == false), due,
    scheduled))
  daysUntilNext: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false),
    min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() ==
    false), formula.daysUntilDue, formula.daysUntilScheduled))
  hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
  isToday: >-
    ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
  isThisWeek: >-
    ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >=
    today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() +
    "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") &&
    date(scheduled).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD"))
  nextDateCategory: >-
    if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() ==
    false) && date(due) < today()) || ((scheduled.isEmpty() == false) &&
    date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) &&
    date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) ||
    ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) &&
    date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"))
    || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD")
    == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty()
    == false) && date(due).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD")), "This week", "Later")))))
  nextDateMonth: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), date(due).format("YYYY-MM"),
    date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false),
    date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false),
    date(scheduled).format("YYYY-MM"), "No date")))
  nextDateWeek: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), date(due).format("YYYY-[W]WW"),
    date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false),
    date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false),
    date(scheduled).format("YYYY-[W]WW"), "No date")))
  urgencyScore: >-
    if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight,
    formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext,
    formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) -
    number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
  timeTrackedFormatted: >-
    if(timeEntries,
    if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60,
    (if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()) >= 1000 ||
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()) <= -1000, ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()))) + "h " +
    if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()) >= 1000 ||
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()) <= -1000, ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()))) + "m"),
    (if((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) >=
    1000 ||
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) <=
    -1000, ("" +
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value,
    0).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()))) +
    "m")), (if((0) >= 1000 || (0) <= -1000, ("" +
    (0)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (0))) + "m"))
  dueDateDisplay: >-
    if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") ==
    (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow",
    if(date(due).format("YYYY-MM-DD") == (today() - "1
    day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(),
    (if((formula.daysUntilDue * -1) == 1, (if((formula.daysUntilDue * -1) >=
    1000 || (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
    -1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
    -1))) + " day ago"), (if((formula.daysUntilDue * -1) >= 1000 ||
    (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
    -1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
    -1))) + " days ago"))), if(date(due).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM
    D")))))))

properties:
  formula.dueIn:
    displayName: "Due in"


views:
  - type: tasknotesCalendar
    name: "Agenda"
    order:
      - status
      - priority
      - due
      - formula.dueIn
      - scheduled
      - projects
      - contexts
      - file.tags
      - blockedBy
      - file.name
      - recurrence
      - complete_instances
      - file.tasks
    showPropertyBasedEvents: false
    showOverdueOnToday: true
    createDailyNotesFromDateLinks: true
    calendarView: "listWeek"
    startDateProperty: file.ctime
    listDayCount: 7
    titleProperty: file.basename

pomodoro-stats.base#

Command/template ID: pomodoro-stats-base

# Pomodoro statistics
# Generated with your TaskNotes settings
# Requires Pomodoro data storage to be set to Daily notes.

filters:
  and:
    - file.hasProperty("pomodoros")
    - list(note["pomodoros"]).filter(value.startTime).isEmpty() == false

formulas:
  pomodoroDate: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.startTime).map(date(value.startTime).format("YYYY-MM-DD")).unique().join(", "), file.basename)'
  pomodoroMonth: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.startTime).map(date(value.startTime).format("YYYY-MM")).unique().join(", "), "")'
  completedPomos: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == true).length, 0)'
  attemptedPomos: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work").length, 0)'
  interruptedPomos: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == false).length, 0)'
  focusMinutes: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "work" && value.completed == true).map(if(value.plannedDuration && value.plannedDuration > 0, value.plannedDuration, if(value.startTime && value.endTime, ((number(date(value.endTime)) - number(date(value.startTime))) / 60000).round(), 0))).reduce(acc + value, 0).round(), 0)'
  focusTime: "if(formula.focusMinutes >= 60, (if(((formula.focusMinutes / 60).floor()) >= 1000 || ((formula.focusMinutes / 60).floor()) <= -1000, (\"\" + ((formula.focusMinutes / 60).floor())).replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"), (\"\" + ((formula.focusMinutes / 60).floor()))) + \"h \" + if(((formula.focusMinutes % 60).round()) >= 1000 || ((formula.focusMinutes % 60).round()) <= -1000, (\"\" + ((formula.focusMinutes % 60).round())).replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"), (\"\" + ((formula.focusMinutes % 60).round()))) + \"m\"), (if((formula.focusMinutes) >= 1000 || (formula.focusMinutes) <= -1000, (\"\" + (formula.focusMinutes)).replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"), (\"\" + (formula.focusMinutes))) + \"m\"))"
  completionRate: "(if((if(formula.attemptedPomos > 0, (formula.completedPomos / formula.attemptedPomos * 100).round(), 0)) >= 1000 || (if(formula.attemptedPomos > 0, (formula.completedPomos / formula.attemptedPomos * 100).round(), 0)) <= -1000, (\"\" + (if(formula.attemptedPomos > 0, (formula.completedPomos / formula.attemptedPomos * 100).round(), 0))).replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\"), (\"\" + (if(formula.attemptedPomos > 0, (formula.completedPomos / formula.attemptedPomos * 100).round(), 0)))) + \"%\")"
  shortBreaks: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "short-break").length, 0)'
  longBreaks: 'if(note["pomodoros"], list(note["pomodoros"]).filter(value.type == "long-break").length, 0)'

properties:
  formula.pomodoroDate:
    displayName: "Date"
  formula.pomodoroMonth:
    displayName: "Month"
  formula.completedPomos:
    displayName: "Completed"
  formula.attemptedPomos:
    displayName: "Attempted"
  formula.interruptedPomos:
    displayName: "Interrupted"
  formula.focusMinutes:
    displayName: "Focus minutes"
  formula.focusTime:
    displayName: "Focus time"
  formula.completionRate:
    displayName: "Completion"
  formula.shortBreaks:
    displayName: "Short breaks"
  formula.longBreaks:
    displayName: "Long breaks"

views:
  - type: table
    name: "Daily"
    order:
      - formula.pomodoroDate
      - formula.completedPomos
      - formula.focusTime
      - formula.attemptedPomos
      - formula.completionRate
      - formula.interruptedPomos
      - formula.shortBreaks
      - formula.longBreaks
      - file.name
    sort:
      - column: formula.pomodoroDate
        direction: DESC
  - type: table
    name: "Monthly"
    groupBy:
      property: formula.pomodoroMonth
      direction: DESC
    order:
      - formula.pomodoroDate
      - formula.completedPomos
      - formula.focusMinutes
      - formula.focusTime
      - formula.attemptedPomos
      - formula.completionRate
      - formula.interruptedPomos
      - formula.shortBreaks
      - formula.longBreaks
      - file.name
    summaries:
      formula.completedPomos: Sum
      formula.focusMinutes: Sum
      formula.attemptedPomos: Sum
      formula.interruptedPomos: Sum
      formula.shortBreaks: Sum
      formula.longBreaks: Sum
    sort:
      - column: formula.pomodoroDate
        direction: DESC

relationships.base#

Command/template ID: relationships

# Relationships
# This view shows all relationships for the current file
# Dynamically shows/hides tabs based on available data

formulas:
  priorityWeight: >-
    if(priority=="none",0,if(priority=="low",1,if(priority=="normal",2,if(priority=="high",3,-1))))
  daysUntilDue: >-
    if((due.isEmpty() == false), ((number(date(due)) - number(today())) /
    86400000).floor(), null)
  dueIn: >-
    if(due.isEmpty(), "", if(formula.daysUntilDue == 0, "Today",
    if(formula.daysUntilDue > 0, (if((formula.daysUntilDue) == 1,
    (if((formula.daysUntilDue) >= 1000 || (formula.daysUntilDue) <= -1000, ("" +
    (formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (formula.daysUntilDue))) + " day"), (if((formula.daysUntilDue) >= 1000 ||
    (formula.daysUntilDue) <= -1000, ("" +
    (formula.daysUntilDue)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (formula.daysUntilDue))) + " days"))), (if((formula.daysUntilDue * -1) == 1,
    (if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
    -1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
    ","), ("" + (formula.daysUntilDue * -1))) + " day overdue"),
    (if((formula.daysUntilDue * -1) >= 1000 || (formula.daysUntilDue * -1) <=
    -1000, ("" + (formula.daysUntilDue * -1)).replace(/\B(?=(\d{3})+(?!\d))/g,
    ","), ("" + (formula.daysUntilDue * -1))) + " days overdue"))))))
  daysUntilScheduled: >-
    if((scheduled.isEmpty() == false), ((number(date(scheduled)) -
    number(today())) / 86400000).floor(), null)
  daysSinceCreated: ((number(now()) - number(file.ctime)) / 86400000).floor()
  daysSinceModified: ((number(now()) - number(file.mtime)) / 86400000).floor()
  isOverdue: (due.isEmpty() == false) && date(due) < today() && status != "done"
  isDueToday: >-
    (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")
  isDueThisWeek: >-
    (due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >=
    today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() +
    "7 days").format("YYYY-MM-DD")
  isScheduledToday: >-
    (scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")
  isRecurring: recurrence && !recurrence.isEmpty()
  hasTimeEstimate: timeEstimate && timeEstimate > 0
  timeRemaining: >-
    if(timeEstimate && timeEstimate > 0, timeEstimate - if(timeEntries,
    list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0), 0), null)
  efficiencyRatio: >-
    if(timeEstimate && timeEstimate > 0 && timeEntries,
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    timeEstimate * 100).round(), null)
  timeTrackedThisWeek: >-
    if(timeEntries, list(timeEntries).filter(value.endTime &&
    date(value.startTime) >= today() - "7d").map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
  timeTrackedToday: >-
    if(timeEntries, list(timeEntries).filter(value.endTime &&
    date(value.startTime).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round(), 0)
  dueMonth: if((due.isEmpty() == false), date(due).format("YYYY-MM"), "No due date")
  dueWeek: if((due.isEmpty() == false), date(due).format("YYYY-[W]WW"), "No due date")
  scheduledMonth: >-
    if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-MM"), "Not
    scheduled")
  scheduledWeek: >-
    if((scheduled.isEmpty() == false), date(scheduled).format("YYYY-[W]WW"),
    "Not scheduled")
  dueDateCategory: >-
    if(due.isEmpty(), "No due date", if(date(due) < today(), "Overdue",
    if(date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"), "Today",
    if(date(due).format("YYYY-MM-DD") == (today() + "1
    day").format("YYYY-MM-DD"), "Tomorrow", if(date(due).format("YYYY-MM-DD") <=
    (today() + "7 days").format("YYYY-MM-DD"), "This week", "Later")))))
  timeEstimateCategory: >-
    if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No
    estimate", if(timeEstimate < 30, "Quick (<30m)", if(timeEstimate <= 120,
    "Medium (30m-2h)", "Long (>2h)")))
  ageCategory: >-
    if(((number(now()) - number(file.ctime)) / 86400000) < 1, "Today",
    if(((number(now()) - number(file.ctime)) / 86400000) < 7, "This week",
    if(((number(now()) - number(file.ctime)) / 86400000) < 30, "This month",
    "Older")))
  createdMonth: file.ctime.format("YYYY-MM")
  modifiedMonth: file.mtime.format("YYYY-MM")
  priorityCategory: >-
    if(priority=="none","None",if(priority=="low","Low",if(priority=="normal","Normal",if(priority=="high","High","No
    priority"))))
  projectCount: >-
    (if((if(projects, list(projects).length, 0)) == 0, ("No projects"),
    if((if(projects, list(projects).length, 0)) == 1, ("Single project"),
    ("Multiple projects"))))
  contextCount: >-
    (if((if(contexts, list(contexts).length, 0)) == 0, ("No contexts"),
    if((if(contexts, list(contexts).length, 0)) == 1, ("Single context"),
    ("Multiple contexts"))))
  trackingStatus: >-
    if(!timeEstimate || timeEstimate == 0 || timeEstimate == null, "No
    estimate", if(!timeEntries || list(timeEntries).length == 0, "Not started",
    if(formula.efficiencyRatio < 100, "Under estimate", "Over estimate")))
  nextDate: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), due, scheduled), if((due.isEmpty() == false), due,
    scheduled))
  daysUntilNext: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false),
    min(formula.daysUntilDue, formula.daysUntilScheduled), if((due.isEmpty() ==
    false), formula.daysUntilDue, formula.daysUntilScheduled))
  hasDate: (due.isEmpty() == false) || (scheduled.isEmpty() == false)
  isToday: >-
    ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") == today().format("YYYY-MM-DD"))
  isThisWeek: >-
    ((due.isEmpty() == false) && date(due).format("YYYY-MM-DD") >=
    today().format("YYYY-MM-DD") && date(due).format("YYYY-MM-DD") <= (today() +
    "7 days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") >= today().format("YYYY-MM-DD") &&
    date(scheduled).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD"))
  nextDateCategory: >-
    if(due.isEmpty() && scheduled.isEmpty(), "No date", if(((due.isEmpty() ==
    false) && date(due) < today()) || ((scheduled.isEmpty() == false) &&
    date(scheduled) < today()), "Overdue/Past", if(((due.isEmpty() == false) &&
    date(due).format("YYYY-MM-DD") == today().format("YYYY-MM-DD")) ||
    ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD")), "Today", if(((due.isEmpty() == false) &&
    date(due).format("YYYY-MM-DD") == (today() + "1 day").format("YYYY-MM-DD"))
    || ((scheduled.isEmpty() == false) && date(scheduled).format("YYYY-MM-DD")
    == (today() + "1 day").format("YYYY-MM-DD")), "Tomorrow", if(((due.isEmpty()
    == false) && date(due).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD")) || ((scheduled.isEmpty() == false) &&
    date(scheduled).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD")), "This week", "Later")))))
  nextDateMonth: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), date(due).format("YYYY-MM"),
    date(scheduled).format("YYYY-MM")), if((due.isEmpty() == false),
    date(due).format("YYYY-MM"), if((scheduled.isEmpty() == false),
    date(scheduled).format("YYYY-MM"), "No date")))
  nextDateWeek: >-
    if((due.isEmpty() == false) && (scheduled.isEmpty() == false), if(date(due)
    < date(scheduled), date(due).format("YYYY-[W]WW"),
    date(scheduled).format("YYYY-[W]WW")), if((due.isEmpty() == false),
    date(due).format("YYYY-[W]WW"), if((scheduled.isEmpty() == false),
    date(scheduled).format("YYYY-[W]WW"), "No date")))
  urgencyScore: >-
    if(due.isEmpty() && scheduled.isEmpty(), formula.priorityWeight,
    formula.priorityWeight + max(0, 10 - if(formula.daysUntilNext,
    formula.daysUntilNext, 0)) + (1 - ((number(date(formula.nextDate)) -
    number(date(date(formula.nextDate).format("YYYY-MM-DD")))) / 86400000)))
  timeTrackedFormatted: >-
    if(timeEntries,
    if(list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) >= 60,
    (if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()) >= 1000 ||
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()) <= -1000, ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) /
    60).floor()))) + "h " +
    if(((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()) >= 1000 ||
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()) <= -1000, ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    ((list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0) %
    60).round()))) + "m"),
    (if((list(timeEntries).filter(value.endTime).map((number(date(value.endTime))
    - number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) >=
    1000 ||
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()) <=
    -1000, ("" +
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value,
    0).round())).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" +
    (list(timeEntries).filter(value.endTime).map((number(date(value.endTime)) -
    number(date(value.startTime))) / 60000).reduce(acc + value, 0).round()))) +
    "m")), (if((0) >= 1000 || (0) <= -1000, ("" +
    (0)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (0))) + "m"))
  dueDateDisplay: >-
    if(due.isEmpty(), "", if(date(due).format("YYYY-MM-DD") ==
    today().format("YYYY-MM-DD"), "Today", if(date(due).format("YYYY-MM-DD") ==
    (today() + "1 day").format("YYYY-MM-DD"), "Tomorrow",
    if(date(due).format("YYYY-MM-DD") == (today() - "1
    day").format("YYYY-MM-DD"), "Yesterday", if(date(due) < today(),
    (if((formula.daysUntilDue * -1) == 1, (if((formula.daysUntilDue * -1) >=
    1000 || (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
    -1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
    -1))) + " day ago"), (if((formula.daysUntilDue * -1) >= 1000 ||
    (formula.daysUntilDue * -1) <= -1000, ("" + (formula.daysUntilDue *
    -1)).replace(/\B(?=(\d{3})+(?!\d))/g, ","), ("" + (formula.daysUntilDue *
    -1))) + " days ago"))), if(date(due).format("YYYY-MM-DD") <= (today() + "7
    days").format("YYYY-MM-DD"), date(due).format("ddd"), date(due).format("MMM
    D")))))))

views:
  - type: tasknotesKanban
    name: "Subtasks"
    filters:
      and:
        - file.hasTag("task")
        - file.hasLink(this.file) && list(note.projects).map(file(value.replace(/^\[[^\]]+\]\((.*)\)$/, "$1").replace(/%20/g, " ")).asLink()).contains(this.file.asLink())
    order:
      - status
      - priority
      - due
      - scheduled
      - projects
      - contexts
      - file.tags
      - blockedBy
      - file.name
      - recurrence
      - complete_instances
      - file.tasks
    sort:
      - column: tasknotes_manual_order
        direction: DESC
    groupBy:
      property: status
      direction: ASC
  - type: tasknotesTaskList
    name: "Occurrences"
    filters:
      and:
        - file.hasTag("task")
        - file.hasLink(this.file) && note.recurrence_parent && file(note.recurrence_parent.replace(/^\[[^\]]+\]\((.*)\)$/, "$1").replace(/%20/g, " ")).asLink() == this.file.asLink()
    order:
      - status
      - priority
      - due
      - scheduled
      - occurrence_date
      - projects
      - contexts
      - file.tags
      - blockedBy
      - file.name
      - recurrence
      - complete_instances
      - file.tasks
    sort:
      - column: occurrence_date
        direction: ASC
  - type: tasknotesTaskList
    name: "Projects"
    filters:
      and:
        - list(this.projects).map(file(value.replace(/^\[[^\]]+\]\((.*)\)$/, "$1").replace(/%20/g, " ")).asLink()).contains(file.asLink())
    order:
      - status
      - priority
      - due
      - scheduled
      - projects
      - contexts
      - file.tags
      - blockedBy
      - file.name
      - recurrence
      - complete_instances
      - file.tasks
  - type: tasknotesTaskList
    name: "Blocked By"
    filters:
      and:
        - file.hasTag("task")
        - list(this.note.blockedBy).map(file(if(value.isType("object"), value.uid, value)).asLink()).contains(file.asLink())
    order:
      - status
      - priority
      - due
      - scheduled
      - projects
      - contexts
      - file.tags
      - blockedBy
      - file.name
      - recurrence
      - complete_instances
      - file.tasks
    sort:
      - column: tasknotes_manual_order
        direction: DESC
  - type: tasknotesKanban
    name: "Blocking"
    filters:
      and:
        - file.hasTag("task")
        - list(note.blockedBy).map(file(if(value.isType("object"), value.uid, value)).asLink()).contains(this.file.asLink())
    order:
      - status
      - priority
      - due
      - scheduled
      - projects
      - contexts
      - file.tags
      - blockedBy
      - file.name
      - recurrence
      - complete_instances
      - file.tasks
    sort:
      - column: tasknotes_manual_order
        direction: DESC
    groupBy:
      property: status
      direction: ASC
Source: tasknotes:docs-builder/src/generated-pages.jsView source