native macOS codings agent orchestrator
6
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request #218 from onevcat/palette/empty-state-alignment

Hide contextual palette actions from empty query state

authored by

Wei Wang and committed by
GitHub
3c92458f dff34e1d

+48 -11
+10 -4
supacode/Features/CommandPalette/CommandPaletteItem.swift
··· 33 33 case refreshWorktrees 34 34 case ghosttyCommand(String) 35 35 case openPullRequest(Worktree.ID) 36 + case openRepositoryOnCodeHost(Worktree.ID) 36 37 case markPullRequestReady(Worktree.ID) 37 38 case mergePullRequest(Worktree.ID) 38 39 case closePullRequest(Worktree.ID) ··· 62 63 .copyFailingJobURL, 63 64 .copyCiFailureLogs, 64 65 .rerunFailedJobs, 65 - .openFailingCheckDetails, 66 - .changeFocusedTabIcon: 66 + .openFailingCheckDetails: 67 67 return true 68 - case .worktreeSelect, .removeWorktree, .archiveWorktree: 68 + case .worktreeSelect, 69 + .removeWorktree, 70 + .archiveWorktree, 71 + .changeFocusedTabIcon, 72 + .openRepositoryOnCodeHost: 69 73 return false 70 74 #if DEBUG 71 75 case .debugTestToast, .debugSimulateUpdateFound: ··· 82 86 case .ghosttyCommand: 83 87 return false 84 88 case .openPullRequest, 89 + .openRepositoryOnCodeHost, 85 90 .markPullRequestReady, 86 91 .mergePullRequest, 87 92 .closePullRequest, ··· 115 120 return AppShortcuts.CommandID.archivedWorktrees 116 121 case .refreshWorktrees: 117 122 return AppShortcuts.CommandID.refreshWorktrees 118 - case .openPullRequest: 123 + case .openPullRequest, 124 + .openRepositoryOnCodeHost: 119 125 return AppShortcuts.CommandID.openPullRequest 120 126 case .ghosttyCommand, 121 127 .markPullRequestReady,
+4 -2
supacode/Features/CommandPalette/Reducer/CommandPaletteFeature.swift
··· 304 304 id: CommandPaletteItemID.pullRequestOpen(repositoryID), 305 305 title: "Open Repository on Code Host", 306 306 subtitle: repository.name, 307 - kind: .openPullRequest(selectedWorktreeID), 307 + kind: .openRepositoryOnCodeHost(selectedWorktreeID), 308 308 priorityTier: 2 309 309 ), 310 310 ] ··· 622 622 case .changeFocusedTabIcon(let worktreeID): 623 623 return .changeFocusedTabIcon(worktreeID) 624 624 case .openPullRequest, 625 + .openRepositoryOnCodeHost, 625 626 .markPullRequestReady, 626 627 .mergePullRequest, 627 628 .closePullRequest, ··· 643 644 for kind: CommandPaletteItem.Kind 644 645 ) -> CommandPaletteFeature.Delegate? { 645 646 switch kind { 646 - case .openPullRequest(let worktreeID): 647 + case .openPullRequest(let worktreeID), 648 + .openRepositoryOnCodeHost(let worktreeID): 647 649 return .openPullRequest(worktreeID) 648 650 case .markPullRequestReady(let worktreeID): 649 651 return .markPullRequestReady(worktreeID)
+6 -4
supacode/Features/CommandPalette/Views/CommandPaletteOverlayView.swift
··· 349 349 switch row.kind { 350 350 case .checkForUpdates, .openRepository, .openSettings, .newWorktree, .viewArchivedWorktrees, 351 351 .refreshWorktrees, .installCLI, .ghosttyCommand, 352 - .openPullRequest, .markPullRequestReady, .mergePullRequest, .closePullRequest, .copyFailingJobURL, 352 + .openPullRequest, .openRepositoryOnCodeHost, .markPullRequestReady, .mergePullRequest, .closePullRequest, 353 + .copyFailingJobURL, 353 354 .copyCiFailureLogs, 354 355 .rerunFailedJobs, .openFailingCheckDetails, .worktreeSelect, .changeFocusedTabIcon: 355 356 return nil ··· 380 381 return "arrow.clockwise" 381 382 case .ghosttyCommand: 382 383 return "terminal" 383 - case .openPullRequest: 384 + case .openPullRequest, .openRepositoryOnCodeHost: 384 385 return "arrow.up.right.square" 385 386 case .markPullRequestReady: 386 387 return "checkmark.seal" ··· 419 420 switch row.kind { 420 421 case .checkForUpdates, .openRepository, .openSettings, .newWorktree, .viewArchivedWorktrees, 421 422 .refreshWorktrees, .installCLI, .ghosttyCommand, 422 - .openPullRequest, .markPullRequestReady, .mergePullRequest, .closePullRequest, .copyFailingJobURL, 423 + .openPullRequest, .openRepositoryOnCodeHost, .markPullRequestReady, .mergePullRequest, .closePullRequest, 424 + .copyFailingJobURL, 423 425 .copyCiFailureLogs, 424 426 .rerunFailedJobs, .openFailingCheckDetails, .changeFocusedTabIcon: 425 427 return true ··· 519 521 base = "Remove \(row.title)" 520 522 case .archiveWorktree: 521 523 base = "Archive \(row.title)" 522 - case .openPullRequest: 524 + case .openPullRequest, .openRepositoryOnCodeHost: 523 525 base = "Open on Code Host" 524 526 case .markPullRequestReady: 525 527 base = "Mark pull request ready for review"
+28 -1
supacodeTests/CommandPaletteFeatureTests.swift
··· 188 188 189 189 let items = CommandPaletteFeature.commandPaletteItems(from: state) 190 190 let openItem = items.first { 191 - if case .openPullRequest(let worktreeID) = $0.kind { 191 + if case .openRepositoryOnCodeHost(let worktreeID) = $0.kind { 192 192 return worktreeID == worktree.id 193 193 } 194 194 return false ··· 196 196 197 197 #expect(openItem?.title == "Open Repository on Code Host") 198 198 #expect(openItem?.subtitle == repository.name) 199 + 200 + let emptyQueryItems = CommandPaletteFeature.filterItems(items: items, query: "") 201 + #expect(emptyQueryItems.contains(where: { $0.id == openItem?.id }) == false) 202 + 203 + let searchedItems = CommandPaletteFeature.filterItems(items: items, query: "code host") 204 + #expect(searchedItems.contains(where: { $0.id == openItem?.id })) 205 + } 206 + 207 + @Test func emptyQueryHidesChangeFocusedTabIcon() { 208 + let rootPath = "/tmp/repo" 209 + let worktree = makeWorktree(id: rootPath, name: "repo", repoRoot: rootPath) 210 + let repository = makeRepository(rootPath: rootPath, name: "Repo", worktrees: [worktree]) 211 + var state = RepositoriesFeature.State(repositories: [repository]) 212 + state.selection = .worktree(worktree.id) 213 + 214 + let items = CommandPaletteFeature.commandPaletteItems(from: state) 215 + let changeIconItem = items.first { 216 + if case .changeFocusedTabIcon = $0.kind { return true } 217 + return false 218 + } 219 + #expect(changeIconItem != nil) 220 + 221 + let emptyQueryItems = CommandPaletteFeature.filterItems(items: items, query: "") 222 + #expect(emptyQueryItems.contains(where: { $0.id == changeIconItem?.id }) == false) 223 + 224 + let searchedItems = CommandPaletteFeature.filterItems(items: items, query: "tab icon") 225 + #expect(searchedItems.contains(where: { $0.id == changeIconItem?.id })) 199 226 } 200 227 201 228 @Test func emptyQueryHidesGhosttyCommands() {