From 1a9d14c6fa163e52a81750dad6cf43557465838d Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 13 Aug 2026 09:09:58 +0000 Subject: [PATCH] docs(plugin-list): the sort remedy names a stored denormalised field, not a formula (#4335) The README's sorting section prescribed the one field type the server hard- refuses to order by: 'denormalize it onto this object with a formula field and sort that column like any other text column'. A formula value is computed on read, no driver materializes a column for it, and since objectstack#6994 the protocol answers such a sort with a 400 INVALID_SORT (UNMATERIALIZED_SORT_TYPES). objectui#4243 also withholds formula fields from the sort picker, so the 'like any other text column' clause described a column the picker never offers. Rewrite the remedy in the vocabulary the refusal door and the #4294-landed sort panel hint now share -- a stored field, written when the source changes -- name the refusal explicitly, and repair the trailing clause. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_017Qqyix2QcnpUC9XeYVDzx3 --- packages/plugin-list/README.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/plugin-list/README.md b/packages/plugin-list/README.md index 5eb22c2403..cfd970ba38 100644 --- a/packages/plugin-list/README.md +++ b/packages/plugin-list/README.md @@ -227,10 +227,22 @@ user's side). The server cannot order by the related name without a join, and `objectstack#4256` settled that it will not add one. So the sort picker withholds relational fields and says so. To sort by a related -record's name, denormalize it onto this object with a **formula field** and sort -that column like any other text column. A relational field that the view's -CURRENT sort already uses stays listed, labelled `(by ID)`, so existing view -metadata round-trips instead of silently losing its sort. +record's name, denormalize that name onto this object as a **stored field, +written when the source changes**, then sort by that field — the remedy the +server's own refusal prescribes, in the same words the sort panel's hint uses. + +**Not a formula field.** A formula value is computed on read, so no driver +materializes a column behind it, and since `objectstack#6994` the server answers +a sort that names one with a hard `400 INVALID_SORT` (before that it degraded +silently: the rows came back in an arbitrary order under a `200`, `asc` and +`desc` identical). The picker withholds formula fields for the same reason +(`objectui#4243`), so there is no formula column here to sort "like any other +text column" — the column you sort is the stored one the denormalization writes. + +A field the view's CURRENT sort already uses stays listed under both rules — +relational ones labelled `(by ID)` — so existing view metadata round-trips +instead of silently losing its sort, and a sort the server would refuse can +still be edited away in the picker that otherwise hides its field. Column-header sorting inside the grid is unaffected: it is client-side over the rows already loaded, where the label the cell shows IS available, so it orders by