Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/advanced/insights/01-somewhere-on-the-way-to-ui5.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ handed back. `comp-type` says whether a component is a DDIC type, which is
where the real labels live — the field catalog, rebuilt from its own source.

Full source:
[`Z2UI5_CL_SMP_APP_497`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_497.clas.abap),
[`Z2UI5_CL_SMP_APP_497`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_497.clas.abap),
one of the abap2UI5 samples, so it is compiled and linted on every commit.

A table nobody described, drawn from whatever the data turned out to be.
Expand Down
4 changes: 2 additions & 2 deletions docs/cookbook/browser_interaction/clipboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ unless its row names another of the three sample repositories — pull that repo

| Sample | Class |
|---|---|
| Copy to Clipboard (A) | [`Z2UI5_CL_SMP_APP_325`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_325.clas.abap) |
| Local and Session Storage (A,C) | [`Z2UI5_CL_SMP_APP_327`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_327.clas.abap) |
| Copy to Clipboard (A) | [`Z2UI5_CL_SMP_APP_325`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_325.clas.abap) |
| Local and Session Storage (A,C) | [`Z2UI5_CL_SMP_APP_327`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_327.clas.abap) |

<!-- samples:end -->
6 changes: 3 additions & 3 deletions docs/cookbook/browser_interaction/focus.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,8 +108,8 @@ unless its row names another of the three sample repositories — pull that repo

| Sample | Class |
|---|---|
| Set Focus and Select Text in an Input (A) | [`Z2UI5_CL_SMP_APP_133`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_133.clas.abap) |
| Jump to the Next Input on Enter (A) | [`Z2UI5_CL_SMP_APP_189`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_189.clas.abap) |
| Focus a Table Cell by Column and Row (A) | [`Z2UI5_CL_SMP_APP_421`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_421.clas.abap) |
| Set Focus and Select Text in an Input (A) | [`Z2UI5_CL_SMP_APP_133`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_133.clas.abap) |
| Jump to the Next Input on Enter (A) | [`Z2UI5_CL_SMP_APP_189`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_189.clas.abap) |
| Focus a Table Cell by Column and Row (A) | [`Z2UI5_CL_SMP_APP_421`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_421.clas.abap) |

<!-- samples:end -->
2 changes: 1 addition & 1 deletion docs/cookbook/browser_interaction/keyboard_shortcuts.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,6 @@ unless its row names another of the three sample repositories — pull that repo

| Sample | Class |
|---|---|
| Keyboard Shortcuts, Ctrl+S (A) | [`Z2UI5_CL_SMP_APP_471`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_471.clas.abap) |
| Keyboard Shortcuts, Ctrl+S (A) | [`Z2UI5_CL_SMP_APP_471`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_471.clas.abap) |

<!-- samples:end -->
4 changes: 2 additions & 2 deletions docs/cookbook/browser_interaction/scrolling.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ unless its row names another of the three sample repositories — pull that repo

| Sample | Class |
|---|---|
| Scroll to a Pixel Position (A) | [`Z2UI5_CL_SMP_APP_362`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_362.clas.abap) |
| Scroll a Control into View (A) | [`Z2UI5_CL_SMP_APP_363`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_363.clas.abap) |
| Scroll to a Pixel Position (A) | [`Z2UI5_CL_SMP_APP_362`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_362.clas.abap) |
| Scroll a Control into View (A) | [`Z2UI5_CL_SMP_APP_363`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_363.clas.abap) |

<!-- samples:end -->
142 changes: 78 additions & 64 deletions docs/cookbook/browser_interaction/soft_keyboard.md
Original file line number Diff line number Diff line change
@@ -1,78 +1,92 @@
---
outline: [2, 4]
samples:
- z2ui5_cl_smp_app_352
- z2ui5_cl_smp_app_516
- z2ui5_cl_smp_app_530
---
# Soft Keyboard

