Skip to content

Open existing classes, ABAP 7.02 output, UI5 from your own URL, floorplan starters - #5

Merged
oblomov-dev merged 9 commits into
mainfrom
claude/abap2ui5-competitor-analysis-3m3r6i
Oct 15, 2026
Merged

oblomov-dev merged 9 commits into
mainfrom
claude/abap2ui5-competitor-analysis-3m3r6i

Conversation

@oblomov-dev

Copy link
Copy Markdown
Member

What changes

  • Open a class:
    • Paste it, load a .clas.abap file, or use ?src= / ?class=&repo=.
    • Export rewrites only the view chain; every other line stays as it was.
    • What the editor cannot represent is kept as raw ABAP or listed in the import report.
    • Every test design round-trips byte-identically in both releases.
  • ABAP 7.02 output: a release select next to the class name. abaplint at v702 runs in npm test, and verify:abap runs both releases.
  • Fixes in the 7.40 output, found along the way:
    • lines over 255 characters for long texts
    • a missing parenthesis in wide nested rows
  • UI5 from your own URL:
    • Typed into the UI5 field, any URL works.
    • From a link, ?ui5= is followed only for this server, localhost and SAP's UI5 CDNs. A UI5 runs its scripts on the editor's origin, which the playground and the docs share.
  • Starters: list report, object page, worklist and master-detail, using catalogued 1.71 controls only.
  • Hand-off: Open in Playground, using the playground's share-link format. Open in VS Code, via a vscode:// link handled by abap2UI5/vscode-extension.
  • README: how a class reaches a system, through abapGit; no tool deploys there.

Verified

Check Result
npm test 354 passed
npm run check:abap 23 files, 0 failing
npm run check:abap702 0 issues
npm run verify:abap 23 of 23 ok
npm run test:e2e:local on 1.144 and 1.71 51 passed

Not verified:

  • Themes: the local npm trees carry no compiled themes, so the canvas ran unthemed.
  • Real systems: no compile on a real SAP system.
  • vscode:// link: not tested in a real browser.

🤖 Generated with Claude Code

https://claude.ai/code/session_011N8v1iay9ZgmK3Bzj8iqK5


Generated by Claude Code

src/handoff.js writes the playground's share link in the playground's own
format (src/shell/share.mjs: version 2, base64url of the deflated JSON
list of files), with the base URL as a parameter, and the VS Code link the
abap2UI5 extension's URI handler reads: vscode://abap2ui5.abap2ui5/open
with the deflated source in ?code= and the file name in ?name=. The tests
decode both the way their readers do.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011N8v1iay9ZgmK3Bzj8iqK5
…me class

File > Open ABAP class (paste, a .clas.abap file, or ?src=<raw URL> as in
the playground, ?class=&repo= for a class on GitHub) reads the
view_display chain - the one-statement shape the editor writes and the
split shape of the samples - into the design, the PUBLIC attributes with
their model_init seeds into the data, client->_event( ) into event names.
The export patches the class it came from: the chain is rewritten in the
house layout over the range it had, new attributes are declared at the
end of the PUBLIC SECTION, new events get a WHEN branch in on_event, and
every other line stays as it was.

A view attribute the editor cannot edit (a method call, a COND, an id, a
prefixed attribute) is kept as ABAP on its control and written back
unchanged unless the editor sets it; a public attribute of a type the
Data tab has not and attributes of the View element are listed in the
import report. Nothing is dropped silently.

Every starter's and the kitchen sink's class round-trips byte-identically
(generate, import, generate), the hello world of abap2UI5/samples is
committed as a fixture and imported, and an imported and edited class is
in the linter and runtime checks beside the generated ones. The menu
offers Open in Playground and Open in VS Code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011N8v1iay9ZgmK3Bzj8iqK5
No tool of the set deploys to an SAP system: the MCP server's system mode
operates apps that are already there and deploy_app writes into a local
sandbox. The README says so and gives the abapGit recipe, with the
system mode as the check afterwards.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011N8v1iay9ZgmK3Bzj8iqK5
Next to the class name, the release the class is written for: ABAP 7.40
and later (the default, as before) or ABAP 7.02, saved with the design.
The 7.02 class declares its variables at the top of a method, fills its
sample rows field by field and APPENDs them, writes a line break or a tab
as the constants of cl_abap_char_utilities joined with &&, compares a
functional call with abap_true and uses WITH DEFAULT KEY - no inline
declarations, string templates, constructor or table expressions. The
view chain is the same in both.

