Uh oh!
There was an error while loading. Please reload this page.
fix(plugin-list,plugin-grid): drop undeliverable formats from the export menu - #2999
Merged
Conversation
The latest updates on your projects. Learn more about Vercel for GitHub. |
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
Uh oh!
There was an error while loading. Please reload this page.
xuyushun441-sys pushed a commit
that referenced
this pull request
Jul 30, 2026
… into nothing (#2942) Every row below is the #2897 shape — validates at authoring time, renders nothing (or a dead control), no test fails and no warning fires: - UserFilters `element: 'toggle'`: `default: return null` deleted the ENTIRE filter bar for stored toggle configs. The existing-but-unreachable ToggleFilters branch is wired; authoring stays untypeable (ADR-0053) while stored metadata keeps rendering (spec ADR-0047 §3.4a). - UserFilters `date-range` / `text`: dead "No options" popovers become a from/to date pair (emits >=/<= bounds) and a contains search input. - useAnimation: preset/easing maps re-keyed to the spec's underscore vocabulary (+ rotate/flip via usePageTransition's classes); hyphen dialect and `scale-fade` stay accepted for stored configs. The `EASING_MAP[easing] || easing` fallthrough no longer emits invalid CSS. - NotificationContext: displayType materialized (spec default toast, legacy `modal` presents as alert) and the unions now match NotificationTypeSchema / NotificationPositionSchema instead of claiming to. - useNavigationOverlay: the spec `size` buckets resolve to viewport-clamped widths off app-shell too (explicit `width` still wins; `auto` stays host-derived). - Both ThemeProviders: `mode: 'auto'` follows the OS instead of adding a dead `auto` class that locked the light theme; `system` kept as the pre-spec spelling. - AdvancedChart: the single-value families (gauge/solid-gauge/metric/kpi/ bullet) render the measure as a number, table/pivot name their owning component, unknown types are named — never the bar SHELL with null series marks that was indistinguishable from an empty dataset (reachable via ChartRenderer's `schema.chartType ?? spec.chartType` bypass). - Timeline: the spec `scale` key is read at last (legacy `timeScale` kept); hour/quarter/year generate real gantt header buckets instead of a blank axis. - Toaster: position (all six spec values) and `limit` reach sonner instead of being discarded by a bare `<SonnerToaster />`. - useSpecGesture: the DECLARED `config.type` drives recognition — pan/drag/rotate/double_tap no longer collapse to tap; useGesture gains real double-tap (two taps, not one) and two-touch pinch/rotate deltas. - ReportViewer: `aggregation: 'distinct'` computes a distinct count instead of a blank summary cell. - FieldEditWidget: inline resolution goes through the form's alias table, so `json` gets the code editor, `tree` the lookup picker, and composite/ record/repeater/video/audio/autonumber resolve to their documented exclusions; ObjectGrid's editability gate consults the same contract, so a `composite` cell is read-only instead of a value-corrupting text box. - FilterBuilder: $startsWith/$endsWith/$null/$exists become authorable (startsWith/endsWith/isNull/isNotNull/exists/notExists) and round-trip through condToMongo/kvToCondition — every FieldOperatorsSchema token is now reachable from the UI. The export-menu row (PDF silently downloading nothing) was fixed concurrently by #2999, which this branch rebases onto and defers to. Each fix lands with a spec-parity guard per the #2897 template; `fields`, `mobile`, `plugin-charts` and `providers` gain the `@objectstack/spec` devDependency that makes those guards possible (no second zod peer variant materialized — verified in the lockfile). Refs #2942, #2901 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
os-zhuang added a commit
that referenced
this pull request
Jul 30, 2026
… into nothing (#2942) (#3008) Every row below is the #2897 shape — validates at authoring time, renders nothing (or a dead control), no test fails and no warning fires: - UserFilters `element: 'toggle'`: `default: return null` deleted the ENTIRE filter bar for stored toggle configs. The existing-but-unreachable ToggleFilters branch is wired; authoring stays untypeable (ADR-0053) while stored metadata keeps rendering (spec ADR-0047 §3.4a). - UserFilters `date-range` / `text`: dead "No options" popovers become a from/to date pair (emits >=/<= bounds) and a contains search input. - useAnimation: preset/easing maps re-keyed to the spec's underscore vocabulary (+ rotate/flip via usePageTransition's classes); hyphen dialect and `scale-fade` stay accepted for stored configs. The `EASING_MAP[easing] || easing` fallthrough no longer emits invalid CSS. - NotificationContext: displayType materialized (spec default toast, legacy `modal` presents as alert) and the unions now match NotificationTypeSchema / NotificationPositionSchema instead of claiming to. - useNavigationOverlay: the spec `size` buckets resolve to viewport-clamped widths off app-shell too (explicit `width` still wins; `auto` stays host-derived). - Both ThemeProviders: `mode: 'auto'` follows the OS instead of adding a dead `auto` class that locked the light theme; `system` kept as the pre-spec spelling. - AdvancedChart: the single-value families (gauge/solid-gauge/metric/kpi/ bullet) render the measure as a number, table/pivot name their owning component, unknown types are named — never the bar SHELL with null series marks that was indistinguishable from an empty dataset (reachable via ChartRenderer's `schema.chartType ?? spec.chartType` bypass). - Timeline: the spec `scale` key is read at last (legacy `timeScale` kept); hour/quarter/year generate real gantt header buckets instead of a blank axis. - Toaster: position (all six spec values) and `limit` reach sonner instead of being discarded by a bare `<SonnerToaster />`. - useSpecGesture: the DECLARED `config.type` drives recognition — pan/drag/rotate/double_tap no longer collapse to tap; useGesture gains real double-tap (two taps, not one) and two-touch pinch/rotate deltas. - ReportViewer: `aggregation: 'distinct'` computes a distinct count instead of a blank summary cell. - FieldEditWidget: inline resolution goes through the form's alias table, so `json` gets the code editor, `tree` the lookup picker, and composite/ record/repeater/video/audio/autonumber resolve to their documented exclusions; ObjectGrid's editability gate consults the same contract, so a `composite` cell is read-only instead of a value-corrupting text box. - FilterBuilder: $startsWith/$endsWith/$null/$exists become authorable (startsWith/endsWith/isNull/isNotNull/exists/notExists) and round-trip through condToMongo/kvToCondition — every FieldOperatorsSchema token is now reachable from the UI. The export-menu row (PDF silently downloading nothing) was fixed concurrently by #2999, which this branch rebases onto and defers to. Each fix lands with a spec-parity guard per the #2897 template; `fields`, `mobile`, `plugin-charts` and `providers` gain the `@objectstack/spec` devDependency that makes those guards possible (no second zod peer variant materialized — verified in the lockfile). Refs #2942, #2901 Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ort menu The export popover rendered whatever exportOptions.formats declared, but the runtime can only deliver a subset: the server stream handles csv/xlsx/json and the client fallback only csv/json. A declared 'pdf' (never implemented anywhere — declined platform-side in objectstack#1301) rendered as a menu item whose click silently did nothing: no request, no file, popover just closed. Same for 'xlsx' whenever the server stream is unavailable (no exportDownload on the data source, inline data, or streaming: false). Tracked as the export row of the #2942 dead-value audit. Filter the menu to formats the current data source can actually produce, hide the export button entirely when nothing survives, and console.warn the dropped declarations so app authors find out at dev time instead of via a dead button. Closes the export row of #2942. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The export popover rendered whatever
exportOptions.formatsdeclared, but the runtime can only deliver a subset: the server stream (dataSource.exportDownload) handles csv/xlsx/json, the client fallback only csv/json. A declaredpdf— implemented nowhere, and declined platform-side in objectstack-ai/objectstack#1301 (closed NOT_PLANNED) — rendered as a menu item whose click silently did nothing: no request, no file, the popover just closed. Same forxlsxwhenever the server stream is unavailable (noexportDownload, inlineprovider: 'value'data, orstreaming: false).This is the export row of the #2942 dead-value audit (
ListView.tsx/ObjectGrid.tsx).Fix
Both
ListViewandObjectGridnow filter the menu to formats the current data source can actually produce:pdfnever renders;xlsxrenders only when the server stream is available;console.warnso app authors find out at dev time instead of via a dead button.Tests
5 new cases (3 in
ListView.test.tsx, 2 inexportGate.test.tsx): pdf hidden while xlsx stays on a server-capable source; xlsx hidden on a client-only source while csv stays; button fully hidden when only pdf is declared.pnpm vitest run packages/plugin-list packages/plugin-grid: 535 passed.type-checkon both packages: clean.Closes the export row of #2942 (other rows remain).
🤖 Generated with Claude Code