Releases: TableProApp/TablePro
Releases · TableProApp/TablePro
Release list
v0.5.0
Changed
- AI chat panel — native macOS inspector styling: removed iOS-style chat bubbles, flattened message layout with role headers and compact spacing, reduced heading sizes for narrow sidebar, inline typing indicator without pill background
- AppKit → SwiftUI migration: migrated 5 NSPopover controllers (Enum, Set, TypePicker, JSONEditor, ForeignKey) to SwiftUI content views with a shared
PopoverPresenterutility — eliminates manualNSEventmonitors,NSPopoverDelegate, and singleton patterns - AppKit → SwiftUI migration: replaced
KeyEventHandlerNSViewRepresentable with native.onKeyPress()modifiers (macOS 14+) in DatabaseSwitcherSheet and WelcomeWindowView - AppKit → SwiftUI migration: replaced AppKit history panel (5 files:
HistoryPanelController,HistoryListViewController,QueryPreviewViewController,HistoryTableView,HistoryRowView) with single pure SwiftUIHistoryPanelViewusingHSplitView,Listwith selection, context menus, and swipe-to-delete - AppKit → SwiftUI migration: replaced
ExportTableOutlineView(NSOutlineView, 757 lines across 2 files) with SwiftUIExportTableTreeViewusingList,DisclosureGroup, and tristate checkboxes (~146 lines) - Design tokens: replaced hardcoded
Color.secondary.opacity(0.6)with systemColor(nsColor: .tertiaryLabelColor)inDesignConstantsandToolbarDesignTokensfor proper semantic color
Added
- AI chat panel shows "Set Up AI Provider" empty state when no AI provider is configured, with a button to open Settings
- AI chat panel — right-side panel for AI-assisted SQL queries with multi-provider support (Claude, OpenAI, OpenRouter, Ollama, custom endpoints)
- AI provider settings — configure multiple AI providers in Settings > AI with API key management (Keychain), endpoint configuration, model selection, and connection testing
- AI feature routing — map AI features (Chat, Explain Query, Fix Error, Inline Suggestions) to specific providers and models
- AI schema context — automatically includes database schema, current query, and query results in AI conversations for context-aware assistance
- AI chat code blocks — SQL code blocks in AI responses include Copy and Insert to Editor buttons
- AI chat markdown rendering — replaced custom per-line AttributedString parsing with MarkdownUI library for full CommonMark + GitHub Flavored Markdown support (proper lists, tables, blockquotes, headers, strikethrough)
- Per-connection AI policy — control AI access per connection (Always Allow, Ask Each Time, Never) in the connection form
- Toggle AI Chat keyboard shortcut (
⌘⇧L) and toolbar button - Tab reuse setting — opt-in option in Settings > Tabs to reuse clean table tabs when clicking a new table in the sidebar (off by default)
- Structure view: full undo/redo support (⌘Z / ⇧⌘Z) for all column, index, and foreign key operations
- Structure view: database-specific type picker popover for the Type column — searchable, grouped by category (Numeric, String, Date & Time, Binary, Other), supports freeform input for parametric types like
VARCHAR(255) - Structure view: YES/NO dropdown menu for Nullable, Auto Inc, and Unique columns (replaces freeform text input)
- Structure view: "Don't show again" toggle in SQL preview sheet now correctly skips the review step on future saves
- SQL autocomplete: new clause types — RETURNING, UNION/INTERSECT/EXCEPT, OVER/PARTITION BY, USING, DROP/CREATE INDEX/VIEW
- SQL autocomplete: smart clause transition suggestions (e.g., WHERE after FROM, HAVING after GROUP BY, LIMIT after ORDER BY)
- SQL autocomplete: qualified column suggestions (
table.column) in JOIN ON clauses andtable.*in SELECT - SQL autocomplete: compound keyword suggestions —
IS NULL,IS NOT NULL,NULLS FIRST,NULLS LAST,ON CONFLICT,ON DUPLICATE KEY UPDATE - SQL autocomplete: richer column metadata in suggestions (primary key, nullability, default value, comment)
- SQL autocomplete: keyword documentation in completion popover
- SQL autocomplete: expanded keyword and function coverage — window functions, PostgreSQL/MySQL-specific, transaction, DCL, aggregate, datetime, string, numeric, JSON
- SQL autocomplete: context-aware suggestions for ALTER TABLE, INSERT INTO, CREATE TABLE, and COUNT(*)
- SQL autocomplete: improved fuzzy match scoring — prefix and contains matches rank above fuzzy-only matches
- Keyboard shortcut customization in Settings > Keyboard — rebind any menu shortcut via press-to-record UI, with conflict detection and "Reset to Defaults" support
- Keyboard shortcut for Switch Connection (
⌘⌥C) — quickly open the connection switcher popover from the menu or keyboard
Changed
- Layout architecture: replaced
SplitViewMinWidthEnforcerNSViewRepresentable hack with proper AppDelegate-based inspector split view configuration — eliminates KVO observation, 300ms sleep, and recursive view tree traversal - Inspector data flow: replaced manual snapshot syncing (
syncRightPanelSnapshotData()+ 5onChangehandlers) withInspectorContextvalue type passed directly through the view hierarchy via@Binding - Right panel state:
RightPanelStateno longer holds snapshot copies of coordinator data or a weak coordinator reference — it now only manages panel visibility, tab state, and owned objects - AI chat panel: receives
currentQuery: String?parameter instead of aMainContentCoordinatorreference — better separation of concerns - Sidebar save: replaced
.saveSidebarChangesnotification with direct closure (RightPanelState.onSave) set by the notification handler - Structure tab grid columns now auto-size to fit content on data load
- Structure view column headers and status messages are now localized
- SQL autocomplete: 50ms debounce for completion triggers to reduce unnecessary work
- SQL autocomplete: fuzzy matching rewritten for O(1) character access performance
Fixed
- Structure view: undo/redo (⌘Z / ⇧⌘Z) now works for all schema editing operations — previously non-functional
- Structure view: undo-delete no longer duplicates existing rows in the grid
- Structure view: deleting a new (unsaved) item then undoing correctly re-adds it
- Structure view: save button now disabled when validation errors exist (empty column names/types)
- Structure view: validation now rejects indexes and foreign keys referencing columns pending deletion
- Structure view: multi-column foreign keys are correctly preserved instead of being truncated to single-column
- Structure view: renaming a MySQL/MariaDB column now uses
CHANGE COLUMNinstead ofMODIFY COLUMN(which cannot rename) - Structure view: eliminated redundant
discardChanges()andloadSchemaForEditing()calls on save and initial load - PostgreSQL: DDL tab now includes PRIMARY KEY, UNIQUE, CHECK, and FOREIGN KEY constraints plus standalone indexes
- PostgreSQL: primary key columns are now correctly detected and displayed in the structure grid
- Security: escape table and database names in all driver schema queries to prevent SQL injection from names containing special characters
- SQL editor: undo/redo (⌘Z / ⇧⌘Z) now works correctly (was blocked by responder chain selector mismatch)
- SQL autocomplete: clause detection now works correctly inside subqueries
- SQL autocomplete: block comment detection no longer treats
--inside/* */as a line comment - SQL autocomplete: database-specific type keywords (e.g., PostgreSQL
JSONB, MySQLENUM) now appear in suggestions - SQL autocomplete: schema suggestions no longer disappear after CREATE TABLE
- SQL autocomplete: function completion now inserts
COUNT()with cursor between parentheses instead ofCOUNT( - SQL autocomplete: RETURNING suggestions now work after INSERT INTO and after closed
VALUES (...)parentheses - SQL autocomplete: CREATE INDEX ON suggests columns from the referenced table instead of table names
- SQL autocomplete: transition keywords (WHERE, JOIN, ORDER BY) no longer buried under columns at clause boundaries
- SQL autocomplete: schema-qualified names (e.g.,
schema.table.column) handled correctly - Data grid: column order no longer flashes/swaps when sorting (stable identifiers for layout persistence)
- Data grid: "Copy Column Name" and "Filter with column" context menu actions no longer copy sort indicators (e.g., "name 1▲")
- SQL generation: ALTER TABLE, DDL, and SQL Preview statements now consistently end with a semicolon
- AI chat: "Ask Each Time" connection policy now shows a confirmation dialog before sending data to AI — previously silently fell through to "Always Allow"
Removed
- Deleted unused
StructureTableCoordinator.swift(~275 lines of dead code) - Deleted 5 dead NSToolbar files (
ToolbarController,ToolbarWindowConfigurator,ToolbarItemFactory,ToolbarItemIdentifier,ToolbarHostingViews) — never referenced by active code - Removed
SplitViewMinWidthEnforcerstruct fromContentView.swift - Removed
.saveSidebarChangesnotification definition and subscription
v0.4.0
Added
- SQL Preview button (eye icon) in toolbar to review all pending SQL statements before committing changes (⌘⇧P)
- Multi-column sorting: Shift+click column headers to add columns to the sort list; regular click replaces with single sort. Sort priority indicators (1▲, 2▼) are shown in column headers when multiple columns are sorted
- "Copy with Headers" feature (Shift+Cmd+C) to copy selected rows with column headers as the first TSV line, also available via context menu in the data grid
- Column width persistence within tab session: resized columns retain their width across pagination, sorting, and filtering reloads
- Dangerous query confirmation dialog for
DELETE/UPDATEstatements without aWHEREclause — summarizes affected queries before execution - SQL editor horizontal scrolling for long lines without word wrapping
- Scroll-to-match navigation in SQL editor find panel
- GitHub Sponsors funding configuration
Changed
- Raise minimum macOS version from 13.5 (Ventura) to 14.0 (Sonoma)
- Configure URLSession to wait for network connectivity in analytics and license services
- Improve SQL statement parser to handle backslash escapes within string literals, preventing false positives in dangerous query detection
Fixed
- Fix SQL editor not updating colors when switching between light and dark mode
v0.3.2
Fixed
- Fix launch crash on macOS 13 (Ventura) x86_64 caused by accessing
NSApp.appearancebeforeNSApplicationis initialized during settings singleton setup
v0.3.0
Added
- Anonymous usage analytics with opt-out toggle in Settings > General > Privacy — sends lightweight heartbeat (OS version, architecture, locale, database types) every 24 hours to help improve TablePro; no personal data or queries are collected
- ENUM/SET column editor: double-click ENUM columns to select from a searchable dropdown popover, SET columns show a multi-select checkbox popover with OK/Cancel buttons
- PostgreSQL user-defined enum type support via
pg_enumcatalog lookup - SQLite CHECK constraint pseudo-enum detection (e.g.,
CHECK(col IN ('a','b','c'))) - Language setting in General preferences (System, English, Vietnamese) with full Vietnamese localization (637 strings)
- Connection health monitoring with automatic reconnection for MySQL/MariaDB and PostgreSQL — pings every 30 seconds, retries 3 times with exponential backoff (2s/4s/8s) on failure
- Manual "Reconnect" toolbar button appears when connection is lost or in error state
Changed
- Migrate
Libs/*.astatic libraries to Git LFS tracking to reduce repository clone size - Remove stale
.gitignoreentries for architecture-specific MariaDB libraries - Replace
filter { }.countwithcount(where:)across 7 files for more efficient collection counting - Replace
print()withLoggerin documentation examples and remove from#Previewblocks - Replace
.count > 0with!.isEmptyin documentation example
Fixed
- Fix launch crash on macOS 13 caused by missing
asyncAndWaitsymbol in CodeEditSourceEditor 0.15.2 (API requires macOS 14+); updated dependency to trackmainbranch which usessyncinstead - Escape single quotes in PostgreSQL
pg_enumlookup and SQLitesqlite_masterqueries to prevent SQL injection - ENUM column nullable detection now uses actual schema metadata instead of heuristic rawType check
- PostgreSQL primary key modification now queries the actual constraint name from
pg_constraintinstead of assuming the{table}_pkeynaming convention, supporting tables with custom constraint names - Align Xcode
SWIFT_VERSIONbuild setting from 5.0 to 5.9 to match.swiftformattarget version
v0.2.0
Added
- SSL/TLS connection support for MySQL/MariaDB and PostgreSQL with configurable modes (Disabled, Preferred, Required, Verify CA, Verify Identity) and certificate file paths
- RFC 4180-compliant CSV parser for clipboard paste with auto-detection of CSV vs TSV format
- Explain Query button in SQL editor toolbar and menu item (⌥⌘E) for viewing execution plans
- Connection switcher popover for quick switching between active/saved connections from the toolbar
- Date/time picker popover for editing date, datetime, timestamp, and time columns in the data grid
- Read-only connection mode with toggle in connection form, toolbar badge, and UI-level enforcement (disables editing, row operations, and save changes)
- Configurable query execution timeout in Settings > General (default 60s, 0 = no limit) with per-driver enforcement via
statement_timeout(PostgreSQL),max_execution_time(MySQL),max_statement_time(MariaDB), andsqlite3_busy_timeout(SQLite) - Foreign key lookup dropdown for FK columns in the data grid — shows a searchable popover with values from the referenced table, displaying both the ID and a descriptive display column
- JSON column editor popover for JSON/JSONB columns with pretty-print formatting, compact mode, real-time validation, and explicit save/cancel buttons
- Excel (.xlsx) export format with lightweight pure-Swift OOXML writer — supports shared strings deduplication, bold header rows, numeric type detection, sheet name sanitization, and multi-table export to separate worksheets
- View management: Create View (opens SQL editor with template), Edit View Definition (fetches and opens existing definition), and Drop View from sidebar context menu. Adds
fetchViewDefinition()to all database drivers (MySQL, PostgreSQL, SQLite)
Fixed
- Fixed crash on launch on macOS 13 (Ventura) caused by missing Swift runtime symbol
- Fix redo functionality in data grid (Cmd+Shift+Z now works correctly)
- Fix redo stack not being cleared when new changes are made (standard undo/redo behavior)
- Fix
canRedo()always returning false in data grid coordinator - Wire undo/redo callbacks directly to data grid for proper responder chain validation
- Fix MariaDB connection error 1193 "Unknown system variable 'max_execution_time'" by using the correct
max_statement_timevariable for MariaDB - Query timeout errors no longer prevent database connections from being established
Changed
- Replace all
print()statements with structured OSLogLoggeracross 25 files for better debugging via Console.app
v0.1.1
Added
-
Auto-update support via Sparkle 2 framework (EdDSA signed)
-
"Check for Updates..." menu item in TablePro menu
-
Software Update section in Settings > General with auto-check toggle
-
CI appcast generation and auto-deploy on tagged releases
-
Migrate SQL editor to CodeEditSourceEditor (tree-sitter powered)
-
Multi-statement SQL execution support
-
"Show Structure" context menu for sidebar tables
-
Improved filter panel UI/UX
-
SwiftUI EditorTabBar (replacing AppKit NativeTabBarView)
-
GPL v3 license
Fixed
- Fix MySQL 8+ connections failing with
caching_sha2_passwordplugin error by rebuilding libmariadb.a with the auth plugin compiled statically - Fix Delete key on data grid row from marking table as deleted
- Downgrade all APIs to support macOS 13.5 (Ventura)
- Code review fixes for multi-statement execution
Changed
- CI release notes now read from CHANGELOG.md instead of auto-generating from commits
- Removed
prepare-libsCI job to speed up build pipeline (~5 min savings) - Add SPM Package.resolved for CodeEditSourceEditor dependencies
- Add Claude Code project settings
- Update build/test commands with
-skipPackagePluginValidation
v0.1.0
Changes
- Minor improvements and bug fixes