@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 +523 -0
- package/README.md +147 -18
- package/dist/DashboardConfigPanel.d.ts +3 -0
- package/dist/DashboardConfigPanel.d.ts.map +1 -1
- package/dist/DashboardFilterBar.d.ts.map +1 -1
- package/dist/DashboardRenderer.d.ts.map +1 -1
- package/dist/DatasetWidget.d.ts +16 -120
- package/dist/DatasetWidget.d.ts.map +1 -1
- package/dist/ObjectDataTable.d.ts +68 -3
- package/dist/ObjectDataTable.d.ts.map +1 -1
- package/dist/ObjectMetricWidget.d.ts +31 -20
- package/dist/ObjectMetricWidget.d.ts.map +1 -1
- package/dist/ObjectPivotTable.d.ts.map +1 -1
- package/dist/PivotTable.d.ts.map +1 -1
- package/dist/WidgetConfigPanel.d.ts +28 -0
- package/dist/WidgetConfigPanel.d.ts.map +1 -1
- package/dist/index.d.ts +15 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1431 -1146
- package/dist/index.umd.cjs +2 -2
- package/dist/recordFields.d.ts +40 -1
- package/dist/recordFields.d.ts.map +1 -1
- package/dist/useConfigPanelTranslation.d.ts +35 -0
- package/dist/useConfigPanelTranslation.d.ts.map +1 -0
- package/package.json +11 -10
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
|