diff options
| author | Christian Cleberg <[email protected]> | 2026-04-13 09:57:23 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-04-13 09:57:23 -0500 |
| commit | 0e461a382257979037e8927e5f6b468635b0a7fe (patch) | |
| tree | 0aa3a19f6f8f966b0e90f4874ed54359a7898107 /Hutch/Views/Tickets/TicketListView.swift | |
| parent | ee9f2904aa319231b7047fca3cb069f0c07019cd (diff) | |
| download | hutch-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.swift | 60 |
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, |
