Add 'Change Date' button to the History Dialog (same as the one used in Time log dialogs)
All checks were successful
CI / test (push) Successful in 8m58s
Lint / test (push) Successful in 38s
Trivy / test (push) Successful in 21s

This commit is contained in:
Miguel Jacq 2025-12-11 15:45:03 +11:00
parent fb873edcb5
commit 57614cefa1
Signed by: mig5
GPG key ID: 59B3F0C24135C6A9
5 changed files with 78 additions and 13 deletions

View file

@ -2,6 +2,7 @@
* New Invoicing feature! This is tied to time logging and (optionally) documents and reminders features.
* Add 'Last week' to Time Report dialog range option
* Add 'Change Date' button to the History Dialog (same as the one used in Time log dialogs)
# 0.6.4

View file

@ -5,11 +5,14 @@ import html as _html
import re
from datetime import datetime
from PySide6.QtCore import Qt, Slot
from PySide6.QtCore import QDate, Qt, Slot
from PySide6.QtWidgets import (
QAbstractItemView,
QCalendarWidget,
QDialog,
QDialogButtonBox,
QHBoxLayout,
QLabel,
QListWidget,
QListWidgetItem,
QMessageBox,
@ -20,6 +23,7 @@ from PySide6.QtWidgets import (
)
from . import strings
from .theme import ThemeManager
def _markdown_to_text(s: str) -> str:
@ -73,16 +77,29 @@ def _colored_unified_diff_html(old_md: str, new_md: str) -> str:
class HistoryDialog(QDialog):
"""Show versions for a date, preview, diff, and allow revert."""
def __init__(self, db, date_iso: str, parent=None):
def __init__(
self, db, date_iso: str, parent=None, themes: ThemeManager | None = None
):
super().__init__(parent)
self.setWindowTitle(f"{strings._('history')}{date_iso}")
self._db = db
self._date = date_iso
self._themes = themes
self._versions = [] # list[dict] from DB
self._current_id = None # id of current
root = QVBoxLayout(self)
# --- Top: date label + change-date button
date_row = QHBoxLayout()
self.date_label = QLabel(strings._("date_label").format(date=date_iso))
date_row.addWidget(self.date_label)
date_row.addStretch(1)
self.change_date_btn = QPushButton(strings._("change_date"))
self.change_date_btn.clicked.connect(self._on_change_date_clicked)
date_row.addWidget(self.change_date_btn)
root.addLayout(date_row)
# Top: list of versions
top = QHBoxLayout()
self.list = QListWidget()
@ -120,6 +137,53 @@ class HistoryDialog(QDialog):
self._load_versions()
@Slot()
def _on_change_date_clicked(self) -> None:
"""Let the user choose a different date and reload entries."""
# Start from current dialog date; fall back to today if invalid
current_qdate = QDate.fromString(self._date, Qt.ISODate)
if not current_qdate.isValid():
current_qdate = QDate.currentDate()
dlg = QDialog(self)
dlg.setWindowTitle(strings._("select_date_title"))
layout = QVBoxLayout(dlg)
calendar = QCalendarWidget(dlg)
calendar.setSelectedDate(current_qdate)
layout.addWidget(calendar)
# Apply the same theming as the main sidebar calendar
if self._themes is not None:
self._themes.register_calendar(calendar)
buttons = QDialogButtonBox(
QDialogButtonBox.Ok | QDialogButtonBox.Cancel, parent=dlg
)
buttons.accepted.connect(dlg.accept)
buttons.rejected.connect(dlg.reject)
layout.addWidget(buttons)
if dlg.exec() != QDialog.Accepted:
return
new_qdate = calendar.selectedDate()
new_iso = new_qdate.toString(Qt.ISODate)
if new_iso == self._date:
# No change
return
# Update state
self._date = new_iso
# Update window title and header label
self.setWindowTitle(strings._("for").format(date=new_iso))
self.date_label.setText(strings._("date_label").format(date=new_iso))
# Reload entries for the newly selected date
self._load_versions()
# --- Data/UX helpers ---
def _load_versions(self):
# [{id,version_no,created_at,note,is_current}]

View file

@ -251,10 +251,10 @@
"select_project_title": "Select project",
"time_log": "Time log",
"time_log_collapsed_hint": "Time log",
"time_log_date_label": "Time log date: {date}",
"time_log_change_date": "Change date",
"time_log_select_date_title": "Select time log date",
"time_log_for": "Time log for {date}",
"date_label": "Date: {date}",
"change_date": "Change date",
"select_date_title": "Select date",
"for": "For {date}",
"time_log_no_date": "Time log",
"time_log_no_entries": "No time entries yet",
"time_log_report": "Time log report",

View file

@ -1354,7 +1354,7 @@ class MainWindow(QMainWindow):
else:
date_iso = self._current_date_iso()
dlg = HistoryDialog(self.db, date_iso, self)
dlg = HistoryDialog(self.db, date_iso, self, themes=self.themes)
if dlg.exec() == QDialog.Accepted:
# refresh editor + calendar (head pointer may have changed)
self._load_selected_date(date_iso)

View file

@ -277,7 +277,7 @@ class TimeLogDialog(QDialog):
self.close_after_add = close_after_add
self.setWindowTitle(strings._("time_log_for").format(date=date_iso))
self.setWindowTitle(strings._("for").format(date=date_iso))
self.resize(900, 600)
root = QVBoxLayout(self)
@ -285,12 +285,12 @@ class TimeLogDialog(QDialog):
# --- Top: date label + change-date button
date_row = QHBoxLayout()
self.date_label = QLabel(strings._("time_log_date_label").format(date=date_iso))
self.date_label = QLabel(strings._("date_label").format(date=date_iso))
date_row.addWidget(self.date_label)
date_row.addStretch(1)
self.change_date_btn = QPushButton(strings._("time_log_change_date"))
self.change_date_btn = QPushButton(strings._("change_date"))
self.change_date_btn.clicked.connect(self._on_change_date_clicked)
date_row.addWidget(self.change_date_btn)
@ -477,7 +477,7 @@ class TimeLogDialog(QDialog):
current_qdate = QDate.currentDate()
dlg = QDialog(self)
dlg.setWindowTitle(strings._("time_log_select_date_title"))
dlg.setWindowTitle(strings._("select_date_title"))
layout = QVBoxLayout(dlg)
@ -508,8 +508,8 @@ class TimeLogDialog(QDialog):
self._date_iso = new_iso
# Update window title and header label
self.setWindowTitle(strings._("time_log_for").format(date=new_iso))
self.date_label.setText(strings._("time_log_date_label").format(date=new_iso))
self.setWindowTitle(strings._("for").format(date=new_iso))
self.date_label.setText(strings._("date_label").format(date=new_iso))
# Reload entries for the newly selected date
self._reload_entries()