From 9384a668bf36f23f71e25d05b490d1040d308845 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Wed, 22 Apr 2026 10:14:30 -0500 Subject: feat(v2.8.0): add workflows and repeatable inspection automation * introduce DomainWorkflow model and persistence * add WorkflowsView and execution flow * support batch inspection via workflows * add workflow-based export (TXT/CSV/JSON) * enable bulk add from history/watchlist * add quick actions for common operations * integrate workflows with tracking and history --- DomainDig/HistoryView.swift | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'DomainDig/HistoryView.swift') diff --git a/DomainDig/HistoryView.swift b/DomainDig/HistoryView.swift index 9505c12..3bda59d 100644 --- a/DomainDig/HistoryView.swift +++ b/DomainDig/HistoryView.swift @@ -5,6 +5,7 @@ struct HistoryView: View { @Bindable var viewModel: DomainViewModel @Environment(\.dismiss) private var dismiss @State private var showClearAllConfirmation = false + @State private var showWorkflowAddSheet = false private var groupedHistory: [HistoryGroup] { HistoryGroup.groups(for: viewModel.filteredHistory) @@ -105,6 +106,12 @@ struct HistoryView: View { Button("Clear All", role: .destructive) { showClearAllConfirmation = true } + + if !viewModel.filteredHistory.isEmpty { + Button("Add to Workflow") { + showWorkflowAddSheet = true + } + } } label: { Image(systemName: "line.3.horizontal.decrease.circle") } @@ -121,6 +128,13 @@ struct HistoryView: View { } message: { Text("This will delete all saved history entries. This cannot be undone.") } + .sheet(isPresented: $showWorkflowAddSheet) { + WorkflowBulkAddSheet( + viewModel: viewModel, + title: "Add History Domains", + availableDomains: Array(Set(viewModel.filteredHistory.map(\.domain))).sorted() + ) + } .onChange(of: viewModel.rerunNavigationToken) { _, _ in dismiss() } @@ -170,6 +184,7 @@ struct HistoryDetailView: View { confidence: snapshot.availabilityConfidence, snapshotNote: entry.note, trackedDomain: viewModel.trackedDomains.first(where: { $0.domain.lowercased() == entry.domain.lowercased() }), + workflows: viewModel.workflowsContaining(domain: entry.domain), trackingLimitMessage: nil, onTrack: { _ = viewModel.trackDomain(domain: entry.domain, availabilityStatus: entry.availabilityResult?.status) @@ -178,7 +193,10 @@ struct HistoryDetailView: View { guard let trackedDomain = viewModel.trackedDomains.first(where: { $0.domain.lowercased() == entry.domain.lowercased() }) else { return } viewModel.togglePinned(for: trackedDomain) }, - onEditNote: nil + onEditNote: nil, + onAddToWorkflow: nil, + onOpenWorkflow: nil, + onRunWorkflow: nil ) .padding(.top, appDensity.metrics.sectionSpacing) OwnershipSectionView( -- cgit v1.2.3