From f445714528dbee893a36ccba82dc14e51a3cbfd6 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 28 Oct 2026 16:13:46 +0000 Subject: [PATCH] docs(skills): the objectstack-ui report example declares its download in exportOptions under the base object's allowExport The Report Configuration example in rules/dashboards.md taught dateRange and not exportOptions. The example now declares exportOptions with formats csv / xlsx and names the optional includeHeaders / fileNamePrefix in a trailing comment; the note block says who may download is the base object's permission-set allowExport and that a joined report takes neither dateRange nor exportOptions. Paid under the token ratchet by folding the dateGranularity bullet (taught under Server-side date bucketing) and the drilldown sentence (taught under Drilldown): 6221 -> 6214 tokens, ceiling untouched. Claude-Session: https://claude.ai/code/session_01QSeKYmhU5KEj1nukYhp1Tg Co-authored-by: Claude --- .changeset/26777-report-export-options-rule.md | 10 ++++++++++ skills/objectstack-ui/rules/dashboards.md | 11 +++++------ 2 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 .changeset/26777-report-export-options-rule.md diff --git a/.changeset/26777-report-export-options-rule.md b/.changeset/26777-report-export-options-rule.md new file mode 100644 index 00000000000..fe7b4597ecd --- /dev/null +++ b/.changeset/26777-report-export-options-rule.md @@ -0,0 +1,10 @@ +--- +'@objectstack/skills': patch +--- + +docs(skills): the objectstack-ui report example declares its download in `exportOptions` under the base object's `allowExport` + +Clause-②: no +Metadata-protocol: none + +`rules/dashboards.md` 〈Report Configuration〉 taught a report's `dateRange` and not its `exportOptions`: the example now declares `exportOptions: { formats: ['csv', 'xlsx'] }` (optional `includeHeaders` / `fileNamePrefix`) and the note says who may download is the base object's permission-set `allowExport` and that a `joined` report takes neither key, paid for by folding the `dateGranularity` and `drilldown` restatements that the same file already teaches under Server-side date bucketing and Drilldown. diff --git a/skills/objectstack-ui/rules/dashboards.md b/skills/objectstack-ui/rules/dashboards.md index 6c7a0f43426..b5223630913 100644 --- a/skills/objectstack-ui/rules/dashboards.md +++ b/skills/objectstack-ui/rules/dashboards.md @@ -398,21 +398,17 @@ export const PipelineCoverageReport = defineReport({ runtimeFilter: { stage: { $ne: 'closed_lost' } }, // Period: ONE `type: 'date'` dataset dimension, not a dashboard-style raw `field`. dateRange: { dimension: 'close_date', defaultRange: 'this_year' }, + exportOptions: { formats: ['csv', 'xlsx'] }, // the download; optional `includeHeaders`, `fileNamePrefix` order: [{ by: 'amount_sum', direction: 'desc' }], // by measure; dates default to chronological chart: { type: 'bar', xAxis: 'forecast_category', yAxis: 'amount_sum' }, }); ``` -> **`dateGranularity`** lives on the dataset's date **dimension** -> (`day | week | month | quarter | year`); selecting that dimension buckets the -> field server-side in a single aggregate query — do **not** pre-compute virtual -> columns for this. > **`rows`** are the report's grouping dimensions (selected from the dataset by > name). A `summary` groups *down* by `rows`. A `matrix` pivots `rows` (down) × > **`columns`** (across, ADR-0021 D2) with `values` in the cells — do **not** > put both axes in `rows`. Multi-level grouping on either axis = multiple -> dimension names in that array. `drilldown` (default `true`) makes cells -> click-through to the underlying records. +> dimension names in that array. > **`order`** sorts the result server-side — a list of `{ by, direction }`, most > significant key first. `by` must be a `rows`/`columns` dimension or a `values` > measure the report actually selects (anything else is an authoring error). A @@ -420,6 +416,9 @@ export const PipelineCoverageReport = defineReport({ > matrix reads left-to-right in time with no `order` at all; list the `columns` > key first when the across-axis header sequence is what matters. A `joined` > report orders per block (`blocks[].order`), never on the container. +> **`exportOptions`** declares the download, never who may download — that is the +> base object's permission-set `allowExport`; a `joined` report takes neither +> `dateRange` nor `exportOptions`. ---