## Hide Soft Keyboard
On a touch device the on-screen keyboard pops up whenever an input receives
focus. Sometimes you do not want it — in a warehouse, on a handheld used mainly
for barcode scanning, the keyboard covers half the screen and nobody ever types
into the field. Sometimes you want a *different* one: a digit pad for a
quantity, a phone layout for a number.

For UI5 input fields, the soft keyboard pops up automatically when an input receives focus. Sometimes — for example, in warehouses with small devices used mainly for barcode scanning — you don't want this behavior.
Both are the HTML `inputmode` attribute, and abap2UI5 exposes it as a **bound
property** of a companion control.

The `keyboard_set_mode` frontend event sets the HTML `inputmode` attribute on a UI5 input. Pass the control id and the desired mode (`none` hides the soft keyboard; `text`, `numeric`, `decimal`, `tel`, etc. restore it with the matching layout).
## The control

`z2ui5.cc.InputExt` is a `sap.m.Input` in every respect — same value binding,
same suggestions, same value state, same events — with one property added:

| Property | What it does |
|---|---|
| `inputMode` | the HTML `inputmode` of the inner `<input>`: `none` keeps the keyboard down, `numeric`, `decimal`, `tel`, `email`, `url`, `search`, `text` ask for that layout. Empty leaves the field exactly as `sap.m.Input` rendered it |

Declare the namespace on the view and build the field as `z2ui5:InputExt`:

```abap
CLASS z2ui5_cl_sample_softkeyb DEFINITION PUBLIC.

PUBLIC SECTION.
INTERFACES z2ui5_if_app.

DATA input TYPE string.

PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.

CLASS z2ui5_cl_sample_softkeyb IMPLEMENTATION.
METHOD z2ui5_if_app~main.

IF client->check_on_navigated( ).

DATA(view) = z2ui5_cl_ui5_view_builder=>factory(
)->ele( n = `View` ns = `mvc`
)->a( n = `xmlns` v = `sap.m`
)->a( n = `xmlns:mvc` v = `sap.ui.core.mvc`
)->a( n = `xmlns:form` v = `sap.ui.layout.form`

)->ele( `Shell`
)->ele( `Page`
)->a( n = `title` v = `abap2UI5 - Softkeyboard on/off`
)->a( n = `navButtonPress` v = client->_event( `BACK` )
)->a( n = `showNavButton` b = client->check_app_prev_stack( )

)->ele( n = `SimpleForm` ns = `form`
)->a( n = `editable` b = abap_true

)->ele( n = `content` ns = `form`
)->tag( `Title`
)->a( n = `text` v = `Keyboard on/off`
)->tag( `Label`
)->a( n = `text` v = `Input`
)->tag( `Input`
)->a( n = `id` v = `ZINPUT`
)->a( n = `value` v = client->_bind( input )
)->a( n = `valueHelpRequest` v = client->_event( `CALL_KEYBOARD` )
)->a( n = `showValueHelp` b = abap_true ).

client->view_display( view->stringify( ) ).

RETURN.
ENDIF.

CASE client->get( )-event.
WHEN `CALL_KEYBOARD`.
client->follow_up_action( val = client->cs_event-keyboard_set_mode
t_arg = VALUE #( ( `ZINPUT` ) ( `none` ) ) ).
WHEN `BACK`.
client->nav_app_leave( ).
ENDCASE.

ENDMETHOD.
ENDCLASS.
DATA(view) = z2ui5_cl_ui5_view_builder=>factory(
)->ele( n = `View` ns = `mvc`
)->a( n = `xmlns` v = `sap.m`
)->a( n = `xmlns:mvc` v = `sap.ui.core.mvc`
)->a( n = `xmlns:z2ui5` v = `z2ui5.cc` ).

view->ele( `Shell`
)->ele( `Page`
)->a( n = `title` v = `abap2UI5 - Soft Keyboard`

)->tag( n = `InputExt` ns = `z2ui5`
)->a( n = `value` v = client->_bind( value )
)->a( n = `inputMode` v = client->_bind( mode ) ).

client->view_display( view->stringify( ) ).
```

