From d8945b130567d2715539be7015aeaf249f46c345 Mon Sep 17 00:00:00 2001 From: Frank Faulstich Date: Wed, 17 Jun 2026 12:13:30 +0200 Subject: [PATCH] Adding a New Task Fixes #452 --- sl/SL_Menu.py | 57 ++++++++++++++++++++++++++++++++++------------- tt/TimeTracker.py | 2 +- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/sl/SL_Menu.py b/sl/SL_Menu.py index ce6385e..3ca366a 100644 --- a/sl/SL_Menu.py +++ b/sl/SL_Menu.py @@ -274,14 +274,18 @@ def view_main(): with t_col_new: with st.popover("+", help=_("New"), key="toolbar_new_popover"): if st.button(_("New Project"), use_container_width=True): + st.session_state.context['return_to'] = 'main' navigate_to('add_main_project') if st.button(_("New Task"), use_container_width=True): + st.session_state.context['return_to'] = 'main' navigate_to('add_task') with t_col_mgmt: with st.popover("☷", help=_("Project & Task Management"), key="toolbar_mgmt_popover"): with st.expander(_("Main Project Management"), expanded=False): - if st.button(_("Add Project"), use_container_width=True, key="pop_mgmt_add_proj"): navigate_to('add_main_project') + if st.button(_("Add Project"), use_container_width=True, key="pop_mgmt_add_proj"): + st.session_state.context['return_to'] = 'main' + navigate_to('add_main_project') if st.button(_("List Projects"), use_container_width=True, key="pop_mgmt_list_proj"): navigate_to('list_main_projects') if st.button(_("Rename Project"), use_container_width=True, key="pop_mgmt_rename_proj"): navigate_to('rename_main_project') if st.button(_("Close Project"), use_container_width=True, key="pop_mgmt_close_proj"): navigate_to('close_main_project') @@ -292,7 +296,9 @@ def view_main(): if st.button(_("List Completed Projects"), use_container_width=True, key="pop_mgmt_list_comp_proj"): navigate_to('list_completed_main') with st.expander(_("Task Management"), expanded=False): - if st.button(_("Add Task"), use_container_width=True, key="pop_t_mgmt_add"): navigate_to('add_task') + if st.button(_("Add Task"), use_container_width=True, key="pop_t_mgmt_add"): + st.session_state.context['return_to'] = 'main' + navigate_to('add_task') if st.button(_("List Tasks"), use_container_width=True, key="pop_t_mgmt_list"): navigate_to('list_tasks') if st.button(_("Rename Task"), use_container_width=True, key="pop_t_mgmt_rename"): navigate_to('rename_task') if st.button(_("Close Task"), use_container_width=True, key="pop_t_mgmt_close"): navigate_to('close_task') @@ -301,7 +307,9 @@ def view_main(): if st.button(_("Move Task"), use_container_width=True, key="pop_t_mgmt_move"): navigate_to('move_task') if st.button(_("List Inactive Tasks"), use_container_width=True, key="pop_t_mgmt_list_inact"): navigate_to('list_inactive_tasks') if st.button(_("List All Closed Tasks"), use_container_width=True, key="pop_t_mgmt_list_closed"): navigate_to('list_closed_tasks') - if st.button(_("Edit Task"), use_container_width=True, key="pop_task_mgmt_edit_task"): navigate_to('edit_task') + if st.button(_("Edit Task"), use_container_width=True, key="pop_task_mgmt_edit_task"): + st.session_state.context['return_to'] = 'main' + navigate_to('edit_task') if st.button(_("Delete All Closed Tasks"), use_container_width=True, key="pop_t_mgmt_del_all"): navigate_to('delete_all_closed_tasks') if st.button(_("Promote Task to Project"), use_container_width=True, key="pop_t_mgmt_promote"): navigate_to('promote_task_to_project') @@ -783,7 +791,9 @@ def view_main_project_mgmt(): """ render_header(_("Project Management")) - if st.button(_("Add Project"), use_container_width=True, key="mgmt_add_proj"): navigate_to('add_main_project') + if st.button(_("Add Project"), use_container_width=True, key="mgmt_add_proj"): + st.session_state.context['return_to'] = 'main_project_mgmt' + navigate_to('add_main_project') if st.button(_("List Projects"), use_container_width=True, key="mgmt_list_proj"): navigate_to('list_main_projects') if st.button(_("Rename Project"), use_container_width=True, key="mgmt_rename_proj"): navigate_to('rename_main_project') if st.button(_("Close Project"), use_container_width=True, key="mgmt_close_proj"): navigate_to('close_main_project') @@ -804,7 +814,9 @@ def view_task_mgmt(): """ render_header(_("Task Management")) - if st.button(_("Add Task"), use_container_width=True, key="t_mgmt_add"): navigate_to('add_task') + if st.button(_("Add Task"), use_container_width=True, key="t_mgmt_add"): + st.session_state.context['return_to'] = 'task_mgmt' + navigate_to('add_task') if st.button(_("List Tasks"), use_container_width=True, key="t_mgmt_list"): navigate_to('list_tasks') if st.button(_("Rename Task"), use_container_width=True, key="t_mgmt_rename"): navigate_to('rename_task') if st.button(_("Close Task"), use_container_width=True, key="t_mgmt_close"): navigate_to('close_task') @@ -813,7 +825,9 @@ def view_task_mgmt(): if st.button(_("Move Task"), use_container_width=True, key="t_mgmt_move"): navigate_to('move_task') if st.button(_("List Inactive Tasks"), use_container_width=True, key="t_mgmt_list_inact"): navigate_to('list_inactive_tasks') if st.button(_("List All Closed Tasks"), use_container_width=True, key="t_mgmt_list_closed"): navigate_to('list_closed_tasks') - if st.button(_("Edit Task"), use_container_width=True, key="task_mgmt_edit_task"): navigate_to('edit_task') + if st.button(_("Edit Task"), use_container_width=True, key="task_mgmt_edit_task"): + st.session_state.context['return_to'] = 'task_mgmt' + navigate_to('edit_task') if st.button(_("Delete All Closed Tasks"), use_container_width=True, key="t_mgmt_del_all"): navigate_to('delete_all_closed_tasks') if st.button(_("Promote Task to Project"), use_container_width=True, key="t_mgmt_promote"): navigate_to('promote_task_to_project') @@ -871,16 +885,19 @@ def view_add_main_project(): Renders the form to add a new main project. """ render_header(_("Add New Project")) + return_to = st.session_state.context.get('return_to', 'main_project_mgmt') with st.form("add_main_form"): name = st.text_input(_("Name of the project")) submitted = st.form_submit_button(_("Add Project"), use_container_width=True) if submitted and name: st.session_state.tracker.add_main_project(name) set_feedback(_("Project '{name}' added.").format(name=name)) - st.session_state.menu = 'main_project_mgmt' + st.session_state.context = {} + navigate_to(return_to) st.rerun() if st.button(_("Cancel"), use_container_width=True): - navigate_to('main_project_mgmt') + st.session_state.context = {} + navigate_to(return_to) def view_close_task(): """ @@ -1520,10 +1537,11 @@ def view_add_task(): Renders the first step of adding a task: selecting the project. """ render_header(_("Add Task"), _("Step 1: Select Project")) + return_to = st.session_state.context.get('return_to', 'task_mgmt') projects = st.session_state.tracker.list_main_projects(status_filter='open') if not projects: st.warning(_("No open projects found. Please add one first.")) - if st.button(_("Back"), use_container_width=True): navigate_to('task_mgmt') + if st.button(_("Back"), use_container_width=True): navigate_to(return_to) return options = [p['main_project_name'] for p in projects] @@ -1533,13 +1551,16 @@ def view_add_task(): st.session_state.context['selected_main'] = selected navigate_to('add_task_form') st.rerun() - if st.button(_("Cancel"), use_container_width=True): navigate_to('task_mgmt') + if st.button(_("Cancel"), use_container_width=True): + st.session_state.context = {} + navigate_to(return_to) def view_add_task_form(): """ Renders the second step of adding a task: entering the name. """ main_project = st.session_state.context.get('selected_main') + return_to = st.session_state.context.get('return_to', 'task_mgmt') if not main_project: set_feedback(_("No project selected. Please start again."), "error") navigate_to('add_task') @@ -1637,31 +1658,35 @@ def view_add_task_form(): set_feedback(_("Task '{sub_name}' added to '{main_name}'.").format(sub_name=name, main_name=main_project)) if "new_task_note" in st.session_state: del st.session_state.new_task_note st.session_state.context = {} - navigate_to('task_mgmt') + navigate_to(return_to) with col_btn2: if st.button(_("Cancel"), use_container_width=True): if "new_task_note" in st.session_state: del st.session_state.new_task_note st.session_state.context = {} - navigate_to('task_mgmt') + navigate_to(return_to) def view_edit_task(): """Step 1 of editing a task: Select the main project.""" render_header(_("Edit Task"), _("Step 1: Select Project")) + return_to = st.session_state.context.get('return_to', 'task_mgmt') projects = st.session_state.tracker.list_main_projects(status_filter='open') if not projects: st.warning(_("No open projects found.")) - if st.button(_("Back"), use_container_width=True): navigate_to('task_mgmt') + if st.button(_("Back"), use_container_width=True): navigate_to(return_to) return selected = st.selectbox(_("Project"), [p['main_project_name'] for p in projects]) if st.button(_("Next"), use_container_width=True): st.session_state.context['selected_main'] = selected navigate_to('edit_task_select_task') st.rerun() - if st.button(_("Cancel"), use_container_width=True): navigate_to('task_mgmt') + if st.button(_("Cancel"), use_container_width=True): + st.session_state.context = {} + navigate_to(return_to) def view_edit_task_select_task(): """Step 2 of editing a task: Select the task from the chosen project.""" main_project = st.session_state.context.get('selected_main') + return_to = st.session_state.context.get('return_to', 'task_mgmt') render_header(_("Edit Task"), f"{_('Step 2: Select Task from')} {main_project}") tasks = st.session_state.tracker.list_tasks(main_project_name=main_project, status_filter='open') if not tasks: @@ -1679,7 +1704,9 @@ def view_edit_task_select_task(): st.session_state.context['selected_task_id'] = tasks[selected_idx].get('id') navigate_to('edit_task_form') st.rerun() - if st.button(_("Back"), use_container_width=True): navigate_to('edit_task') + if st.button(_("Back"), use_container_width=True): + # Return context is kept, Step 1 will handle final cancel + navigate_to('edit_task') def view_edit_task_form(): """Step 3 of editing a task: Change name and due date.""" diff --git a/tt/TimeTracker.py b/tt/TimeTracker.py index c5ca11e..2f18e1b 100644 --- a/tt/TimeTracker.py +++ b/tt/TimeTracker.py @@ -32,7 +32,7 @@ class TimeTracker: The data is loaded from and saved to a JSON file. """ - VERSION = "3.13" + VERSION = "3.14" STATUS_OPEN = "open" STATUS_CLOSED = "closed" STATUS_DONE = "done"