Rollover Daily Todos - rollover Task Statuses?

I am using Obsidian (at the Supporter level) to manage my daily to-do items, and enjoy the “Rollover Daily Todos” plugin which rolls yesterday’s to-do items to today’s daily note.

I recently installed the Things theme (2.1.19) which enabled the “[/]” Task Status for ‘In Progress’ items (among other useful task statuses).

I’d like the Rollover Daily Todos plugin to roll over ALL to-do items from yesterday to today’s daily note that are NOT in a status of complete (“”). Is there a way to do that?

I could envision a regex that excluded only “” but included all other bracketed items (like “[/]”) to be rolled over from day to day. But I lack the skills to implement that…

I’ve not used that plugin, but I’m having a note called “Running tasks”, which lifts all non-completed tasks from my daily notes for any given period. This way I’m able to pull all these tasks, and complete them in that window, and it’ll “roll over” all my tasks from the recent period.

This solution does not actually move the tasks from yesterdays daily note, but I think that seems to be a not wanted action as you’ll duplicate tasks if they keep being rolled over. Using dataview’s completion date, I could either way see if a task created a few days ago was completed today, by looking at the completion date.

(Side note: I’m using various task status to kind of implement a bullet journaling task system, and using a query to sum all open tasks is rather easy using a WHERE clause like: contains(list(" ", "/", "\\"), status) (The latter variant is a personal implementation of a three quarter done task))

1 Like

Thanks for your reply! Can you detail (I’m a newbie!) how you set that up? That sounds like it might work for my needs!

I’m a heavy user of decorated tasks, so I’ve used a lot of task status characters spread across task in daily notes to mark. Here is a simple example of all the ones directly related to doable tasks, and some tasks to illustrate how I use decorated tasks as place markers when I’ve done some stuff.

## A constructed daily notes example
 - [ ] Undone
 - [/] Halfway / Started
 - [\] Nearly done
 - [x] Done ✅ 2023-11-18
 - [>] Migrated
 - [<] Scheduled
 - [-] Deleted/irrelevant

The list above uses all the variants for actual tasks in my current setup. They closely mimic the bullet journaling setup. I've added the `\\` to make a note of tasks nearly finished, but not entirely. And I use the **migrated** status to move tasks ahead from previous month to current month. If I decide _not to keep working_ on that task I either delete or **schedules** it away into another note outside of my daily notes as a noteworthy task

- [p] I love using decorated task to make points
- [c] Didn't like the new thingy

Then I continue my daily note with other bits and pieces...

- [g] Went for a walk around the lake
- [y] Saw some YouTube videos

After breakfast I took a long walk enjoying the nature around the lake next to my house. The weather was nice, but it was a bit cold. When I came back home I sat down and saw too many YouTube videoes.

Using the minimal theme, and some custom CSS, this displays as:

And then I’ve got a file named “Running tasks” which I’ve pinned to my right side panel, and it has code similar to the following:


## Open BuJo tasks
```dataview
TASK
WHERE file = this.file
  AND contains(list(" ", "/", "\\"), status)
```

## Not open BuJo tasks
```dataview
TASK
WHERE file = this.file
  AND contains(list("x", ">", "<", "-"), status)
```

## Other tasks
## Other tasks
```dataview
TASK
WHERE file = this.file
  AND !contains(list(" ", "/", "\\", "x", ">", "<", "-"), status)
FLATTEN link(file.link, string(file.day)) + ": " + text as visual
SORT status
```

The file = this.file is to be replaced with something limiting the query to your daily notes. As it stands you can put all of the markup in one file, and get a output similar to:

Using a setup like this the side panel will show me tasks in their various states, and sum up other tasks related to status. And some of them include the originating daily note link, as seen in the Other tasks section. I find this setup to work nicely, as it is easy to get the overview of current tasks and handle them. If I need to change the status of a task I just click the task text and it opens that daily note, and to complete it I just hit the circle.

The other decorated tasks also helps me to at a glance see what I’ve used my time to in the current period (which in my case usually is a month, since I’m not too good at jotting down everything, but focus on larger stuff).

Some notes on matching time period

In my actual setup I’ve also have criteria like: contains(file.tags, this.period) where I’ve set the property period to the current time period. I’m contemplating on making this automatic though, so that most queries show current period, but one query focuses on open tasks from last period which needs proper care and maintenance.

Then I would add criteria like dateformat(file.day, "yyyy-MM") = dateformat(date(today), "yyyy-MM") and similar to limit the tasks to current period.

