Add 'Change Date' button to the History Dialog (same as the one used in Time log dialogs)
This commit is contained in:
parent
fb873edcb5
commit
57614cefa1
5 changed files with 78 additions and 13 deletions
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
* New Invoicing feature! This is tied to time logging and (optionally) documents and reminders features.
|
* 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 '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
|
# 0.6.4
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,14 @@ import html as _html
|
||||||
import re
|
import re
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
from PySide6.QtCore import Qt, Slot
|
from PySide6.QtCore import QDate, Qt, Slot
|
||||||
from PySide6.QtWidgets import (
|
from PySide6.QtWidgets import (
|
||||||
QAbstractItemView,
|
QAbstractItemView,
|
||||||
|
QCalendarWidget,
|
||||||
QDialog,
|
QDialog,
|
||||||
|
QDialogButtonBox,
|
||||||
QHBoxLayout,
|
QHBoxLayout,
|
||||||
|
QLabel,
|
||||||
QListWidget,
|
QListWidget,
|
||||||
QListWidgetItem,
|
QListWidgetItem,
|
||||||
QMessageBox,
|
QMessageBox,
|
||||||
|
|
@ -20,6 +23,7 @@ from PySide6.QtWidgets import (
|
||||||
)
|
)
|
||||||
|
|
||||||
from . import strings
|
from . import strings
|
||||||
|
from .theme import ThemeManager
|
||||||
|
|
||||||
|
|
||||||
def _markdown_to_text(s: str) -> str:
|
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):
|
class HistoryDialog(QDialog):
|
||||||
"""Show versions for a date, preview, diff, and allow revert."""
|
"""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)
|
super().__init__(parent)
|
||||||
self.setWindowTitle(f"{strings._('history')} — {date_iso}")
|
self.setWindowTitle(f"{strings._('history')} — {date_iso}")
|
||||||
self._db = db
|
self._db = db
|
||||||
self._date = date_iso
|
self._date = date_iso
|
||||||
|
self._themes = themes
|
||||||
self._versions = [] # list[dict] from DB
|
self._versions = [] # list[dict] from DB
|
||||||
self._current_id = None # id of current
|
self._current_id = None # id of current
|
||||||
|
|
||||||
root = QVBoxLayout(self)
|
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: list of versions
|
||||||
top = QHBoxLayout()
|
top = QHBoxLayout()
|
||||||
self.list = QListWidget()
|
self.list = QListWidget()
|
||||||
|
|
@ -120,6 +137,53 @@ class HistoryDialog(QDialog):
|
||||||
|
|
||||||
self._load_versions()
|
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 ---
|
# --- Data/UX helpers ---
|
||||||
def _load_versions(self):
|
def _load_versions(self):
|
||||||
# [{id,version_no,created_at,note,is_current}]
|
# [{id,version_no,created_at,note,is_current}]
|
||||||
|
|
|
||||||
|
|
@ -251,10 +251,10 @@
|
||||||
"select_project_title": "Select project",
|
"select_project_title": "Select project",
|
||||||
"time_log": "Time log",
|
"time_log": "Time log",
|
||||||
"time_log_collapsed_hint": "Time log",
|
"time_log_collapsed_hint": "Time log",
|
||||||
"time_log_date_label": "Time log date: {date}",
|
"date_label": "Date: {date}",
|
||||||
"time_log_change_date": "Change date",
|
"change_date": "Change date",
|
||||||
"time_log_select_date_title": "Select time log date",
|
"select_date_title": "Select date",
|
||||||
"time_log_for": "Time log for {date}",
|
"for": "For {date}",
|
||||||
"time_log_no_date": "Time log",
|
"time_log_no_date": "Time log",
|
||||||
"time_log_no_entries": "No time entries yet",
|
"time_log_no_entries": "No time entries yet",
|
||||||
"time_log_report": "Time log report",
|
"time_log_report": "Time log report",
|
||||||
|
|
|
||||||
|
|
@ -1354,7 +1354,7 @@ class MainWindow(QMainWindow):
|
||||||
else:
|
else:
|
||||||
date_iso = self._current_date_iso()
|
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:
|
if dlg.exec() == QDialog.Accepted:
|
||||||
# refresh editor + calendar (head pointer may have changed)
|
# refresh editor + calendar (head pointer may have changed)
|
||||||
self._load_selected_date(date_iso)
|
self._load_selected_date(date_iso)
|
||||||
|
|
|
||||||
|
|
@ -277,7 +277,7 @@ class TimeLogDialog(QDialog):
|
||||||
|
|
||||||
self.close_after_add = close_after_add
|
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)
|
self.resize(900, 600)
|
||||||
|
|
||||||
root = QVBoxLayout(self)
|
root = QVBoxLayout(self)
|
||||||
|
|
@ -285,12 +285,12 @@ class TimeLogDialog(QDialog):
|
||||||
# --- Top: date label + change-date button
|
# --- Top: date label + change-date button
|
||||||
date_row = QHBoxLayout()
|
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.addWidget(self.date_label)
|
||||||
|
|
||||||
date_row.addStretch(1)
|
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)
|
self.change_date_btn.clicked.connect(self._on_change_date_clicked)
|
||||||
date_row.addWidget(self.change_date_btn)
|
date_row.addWidget(self.change_date_btn)
|
||||||
|
|
||||||
|
|
@ -477,7 +477,7 @@ class TimeLogDialog(QDialog):
|
||||||
current_qdate = QDate.currentDate()
|
current_qdate = QDate.currentDate()
|
||||||
|
|
||||||
dlg = QDialog(self)
|
dlg = QDialog(self)
|
||||||
dlg.setWindowTitle(strings._("time_log_select_date_title"))
|
dlg.setWindowTitle(strings._("select_date_title"))
|
||||||
|
|
||||||
layout = QVBoxLayout(dlg)
|
layout = QVBoxLayout(dlg)
|
||||||
|
|
||||||
|
|
@ -508,8 +508,8 @@ class TimeLogDialog(QDialog):
|
||||||
self._date_iso = new_iso
|
self._date_iso = new_iso
|
||||||
|
|
||||||
# Update window title and header label
|
# Update window title and header label
|
||||||
self.setWindowTitle(strings._("time_log_for").format(date=new_iso))
|
self.setWindowTitle(strings._("for").format(date=new_iso))
|
||||||
self.date_label.setText(strings._("time_log_date_label").format(date=new_iso))
|
self.date_label.setText(strings._("date_label").format(date=new_iso))
|
||||||
|
|
||||||
# Reload entries for the newly selected date
|
# Reload entries for the newly selected date
|
||||||
self._reload_entries()
|
self._reload_entries()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue