Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@ extension MainContentCoordinator {
/// Run EXPLAIN with a specific variant (e.g. ClickHouse Plan/Pipeline/AST).
/// Accepts the plugin-kit `ExplainVariant` type for generic dispatch.
func runVariantExplain(_ variant: ExplainVariant) {
guard let index = tabManager.selectedTabIndex else { return }
guard !tabManager.tabs[index].execution.isExecuting else { return }
guard let (tab, _) = tabManager.selectedTabAndIndex,
!tab.execution.isExecuting else { return }

let fullQuery = tabManager.tabs[index].content.query
let fullQuery = tab.content.query

let sql: String
if tabManager.tabs[index].tabType == .table {
if tab.tabType == .table {
sql = fullQuery
} else if let firstCursor = cursorPositions.first,
firstCursor.range.length > 0 {
Expand All @@ -56,7 +56,7 @@ extension MainContentCoordinator {
guard let stmt = statements.first else { return }

let explainSQL = "\(variant.sqlPrefix) \(stmt)"
let tabId = tabManager.tabs[index].id
let tabId = tab.id

Task {
guard let driver = DatabaseManager.shared.driver(for: connectionId) else { return }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import Foundation
extension MainContentCoordinator {
/// Save current hidden columns to the active tab's column layout
func saveColumnVisibilityToTab() {
guard let index = tabManager.selectedTabIndex else { return }
guard let (_, index) = tabManager.selectedTabAndIndex else { return }
tabManager.tabs[index].columnLayout.hiddenColumns = columnVisibilityManager.saveToColumnLayout()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@ extension MainContentCoordinator {
) {
let originalValues = changeManager.getOriginalValues()
var deltas: [Delta] = []
if let index = tabManager.selectedTabIndex {
let tabId = tabManager.tabs[index].id
if let (tab, _) = tabManager.selectedTabAndIndex {
let tabId = tab.id
let insertedIDs = collectInsertedRowIDs(
tabId: tabId,
indices: changeManager.insertedRowIndices
Expand Down Expand Up @@ -109,7 +109,7 @@ extension MainContentCoordinator {
pendingDeletes.removeAll()
changeManager.clearChangesAndUndoHistory()

if let index = tabManager.selectedTabIndex {
if let (_, index) = tabManager.selectedTabAndIndex {
tabManager.tabs[index].pendingChanges = TabChangeSnapshot()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ import Foundation

extension MainContentCoordinator {
func runAllStatements() {
guard let index = tabManager.selectedTabIndex else { return }
guard !tabManager.tabs[index].execution.isExecuting else { return }
guard tabManager.tabs[index].tabType == .query else { return }
guard let (tab, index) = tabManager.selectedTabAndIndex,
!tab.execution.isExecuting,
tab.tabType == .query else { return }

let fullQuery = tabManager.tabs[index].content.query
let fullQuery = tab.content.query
guard !fullQuery.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { return }

let statements = SQLStatementScanner.allStatements(in: fullQuery)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,8 @@ extension MainContentCoordinator {
current.tableContext.databaseName == currentDatabase,
current.tableContext.schemaName == targetSchema {
applyFKFilter(filter, for: referencedTable)
// Persist so tab switch restore picks it up
if let idx = tabManager.selectedTabIndex {
tabManager.tabs[idx].filterState = filterStateManager.saveToTabState()
if let (_, tabIndex) = tabManager.selectedTabAndIndex {
tabManager.tabs[tabIndex].filterState = filterStateManager.saveToTabState()
}
return
}
Expand Down Expand Up @@ -82,24 +81,19 @@ extension MainContentCoordinator {
schemaName: targetSchema
)

if needsQuery, let tabIndex = tabManager.selectedTabIndex {
let tabId = tabManager.tabs[tabIndex].id
setActiveTableRows(TableRows(), for: tabId)
if needsQuery, let (tab, tabIndex) = tabManager.selectedTabAndIndex {
setActiveTableRows(TableRows(), for: tab.id)
tabManager.tabs[tabIndex].pagination.reset()
}

// Update editable state for menu items
if let tabIndex = tabManager.selectedTabIndex {
let tab = tabManager.tabs[tabIndex]
if let (tab, _) = tabManager.selectedTabAndIndex {
toolbarState.isTableTab = tab.tabType == .table
}

if needsQuery {
NSApp.keyWindow?.title = referencedTable

// New tab — build filtered query directly, run once
guard let tabIndex = tabManager.selectedTabIndex else { return }
let tab = tabManager.tabs[tabIndex]
guard let (tab, tabIndex) = tabManager.selectedTabAndIndex else { return }
let tableRows = tableRowsStore.tableRows(for: tab.id)
let filteredQuery = queryBuilder.buildFilteredQuery(
tableName: referencedTable,
Expand All @@ -118,11 +112,8 @@ extension MainContentCoordinator {

runQuery()
} else {
// Reused tab already has data — apply filter (rebuilds query + re-runs)
applyFKFilter(filter, for: referencedTable)

// Persist FK filter to reused tab
if let tabIndex = tabManager.selectedTabIndex {
if let (_, tabIndex) = tabManager.selectedTabAndIndex {
tabManager.tabs[tabIndex].filterState = filterStateManager.saveToTabState()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,9 @@ extension MainContentCoordinator {
return
}

if let tabIndex = tabManager.selectedTabIndex,
tabManager.tabs[tabIndex].tabType == .query {
let existing = tabManager.tabs[tabIndex].content.query
.trimmingCharacters(in: .whitespacesAndNewlines)
if let (tab, tabIndex) = tabManager.selectedTabAndIndex,
tab.tabType == .query {
let existing = tab.content.query.trimmingCharacters(in: .whitespacesAndNewlines)
if existing.isEmpty {
tabManager.tabs[tabIndex].content.query = favorite.query
} else {
Expand Down Expand Up @@ -47,9 +46,9 @@ extension MainContentCoordinator {
return
}

if let tabIndex = tabManager.selectedTabIndex,
tabManager.tabs[tabIndex].tabType == .query,
tabManager.tabs[tabIndex].content.query.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
if let (tab, tabIndex) = tabManager.selectedTabAndIndex,
tab.tabType == .query,
tab.content.query.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
tabManager.tabs[tabIndex].content.query = favorite.query
return
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,8 @@ extension MainContentCoordinator {
// MARK: - Filtering

func applyFilters(_ filters: [TableFilter]) {
guard let tabIndex = tabManager.selectedTabIndex,
tabIndex < tabManager.tabs.count,
let tableName = tabManager.tabs[tabIndex].tableContext.tableName else { return }
guard let (tab, tabIndex) = tabManager.selectedTabAndIndex,
let tableName = tab.tableContext.tableName else { return }

let capturedTabIndex = tabIndex
let capturedTableName = tableName
Expand Down Expand Up @@ -53,9 +52,8 @@ extension MainContentCoordinator {
}

func clearFiltersAndReload() {
guard let tabIndex = tabManager.selectedTabIndex,
tabIndex < tabManager.tabs.count,
let tableName = tabManager.tabs[tabIndex].tableContext.tableName else { return }
guard let (tab, tabIndex) = tabManager.selectedTabAndIndex,
let tableName = tab.tableContext.tableName else { return }

let capturedTabIndex = tabIndex
let capturedTableName = tableName
Expand Down Expand Up @@ -83,10 +81,10 @@ extension MainContentCoordinator {

func restoreFiltersForTable(_ tableName: String) {
filterStateManager.restoreLastFilters(for: tableName)
guard let idx = tabManager.selectedTabIndex else { return }
tabManager.tabs[idx].filterState = filterStateManager.saveToTabState()
guard let (_, tabIndex) = tabManager.selectedTabAndIndex else { return }
tabManager.tabs[tabIndex].filterState = filterStateManager.saveToTabState()
if filterStateManager.hasAppliedFilters {
rebuildTableQuery(at: idx)
rebuildTableQuery(at: tabIndex)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,8 @@ extension MainContentCoordinator {
// MARK: - Load More Rows

func loadMoreRows() {
guard let idx = tabManager.selectedTabIndex else { return }
let tab = tabManager.tabs[idx]
guard !tab.pagination.isLoadingMore,
guard let (tab, tabIndex) = tabManager.selectedTabAndIndex,
!tab.pagination.isLoadingMore,
!tab.execution.isExecuting,
tab.pagination.hasMoreRows,
let baseQuery = tab.pagination.baseQueryForMore else { return }
Expand All @@ -48,7 +47,7 @@ extension MainContentCoordinator {
let capturedGeneration = queryGeneration
let storedParamValues = tab.pagination.baseQueryParameterValues

tabManager.tabs[idx].pagination.isLoadingMore = true
tabManager.tabs[tabIndex].pagination.isLoadingMore = true
toolbarState.setExecuting(true)

currentQueryTask = Task { [weak self] in
Expand Down Expand Up @@ -134,9 +133,8 @@ extension MainContentCoordinator {
// MARK: - Fetch All Rows

func fetchAllRows() {
guard let idx = tabManager.selectedTabIndex else { return }
let tab = tabManager.tabs[idx]
guard !tab.pagination.isLoadingMore,
guard let (tab, _) = tabManager.selectedTabAndIndex,
!tab.pagination.isLoadingMore,
!tab.execution.isExecuting,
tab.pagination.hasMoreRows,
let baseQuery = tab.pagination.baseQueryForMore else { return }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ extension MainContentCoordinator {
current.tabType == .table,
current.tableContext.tableName == tableName,
current.tableContext.databaseName == currentDatabase {
if showStructure, let idx = tabManager.selectedTabIndex {
tabManager.tabs[idx].display.resultsViewMode = .structure
if showStructure, let (_, tabIndex) = tabManager.selectedTabAndIndex {
tabManager.tabs[tabIndex].display.resultsViewMode = .structure
}
return
}
Expand Down Expand Up @@ -91,7 +91,7 @@ extension MainContentCoordinator {
databaseName: currentDatabase
)
}
if let tabIndex = tabManager.selectedTabIndex {
if let (_, tabIndex) = tabManager.selectedTabAndIndex {
tabManager.tabs[tabIndex].tableContext.isView = isView
tabManager.tabs[tabIndex].tableContext.isEditable = !isView
tabManager.tabs[tabIndex].tableContext.schemaName = currentSchema
Expand Down Expand Up @@ -123,9 +123,8 @@ extension MainContentCoordinator {
schemaName: currentSchema
) {
filterStateManager.clearAll()
if let tabIndex = tabManager.selectedTabIndex {
let tabId = tabManager.tabs[tabIndex].id
setActiveTableRows(TableRows(), for: tabId)
if let (tab, tabIndex) = tabManager.selectedTabAndIndex {
setActiveTableRows(TableRows(), for: tab.id)
tabManager.tabs[tabIndex].pagination.reset()
toolbarState.isTableTab = true
}
Expand Down Expand Up @@ -277,9 +276,8 @@ extension MainContentCoordinator {
isPreview: true
)
filterStateManager.clearAll()
if let tabIndex = tabManager.selectedTabIndex {
let tabId = tabManager.tabs[tabIndex].id
setActiveTableRows(TableRows(), for: tabId)
if let (tab, tabIndex) = tabManager.selectedTabAndIndex {
setActiveTableRows(TableRows(), for: tab.id)
tabManager.tabs[tabIndex].display.resultsViewMode = showStructure ? .structure : .data
tabManager.tabs[tabIndex].pagination.reset()
toolbarState.isTableTab = true
Expand All @@ -305,8 +303,8 @@ extension MainContentCoordinator {
}

func promotePreviewTab() {
guard let tabIndex = tabManager.selectedTabIndex,
tabManager.tabs[tabIndex].isPreview else { return }
guard let (tab, tabIndex) = tabManager.selectedTabAndIndex,
tab.isPreview else { return }
tabManager.tabs[tabIndex].isPreview = false

if let wid = windowId {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ extension MainContentCoordinator {
}

func executeQueryWithParameters(_ sql: String, parameters: [QueryParameter]) {
guard let index = tabManager.selectedTabIndex else { return }
guard let (_, index) = tabManager.selectedTabAndIndex else { return }

let missing = parameters.filter {
!$0.isNull && $0.value.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
Expand Down Expand Up @@ -59,8 +59,8 @@ extension MainContentCoordinator {
parameters: [Any?],
originalParameters: [QueryParameter]
) {
guard let index = tabManager.selectedTabIndex else { return }
guard !tabManager.tabs[index].execution.isExecuting else { return }
guard let (selectedTab, index) = tabManager.selectedTabAndIndex,
!selectedTab.execution.isExecuting else { return }

if currentQueryTask != nil {
currentQueryTask?.cancel()
Expand Down Expand Up @@ -224,8 +224,8 @@ extension MainContentCoordinator {
}

func executeMultipleStatementsWithParameters(_ statements: [String], parameters: [QueryParameter]) {
guard let index = tabManager.selectedTabIndex else { return }
guard !tabManager.tabs[index].execution.isExecuting else { return }
guard let (selectedTab, index) = tabManager.selectedTabAndIndex,
!selectedTab.execution.isExecuting else { return }

let missing = parameters.filter {
!$0.isNull && $0.value.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ extension MainContentCoordinator {
onDiscard: @escaping () -> Void
) {
// If showing structure view, let it handle refresh notifications
if let tabIndex = tabManager.selectedTabIndex,
tabManager.tabs[tabIndex].display.resultsViewMode == .structure {
if let (tab, _) = tabManager.selectedTabAndIndex,
tab.display.resultsViewMode == .structure {
return
}

Expand All @@ -30,21 +30,18 @@ extension MainContentCoordinator {
if confirmed {
onDiscard()
changeManager.clearChangesAndUndoHistory()
// Only execute query if we're in a table tab
// Query tabs should not auto-execute on refresh (use Cmd+Enter to execute)
if let tabIndex = tabManager.selectedTabIndex,
tabManager.tabs[tabIndex].tabType == .table {
if let (tab, tabIndex) = tabManager.selectedTabAndIndex,
tab.tabType == .table {
currentQueryTask?.cancel()
rebuildTableQuery(at: tabIndex)
runQuery()
}
}
}
} else {
// Only execute query if we're in a table tab
// Query tabs should not auto-execute on refresh (use Cmd+Enter to execute)
if let tabIndex = tabManager.selectedTabIndex,
tabManager.tabs[tabIndex].tabType == .table {
if let (tab, tabIndex) = tabManager.selectedTabAndIndex,
tab.tabType == .table {
currentQueryTask?.cancel()
rebuildTableQuery(at: tabIndex)
runQuery()
Expand Down
14 changes: 7 additions & 7 deletions TablePro/Views/Main/MainContentCommandActions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -632,8 +632,7 @@ final class MainContentCommandActions {

func formatQuery() {
guard let coordinator,
let tabIndex = coordinator.tabManager.selectedTabIndex else { return }
let tab = coordinator.tabManager.tabs[tabIndex]
let (tab, tabIndex) = coordinator.tabManager.selectedTabAndIndex else { return }
let dbType = connection.type
let formatter = SQLFormatterService()
let options = SQLFormatterOptions.default
Expand Down Expand Up @@ -662,14 +661,15 @@ final class MainContentCommandActions {
}

func toggleResults() {
guard let coordinator, let tabIndex = coordinator.tabManager.selectedTabIndex else { return }
guard let coordinator,
let (_, tabIndex) = coordinator.tabManager.selectedTabAndIndex else { return }
coordinator.tabManager.tabs[tabIndex].display.isResultsCollapsed.toggle()
coordinator.toolbarState.isResultsCollapsed = coordinator.tabManager.tabs[tabIndex].display.isResultsCollapsed
}

func previousResultTab() {
guard let coordinator, let tabIndex = coordinator.tabManager.selectedTabIndex else { return }
let tab = coordinator.tabManager.tabs[tabIndex]
guard let coordinator,
let (tab, _) = coordinator.tabManager.selectedTabAndIndex else { return }
guard tab.display.resultSets.count > 1,
let currentId = tab.display.activeResultSetId ?? tab.display.resultSets.last?.id,
let currentIndex = tab.display.resultSets.firstIndex(where: { $0.id == currentId }),
Expand All @@ -678,8 +678,8 @@ final class MainContentCommandActions {
}

func nextResultTab() {
guard let coordinator, let tabIndex = coordinator.tabManager.selectedTabIndex else { return }
let tab = coordinator.tabManager.tabs[tabIndex]
guard let coordinator,
let (tab, _) = coordinator.tabManager.selectedTabAndIndex else { return }
guard tab.display.resultSets.count > 1,
let currentId = tab.display.activeResultSetId ?? tab.display.resultSets.last?.id,
let currentIndex = tab.display.resultSets.firstIndex(where: { $0.id == currentId }),
Expand Down
Loading
Loading