@object-ui/plugin-report 6.2.3 → 7.1.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.
Files changed (33) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/dist/DatasetReportRenderer.d.ts +95 -0
  3. package/dist/{packages/plugin-report/src/LiveReportExporter.d.ts → LiveReportExporter.d.ts} +1 -1
  4. package/dist/{packages/plugin-report/src/ReportExportEngine.d.ts → ReportExportEngine.d.ts} +1 -1
  5. package/dist/ReportRenderer.d.ts +45 -0
  6. package/dist/{packages/plugin-report/src/ReportViewer.d.ts → ReportViewer.d.ts} +1 -1
  7. package/dist/{packages/plugin-report/src/formatValue.d.ts → formatValue.d.ts} +1 -1
  8. package/dist/index.d.ts +13 -2
  9. package/dist/index.js +586 -3685
  10. package/dist/index.umd.cjs +18 -18
  11. package/dist/mergeFilters.d.ts +10 -0
  12. package/package.json +15 -15
  13. package/dist/packages/plugin-report/src/ChartConfig.d.ts +0 -8
  14. package/dist/packages/plugin-report/src/ColumnsEditor.d.ts +0 -16
  15. package/dist/packages/plugin-report/src/FieldPickerDialog.d.ts +0 -36
  16. package/dist/packages/plugin-report/src/GroupingsBuilder.d.ts +0 -8
  17. package/dist/packages/plugin-report/src/JoinedBlocksEditor.d.ts +0 -31
  18. package/dist/packages/plugin-report/src/JoinedReportRenderer.d.ts +0 -47
  19. package/dist/packages/plugin-report/src/MatrixRenderer.d.ts +0 -51
  20. package/dist/packages/plugin-report/src/MatrixRenderer.stories.d.ts +0 -24
  21. package/dist/packages/plugin-report/src/ReportBuilder.d.ts +0 -10
  22. package/dist/packages/plugin-report/src/ReportConfigPanel.d.ts +0 -24
  23. package/dist/packages/plugin-report/src/ReportRenderer.d.ts +0 -44
  24. package/dist/packages/plugin-report/src/ScheduleConfig.d.ts +0 -7
  25. package/dist/packages/plugin-report/src/SpecReportGrid.d.ts +0 -49
  26. package/dist/packages/plugin-report/src/SpecReportGrid.stories.d.ts +0 -31
  27. package/dist/packages/plugin-report/src/buildChartData.d.ts +0 -38
  28. package/dist/packages/plugin-report/src/drill.d.ts +0 -63
  29. package/dist/packages/plugin-report/src/editorTypes.d.ts +0 -20
  30. package/dist/packages/plugin-report/src/hooks/useReportData.d.ts +0 -131
  31. package/dist/packages/plugin-report/src/index.d.ts +0 -26
  32. package/dist/packages/plugin-report/src/specFilterAdapter.d.ts +0 -38
  33. /package/dist/{packages/plugin-report/src/LegacyReportRenderer.d.ts → LegacyReportRenderer.d.ts} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,119 @@
1
1
  # @object-ui/plugin-report
2
2
 
