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

### Added

- iOS: Face ID, Touch ID, or Optic ID lock with cold-launch protection and idle timeout (1, 5, 15, or 60 minutes), opt-in from Settings
- iOS: Connection Info tab replaces the per-connection Settings tab, showing host, SSL, SSH tunnel, active database, and live connection status
- MCP Setup sheet adds Zed alongside Claude Desktop, Claude Code, and Cursor with a one-paste `context_servers` snippet

### Changed

- iOS: metadata badges (column types, primary key markers, row counts) cap at the first accessibility size so they stay readable without breaking layouts at the largest Dynamic Type sizes
- iOS: SQL editor keyboard accessory uses the system keyboard input view, dropping the deprecated screen-width measurement
- iOS: Edit Connection moves to the navigation bar trailing pencil icon so the floating tab bar never covers it
- PostgreSQL SQL export emits foreign key constraints via `ALTER TABLE ... ADD CONSTRAINT` after data load and resyncs sequences via `setval` so a re-imported dump round-trips cleanly even when child tables sort before parents (#1114)
- SQL import parser uses bounded streaming and run-length string append, reducing memory and CPU on large files (#1114)
- AI inline suggestions: debounce now uses structured Swift concurrency, and the delay is configurable via the `inlineSuggestionDebounceMs` setting (default 500ms)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ final class ConnectionCoordinator {
}
var pendingQuery: String?
var navigationPath = NavigationPath()
var showingEditSheet = false

private(set) var queryHistory: [QueryHistoryItem] = []
private let historyStorage = QueryHistoryStorage()
Expand Down
2 changes: 2 additions & 0 deletions TableProMobile/TableProMobile/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
<dict>
<key>AnalyticsHMACSecret</key>
<string>$(ANALYTICS_HMAC_SECRET)</string>
<key>NSFaceIDUsageDescription</key>
<string>TablePro uses Face ID to protect your saved database connections and credentials.</string>
<key>NSLocalNetworkUsageDescription</key>
<string>TablePro connects to database servers and SSH tunnels running on your local network, including Bonjour (.local) hostnames.</string>
<key>NSBonjourServices</key>
Expand Down
120 changes: 120 additions & 0 deletions TableProMobile/TableProMobile/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,9 @@
}
}
}
},
"Active DB" : {

},
"Add a database connection to get started." : {
"localizations" : {
Expand Down Expand Up @@ -238,6 +241,18 @@
}
}
}
},
"After 1 hour" : {

},
"After 1 minute" : {

},
"After 5 minutes" : {

},
"After 15 minutes" : {

},
"All" : {
"localizations" : {
Expand Down Expand Up @@ -383,6 +398,9 @@
}
}
}
},
"Auth" : {

},
"Auth Method" : {
"localizations" : {
Expand All @@ -399,6 +417,9 @@
}
}
}
},
"Authenticate to access your database connections." : {

},
"Authentication Failed" : {
"localizations" : {
Expand Down Expand Up @@ -431,6 +452,9 @@
}
}
}
},
"Auto-Lock" : {

},
"Build" : {
"localizations" : {
Expand Down Expand Up @@ -769,6 +793,9 @@
}
}
}
},
"Connected" : {

},
"Connecting to %@..." : {
"localizations" : {
Expand All @@ -785,6 +812,9 @@
}
}
}
},
"Connecting…" : {

},
"Connection" : {
"localizations" : {
Expand Down Expand Up @@ -1153,6 +1183,9 @@
}
}
}
},
"Databases" : {

},
"Default" : {
"localizations" : {
Expand All @@ -1169,6 +1202,9 @@
}
}
}
},
"Default DB" : {

},
"Default: %@" : {
"localizations" : {
Expand Down Expand Up @@ -1265,6 +1301,9 @@
}
}
}
},
"Disconnected" : {

},
"Done" : {
"localizations" : {
Expand Down Expand Up @@ -1393,6 +1432,9 @@
}
}
}
},
"Enabled" : {

},
"Enter a name for the new SQLite database." : {
"localizations" : {
Expand Down Expand Up @@ -1619,6 +1661,9 @@
}
}
}
},
"File" : {

},
"Filter" : {
"localizations" : {
Expand Down Expand Up @@ -1860,6 +1905,9 @@
}
}
}
},
"Immediately" : {

},
"Import connections from your Mac" : {
"localizations" : {
Expand Down Expand Up @@ -1893,6 +1941,9 @@
}
}
}
},
"Info" : {

},
"Input Method" : {
"localizations" : {
Expand Down Expand Up @@ -1941,6 +1992,12 @@
}
}
}
},
"Load Failed" : {

},
"Load full value" : {

},
"Load More" : {
"extractionState" : "stale",
Expand Down Expand Up @@ -2011,9 +2068,15 @@
},
"Local Network access is required. Open Settings > Privacy & Security > Local Network and turn TablePro on." : {

},
"Local Network access may be blocked. Open Settings > Privacy & Security > Local Network and turn TablePro on." : {

},
"Local Network Access Required" : {

},
"Locks TablePro when reopened after the selected idle time. Cold launches always require authentication." : {

},
"Logic" : {
"localizations" : {
Expand Down Expand Up @@ -2447,6 +2510,9 @@
}
}
}
},
"Off" : {

},
"OK" : {
"localizations" : {
Expand Down Expand Up @@ -2674,6 +2740,9 @@
}
}
}
},
"Path" : {

},
"Port" : {
"localizations" : {
Expand All @@ -2692,6 +2761,7 @@
}
},
"Primary" : {
"extractionState" : "stale",
"localizations" : {
"vi" : {
"stringUnit" : {
Expand Down Expand Up @@ -2883,6 +2953,15 @@
}
}
}
},
"Require Face ID" : {

},
"Require Optic ID" : {

},
"Require Touch ID" : {

},
"Results Cleared" : {
"localizations" : {
Expand All @@ -2901,6 +2980,7 @@
}
},
"Results cleared due to memory pressure." : {
"extractionState" : "stale",
"localizations" : {
"vi" : {
"stringUnit" : {
Expand All @@ -2915,6 +2995,9 @@
}
}
}
},
"Results trimmed due to memory pressure." : {

},
"Retry" : {
"localizations" : {
Expand Down Expand Up @@ -3030,6 +3113,12 @@
}
}
}
},
"Schema" : {

},
"Schemas" : {

},
"Search all columns" : {
"localizations" : {
Expand Down Expand Up @@ -3094,6 +3183,9 @@
}
}
}
},
"Security" : {

},
"SELECT * FROM ..." : {
"localizations" : {
Expand Down Expand Up @@ -3447,6 +3539,12 @@
}
}
}
},
"Stats" : {

},
"Status" : {

},
"Stop" : {

Expand Down Expand Up @@ -3532,6 +3630,9 @@
}
}
}
},
"TablePro is Locked" : {

},
"Tables" : {
"localizations" : {
Expand Down Expand Up @@ -3853,6 +3954,15 @@
}
}
}
},
"Try Again" : {

},
"Try again or check your connection." : {

},
"Type" : {

},
"Ungrouped" : {
"localizations" : {
Expand All @@ -3871,6 +3981,7 @@
}
},
"Unique" : {
"extractionState" : "stale",
"localizations" : {
"vi" : {
"stringUnit" : {
Expand All @@ -3885,6 +3996,15 @@
}
}
}
},
"Unlock" : {

},
"Unlock TablePro to access your database connections." : {

},
"Use Passcode" : {

},
"Username" : {
"localizations" : {
Expand Down
2 changes: 1 addition & 1 deletion TableProMobile/TableProMobile/Models/ConnectedTab.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ enum ConnectedTab: String, CaseIterable, Sendable {
case tables
case query
case history
case settings
case info
}
Loading
Loading