To re-enable the keyboard, fire the same event with a different mode (`text`, `numeric`, …).
`mode` is an ordinary `TYPE string` attribute of the app. Switching the keyboard
is therefore a **model update and nothing else**:

```abap
CASE client->get_event( ).
WHEN `NUMERIC`.
mode = `numeric`.
WHEN `OFF`.
mode = `none`.
ENDCASE.
```

No follow-up action travels, and there is no ordering to get right between an
action and the next render.

## Why it is a property and not an action

`inputmode` lives on one DOM attribute, and **UI5 throws that DOM away on every
re-render**. A frontend action that writes the attribute therefore holds only
until the next thing redraws the field — a model update on the same input
included — and nothing reports that it is gone: the field still works, the
keyboard just comes back.

`InputExt` writes the mode on every rendering, so it is part of what the control
*is*. That is also why the mode survives a roundtrip without the app restoring
anything.

::: warning cs_event-keyboard_set_mode is removed
Before 2026-09 this page taught a frontend action,
`client->follow_up_action( val = client->cs_event-keyboard_set_mode … )`, which
set the attribute directly on the DOM. It carried exactly the defect above and
**was removed from the framework**; an app that still calls it fails at compile
time. The migration is the control on this page: declare
`xmlns:z2ui5="z2ui5.cc"`, build the field as `z2ui5:InputExt`, bind `inputMode`
to a string attribute, and delete the action.
:::

## An unknown mode is refused, not guessed

`inputMode` is checked against the HTML keyword list before it is written. A
browser silently falls back to its default for a keyword it does not know, which
on screen is indistinguishable from the property having had no effect at all —
so the control logs the bad value instead and writes nothing.

<!-- samples:start (generated by scripts/link-samples.mjs — do not edit) -->

Expand All @@ -85,7 +99,7 @@ unless its row names another of the three sample repositories — pull that repo

| Sample | Class |
|---|---|
| Soft Keyboard Mode on Mobile (A) | [`Z2UI5_CL_SMP_APP_352`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_352.clas.abap) |
| Keyboard Layout of an Input (inputmode) (C) | [`Z2UI5_CL_SMP_APP_516`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_516.clas.abap) |
| Keyboard Layout of an Input (inputmode) (C) | [`Z2UI5_CL_SMP_APP_516`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_516.clas.abap) |
| Scan Field with Submit (InputExt) (A,C) | [`Z2UI5_CL_SMP_APP_530`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_530.clas.abap) |

<!-- samples:end -->
4 changes: 2 additions & 2 deletions docs/cookbook/browser_interaction/timer.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ unless its row names another of the three sample repositories — pull that repo

| Sample | Class |
|---|---|
| Progress Indicator during a Backend Call (A) | [`Z2UI5_CL_SMP_APP_064`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_064.clas.abap) |
| Refresh the View Every n Seconds (A) | [`Z2UI5_CL_SMP_APP_028`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_028.clas.abap) |
| Progress Indicator during a Backend Call (A) | [`Z2UI5_CL_SMP_APP_064`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_064.clas.abap) |
| Refresh the View Every n Seconds (A) | [`Z2UI5_CL_SMP_APP_028`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_028.clas.abap) |

<!-- samples:end -->
4 changes: 2 additions & 2 deletions docs/cookbook/browser_interaction/title.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ unless its row names another of the three sample repositories — pull that repo

| Sample | Class |
|---|---|
| Set the Tab Title (A) | [`Z2UI5_CL_SMP_APP_125`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_125.clas.abap) |
| Set the Tab Favicon (A) | [`Z2UI5_CL_SMP_APP_491`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_491.clas.abap) |
| Set the Tab Title (A) | [`Z2UI5_CL_SMP_APP_125`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_125.clas.abap) |
| Set the Tab Favicon (A) | [`Z2UI5_CL_SMP_APP_491`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_491.clas.abap) |

