From e82a9c7402b23afbfe70f87b7b3b5540fb7cd87d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ng=C3=B4=20Qu=E1=BB=91c=20=C4=90=E1=BA=A1t?= Date: Tue, 31 Mar 2026 09:55:37 +0700 Subject: [PATCH 1/2] fix: use correct error message when user-installed plugin is outdated --- TablePro/Core/Plugins/PluginError.swift | 3 +++ TablePro/Core/Plugins/PluginManager.swift | 14 +++++++------- TablePro/Resources/Localizable.xcstrings | 15 ++++++--------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/TablePro/Core/Plugins/PluginError.swift b/TablePro/Core/Plugins/PluginError.swift index 4c4e4d946..5e644b5e8 100644 --- a/TablePro/Core/Plugins/PluginError.swift +++ b/TablePro/Core/Plugins/PluginError.swift @@ -10,6 +10,7 @@ enum PluginError: LocalizedError { case signatureInvalid(detail: String) case checksumMismatch case incompatibleVersion(required: Int, current: Int) + case pluginOutdated(pluginVersion: Int, requiredVersion: Int) case cannotUninstallBuiltIn case notFound case noCompatibleBinary @@ -31,6 +32,8 @@ enum PluginError: LocalizedError { return String(localized: "Plugin checksum does not match expected value") case .incompatibleVersion(let required, let current): return String(localized: "Plugin requires PluginKit version \(required), but app provides version \(current)") + case .pluginOutdated(let pluginVersion, let requiredVersion): + return String(localized: "Plugin was built with PluginKit version \(pluginVersion), but version \(requiredVersion) is required. Please update the plugin.") case .cannotUninstallBuiltIn: return String(localized: "Built-in plugins cannot be uninstalled") case .notFound: diff --git a/TablePro/Core/Plugins/PluginManager.swift b/TablePro/Core/Plugins/PluginManager.swift index 569f2d66f..60b702747 100644 --- a/TablePro/Core/Plugins/PluginManager.swift +++ b/TablePro/Core/Plugins/PluginManager.swift @@ -182,7 +182,7 @@ final class PluginManager { if entry.source == .userInstalled { if pluginKitVersion < currentPluginKitVersion { - logger.error("User plugin \(entry.url.lastPathComponent) has outdated PluginKit v\(pluginKitVersion)") + logger.error("User plugin \(entry.url.lastPathComponent) was built with PluginKit v\(pluginKitVersion), but v\(currentPluginKitVersion) is required") continue } } @@ -383,9 +383,9 @@ final class PluginManager { // have stale witness tables — accessing protocol properties crashes with // EXC_BAD_ACCESS. Reject them before loading the bundle. if pluginKitVersion < Self.currentPluginKitVersion { - throw PluginError.incompatibleVersion( - required: Self.currentPluginKitVersion, - current: pluginKitVersion + throw PluginError.pluginOutdated( + pluginVersion: pluginKitVersion, + requiredVersion: Self.currentPluginKitVersion ) } try verifyCodeSignature(bundle: bundle) @@ -419,9 +419,9 @@ final class PluginManager { if source == .userInstalled { if pluginKitVersion < Self.currentPluginKitVersion { - throw PluginError.incompatibleVersion( - required: Self.currentPluginKitVersion, - current: pluginKitVersion + throw PluginError.pluginOutdated( + pluginVersion: pluginKitVersion, + requiredVersion: Self.currentPluginKitVersion ) } try verifyCodeSignature(bundle: bundle) diff --git a/TablePro/Resources/Localizable.xcstrings b/TablePro/Resources/Localizable.xcstrings index 0454ccbb9..084d5854e 100644 --- a/TablePro/Resources/Localizable.xcstrings +++ b/TablePro/Resources/Localizable.xcstrings @@ -9393,9 +9393,6 @@ } } } - }, - "DataGridView placeholder for: %@" : { - }, "Date format:" : { "localizations" : { @@ -14166,9 +14163,6 @@ } } } - }, - "Fix with AI" : { - }, "Focus Border" : { "localizations" : { @@ -25645,6 +25639,9 @@ } } } + }, + "Results" : { + }, "Retention" : { "localizations" : { @@ -26102,9 +26099,6 @@ } } } - }, - "Run a query to see results" : { - }, "Run in New Tab" : { "localizations" : { @@ -32302,6 +32296,9 @@ }, "Toggle Results" : { + }, + "Toggle Results (⌘⌥R)" : { + }, "Toggle Table Browser" : { "localizations" : { From 42570ddf1b455745cc3266d3a929ee1f85a0688d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ng=C3=B4=20Qu=E1=BB=91c=20=C4=90=E1=BA=A1t?= Date: Tue, 31 Mar 2026 10:46:31 +0700 Subject: [PATCH 2/2] fix: change Raw SQL filter placeholder to prevent WHERE keyword confusion --- TablePro/Views/Filter/FilterRowView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TablePro/Views/Filter/FilterRowView.swift b/TablePro/Views/Filter/FilterRowView.swift index 5196fe17f..6a6364655 100644 --- a/TablePro/Views/Filter/FilterRowView.swift +++ b/TablePro/Views/Filter/FilterRowView.swift @@ -79,7 +79,7 @@ struct FilterRowView: View { @ViewBuilder private var valueFields: some View { if filter.isRawSQL { - TextField("WHERE clause...", text: Binding( + TextField("e.g. id = 1", text: Binding( get: { filter.rawSQL ?? "" }, set: { filter.rawSQL = $0 } ))