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
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Changed

- iOS: VoiceOver now reads connection rows and table rows as a single combined element with type, name, host or row count, and includes a hint about what tapping does
- iOS: toolbar icon-only buttons (Add Connection, Sync with iCloud, Settings) gain accessibility labels for VoiceOver
- Internal: per-connection `UserDefaults` keys (`lastTab.<uuid>`, `lastDB.<uuid>`, `lastSchema.<uuid>`, `lastQuery.<uuid>`) clear when a connection is deleted, so they no longer accumulate over time
- Internal: drop redundant 4-line Xcode-generated file headers from every iOS source file (~58 files)
- Internal: iOS query editor uses a `Binding<Bool>` focus channel into `SQLHighlightTextView` to dismiss the keyboard before running a query, replacing the `UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder))` call. Keyboard behavior is unchanged
- Internal: iOS row detail (edit lifecycle, save SQL build, lazy cell value load, primary key extraction, success-toast auto-dismiss) moves out of the View into `RowDetailViewModel`. The View now keeps only sheet flags and haptic triggers; behavior is unchanged
- Internal: iOS connection form (test connection, save, file picker handlers, default port resolution, credential hydration) moves out of the View into `ConnectionFormViewModel`. The View drops from 53 to 5 `@State` properties; behavior is unchanged
Expand Down
14 changes: 9 additions & 5 deletions TableProMobile/TableProMobile/AppState.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// AppState.swift
// TableProMobile
//

import CoreSpotlight
import Foundation
import Observation
Expand Down Expand Up @@ -114,13 +109,22 @@ final class AppState {
try? secureStore.delete(forKey: "com.TablePro.sshpassword.\(connection.id.uuidString)")
try? secureStore.delete(forKey: "com.TablePro.keypassphrase.\(connection.id.uuidString)")
try? secureStore.delete(forKey: "com.TablePro.sshkeydata.\(connection.id.uuidString)")
clearPerConnectionPreferences(for: connection.id)
storage.save(connections)
updateWidgetData()
updateSpotlightIndex()
syncCoordinator.markDeleted(connection.id)
syncCoordinator.scheduleSyncAfterChange()
}

private func clearPerConnectionPreferences(for id: UUID) {
let suffix = id.uuidString
let defaults = UserDefaults.standard
for prefix in ["lastTab.", "lastDB.", "lastSchema.", "lastQuery."] {
defaults.removeObject(forKey: prefix + suffix)
}
}

// MARK: - Groups

func addGroup(_ group: ConnectionGroup) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// ConnectionCoordinator.swift
// TableProMobile
//

import Foundation
import Observation
import os
Expand Down
7 changes: 0 additions & 7 deletions TableProMobile/TableProMobile/Drivers/MySQLDriver.swift
Original file line number Diff line number Diff line change
@@ -1,10 +1,3 @@
//
// MySQLDriver.swift
// TableProMobile
//
// MySQL driver conforming to DatabaseDriver directly (no plugin layer).
//

import CMariaDB
import Foundation
import TableProDatabase
Expand Down
7 changes: 0 additions & 7 deletions TableProMobile/TableProMobile/Drivers/PostgreSQLDriver.swift
Original file line number Diff line number Diff line change
@@ -1,10 +1,3 @@
//
// PostgreSQLDriver.swift
// TableProMobile
//
// PostgreSQL driver conforming to DatabaseDriver directly (no plugin layer).
//

import CLibPQ
import Foundation
import TableProDatabase
Expand Down
8 changes: 0 additions & 8 deletions TableProMobile/TableProMobile/Drivers/RedisDriver.swift
Original file line number Diff line number Diff line change
@@ -1,11 +1,3 @@
//
// RedisDriver.swift
// TableProMobile
//
// Redis driver conforming to DatabaseDriver directly (no plugin layer).
// Maps Redis key-value concepts to the relational DatabaseDriver protocol.
//

import CRedis
import Foundation
import os
Expand Down
7 changes: 0 additions & 7 deletions TableProMobile/TableProMobile/Drivers/SQLiteDriver.swift
Original file line number Diff line number Diff line change
@@ -1,10 +1,3 @@
//
// SQLiteDriver.swift
// TableProMobile
//
// SQLite driver conforming to DatabaseDriver directly (no plugin layer).
//

import Foundation
import SQLite3
import TableProDatabase
Expand Down
5 changes: 0 additions & 5 deletions TableProMobile/TableProMobile/Helpers/AppError.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// AppError.swift
// TableProMobile
//

import Foundation
import os
import TableProModels
Expand Down
5 changes: 0 additions & 5 deletions TableProMobile/TableProMobile/Helpers/ClipboardExporter.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// ClipboardExporter.swift
// TableProMobile
//

import Foundation
import TableProModels
import UIKit
Expand Down
5 changes: 0 additions & 5 deletions TableProMobile/TableProMobile/Helpers/GroupPersistence.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// GroupPersistence.swift
// TableProMobile
//

import Foundation
import TableProModels

Expand Down
5 changes: 0 additions & 5 deletions TableProMobile/TableProMobile/Helpers/IndexedRow.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// IndexedRow.swift
// TableProMobile
//

import Foundation

/// Identifiable wrapper used by iOS lists that need both the row payload and
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// QueryHistoryStorage.swift
// TableProMobile
//

import Foundation

