diff options
| author | Christian Cleberg <[email protected]> | 2026-04-01 23:25:54 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-04-01 23:25:54 -0500 |
| commit | a83893afa086f0050c825144fa818024db4df056 (patch) | |
| tree | c11c90f50acc633d2388e9a4940a4f3e7662b2a6 /Hutch/Views/Tickets | |
| parent | 7fe5ec3f69211712d39f3a1dff090119340e05d9 (diff) | |
| download | hutch-2.8.0.tar.gz hutch-2.8.0.tar.bz2 hutch-2.8.0.zip | |
feat: add Look Up screen and restrict management actions to ownersv2.8.0
Implements: https://todo.sr.ht/~ccleberg/Hutch/4
Diffstat (limited to 'Hutch/Views/Tickets')
| -rw-r--r-- | Hutch/Views/Tickets/TicketDetailView.swift | 16 | ||||
| -rw-r--r-- | Hutch/Views/Tickets/TicketListView.swift | 9 |
2 files changed, 22 insertions, 3 deletions
diff --git a/Hutch/Views/Tickets/TicketDetailView.swift b/Hutch/Views/Tickets/TicketDetailView.swift index 6ed5df0..22ebaa9 100644 --- a/Hutch/Views/Tickets/TicketDetailView.swift +++ b/Hutch/Views/Tickets/TicketDetailView.swift @@ -20,6 +20,11 @@ struct TicketDetailView: View { // Comment composer mode @State private var commentMode: CommentMode = .write + private var isOwnedByCurrentUser: Bool { + guard let currentUser = appState.currentUser else { return false } + return normalizedUsername(currentUser.username) == normalizedUsername(ownerUsername) + } + private enum CommentMode: String, CaseIterable { case write = "Write" case preview = "Preview" @@ -41,7 +46,7 @@ struct TicketDetailView: View { Image(systemName: "square.and.arrow.up") } - if let viewModel, viewModel.ticket != nil { + if let viewModel, viewModel.ticket != nil, isOwnedByCurrentUser { actionsMenu(viewModel) } } @@ -195,7 +200,9 @@ struct TicketDetailView: View { Spacer(minLength: 12) - assignToMeButton(ticket: ticket, viewModel: viewModel) + if isOwnedByCurrentUser { + assignToMeButton(ticket: ticket, viewModel: viewModel) + } } HStack(spacing: 8) { @@ -334,6 +341,11 @@ struct TicketDetailView: View { } .padding() } + + private func normalizedUsername(_ value: String) -> String { + let trimmed = value.trimmingCharacters(in: .whitespacesAndNewlines) + return trimmed.hasPrefix("~") ? String(trimmed.dropFirst()) : trimmed + } } // MARK: - Self-Sizing Markdown Web View diff --git a/Hutch/Views/Tickets/TicketListView.swift b/Hutch/Views/Tickets/TicketListView.swift index baed21c..a1cea6f 100644 --- a/Hutch/Views/Tickets/TicketListView.swift +++ b/Hutch/Views/Tickets/TicketListView.swift @@ -18,6 +18,11 @@ struct TicketListView: View { @State private var showTrackerLabels = false @State private var showDeleteTrackerConfirmation = false + private var isOwnedByCurrentUser: Bool { + guard let currentUser = appState.currentUser else { return false } + return normalizedUsername(currentUser.username) == normalizedUsername(tracker.owner.canonicalName) + } + init( tracker: TrackerSummary, onTrackerUpdated: @escaping (TrackerSummary) -> Void = { _ in }, @@ -58,7 +63,9 @@ struct TicketListView: View { } .accessibilityLabel("Create ticket") - trackerActionsMenu + if isOwnedByCurrentUser { + trackerActionsMenu + } } } } |