Check out the Obligator plugin. It manages decorated tasks and does a lot of great stuff.

1 Like

I love your setup for the - [/] Halfway / Started and - Nearly done checkboxes.
Would you mind sharing your CSS snippets to have it render as you have with the minimal theme ?

Also, I like to use the “toggle checkbox” hotkeys. Do you think it’s possible to have the hotkey cycle between all states ? (undone, started, nearly done, done)

Thanks a lot !

1 Like

I’m using the Minimal theme most of the time, but I tried making this standalone, and it seems to work for the default theme now. So this text:

- [ ] Not started
- [/] Started, at least a little bit
- [\] Soon to be finished
- [x] Finished
- [>] Migrated
- [<] Scheduled/deferred
- [-] Canceled

Will display like the image below, when you apply the CSS as the bottom to it:
image

/* Set the base color to blue */
input:checked,
li[data-task] > input:checked,
li[data-task] > p > input:checked {
   --checkbox-color: var(--color-blue);
}

input[type=checkbox] {
    -webkit-appearance: none;
    appearance: none;
    border-radius: 50%;
}

.markdown-preview-view .task-list-item-checkbox {
  position: relative;
  top: 2px;
  left: 0px;
}


/* General section for all the alternate checkboxes */
input[data-task="-"]:checked,
li[data-task="-"] > input:checked,
li[data-task="-"] > p > input:checked, 
input[data-task="/"]:checked,
li[data-task="/"] > input:checked,
li[data-task="/"] > p > input:checked, 
input[data-task=">"]:checked,
li[data-task=">"] > input:checked,
li[data-task=">"] > p > input:checked, 
input[data-task="<"]:checked,
li[data-task="<"] > input:checked,
li[data-task="<"] > p > input:checked, 
input[data-task="\\"]:checked,
li[data-task="\\"] > input:checked,
li[data-task="\\"] > p > input:checked 
{
  --checkbox-marker-color: transparent;
  border: none;
  border-radius: 0;
  background-image: none;
  background-color: currentColor;
  /* pointer-events: none; /* */
  -webkit-mask-size: var(--checkbox-icon);
  -webkit-mask-position: 50% 50%;
}


/* Define the actual icon for each of the alternate checkboxes */

/* [/] - Partially done (1/3) -  https://icon-sets.iconify.design/icon-park-solid/pie-three/ */ 
input[data-task="/"]:checked,
li[data-task="/"] > input:checked,
li[data-task="/"] > p > input:checked {
  color: var(--checkbox-color);
  -webkit-mask-image: url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="22" height="22" viewBox="0 0 48 48"%3E%3Cmask id="ipSPieThree0"%3E%3Cg fill="none" stroke="%23fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="4"%3E%3Ccircle cx="24" cy="24" r="20"%2F%3E%3Cpath fill="%23fff" d="M24 4a20 20 0 0 1 14.58 33.69L24 24V4Z"%2F%3E%3C%2Fg%3E%3C%2Fmask%3E%3Cpath fill="%23103" d="M0 0h48v48H0z" mask="url(%23ipSPieThree0)"%2F%3E%3C%2Fsvg%3E') ;
}

/* [\] - Almost done (2/3) -  https://icon-sets.iconify.design/icon-park-solid/pie-five/ */ 
input[data-task="\\"]:checked,
li[data-task="\\"] > input:checked,
li[data-task="\\"] > p > input:checked {
  color: var(--checkbox-color);
  -webkit-mask-image: url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="22" height="22" viewBox="0 0 48 48"%3E%3Cmask id="ipSPieFive0"%3E%3Cg fill="none" stroke="%23fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="4"%3E%3Ccircle cx="24" cy="24" r="20"%2F%3E%3Cpath fill="%23fff" d="M24 4a20 20 0 1 1-13.69 34.58L24 24V4Z"%2F%3E%3C%2Fg%3E%3C%2Fmask%3E%3Cpath fill="%23103" d="M0 0h48v48H0z" mask="url(%23ipSPieFive0)"%2F%3E%3C%2Fsvg%3E'); 
}