npm test checks every test design as a 7.02 class against a list of what
7.02 lacks, and runs abaplint at v702 on them with the rules of
abap2UI5's own 7.02 check (abaplint-702.jsonc, also npm run
check:abap702); npm run verify:abap transpiles and runs both releases.
A new test design holds line breaks, tabs and long texts in attributes
and in the rows of a table and of its table field.

On the way, two faults of the 7.40 class: a text with a line break was
one string template however long, past 255 characters a line, and so
was a long text in a sample row; both are now split into pieces joined
with &&. And a nested sample row too wide for one line lost the closing
parenthesis of its outer row, which did not compile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011N8v1iay9ZgmK3Bzj8iqK5
The UI5 field above the canvas, and ?ui5= in the editor's URL, take the
URL of a UI5 of your own besides a version: the folder that holds
resources/, on another server or on the editor's own (/... or ./...).
Empty still means the latest from the OpenUI5 CDN. A value with quotes
or angle brackets is no URL and goes to the CDN as a version, so it
never reaches the bootstrap tag as markup. A release before 1.102 has no
Horizon theme: where the URL does not name the release, the canvas
switches to Quartz once UI5 has said which it is.

The browser tests take the same URLs for both legs (UI5_URL,
UI5_URL_171), and E2E_PORT for a second checkout testing at the same
time. The README says how to serve a resources/ tree for it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011N8v1iay9ZgmK3Bzj8iqK5
Four floorplans for New, each a test design like the other starters -
generated for both releases, run on abap2UI5, rendered on 1.71:

- list report: a dynamic page with filter fields and a search in its
  header over a table of orders, its title with the number of rows
- object page: sap.uxap.ObjectPageLayout with a header title, key facts
  in the header, a form section and an items table section
- worklist: a table with a status column (ObjectStatus with the state
  from the row) and a row press, the search in its toolbar
- master-detail: a list next to the details of the selected entry, in a
  two-column grid - SplitApp and FlexibleColumnLayout are not in the
  palette

Only controls and properties of the catalogue. The number in a title is
an attribute of its own, as in the UI5 worklist template, for the class
to set; an expression over the table's path would hard-code it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011N8v1iay9ZgmK3Bzj8iqK5
…arters

Both sides add: the rules in AGENTS.md, the e2e tests, the test designs
(the imported one beside the 7.02 set) and the classes gen-classes writes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011N8v1iay9ZgmK3Bzj8iqK5
…tten

A class the editor writes in 7.02 now opens as a 7.02 design: its rows
(fields set on a work area, APPENDed, CLEARed), its texts joined with
cl_abap_char_utilities, and the tree binding as literals around
client->_bind( ). A 7.40 text with a line break, a string template with
no expression, is read as text too. A long text written in pieces is
read as one: literalText( ) took `a` && `b` for one literal with the
pieces inside, and seedValue( ) did not fall back to them.

Every test design round-trips byte-identically in both releases now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011N8v1iay9ZgmK3Bzj8iqK5
A UI5 runs its scripts on the editor's origin, which the playground and
the docs share. ?ui5=<URL> from a link to the editor or to preview.html
now takes a URL only on this host, localhost, 127.0.0.1 or SAP's UI5
CDNs; preview.html takes any host only when the editor frames it, where
the user typed it into the UI5 field. A refused link says so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011N8v1iay9ZgmK3Bzj8iqK5
@oblomov-dev
oblomov-dev merged commit 8709dcd into main Oct 15, 2026
2 checks passed
@oblomov-dev
oblomov-dev deleted the claude/abap2ui5-competitor-analysis-3m3r6i branch October 15, 2026 15:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants