Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 42 additions & 15 deletions sl/SL_Menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand All @@ -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')
Expand All @@ -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')

Expand Down Expand Up @@ -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')
Expand All @@ -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')
Expand All @@ -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')

Expand Down Expand Up @@ -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():
"""
Expand Down Expand Up @@ -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]
Expand All @@ -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')
Expand Down Expand Up @@ -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:
Expand All @@ -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."""
Expand Down
2 changes: 1 addition & 1 deletion tt/TimeTracker.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
Loading