From 107d5204e1b61ed2eaab63db3c1abc9d01d6dd6d Mon Sep 17 00:00:00 2001 From: Frank Faulstich Date: Tue, 12 May 2026 12:51:42 +0200 Subject: [PATCH 1/2] Integration check: Recurring tasks must have a date. Fixes #405 --- sl/SL_Menu.py | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/sl/SL_Menu.py b/sl/SL_Menu.py index 57dcd2b..78a655d 100644 --- a/sl/SL_Menu.py +++ b/sl/SL_Menu.py @@ -1457,6 +1457,16 @@ def view_add_task_form(): st.markdown("
", unsafe_allow_html=True) is_recurring = st.checkbox(_("Recurring")) + validation_error = is_recurring and not due_date + if validation_error: + st.markdown(""" + + """, unsafe_allow_html=True) + # Frequency options for recurring tasks freq_options = ["daily", "on all business days", "weekly", "monthly", "userdefined"] freq_labels = [_("daily"), _("on all business days"), _("weekly"), _("monthly"), _("userdefined")] @@ -1480,10 +1490,15 @@ def view_add_task_form(): st.markdown('', unsafe_allow_html=True) st.divider() + if validation_error: + st.error(_("A due date is required for recurring tasks.")) + col_btn1, col_btn2 = st.columns(2) with col_btn1: if st.button(_("Add Task"), type="primary", use_container_width=True): - if not name: + if validation_error: + pass + elif not name: st.error(_("Please enter a name.")) elif name.lower() in existing_tasks: set_feedback(_("A task with this name already exists in this project."), 'error') @@ -1607,6 +1622,16 @@ def view_edit_task_form(): with col_rec: is_recurring = st.checkbox(_("Recurring"), value=task_details.get('recurring', False)) + validation_error = is_recurring and not st.session_state.edit_due_date + if validation_error: + st.markdown(""" + + """, unsafe_allow_html=True) + freq_options = ["daily", "on all business days", "weekly", "monthly", "userdefined"] freq_labels = [_("daily"), _("on all business days"), _("weekly"), _("monthly"), _("userdefined")] curr_freq = task_details.get('frequency', 'daily') @@ -1631,13 +1656,19 @@ def view_edit_task_form(): st.markdown('', unsafe_allow_html=True) st.divider() + if validation_error: + st.error(_("A due date is required for recurring tasks.")) + col_save, col_cancel = st.columns(2) with col_save: if st.button(_("Save Changes"), type="primary", use_container_width=True): - final_due = st.session_state.edit_due_date.isoformat() if st.session_state.edit_due_date else None - new_status = 'done' if is_done else 'open' - - if st.session_state.tracker.update_task( + if validation_error: + pass + else: + final_due = st.session_state.edit_due_date.isoformat() if st.session_state.edit_due_date else None + new_status = 'done' if is_done else 'open' + + if st.session_state.tracker.update_task( main_project, task_name, new_name, From ffb44c207f707266f74f1315bbfc0c7aeaceaaa4 Mon Sep 17 00:00:00 2001 From: Frank Faulstich Date: Tue, 12 May 2026 13:00:15 +0200 Subject: [PATCH 2/2] Correction 1 --- sl/SL_Menu.py | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/sl/SL_Menu.py b/sl/SL_Menu.py index 78a655d..d709d85 100644 --- a/sl/SL_Menu.py +++ b/sl/SL_Menu.py @@ -91,7 +91,6 @@ def navigate_to(menu_name): :param menu_name: The key of the menu to navigate to (must exist in menu_map). """ st.session_state.menu = menu_name - st.session_state.feedback = None st.rerun() def set_feedback(message, type='success'): @@ -1662,31 +1661,30 @@ def view_edit_task_form(): col_save, col_cancel = st.columns(2) with col_save: if st.button(_("Save Changes"), type="primary", use_container_width=True): - if validation_error: - pass - else: + if not validation_error: # Proceed only if no validation error final_due = st.session_state.edit_due_date.isoformat() if st.session_state.edit_due_date else None new_status = 'done' if is_done else 'open' if st.session_state.tracker.update_task( - main_project, - task_name, - new_name, - final_due, - is_today, - st.session_state.edit_task_note, - new_status, - recurring=is_recurring, - frequency=final_freq, - userdefined_days=ud_days - ): - set_feedback(_("Task updated successfully.")) - if 'edit_due_date' in st.session_state: del st.session_state.edit_due_date - if 'edit_task_note' in st.session_state: del st.session_state.edit_task_note - st.session_state.context = {} - navigate_to(return_to) - else: - st.error(_("Error: Could not update task.")) + main_project, + task_name, + new_name, + final_due, + is_today, + st.session_state.edit_task_note, + new_status, + recurring=is_recurring, + frequency=final_freq, + userdefined_days=ud_days, + task_id=task_id + ): + set_feedback(_("Task updated successfully.")) + if 'edit_due_date' in st.session_state: del st.session_state.edit_due_date + if 'edit_task_note' in st.session_state: del st.session_state.edit_task_note + st.session_state.context = {} + navigate_to(return_to) + else: + st.error(_("Error: Could not update task.")) with col_cancel: if st.button(_("Cancel"), use_container_width=True):