Skip to content

refactor: Actions and Inputs render as JsFunctions#24433

Draft
Artur- wants to merge 2 commits into
mainfrom
action-input-jsfunc
Draft

refactor: Actions and Inputs render as JsFunctions#24433
Artur- wants to merge 2 commits into
mainfrom
action-input-jsfunc

Conversation

@Artur-
Copy link
Copy Markdown
Member

@Artur- Artur- commented May 24, 2026

Replace appendStatement(JsBuilder, StringBuilder) on Action with render(JsBuilder): JsFunction. Replace Input.appendExpression with Input.toJs(JsBuilder): JsFunction returning the input's value when
invoked.

Each Action ships as its own JsFunction (body + captures); Trigger composes them as captures of a tiny parent JsFunction whose body is just $0(event);$1(event);... PromiseAction wraps the subclass JsFunction with OBSERVE_PROMISE via captures instead of string concatenation.

Eliminates hand-escaped JS literals in action bodies — strings and Element refs go through JsFunction's capture mechanism, which Jackson-encodes on the wire. Removes the "this" special-case for the host element: the host is captured the same way as any other Element.

JsBuilder shrinks to just the render-time context (trigger() accessor) plus a static json() helper kept for Trigger.installJs() (a raw String, not a JsFunction).

Artur- added 2 commits May 24, 2026 13:05
Addresses the design suggestion from PR #24397 review: lift the
payload type into the PromiseAction class signature so subclasses
don't have to write per-action adapters and JsonNode no longer leaks
through Success.value().

PromiseAction<T> takes the payload type in its with-outcome
constructor and Jackson-decodes the resolved value once before
invoking onSuccess. The public Success<JsonNode> wrapper is gone —
onSuccess is SerializableConsumer<@nullable T> directly. The wire
shape (Outcome{ok, value, error}) is unchanged; only the dispatch
seam moves.

Subclasses become trivial:
- CopyTextToClipboardAction extends PromiseAction<String> — drops
  adaptOnCopied / asString; onCopied receives the decoded String.
- RequestFullscreenAction extends PromiseAction<Void> — keeps the
  SerializableRunnable convenience via a one-line adapter to
  Consumer<@nullable Void>.
- ClipboardReadAction extends PromiseAction<ClipboardPayload> — was a
  direct Action subclass with a single-handler-null-on-failure API;
  now adopts the two-handler shape so callers can distinguish "empty
  clipboard" (onPayload(null)) from "permission denied" (onError).

JsBuilder.callback(Class<T>, …) / callback(TypeReference<T>, …) were
added in step3 to support ClipboardReadAction's direct-Action shape.
With ClipboardReadAction folded into PromiseAction<T>, no consumer
remains, so they're removed — keeping the primitive surface tight.

The IT view's onError branch sets "error=" + err.name(); the
rejecting-shim IT case is renamed to assert that path instead of the
former "null" propagation.
Replace appendStatement(JsBuilder, StringBuilder) on Action with
render(JsBuilder): JsFunction. Replace Input.appendExpression with
Input.toJs(JsBuilder): JsFunction returning the input's value when
invoked.

Each Action ships as its own JsFunction (body + captures); Trigger
composes them as captures of a tiny parent JsFunction whose body is
just $0(event);$1(event);... PromiseAction wraps the subclass JsFunction
with OBSERVE_PROMISE via captures instead of string concatenation.

Eliminates hand-escaped JS literals in action bodies — strings and
Element refs go through JsFunction's capture mechanism, which Jackson-
encodes on the wire. Removes the "this" special-case for the host
element: the host is captured the same way as any other Element.

JsBuilder shrinks to just the render-time context (trigger() accessor)
plus a static json() helper kept for Trigger.installJs() (a raw String,
not a JsFunction).
@sonarqubecloud
Copy link
Copy Markdown

@github-actions
Copy link
Copy Markdown

Test Results

 1 420 files  ±0   1 420 suites  ±0   1h 20m 8s ⏱️ - 3m 36s
10 000 tests +1   9 932 ✅ +1  68 💤 ±0  0 ❌ ±0 
10 472 runs  +1  10 403 ✅ +1  69 💤 ±0  0 ❌ ±0 

Results for commit 5bb8b54. ± Comparison against base commit 7c1186a.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant