diff --git a/development/plugin-development.mdx b/development/plugin-development.mdx index f676d1fa..e14c8220 100644 --- a/development/plugin-development.mdx +++ b/development/plugin-development.mdx @@ -13,7 +13,7 @@ A plugin is a macOS loadable bundle target with `WRAPPER_EXTENSION = tableplugin | Key | Type | Required | Purpose | |-----|------|----------|---------| -| `TableProPluginKitVersion` | integer | Yes | The PluginKit ABI the plugin was built against. Current value: 38 | +| `TableProPluginKitVersion` | integer | Yes | The PluginKit ABI the plugin was built against. Current value: 39 | | `TableProProvidesDatabaseTypeIds` | array of strings | Recommended | Database type IDs the plugin serves, which is what makes lazy loading possible | | `CFBundleShortVersionString` | string | Yes | Plugin version, read by registry update checks | | `TableProMinAppVersion` | string | No | The loader rejects the plugin on an older app | diff --git a/development/plugin-registry.mdx b/development/plugin-registry.mdx index 64cf6259..f473f984 100644 --- a/development/plugin-registry.mdx +++ b/development/plugin-registry.mdx @@ -66,13 +66,13 @@ The app filters `binaries` to the running architecture, keeps those whose `plugi "binaries": [ { "architecture": "arm64", - "pluginKitVersion": 38, + "pluginKitVersion": 39, "downloadURL": "https://github.com/TableProApp/TablePro/releases/download/plugin-oracle-v1.0.26/OracleDriver-arm64.zip", "sha256": "" }, { "architecture": "x86_64", - "pluginKitVersion": 38, + "pluginKitVersion": 39, "downloadURL": "https://github.com/TableProApp/TablePro/releases/download/plugin-oracle-v1.0.26/OracleDriver-x86_64.zip", "sha256": "" } diff --git a/features/change-tracking.mdx b/features/change-tracking.mdx index e2ae7e4c..ddcc2226 100644 --- a/features/change-tracking.mdx +++ b/features/change-tracking.mdx @@ -36,17 +36,25 @@ Double-click a cell, or press `Enter` on it. `Enter` commits the edit to the que Cell editor -Right-click an editable cell and open **Set Value** for the common ones without typing: **Empty** on text, `SET` and binary columns, **NULL** on a nullable column, **Default** on a column the server fills in, and date functions such as `NOW()` or `CURRENT_DATE` on date columns. +Right-click an editable cell and open **Set Value** to set it without typing. Each item appears only where the column takes it: + +- **Empty** on text, `SET` and binary columns. +- **NULL** on a nullable column. +- **Default** on a column the server fills in. SQLite, libSQL, Turso, Cloudflare D1, ClickHouse, Databend, Snowflake, Trino, Cassandra and ScyllaDB take it on a new row only. +- The database's own date and time functions on a date or time column, such as `NOW()` on MySQL or `CURRENT_TIMESTAMP` on SQLite. +- **Generate UUID** (version 4) and **Generate UUIDv7** (ordered by creation time) on a `uuid` or `uniqueidentifier` column, and on a text or binary column whose display format is UUID. A foreign key column and a Cassandra `timeuuid` column get neither. + +Select several cells first to set all of them at once; Generate UUID gives each cell its own value. With whole rows selected, the clicked column changes on every selected row. **Edit > Set Value** holds the same items for the focused cell or the selection, and [Settings > Keyboard](/features/keyboard-shortcuts#customizing-shortcuts) assigns them shortcuts. On MongoDB, Firestore and the Firebase Realtime Database a document can lack a field altogether, and on Bigtable a row can lack a cell; the grid shows either as **No Field**. **Remove Field** on the same right-click menu deletes the field rather than storing NULL. Bigtable stores no NULL, so **NULL** and **Remove Field** both delete the cell. See [missing fields and null](/databases/mongodb#missing-fields-and-null). ## Adding and deleting rows -- **Add Row** (`Cmd+Shift+N`), the **+** button, or **Edit > Add Row**. The row appears at the bottom with the cursor in its first writable cell. Later edits fold into the INSERT rather than queueing as updates. -- **Duplicate Row** (`Cmd+Shift+D`) on the right-click menu copies a row and resets its primary key and its identity columns to `DEFAULT`, so the database assigns new ones. +- **Add Row** (`Cmd+Shift+N`), the **+** button, or **Edit > Add Row**. The row appears at the bottom with the cursor in its first writable cell. A UUID primary key the server does not fill gets a new UUID, and the cursor skips it. Later edits fold into the INSERT rather than queueing as updates. +- **Duplicate Row** (`Cmd+Shift+D`) on the right-click menu copies a row and resets its primary key and its identity columns to `DEFAULT`, so the database assigns new ones. A UUID primary key the server does not fill gets a new UUID instead. - **Delete**: select rows by their row numbers (`Shift`-click for a range, `Cmd`-click for separate rows) and press `Delete`. They stay visible with a strikethrough, and saving asks "Delete 5 rows?" before they go. -- **Paste** on the right-click menu inserts copied rows as new rows. -- **Fill Column** on the header right-click menu writes one value into every loaded row. It is absent on primary key columns and on columns the server owns. +- **Paste** on the right-click menu inserts copied rows as new rows, with a new UUID in a UUID primary key the server does not fill. +- **Fill Column** on the header right-click menu writes one value, NULL, or a new UUID or UUIDv7 per row into every loaded row. It is absent on primary key columns and on columns the server owns. A new row starts at `DEFAULT` in every column the server fills in. That covers a column with a default expression, and an identity or `AUTO_INCREMENT` column, which carries no default of its own. The INSERT leaves those columns out, so the server assigns them. @@ -74,7 +82,7 @@ Individual columns stay read-only where the server owns them: generated, compute ## Saving -Press `Cmd+S`, or click the toolbar checkmark. Values go out as bound parameters; `DEFAULT` and SQL functions such as `NOW()` are written into the statement as they stand. +Press `Cmd+S`, or click the toolbar checkmark. Values go out as bound parameters; `DEFAULT` and the functions picked from **Set Value** or the inspector are written into the statement as they stand. Typing one of those functions into a date or time cell does the same. Text typed into any other column is saved as typed, even when it reads like `now()`, and a pending function cell is drawn like a pending `DEFAULT`. | Change | Generated SQL | |--------|--------------| diff --git a/features/data-grid.mdx b/features/data-grid.mdx index a2a05ff5..55140bcd 100644 --- a/features/data-grid.mdx +++ b/features/data-grid.mdx @@ -110,7 +110,7 @@ Step back with **View > Back** (`Ctrl+Cmd+[`) and **View > Forward** (`Ctrl+Cmd+ Press `Cmd+Option+I`, or click the button at the trailing end of the toolbar, to open the inspector beside the grid. The table and which row of how many is selected sit under the [pane's header](/features/connection-window#the-trailing-pane), and **Fields** and **JSON** are the two renderings of that row, picked from the header's ellipsis menu. [Cell and Row Viewers](/features/json-viewer) covers both. Turn on **Auto-show inspector on row select** in [Settings > Data](/customization/data-settings) to open it whenever a row is picked, in a query result as well as a table. -Short values sit on one line, label leading and value trailing. Long text, JSON, PHP, binary and images take the full width. Long text and JSON carry a resize handle; PHP, binary and images draw at a fixed height. `Tab` and `Shift+Tab` move between fields; the menu at the trailing edge of each field carries **Set NULL**, **Set DEFAULT**, **SQL Functions**, and **Set EMPTY** on a text, `SET` or binary field, with `Ctrl+Option+N` and `Ctrl+Option+D` as shortcuts for the first two. Search filters the list by column name or stored value, and the pencil button narrows it to fields already edited. +Short values sit on one line, label leading and value trailing. Long text, JSON, PHP, binary and images take the full width. Long text and JSON carry a resize handle; PHP, binary and images draw at a fixed height. `Tab` and `Shift+Tab` move between fields; the menu at the trailing edge of each field carries the same values as [Set Value](/features/change-tracking#editing-a-cell): **Set NULL**, **Set DEFAULT**, **Set EMPTY**, **Generate UUID** and **Generate UUIDv7** where the column takes them, and **SQL Functions** with the date and time functions that fit it. `Ctrl+Option+N` and `Ctrl+Option+D` set NULL and DEFAULT. With several rows selected, Generate UUID gives each row its own value. Search filters the list by column name or stored value, and the pencil button narrows it to fields already edited. With no row selected and a table open, the inspector shows that table's size, row count, engine, collation and timestamps, as far as the database reports them. They are read only while the inspector is open. diff --git a/features/json-viewer.mdx b/features/json-viewer.mdx index 1f5f3ab9..a9dc9212 100644 --- a/features/json-viewer.mdx +++ b/features/json-viewer.mdx @@ -160,7 +160,7 @@ The text box, the JSON editor and the map each carry a drag handle under them, w **Open in Window** detaches a JSON, PHP or text value into its own resizable window; on an editable row, edits there join the same pending changes as the field. An image and a map detach read-only. The expand button on a JSON, PHP, long text or geometry field grows it to fill the inspector's height with the other fields still listed around it; click it again to shrink it back. Binary and image fields draw at a fixed height and carry no expand button, and neither does a geometry field stored as bytes, whose map still takes the drag handle. -Every field carries a menu at its trailing edge, and right-clicking the field opens the same one. **Set NULL**, **Set DEFAULT**, **Set EMPTY** and **SQL Functions** need an editable field, and **Set EMPTY** a text, `SET` or binary one; `Ctrl+Option+N` and `Ctrl+Option+D` reach the first two from the keyboard. **Copy Value** is always there, and a read-only field keeps its text selectable. +Every field carries a menu at its trailing edge, and right-clicking the field opens the same one. **Set NULL**, **Set DEFAULT**, **Set EMPTY**, **Generate UUID**, **Generate UUIDv7** and **SQL Functions** need an editable field and appear only where the column takes them, as in [Set Value](/features/change-tracking#editing-a-cell); `Ctrl+Option+N` and `Ctrl+Option+D` set NULL and DEFAULT from the keyboard. **Copy Value** is always there, and a read-only field keeps its text selectable. With no row selected, the inspector describes the table the tab is bound to: data, index and total size, row count, average row size, engine, collation, and creation and update dates, as far as the database reports them. A tab with no table of its own, such as a query, leaves it empty. On a Structure tab it follows the structure grid and names the selected column. diff --git a/features/keyboard-shortcuts.mdx b/features/keyboard-shortcuts.mdx index 4acdbd6e..836100f4 100644 --- a/features/keyboard-shortcuts.mdx +++ b/features/keyboard-shortcuts.mdx @@ -116,6 +116,8 @@ Every row except the five find rows is built into the editor and cannot be rebou | Add row | `Cmd+Shift+N` | | Duplicate row | `Cmd+Shift+D` | | Restore Previous Values | none by default, rebindable | +| Set Value to Empty, NULL or Default | none by default, rebindable | +| Generate UUID, Generate UUIDv7 | none by default, rebindable | | Delete selected rows | `Delete` or `Cmd+Delete` | | Truncate table (tables selected in the sidebar) | `Option+Delete` | | Preview FK reference | `Space` | @@ -278,7 +280,7 @@ With the drawer open (`Cmd+Y`) and its entry list focused, `Return` loads the se | Set the focused field to NULL | `Ctrl+Option+N` | | Set the focused field to its DEFAULT | `Ctrl+Option+D` | -`Ctrl+Option+N` and `Ctrl+Option+D` skip a field the server owns and a column definition on a Structure tab, neither of which takes either state. +`Ctrl+Option+N` and `Ctrl+Option+D` work only where the field's menu offers **Set NULL** or **Set DEFAULT**, and no other command can be bound to them. ## Welcome window