diff --git a/CHANGELOG.md b/CHANGELOG.md index 90c2d1472..b2481a549 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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.`, `lastDB.`, `lastSchema.`, `lastQuery.`) 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` 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 diff --git a/TableProMobile/TableProMobile/AppState.swift b/TableProMobile/TableProMobile/AppState.swift index 62fe70579..c99921252 100644 --- a/TableProMobile/TableProMobile/AppState.swift +++ b/TableProMobile/TableProMobile/AppState.swift @@ -1,8 +1,3 @@ -// -// AppState.swift -// TableProMobile -// - import CoreSpotlight import Foundation import Observation @@ -114,6 +109,7 @@ 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() @@ -121,6 +117,14 @@ final class AppState { 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) { diff --git a/TableProMobile/TableProMobile/Coordinators/ConnectionCoordinator.swift b/TableProMobile/TableProMobile/Coordinators/ConnectionCoordinator.swift index 22d91dc74..0768120bd 100644 --- a/TableProMobile/TableProMobile/Coordinators/ConnectionCoordinator.swift +++ b/TableProMobile/TableProMobile/Coordinators/ConnectionCoordinator.swift @@ -1,8 +1,3 @@ -// -// ConnectionCoordinator.swift -// TableProMobile -// - import Foundation import Observation import os diff --git a/TableProMobile/TableProMobile/Drivers/MySQLDriver.swift b/TableProMobile/TableProMobile/Drivers/MySQLDriver.swift index ceba4e4d6..44db37057 100644 --- a/TableProMobile/TableProMobile/Drivers/MySQLDriver.swift +++ b/TableProMobile/TableProMobile/Drivers/MySQLDriver.swift @@ -1,10 +1,3 @@ -// -// MySQLDriver.swift -// TableProMobile -// -// MySQL driver conforming to DatabaseDriver directly (no plugin layer). -// - import CMariaDB import Foundation import TableProDatabase diff --git a/TableProMobile/TableProMobile/Drivers/PostgreSQLDriver.swift b/TableProMobile/TableProMobile/Drivers/PostgreSQLDriver.swift index 5583302fb..df1b40479 100644 --- a/TableProMobile/TableProMobile/Drivers/PostgreSQLDriver.swift +++ b/TableProMobile/TableProMobile/Drivers/PostgreSQLDriver.swift @@ -1,10 +1,3 @@ -// -// PostgreSQLDriver.swift -// TableProMobile -// -// PostgreSQL driver conforming to DatabaseDriver directly (no plugin layer). -// - import CLibPQ import Foundation import TableProDatabase diff --git a/TableProMobile/TableProMobile/Drivers/RedisDriver.swift b/TableProMobile/TableProMobile/Drivers/RedisDriver.swift index c8cd43765..b98e70b1c 100644 --- a/TableProMobile/TableProMobile/Drivers/RedisDriver.swift +++ b/TableProMobile/TableProMobile/Drivers/RedisDriver.swift @@ -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 diff --git a/TableProMobile/TableProMobile/Drivers/SQLiteDriver.swift b/TableProMobile/TableProMobile/Drivers/SQLiteDriver.swift index e0851a938..a261b1f3e 100644 --- a/TableProMobile/TableProMobile/Drivers/SQLiteDriver.swift +++ b/TableProMobile/TableProMobile/Drivers/SQLiteDriver.swift @@ -1,10 +1,3 @@ -// -// SQLiteDriver.swift -// TableProMobile -// -// SQLite driver conforming to DatabaseDriver directly (no plugin layer). -// - import Foundation import SQLite3 import TableProDatabase diff --git a/TableProMobile/TableProMobile/Helpers/AppError.swift b/TableProMobile/TableProMobile/Helpers/AppError.swift index c98b9eca4..21bf9bc59 100644 --- a/TableProMobile/TableProMobile/Helpers/AppError.swift +++ b/TableProMobile/TableProMobile/Helpers/AppError.swift @@ -1,8 +1,3 @@ -// -// AppError.swift -// TableProMobile -// - import Foundation import os import TableProModels diff --git a/TableProMobile/TableProMobile/Helpers/ClipboardExporter.swift b/TableProMobile/TableProMobile/Helpers/ClipboardExporter.swift index 650001134..f6e3d230e 100644 --- a/TableProMobile/TableProMobile/Helpers/ClipboardExporter.swift +++ b/TableProMobile/TableProMobile/Helpers/ClipboardExporter.swift @@ -1,8 +1,3 @@ -// -// ClipboardExporter.swift -// TableProMobile -// - import Foundation import TableProModels import UIKit diff --git a/TableProMobile/TableProMobile/Helpers/GroupPersistence.swift b/TableProMobile/TableProMobile/Helpers/GroupPersistence.swift index 7b7f82146..883e264cf 100644 --- a/TableProMobile/TableProMobile/Helpers/GroupPersistence.swift +++ b/TableProMobile/TableProMobile/Helpers/GroupPersistence.swift @@ -1,8 +1,3 @@ -// -// GroupPersistence.swift -// TableProMobile -// - import Foundation import TableProModels diff --git a/TableProMobile/TableProMobile/Helpers/IndexedRow.swift b/TableProMobile/TableProMobile/Helpers/IndexedRow.swift index 81780e7cc..4f4079153 100644 --- a/TableProMobile/TableProMobile/Helpers/IndexedRow.swift +++ b/TableProMobile/TableProMobile/Helpers/IndexedRow.swift @@ -1,8 +1,3 @@ -// -// IndexedRow.swift -// TableProMobile -// - import Foundation /// Identifiable wrapper used by iOS lists that need both the row payload and diff --git a/TableProMobile/TableProMobile/Helpers/QueryHistoryStorage.swift b/TableProMobile/TableProMobile/Helpers/QueryHistoryStorage.swift index f7b8fc618..a7c67e963 100644 --- a/TableProMobile/TableProMobile/Helpers/QueryHistoryStorage.swift +++ b/TableProMobile/TableProMobile/Helpers/QueryHistoryStorage.swift @@ -1,8 +1,3 @@ -// -// QueryHistoryStorage.swift -// TableProMobile -// - import Foundation struct QueryHistoryItem: Identifiable, Codable, Hashable { diff --git a/TableProMobile/TableProMobile/Helpers/SQLBuilder.swift b/TableProMobile/TableProMobile/Helpers/SQLBuilder.swift index 2c1c27eb1..ffd5e551f 100644 --- a/TableProMobile/TableProMobile/Helpers/SQLBuilder.swift +++ b/TableProMobile/TableProMobile/Helpers/SQLBuilder.swift @@ -1,8 +1,3 @@ -// -// SQLBuilder.swift -// TableProMobile -// - import Foundation import TableProModels import TableProPluginKit diff --git a/TableProMobile/TableProMobile/Helpers/StreamingExporter.swift b/TableProMobile/TableProMobile/Helpers/StreamingExporter.swift index d4b355d47..063c774a6 100644 --- a/TableProMobile/TableProMobile/Helpers/StreamingExporter.swift +++ b/TableProMobile/TableProMobile/Helpers/StreamingExporter.swift @@ -1,8 +1,3 @@ -// -// StreamingExporter.swift -// TableProMobile -// - import Foundation import os import TableProDatabase diff --git a/TableProMobile/TableProMobile/Helpers/String+SHA256.swift b/TableProMobile/TableProMobile/Helpers/String+SHA256.swift index 462dd517b..206d90933 100644 --- a/TableProMobile/TableProMobile/Helpers/String+SHA256.swift +++ b/TableProMobile/TableProMobile/Helpers/String+SHA256.swift @@ -1,8 +1,3 @@ -// -// String+SHA256.swift -// TableProMobile -// - import CryptoKit import Foundation diff --git a/TableProMobile/TableProMobile/Helpers/TagPersistence.swift b/TableProMobile/TableProMobile/Helpers/TagPersistence.swift index 0fb2d37aa..0214a76f7 100644 --- a/TableProMobile/TableProMobile/Helpers/TagPersistence.swift +++ b/TableProMobile/TableProMobile/Helpers/TagPersistence.swift @@ -1,8 +1,3 @@ -// -// TagPersistence.swift -// TableProMobile -// - import Foundation import TableProModels diff --git a/TableProMobile/TableProMobile/Intents/ConnectionEntity.swift b/TableProMobile/TableProMobile/Intents/ConnectionEntity.swift index 814f596f0..e14d43c84 100644 --- a/TableProMobile/TableProMobile/Intents/ConnectionEntity.swift +++ b/TableProMobile/TableProMobile/Intents/ConnectionEntity.swift @@ -1,8 +1,3 @@ -// -// ConnectionEntity.swift -// TableProMobile -// - import AppIntents import Foundation diff --git a/TableProMobile/TableProMobile/Intents/ConnectionEntityQuery.swift b/TableProMobile/TableProMobile/Intents/ConnectionEntityQuery.swift index f6f0b5b57..d40284b49 100644 --- a/TableProMobile/TableProMobile/Intents/ConnectionEntityQuery.swift +++ b/TableProMobile/TableProMobile/Intents/ConnectionEntityQuery.swift @@ -1,8 +1,3 @@ -// -// ConnectionEntityQuery.swift -// TableProMobile -// - import AppIntents import Foundation diff --git a/TableProMobile/TableProMobile/Intents/OpenConnectionIntent.swift b/TableProMobile/TableProMobile/Intents/OpenConnectionIntent.swift index c47ea098c..d07172e5d 100644 --- a/TableProMobile/TableProMobile/Intents/OpenConnectionIntent.swift +++ b/TableProMobile/TableProMobile/Intents/OpenConnectionIntent.swift @@ -1,8 +1,3 @@ -// -// OpenConnectionIntent.swift -// TableProMobile -// - import AppIntents import Foundation import UIKit diff --git a/TableProMobile/TableProMobile/Intents/TableProShortcuts.swift b/TableProMobile/TableProMobile/Intents/TableProShortcuts.swift index 6bdf7b127..6873cef97 100644 --- a/TableProMobile/TableProMobile/Intents/TableProShortcuts.swift +++ b/TableProMobile/TableProMobile/Intents/TableProShortcuts.swift @@ -1,8 +1,3 @@ -// -// TableProShortcuts.swift -// TableProMobile -// - import AppIntents struct TableProShortcuts: AppShortcutsProvider { diff --git a/TableProMobile/TableProMobile/Localizable.xcstrings b/TableProMobile/TableProMobile/Localizable.xcstrings index 7f91ebb5c..0cb5db94d 100644 --- a/TableProMobile/TableProMobile/Localizable.xcstrings +++ b/TableProMobile/TableProMobile/Localizable.xcstrings @@ -20,6 +20,16 @@ } } }, + "%@ -> %@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@ -> %2$@" + } + } + } + }, "%@ · %@" : { "localizations" : { "en" : { @@ -43,6 +53,7 @@ } }, "%@ → %@" : { + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -489,7 +500,6 @@ } }, "Cannot Save" : { - "extractionState" : "stale", "localizations" : { "vi" : { "stringUnit" : { @@ -1470,8 +1480,12 @@ } } } + }, + "Enter a page number (1-%lld)" : { + }, "Enter a page number (1–%lld)" : { + "extractionState" : "stale", "localizations" : { "vi" : { "stringUnit" : { @@ -2354,7 +2368,6 @@ } }, "No primary key values found." : { - "extractionState" : "stale", "localizations" : { "vi" : { "stringUnit" : { @@ -3913,7 +3926,6 @@ } }, "This table needs a primary key to identify the row." : { - "extractionState" : "stale", "localizations" : { "vi" : { "stringUnit" : { diff --git a/TableProMobile/TableProMobile/Models/ConnectedTab.swift b/TableProMobile/TableProMobile/Models/ConnectedTab.swift index 839a0ee47..a684c2db5 100644 --- a/TableProMobile/TableProMobile/Models/ConnectedTab.swift +++ b/TableProMobile/TableProMobile/Models/ConnectedTab.swift @@ -1,8 +1,3 @@ -// -// ConnectedTab.swift -// TableProMobile -// - enum ConnectedTab: String, CaseIterable, Sendable { case tables case query diff --git a/TableProMobile/TableProMobile/Models/RowWindow.swift b/TableProMobile/TableProMobile/Models/RowWindow.swift index 8ca04e803..d9301b0d2 100644 --- a/TableProMobile/TableProMobile/Models/RowWindow.swift +++ b/TableProMobile/TableProMobile/Models/RowWindow.swift @@ -1,8 +1,3 @@ -// -// RowWindow.swift -// TableProMobile -// - import Foundation import TableProModels diff --git a/TableProMobile/TableProMobile/Platform/AppLockState.swift b/TableProMobile/TableProMobile/Platform/AppLockState.swift index 2a7932871..30e129745 100644 --- a/TableProMobile/TableProMobile/Platform/AppLockState.swift +++ b/TableProMobile/TableProMobile/Platform/AppLockState.swift @@ -1,8 +1,3 @@ -// -// AppLockState.swift -// TableProMobile -// - import Foundation import Observation import os diff --git a/TableProMobile/TableProMobile/Platform/BiometricAuthService.swift b/TableProMobile/TableProMobile/Platform/BiometricAuthService.swift index 082e17ae9..710be8eb0 100644 --- a/TableProMobile/TableProMobile/Platform/BiometricAuthService.swift +++ b/TableProMobile/TableProMobile/Platform/BiometricAuthService.swift @@ -1,8 +1,3 @@ -// -// BiometricAuthService.swift -// TableProMobile -// - import Foundation import LocalAuthentication import os diff --git a/TableProMobile/TableProMobile/Platform/IOSAnalyticsProvider.swift b/TableProMobile/TableProMobile/Platform/IOSAnalyticsProvider.swift index 19560a410..3cdf315f5 100644 --- a/TableProMobile/TableProMobile/Platform/IOSAnalyticsProvider.swift +++ b/TableProMobile/TableProMobile/Platform/IOSAnalyticsProvider.swift @@ -1,8 +1,3 @@ -// -// IOSAnalyticsProvider.swift -// TableProMobile -// - import Foundation import os import TableProAnalytics diff --git a/TableProMobile/TableProMobile/Platform/IOSDriverFactory.swift b/TableProMobile/TableProMobile/Platform/IOSDriverFactory.swift index e94be15ac..c32363a0f 100644 --- a/TableProMobile/TableProMobile/Platform/IOSDriverFactory.swift +++ b/TableProMobile/TableProMobile/Platform/IOSDriverFactory.swift @@ -1,8 +1,3 @@ -// -// IOSDriverFactory.swift -// TableProMobile -// - import Foundation import TableProDatabase import TableProModels diff --git a/TableProMobile/TableProMobile/Platform/KeychainSecureStore.swift b/TableProMobile/TableProMobile/Platform/KeychainSecureStore.swift index a56c9d450..2d0fb167e 100644 --- a/TableProMobile/TableProMobile/Platform/KeychainSecureStore.swift +++ b/TableProMobile/TableProMobile/Platform/KeychainSecureStore.swift @@ -1,8 +1,3 @@ -// -// KeychainSecureStore.swift -// TableProMobile -// - import Foundation import Security import TableProDatabase diff --git a/TableProMobile/TableProMobile/Platform/LocalNetworkPermission.swift b/TableProMobile/TableProMobile/Platform/LocalNetworkPermission.swift index d8324d0f0..0bc605fa0 100644 --- a/TableProMobile/TableProMobile/Platform/LocalNetworkPermission.swift +++ b/TableProMobile/TableProMobile/Platform/LocalNetworkPermission.swift @@ -1,8 +1,3 @@ -// -// LocalNetworkPermission.swift -// TableProMobile -// - import Foundation import Network import os diff --git a/TableProMobile/TableProMobile/Platform/MemoryPressureMonitor.swift b/TableProMobile/TableProMobile/Platform/MemoryPressureMonitor.swift index d81b052ba..05d856103 100644 --- a/TableProMobile/TableProMobile/Platform/MemoryPressureMonitor.swift +++ b/TableProMobile/TableProMobile/Platform/MemoryPressureMonitor.swift @@ -1,8 +1,3 @@ -// -// MemoryPressureMonitor.swift -// TableProMobile -// - import Foundation import os diff --git a/TableProMobile/TableProMobile/SSH/IOSSSHProvider.swift b/TableProMobile/TableProMobile/SSH/IOSSSHProvider.swift index 901d9139b..3d2f6b2ca 100644 --- a/TableProMobile/TableProMobile/SSH/IOSSSHProvider.swift +++ b/TableProMobile/TableProMobile/SSH/IOSSSHProvider.swift @@ -1,8 +1,3 @@ -// -// IOSSSHProvider.swift -// TableProMobile -// - import Foundation import TableProDatabase import TableProModels diff --git a/TableProMobile/TableProMobile/SSH/SSHTunnel.swift b/TableProMobile/TableProMobile/SSH/SSHTunnel.swift index a57af6d20..6f9a3d303 100644 --- a/TableProMobile/TableProMobile/SSH/SSHTunnel.swift +++ b/TableProMobile/TableProMobile/SSH/SSHTunnel.swift @@ -1,10 +1,3 @@ -// -// SSHTunnel.swift -// TableProMobile -// -// Actor-based SSH tunnel using libssh2 C API via CLibSSH2 bridge. -// - import Foundation import CLibSSH2 import os diff --git a/TableProMobile/TableProMobile/SSH/SSHTunnelError.swift b/TableProMobile/TableProMobile/SSH/SSHTunnelError.swift index 4bd835c46..ceed8d591 100644 --- a/TableProMobile/TableProMobile/SSH/SSHTunnelError.swift +++ b/TableProMobile/TableProMobile/SSH/SSHTunnelError.swift @@ -1,8 +1,3 @@ -// -// SSHTunnelError.swift -// TableProMobile -// - import Foundation enum SSHTunnelError: Error, LocalizedError { diff --git a/TableProMobile/TableProMobile/SSH/SSHTunnelFactory.swift b/TableProMobile/TableProMobile/SSH/SSHTunnelFactory.swift index bf8e6056f..9aa5055a9 100644 --- a/TableProMobile/TableProMobile/SSH/SSHTunnelFactory.swift +++ b/TableProMobile/TableProMobile/SSH/SSHTunnelFactory.swift @@ -1,10 +1,3 @@ -// -// SSHTunnelFactory.swift -// TableProMobile -// -// Stateless factory that creates fully-connected, authenticated SSH tunnels. -// - import CLibSSH2 import Foundation import TableProModels diff --git a/TableProMobile/TableProMobile/Sync/IOSSyncCoordinator.swift b/TableProMobile/TableProMobile/Sync/IOSSyncCoordinator.swift index d95b59349..ab0920db6 100644 --- a/TableProMobile/TableProMobile/Sync/IOSSyncCoordinator.swift +++ b/TableProMobile/TableProMobile/Sync/IOSSyncCoordinator.swift @@ -1,8 +1,3 @@ -// -// IOSSyncCoordinator.swift -// TableProMobile -// - import CloudKit import Foundation import Observation diff --git a/TableProMobile/TableProMobile/TableProMobileApp.swift b/TableProMobile/TableProMobile/TableProMobileApp.swift index 7d90b3cef..5da9e4b2f 100644 --- a/TableProMobile/TableProMobile/TableProMobileApp.swift +++ b/TableProMobile/TableProMobile/TableProMobileApp.swift @@ -1,8 +1,3 @@ -// -// TableProMobileApp.swift -// TableProMobile -// - import CoreSpotlight import SwiftUI import TableProAnalytics diff --git a/TableProMobile/TableProMobile/ViewModels/ConnectionFormViewModel.swift b/TableProMobile/TableProMobile/ViewModels/ConnectionFormViewModel.swift index faa6cd515..88862079e 100644 --- a/TableProMobile/TableProMobile/ViewModels/ConnectionFormViewModel.swift +++ b/TableProMobile/TableProMobile/ViewModels/ConnectionFormViewModel.swift @@ -1,8 +1,3 @@ -// -// ConnectionFormViewModel.swift -// TableProMobile -// - import Foundation import os import TableProDatabase diff --git a/TableProMobile/TableProMobile/ViewModels/DataBrowserViewModel.swift b/TableProMobile/TableProMobile/ViewModels/DataBrowserViewModel.swift index a5045561a..981c1d814 100644 --- a/TableProMobile/TableProMobile/ViewModels/DataBrowserViewModel.swift +++ b/TableProMobile/TableProMobile/ViewModels/DataBrowserViewModel.swift @@ -1,8 +1,3 @@ -// -// DataBrowserViewModel.swift -// TableProMobile -// - import Foundation import os import TableProDatabase diff --git a/TableProMobile/TableProMobile/ViewModels/QueryEditorViewModel.swift b/TableProMobile/TableProMobile/ViewModels/QueryEditorViewModel.swift index 923d30bef..1d5936b0f 100644 --- a/TableProMobile/TableProMobile/ViewModels/QueryEditorViewModel.swift +++ b/TableProMobile/TableProMobile/ViewModels/QueryEditorViewModel.swift @@ -1,8 +1,3 @@ -// -// QueryEditorViewModel.swift -// TableProMobile -// - import Foundation import os import TableProDatabase diff --git a/TableProMobile/TableProMobile/ViewModels/RowDetailViewModel.swift b/TableProMobile/TableProMobile/ViewModels/RowDetailViewModel.swift index 7531546b2..3dfe1a2ed 100644 --- a/TableProMobile/TableProMobile/ViewModels/RowDetailViewModel.swift +++ b/TableProMobile/TableProMobile/ViewModels/RowDetailViewModel.swift @@ -1,8 +1,3 @@ -// -// RowDetailViewModel.swift -// TableProMobile -// - import Foundation import os import TableProDatabase diff --git a/TableProMobile/TableProMobile/Views/Components/ActivityViewController.swift b/TableProMobile/TableProMobile/Views/Components/ActivityViewController.swift index 5032af964..8b892487f 100644 --- a/TableProMobile/TableProMobile/Views/Components/ActivityViewController.swift +++ b/TableProMobile/TableProMobile/Views/Components/ActivityViewController.swift @@ -1,8 +1,3 @@ -// -// ActivityViewController.swift -// TableProMobile -// - import SwiftUI import UIKit diff --git a/TableProMobile/TableProMobile/Views/Components/ConnectionColorPicker.swift b/TableProMobile/TableProMobile/Views/Components/ConnectionColorPicker.swift index 5ec99ed84..dbff79cca 100644 --- a/TableProMobile/TableProMobile/Views/Components/ConnectionColorPicker.swift +++ b/TableProMobile/TableProMobile/Views/Components/ConnectionColorPicker.swift @@ -1,8 +1,3 @@ -// -// ConnectionColorPicker.swift -// TableProMobile -// - import SwiftUI import TableProModels diff --git a/TableProMobile/TableProMobile/Views/Components/DatabaseIconView.swift b/TableProMobile/TableProMobile/Views/Components/DatabaseIconView.swift index 554f69ae3..76b2d34e5 100644 --- a/TableProMobile/TableProMobile/Views/Components/DatabaseIconView.swift +++ b/TableProMobile/TableProMobile/Views/Components/DatabaseIconView.swift @@ -1,8 +1,3 @@ -// -// DatabaseIconView.swift -// TableProMobile -// - import SwiftUI import TableProModels diff --git a/TableProMobile/TableProMobile/Views/Components/ErrorView.swift b/TableProMobile/TableProMobile/Views/Components/ErrorView.swift index 6352d577f..844a3f957 100644 --- a/TableProMobile/TableProMobile/Views/Components/ErrorView.swift +++ b/TableProMobile/TableProMobile/Views/Components/ErrorView.swift @@ -1,8 +1,3 @@ -// -// ErrorView.swift -// TableProMobile -// - import SwiftUI struct ErrorView: View { diff --git a/TableProMobile/TableProMobile/Views/Components/FKPreviewView.swift b/TableProMobile/TableProMobile/Views/Components/FKPreviewView.swift index 902c0263e..c6fe8aea1 100644 --- a/TableProMobile/TableProMobile/Views/Components/FKPreviewView.swift +++ b/TableProMobile/TableProMobile/Views/Components/FKPreviewView.swift @@ -1,8 +1,3 @@ -// -// FKPreviewView.swift -// TableProMobile -// - import os import SwiftUI import TableProDatabase diff --git a/TableProMobile/TableProMobile/Views/Components/FilterSheetView.swift b/TableProMobile/TableProMobile/Views/Components/FilterSheetView.swift index e6e9497dd..29bb6cec5 100644 --- a/TableProMobile/TableProMobile/Views/Components/FilterSheetView.swift +++ b/TableProMobile/TableProMobile/Views/Components/FilterSheetView.swift @@ -1,8 +1,3 @@ -// -// FilterSheetView.swift -// TableProMobile -// - import SwiftUI import TableProModels diff --git a/TableProMobile/TableProMobile/Views/Components/GroupFormSheet.swift b/TableProMobile/TableProMobile/Views/Components/GroupFormSheet.swift index 452059387..82f65d0ab 100644 --- a/TableProMobile/TableProMobile/Views/Components/GroupFormSheet.swift +++ b/TableProMobile/TableProMobile/Views/Components/GroupFormSheet.swift @@ -1,8 +1,3 @@ -// -// GroupFormSheet.swift -// TableProMobile -// - import SwiftUI import TableProModels diff --git a/TableProMobile/TableProMobile/Views/Components/MetadataBadge.swift b/TableProMobile/TableProMobile/Views/Components/MetadataBadge.swift index fdfa6ada3..87c493fb2 100644 --- a/TableProMobile/TableProMobile/Views/Components/MetadataBadge.swift +++ b/TableProMobile/TableProMobile/Views/Components/MetadataBadge.swift @@ -1,8 +1,3 @@ -// -// MetadataBadge.swift -// TableProMobile -// - import SwiftUI struct MetadataBadge: View { diff --git a/TableProMobile/TableProMobile/Views/Components/RowCard.swift b/TableProMobile/TableProMobile/Views/Components/RowCard.swift index f051a87e1..d3fb3ad46 100644 --- a/TableProMobile/TableProMobile/Views/Components/RowCard.swift +++ b/TableProMobile/TableProMobile/Views/Components/RowCard.swift @@ -1,8 +1,3 @@ -// -// RowCard.swift -// TableProMobile -// - import SwiftUI import TableProModels diff --git a/TableProMobile/TableProMobile/Views/Components/SQLHighlightTextView.swift b/TableProMobile/TableProMobile/Views/Components/SQLHighlightTextView.swift index 985a706fe..edef4ca4a 100644 --- a/TableProMobile/TableProMobile/Views/Components/SQLHighlightTextView.swift +++ b/TableProMobile/TableProMobile/Views/Components/SQLHighlightTextView.swift @@ -1,8 +1,3 @@ -// -// SQLHighlightTextView.swift -// TableProMobile -// - import SwiftUI import UIKit diff --git a/TableProMobile/TableProMobile/Views/Components/SQLSyntaxHighlighter.swift b/TableProMobile/TableProMobile/Views/Components/SQLSyntaxHighlighter.swift index 1e62855e7..e4b4c5735 100644 --- a/TableProMobile/TableProMobile/Views/Components/SQLSyntaxHighlighter.swift +++ b/TableProMobile/TableProMobile/Views/Components/SQLSyntaxHighlighter.swift @@ -1,8 +1,3 @@ -// -// SQLSyntaxHighlighter.swift -// TableProMobile -// - import UIKit enum SQLSyntaxHighlighter { diff --git a/TableProMobile/TableProMobile/Views/Components/TagFormSheet.swift b/TableProMobile/TableProMobile/Views/Components/TagFormSheet.swift index 7dc765641..183a92b95 100644 --- a/TableProMobile/TableProMobile/Views/Components/TagFormSheet.swift +++ b/TableProMobile/TableProMobile/Views/Components/TagFormSheet.swift @@ -1,8 +1,3 @@ -// -// TagFormSheet.swift -// TableProMobile -// - import SwiftUI import TableProModels diff --git a/TableProMobile/TableProMobile/Views/ConnectedView.swift b/TableProMobile/TableProMobile/Views/ConnectedView.swift index 9e01a379b..6370a360b 100644 --- a/TableProMobile/TableProMobile/Views/ConnectedView.swift +++ b/TableProMobile/TableProMobile/Views/ConnectedView.swift @@ -1,8 +1,3 @@ -// -// ConnectedView.swift -// TableProMobile -// - import SwiftUI import TableProDatabase import TableProModels diff --git a/TableProMobile/TableProMobile/Views/ConnectionFormView.swift b/TableProMobile/TableProMobile/Views/ConnectionFormView.swift index 6e85fc540..40974771f 100644 --- a/TableProMobile/TableProMobile/Views/ConnectionFormView.swift +++ b/TableProMobile/TableProMobile/Views/ConnectionFormView.swift @@ -1,8 +1,3 @@ -// -// ConnectionFormView.swift -// TableProMobile -// - import SwiftUI import TableProDatabase import TableProModels diff --git a/TableProMobile/TableProMobile/Views/ConnectionInfoView.swift b/TableProMobile/TableProMobile/Views/ConnectionInfoView.swift index f142f5acc..b9c8925f9 100644 --- a/TableProMobile/TableProMobile/Views/ConnectionInfoView.swift +++ b/TableProMobile/TableProMobile/Views/ConnectionInfoView.swift @@ -1,8 +1,3 @@ -// -// ConnectionInfoView.swift -// TableProMobile -// - import SwiftUI import TableProDatabase import TableProModels diff --git a/TableProMobile/TableProMobile/Views/ConnectionListView.swift b/TableProMobile/TableProMobile/Views/ConnectionListView.swift index a0d9f2ca4..5ede70b1a 100644 --- a/TableProMobile/TableProMobile/Views/ConnectionListView.swift +++ b/TableProMobile/TableProMobile/Views/ConnectionListView.swift @@ -1,8 +1,3 @@ -// -// ConnectionListView.swift -// TableProMobile -// - import SwiftUI import TableProModels import TableProSync @@ -83,6 +78,7 @@ struct ConnectionListView: View { Image(systemName: "plus") } .keyboardShortcut("n", modifiers: .command) + .accessibilityLabel(Text("Add Connection")) } ToolbarItemGroup(placement: .topBarLeading) { Button { @@ -102,12 +98,14 @@ struct ConnectionListView: View { } } .disabled(isSyncing) + .accessibilityLabel(Text("Sync with iCloud")) Button { showingSettings = true } label: { Image(systemName: "gear") } + .accessibilityLabel(Text("Settings")) } } .onChange(of: appState.pendingConnectionId) { _, newId in @@ -458,6 +456,20 @@ private struct ConnectionRow: View { ) } } + .accessibilityElement(children: .combine) + .accessibilityLabel(accessibilityLabel) + .accessibilityHint(Text("Opens this connection")) } + private var accessibilityLabel: Text { + let displayName = connection.name.isEmpty ? connection.host : connection.name + let typeName = connection.type.rawValue.uppercased() + let location: String = connection.type == .sqlite + ? (connection.database.components(separatedBy: "/").last ?? "database") + : "\(connection.host) port \(connection.port)" + if let tag { + return Text("\(typeName), \(displayName), \(location), tag \(tag.name)") + } + return Text("\(typeName), \(displayName), \(location)") + } } diff --git a/TableProMobile/TableProMobile/Views/DataBrowserView.swift b/TableProMobile/TableProMobile/Views/DataBrowserView.swift index 5539c0bf6..9453db022 100644 --- a/TableProMobile/TableProMobile/Views/DataBrowserView.swift +++ b/TableProMobile/TableProMobile/Views/DataBrowserView.swift @@ -1,8 +1,3 @@ -// -// DataBrowserView.swift -// TableProMobile -// - import SwiftUI import TableProDatabase import TableProModels diff --git a/TableProMobile/TableProMobile/Views/GroupManagementView.swift b/TableProMobile/TableProMobile/Views/GroupManagementView.swift index 1f21901dd..8c744fa2b 100644 --- a/TableProMobile/TableProMobile/Views/GroupManagementView.swift +++ b/TableProMobile/TableProMobile/Views/GroupManagementView.swift @@ -1,8 +1,3 @@ -// -// GroupManagementView.swift -// TableProMobile -// - import SwiftUI import TableProModels diff --git a/TableProMobile/TableProMobile/Views/InsertRowView.swift b/TableProMobile/TableProMobile/Views/InsertRowView.swift index f7dbe2917..8582879f3 100644 --- a/TableProMobile/TableProMobile/Views/InsertRowView.swift +++ b/TableProMobile/TableProMobile/Views/InsertRowView.swift @@ -1,8 +1,3 @@ -// -// InsertRowView.swift -// TableProMobile -// - import os import SwiftUI import TableProDatabase diff --git a/TableProMobile/TableProMobile/Views/LockScreenView.swift b/TableProMobile/TableProMobile/Views/LockScreenView.swift index 1a194e851..0beb7210d 100644 --- a/TableProMobile/TableProMobile/Views/LockScreenView.swift +++ b/TableProMobile/TableProMobile/Views/LockScreenView.swift @@ -1,8 +1,3 @@ -// -// LockScreenView.swift -// TableProMobile -// - import SwiftUI struct LockScreenView: View { diff --git a/TableProMobile/TableProMobile/Views/OnboardingView.swift b/TableProMobile/TableProMobile/Views/OnboardingView.swift index 70747052a..844ce8846 100644 --- a/TableProMobile/TableProMobile/Views/OnboardingView.swift +++ b/TableProMobile/TableProMobile/Views/OnboardingView.swift @@ -1,8 +1,3 @@ -// -// OnboardingView.swift -// TableProMobile -// - import SwiftUI struct OnboardingView: View { diff --git a/TableProMobile/TableProMobile/Views/QueryEditorView.swift b/TableProMobile/TableProMobile/Views/QueryEditorView.swift index ed6adf2f3..703967c7c 100644 --- a/TableProMobile/TableProMobile/Views/QueryEditorView.swift +++ b/TableProMobile/TableProMobile/Views/QueryEditorView.swift @@ -1,8 +1,3 @@ -// -// QueryEditorView.swift -// TableProMobile -// - import os import SwiftUI import TableProDatabase diff --git a/TableProMobile/TableProMobile/Views/QueryHistoryView.swift b/TableProMobile/TableProMobile/Views/QueryHistoryView.swift index bcfbccf23..1e741c00c 100644 --- a/TableProMobile/TableProMobile/Views/QueryHistoryView.swift +++ b/TableProMobile/TableProMobile/Views/QueryHistoryView.swift @@ -1,8 +1,3 @@ -// -// QueryHistoryView.swift -// TableProMobile -// - import SwiftUI import UIKit diff --git a/TableProMobile/TableProMobile/Views/RowDetailView.swift b/TableProMobile/TableProMobile/Views/RowDetailView.swift index 72c309fde..d619b9481 100644 --- a/TableProMobile/TableProMobile/Views/RowDetailView.swift +++ b/TableProMobile/TableProMobile/Views/RowDetailView.swift @@ -1,8 +1,3 @@ -// -// RowDetailView.swift -// TableProMobile -// - import SwiftUI import TableProDatabase import TableProModels diff --git a/TableProMobile/TableProMobile/Views/SettingsView.swift b/TableProMobile/TableProMobile/Views/SettingsView.swift index e8b0109f8..7aab269c0 100644 --- a/TableProMobile/TableProMobile/Views/SettingsView.swift +++ b/TableProMobile/TableProMobile/Views/SettingsView.swift @@ -1,8 +1,3 @@ -// -// SettingsView.swift -// TableProMobile -// - import SwiftUI struct SettingsView: View { diff --git a/TableProMobile/TableProMobile/Views/StructureView.swift b/TableProMobile/TableProMobile/Views/StructureView.swift index a3e8fa6c5..e6802c913 100644 --- a/TableProMobile/TableProMobile/Views/StructureView.swift +++ b/TableProMobile/TableProMobile/Views/StructureView.swift @@ -1,8 +1,3 @@ -// -// StructureView.swift -// TableProMobile -// - import os import SwiftUI import TableProDatabase diff --git a/TableProMobile/TableProMobile/Views/TableListView.swift b/TableProMobile/TableProMobile/Views/TableListView.swift index e33ca2b59..94bc39059 100644 --- a/TableProMobile/TableProMobile/Views/TableListView.swift +++ b/TableProMobile/TableProMobile/Views/TableListView.swift @@ -1,8 +1,3 @@ -// -// TableListView.swift -// TableProMobile -// - import SwiftUI import TableProDatabase import TableProModels @@ -180,9 +175,11 @@ struct TableListView: View { private struct TableRow: View { let table: TableInfo + private var isView: Bool { table.type == .view || table.type == .materializedView } + var body: some View { HStack { - Image(systemName: table.type == .view || table.type == .materializedView ? "eye" : "tablecells") + Image(systemName: isView ? "eye" : "tablecells") .foregroundStyle(.secondary) .frame(width: 24) @@ -195,6 +192,17 @@ private struct TableRow: View { MetadataBadge(formatRowCount(rowCount)) } } + .accessibilityElement(children: .combine) + .accessibilityLabel(accessibilityLabel) + .accessibilityHint(Text("Opens table data")) + } + + private var accessibilityLabel: Text { + let kind = isView ? String(localized: "View") : String(localized: "Table") + if let rowCount = table.rowCount { + return Text("\(kind), \(table.name), \(rowCount) rows") + } + return Text("\(kind), \(table.name)") } private func formatRowCount(_ count: Int) -> String { diff --git a/TableProMobile/TableProMobile/Views/TagManagementView.swift b/TableProMobile/TableProMobile/Views/TagManagementView.swift index 98eb481d4..062cec239 100644 --- a/TableProMobile/TableProMobile/Views/TagManagementView.swift +++ b/TableProMobile/TableProMobile/Views/TagManagementView.swift @@ -1,8 +1,3 @@ -// -// TagManagementView.swift -// TableProMobile -// - import SwiftUI import TableProModels diff --git a/TableProMobile/TableProWidget/Helpers/DatabaseTypeStyle.swift b/TableProMobile/TableProWidget/Helpers/DatabaseTypeStyle.swift index d5710613f..ccc7cf380 100644 --- a/TableProMobile/TableProWidget/Helpers/DatabaseTypeStyle.swift +++ b/TableProMobile/TableProWidget/Helpers/DatabaseTypeStyle.swift @@ -1,8 +1,3 @@ -// -// DatabaseTypeStyle.swift -// TableProWidget -// - import SwiftUI enum DatabaseTypeStyle { diff --git a/TableProMobile/TableProWidget/QuickConnectEntry.swift b/TableProMobile/TableProWidget/QuickConnectEntry.swift index 432d12616..fcfa9eb86 100644 --- a/TableProMobile/TableProWidget/QuickConnectEntry.swift +++ b/TableProMobile/TableProWidget/QuickConnectEntry.swift @@ -1,8 +1,3 @@ -// -// QuickConnectEntry.swift -// TableProWidget -// - import WidgetKit struct QuickConnectEntry: TimelineEntry { diff --git a/TableProMobile/TableProWidget/QuickConnectProvider.swift b/TableProMobile/TableProWidget/QuickConnectProvider.swift index 9d900f900..2ae94b527 100644 --- a/TableProMobile/TableProWidget/QuickConnectProvider.swift +++ b/TableProMobile/TableProWidget/QuickConnectProvider.swift @@ -1,8 +1,3 @@ -// -// QuickConnectProvider.swift -// TableProWidget -// - import WidgetKit struct QuickConnectProvider: TimelineProvider { diff --git a/TableProMobile/TableProWidget/QuickConnectWidget.swift b/TableProMobile/TableProWidget/QuickConnectWidget.swift index 0189dec75..2f9636c5c 100644 --- a/TableProMobile/TableProWidget/QuickConnectWidget.swift +++ b/TableProMobile/TableProWidget/QuickConnectWidget.swift @@ -1,8 +1,3 @@ -// -// QuickConnectWidget.swift -// TableProWidget -// - import SwiftUI import WidgetKit diff --git a/TableProMobile/TableProWidget/Shared/SharedConnectionStore.swift b/TableProMobile/TableProWidget/Shared/SharedConnectionStore.swift index d541d7cf9..a13f7ef24 100644 --- a/TableProMobile/TableProWidget/Shared/SharedConnectionStore.swift +++ b/TableProMobile/TableProWidget/Shared/SharedConnectionStore.swift @@ -1,8 +1,3 @@ -// -// SharedConnectionStore.swift -// TableProWidget -// - import Foundation enum SharedConnectionStore { diff --git a/TableProMobile/TableProWidget/Shared/WidgetConnectionItem.swift b/TableProMobile/TableProWidget/Shared/WidgetConnectionItem.swift index 92ec23d02..ce6015507 100644 --- a/TableProMobile/TableProWidget/Shared/WidgetConnectionItem.swift +++ b/TableProMobile/TableProWidget/Shared/WidgetConnectionItem.swift @@ -1,8 +1,3 @@ -// -// WidgetConnectionItem.swift -// TableProWidget -// - import Foundation struct WidgetConnectionItem: Codable, Identifiable, Hashable { diff --git a/TableProMobile/TableProWidget/Views/MediumWidgetView.swift b/TableProMobile/TableProWidget/Views/MediumWidgetView.swift index 0a356e138..96fd614e5 100644 --- a/TableProMobile/TableProWidget/Views/MediumWidgetView.swift +++ b/TableProMobile/TableProWidget/Views/MediumWidgetView.swift @@ -1,8 +1,3 @@ -// -// MediumWidgetView.swift -// TableProWidget -// - import SwiftUI struct MediumWidgetView: View { diff --git a/TableProMobile/TableProWidget/Views/QuickConnectEntryView.swift b/TableProMobile/TableProWidget/Views/QuickConnectEntryView.swift index 3f70db162..9e6f2c2e2 100644 --- a/TableProMobile/TableProWidget/Views/QuickConnectEntryView.swift +++ b/TableProMobile/TableProWidget/Views/QuickConnectEntryView.swift @@ -1,8 +1,3 @@ -// -// QuickConnectEntryView.swift -// TableProWidget -// - import SwiftUI import WidgetKit diff --git a/TableProMobile/TableProWidget/Views/SmallWidgetView.swift b/TableProMobile/TableProWidget/Views/SmallWidgetView.swift index 46a3d66f5..4852f7b61 100644 --- a/TableProMobile/TableProWidget/Views/SmallWidgetView.swift +++ b/TableProMobile/TableProWidget/Views/SmallWidgetView.swift @@ -1,8 +1,3 @@ -// -// SmallWidgetView.swift -// TableProWidget -// - import SwiftUI import WidgetKit