<!-- samples:end -->
6 changes: 3 additions & 3 deletions docs/cookbook/browser_interaction/url_handling.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,8 @@ unless its row names another of the three sample repositories — pull that repo

| Sample | Class |
|---|---|
| Open a URL in a New Tab (A) | [`Z2UI5_CL_SMP_APP_073`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_073.clas.abap) |
| Open Mail, Phone and SMS Links (A) | [`Z2UI5_CL_SMP_APP_316`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_316.clas.abap) |
| Reload the Page (A) | [`Z2UI5_CL_SMP_APP_492`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_492.clas.abap) |
| Open a URL in a New Tab (A) | [`Z2UI5_CL_SMP_APP_073`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_073.clas.abap) |
| Open Mail, Phone and SMS Links (A) | [`Z2UI5_CL_SMP_APP_316`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_316.clas.abap) |
| Reload the Page (A) | [`Z2UI5_CL_SMP_APP_492`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_492.clas.abap) |

<!-- samples:end -->
2 changes: 1 addition & 1 deletion docs/cookbook/device_capabilities/camera.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,6 @@ unless its row names another of the three sample repositories — pull that repo

| Sample | Class |
|---|---|
| Camera, Take Photos (C) | [`Z2UI5_CL_SMP_APP_306`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_306.clas.abap) |
| Camera, Take Photos (C) | [`Z2UI5_CL_SMP_APP_306`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_306.clas.abap) |

<!-- samples:end -->
2 changes: 1 addition & 1 deletion docs/cookbook/device_capabilities/geolocation.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,6 @@ unless its row names another of the three sample repositories — pull that repo

| Sample | Class |
|---|---|
| Geolocation from the Browser (C) | [`Z2UI5_CL_SMP_APP_120`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_120.clas.abap) |
| Geolocation from the Browser (C) | [`Z2UI5_CL_SMP_APP_120`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_120.clas.abap) |

<!-- samples:end -->
4 changes: 2 additions & 2 deletions docs/cookbook/device_capabilities/info.md
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ unless its row names another of the three sample repositories — pull that repo

| Sample | Class |
|---|---|
| Frontend Info: UI5 Version, Theme, OS, Browser | [`Z2UI5_CL_SMP_APP_122`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_122.clas.abap) |
| Device Model: Phone, Tablet, Desktop (A) | [`Z2UI5_CL_SMP_APP_445`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_445.clas.abap) |
| Frontend Info: UI5 Version, Theme, OS, Browser | [`Z2UI5_CL_SMP_APP_122`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_122.clas.abap) |
| Device Model: Phone, Tablet, Desktop (A) | [`Z2UI5_CL_SMP_APP_445`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_445.clas.abap) |

<!-- samples:end -->
2 changes: 1 addition & 1 deletion docs/cookbook/device_capabilities/pdf.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,6 @@ unless its row names another of the three sample repositories — pull that repo

| Sample | Class |
|---|---|
| Open the PDF Viewer by ID (A) | [`Z2UI5_CL_SMP_APP_449`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_449.clas.abap) |
| Open the PDF Viewer by ID (A) | [`Z2UI5_CL_SMP_APP_449`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_449.clas.abap) |

<!-- samples:end -->
6 changes: 3 additions & 3 deletions docs/cookbook/device_capabilities/upload_download.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,8 @@ unless its row names another of the three sample repositories — pull that repo

| Sample | Class |
|---|---|
| Upload to the Backend (C) | [`Z2UI5_CL_SMP_APP_074`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_074.clas.abap) |
| Download to the Browser (A) | [`Z2UI5_CL_SMP_APP_186`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_186.clas.abap) |
| Upload with an UploadSet (C) | [`Z2UI5_CL_SMP_APP_517`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_517.clas.abap) |
| Upload to the Backend (C) | [`Z2UI5_CL_SMP_APP_074`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_074.clas.abap) |
| Download to the Browser (A) | [`Z2UI5_CL_SMP_APP_186`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_186.clas.abap) |
| Upload with an UploadSet (C) | [`Z2UI5_CL_SMP_APP_517`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_517.clas.abap) |