/* Define the color of migrated/deferred tasks to be faint */
body:not(.tasks) .markdown-source-view.mod-cm6 .HyperMD-task-line[data-task]:is([data-task=">"]),
body:not(.tasks) .markdown-preview-view ul li[data-task=">"].task-list-item.is-checked,
body:not(.tasks) li[data-task=">"].task-list-item.is-checked,
body:not(.tasks) .markdown-source-view.mod-cm6 .HyperMD-task-line[data-task]:is([data-task="<"]),
body:not(.tasks) .markdown-preview-view ul li[data-task="<"].task-list-item.is-checked,
body:not(.tasks) li[data-task="<"].task-list-item.is-checked {
  color: var(--text-faint);
}


/* From here and to the end is copied from https://github.com/kepano/obsidian-minimal/blob/92e790037e3aadeaf52ca6336000431b407fe84e/src/css/main.css */
/* [>] Forwarded */
input[data-task=">"]:checked,
li[data-task=">"] > input:checked,
li[data-task=">"] > p > input:checked {
  color: var(--text-faint);
  transform: rotate(90deg);
  -webkit-mask-position: 50% 100%;
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath d='M10.894 2.553a1 1 0 00-1.788 0l-7 14a1 1 0 001.169 1.409l5-1.429A1 1 0 009 15.571V11a1 1 0 112 0v4.571a1 1 0 00.725.962l5 1.428a1 1 0 001.17-1.408l-7-14z' /%3E%3C/svg%3E"); }

/* [<] Schedule */
input[data-task="<"]:checked,
li[data-task="<"] > input:checked,
li[data-task="<"] > p > input:checked {
  color: var(--text-faint);
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.828 2.829a1 1 0 101.415-1.415L11 9.586V6z' clip-rule='evenodd' /%3E%3C/svg%3E");
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M6 2a1 1 0 00-1 1v1H4a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V6a2 2 0 00-2-2h-1V3a1 1 0 10-2 0v1H7V3a1 1 0 00-1-1zm0 5a1 1 0 000 2h8a1 1 0 100-2H6z' clip-rule='evenodd' /%3E%3C/svg%3E"); }


/* [-] Canceled */
input[data-task="-"]:checked,
li[data-task="-"] > input:checked,
li[data-task="-"] > p > input:checked {
  color: var(--text-faint);
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-5 w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z' clip-rule='evenodd' /%3E%3C/svg%3E"); }

body:not(.tasks) .markdown-source-view.mod-cm6 .HyperMD-task-line[data-task]:is([data-task="-"]),
body:not(.tasks) .markdown-preview-view ul li[data-task="-"].task-list-item.is-checked,
body:not(.tasks) li[data-task="-"].task-list-item.is-checked {
  color: var(--text-faint);
  text-decoration: line-through solid var(--text-faint) 1px; }

Most of this is copied from the excellent work of kepano in GitHub - kepano/obsidian-minimal: A distraction-free and highly customizable theme for Obsidian., and I’ve adapted some of the icons, especially for / and \ statuses to my own liking. What’s not directly copied (as indicated in the CSS) is heavily influenced by similar code from the theme, so all kinds of thanks to @kepano !

Bonus tip: How to add a custom CSS snippet
  • Goto Settings > Appearance and scroll down to “CSS snippets” section, and hit the folder icon on the far right. This opens up a file explorer window, in the folder vault/.obsidian/snippets, which is were you want to save your css snippet
  • In this new window create a file, like myCss.css, where you copy the CSS into. Make sure this actually is a text file, and that the name ends in .css
  • Back in Obsidian, you should now see your myCss in the list of CSS snippets. If not, hit the refresh button
  • Final step is to click the enable button to the right of your file, and now your new CSS should be in effect
  • If you later on make changes in the CSS snippet file, the effect should be immediate. If not, try disabling and re-enabling the snippet, or in some strange cases, you would need to reload Obsidian. In 99% of the cases, the changes are immediate, though.
2 Likes

Thanks a lot !
Everything seems to work fine, except for the 2 “partially done” task indicator (I get a weird bug).
Maybe there’s something I’m forgetting to do ?

image

(i’m using the minimal theme as well)

Thanks in advance

I’m sorry that it doesn’t work for you. I tried switching to default theme, light mode, with only the bujoTask running, and it still shows like it should do at my end. Then I tried with the Minimal theme, light mode, and this extra CSS, and still shows as it should.

Be sure though that the CSS files doesn’t do something strange with quotes and backslashes and so on, but it’s hard to say what’s happened along the way here…

yeah, honestly, I have no clue as to why it doesn’t show the proper icons, and this is far out my competence level to try and understand where it might fail. Too bad !

Thanks anyway

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.