struct QueryHistoryItem: Identifiable, Codable, Hashable {
Expand Down
5 changes: 0 additions & 5 deletions TableProMobile/TableProMobile/Helpers/SQLBuilder.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// SQLBuilder.swift
// TableProMobile
//

import Foundation
import TableProModels
import TableProPluginKit
Expand Down
5 changes: 0 additions & 5 deletions TableProMobile/TableProMobile/Helpers/StreamingExporter.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// StreamingExporter.swift
// TableProMobile
//

import Foundation
import os
import TableProDatabase
Expand Down
5 changes: 0 additions & 5 deletions TableProMobile/TableProMobile/Helpers/String+SHA256.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// String+SHA256.swift
// TableProMobile
//

import CryptoKit
import Foundation

Expand Down
5 changes: 0 additions & 5 deletions TableProMobile/TableProMobile/Helpers/TagPersistence.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// TagPersistence.swift
// TableProMobile
//

import Foundation
import TableProModels

Expand Down
5 changes: 0 additions & 5 deletions TableProMobile/TableProMobile/Intents/ConnectionEntity.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// ConnectionEntity.swift
// TableProMobile
//

import AppIntents
import Foundation

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// ConnectionEntityQuery.swift
// TableProMobile
//

import AppIntents
import Foundation

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// OpenConnectionIntent.swift
// TableProMobile
//

import AppIntents
import Foundation
import UIKit
Expand Down
5 changes: 0 additions & 5 deletions TableProMobile/TableProMobile/Intents/TableProShortcuts.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// TableProShortcuts.swift
// TableProMobile
//

import AppIntents

struct TableProShortcuts: AppShortcutsProvider {
Expand Down
18 changes: 15 additions & 3 deletions TableProMobile/TableProMobile/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@
}
}
},
"%@ -> %@" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : "%1$@ -> %2$@"
}
}
}
},
"%@ · %@" : {
"localizations" : {
"en" : {
Expand All @@ -43,6 +53,7 @@
}
},
"%@ → %@" : {
"extractionState" : "stale",
"localizations" : {
"en" : {
"stringUnit" : {
Expand Down Expand Up @@ -489,7 +500,6 @@
}
},
"Cannot Save" : {
"extractionState" : "stale",
"localizations" : {
"vi" : {
"stringUnit" : {
Expand Down Expand Up @@ -1470,8 +1480,12 @@
}
}
}
},
"Enter a page number (1-%lld)" : {

},
"Enter a page number (1–%lld)" : {
"extractionState" : "stale",
"localizations" : {
"vi" : {
"stringUnit" : {
Expand Down Expand Up @@ -2354,7 +2368,6 @@
}
},
"No primary key values found." : {
"extractionState" : "stale",
"localizations" : {
"vi" : {
"stringUnit" : {
Expand Down Expand Up @@ -3913,7 +3926,6 @@
}
},
"This table needs a primary key to identify the row." : {
"extractionState" : "stale",
"localizations" : {
"vi" : {
"stringUnit" : {
Expand Down
5 changes: 0 additions & 5 deletions TableProMobile/TableProMobile/Models/ConnectedTab.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// ConnectedTab.swift
// TableProMobile
//

enum ConnectedTab: String, CaseIterable, Sendable {
case tables
case query
Expand Down
5 changes: 0 additions & 5 deletions TableProMobile/TableProMobile/Models/RowWindow.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// RowWindow.swift
// TableProMobile
//

import Foundation
import TableProModels

Expand Down
5 changes: 0 additions & 5 deletions TableProMobile/TableProMobile/Platform/AppLockState.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// AppLockState.swift
// TableProMobile
//

import Foundation
import Observation
import os
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// BiometricAuthService.swift
// TableProMobile
//

import Foundation
import LocalAuthentication
import os
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// IOSAnalyticsProvider.swift
// TableProMobile
//

import Foundation
import os
import TableProAnalytics
Expand Down
5 changes: 0 additions & 5 deletions TableProMobile/TableProMobile/Platform/IOSDriverFactory.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// IOSDriverFactory.swift
// TableProMobile
//

import Foundation
import TableProDatabase
import TableProModels
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// KeychainSecureStore.swift
// TableProMobile
//

import Foundation
import Security
import TableProDatabase
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// LocalNetworkPermission.swift
// TableProMobile
//

import Foundation
import Network
import os
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// MemoryPressureMonitor.swift
// TableProMobile
//

import Foundation
import os

Expand Down
5 changes: 0 additions & 5 deletions TableProMobile/TableProMobile/SSH/IOSSSHProvider.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// IOSSSHProvider.swift
// TableProMobile
//

import Foundation
import TableProDatabase
import TableProModels
Expand Down
7 changes: 0 additions & 7 deletions TableProMobile/TableProMobile/SSH/SSHTunnel.swift
Original file line number Diff line number Diff line change
@@ -1,10 +1,3 @@
//
// SSHTunnel.swift
// TableProMobile
//
// Actor-based SSH tunnel using libssh2 C API via CLibSSH2 bridge.
//

import Foundation
import CLibSSH2
import os
Expand Down
5 changes: 0 additions & 5 deletions TableProMobile/TableProMobile/SSH/SSHTunnelError.swift
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
//
// SSHTunnelError.swift
// TableProMobile
//

import Foundation

enum SSHTunnelError: Error, LocalizedError {
Expand Down
7 changes: 0 additions & 7 deletions TableProMobile/TableProMobile/SSH/SSHTunnelFactory.swift
Original file line number Diff line number Diff line change
@@ -1,10 +1,3 @@
//
// SSHTunnelFactory.swift
// TableProMobile
//
// Stateless factory that creates fully-connected, authenticated SSH tunnels.
//

import CLibSSH2
import Foundation
import TableProModels
Expand Down
Loading
Loading