Skip to content

Commit a5ffffa

Browse files
committed
fix: address PR review feedback for column visibility
1 parent 4454134 commit a5ffffa

File tree

7 files changed

+35
-16
lines changed

7 files changed

+35
-16
lines changed

TablePro/Models/UI/ColumnVisibilityManager.swift

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import Foundation
77
import Observation
88

99
@MainActor @Observable
10-
final class ColumnVisibilityManager {
11-
var hiddenColumns: Set<String> = []
10+
internal final class ColumnVisibilityManager {
11+
private(set) var hiddenColumns: Set<String> = []
1212

1313
var hasHiddenColumns: Bool {
1414
!hiddenColumns.isEmpty
@@ -54,14 +54,14 @@ final class ColumnVisibilityManager {
5454

5555
// MARK: - Per-Table UserDefaults Persistence
5656

57-
func saveLastHiddenColumns(for tableName: String) {
58-
let key = "com.TablePro.columns.hiddenColumns.\(tableName)"
57+
func saveLastHiddenColumns(for tableName: String, connectionId: UUID) {
58+
let key = Self.userDefaultsKey(tableName: tableName, connectionId: connectionId)
5959
let array = Array(hiddenColumns)
6060
UserDefaults.standard.set(array, forKey: key)
6161
}
6262

63-
func restoreLastHiddenColumns(for tableName: String) {
64-
let key = "com.TablePro.columns.hiddenColumns.\(tableName)"
63+
func restoreLastHiddenColumns(for tableName: String, connectionId: UUID) {
64+
let key = Self.userDefaultsKey(tableName: tableName, connectionId: connectionId)
6565
if let array = UserDefaults.standard.stringArray(forKey: key) {
6666
hiddenColumns = Set(array)
6767
} else {
@@ -74,4 +74,10 @@ final class ColumnVisibilityManager {
7474
let currentSet = Set(currentColumns)
7575
hiddenColumns = hiddenColumns.intersection(currentSet)
7676
}
77+
78+
// MARK: - Private
79+
80+
private static func userDefaultsKey(tableName: String, connectionId: UUID) -> String {
81+
"com.TablePro.columns.hiddenColumns.\(connectionId.uuidString).\(tableName)"
82+
}
7783
}

TablePro/Views/Main/Child/MainEditorContentView.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,8 @@ struct MainEditorContentView: View {
331331
tableName: tab.tableName,
332332
primaryKeyColumn: changeManager.primaryKeyColumn,
333333
hiddenColumns: columnVisibilityManager.hiddenColumns,
334-
onHideColumn: { columnName in
335-
columnVisibilityManager.hideColumn(columnName)
334+
onHideColumn: { [coordinator] columnName in
335+
coordinator.hideColumn(columnName)
336336
},
337337
selectedRowIndices: $selectedRowIndices,
338338
sortState: sortStateBinding(for: tab),

TablePro/Views/Main/Child/MainStatusBarView.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ struct MainStatusBarView: View {
126126
.padding(.horizontal, 12)
127127
.padding(.vertical, 4)
128128
.background(Color(nsColor: .controlBackgroundColor))
129+
.onChange(of: tab?.id) { _, _ in
130+
showColumnPopover = false
131+
}
129132
}
130133

131134
/// Generate row info text based on selection and pagination state

TablePro/Views/Main/Extensions/MainContentCoordinator+ColumnVisibility.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,16 @@ extension MainContentCoordinator {
1919

2020
/// Load per-table hidden columns from UserDefaults when opening a table tab
2121
func restoreLastHiddenColumnsForTable(_ tableName: String) {
22-
columnVisibilityManager.restoreLastHiddenColumns(for: tableName)
22+
columnVisibilityManager.restoreLastHiddenColumns(for: tableName, connectionId: connectionId)
2323
}
2424

2525
/// Prune hidden columns that no longer exist in the current result set
2626
func pruneHiddenColumns(currentColumns: [String]) {
2727
columnVisibilityManager.pruneStaleColumns(currentColumns)
2828
}
29+
30+
/// Hide a single column (routed through coordinator for centralized control)
31+
func hideColumn(_ columnName: String) {
32+
columnVisibilityManager.hideColumn(columnName)
33+
}
2934
}

TablePro/Views/Results/ColumnVisibilityPopover.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ struct ColumnVisibilityPopover: View {
6464
}
6565

6666
private var searchField: some View {
67-
TextField("Search columns...", text: $searchText)
67+
TextField(String(localized: "Search columns..."), text: $searchText)
6868
.textFieldStyle(.roundedBorder)
6969
.controlSize(.small)
7070
.padding(.horizontal, 12)

TablePro/Views/Results/DataGridView.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,10 @@ struct DataGridView: NSViewRepresentable {
527527
guard let colIndex = Self.columnIndex(from: column.identifier),
528528
colIndex < rowProvider.columns.count else { continue }
529529
let columnName = rowProvider.columns[colIndex]
530-
column.isHidden = hiddenColumns.contains(columnName)
530+
let shouldHide = hiddenColumns.contains(columnName)
531+
if column.isHidden != shouldHide {
532+
column.isHidden = shouldHide
533+
}
531534
}
532535
}
533536

TableProTests/Models/UI/ColumnVisibilityManagerTests.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -158,28 +158,30 @@ struct ColumnVisibilityManagerTests {
158158
@Test("UserDefaults round-trip for saveLastHiddenColumns and restoreLastHiddenColumns")
159159
func userDefaultsRoundTrip() {
160160
let tableName = "test_table_\(UUID().uuidString)"
161-
let key = "com.TablePro.columns.hiddenColumns.\(tableName)"
161+
let connectionId = UUID()
162+
let key = "com.TablePro.columns.hiddenColumns.\(connectionId.uuidString).\(tableName)"
162163
defer { UserDefaults.standard.removeObject(forKey: key) }
163164

164165
let manager = ColumnVisibilityManager()
165166
manager.hideAll(["col1", "col2", "col3"])
166-
manager.saveLastHiddenColumns(for: tableName)
167+
manager.saveLastHiddenColumns(for: tableName, connectionId: connectionId)
167168

168169
let other = ColumnVisibilityManager()
169-
other.restoreLastHiddenColumns(for: tableName)
170+
other.restoreLastHiddenColumns(for: tableName, connectionId: connectionId)
170171
#expect(other.hiddenColumns == Set(["col1", "col2", "col3"]))
171172
}
172173

173174
@Test("restoreLastHiddenColumns with no saved data resets to empty")
174175
func restoreWithNoSavedData() {
175176
let tableName = "nonexistent_table_\(UUID().uuidString)"
176-
let key = "com.TablePro.columns.hiddenColumns.\(tableName)"
177+
let connectionId = UUID()
178+
let key = "com.TablePro.columns.hiddenColumns.\(connectionId.uuidString).\(tableName)"
177179
defer { UserDefaults.standard.removeObject(forKey: key) }
178180

179181
let manager = ColumnVisibilityManager()
180182
manager.hideColumn("leftover")
181183

182-
manager.restoreLastHiddenColumns(for: tableName)
184+
manager.restoreLastHiddenColumns(for: tableName, connectionId: connectionId)
183185
#expect(manager.hiddenColumns.isEmpty)
184186
}
185187

0 commit comments

Comments
 (0)