@object-ui/plugin-dashboard 17.5.0 → 17.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,528 @@
1
1
  # @object-ui/plugin-dashboard
2
2
 
3
+ ## 17.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 4dbcae7: BREAKING: `dashboardComponents` is re-keyed from 11 PascalCase component class
8
+ names to the 8 schema `type` keys the package actually registers
9
+ (`dashboard`, `metric`, `metric-card`, `object-metric`, `pivot`,
10
+ `object-pivot`, `dashboard-grid`, `object-data-table`), aligning the map with
11
+ its four sibling `*Components` maps (objectui#5064, Route A per the
12
+ 2026-08-18 maintainer ruling). Every value is the exact component the
13
+ side-effect import registers for that type — for the two `object-*` types
14
+ that is the internal data-source-gate wrapper, not the exported widget. The
15
+ three config-panel components (`DashboardConfigPanel`, `WidgetConfigPanel`,
16
+ `DashboardWithConfig`) leave the map; they remain named exports. Any code
17
+ reading the old keys (e.g. `dashboardComponents.DashboardRenderer`) breaks —
18
+ two independent word-boundary greps measured zero such consumers in-tree.
19
+ Per AGENTS.md §版本号策略, objectui's major tracks `@objectstack`'s major, not
20
+ its own breaking-change count — this package's own breaking changes are
21
+ scored `minor` with the break spelled out in this body, which is what makes
22
+ this a `minor` (maintainer ruling, 2026-08-19).
23
+ - 58398ba: fix(plugin-dashboard): `ObjectDataTable` resolves column identity before it hands columns to the table
24
+
25
+ `normalizeColumns` converted the `string[]` shorthand and returned every object
26
+ column **raw**. `data-table` is an adapter, and its column key is `accessorKey`
27
+ (`TableColumn.accessorKey`) — a key `@object-ui/core` deliberately holds outside
28
+ the metadata identity fold, where `column-identity.ts` names it
29
+ `TABLE_ADAPTER_COLUMN_KEY`. So a column authored in the spec-canonical spelling,
30
+ `{ field: 'stage' }`, reached the adapter carrying no `accessorKey` at all: the
31
+ widget rendered a header over `row[undefined]` — every cell blank, nothing said
32
+ — and `computeLookupExpand`'s `$expand` whitelist, which resolved
33
+ `c.accessorKey || c.name`, missed the same column, so a `field`-spelled lookup
34
+ also lost its related record and showed a raw FK id.
35
+
36
+ Identity is now resolved once, here, through the shared `columnIdentity` reader
37
+ and stamped onto the adapter's key. This is the move objectui#5022 made in
38
+ `RelatedList` and objectui#5068 generalized in `ObjectGrid`: metadata vocabulary
39
+ in, adapter vocabulary out, one translation in one place.
40
+
41
+ **Affected input.** A column authored `{ field: … }` on an `object-data-table`
42
+ now renders its cells and, when the field is relational, enters `$expand`. Both
43
+ were previously empty. Columns authored `{ accessorKey: … }` are untouched, by
44
+ reference. An author-supplied `accessorKey` is never overwritten — a deliberate
45
+ divergence between the table slot and the metadata key belongs to the author —
46
+ and an entry whose identity resolves to nothing is returned untouched, so
47
+ nothing is invented for it.
48
+
49
+ The other half of objectui#5120 — retiring `data-table`'s undeclared `col.name`
50
+ alias — is **not** in this change. The card's census-first fork clause tripped:
51
+ `skills/objectui/guides/data-integration.md` and
52
+ `skills/objectui/guides/schema-expressions.md` both instruct authors to spell a
53
+ `data-table` column `{ "name": …, "label": … }`, so the limb has real authorized
54
+ usage and the deletion went back to the maintainer. This change is a
55
+ prerequisite for that deletion rather than a substitute: it is what stops
56
+ `object-data-table` from depending on the alias.
57
+ - f6fc565: `ObjectMetricWidgetProps` now speaks `@objectstack/spec`'s `I18nLabel` vocabulary on `label`, `trend.label`, `description` and `title`.
58
+
59
+ These four members still declared `string | { key?: string; defaultValue?: string }`
60
+ — the key-reference label form `@objectstack/spec` RETIRED at 17.0.0-rc.6
61
+ (objectstack#5055). The sibling `MetricWidgetProps` was migrated to
62
+ `string | I18nLabel` for exactly this reason in objectui#4358; this interface was
63
+ missed in that pass, and it was the last declaration of the retired shape in any
64
+ package's shipped `src` (objectui#5264).
65
+
66
+ It was not inert. `ObjectMetricWidget` forwards `label` / `description` / `trend`
67
+ straight to `MetricWidget`, which resolves them with `pickLocalized`. The retired
68
+ object matches no locale limb, so resolution fell through to that resolver's last
69
+ resort — the first string property in insertion order — and a metric authored in
70
+ the natural `{ key, defaultValue }` spelling painted the RAW DOTTED TRANSLATION KEY
71
+ onto the KPI card as its visible label. Written the other way round the English
72
+ fell out instead. That property-order dependence is why the defect never read as
73
+ systematic in review.
74
+
75
+ Breaking semantics, stated per this repo's version policy (objectui's own
76
+ breaking changes ship as `minor` so the fixed group's major stays aligned with
77
+ `@objectstack`; see AGENTS.md §版本号策略):
78
+
79
+ - **What starts type-checking:** the inline per-locale map — `label={{ en:
80
+ 'Revenue', 'zh-CN': '收入' }}` — which is the ONLY object form the spec admits
81
+ today. Against the old declaration it was a compile error (TS2322/TS2353,
82
+ excess property `en`), so a consumer writing the correct vocabulary could not
83
+ build. This is the substance of the change and it is a WIDENING.
84
+ - **What stops type-checking:** nothing in practice. `I18nLabel`'s object half is
85
+ `InlineLocaleMap`, which erases to `Record<string, string>` in the emitted
86
+ `.d.ts` — the BCP-47 key regex is a Zod runtime refinement and does not survive
87
+ into the type — so `{ key, defaultValue }` remains structurally assignable. The
88
+ retired form is refused where refusal is expressible: `I18nLabelSchema` rejects
89
+ it at authoring time, in both property orders. No renderer-side tolerance was
90
+ added for it (AGENTS.md #0.1).
91
+ - **Behaviour change on the drill-down panel title.** `drawerTitle` read
92
+ `title?.defaultValue` / `label?.defaultValue` directly. An inline per-locale map
93
+ has no such limb, so an authored drill title resolved to `''` and the drawer
94
+ silently fell back to the literal word "Details". It now resolves through the
95
+ same `pickLocalized` and the same UI language as the tile, so the drawer and the
96
+ card that opened it can no longer disagree. A metric still passing the retired
97
+ form (only reachable by cast, or from stored metadata) sees the drawer follow
98
+ the card instead of diverging from it.
99
+ - 9ce096f: Give a chart bucket an identity distinct from its display label
100
+
101
+ objectui#4508. `buildChartSeries` used the bucket's DISPLAY string as the
102
+ bucket's own key, so two pairs of genuinely different groups were conflated —
103
+ and the segment click that drills a bar back to its records inherited both
104
+ conflations. The maintainer ruling (2026-08-14) approved the sentinel-identity
105
+ direction, aligning the chart branch with the distinct-bucket-id form the pivot
106
+ TABLE (`buildPivot`) already uses over the same dataset rows.
107
+
108
+ Two collisions, one cause:
109
+
110
+ - **A null group and an empty-string group drew ONE bar.** The pivot branch
111
+ keyed buckets by `String(xRaw ?? '')`, which spells `null` and `''`
112
+ identically. The bar took its label from whichever row created the bucket, and
113
+ the other group's segment then resolved to no row at all — a visible bar whose
114
+ click did nothing.
115
+ - **A record whose stored value spells the bucket label stole the null bucket's
116
+ drill.** A row storing the literal text `(None)` (or any localized
117
+ `chart.nullCategory` — `(未指定)` and the other nine packs) kept its own
118
+ bucket, so two bars carried the same axis text and BOTH resolved to the first.
119
+ That one is a wrong drill, not a dead one: clicking the null bucket's bar
120
+ opened the drawer on another group's records.
121
+
122
+ What changed:
123
+
124
+ - **`chartBucketId`** (`@object-ui/core`) is the bucket identity — the SAME
125
+ encoder `buildPivot` keys its buckets with (`pivotBucketId` over
126
+ `pivotDimensionValue`), so the two surfaces stop answering one question two
127
+ ways. The pivot branch now buckets by it, which is what makes null and `''`
128
+ two groups again.
129
+ - **`CHART_BUCKET_ID_KEY`** carries that identity on an emitted row, written
130
+ exactly where two DISTINCT buckets paint the same axis text — the complete set
131
+ of cases where the display string cannot name what was clicked. An ordinary
132
+ chart's rows are returned untouched (by identity), so no renderer-internal key
133
+ reaches an authoring surface.
134
+ - **`findChartSeriesRow`** takes that identity back as `options.bucketId` and
135
+ treats it as authoritative. The renderers forward it: the drill event gains
136
+ `categoryId` (`ChartSegmentClickEvent`, now declared once in
137
+ `@object-ui/core` instead of inline in three packages), `AdvancedChartImpl`
138
+ reads it off the clicked row on the cartesian, pie and funnel paths, and
139
+ `DatasetWidget.handleChartDrill` hands it to the lookup.
140
+
141
+ Behaviour change worth noting: an empty-string category no longer resolves to a
142
+ null-valued row. That tolerance was justified as the drill layer's own spelling
143
+ of "no group value", but no producer of this lookup's `category` writes it,
144
+ while `''` IS the axis text a genuine empty-string group paints — so the
145
+ tolerance was giving that group's bar a different group's records. A host that
146
+ forwards no `categoryId` keeps its existing drill unchanged.
147
+
148
+ ### Patch Changes
149
+
150
+ - ef0d150: The dashboard config sidebar translates: `WidgetConfigPanel` and `DashboardConfigPanel` are wired through `t()`.
151
+
152
+ Both panels build a `ConfigPanelSchema` — breadcrumb, section titles, field
153
+ labels, placeholders, help text and option labels — and neither imported a
154
+ translation hook at all, so all 61 of their user-visible strings were English
155
+ literals. Both are exported from the package barrel and mounted by
156
+ `DashboardWithConfig` as the dashboard editing sidebar, so a user on any
157
+ non-English console opened a panel that stayed English inside chrome that had
158
+ translated around it.
159
+
160
+ They now resolve through a new `dashboard.config.*` namespace — 75 keys, added
161
+ to all ten locale packs. The namespace sits beside `dashboard.trend.*` and
162
+ `dashboard.filters.*`, which is where this package's other translated surfaces
163
+ already read from, and the panels reach it through
164
+ `useConfigPanelTranslation`, a `createSafeTranslation` hook whose
165
+ `CONFIG_PANEL_DEFAULT_TRANSLATIONS` map carries the English defaults for hosts
166
+ that mount no `I18nProvider`.
167
+
168
+ The keys are authored fresh against the wording the panels actually ship rather
169
+ than restored from the retired `configPanel.*` block: that vocabulary had no
170
+ reader, was never validated against a shipped label, and covered 16 of the 61
171
+ strings. Where the two name the same word the translations are reused.
172
+
173
+ Every `en` pack value and every built-in default is byte-identical to the
174
+ literal it replaces, so English rendering and provider-less rendering are
175
+ unchanged — asserted row by row, in both directions, against a frozen table of
176
+ the pre-change literals.
177
+ - 375efb4: Publish the authoring surfaces of the four GA `object-*` blocks
178
+
179
+ `object-form`, `object-grid`, `object-master-detail-form` and `object-metric`
180
+ each honoured far more keys than they declared as registry `inputs`. An author —
181
+ very often an AI author — who wrote one of the undeclared keys got an
182
+ `unknown-prop` report from `sdui-parser` on a key that works, while the designer
183
+ panel and the generated `sdui-intrinsics.d.ts` denied it existed.
184
+
185
+ 68 keys are now declared with descriptions written to teach correct authoring:
186
+ `object-form` +20 (record binding, button labels, post-submit behaviour, mobile
187
+ overrides), `object-grid` +21 (sorting, pagination, grouping, selection, row and
188
+ bulk actions, navigation, export), `object-master-detail-form` +10, and
189
+ `object-metric` +14 (formatting, comparison, drill-down). No renderer behaviour
190
+ changes — this documents what already shipped, so the manifest, the generated
191
+ `.d.ts`, the designer panel and the renderers finally agree.
192
+
193
+ Ten of `object-grid`'s spec-declared keys are deliberately NOT published:
194
+ its own `@deprecated` legacy spellings (`fields`, `staticData`, `selectable`,
195
+ `pageSize`, `showSearch`, `showPagination`, `defaultSort`, `defaultFilters`,
196
+ `resizableColumns`, `title`). The renderer keeps reading them so existing
197
+ documents render, but recommending a deprecated alias as new authoring surface
198
+ would harden it into a second dialect. Each canonical replacement — `columns`,
199
+ `data`, `selection`, `pagination`, `searchableFields`, `sort`, `filter`,
200
+ `resizable`, `label` — is declared, and each carries a description naming the
201
+ legacy spelling it supersedes.
202
+ - bea374e: A KPI card's sub-caption now translates from its own convention key
203
+
204
+ objectui#4032 item 4. The metric card renders two authored strings, and they
205
+ are two different authored fields:
206
+
207
+ | authored field | rendered as | bundle key |
208
+ |-----------------------|-------------------------|-------------------------------------------|
209
+ | `widget.description` | the shared card header | `dashboards.<d>.widgets.<id>.description` |
210
+ | `options.description` | the KPI sub-caption | `dashboards.<d>.widgets.<id>.subCaption` |
211
+
212
+ Only the first resolved. The metric dispatch spread `...options` straight
213
+ through, so the sub-caption reached `MetricWidget` as the raw authored English
214
+ and a `zh` dashboard showed a translated header above an untranslated caption.
215
+
216
+ They get two keys, not one — the objectstack#5428 item-4 ruling (2026-08-06):
217
+ "两个作者字段两个 key". That is why PR #4358 landed items 1-3 and deliberately
218
+ stopped here: at the time `@objectstack/spec` accepted no segment for the
219
+ sub-caption and the only key it would take was `description`, the shared key the
220
+ ruling forbids. objectstack#8056 added `subCaption` to the widget translation
221
+ node, and it ships in `@objectstack/spec@17.0.0` — the version this repo pins.
222
+
223
+ The server half already existed: `translateDashboard` overlays `subCaption` onto
224
+ `options.description` on the `/meta` path, so a served document was already
225
+ correct. This is the client half — the same key path, for the app bundles
226
+ objectui loads into `I18nProvider` itself.
227
+
228
+ - `@object-ui/i18n` gains `widgetSubCaption(dashboardName, widgetId, fallback?)`,
229
+ mirroring `widgetDescription` limb for limb rather than re-implementing
230
+ namespace discovery inside the plugin.
231
+ - `DashboardRenderer`'s `tWidgetSubCaption` composes the two channels in the
232
+ order `tWidgetTitle` already fixed — the authored value is collapsed to the
233
+ active language first (an inline per-locale map, the `pickLocalized` seam),
234
+ and the plain string that falls out is offered to the bundle as its fallback —
235
+ so a bundle entry always wins over an inline map, and neither channel is
236
+ replaced by the other. The resolved value is assigned after the `...options`
237
+ spread in both the `object-metric` and static-value branches.
238
+
239
+ The separation is pinned in both directions, because a shared key is exactly
240
+ what a later tidy-up would reach for: the `description` key never reaches
241
+ `options.description`, and `subCaption` never reaches `widget.description`. On a
242
+ `kpi` / `gauge` / `bullet` widget both are on screen at once, so one shared key
243
+ would make a single translation entry overwrite the other field's text.
244
+
245
+ Untranslated dashboards are unchanged: with no bundle entry the resolver hands
246
+ back exactly what the spread would have, and with nothing authored and nothing
247
+ translated it answers `undefined` rather than `''`, so a card that has no
248
+ sub-caption grows no caption row.
249
+ - e6cd3c2: Docs only: `packages/plugin-dashboard/README.md`'s TypeScript section no longer
250
+ imports two type names that exist nowhere (objectui#5015). Every README import was
251
+ judged against the entry module's real export surface — 20 names, read from the
252
+ build product's `dist/index.d.ts` through the TypeScript compiler API — and every
253
+ corrected snippet was type-checked against that same build product under `strict`.
254
+
255
+ - **`DashboardSchema`** — taught as the dashboard's schema type, imported from this
256
+ package. Not on its export surface, and not on `@object-ui/types`' either. It
257
+ *looks* present because it occurs in three comments here
258
+ (`src/DashboardRenderer.tsx:884`, `src/DashboardGridLayout.tsx:76` and `:88`) and
259
+ as the name of the metadata-level Zod schema in `@objectstack/spec/ui` — an
260
+ identifier grep hits both, an export-surface check hits neither. The authored
261
+ type does exist under its real name, so the example is rewritten around it rather
262
+ than dropped: `DashboardComponentSchema` from `@object-ui/types`.
263
+ - **`MetricCardSchema`** — pure fiction: zero hits repo-wide under a word boundary,
264
+ outside this README. There is no per-widget-family schema type at all — one
265
+ `DashboardWidgetSchema` covers every `type`, and family-specific settings live
266
+ under `options` — so the name could not be corrected to a sibling. The example now
267
+ types its widgets as `DashboardWidgetSchema` and shows the three authored forms
268
+ the type really carries: a dataset-bound KPI, a static single-value widget with
269
+ its number under `options`, and a registered component node in the widget's
270
+ `component` slot.
271
+
272
+ The section also states what the type set does *not* cover, because the old snippet
273
+ implied otherwise: `value`, `trend` and `trendValue` are `MetricCard`'s **component**
274
+ props, and `DashboardWidgetSchema` declares none of the three (each measured on its
275
+ own, since the first excess property short-circuits the rest of the diagnostic).
276
+ `MetricCard`'s props interface is not on this package's export surface either.
277
+
278
+ No export was added, re-exported or renamed to make the old names true, and the
279
+ package's real `dashboardComponents` export is untouched. No code, types or runtime
280
+ behaviour change — the diff is one README and this changeset. The correction reaches
281
+ npm with the package's next publish, which is why it declares a patch: `README.md`
282
+ is in the package's published `files`.
283
+ - 671c0d3: `packages/plugin-dashboard/README.md`: two teaching snippets did not survive being
284
+ copied. Both were verified against the package's **build artifact**
285
+ (`dist/index.d.ts`) — export names via the TS compiler API
286
+ (`checker.getExportsOfModule`), each changed TypeScript block compiled against
287
+ those same declarations under `strict`.
288
+
289
+ - **The `onSchemaChange` persistence example (`TS2345` as written).** The callback
290
+ receives a `DashboardComponentSchema`, whose `name` is optional (`BaseSchema.name`
291
+ in `@object-ui/types`), and `client.meta.saveItem(type, name, item)` declares
292
+ `name: string` (`@objectstack/client@17.0.0`) — so
293
+ `saveItem('dashboard', next.name, next)` is `Argument of type 'string | undefined'
294
+ is not assignable to parameter of type 'string'` in any `strict` consumer. This was
295
+ the one snippet on the page marked `✅ Preferred`, directly under the paragraph
296
+ telling readers that persistence is theirs to wire, i.e. the block most likely to be
297
+ copied whole. It now handles the missing name explicitly (narrow, then write) and
298
+ says why in prose: the type requires it, and what the server does with an absent
299
+ name is **not** measured here, so the example declines to send one rather than
300
+ guessing. No production code was touched to make the old line true — `name` stays
301
+ optional, and the identity question for SDUI dashboard nodes stays with objectui#4600.
302
+ - **The `Object.entries(dashboardComponents).forEach(register)` loop.** `dashboardComponents`
303
+ is a real export, but its eleven keys are component class names
304
+ (`DashboardRenderer`, `MetricCard`, `WidgetConfigPanel`, …), not schema types — so
305
+ the loop registered eleven names no schema author writes, tripped the
306
+ no-namespace deprecation warning once per key
307
+ (`packages/core/src/registry/Registry.ts:198`), and registered none of the eight
308
+ types this package actually claims. It did not need to: those eight are already
309
+ registered by the side-effect import on the line above it. The section is replaced
310
+ by the family form used for the sibling plugins — the real register-key table
311
+ (`view:dashboard`, `plugin-dashboard:metric`, `metric-card`, `object-metric`,
312
+ `pivot`, `object-pivot`, `dashboard-grid`, `object-data-table`, with the bare-name
313
+ fallback rule and the two internal `object-*` wrappers named honestly), plus the
314
+ thing the old snippet was reaching for: registering an exported component under a
315
+ key of your own. `dashboardComponents` itself keeps only a statement of measured
316
+ fact, with no recommended usage, because the shape of that export is under
317
+ adjudication in objectui#5064.
318
+
319
+ No code, types or runtime behaviour change — the diff is one README plus this
320
+ changeset. It declares a patch because `README.md` is in the package's published
321
+ `files`, so the correction reaches npm with the next release.
322
+ - e05db88: A clicked cartesian mark names its own series, and the drill title reads its label
323
+
324
+ objectui#4672, objectui#4682.
325
+
326
+ **The dead pivoted drill.** objectui#4680 fixed what a cartesian click could
327
+ read out of recharts 3's `MouseHandlerDataParam`, and measured the wall it could
328
+ not get past: a chart-level click is an AXIS interaction, and recharts
329
+ dispatches those with `activeDataKey` hard-coded `undefined`, because the shared
330
+ cursor spans every series at that tick. A pivoted dataset chart — 2 dimensions,
331
+ 1 measure, the shape ADR-0021 introduced — needs the series to resolve its drill
332
+ row, so every segment of every such dashboard chart stayed a dead click. The
333
+ series was left unresolved rather than guessed, and the card carried the rest.
334
+
335
+ The answer is the mark itself. This renderer draws the `Bar` / `Line` / `Area`,
336
+ so an item-level `onClick` closes over the very `dataKey` it was rendered with —
337
+ the series is statically known, not inferred from tooltip state.
338
+
339
+ Both handlers fire for one gesture (measured: item first, chart second, sharing
340
+ one `nativeEvent` object), so the item handler does not emit. It RECORDS its
341
+ series, stamped with that gesture, and the chart-level handler composes the one
342
+ event. That is the double-fire answer and the additive property together:
343
+
344
+ - **one click, one drill event**, because there is one emit site — not a second
345
+ event suppressed after the fact;
346
+ - **a click that lands on no mark is untouched**: it records nothing and falls
347
+ through to the objectui#4680 axis answer exactly as shipped — category, bucket
348
+ identity, and the series only where one series is plotted. Empty plot area
349
+ stays category-only, and "drill the whole category" was rejected as a
350
+ different product question. Nothing that resolved before stops resolving; a
351
+ line's `dot={false}` stroke simply GAINS the exact series where it is hit;
352
+ - pairing on the shared DOM event rather than on a flag means a record left by
353
+ one gesture can never be adopted by a later click.
354
+
355
+ The clicked key is forwarded exactly as rendered, `''` included: the
356
+ empty-string second-dimension group draws its own bar since objectui#4673, and
357
+ `''` is falsy, so a truthiness test on the way out would send no series at all
358
+ and leave that bar's drill standing on the reader's coercion instead of on what
359
+ was clicked.
360
+
361
+ **The opaque drill title.** `ChartSegmentClickEvent` gains `seriesLabel`, and
362
+ `DatasetWidget`'s drill drawer titles itself from `seriesLabel ?? series`.
363
+ `ev.series` stays the LOOKUP key — `findChartSeriesRow` resolves it through the
364
+ same assignment `buildChartSeries` made — and only the title reads the label.
365
+
366
+ The two strings are equal for every ordinary group, which is why reading the key
367
+ as a title went unnoticed. They part company when a group's label cannot name
368
+ it: the null bucket beside a record whose stored value literally spells
369
+ `(None)`, which is objectui#4508's collision on the series axis, reachable since
370
+ objectui#4673. Both groups then key by `chartBucketId`, and the drawer opened on
371
+ the right records under the title `Backlog / [null]`. An internal id where a
372
+ label belongs reads as broken DATA rather than as a broken title.
373
+
374
+ Neither string can do the other's job, which is why this is a second field
375
+ rather than a change to the first: the label is not resolvable (it is exactly
376
+ what the colliding groups share) and the key is not showable. `seriesLabel` is
377
+ optional and absent wherever a renderer resolved no label, so every other
378
+ chart's title is byte-identical.
379
+ - 5ffcc14: fix(plugin-report): forward the chart chrome and series presentation `ReportChartSchema` declares (objectui#4877)
380
+
381
+ A report's embedded chart forwarded exactly six keys to the registered chart
382
+ component — `chartType`, `data`, `height`, `isAnimationActive`, `series`,
383
+ `xAxisKey`. Everything else `ReportChartSchema` declares as authorable never
384
+ left the report renderer, so it was inert metadata: the author writes it, the
385
+ schema accepts it, nothing reads it.
386
+
387
+ `showLegend` was the sharpest case because dropping it does not merely ignore
388
+ the author, it INVERTS them: `AdvancedChartImpl` computes
389
+ `legendVisible = showLegend !== false`, so an absent value means the legend is
390
+ on and an explicit `showLegend: false` still drew one.
391
+
392
+ Now lowered, under objectui#4229's ruled data/presentation split:
393
+
394
+ - chrome — `showLegend`, `showDataLabels`, `colors` (both the positional-palette
395
+ array and the per-category record), `subtitle`, `description`, `annotations`,
396
+ `interaction`, `height`;
397
+ - per-series presentation — `color`, `stack`, `type`, `yAxis`, `dashArray`,
398
+ `opacity`, `variant`, matched by `series[].name` so series MEMBERSHIP stays
399
+ with the dataset.
400
+
401
+ `title` is deliberately not forwarded: the report renderer paints it as its own
402
+ heading above the plot, and forwarding it would draw a second one inside the
403
+ chart's frame. `aria` is not lowered either — nothing on this path reads it
404
+ (`AdvancedChartImpl` has no `aria` prop, and this renderer hands the component a
405
+ schema directly rather than through `SchemaRenderer`'s flat ARIA injection), so
406
+ forwarding it would move declared-but-unread one layer down.
407
+
408
+ The two helpers (`chartConfigPresentation`, `mergeAuthoredPresentation`) moved
409
+ from `plugin-dashboard`'s `DatasetWidget` to `@object-ui/core` beside
410
+ `buildChartSeries`, the derivation they merge onto, so both surfaces lower one
411
+ vocabulary once instead of keeping a second copy (the duplication objectui#4389
412
+ filed as a defect). `@object-ui/core` additionally exports `mergeAuthoredSeries`
413
+ — the series merge alone — for a surface whose axes are bare dimension/measure
414
+ NAME strings rather than spec `ChartAxis` objects, which is what a report chart
415
+ declares. `DatasetWidget` re-exports both names, so its public surface and its
416
+ rendering are unchanged.
417
+ - Updated dependencies [88085e3]
418
+ - Updated dependencies [69251bf]
419
+ - Updated dependencies [57e668f]
420
+ - Updated dependencies [516663d]
421
+ - Updated dependencies [41ac1b7]
422
+ - Updated dependencies [1eaf0a1]
423
+ - Updated dependencies [a09bc33]
424
+ - Updated dependencies [460c4d0]
425
+ - Updated dependencies [0ae27f7]
426
+ - Updated dependencies [2533ec5]
427
+ - Updated dependencies [78c0f9a]
428
+ - Updated dependencies [bbe8b86]
429
+ - Updated dependencies [8477be5]
430
+ - Updated dependencies [279fb13]
431
+ - Updated dependencies [2e82ab2]
432
+ - Updated dependencies [ad07b65]
433
+ - Updated dependencies [41f498b]
434
+ - Updated dependencies [ef0d150]
435
+ - Updated dependencies [f34226e]
436
+ - Updated dependencies [564b605]
437
+ - Updated dependencies [e1d4251]
438
+ - Updated dependencies [40d3a33]
439
+ - Updated dependencies [8b9dc62]
440
+ - Updated dependencies [1184192]
441
+ - Updated dependencies [a2a9747]
442
+ - Updated dependencies [65e88e6]
443
+ - Updated dependencies [a1609a6]
444
+ - Updated dependencies [53f23bc]
445
+ - Updated dependencies [c4533dc]
446
+ - Updated dependencies [be60815]
447
+ - Updated dependencies [37f6844]
448
+ - Updated dependencies [93de4f6]
449
+ - Updated dependencies [2b50261]
450
+ - Updated dependencies [384f30d]
451
+ - Updated dependencies [ac600e5]
452
+ - Updated dependencies [97fba31]
453
+ - Updated dependencies [232f61a]
454
+ - Updated dependencies [d374caf]
455
+ - Updated dependencies [5673576]
456
+ - Updated dependencies [c1ef923]
457
+ - Updated dependencies [911ceaa]
458
+ - Updated dependencies [98eab36]
459
+ - Updated dependencies [af5e292]
460
+ - Updated dependencies [3fbbea1]
461
+ - Updated dependencies [0bffb18]
462
+ - Updated dependencies [800f455]
463
+ - Updated dependencies [5458414]
464
+ - Updated dependencies [3241559]
465
+ - Updated dependencies [7f96b10]
466
+ - Updated dependencies [167ec42]
467
+ - Updated dependencies [616a2a5]
468
+ - Updated dependencies [6c68b13]
469
+ - Updated dependencies [0046d8f]
470
+ - Updated dependencies [f1d4748]
471
+ - Updated dependencies [bea374e]
472
+ - Updated dependencies [b1119ec]
473
+ - Updated dependencies [5607092]
474
+ - Updated dependencies [9f23d2b]
475
+ - Updated dependencies [578e025]
476
+ - Updated dependencies [af025ee]
477
+ - Updated dependencies [d109a4d]
478
+ - Updated dependencies [598c89a]
479
+ - Updated dependencies [4a0bd17]
480
+ - Updated dependencies [b8b9af4]
481
+ - Updated dependencies [31676be]
482
+ - Updated dependencies [8c0d52e]
483
+ - Updated dependencies [aff10e2]
484
+ - Updated dependencies [70a774b]
485
+ - Updated dependencies [9ce096f]
486
+ - Updated dependencies [e05db88]
487
+ - Updated dependencies [7458a41]
488
+ - Updated dependencies [ad13d63]
489
+ - Updated dependencies [5ffcc14]
490
+ - Updated dependencies [d971e51]
491
+ - Updated dependencies [97abb24]
492
+ - Updated dependencies [deb157a]
493
+ - Updated dependencies [9c60144]
494
+ - Updated dependencies [e7747f1]
495
+ - Updated dependencies [d2ce342]
496
+ - Updated dependencies [9695da7]
497
+ - Updated dependencies [ac2f332]
498
+ - Updated dependencies [a777058]
499
+ - Updated dependencies [75444e3]
500
+ - Updated dependencies [58b8346]
501
+ - Updated dependencies [2d0bd16]
502
+ - Updated dependencies [a9e17b4]
503
+ - Updated dependencies [b8ce7dc]
504
+ - Updated dependencies [dad51e5]
505
+ - Updated dependencies [1c9c342]
506
+ - Updated dependencies [787c738]
507
+ - Updated dependencies [8396656]
508
+ - Updated dependencies [dbbd38a]
509
+ - Updated dependencies [8871c14]
510
+ - Updated dependencies [93fe362]
511
+ - Updated dependencies [dfc6975]
512
+ - Updated dependencies [3cf4de0]
513
+ - Updated dependencies [c9dc811]
514
+ - Updated dependencies [144ef9b]
515
+ - Updated dependencies [138ab04]
516
+ - Updated dependencies [a0b9e91]
517
+ - Updated dependencies [99bd015]
518
+ - Updated dependencies [21e4585]
519
+ - @object-ui/types@17.6.0
520
+ - @object-ui/fields@17.6.0
521
+ - @object-ui/i18n@17.6.0
522
+ - @object-ui/react@17.6.0
523
+ - @object-ui/components@17.6.0
524
+ - @object-ui/core@17.6.0
525
+
3
526
  ## 17.5.0
4
527
 
5
528
  ### Minor Changes