3
+ ## 7.1.0
4
+
5
+ ### Patch Changes
6
+
7
+ - b419a7c: fix(studio): enable report authoring (create flow, chart render, dataset-aware inspector)
8
+
9
+ Found dogfooding report design in Studio as a business user — you could not create a report at all, plus several follow-on gaps.
10
+
11
+ - **Report create now uses the canvas + `ReportDefaultInspector`.** Only `object` was in `CREATE_MODE_CANVAS_TYPES`, so report-create fell back to a stale name-first form whose create-config (`objectName`, `columns: []`) predates the ADR-0021 dataset-bound model — saving failed server validation (_"a report needs `dataset` + `values`"_) with no field to fix it. Add `'report'` to the canvas set; the inspector exposes an auto-derived snake_case Name in create mode; fix the create-config (drop `objectName`/`columns`, seed `type: 'summary'` + `drilldown: true`).
12
+ - **Preserve `?package=` on post-create navigation** — it was dropped, so the editor reloaded a blank draft in the user's default package.
13
+ - **Render a report's embedded `chart`** in `DatasetReportRenderer` (authorable in Studio but never rendered) via the lazily-registered generic chart component; requests a non-animated render for export/background-tab safety.
14
+ - **Dedicated Chart panel in the inspector** — chart type + dataset-aware X-Axis (dimension) / Y-Axis (measure) dropdowns + title, replacing free-text axis fields and the vague "Chart: Required text value" validation.
15
+
16
+ - Updated dependencies [677f7ed]
17
+ - Updated dependencies [08c47da]
18
+ - Updated dependencies [a71be60]
19
+ - Updated dependencies [cb03bc3]
20
+ - @object-ui/types@7.1.0
21
+ - @object-ui/core@7.1.0
22
+ - @object-ui/react@7.1.0
23
+ - @object-ui/components@7.1.0
24
+ - @object-ui/fields@7.1.0
25
+ - @object-ui/plugin-grid@7.1.0
26
+ - @object-ui/i18n@7.1.0
27
+
28
+ ## 7.0.0
29
+
30
+ ### Major Changes
31
+
32
+ - 0c95963: ADR-0021 single-form: dataset-native report editing + legacy report surface retired.
33
+
34
+ - The Studio/runtime report inspector now edits the 9.0 dataset binding (dataset picker + values/rows selectors sourced from the dataset's semantic layer) instead of the removed objectName/columns query form.
35
+ - plugin-report: the pre-9.0 query-form renderers (SpecReportGrid, MatrixRenderer, JoinedReportRenderer), the drill helpers, and the legacy authoring components (ReportBuilder, ReportConfigPanel, ColumnsEditor, GroupingsBuilder, JoinedBlocksEditor, FieldPickerDialog, ChartConfig, ScheduleConfig) are removed. ReportRenderer dispatches dataset-bound reports to DatasetReportRenderer; stored pre-9.0 spec JSON renders through the lossy specReportToPresentation → ReportViewer bridge until migrated.
36
+
37
+ ### Minor Changes
38
+
39
+ - 39c89e7: ADR-0021 D2: true matrix cross-tab + dataset-path drill-down.
40
+
41
+ - DatasetReportRenderer pivots `type: 'matrix'` reports into a real rows × columns cross-tab (one dataset query over all dimensions, pivoted client-side; matrix without `columns` degrades to the flat grouped table). Joined blocks pivot too.
42
+ - Drill-down: aggregated rows / matrix cells are clickable when the host passes `onDrill` (and the report doesn't set `drilldown: false`), emitting `{dataset, groupKey, runtimeFilter}`. ReportView resolves the dataset's object + dimension→field mapping (reverse-mapping select option labels back to stored values) and navigates to the object list scoped by `?filter[field]=value`.
43
+ - Studio: the report inspector gains a Columns (across dimensions) list for matrix reports; ReportPreview renders through the same DatasetReportRenderer as the runtime, so the matrix preview is WYSIWYG.
44
+
45
+ - 053c948: feat(plugin-report): server-supplied totals in dataset matrix reports
46
+
47
+ Pairs with the framework's server-side `queryDataset` totals. The matrix renderer
48
+ now requests `totals: { groupings: [rows, columns, []] }` and renders the
49
+ returned pre-aggregated rows — a trailing Total column per measure (row
50
+ subtotals), a trailing Total row (column subtotals), and the grand total at their
51
+ intersection — matched to pivot headers via the same `bucketId` logic. A response
52
+ without totals (older server) renders exactly as before; the client never
53
+ re-aggregates (ADR-0021).
54
+
55
+ ### Patch Changes
56
+
57
+ - c849d3b: Remove the dead pre-9.0 client-side report-aggregation pipeline. ADR-0021 moved aggregation into the semantic layer (`queryDataset`), leaving the `useReportData` hook and its helpers (`buildAggregateQuery`, `groupAndAggregate`, `pivotRows`, `aggregateRows`, `collectFields`, `columnKey`, `bucketDate`, `groupingValue`) and the `ReportRow` / `PivotMatrix` / `PivotHeader` / `UseReportDataResult` / `UseReportDataOptions` types with zero consumers across the monorepo and all product repos. The still-used `mergeFilters` combinator moves to its own module and remains exported from the package root.
58
+ - Updated dependencies [5976ba3]
59
+ - Updated dependencies [a00e16d]
60
+ - Updated dependencies [eaccefd]
61
+ - Updated dependencies [f7f325d]
62
+ - Updated dependencies [c12986e]
63
+ - Updated dependencies [71d7ce0]
64
+ - Updated dependencies [053c948]
65
+ - Updated dependencies [053c948]
66
+ - Updated dependencies [89e113c]
67
+ - Updated dependencies [ddbe4a2]
68
+ - Updated dependencies [2d47e94]
69
+ - Updated dependencies [9049bbe]
70
+ - Updated dependencies [77cc6bb]
71
+ - Updated dependencies [6c0c92c]
72
+ - Updated dependencies [97c6831]
73
+ - Updated dependencies [cb2fdb1]
74
+ - Updated dependencies [c3749eb]
75
+ - Updated dependencies [c09f44e]
76
+ - Updated dependencies [6cfa330]
77
+ - Updated dependencies [ad8ade6]
78
+ - Updated dependencies [d54346c]
79
+ - Updated dependencies [5332639]
80
+ - Updated dependencies [3870c20]
81
+ - Updated dependencies [2eb3096]
82
+ - Updated dependencies [b88c560]
83
+ - Updated dependencies [0ad72a6]
84
+ - Updated dependencies [bd398df]
85
+ - Updated dependencies [3fa23a7]
86
+ - Updated dependencies [18d0339]
87
+ - Updated dependencies [66ed3ad]
88
+ - Updated dependencies [c6445b6]
89
+ - Updated dependencies [80c133c]
90
+ - Updated dependencies [5e1b838]
91
+ - Updated dependencies [59b6bbb]
92
+ - Updated dependencies [d16566f]
93
+ - Updated dependencies [90acb7f]
94
+ - Updated dependencies [7913390]
95
+ - Updated dependencies [514f426]
96
+ - Updated dependencies [1394e34]
97
+ - Updated dependencies [e95cc25]
98
+ - Updated dependencies [abe8ebc]
99
+ - Updated dependencies [300d755]
100
+ - Updated dependencies [bd8b054]
101
+ - Updated dependencies [4eb9cb6]
102
+ - Updated dependencies [7c239fd]
103
+ - Updated dependencies [858ad94]
104
+ - Updated dependencies [2270239]
105
+ - Updated dependencies [db8cd00]
106
+ - Updated dependencies [2f31406]
107
+ - Updated dependencies [18728c1]
108
+ - Updated dependencies [8d1195d]
109
+ - @object-ui/core@7.0.0
110
+ - @object-ui/components@7.0.0
111
+ - @object-ui/plugin-grid@7.0.0
112
+ - @object-ui/react@7.0.0
113
+ - @object-ui/i18n@7.0.0
114
+ - @object-ui/types@7.0.0
115
+ - @object-ui/fields@7.0.0
116
+
3
117
  ## 6.2.3
4
118
 
5
119
  ### Patch Changes
@@ -0,0 +1,95 @@
1
+ /**
2
+ * DatasetReportRenderer
3
+ *
4
+ * Renders a spec `Report` that binds to a semantic-layer `dataset` (ADR-0021
5
+ * single-form) instead of an inline `objectName` + `columns` query. The report
6
+ * selects dimensions (`rows`, and for matrix also `columns`) and measures
7
+ * (`values`) BY NAME and runs them through `dataSource.queryDataset` — the
8
+ * same governed path dataset-bound dashboard widgets and the dataset preview
9
+ * use, so the numbers (and the server-resolved dimension display labels)
10
+ * match everywhere.
11
+ *
12
+ * - `summary` / `tabular` → one grouped table (`rows` + `values`).
13
+ * - `matrix` → a true cross-tab (ADR-0021 D2): `rows` down × `columns`
14
+ * across, measures in the cells. One dataset query over all dimensions,
15
+ * pivoted client-side. Totals (per-row subtotals, per-column subtotals,
16
+ * grand total) are SERVER-supplied: the selection asks for
17
+ * `totals: { groupings: [rows, columns, []] }` and the renderer only
18
+ * places the returned pre-aggregated rows. It never re-aggregates bucketed
19
+ * values client-side — measures like `avg` cannot be recombined without
20
+ * drifting from the semantic layer (the ADR-0021 governance red line) —
21
+ * so an older server that returns no `totals` renders the plain cross-tab
22
+ * with no totals row/column. A matrix without `columns` degrades to the
23
+ * flat grouped table.
24
+ * - `joined` → a vertical stack of blocks, each its own dataset-bound table,
25
+ * with the report-level `runtimeFilter` merged into every block.
26
+ *
27
+ * Headers and measure cells mirror the dashboard `DatasetWidget` (PR #1825):
28
+ * column headers use the dataset's server-supplied display `label` (run
29
+ * through the i18n field-label convention), and measure values format with
30
+ * the field's declared `currency` (`Intl` symbol) + numeral `format`, never
31
+ * the raw field name or a misleading "$".
32
+ *
33
+ * Drill-down (ADR-0021 D2): when the report's `drilldown` flag is not `false`
34
+ * and the host supplies `onDrill`, every aggregated row / matrix cell is
35
+ * clickable and emits `{ dataset, groupKey, runtimeFilter }`. The HOST owns
36
+ * navigation — it resolves the dataset's `object` and dimension→field mapping
37
+ * (this renderer only knows dimension NAMES) and routes to the underlying
38
+ * records.
39
+ */
40
+ import * as React from 'react';
41
+ /** What a drill click means — the host resolves names to a navigation target. */
42
+ export interface DatasetDrillArgs {
43
+ /** Dataset the clicked aggregate was computed over. */
44
+ dataset: string;
45
+ /** Dimension NAME → clicked bucket value (row dims, plus across dims for a matrix cell). */
46
+ groupKey: Record<string, unknown>;
47
+ /** The effective render-time scope filter, if any. */
48
+ runtimeFilter?: Record<string, unknown>;
49
+ /** The dataset's base object (records to drill into), when the server supplied it. */
50
+ object?: string;
51
+ /**
52
+ * Exact record-list filter (object FIELD name → RAW stored value) for the
53
+ * clicked bucket, ANDed with `runtimeFilter`. Present only when the server
54
+ * returned the dimension→field mapping + raw grouped values, so the host can
55
+ * filter precisely — including select/lookup dims a display-label `groupKey`
56
+ * would mis-filter — without re-fetching the dataset definition.
57
+ */
58
+ objectFilter?: Record<string, unknown>;
59
+ }
60
+ /** A report (or joined block) bound to a dataset. Field access is permissive — */
61
+ /** the bundled spec types lag the runtime schema across the repo boundary. */
62
+ interface DatasetReportLike {
63
+ name?: string;
64
+ type?: string;
65
+ dataset?: string;
66
+ rows?: string[];
67
+ /** Dimension names across — matrix pivots `rows` × `columns` (ADR-0021 D2). */
68
+ columns?: string[];
69
+ values?: string[];
70
+ runtimeFilter?: Record<string, unknown>;
71
+ filter?: Record<string, unknown>;
72
+ /** Click-through to underlying records (default true). */
73
+ drilldown?: boolean;
74
+ /** Embedded chart visualization (ADR-0021): type + xAxis/yAxis over the dataset. */
75
+ chart?: Record<string, unknown>;
76
+ label?: unknown;
77
+ description?: unknown;
78
+ blocks?: DatasetReportLike[];
79
+ }
80
+ export interface DatasetReportRendererProps {
81
+ report: DatasetReportLike;
82
+ dataSource?: unknown;
83
+ /** Filter merged into the report (and every joined block) as `runtimeFilter`. */
84
+ runtimeFilter?: Record<string, unknown>;
85
+ /**
86
+ * Drill-down sink. Rows/cells become clickable when provided (and the
87
+ * report doesn't set `drilldown: false`).
88
+ */
89
+ onDrill?: (args: DatasetDrillArgs) => void;
90
+ className?: string;
91
+ }
92
+ /** `true` when this report should render through the dataset path. */
93
+ export declare function isDatasetReport(value: unknown): value is DatasetReportLike;
94
+ export declare const DatasetReportRenderer: React.FC<DatasetReportRendererProps>;
95
+ export {};
@@ -1,4 +1,4 @@
1
- import { DataSource, QueryParams, ReportSchema, ReportExportFormat, ReportExportConfig, ReportSchedule } from '../../types/src';
1
+ import { DataSource, QueryParams, ReportSchema, ReportExportFormat, ReportExportConfig, ReportSchedule } from '@object-ui/types';
2
2
  /**
3
3
  * Options for live report export
4
4
  */
@@ -1,4 +1,4 @@
1
- import { ReportSchema, ReportExportConfig, ReportExportFormat } from '../../types/src';
1
+ import { ReportSchema, ReportExportConfig, ReportExportFormat } from '@object-ui/types';
2
2
  /**
3
3
  * Report Export Engine
4
4
  * Handles exporting report data to various formats using browser-native APIs.
@@ -0,0 +1,45 @@
1
+ import { SpecReport, DataSource } from '@object-ui/types';
2
+ import { LegacyReportRendererProps } from './LegacyReportRenderer';
3
+ import { DatasetDrillArgs } from './DatasetReportRenderer';
4
+ /**
5
+ * ReportRenderer
6
+ *
7
+ * Thin dispatcher that routes a report schema to the correct renderer.
8
+ *
9
+ * ADR-0021 single-form: a 9.0 report is **dataset-bound** — it binds a
10
+ * semantic-layer `dataset` and selects its `values` (measure names) grouped
11
+ * by `rows` (dimension names). That is the live rendering path.
12
+ *
13
+ * Dispatch table:
14
+ * | schema shape | Renderer |
15
+ * |---------------------------------------|-------------------------------------------|
16
+ * | dataset-bound (dataset / blocks) | <DatasetReportRenderer> |
17
+ * | pre-9.0 spec report (stored JSON) | specReportToPresentation → <ReportViewer> |
18
+ * | legacy presentation ({data, columns}) | <LegacyReportRenderer> |
19
+ *
20
+ * The pre-9.0 query-form renderers (SpecReportGrid / MatrixRenderer /
21
+ * JoinedReportRenderer) were retired with the cutover — stored old-shape JSON
22
+ * renders through the lossy {@link specReportToPresentation} bridge until it
23
+ * is migrated to a dataset binding.
24
+ */
25
+ import * as React from 'react';
26
+ export type ReportRendererSchema = SpecReport | LegacyReportRendererProps['schema'];
27
+ export interface ReportRendererProps {
28
+ /** Either a spec `Report` (dataset-bound) or a legacy presentation schema. */
29
+ schema: ReportRendererSchema;
30
+ /** Required for dataset-bound reports unless the host pre-fetched rows. */
31
+ dataSource?: DataSource | Record<string, unknown>;
32
+ /** Pre-fetched rows — feeds the pre-9.0 / legacy presentation paths. */
33
+ rows?: Array<Record<string, unknown>>;
34
+ /** Runtime filter merged on top of the report's own scope filter. */
35
+ runtimeFilter?: Record<string, unknown>;
36
+ /**
37
+ * Drill-down sink for dataset-bound reports (ADR-0021 D2) — rows/cells
38
+ * become clickable when provided. The host resolves the dataset's object
39
+ * and dimension→field mapping and navigates to the underlying records.
40
+ */
41
+ onDrill?: (args: DatasetDrillArgs) => void;
42
+ /** Optional class for the outer container. */
43
+ className?: string;
44
+ }
45
+ export declare const ReportRenderer: React.FC<ReportRendererProps>;
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { ReportViewerSchema } from '../../types/src';
2
+ import { ReportViewerSchema } from '@object-ui/types';
3
3
  export interface ReportViewerProps {
4
4
  schema: ReportViewerSchema;
5
5
  /** Callback to refresh data */
@@ -1,4 +1,4 @@
1
- import { ReportField } from '../../types/src';
1
+ import { ReportField } from '@object-ui/types';
2
2
  /**
3
3
  * Format a cell value based on the field definition.
4
4
  * Handles number (with thousand separators), currency, percent, and date formatting.
package/dist/index.d.ts CHANGED
@@ -1,2 +1,13 @@
1
- export * from './packages/plugin-report/src/index'
2
- export {}
1
+ import { ReportRenderer } from './ReportRenderer';
2
+ import { LegacyReportRenderer } from './LegacyReportRenderer';
3
+ import { ReportViewer } from './ReportViewer';
4
+ import { DatasetReportRenderer, isDatasetReport } from './DatasetReportRenderer';
5
+ export { ReportRenderer, LegacyReportRenderer, ReportViewer, DatasetReportRenderer, isDatasetReport };
6
+ export type { ReportRendererProps, ReportRendererSchema } from './ReportRenderer';
7
+ export type { LegacyReportRendererProps } from './LegacyReportRenderer';
8
+ export type { DatasetReportRendererProps, DatasetDrillArgs } from './DatasetReportRenderer';
9
+ export { formatValue } from './formatValue';
10
+ export { exportReport, exportAsCSV, exportAsJSON, exportAsHTML, exportAsPDF, exportAsExcel } from './ReportExportEngine';
11
+ export { exportWithLiveData, exportExcelWithFormulas, createScheduleTrigger, } from './LiveReportExporter';
12
+ export type { LiveExportOptions, LiveExportResult, ExcelColumnConfig, ScheduleTriggerCallback, } from './LiveReportExporter';
13
+ export { mergeFilters } from './mergeFilters';