diff --git a/TablePro/Core/Plugins/PluginError.swift b/TablePro/Core/Plugins/PluginError.swift index 4c4e4d94..5e644b5e 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 569f2d66..60b70274 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 0454ccbb..084d5854 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" : { diff --git a/TablePro/Views/Filter/FilterRowView.swift b/TablePro/Views/Filter/FilterRowView.swift index 5196fe17..6a636465 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 } ))