summaryrefslogtreecommitdiff
path: root/Hutch/Views/Tickets/TicketListView.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-04-13 09:57:23 -0500
committerChristian Cleberg <[email protected]>2026-04-13 09:57:23 -0500
commit0e461a382257979037e8927e5f6b468635b0a7fe (patch)
tree0aa3a19f6f8f966b0e90f4874ed54359a7898107 /Hutch/Views/Tickets/TicketListView.swift
parentee9f2904aa319231b7047fca3cb069f0c07019cd (diff)
downloadhutch-0e461a382257979037e8927e5f6b468635b0a7fe.tar.gz
hutch-0e461a382257979037e8927e5f6b468635b0a7fe.tar.bz2
hutch-0e461a382257979037e8927e5f6b468635b0a7fe.zip
feat: add power user actions
Implements: https://todo.sr.ht/~ccleberg/hutch/52 Implements: https://todo.sr.ht/~ccleberg/hutch/53 Implements: https://todo.sr.ht/~ccleberg/hutch/54
Diffstat (limited to 'Hutch/Views/Tickets/TicketListView.swift')
-rw-r--r--Hutch/Views/Tickets/TicketListView.swift60
1 files changed, 57 insertions, 3 deletions
diff --git a/Hutch/Views/Tickets/TicketListView.swift b/Hutch/Views/Tickets/TicketListView.swift
index ccd06fe..f7529fb 100644
--- a/Hutch/Views/Tickets/TicketListView.swift
+++ b/Hutch/Views/Tickets/TicketListView.swift
@@ -7,6 +7,7 @@ struct TicketListView: View {
@AppStorage(AppStorageKeys.swipeActionsEnabled, store: .standard) private var swipeActionsEnabled = true
@Environment(AppState.self) private var appState
@Environment(\.dismiss) private var dismiss
+ @Environment(\.openURL) private var openURL
@State private var tracker: TrackerSummary
@State private var viewModel: TicketListViewModel?
@State private var trackerManagementViewModel: TrackerManagementViewModel?
@@ -86,9 +87,7 @@ struct TicketListView: View {
viewModel?.setSelectionMode(true)
}
- if isOwnedByCurrentUser {
- trackerActionsMenu
- }
+ trackerActionsMenu
}
}
}
@@ -296,6 +295,27 @@ struct TicketListView: View {
} label: {
TicketRowView(ticket: ticket)
}
+ .contextMenu {
+ if let url = SRHTWebURL.ticket(ownerUsername: ownerUsername(for: tracker), trackerName: tracker.name, ticketId: ticket.id) {
+ Button {
+ openURL(url)
+ } label: {
+ Label("Open in Browser", systemImage: "safari")
+ }
+
+ Button {
+ appState.copyToPasteboard(url.absoluteString, label: "ticket URL")
+ } label: {
+ Label("Copy URL", systemImage: "doc.on.doc")
+ }
+ }
+
+ Button {
+ appState.copyToPasteboard(String(ticket.id), label: "ticket ID")
+ } label: {
+ Label("Copy Ticket ID", systemImage: "number")
+ }
+ }
.swipeActions(edge: .leading, allowsFullSwipe: true) {
if swipeActionsEnabled {
ticketAssignSwipeAction(ticket, viewModel: viewModel)
@@ -409,6 +429,35 @@ struct TicketListView: View {
private var trackerActionsMenu: some View {
Menu {
+ if let trackerURL = SRHTWebURL.tracker(tracker) {
+ Button {
+ openURL(trackerURL)
+ } label: {
+ Label("Open in Browser", systemImage: "safari")
+ }
+
+ Button {
+ appState.copyToPasteboard(trackerURL.absoluteString, label: "tracker URL")
+ } label: {
+ Label("Copy URL", systemImage: "doc.on.doc")
+ }
+ }
+
+ Button {
+ appState.copyToPasteboard(String(tracker.id), label: "tracker ID")
+ } label: {
+ Label("Copy Tracker ID", systemImage: "number")
+ }
+
+ Button {
+ appState.copyToPasteboard(tracker.rid, label: "tracker RID")
+ } label: {
+ Label("Copy RID", systemImage: "number")
+ }
+
+ if isOwnedByCurrentUser {
+ Divider()
+
Button {
showTrackerEditor = true
} label: {
@@ -432,12 +481,17 @@ struct TicketListView: View {
} label: {
Label("Delete Tracker", systemImage: "trash")
}
+ }
} label: {
Image(systemName: "ellipsis.circle")
}
.accessibilityLabel("Tracker actions")
}
+ private func ownerUsername(for tracker: TrackerSummary) -> String {
+ tracker.owner.canonicalName.srhtUsername
+ }
+
@ViewBuilder
private func ticketAssignSwipeAction(
_ ticket: TicketSummary,