@abap2ui5/embed-control
A UI5 custom control that runs an abap2UI5abap2UI5One ABAP class implementing z2ui5_if_app is the whole app: the browser loads a generic UI5 shell once, and every interaction after that is an HTTP roundtrip back into ABAP.community org, abap app inside a host UI5 app, with the abap2UI5 frontend loaded from the backend the app talks to.
z2ui5.embed.Container puts an abap2UI5abap2UI5One ABAP class implementing z2ui5_if_app is the whole app: the browser loads a generic UI5 shell once, and every interaction after that is an HTTP roundtrip back into ABAP.community org, abap app, an ABAP class implementing z2ui5_if_app, into a host UI5 app as an ordinary control, written in an XML view or created in code, with the ABAP class, the service path and the parameters as its properties. The package carries the control alone: the abap2UI5 frontend it wraps comes from the installation the app talks to, so the host app never ships a copy of it and the frontend always matches that backend. Setting it up is an npm install, an includeDependency entry in ui5.yaml and a resourceRoots entry in manifest.json; nothing is deployed to the ABAP system, because the control is a plain module with no component and no library. Every control is its own abap2UI5 session, and a change of app, endpoint or params, or a call to restart(), ends the running session and starts a new one.
Facts
Where it sits
Who is behind it
In the atlas: maintains 18@abap2UI5oblomov-devoblomov-devMaintains this
In the atlas: maintains 4, contributes to 44@oblomov-devmaintainers
Before choosing this
Conditions
PracticalFunctional boundary
The page and the abap2UI5abap2UI5One ABAP class implementing z2ui5_if_app is the whole app: the browser loads a generic UI5 shell once, and every interaction after that is an HTTP roundtrip back into ABAP.community org, abap service have to share an origin: an endpoint that resolves to another origin is refused, and abap2UI5 rejects a POST whose Origin names another host. A host that routes by the URL hash, such as a Fiori elements app or an app with a UI5 router, needs abap2UI5 1.146.0 or later, because 1.145.0 clears the host's hash after every roundtrip. One frontend per page: the first control that starts decides which endpoint the frontend comes from.
What it declares
Every artifact
- Type
- Package
- Origin
- By a community org
As a package
- Where it runs
- Inside its host
- Distributed through
- npmabapGit
Connections
Custom controls, wrappers and icon fonts packaged for reuse
UI5 apps written as one ABAP class, rendered by a generic shell
UI5 Tooling command line for project setup, dev server and build
UI5 apps written as one ABAP class, rendered by a generic shell
Download
Install
npm add @abap2ui5/embed-controlDerived from the package name. No recipe recorded; the README has the configuration.
README
quoted from abap2UI5/embed-control under MIT, read@abap2ui5/embed-control
Run abap2UI5 apps inside any UI5 app.
abap2UI5 builds UI5 apps purely in ABAP: an ABAP class implementing
z2ui5_if_app decides the view and handles every event. This package puts
such an app into your UI5 app as an ordinary control, next to your own
controls:
<mvc:View xmlns:mvc="sap.ui.core.mvc" xmlns:z2ui5="z2ui5.embed">
<z2ui5:Container app="Z2UI5_CL_UI5_APP_HI_WORLD" height="400px"/>
</mvc:View>
The package is the control and nothing else. The abap2UI5 frontend it wraps comes from the abap2UI5 installation the app talks to - so it always has the version of that backend, and your app never carries a copy of it.
Install
npm install @abap2ui5/embed-control
Then two entries in your app. ui5.yaml - so ui5 build copies the control
into your app (ui5 serve serves it anyway):
builder:
settings:
includeDependency:
- "@abap2ui5/embed-control"
manifest.json - where the control's namespace lives:
"sap.ui5": {
"resourceRoots": { "z2ui5.embed": "./thirdparty/z2ui5/embed/" }
}
The build puts it into dist/thirdparty/z2ui5/embed/ and your deployment
takes it along like every other file of the app. Not under resources/: an
app deployed to an ABAP system answers every <app>/resources/ path from the
UI5 library of the system. The relative resource root holds in a standalone
page and in the SAP Fiori launchpad alike.
Nothing else is deployed anywhere: the control is a plain module (no component, no library), so no app index entry of an ABAP system is involved, and any number of apps can carry their own copy.
Use
In an XML view, as above, or in code:
sap.ui.require(["z2ui5/embed/Container"], (Container) => {
new Container({
app: "ZCL_MY_ABAP2UI5_APP",
params: { customer: "4711" },
height: "600px",
}).placeAt("content");
});
| Property | Type | Default | |
|---|---|---|---|
app | string | The ABAP class to run. Nothing starts while it is empty | |
endpoint | string | /sap/bc/z2ui5 | Path of the abap2UI5 HTTP service on this server - absolute, or relative to the page's address (a <base> does not apply), without a query or a fragment. The frontend is loaded from it, the roundtrips go to it. See Backend |
params | object | { name: "value" }, read by the app with client->get( )-t_comp_params; { name: ["a", "b"] } hands several values over under one name. A value that is null or undefined is left out; an object is handed over as JSON text | |
ownsPage | boolean | false | Hands the page to the app - for a page that is this control and nothing else: the app then has what it has on a page of its own - the URL hash (hash routing, set_push_state, hash_replace, browser Back and Forward between routed apps, a route restored on reload), the document title and the favicon, the global busy indicator during a roundtrip, the browser's "leave page?" prompt for unsaved changes. Off, they are your app's: the embedded app leaves the title, the favicon and the hash alone, is busy on its own area and raises no prompt. Leave it off when your page has more than the control - a Fiori elements object page. One such control per page. A change starts the app anew, like one of app, endpoint or params. Needs abap2UI5 1.147.0, which reads it (the control passes ownsHash with it); an older one ignores it |
ownsHash | boolean | false | The older, narrower name of ownsPage: hands the page's URL hash to the app - for a page that is this control and nothing else, which routes by nothing: the app then routes as on a page of its own (hash routing, set_push_state, hash_replace, browser Back and Forward between routed apps, a route restored on reload). Leave it off when your app routes by the hash - a Fiori elements object page does. One such control per page. A change starts the app anew, like one of app, endpoint or params. Needs abap2UI5 1.147.0, which hands the whole page over for it, as for ownsPage; an older one ignores it |
width | CSSSize | 100% | |
height | CSSSize | 100% | The app fills its container - give it a height, or a parent that has one. A change of width or height resizes the area in place; the running app is not re-rendered |
| Event | Parameters | |
|---|---|---|
componentCreated | component | The app's component exists (the first roundtrip is under way) |
componentFailed | reason | It could not be created - the endpoint is not a path on this server, the frontend could not be loaded, or the component failed |
| Method | |
|---|---|
restart() | Ends the running session and starts the app anew with the current app, endpoint and params - the app from scratch, or one more try after componentFailed |
Every control is its own abap2UI5 session - two controls with the same
class do not share state. Changing app, endpoint or params ends the
running session and starts a new one; restart() does the same with the
values as they are; destroying the control ends it too. All three are
ordinary properties, so they can be bound to your model - params is
compared by value with what the running app was started with, so a binding
that hands over the same parameters in a new object does not restart the
app, and an endpoint that names the same place in another spelling (a
trailing slash, a relative path) does not either.
Both events arrive asynchronously, after the rendering that started the
app - a refused endpoint included. A start that failed is not repeated by
itself: change one of the three properties, or call restart(). An
invisible control (visible="false") starts nothing until it is shown; an
app that runs keeps running, with its state, while its control is hidden.
Examples
Complete examples that use the package are in
abap2UI5/samples-embed-control,
on its branch standard, all taking the package from npm:
freestyle/- a UI5 freestyle app with three controls, also as the BSPZ2UI5_HOSTto try it on a system with a plain abapGit pullfiori-elements/- a Fiori elements app with the control in a custom section of its object page: the abap2UI5 app gets the key of the object on the page as a parameterfiori-elements-v2/- a Fiori elements app for OData V2 with the control in an object page extension, and the RAP service it reads; on the branchrap, all of it for one abapGit pull on a system with RAPcard/- a UI Integration Card for SAP Build Work Zone that runs any abap2UI5 app: the class is a card parameter, the backend a card destination
Its README walks through the places the package is wired in.
Backend
The app runs on an ABAP system with
abap2UI5 installed
and its HTTP service (by default /sap/bc/z2ui5) active. The control needs
abap2UI5 1.145.0 or later, whose service answers ?z2ui5-bundle - in
Node that is @abap2ui5/node-runtime 1.145.0, in CAP
@cap2ui5/cds-plugin 0.3.1, which runs on it:
GET /sap/bc/z2ui5?z2ui5-bundle the frontend as one script - loaded once per page
POST /sap/bc/z2ui5 the roundtrips, one session per control
GET /sap/bc/z2ui5 abap2UI5's own page, unchanged
An older abap2UI5 answers with its page; the control then fires
componentFailed ("no abap2UI5 frontend at ...") instead of starting.
What 1.145.0 does not do yet. abap2UI5 1.146.0 fixes all of these; with 1.145.0 itself plan for them:
- The URL hash is the frontend's. 1.145.0 clears the host's hash with the
first roundtrip and after every one: a Fiori elements object page goes back
to its list, SAP Build Work Zone leaves the page a card sits on. And a
host hash shaped like abap2UI5's own deep link,
#/app/<CLASS>, wins over theappproperty - that class starts instead. A host that routes by the hash - a Fiori elements app, an app with a UI5 router, SAP Build Work Zone - needs 1.146.0 or later, whose frontend knows it is embedded and leaves the hash to your app (abap2UI5 677e71b, #2808). - No CSRF token handshake. An SAP approuter route checks CSRF tokens by
default (
cds add approutergenerates such a route), and 1.145.0 sends none - every roundtrip is refused with 403 "X-CSRF-Token: Required". Give the route to the service"csrfProtection": false; abap2UI5's own origin check stays in place. 1.146.0 fetches the token on that 403 (abap2UI5 #2802).
Every release is tested against abap2UI5's main and against 1.145.0
(@abap2ui5/node-runtime 1.145.0) - there without what needs the hash. The
package records the floor in its package.json (abap2ui5.minBackend), and
that is the version the test installs.
The page and the service have to share an origin. abap2UI5 rejects a
POST whose Origin names another host than its own (its CSRF defense), and
the control loads the frontend only from a path on this server - an
endpoint that resolves to another origin is refused, because what comes
back is code that runs in your page. So the browser reaches the service through your
app's origin:
- deployed - the app is served from the same system (BSP, launchpad), or
an approuter / destination routes
/sap/bc/z2ui5to it ui5 serve- a proxy middleware forwards/sapto the system, likeui5-middleware-simpleproxyin the examples. It rewritesHostand tells the backend the dev server's host inX-Forwarded-Host, which abap2UI5 compares the browser'sOriginwith (trusted by default;check_trust_forwarded_hostin the user exit)
Content-Security-Policy: the frontend is a <script src> of your own
origin, and every module in it is a function - nothing is evaluated from a
string. A host with script-src 'self' and no 'unsafe-eval' needs nothing
extra (UI5 1.71 itself still needs 'unsafe-eval').
UI5 libraries
The embedded app loads whatever UI5 library its ABAP view names. With the UI5
CLI serving the framework (framework: in ui5.yaml), list every library
your ABAP apps use there, not only the ones your own views use - the hello
world app, for instance, needs sap.ui.layout - and sap.ui.codeeditor,
which abap2UI5's developer tools (Ctrl+F12 in the embedded app) need. A
library missing there fails in the browser console with a script load
error; an app deployed to a system has every library of that system.
Supported UI5 versions
The same floor as abap2UI5: OpenUI5 / SAPUI5 1.71 and later. The freestyle example is tested on 1.71 and 1.136, the Fiori elements examples for OData V4 and V2 on SAPUI5 1.136, the card on OpenUI5 1.136.
Your app's tooling: UI5 CLI 3 or 4 - the package's ui5.yaml is
specVersion 3.0, and every release is built with both.
Known limitations
- One frontend per page: the first control that starts decides which
endpoint the frontend comes from; every control still sends its roundtrips
to its own endpoint. A control that shared that load with another
endpoint of its own, and saw it fail, tries its own endpoint once. A
bundle the host loaded itself - a
<script src="<endpoint>?z2ui5-bundle">of its page, to have it warm - is taken as it is, not loaded again. - The host page's mobile setup, with abap2UI5 1.146.0 and earlier.
sap.m.App, the root of the embedded frontend, runs UI5'ssap/ui/util/Mobile.initwhen it is created - once per page, with the settings of whoever calls it first. On a host page without asap.m.Appof its own that putsheight: 100%on<html>, adds a viewport meta tag that disables zooming and a format-detection meta tag, and on iOS turns native scrolling off (position: fixedon<html>) and hides the browser's UI. abap2UI5 1.147.0 makes that call first, with everything off, so the host keeps its page; what stays on a phone or tablet is the web-app-capable meta tagsap.m.Appsets on every rendering. From 1.147.0 on the root of an embedded app is asap.m.NavContainer, which sets none of it; withownsPagethe root is thesap.m.Appagain, as on a page of the app's own. A host with asap.m.Appof its own is not affected on any release. - Custom controls from the sibling BSPs
z2ui5_cci/z2ui5_ccc(abap2UI5-addons/custom-controls, the customer's own library) behind a proxy that puts the system under a prefix of its own - SAP Build Work Zone's destination proxy, an approuter route with a prefix - need abap2UI5 1.147.0. Until then the bundle names their paths as the system has them,/sap/bc/ui5_ui5/sap/z2ui5_cci, which the host's origin does not have; from then on its bundle names the node it was requested under, and the frontend puts the prefix of the control'sendpointin front of the roots. Nothing in the control changes with it. - abap2UI5 was built to own the whole page. Its embedded mode leaves the
URL to your app (from 1.146.0 on) - unless
ownsHashhands the hash back (from 1.147.0 on) - and, from 1.147.0 on as well, the document title, the favicon, the busy indicator and the "leave page?" prompt as well, unlessownsPagehands the page back; before that an embedded app shows the global busy indicator during a roundtrip and may set the document title and favicon when the ABAP app asks for it. The rest is still to come (backlog item). Up to 1.146.0 an embedded app renders its root assap.m.App, the full-screen root: the theme's background of its own, and a height of 100% on every ancestor up to the control's area. From 1.147.0 on it is asap.m.NavContainerthat only fills the area, unlessownsPagehands the page back. Before 1.146.0 the app also takes the focus when it starts, from wherever it is in your app - the root focuses the first field of its first page, and the ABAP app may set the focus as well. - Page-wide behaviour of the embedded frontend. Its error dialog's
"Restart" - and "Refresh" on its fatal error screen - reloads the whole
page, your app included. Its developer tools wrap the
window.consolemethods while an app runs (the browser console keeps working; its source links point to the wrapper) and listen for Ctrl+F12 on the document. - Keep-alive. The embedded app's component belongs to your app's
component, the owner of the control, and the abap2UI5 frontend does not
support keep-alive: an app that declares it (
sap.ui5/keepAlive, UI5 1.88+) reports no keep-alive support while it has an embedded app, as UI5 does for every nested component without it.
What is inside
| Path | |
|---|---|
src/Container.js | The control, z2ui5.embed.Container |
src/Container.css | Its stylesheet, loaded by the control |
ui5.yaml | Serves src/ under /thirdparty/z2ui5/embed/ |
CHANGELOG.md | Every release |
License
MIT
History
Other 3
Notes
ownsPage(boolean, defaultfalse): hands the page to the app, ascomponentData.ownsPage- for a host whose page is the control and nothing else (abap2UI5's embed app). The app then has the URL hash, the document title and the favicon, the global busy indicator and the browser's "leave page?" prompt as on a page of its own; without it abap2UI5 1.147.0 leaves all of them to the host. The control passesownsHashwith it, which 1.147.0 reads the same way. A change starts the app anew, like one ofapp,endpointorparams.- Docs: the embedded app's root is a
sap.m.NavContainerfrom abap2UI5 1.147.0 on (abap2UI5/abap2UI5#2913); the README's notes on the mobile setup and on the root say so. Nothing in the control changes. - Docs: what 0.2.0 and these notes called "the release after 1.147.0" -
ownsPage, the page left to the host, thesap.m.NavContainerroot - is in 1.147.0: its tag went out on 2026-10-14 with all three in it.
Other 22
Notes
- The component is created under the name the bundle's
z2ui5/embedmodule gives (componentName) when it gives one - abap2UI5 1.147.0 registers the frontend asz2ui5.embed.frontendas well. That lets a page whose own component isz2ui5embed it: the BSPZ2UI5of abap2UI5's embed app (thestandard_newandcloud_newbranches of abap2UI5/frontend), which existing launchpad target mappings name. An older bundle names none, and the frontend runs asz2ui5as before. ownsHash(boolean, defaultfalse): hands the page's URL hash to the app, ascomponentData.ownsHash- for a host whose page is the control and nothing else (abap2UI5's embed app). The app then routes as on a page of its own: hash routing,set_push_state,hash_replace, browser Back and Forward between routed apps, a route restored on reload. A change starts the app anew, like one ofapp,endpointorparams. Needs abap2UI5 1.147.0, which reads it; an older one ignores it.- README: with the UI5 CLI serving the framework,
sap.ui.codeeditorhas to be among the libraries as well - abap2UI5's developer tools need it, andui5 serveserves only whatui5.yamlnames. widthandheightare applied to the control's area without a rendering. A change re-rendered the ComponentContainer and with it every control of the running app - on UI5 1.71 a value the user was typing and the focus were lost with it, and a host that binds the height to the window size re-rendered the app on every resize.- A bundle the host loaded itself - a
<script>of its page - is not loaded again: the control takes thez2ui5/embedmodule that is there. 0.1.1 loaded it a second time, and UI5 warned that the module was defined twice. - An object among the
params- a structure, a nested array - is handed over as JSON text; 0.1.1 handed it over as the text[object Object]. - An error thrown by a
componentCreatedorcomponentFailedhandler is logged (sap/base/Log, with the control's id) instead of ending as an unhandled promise rejection that nothing attributes to the control. - Node tests of the control (
npm test,test/container.test.mjs): the endpoints it accepts and what it requests, what the component gets, when it starts, restarts and gives up - without a browser or a backend. The examples' Playwright tests in abap2UI5/samples-embed-control keep covering the shipped control against a live abap2UI5. - README: the host page's mobile setup with abap2UI5 1.146.0 and earlier -
sap/ui/util/Mobile.initthrough the embeddedsap.m.App:height: 100%on<html>, a viewport meta tag, native scrolling off on iOS - listed under known limitations; abap2UI5 1.147.0 leaves the host's page alone. Nothing in the control changes with it. restart(): ends the running session and starts the app anew with the currentapp,endpointandparams- the app from scratch, or one more try aftercomponentFailed. A failed start was repeated only by a change of one of the three properties.- An
endpointthat names the same place in another spelling - a trailing slash, a relative path, the default written out - no longer restarts the app: what a start is compared by is the endpoint as it is requested. Nor does anapp_startinparams, whichappoverrides anyway. - An invisible control (
visible="false") starts nothing until it is shown. UI5 callsonBeforeRenderingfor the placeholder it renders, and 0.1.1 started the app - and its backend session - for a control nobody saw. An app that runs keeps running while its control is hidden. componentFailedfor a refused endpoint fired inside the rendering, every other failure after it. All of them arrive asynchronously now, so a handler that changes a model or the control never does so in the rendering phase.- An
endpointwith a query or a fragment is refused as before, and the reason says so (carries a query or a fragment) instead of calling a path on this server another host. paramstakes an array for a name,{ ids: ["1", "2"] }, as several values of that name - the launchpad's shape, which the backend reads; 0.1.1 handed an array over as the text"1,2".- A control that shared the frontend load of another control's endpoint and saw it fail tries its own endpoint once, instead of failing for a backend it never talks to. The first control that starts still decides where the frontend comes from when that load succeeds.
- README: a custom control from the sibling BSPs
z2ui5_cci/z2ui5_cccbehind a prefixing proxy (SAP Build Work Zone, an approuter route with a prefix) needs abap2UI5 1.147.0, whose bundle names the node it was requested under and whose frontend puts the prefix of the control'sendpointin front of the roots - listed under known limitations; nothing in the control changes with it. scripts/consumer-check.mjsruns npm through the node that started it (npm_execpath) instead of lookingnpmup on the PATH, which fails on Windows.package.jsonnames the author (abap2UI5), as npm and the Best of UI5 listing show it.package.jsonrecords the backend floor,"abap2ui5": { "minBackend": "1.145.0" }- the first abap2UI5 whose service answers?z2ui5-bundle, which the README names in prose. The CI's e2e leg against the floor installs the@abap2ui5/node-runtimeof that version, so the two cannot drift. Noengines: the package is a browser control with no Node code, and a UI5 CLI 3 consumer may install it on Node 16 or 18.- The README lists the Fiori elements example for OData V2, with the RAP service it reads, and names the UI5 release it is tested on.
- The README links the proxy example in abap2UI5/samples-embed-control, where the examples are developed now.
- The component is created under the name the bundle's
Other 11
Notes
- Security: an
endpointthat the browser reads as another host - a tab or line break after the first slash ("/\t/evil.example/...") - no longer passes the same-origin check. The endpoint is parsed the way the browser parses it, refused unless it lands on the page's origin, and only the resolved URL is requested. A relativeendpointnow resolves against the page's address. - An
endpointwhose path begins with//once.and..segments are resolved -"/.//evil.example/...","..//evil.example/..."- is refused: no server has such a path, and on its own it names another host. - A page with a
<base>that names another host no longer sends the frontend request and the roundtrips there: the control requested the checked endpoint as a path, which the browser resolves against the<base>. It requests, and hands to the frontend, the absolute URL on the page's origin now. - One failed load of the frontend - a backend that was down, a logon page
instead of the bundle - no longer disables every control on the page for
good. The failure is forgotten and the next start (a new control, or a
change of
app,endpointorparams) asks the backend again; the control no longer asks UI5's module loader forz2ui5/embed, which remembered the module as failed. - A change of
app,endpointorparams, or the control destroyed, while the component was still being created left that component running unseen, with its backend session. The control creates the component itself now and destroys it when the start it belongs to is no longer the current one. - The component is created in the context of the control's owner - your
app's component - as a
ComponentContainerin a view creates it; 0.1.0 created it without an owner. An app that declares keep-alive (sap.ui5/keepAlive, UI5 1.88+) therefore reports no keep-alive support while it has an embedded app: the abap2UI5 frontend does not support it, and 0.1.0 left the embedded app running while its host was inactive. A host deactivated while its app is still starting gets the app all the same, created without the owner. paramsare compared by value: a binding that hands over the same parameters in a new object (model.refresh(true), a formatter) no longer restarts the app and loses its state. They are compared with what the running app was started with, so a params object changed in place and handed over again - as a copy or as the same object - does restart it (0.1.0 missed the same object). A parameter whose value isnullorundefinedis left out instead of reaching the app as the text "null" or "undefined".- The control no longer leaves
window.z2ui5.embedbehind: UI5 exports every class it creates as a global, and abap2UI5 dropped itsz2ui5global on purpose (#2777). The module returns the class, which is all that views andsap.ui.requireuse. - README: the backend floor in Node and CAP too (
@abap2ui5/node-runtime1.145.0,@cap2ui5/cds-plugin0.3.1), what 1.145.0 does not do yet (the URL hash, a#/app/<CLASS>hash that wins overapp, no CSRF token for an approuter route), the page-wide behaviour of the embedded frontend and that a starting app takes the focus from the host. - The package carries this changelog.
- README: abap2UI5 1.146.0 is out - it names the release that leaves the URL hash to the host and answers an approuter's CSRF check, where it said "the first release after 1.145.0".
- Security: an
Other 4
Notes
The first release.
z2ui5.embed.Containerruns an abap2UI5 app - an ABAP class implementingz2ui5_if_app- inside any UI5 app. Propertiesapp,endpoint,params,widthandheight; eventscomponentCreatedandcomponentFailed. Every control is its own abap2UI5 session.- The abap2UI5 frontend is not in the package: the control loads it once per
page from the backend it talks to (
GET <endpoint>?z2ui5-bundle, abap2UI5 1.145.0 or later), and only from a path on the page's own server. - Served and built under
thirdparty/z2ui5/embed/, so it is found in an app deployed to an ABAP system too. UI5 1.71 and later; UI5 CLI 3 and 4. - The control's area is the embedded app's root:
sap.m.Appandsap.m.Shellstop there instead of settingheight: 100%on every ancestor up to<html>- the host's layout stays the host's, and a UI Integration Card keeps the height of its content.
Others providing
Compare all 2 on the Custom controls and libraries page →- custom-controlscustom-controlsThirteen custom controls for abap2UI5, a signature pad and a scanner that reads several barcodes at once among them, each one an ABAP builder class with a single render( ) method and all of them shipped in a BSP of their own.community org, abapThirteen custom UI5 controls for abap2UI5 apps
Details
Sources
Sources are graph entities: the same page may back several entries, and an unreachable source flags every row that rests on it.
Compatibility and provenance
Flavors
“`freestyle/` - a UI5 freestyle app with three controls” — @abap2ui5/embed-control — README
“`fiori-elements/` - a Fiori elements app with the control in a **custom section of its object page**: the abap2UI5 app gets the key of the object on the page as a parameter” — @abap2ui5/embed-control — README
History in the atlas
- First seen.
For your agent
- Ref
artifact:abap2ui5-embed-control- JSON
- /artifacts/abap2ui5-embed-control.json
- MCP
- Connecting an agent