<!-- samples:end -->
51 changes: 49 additions & 2 deletions docs/cookbook/event_navigation/backend.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,53 @@ ENDMETHOD.
You can read any object attribute, but use only public and released attributes to avoid compatibility issues with future UI5 versions.
:::

## A Control in Another View Slot

The forms above read the control that fired, the event object, or a bound
model property. None of them reaches a **different** control — an id is local
to the view or fragment it was written in, and a `${...}` is a binding path,
so it addresses data and never a control.

`$controller.slotValue( slot, id, getter )` reads what a control in a named
view slot currently holds. The classic case is a dialog whose value the button
that closes it has to carry:

```abap
)->a( n = `press` v = client->_event(
val = `SAVE`
arg = `$controller.slotValue('POPUP','myEditor','getImagePngDataURL')` ) ).
```

```abap
CASE client->get( )-event.
WHEN `SAVE`.
DATA(image) = client->get_event_arg( ).
client->popup_destroy( ).
ENDCASE.
```

The slot is one of the `cs_view` keys — `MAIN`, `NEST`, `NEST2`, `POPUP`,
`POPOVER` — and an **empty** slot searches every open one and then the global
registry, the same resolution `cs_event-control_by_id` uses for
`cs_view-main`.

The getter takes no arguments on purpose. To *call* a control, use
`cs_event-control_by_id`, which has a method whitelist in front of it; this is
a read.

::: tip It never throws, it logs
A closed slot, an unknown id, a method the control does not have, or a getter
that raises — each is written to the browser console and sent as the empty
string. That is deliberate: an argument expression is evaluated while UI5
dispatches the handler, so an expression that throws loses the whole **event**,
leaving a button that does nothing and an app with no way to tell.
:::

`$controller.slotById( slot, id )` hands the control itself over, for a
null-tolerant reader such as `$controller.textPath( )`. It answers `null` on a
miss — and a method call on that `null` is exactly the throw the tip above
describes, so prefer `slotValue( )` whenever you want a value.

## Model Properties
Read model properties bound to the event:
```abap
Expand Down Expand Up @@ -189,7 +236,7 @@ unless its row names another of the three sample repositories — pull that repo

| Sample | Class |
|---|---|
| Extra Arguments with t_arg | [`Z2UI5_CL_SMP_APP_167`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_167.clas.abap) |
| Control Objects in t_arg (FacetFilter) | [`Z2UI5_CL_SMP_APP_197`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_197.clas.abap) |
| Extra Arguments with t_arg | [`Z2UI5_CL_SMP_APP_167`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_167.clas.abap) |
| Control Objects in t_arg (FacetFilter) | [`Z2UI5_CL_SMP_APP_197`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_197.clas.abap) |

<!-- samples:end -->
4 changes: 2 additions & 2 deletions docs/cookbook/event_navigation/exception.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ unless its row names another of the three sample repositories — pull that repo

| Sample | Class |
|---|---|
| MessageBox from SY, BAPIRET2 or Exception | [`Z2UI5_CL_SMP_APP_008`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_008.clas.abap) |
| Uncaught Error and Error Popup | [`Z2UI5_CL_SMP_APP_464`](https://github.com/abap2UI5/samples/blob/main/src/01/z2ui5_cl_smp_app_464.clas.abap) |
| MessageBox from SY, BAPIRET2 or Exception | [`Z2UI5_CL_SMP_APP_008`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_008.clas.abap) |
| Uncaught Error and Error Popup | [`Z2UI5_CL_SMP_APP_464`](https://github.com/abap2UI5/samples/blob/main/src/z2ui5_cl_smp_app_464.clas.abap) |

<!-- samples:end -->
Loading
Loading