Skip to content

Fifteen draft posts and expanded sample links across docs - #311

Merged
oblomov-dev merged 12 commits into
mainfrom
claude/sleepy-curie-tjrzx3
Sep 12, 2026
Merged

Fifteen draft posts and expanded sample links across docs#311
oblomov-dev merged 12 commits into
mainfrom
claude/sleepy-curie-tjrzx3

Conversation

@oblomov-dev

Copy link
Copy Markdown
Member

Summary

This PR adds fifteen draft teaser posts to the publishing queue, expands sample repository support from one to three repositories, and links sample classes throughout the documentation. The changes enable the framework to reference samples from samples-controls and samples-stack repositories in addition to the primary samples repository.

Key Changes

Teaser Posts (blog/teaser-posts.md)

  • Added fifteen new draft posts marked as unposted: "One Click, One Request", "What the Client Can Do", "CALL SCREEN, LEAVE SCREEN", "Where F4 Went", "MESSAGE Still Works", "The Lock Is Gone by the Next Click", "Who May Start Which App", and "100 Rows, Four Hours, One Request"
  • Updated header documentation to explain the draft status and the "Not yet published" section for posts awaiting articles
  • Removed the old "No Cache, No Deploy, Any IDE" post, replaced with "One Click, One Request"

Sample Repository Support (scripts/lib/catalogue.mjs, scripts/link-samples.mjs)

  • Extended sample linking to support three repositories via class prefix: z2ui5_cl_smp_app_* (samples), z2ui5_cl_smpc_* (samples-controls), z2ui5_cl_smps_* (samples-stack)
  • Added resolveHome() function to locate sample repository checkouts
  • Updated documentation to explain the three-repository model and how the prefix determines which repository is consulted
  • Modified GitHub Actions workflows to fetch catalogue.json from samples-controls and samples-stack repositories

Documentation Sample Links

  • Added samples: frontmatter to 20+ cookbook and tutorial pages, linking to relevant sample classes across all three repositories
  • Pages updated include: device capabilities (info, barcode scanning, audio), EML/CDS/SQL (EML, RAP, draft handling), expert topics (lock, smart controls, statefulness, OData, WebSocket, value help), event navigation (cross app), and browser interaction (clipboard, focus, keyboard shortcuts, scrolling, soft keyboard, timer, title, URL handling)
  • Added new index pages for /cookbook/ and /advanced/ sections

API Reference and Testing

  • Fixed ABAP-Doc entity decoding in client-interface.mjs to properly convert XML entities (', ", &, ', ') to plain text characters
  • Added test coverage for entity decoding in test/client-interface.test.mjs
  • Updated test/catalogue.test.mjs to test the new resolveHome() function

Configuration Updates

  • Updated .github/workflows/check.yml and deploy.yml to fetch catalogue.json from samples-controls and samples-stack
  • Modified docs/.vitepress/config.mjs to add index pages for cookbook and advanced sections
  • Updated AGENTS.md to document the new sample linking workflow

Notable Implementation Details

  • The three-repository model is determined entirely by class prefix, making it self-documenting and requiring no additional configuration
  • Sample links are generated from catalogue.json files in each repository, allowing samples to be updated independently without documentation changes
  • The resolveHome() function supports both explicit environment variables and conventional sibling checkout locations for local development
  • Entity decoding properly handles both named entities and numeric forms, fixing a long-standing issue where sap.tnt's rendered incorrectly

https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw

claude and others added 12 commits September 11, 2026 15:42
…replaced the old one

The row for the three HTTP types sent readers to z2ui5_if_exit, which the same
page deprecates in favor of z2ui5_if_ui5_exit in the same release - and the
framework declares them on z2ui5_if_ui5_exit (z2ui5_if_exit only aliases them
from src/99). The sentence under the exit rename still said the examples on
this site were waiting for the release that brings the new name; 1.144.0
shipped on 2026-08-30 and every exit example here already implements it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
…o side links land where they promise

The "New to abapGit?" aside sent readers to the toolchain page, which never said
how to install abapGit; it now links the official installation guide, and the
toolchain page gained an "Installing abapGit" section so its own link is worth
following. The note about deploying the frontend as an app of its own pointed
at the contributor dev-server page; the page that documents the deployment to
the UI5 ABAP repository is Fiori Launchpad. A short "Before You Start" list
names what the three steps take for granted: abapGit, developer authorization
plus a SICF node, a package, and a browser that reaches the UI5 CDN or a
system that serves UI5 itself.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
…codes every entity ABAP-Doc can write

The intro above the generated block said the reference was taken at the
release named in the nav bar and printed what an install has, "not what main
already promises". The generator has read main since 2026-09-02 (frameworkRef
in lib/release.mjs), and its own line under the marker said so; the prose
around it did not. It now says the block is ahead of the newest release by
design and where the next-release column is. Nothing between the markers
changed - the block stays byte-identical to what the generator writes.

