From f045a5d339a796f40a9e958436ebc6f5314bdab8 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Thu, 23 Apr 2026 22:15:20 -0500 Subject: feat(v3.4.0): add backup, restore, and data portability MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • introduce versioned DomainDig backup format • add full backup export/import with merge and replace modes • implement data validation and conflict handling • add partial exports for tracked domains, workflows, and history • add Data Portability settings section • support Files/iCloud Drive import and export • harden migrations for evolving local models • extend CLI with backup export and validation --- DomainDig/WatchlistView.swift | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'DomainDig/WatchlistView.swift') diff --git a/DomainDig/WatchlistView.swift b/DomainDig/WatchlistView.swift index b4e5011..968914f 100644 --- a/DomainDig/WatchlistView.swift +++ b/DomainDig/WatchlistView.swift @@ -287,6 +287,18 @@ struct WatchlistRowView: View { .font(appDensity.font(.caption2)) .foregroundStyle(.secondary) + HStack(spacing: 8) { + Text(trackedDomain.monitoringEnabled ? "Monitoring on" : "Monitoring off") + if let lastMonitoredAt = trackedDomain.lastMonitoredAt { + Text("Checked \(lastMonitoredAt.formatted(date: .omitted, time: .shortened))") + } + if let lastAlertAt = trackedDomain.lastAlertAt { + Text("Alert \(lastAlertAt.formatted(date: .omitted, time: .shortened))") + } + } + .font(appDensity.font(.caption2)) + .foregroundStyle(.secondary) + indicatorRow if let note = trackedDomain.note?.trimmingCharacters(in: .whitespacesAndNewlines), !note.isEmpty { @@ -399,6 +411,15 @@ struct TrackedDomainDetailView: View { Label(liveTrackedDomain.isPinned ? "Unpin Domain" : "Pin Domain", systemImage: liveTrackedDomain.isPinned ? "pin.slash" : "pin") } + Button { + viewModel.toggleMonitoring(for: liveTrackedDomain) + } label: { + Label( + liveTrackedDomain.monitoringEnabled ? "Disable Monitoring" : "Enable Monitoring", + systemImage: liveTrackedDomain.monitoringEnabled ? "bell.slash" : "bell" + ) + } + Button { noteDraft = liveTrackedDomain.note ?? "" isEditingNote = true -- cgit v1.2.3