diff --git a/public/images/blog/blog-tablepro-0-83-beta-1-light-704.avif b/public/images/blog/blog-tablepro-0-83-beta-1-light-704.avif new file mode 100644 index 00000000..97520d5c Binary files /dev/null and b/public/images/blog/blog-tablepro-0-83-beta-1-light-704.avif differ diff --git a/public/images/blog/blog-tablepro-0-83-beta-1-light-704.webp b/public/images/blog/blog-tablepro-0-83-beta-1-light-704.webp new file mode 100644 index 00000000..b9698f7e Binary files /dev/null and b/public/images/blog/blog-tablepro-0-83-beta-1-light-704.webp differ diff --git a/public/images/blog/blog-tablepro-0-83-beta-1-light-722.avif b/public/images/blog/blog-tablepro-0-83-beta-1-light-722.avif new file mode 100644 index 00000000..efdda906 Binary files /dev/null and b/public/images/blog/blog-tablepro-0-83-beta-1-light-722.avif differ diff --git a/public/images/blog/blog-tablepro-0-83-beta-1-light-722.webp b/public/images/blog/blog-tablepro-0-83-beta-1-light-722.webp new file mode 100644 index 00000000..ce612b75 Binary files /dev/null and b/public/images/blog/blog-tablepro-0-83-beta-1-light-722.webp differ diff --git a/public/images/blog/blog-tablepro-0-83-beta-2-light-1408.avif b/public/images/blog/blog-tablepro-0-83-beta-2-light-1408.avif new file mode 100644 index 00000000..31328a6a Binary files /dev/null and b/public/images/blog/blog-tablepro-0-83-beta-2-light-1408.avif differ diff --git a/public/images/blog/blog-tablepro-0-83-beta-2-light-1408.webp b/public/images/blog/blog-tablepro-0-83-beta-2-light-1408.webp new file mode 100644 index 00000000..6aa312fc Binary files /dev/null and b/public/images/blog/blog-tablepro-0-83-beta-2-light-1408.webp differ diff --git a/public/images/blog/blog-tablepro-0-83-beta-2-light-704.avif b/public/images/blog/blog-tablepro-0-83-beta-2-light-704.avif new file mode 100644 index 00000000..82812d97 Binary files /dev/null and b/public/images/blog/blog-tablepro-0-83-beta-2-light-704.avif differ diff --git a/public/images/blog/blog-tablepro-0-83-beta-2-light-704.webp b/public/images/blog/blog-tablepro-0-83-beta-2-light-704.webp new file mode 100644 index 00000000..1c930010 Binary files /dev/null and b/public/images/blog/blog-tablepro-0-83-beta-2-light-704.webp differ diff --git a/public/images/blog/generate-rows-sheet.png b/public/images/blog/generate-rows-sheet.png new file mode 100644 index 00000000..7957753c Binary files /dev/null and b/public/images/blog/generate-rows-sheet.png differ diff --git a/public/images/blog/search-database-results.png b/public/images/blog/search-database-results.png new file mode 100644 index 00000000..64fe7d8d Binary files /dev/null and b/public/images/blog/search-database-results.png differ diff --git a/public/og/blog/tablepro-0-83-beta.png b/public/og/blog/tablepro-0-83-beta.png new file mode 100644 index 00000000..b2c9615b Binary files /dev/null and b/public/og/blog/tablepro-0-83-beta.png differ diff --git a/resources/blog/tablepro-0-83-beta.md b/resources/blog/tablepro-0-83-beta.md new file mode 100644 index 00000000..21bfc903 --- /dev/null +++ b/resources/blog/tablepro-0-83-beta.md @@ -0,0 +1,69 @@ +--- +slug: tablepro-0-83-beta +title: "TablePro 0.83 Beta: Search Database and Generate Rows" +description: The 0.83 beta adds Search Database, Generate Rows and a tablepro query command for Terminal. Turn on Get beta updates to try it before 0.83.0. +date: 2026-10-23 +release: "TablePro 0.83 beta" +author: TablePro Team +tags: [release, mcp, ssh, import] +ogPunchline: Find a value in every table, fill one with test rows, and run SQL from Terminal. +--- + +TablePro 0.83.0-beta.2 is out for testing. Only Macs with **Get beta updates** on are offered it, and the stable 0.83.0 comes after the betas. + +Search Database finds a value in every table, Generate Rows fills a table with test data, and `tablepro query` runs SQL from Terminal. Grid saves refuse an `UPDATE` or `DELETE` without a `WHERE`, and SSH tunnels drop SHA-1 and other old algorithms. + + + +## Search Database + +Choose **Database > Search Database…**, or right-click a database or schema in the sidebar, and type a value: an email address, an order number, a UUID. TablePro runs one `SELECT` per table and lists the tables that hold it, with the matching columns and a row count. Open one and it comes up in a new tab, filtered to those rows. + +Text columns are always searched, and number, date and UUID columns when the value reads as one. Counting stops at 1,000 rows per table, and **Stop** keeps what was found so far. + +## Generate Rows + +Right-click a table and choose **Generate Rows…** to fill it with 1 to 1,000,000 made-up rows. Each column gets a generator from its type and name: example-domain addresses for an `email` column, an enum's own labels, an existing key for a foreign key. The preview shows the first 10 rows before anything runs. + + + +Keys and unique columns never repeat, and the same seed and settings give the same rows. **Generate** inserts in one transaction, so **Cancel** rolls the run back on any engine with transactions. Safe Mode treats it like any other write. + +## Queries from Terminal + +`tablepro query` runs one statement through the app and prints the rows as CSV, TSV, JSON, JSON Lines or a table: + +```bash +tablepro query -c Staging --format csv "SELECT id, email FROM users LIMIT 5" > users.csv +``` + +It talks to the app's MCP server, so turn on **Enable MCP Server** in **Settings > MCP** first. The first run asks you to pair it, starting at **Read Only**. **Settings > General > Command Line** shows how to link `tablepro` into your `PATH`, and [the docs](https://docs.tablepro.app/integrations/terminal) cover the options and exit codes. + +## Also in the beta + +- **View > Compare Result With…** matches two query results row by row, on key columns or whole rows +- Import a CSV, JSON or XLSX file into an existing table as **Update**, **Insert or Update** or **Insert, Skip Existing**, or import a folder of files in one run +- **Pin Tab** keeps a tab open through **Close Other Tabs**, **Close All Tabs** and a relaunch +- **Freeze Up to This Column** in the grid's header menu keeps leading columns in view +- Edit the schema from the ER diagram, and export the diagram as SVG, PDF, Mermaid or Graphviz DOT +- Inline suggestions and Review, Explain, Optimize and Fix can run on Apple Intelligence, on macOS 26 and later +- Emacs key bindings, under **Settings > Editor > Key bindings**, which replaces the Vim mode switch +- Kerberos sign-in for PostgreSQL and MariaDB, and Presto connections through the Trino plugin + +## Changes to check + +**SSH tunnels no longer offer SHA-1 key exchange, `ssh-rsa` signatures, SHA-1 and MD5 MACs, or 3DES, Blowfish and RC4 ciphers.** A server that offers only those fails with an error naming them. + +A grid save stops before it sends an `UPDATE` or `DELETE` with no `WHERE` clause. A delete's confirmation lists the rows that foreign keys delete, rewrite or protect in other tables. + +## What it will not do + +- `tablepro query` returns the whole result at once, up to the MCP row limit, and refuses `DROP` and `TRUNCATE` +- Search Database needs SQL, and skips Cassandra, ScyllaDB and DynamoDB +- The iOS app isn't in this beta, though the release notes list its changes + +## Getting the beta + +Select **Get beta updates** in **Settings > General**, then choose **TablePro > Check for Updates…**. The DMG and the full notes are on the [GitHub release](https://github.com/TableProApp/TablePro/releases/tag/v0.83.0-beta.2). + +To go back, deselect **Get beta updates**. The beta stays until 0.83.0 replaces it, and [Beta updates](https://docs.tablepro.app/beta-updates) covers installing the stable release over it sooner. Report a problem in a [GitHub issue](https://github.com/TableProApp/TablePro/issues), with the version from **TablePro > About TablePro**. diff --git a/resources/data/assets.json b/resources/data/assets.json index 11c508ab..a534607c 100644 --- a/resources/data/assets.json +++ b/resources/data/assets.json @@ -11227,6 +11227,112 @@ "/images/blog/set-value-generate-uuid.png" ] }, + "blog-tablepro-0-83-beta-1": { + "kind": "figure", + "type": "screenshot", + "family": "blog", + "ownerRepo": "web", + "slot": true, + "handoffPriority": "P3", + "usedOn": [ + { + "path": "/blog/tablepro-0-83-beta", + "section": "figure-1" + } + ], + "aspect": "722:521", + "priority": false, + "theme": "single", + "locale": "shared", + "mobile": null, + "description": { + "en": "The Search Database sheet after a search for the letter e in a sample SQLite database, listing six tables with their matching columns and row counts.", + "vi": null + }, + "alt": { + "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom", + "vi": null + }, + "caption": { + "en": "Each table that holds the value names the columns that matched and how many rows match.", + "vi": null + }, + "replacement": { + "dir": "public/images/blog", + "base": "blog-tablepro-0-83-beta-1" + }, + "status": "supplied", + "src": { + "light": { + "widths": [ + 704, + 722 + ], + "formats": [ + "avif", + "webp" + ], + "width": 722, + "height": 521 + } + }, + "legacySource": [ + "/images/blog/search-database-results.png" + ] + }, + "blog-tablepro-0-83-beta-2": { + "kind": "figure", + "type": "screenshot", + "family": "blog", + "ownerRepo": "web", + "slot": true, + "handoffPriority": "P3", + "usedOn": [ + { + "path": "/blog/tablepro-0-83-beta", + "section": "figure-2" + } + ], + "aspect": "1640:1122", + "priority": false, + "theme": "single", + "locale": "shared", + "mobile": null, + "description": { + "en": "The Generate Rows sheet set to 100,000 rows with seed 4271, the total column’s Decimal Range generator selected, and a preview of six generated rows.", + "vi": null + }, + "alt": { + "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps", + "vi": null + }, + "caption": { + "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written.", + "vi": null + }, + "replacement": { + "dir": "public/images/blog", + "base": "blog-tablepro-0-83-beta-2" + }, + "status": "supplied", + "src": { + "light": { + "widths": [ + 704, + 1408 + ], + "formats": [ + "avif", + "webp" + ], + "width": 1408, + "height": 963 + } + }, + "legacySource": [ + "/images/blog/generate-rows-sheet.png" + ] + }, "blog-tablepro-for-iphone-1": { "kind": "phone", "type": "screenshot-phone", diff --git a/resources/js/lib/data/asset-locales/de.json b/resources/js/lib/data/asset-locales/de.json index 567019a8..e8fc85a0 100644 --- a/resources/js/lib/data/asset-locales/de.json +++ b/resources/js/lib/data/asset-locales/de.json @@ -1000,6 +1000,22 @@ "en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7." } }, + "blog-tablepro-0-83-beta-1": { + "alt": { + "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom" + }, + "caption": { + "en": "Each table that holds the value names the columns that matched and how many rows match." + } + }, + "blog-tablepro-0-83-beta-2": { + "alt": { + "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps" + }, + "caption": { + "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written." + } + }, "blog-tablepro-for-iphone-1": { "alt": { "en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom" diff --git a/resources/js/lib/data/asset-locales/en.json b/resources/js/lib/data/asset-locales/en.json index ebc635ab..b5165b00 100644 --- a/resources/js/lib/data/asset-locales/en.json +++ b/resources/js/lib/data/asset-locales/en.json @@ -1000,6 +1000,22 @@ "en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7." } }, + "blog-tablepro-0-83-beta-1": { + "alt": { + "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom" + }, + "caption": { + "en": "Each table that holds the value names the columns that matched and how many rows match." + } + }, + "blog-tablepro-0-83-beta-2": { + "alt": { + "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps" + }, + "caption": { + "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written." + } + }, "blog-tablepro-for-iphone-1": { "alt": { "en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom" diff --git a/resources/js/lib/data/asset-locales/es.json b/resources/js/lib/data/asset-locales/es.json index e13552a9..07771e65 100644 --- a/resources/js/lib/data/asset-locales/es.json +++ b/resources/js/lib/data/asset-locales/es.json @@ -1000,6 +1000,22 @@ "en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7." } }, + "blog-tablepro-0-83-beta-1": { + "alt": { + "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom" + }, + "caption": { + "en": "Each table that holds the value names the columns that matched and how many rows match." + } + }, + "blog-tablepro-0-83-beta-2": { + "alt": { + "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps" + }, + "caption": { + "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written." + } + }, "blog-tablepro-for-iphone-1": { "alt": { "en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom" diff --git a/resources/js/lib/data/asset-locales/fr.json b/resources/js/lib/data/asset-locales/fr.json index 547796fa..7623be44 100644 --- a/resources/js/lib/data/asset-locales/fr.json +++ b/resources/js/lib/data/asset-locales/fr.json @@ -1000,6 +1000,22 @@ "en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7." } }, + "blog-tablepro-0-83-beta-1": { + "alt": { + "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom" + }, + "caption": { + "en": "Each table that holds the value names the columns that matched and how many rows match." + } + }, + "blog-tablepro-0-83-beta-2": { + "alt": { + "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps" + }, + "caption": { + "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written." + } + }, "blog-tablepro-for-iphone-1": { "alt": { "en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom" diff --git a/resources/js/lib/data/asset-locales/id.json b/resources/js/lib/data/asset-locales/id.json index f2778b82..86d4dd0b 100644 --- a/resources/js/lib/data/asset-locales/id.json +++ b/resources/js/lib/data/asset-locales/id.json @@ -1000,6 +1000,22 @@ "en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7." } }, + "blog-tablepro-0-83-beta-1": { + "alt": { + "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom" + }, + "caption": { + "en": "Each table that holds the value names the columns that matched and how many rows match." + } + }, + "blog-tablepro-0-83-beta-2": { + "alt": { + "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps" + }, + "caption": { + "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written." + } + }, "blog-tablepro-for-iphone-1": { "alt": { "en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom" diff --git a/resources/js/lib/data/asset-locales/it.json b/resources/js/lib/data/asset-locales/it.json index 9f43733e..dbd0cf52 100644 --- a/resources/js/lib/data/asset-locales/it.json +++ b/resources/js/lib/data/asset-locales/it.json @@ -1000,6 +1000,22 @@ "en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7." } }, + "blog-tablepro-0-83-beta-1": { + "alt": { + "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom" + }, + "caption": { + "en": "Each table that holds the value names the columns that matched and how many rows match." + } + }, + "blog-tablepro-0-83-beta-2": { + "alt": { + "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps" + }, + "caption": { + "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written." + } + }, "blog-tablepro-for-iphone-1": { "alt": { "en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom" diff --git a/resources/js/lib/data/asset-locales/ja.json b/resources/js/lib/data/asset-locales/ja.json index 60d39b4a..bb1e6992 100644 --- a/resources/js/lib/data/asset-locales/ja.json +++ b/resources/js/lib/data/asset-locales/ja.json @@ -1000,6 +1000,22 @@ "en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7." } }, + "blog-tablepro-0-83-beta-1": { + "alt": { + "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom" + }, + "caption": { + "en": "Each table that holds the value names the columns that matched and how many rows match." + } + }, + "blog-tablepro-0-83-beta-2": { + "alt": { + "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps" + }, + "caption": { + "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written." + } + }, "blog-tablepro-for-iphone-1": { "alt": { "en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom" diff --git a/resources/js/lib/data/asset-locales/ko.json b/resources/js/lib/data/asset-locales/ko.json index cc693904..cb0e9789 100644 --- a/resources/js/lib/data/asset-locales/ko.json +++ b/resources/js/lib/data/asset-locales/ko.json @@ -1000,6 +1000,22 @@ "en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7." } }, + "blog-tablepro-0-83-beta-1": { + "alt": { + "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom" + }, + "caption": { + "en": "Each table that holds the value names the columns that matched and how many rows match." + } + }, + "blog-tablepro-0-83-beta-2": { + "alt": { + "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps" + }, + "caption": { + "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written." + } + }, "blog-tablepro-for-iphone-1": { "alt": { "en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom" diff --git a/resources/js/lib/data/asset-locales/pt-BR.json b/resources/js/lib/data/asset-locales/pt-BR.json index 48f42b65..28751476 100644 --- a/resources/js/lib/data/asset-locales/pt-BR.json +++ b/resources/js/lib/data/asset-locales/pt-BR.json @@ -1000,6 +1000,22 @@ "en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7." } }, + "blog-tablepro-0-83-beta-1": { + "alt": { + "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom" + }, + "caption": { + "en": "Each table that holds the value names the columns that matched and how many rows match." + } + }, + "blog-tablepro-0-83-beta-2": { + "alt": { + "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps" + }, + "caption": { + "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written." + } + }, "blog-tablepro-for-iphone-1": { "alt": { "en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom" diff --git a/resources/js/lib/data/asset-locales/vi.json b/resources/js/lib/data/asset-locales/vi.json index 805faa2f..4c35627f 100644 --- a/resources/js/lib/data/asset-locales/vi.json +++ b/resources/js/lib/data/asset-locales/vi.json @@ -1000,6 +1000,22 @@ "en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7." } }, + "blog-tablepro-0-83-beta-1": { + "alt": { + "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom" + }, + "caption": { + "en": "Each table that holds the value names the columns that matched and how many rows match." + } + }, + "blog-tablepro-0-83-beta-2": { + "alt": { + "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps" + }, + "caption": { + "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written." + } + }, "blog-tablepro-for-iphone-1": { "alt": { "en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom" diff --git a/resources/js/lib/data/asset-locales/zh-Hans.json b/resources/js/lib/data/asset-locales/zh-Hans.json index 40a08b5e..b4bfce2e 100644 --- a/resources/js/lib/data/asset-locales/zh-Hans.json +++ b/resources/js/lib/data/asset-locales/zh-Hans.json @@ -1000,6 +1000,22 @@ "en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7." } }, + "blog-tablepro-0-83-beta-1": { + "alt": { + "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom" + }, + "caption": { + "en": "Each table that holds the value names the columns that matched and how many rows match." + } + }, + "blog-tablepro-0-83-beta-2": { + "alt": { + "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps" + }, + "caption": { + "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written." + } + }, "blog-tablepro-for-iphone-1": { "alt": { "en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom" diff --git a/resources/js/lib/data/asset-locales/zh-Hant.json b/resources/js/lib/data/asset-locales/zh-Hant.json index c9ffdbb4..49643d44 100644 --- a/resources/js/lib/data/asset-locales/zh-Hant.json +++ b/resources/js/lib/data/asset-locales/zh-Hant.json @@ -1000,6 +1000,22 @@ "en": "On a uuid key with no default, Set Value offers Generate UUID and Generate UUIDv7." } }, + "blog-tablepro-0-83-beta-1": { + "alt": { + "en": "Search Database sheet for the Fixture connection’s seeded-0.sqlite, reading Searched 6 tables. 6 tables hold “e” above six results with their matching columns and row counts: album by title with 2 rows, artist by name with 2 rows, document by label and payload with 2 rows, genre by name with 1 row, note by tag with 1 row and track by name with 9 rows, and Edit Search, Done and Open buttons at the bottom" + }, + "caption": { + "en": "Each table that holds the value names the columns that matched and how many rows match." + } + }, + "blog-tablepro-0-83-beta-2": { + "alt": { + "en": "Generate Rows sheet with Rows set to 100,000 and Seed 4271, a column list of id as Server Default, customer_id as Referenced Value, customer_email as Email, status as List of Values, total as Decimal Range, note as Text and created_at as Date and Time, the selected total column of type numeric(10,2) with a Decimal Range from 1 to 1000 at 2 decimal places, and a preview of six rows with example.com, example.net and example.org addresses, statuses such as paid, cancelled and shipped, totals, lorem ipsum notes and timestamps" + }, + "caption": { + "en": "Each column starts from a generator picked by its type and name, and the preview shows the rows before anything is written." + } + }, "blog-tablepro-for-iphone-1": { "alt": { "en": "The Chinook Track table open in TablePro on iPhone, listing TrackId, Name, AlbumId and MediaTypeId for the first rows, with a pager reading 1-100 of 3503 and Tables, Query, History and Info along the bottom" diff --git a/resources/js/lib/data/asset-slots.json b/resources/js/lib/data/asset-slots.json index 990349a1..c80acce6 100644 --- a/resources/js/lib/data/asset-slots.json +++ b/resources/js/lib/data/asset-slots.json @@ -5423,6 +5423,64 @@ "base": "blog-tablepro-0-82-3" } }, + "blog-tablepro-0-83-beta-1": { + "kind": "figure", + "type": "screenshot", + "slot": true, + "aspect": "722:521", + "priority": false, + "theme": "single", + "locale": "shared", + "mobile": null, + "status": "supplied", + "src": { + "light": { + "widths": [ + 704, + 722 + ], + "formats": [ + "avif", + "webp" + ], + "width": 722, + "height": 521 + } + }, + "replacement": { + "dir": "public/images/blog", + "base": "blog-tablepro-0-83-beta-1" + } + }, + "blog-tablepro-0-83-beta-2": { + "kind": "figure", + "type": "screenshot", + "slot": true, + "aspect": "1640:1122", + "priority": false, + "theme": "single", + "locale": "shared", + "mobile": null, + "status": "supplied", + "src": { + "light": { + "widths": [ + 704, + 1408 + ], + "formats": [ + "avif", + "webp" + ], + "width": 1408, + "height": 963 + } + }, + "replacement": { + "dir": "public/images/blog", + "base": "blog-tablepro-0-83-beta-2" + } + }, "blog-tablepro-for-iphone-1": { "kind": "phone", "type": "screenshot-phone", diff --git a/tests/Feature/Landing/BlogTest.php b/tests/Feature/Landing/BlogTest.php index 239bac42..f8e7b4c5 100644 --- a/tests/Feature/Landing/BlogTest.php +++ b/tests/Feature/Landing/BlogTest.php @@ -25,6 +25,7 @@ // A post keeps the date it was published; an edit never re-dates it. const BLOG_PUBLISHED = [ + 'tablepro-0-83-beta' => '2026-10-23', 'tablepro-0-82' => '2026-10-20', 'tablepro-0-81' => '2026-10-16', 'tablepro-0-80' => '2026-10-11', @@ -131,7 +132,7 @@ function blogSlotIds(string $html): array ->where('posts.0.url', '/blog/' . $expected[0]) ->where('posts.0.locale', 'en') ->where('posts.0.date', BLOG_PUBLISHED[$expected[0]]) - ->where('posts.0.dateFormatted', 'October 20, 2026') + ->where('posts.0.dateFormatted', 'October 23, 2026') ->where('posts', fn($posts): bool => collect($posts)->every( fn(array $post): bool => $post['kind'] === (array_key_exists($post['slug'], BLOG_GUIDES) ? 'guide' : 'release'), ))); @@ -426,7 +427,7 @@ function blogSlotIds(string $html): array $this->get('/blog/tablepro-0-76') ->assertOk() ->assertInertia(fn(AssertableInertia $page) => $page - ->where('related.0.slug', 'tablepro-0-77') + ->where('related.0.slug', 'tablepro-0-83-beta') ->where('related.1.slug', 'tablepro-0-70') ->where('related.2.slug', 'tablepro-0-67')); }); @@ -445,14 +446,14 @@ function blogSlotIds(string $html): array ->where('seo.alternates', fn($alternates): bool => collect($alternates)->pluck('hreflang')->all() === ['en', 'vi']) ->missing('content.seo.indexable') ->has('posts', count(BLOG_GUIDES) + count(BLOG_PUBLISHED)) - ->where('posts', fn($posts): bool => collect($posts)->slice(3, $guides)->every( + ->where('posts', fn($posts): bool => collect($posts)->slice(4, $guides)->every( fn(array $post): bool => $post['kind'] === 'guide' && $post['locale'] === 'vi' && $post['url'] === "/vi/blog/{$post['slug']}", )) - ->where('posts.0.slug', 'tablepro-0-82') + ->where('posts.0.slug', 'tablepro-0-83-beta') ->where('posts.0.locale', 'en') - ->where('posts.0.url', '/blog/tablepro-0-82') - ->where('posts.0.title', blogMatter('tablepro-0-82')['title']) - ->where('posts.0.dateFormatted', '20 tháng 10 năm 2026') + ->where('posts.0.url', '/blog/tablepro-0-83-beta') + ->where('posts.0.title', blogMatter('tablepro-0-83-beta')['title']) + ->where('posts.0.dateFormatted', '23 tháng 10 năm 2026') ->where('localization.switcher.0.href', '/blog')); expect($response->getContent())->toContain('