The parser knew three XML entities, so an apostrophe in an ABAP-Doc line
reached the page as `sap.tnt&apos;s`. It decodes all five and the numeric
forms now, `&amp;` last; a test pins it. The stale header comment in
client-interface.mjs that still claimed "never main" follows release.mjs.
`npm run generate:api` has to run once after this lands, together with the
framework's doc-comment changes, to rewrite api.md and client-api.json.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
Three of the manual's sections opened on their first chapter and lied about
it: Advanced Topics on a fifty-line page about one exit interface,
Configuration on a page called Installation that holds no installation step,
the Cookbook on the Cheat Sheet, whose first line tells the reader it is a
checklist and not an introduction. The Device Capabilities group opened on a
page with no ABAP on it at all.

Advanced Topics and the Cookbook get an index page each - one row per group,
what it covers, where it starts - and the section link opens it. The config
comment that argued against a Cookbook overview stays, extended: the index is
for discovery, the rows below it for lookup. Installation keeps its URL and
says what it is: Deployment Scenarios, with the Quickstart named in its first
line as the place the install itself is. The Device Capabilities landing page
carries a runnable class that reads s_ui5 and s_device out of client->get( )
and shows every field, with a Run button.

test/crumbs.test.mjs now distinguishes a section's own page - one crumb - from
a chapter, which gets a longer trail.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
Two "paste this into your assistant" blocks existed - this page's, pointing
at the site's llms.txt, and the framework README's, pointing at
building-apps.md and the repository's llms.txt - and an assistant given one
worked from half of what the other named. One block now, in both places: the
three files, the shape of an app, the catalogue's machine-readable index at
the playground (all three repositories, where SAMPLES.md was one), the
linter, and the instruction to say so rather than invent. The page's figure
for the corpus says "over 700" like the front door.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
All 36 articles closed on "Happy ABAPing! 🦖🦕🦣" - the sign-off of a LinkedIn
post, under an article about authorization and CSRF as under the one about
RTTS, and nothing else in the manual speaks like that. The line goes; the
articles end on their own last sentence.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
…re for the corpus

Two pages called /get_started/ai "Building with AI" while its title is
"Developing with AI". Fourteen pages linked their neighbours with relative
paths (`../model/device_model.md`, `./message`) where the rest of the site
writes `/cookbook/model/device_model` - all resolve today and every one is a
move away from a broken link; they are root-absolute now. Four pages said
"hundreds" of samples where the front door says "over 700"; one figure. Two
`javascript` fences are `js` like the others. The view definition page's
"the next section" is a link to Binding. The WebSocket page's "check the
release notes for your system" says which release brought AMC/APC and where
the samples-stack README states what its package needs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
link-samples.mjs read one catalogue and linked one repository: BLOB was
abap2UI5/samples, hardcoded, and the 668 samples of samples-controls and
samples-stack - every control port, every RAP, OData, draft, WebSocket and
launchpad sample - could not be named by the pages that explain exactly
them. Three pages named them by hand instead ("Demo apps 475-479 in the
samples repository", which is the wrong repository; two class names in
prose), which is the shape of reference that goes stale unwatched.

