Skip to content

Commit ba0d32f

Browse files
committed
fix(inspector): fix CSV header demote width, guard the no-op toggle, wire Cmd+Shift+H through shortcuts
1 parent 9cddd43 commit ba0d32f

5 files changed

Lines changed: 20 additions & 13 deletions

File tree

Plugins/CSVInspectorPlugin/CSVDocument.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ public final class CSVDocument: NSDocument, InspectorDocument {
349349
}
350350

351351
public func toggleHeaderRow() {
352+
guard store.hasHeaderRow || store.rowCount > 0 else { return }
352353
performStructuralChange(name: String(localized: "Switch Header Row")) {
353354
store.toggleHeaderRow()
354355
recomputeInferredTypes()

Plugins/CSVInspectorPlugin/CSVRowStore.swift

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ final class CSVRowStore {
331331

332332
func toggleHeaderRow() {
333333
if hasHeaderRow {
334-
let headerCells = currentHeaderCells()
334+
let headerCells = columnNames
335335
let synthetic = (0..<columnNames.count).map { "Column \($0 + 1)" }
336336
logicalRows.insert(.materialized(headerCells), at: 0)
337337
columnNames = synthetic
@@ -369,15 +369,6 @@ final class CSVRowStore {
369369
cacheOrder.removeAll()
370370
}
371371

372-
private func currentHeaderCells() -> [String] {
373-
switch headerRef {
374-
case .original(let range):
375-
return applyColumnTransforms(cachedRawCells(in: range))
376-
case .materialized(let cells):
377-
return cells
378-
}
379-
}
380-
381372
static func split(_ value: String, spec: SplitSpec) -> [String] {
382373
switch spec {
383374
case .literal(let separator):

TablePro/Models/UI/KeyboardShortcutModels.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ enum ShortcutAction: String, Codable, CaseIterable, Identifiable {
9696
case addRow
9797
case duplicateRow
9898
case truncateTable
99+
case toggleHeaderRow
99100
case previewFKReference
100101
case saveAsFavorite
101102
case previousPage
@@ -138,7 +139,7 @@ enum ShortcutAction: String, Codable, CaseIterable, Identifiable {
138139
return .editor
139140
case .undo, .redo, .cut, .copy, .copyRowsExplicit, .copyWithHeaders, .copyAsJson,
140141
.paste, .delete, .selectAll, .clearSelection, .addRow, .duplicateRow,
141-
.truncateTable, .previewFKReference, .saveAsFavorite, .previousPage,
142+
.truncateTable, .toggleHeaderRow, .previewFKReference, .saveAsFavorite, .previousPage,
142143
.nextPage, .firstPage, .lastPage, .refresh, .export, .importData:
143144
return .dataGrid
144145
case .newTab, .closeTab, .reopenClosedTab, .quickSwitcher, .toggleTableBrowser,
@@ -216,6 +217,7 @@ enum ShortcutAction: String, Codable, CaseIterable, Identifiable {
216217
case .addRow: return String(localized: "Add Row")
217218
case .duplicateRow: return String(localized: "Duplicate Row")
218219
case .truncateTable: return String(localized: "Truncate Table")
220+
case .toggleHeaderRow: return String(localized: "Switch First Row Between Header/Data")
219221
case .previewFKReference: return String(localized: "Preview FK Reference")
220222
case .saveAsFavorite: return String(localized: "Save as Favorite")
221223
case .toggleTableBrowser: return String(localized: "Toggle Table Browser")
@@ -433,6 +435,7 @@ struct KeyboardSettings: Codable, Equatable {
433435
.addRow: .character("n", command: true, shift: true),
434436
.duplicateRow: .character("d", command: true, shift: true),
435437
.truncateTable: .special(.delete, option: true),
438+
.toggleHeaderRow: .character("h", command: true, shift: true),
436439
.previewFKReference: .special(.space),
437440
.saveAsFavorite: .character("d", command: true),
438441
.previousPage: .character("[", command: true),

TablePro/TableProApp.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -645,10 +645,10 @@ struct AppMenuCommands: Commands {
645645
}
646646
.disabled(!keyWindowIsInspector)
647647

648-
Button(String(localized: "Switch First Row Between Header/Data")) {
648+
Button("Switch First Row Between Header/Data") {
649649
NSApp.sendAction(#selector(InspectorViewController.inspectorToggleHeaderRow(_:)), to: nil, from: nil)
650650
}
651-
.keyboardShortcut("h", modifiers: [.command, .shift])
651+
.optionalKeyboardShortcut(shortcut(for: .toggleHeaderRow))
652652
.disabled(!keyWindowIsInspector)
653653

654654
Divider()

TableProTests/Plugins/CSVInspectorTests.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,18 @@ struct CSVRowStoreTests {
395395
#expect(store.rowCount == 2)
396396
#expect(store.cells(forRow: 0) == ["Alice", "30"])
397397
}
398+
399+
@Test("Demoting after a column insert keeps the header row the full width")
400+
func toggleHeaderAfterColumnInsert() {
401+
let store = makeStore("1,2\n3,4\n")
402+
store.toggleHeaderRow()
403+
store.insertColumn(at: 2, name: "c")
404+
store.toggleHeaderRow()
405+
#expect(store.columnCount == 3)
406+
#expect(store.columnNames == ["Column 1", "Column 2", "Column 3"])
407+
#expect(store.cells(forRow: 0) == ["1", "2", "c"])
408+
#expect(store.cells(forRow: 1).count == 3)
409+
}
398410
}
399411

400412
@Suite("CSVWriter round-trip")

0 commit comments

Comments
 (0)