mirror of
https://github.com/olehomelchenko/astrolabe.git
synced 2026-08-08 02:02:33 +00:00
Editor: CodeLens to scaffold Vega-Lite data transforms
Add a discoverable '+ Add transform' / '+ filter/aggregate/...' CodeLens in the spec editor that scaffolds field-typed transform[] steps, with a type-to-filter completion on the same catalog as an accelerator. New pure core (spec-data-transforms): step-slot and view-site classification, the field-typed catalog, and comma affixing. Deliberately the one home the schema leaves bare — inline channel transforms and the transform key stay with the JSON schema. Rename the composition toolbar menu Transform -> Compose so it reads distinctly from a data transform. Deferred (recorded at their sites): extract a shared cursor-lens skeleton across the two installers; a shared completion replace-range helper (now 3 sites); params scaffolding as the sibling feature.
This commit is contained in:
@@ -285,7 +285,15 @@ logic is pure `src/core/`; the Monaco glue is thin app-layer services.
|
||||
**Core (pure, portable):**
|
||||
|
||||
- `spec-transforms` — wrap a view in `layer`/`hconcat`/`vconcat`/`facet`/`repeat`; collapse
|
||||
a single-child composition (`unwrapSingleton`). Object-in/object-out.
|
||||
a single-child composition (`unwrapSingleton`). Object-in/object-out. (Surfaced as the
|
||||
toolbar **Compose** menu — named to read distinctly from a data `transform`, below.)
|
||||
- `spec-data-transforms` — the data-pipeline counterpart: `transformSiteAt` resolves the view
|
||||
the cursor is in and its `transform[]` range/count (for the CodeLens), `transformPlacementAt`
|
||||
classifies a step slot (for the completion) — both tagged `shared` when the pipeline sits on a
|
||||
composition parent, `view` on a unit. `DATA_TRANSFORMS` is the field-typed step catalog (filter,
|
||||
calculate, aggregate, bin, timeUnit, window, joinaggregate, fold, lookup); each builder takes the
|
||||
columns in scope and seeds each `${n:default}` tab stop with a type-appropriate one. A test
|
||||
round-trips every snippet through `snippetToPlain` to assert it's valid JSON.
|
||||
- `spec-data` — the Vega-Lite data model: classify a `data` block (`classifyData`, mirroring
|
||||
`isNamedData`), the library reference name (`libraryRefName`), and the data binding in scope
|
||||
at a cursor path (`dataBindingAtPath`, honoring a view's data inheritance from its parent).
|
||||
@@ -335,11 +343,11 @@ logic is pure `src/core/`; the Monaco glue is thin app-layer services.
|
||||
curated parameter signatures for the commonly-typed functions (what the registry can't supply).
|
||||
|
||||
**Services (app, store-aware via `getState`):** `spec-transform-actions` (the
|
||||
wrap/simplify/add-view operations and their surfaces), `spec-dataset-hints` (data-column
|
||||
completion, hover, inlay providers), `spec-expression-hints` (expression completion,
|
||||
signature help, hover, and the diagnostic markers), `active-dataset` (`dataInfoAt(text,
|
||||
offset)` — the columns/types/stats plus derived fields the draft sees at the cursor).
|
||||
`SpecEditor` does the wiring.
|
||||
wrap/simplify/add-view operations and their surfaces), `spec-transform-scaffold` (the
|
||||
data-transform scaffold — a CodeLens plus a completion), `spec-dataset-hints` (data-column completion, hover,
|
||||
inlay providers), `spec-expression-hints` (expression completion, signature help, hover, and
|
||||
the diagnostic markers), `active-dataset` (`dataInfoAt(text, offset)` — the columns/types/stats
|
||||
plus derived fields the draft sees at the cursor). `SpecEditor` does the wiring.
|
||||
|
||||
Decision rules:
|
||||
|
||||
@@ -407,7 +415,25 @@ Decision rules:
|
||||
`datum.` or `fn(` spans the whole `datum.`/`fn(` token; used as a completion item's range it both
|
||||
mis-targets the edit and filters every suggestion out (none start with `datum.`). A provider
|
||||
completing inside a string must build the replace range from the partial it parses itself — a rule
|
||||
any future in-string completion (transform/param scaffolding) inherits.
|
||||
the transform scaffold inherits (it parses the trailing element word off the line). This
|
||||
`new Range(line, col − partialLen, line, col)` construction is now at three sites
|
||||
(`spec-expression-hints`, `spec-dataset-hints`, `spec-transform-scaffold`); a shared
|
||||
`replaceRange(position, partialLength)` helper is earned and should be extracted on the next touch.
|
||||
- **Data-transform scaffolding is a CodeLens (discoverable) plus a completion (accelerator), on
|
||||
the one home the schema leaves bare.** A Vega-Lite data `transform` has three possible homes,
|
||||
confirmed against the bundled schema (the `transform` array is on 16 spec types, i.e. every view
|
||||
node): a `transform[]` **step**; the **inline** field props on an encoding channel
|
||||
(`bin`/`timeUnit`/`aggregate`/`sort`); and a **new** pipeline on a bare view. We scaffold the step
|
||||
home only, on the same "add only what the schema lacks" rule as `spec-dataset-hints`: the schema
|
||||
already completes the inline channel keys and their enum values, and the `transform` key itself —
|
||||
but never a ready, field-typed `{ "filter": … }`. The **CodeLens is the discoverable surface**
|
||||
(a completion is invisible until provoked and competes silently with the schema's suggest items):
|
||||
cursor-scoped like the composition CodeLens, it shows `+ Add transform` on a view with no pipeline
|
||||
and per-step `+ filter`/`+ aggregate`/… on the array, each clicking through Monaco's snippet
|
||||
engine so the field-typed tab stops survive. The completion is the type-to-filter accelerator on
|
||||
the same catalog. A step's `scope` (`shared` when the array is on a composition parent, so it
|
||||
feeds every child) is surfaced so the placement is not a surprise, and comma affixing keeps the
|
||||
array valid whether the slot is empty, between elements, or appended after one without a trailing comma.
|
||||
- **Code-action menu icons are kind-derived** (a wrench for the `refactor.*` kinds) — Monaco's
|
||||
`CodeAction` carries no icon field. Custom iconography lives only where it is supported:
|
||||
CodeLens titles (`$(codicon)`), completion-item kinds, and glyph-margin decorations.
|
||||
|
||||
Reference in New Issue
Block a user