The class prefix decides the repository now. The samples repository is read
from its SAMPLES.md as before; the other two from their catalogue.json,
through lib/catalogue.mjs's homes and its fallback to the published copy
(resolveHome( ) and entriesByClass( ) are new there, pinned by tests). The
reverse `" @docs` check stays what it was for abap2UI5/samples; for the other
two, which carry no such line by their own convention, the class has to be in
the catalogue and, with a checkout at hand, in the tree. A row from another
repository says which one - and which package branch, for samples-stack -
because that is what the reader pulls. The block's intro names the catalogue
page all three are searchable on. The hand-written source links are held
against all three checkouts.

Twelve cookbook pages declare their samples with it: RAP, EML and draft
handling (the five RAP and five draft classes), OData, smart controls (the
whole package, where the prose said "475-479" and named the wrong
repository), WebSocket, statefulness and locks, cross-app navigation, audio,
barcode scanning, and logging - the last one an abap2UI5/samples class that
gets its `" @docs` line over there in the same change. CI checks the two
sibling repositories out with catalogue.json and src for it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
…sion table, and step 12 folds the class it tests

The hero had one outlined button. A developer arriving here had nothing to
press that runs something in the next ten seconds - the bar names the
playground and the example runs on the page, but neither is a call to
action in the first screen, and a first screen without a primary action
reads as a brochure. "Try it in the playground" is the accent button now,
same tab like every way into the neighbouring site; "Learn more…" stays
beside it for the reader the cards are written for. (A playground button
was taken out of this hero once as the third copy of what the page offered
twice; it is back on purpose, as the primary action - the two readers of
this page want different first clicks.)

The Lock page ended on its "Overview" - the table that says which of the
eight strategies to pick. That is the first thing a reader needs, so it
opens the page as "Which Strategy?"; every full class was already folded
under its section.

Step 12 printed the 238-line class under test in full before the 60-line
test class the step is about. It is unchanged from Step 10, so it is folded
now - one click to copy, and the tests come first.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
…cles' order

blog/teaser-posts.md says of itself that its sections stand in the order the
articles are numbered and that a post moves here when an article moves
there - and it was true of neither. Fifteen articles had no post (#16 to
#26 as a block, #29, #30, #31 and #36), four posts had no article, and #15
was followed by #27. The sections stand in the numbering now, all 36; the
four posts without an article wait under "Not yet published" and move up
the day theirs lands; and the fifteen missing posts are drafted from the
articles in the shape of the ones before them - plain text, a first line
that says the whole thing, one "New article" line, a closing question - and
say so in their heading, so nobody posts one unread.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
…d reference decodes its apostrophes again

The parser behind resources/api.md learnt all five XML entities on
2026-09-11, and the committed reference still carried the `&apos;` it
had rendered before that - so check:api-reference was red against its
own parser until someone regenerated. Regenerated now; the only change
in the page and the JSON is `sap.tnt&apos;s` reading `sap.tnt's`.

Regenerating needed raw.githubusercontent.com, which not every machine
can reach, and a branch that has not merged could not be rendered at
all. A2UI5_HOME names a clone of the framework, and the three gates that
resolve frameworkRef( ) - check:api-names, check:api-reference and
generate:api - read the same ref out of it with `git show`, trying the
remote's copy of the branch too. The working tree is deliberately not
read: it is whichever branch the clone is on, and a gate's verdict must
not depend on what a neighbouring checkout was doing. Both scripts now
print where the interface came from, so an OK says what it verified
against.

Pinned by test/client-interface.test.mjs with a throwaway clone whose
working tree has moved to a branch with a different interface.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018iwitBYyKKRb5BoPFJ9Etw
@oblomov-dev
oblomov-dev merged commit 175ca41 into main Sep 12, 2026
1 check failed
@oblomov-dev
oblomov-dev deleted the claude/sleepy-curie-tjrzx3 branch September 12, 2026 10:53
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