My personal-knowledge-system, with deeply integrated task tracking and long term goal planning capabilities.
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: can transition between things!

+210 -68
+44 -20
.config/config.ron
··· 1 1 ( 2 2 directory: "/Users/suri/dev/projects/filaments/ZettelKasten", 3 3 global_key_binds: { 4 - "up": MoveUp, 5 - "down": MoveDown, 6 4 "ctrl-z": Suspend, 5 + "down": MoveDown, 6 + "up": MoveUp, 7 7 "ctrl-c": Quit, 8 8 }, 9 9 zk: ( 10 10 keybinds: { 11 - "tab": SwitchTo(page: Todo(Explorer)), 11 + "tab": SwitchTo( 12 + page: Todo(Explorer), 13 + ), 12 14 "ctrl-n": NewZettel, 13 - "enter": OpenZettel, 15 + "enter": OpenZettel, 14 16 }, 15 17 ), 16 18 todo: ( 17 19 explorer: ( 18 20 keybinds: { 19 - "tab": SwitchTo(page: Zk), 20 - "1": SwitchTo(page: Todo(Explorer)), 21 - "2": SwitchTo(page: Todo(Inspector)), 22 - "3": SwitchTo(page: Todo(TaskList)), 23 - "j": MoveDown, 21 + "2": SwitchTo( 22 + page: Todo(Inspector), 23 + ), 24 24 "k": MoveUp, 25 + "1": SwitchTo( 26 + page: Todo(Explorer), 27 + ), 28 + "tab": SwitchTo( 29 + page: Zk, 30 + ), 31 + "3": SwitchTo( 32 + page: Todo(TaskList), 33 + ), 34 + "j": MoveDown, 25 35 }, 26 36 ), 27 37 inspector: ( 28 38 keybinds: { 29 - "tab": SwitchTo(page: Zk), 30 - "1": SwitchTo(page: Todo(Explorer)), 31 - "2": SwitchTo(page: Todo(Inspector)), 32 - "3": SwitchTo(page: Todo(TaskList)), 33 - "j": MoveDown, 34 - "k": MoveUp, 39 + "3": SwitchTo( 40 + page: Todo(TaskList), 41 + ), 42 + "1": SwitchTo( 43 + page: Todo(Explorer), 44 + ), 45 + "tab": SwitchTo( 46 + page: Zk, 47 + ), 48 + "2": SwitchTo( 49 + page: Todo(Inspector), 50 + ), 35 51 }, 36 52 ), 37 53 tasklist: ( 38 54 keybinds: { 39 - "tab": SwitchTo(page: Zk), 40 - "1": SwitchTo(page: Todo(Explorer)), 41 - "2": SwitchTo(page: Todo(Inspector)), 42 - "3": SwitchTo(page: Todo(TaskList)), 55 + "1": SwitchTo( 56 + page: Todo(Explorer), 57 + ), 58 + "tab": SwitchTo( 59 + page: Zk, 60 + ), 61 + "2": SwitchTo( 62 + page: Todo(Inspector), 63 + ), 64 + "3": SwitchTo( 65 + page: Todo(TaskList), 66 + ), 43 67 "j": MoveDown, 44 68 "k": MoveUp, 45 69 }, 46 70 ), 47 71 ), 48 - ) 72 + )
+35 -15
.config/default_config.ron
··· 1 1 ( 2 2 directory: "{INSERT_ROOT_HERE}", 3 3 global_key_binds: { 4 - "up": MoveUp, 4 + "up": MoveUp, 5 + "down": MoveDown, 6 + "ctrl-z": Suspend, 5 7 "ctrl-c": Quit, 6 - "ctrl-z": Suspend, 7 - "down": MoveDown, 8 8 }, 9 9 zk: ( 10 10 keybinds: { 11 - "enter": OpenZettel, 12 - "tab": SwitchTo( 13 - page: Todo(Explorer), 14 - ), 15 - "<Ctrl-n>": NewZettel, 11 + "tab": SwitchTo(page: Todo(Explorer)), 12 + "ctrl-n": NewZettel, 13 + "enter": OpenZettel, 16 14 }, 17 15 ), 18 16 todo: ( 19 - keybinds: { 20 - "k": MoveUp, 21 - "j": MoveDown, 22 - "tab": SwitchTo( 23 - page: Zk, 24 - ), 25 - }, 17 + explorer: ( 18 + keybinds: { 19 + "tab": SwitchTo(page: Zk), 20 + "1": SwitchTo(page: Todo(Explorer)), 21 + "2": SwitchTo(page: Todo(Inspector)), 22 + "3": SwitchTo(page: Todo(TaskList)), 23 + "j": MoveDown, 24 + "k": MoveUp, 25 + }, 26 + ), 27 + inspector: ( 28 + keybinds: { 29 + "tab": SwitchTo(page: Zk), 30 + "1": SwitchTo(page: Todo(Explorer)), 31 + "2": SwitchTo(page: Todo(Inspector)), 32 + "3": SwitchTo(page: Todo(TaskList)), 33 + }, 34 + ), 35 + tasklist: ( 36 + keybinds: { 37 + "tab": SwitchTo(page: Zk), 38 + "1": SwitchTo(page: Todo(Explorer)), 39 + "2": SwitchTo(page: Todo(Inspector)), 40 + "3": SwitchTo(page: Todo(TaskList)), 41 + "j": MoveDown, 42 + "k": MoveUp, 43 + }, 44 + ), 26 45 ), 27 46 ) 47 +
+27 -2
src/config/keymap.rs
··· 204 204 "<Ctrl-n>": NewZettel, 205 205 "enter": OpenZettel, 206 206 "tab": SwitchTo ( 207 - region: Todo 207 + page: Todo(Explorer) 208 208 ), 209 209 210 210 }, 211 211 ), 212 212 todo: ( 213 + inspector: ( 213 214 keybinds: { 214 215 "j": MoveDown, 215 216 "k": MoveUp, 216 217 "tab": SwitchTo ( 217 - region: Zk 218 + page: Zk 219 + ), 220 + 221 + }, 222 + 223 + ), 224 + tasklist: ( 225 + keybinds: { 226 + "j": MoveDown, 227 + "k": MoveUp, 228 + "tab": SwitchTo ( 229 + page: Zk 218 230 ), 219 231 220 232 }, 233 + 234 + ), 235 + explorer: ( 236 + keybinds: { 237 + "j": MoveDown, 238 + "k": MoveUp, 239 + "tab": SwitchTo ( 240 + page: Zk 241 + ), 242 + 243 + }, 244 + 245 + ), 221 246 ), 222 247 ) 223 248 "#;
+6
src/tui/components/todo/explorer.rs
··· 41 41 .tree 42 42 .traverse_pre_order_ids(scope) 43 43 .expect("This should not panic as the node id should exist inside") 44 + .filter(|node| { 45 + if *node == tree.root_id { 46 + return false; 47 + } 48 + true 49 + }) 44 50 .collect::<Vec<_>>(); 45 51 46 52 Self {
+1 -1
src/tui/components/todo/inspector/groupview.rs
··· 51 51 where 52 52 Self: Sized, 53 53 { 54 - let (name_rect, priority_rect, created_at, content_rect) = { 54 + let (name_rect, priority_rect, created_at, _content_rect) = { 55 55 let rects = self.layouts.left_content.split(area); 56 56 let l_rects = self.layouts.name_priority_created_at.split(rects[0]); 57 57
+3 -1
src/tui/components/todo/inspector/taskview.rs
··· 9 9 pub struct TaskView<'text> { 10 10 name: Paragraph<'text>, 11 11 priority: Paragraph<'text>, 12 + #[expect(dead_code)] 12 13 created_at: Paragraph<'text>, 14 + #[expect(dead_code)] 13 15 parent_group: Paragraph<'text>, 14 16 15 17 due: Paragraph<'text>, ··· 57 59 where 58 60 Self: Sized, 59 61 { 60 - let (name_rect, priority_rect, due_rect, content_rect) = { 62 + let (name_rect, priority_rect, due_rect, _content_rect) = { 61 63 let rects = self.layouts.left_content.split(area); 62 64 let l_rects = self.layouts.name_priority_due.split(rects[0]); 63 65
+93 -27
src/tui/components/todo/mod.rs
··· 30 30 explorer: Option<Explorer<'text>>, 31 31 task_list: Option<TaskList<'text>>, 32 32 inspector: Option<Inspector<'text>>, 33 + 34 + active: TodoRegion, 33 35 } 34 36 35 37 /// The different regions inside the `Todo` component ··· 52 54 explorer: None, 53 55 task_list: None, 54 56 inspector: None, 57 + active: TodoRegion::default(), 55 58 } 56 59 } 60 + 61 + async fn update_inspector_from_selection(&mut self) { 62 + let explorer = self 63 + .explorer 64 + .as_mut() 65 + .expect("This should have already been init.ialized"); 66 + let task_list = self 67 + .task_list 68 + .as_mut() 69 + .expect("This should have already been initialized"); 70 + let inspector = self 71 + .inspector 72 + .as_mut() 73 + .expect("This should have already been initialized"); 74 + let selected_node_id = match self.active { 75 + TodoRegion::TaskList => { 76 + let Some(idx) = task_list.state.selected() else { 77 + return; 78 + }; 79 + task_list.id_list.get(idx) 80 + } 81 + TodoRegion::Explorer => { 82 + let Some(idx) = explorer.state.selected() else { 83 + return; 84 + }; 85 + explorer.id_list.get(idx) 86 + } 87 + TodoRegion::Inspector => return, 88 + }; 89 + 90 + let Some(selected_node_id) = selected_node_id else { 91 + return; 92 + }; 93 + let tree = &self.kh.read().await.todo_tree.tree; 94 + 95 + *inspector = tree 96 + .get(selected_node_id) 97 + .expect("Nodeid must be valid") 98 + .data() 99 + .into(); 100 + } 57 101 } 58 102 59 103 struct Layouts { ··· 118 162 ) 119 163 .expect("Node id must be valid"); 120 164 121 - let inspector = first.data().into(); 165 + let mut inspector: Inspector<'_> = first.data().into(); 122 166 123 - // explorer.set_active(); 124 167 explorer.set_inactive(); 125 - // task_list.set_inactive(); 126 - task_list.set_active(); 168 + inspector.set_inactive(); 169 + task_list.set_inactive(); 127 170 128 171 self.explorer = Some(explorer); 129 172 self.task_list = Some(task_list); ··· 133 176 } 134 177 135 178 async fn update(&mut self, signal: Signal) -> color_eyre::Result<Option<Signal>> { 136 - 137 179 let explorer = self 138 180 .explorer 139 181 .as_mut() 140 - .expect("This should have already been initialized"); 182 + .expect("This should have already been init.ialized"); 141 183 142 184 let task_list = self 143 185 .task_list ··· 151 193 match signal { 152 194 Signal::SwitchTo { 153 195 page: Page::Todo(region), 154 - } => match region { 155 - TodoRegion::Inspector => { 156 - inspector.set_active(); 157 - explorer.set_inactive(); 158 - task_list.set_inactive(); 159 - } 160 - TodoRegion::TaskList => { 161 - inspector.set_inactive(); 162 - explorer.set_inactive(); 163 - task_list.set_active(); 164 - } 165 - TodoRegion::Explorer => { 166 - explorer.set_active(); 167 - task_list.set_inactive(); 168 - inspector.set_inactive(); 196 + } => { 197 + self.active = region; 198 + match region { 199 + TodoRegion::Inspector => { 200 + inspector.set_active(); 201 + explorer.set_inactive(); 202 + task_list.set_inactive(); 203 + } 204 + TodoRegion::TaskList => { 205 + inspector.set_inactive(); 206 + explorer.set_inactive(); 207 + task_list.set_active(); 208 + } 209 + TodoRegion::Explorer => { 210 + explorer.set_active(); 211 + task_list.set_inactive(); 212 + inspector.set_inactive(); 213 + } 169 214 } 170 - }, 215 + 216 + self.update_inspector_from_selection().await; 217 + } 171 218 Signal::MoveDown => { 172 - // explorer.state.select_next(); 173 - task_list.state.select_next(); 174 - // self.update_views_from_zettel_list_selection().await?; 219 + match self.active { 220 + TodoRegion::TaskList => { 221 + task_list.state.select_next(); 222 + } 223 + TodoRegion::Explorer => { 224 + explorer.state.select_next(); 225 + } 226 + TodoRegion::Inspector => { 227 + return Ok(None); 228 + } 229 + } 230 + 231 + self.update_inspector_from_selection().await; 175 232 } 176 233 177 234 Signal::MoveUp => { 178 - // explorer.state.select_previous(); 179 - task_list.state.select_previous(); 235 + match self.active { 236 + TodoRegion::TaskList => { 237 + task_list.state.select_previous(); 238 + } 239 + TodoRegion::Explorer => { 240 + explorer.state.select_previous(); 241 + } 242 + TodoRegion::Inspector => return Ok(None), 243 + } 244 + 245 + self.update_inspector_from_selection().await; 180 246 } 181 247 _ => {} 182 248 }
-1
src/tui/components/todo/tasklist.rs
··· 43 43 ) 44 44 .style(Color::White) 45 45 .highlight_style(Style::new().on_dark_gray()); 46 - // .highlight_symbol("> "); 47 46 48 47 Self { 49 48 render_list,
+1 -1
src/types/group.rs
··· 57 57 .tag 58 58 .into_option() 59 59 .expect( 60 - "When fetching a Group from the database, we expect to always have the Zettel loaded!!", 60 + "When fetching a Group from the database, we expect to always have the Tag loaded!!", 61 61 ) 62 62 .into(), 63 63 }