diff --git a/src/01/01/z2ui5_cl_util_func.clas.abap b/src/01/01/z2ui5_cl_util_func.clas.abap
index b2b69e5f..a5040720 100644
--- a/src/01/01/z2ui5_cl_util_func.clas.abap
+++ b/src/01/01/z2ui5_cl_util_func.clas.abap
@@ -42,6 +42,31 @@ CLASS z2ui5_cl_util_func DEFINITION
RETURNING
VALUE(result) TYPE string.
+ CLASS-METHODS db_save
+ IMPORTING
+ uname TYPE clike OPTIONAL
+ handle TYPE clike OPTIONAL
+ handle2 TYPE clike OPTIONAL
+ handle3 TYPE clike OPTIONAL
+ data TYPE any
+ check_commit TYPE abap_bool DEFAULT abap_true
+ RETURNING
+ VALUE(result) TYPE string.
+
+ CLASS-METHODS db_load_by_id
+ IMPORTING
+ id TYPE clike OPTIONAL
+ EXPORTING
+ VALUE(result) TYPE any.
+
+ CLASS-METHODS db_load_by_handle
+ IMPORTING
+ uname TYPE clike OPTIONAL
+ handle TYPE clike OPTIONAL
+ handle2 TYPE clike OPTIONAL
+ handle3 TYPE clike OPTIONAL
+ EXPORTING
+ VALUE(result) TYPE any.
CLASS-METHODS source_get_method
IMPORTING
@@ -1508,4 +1533,70 @@ CLASS z2ui5_cl_util_func IMPLEMENTATION.
RAISE EXCEPTION TYPE z2ui5_cx_util_error EXPORTING val = v.
ENDMETHOD.
+
+ METHOD db_load_by_handle.
+
+ DATA lt_db TYPE STANDARD TABLE OF z2ui5_t_fw_02 WITH EMPTY KEY.
+
+ SELECT data
+ FROM z2ui5_t_fw_02
+ WHERE
+ uname = @uname
+ AND handle = @handle
+ AND handle2 = @handle2
+ AND handle3 = @handle3
+ INTO CORRESPONDING FIELDS OF TABLE @lt_db.
+
+ DATA(ls_db) = lt_db[ 1 ].
+
+ trans_xml_2_any(
+ EXPORTING
+ xml = ls_db-data
+ IMPORTING
+ any = result
+ ).
+
+ ENDMETHOD.
+
+ METHOD db_load_by_id.
+
+ DATA lt_db TYPE STANDARD TABLE OF z2ui5_t_fw_02 WITH EMPTY KEY.
+
+ SELECT data
+ FROM z2ui5_t_fw_02
+ WHERE id = @id
+ INTO CORRESPONDING FIELDS OF TABLE @lt_db.
+
+ DATA(ls_db) = lt_db[ 1 ].
+
+ trans_xml_2_any(
+ EXPORTING
+ xml = ls_db-data
+ IMPORTING
+ any = result
+ ).
+
+ ENDMETHOD.
+
+ METHOD db_save.
+
+ DATA(ls_db) = VALUE z2ui5_t_fw_02(
+ id = uuid_get_c32( )
+ uname = uname
+ handle = handle
+ handle2 = handle2
+ handle3 = handle3
+ data = trans_xml_by_any( data )
+ ).
+
+ MODIFY z2ui5_t_fw_02 FROM @ls_db.
+
+ IF check_commit = abap_true.
+ COMMIT WORK AND WAIT.
+ ENDIF.
+
+ result = ls_db-id.
+
+ ENDMETHOD.
+
ENDCLASS.
diff --git a/src/01/01/z2ui5_t_fw_02.tabl.xml b/src/01/01/z2ui5_t_fw_02.tabl.xml
new file mode 100644
index 00000000..8b20c2e8
--- /dev/null
+++ b/src/01/01/z2ui5_t_fw_02.tabl.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+ Z2UI5_T_FW_02
+ E
+ TRANSP
+ abap2UI5 - data storage
+ A
+ 1
+
+
+ Z2UI5_T_FW_02
+ A
+ 0
+ APPL0
+ N
+
+
+
+ MANDT
+ X
+ 0
+ C
+ 000006
+ X
+ CHAR
+ 000003
+ CHAR
+
+
+ ID
+ X
+ 0
+ C
+ 000064
+ X
+ CHAR
+ 000032
+ CHAR
+
+
+ UNAME
+ 0
+ C
+ 000064
+ CHAR
+ 000032
+ CHAR
+
+
+ HANDLE
+ 0
+ C
+ 000064
+ CHAR
+ 000032
+ CHAR
+
+
+ HANDLE2
+ 0
+ C
+ 000064
+ CHAR
+ 000032
+ CHAR
+
+
+ HANDLE3
+ 0
+ C
+ 000064
+ CHAR
+ 000032
+ CHAR
+
+
+ DATA
+ 0
+ g
+ 000008
+ STRG
+ STRG
+
+
+ DATA2
+ 0
+ g
+ 000008
+ STRG
+ STRG
+
+
+
+
+
diff --git a/src/01/02/z2ui5_cl_fw_index_html.clas.abap b/src/01/02/z2ui5_cl_fw_index_html.clas.abap
index 1c907888..4869b5a9 100644
--- a/src/01/02/z2ui5_cl_fw_index_html.clas.abap
+++ b/src/01/02/z2ui5_cl_fw_index_html.clas.abap
@@ -169,7 +169,8 @@ CLASS Z2UI5_CL_FW_INDEX_HTML IMPLEMENTATION.
` }` && |\n| &&
` }` && |\n| &&
` )` && |\n| &&
- ` }catch(e){ BusyIndicator.hide(); MessageBox.error(e.toLocaleString()); }` && |\n| &&
+` }catch(e){ BusyIndicator.hide(); sap.z2ui5.isBusy = false; MessageBox.error( e.toLocaleString() , { title : "Unexpected Error Occured - App Terminated" , actions : [ ] , onClose : () => { new sap.m.BusyDialog({ text : "Please Restart t` &&
+`he App" }).open(); } } ) }` && |\n| &&
` },` && |\n| &&
|\n| &&
` async displayFragment(xml, viewProp, openById) {` && |\n| &&
diff --git a/src/01/02/z2ui5_t_fw_01.tabl.xml b/src/01/02/z2ui5_t_fw_01.tabl.xml
index 1ae8c139..8249f76c 100644
--- a/src/01/02/z2ui5_t_fw_01.tabl.xml
+++ b/src/01/02/z2ui5_t_fw_01.tabl.xml
@@ -8,7 +8,6 @@
TRANSP
X
abap2UI5 - drafts
- E
A
1
@@ -44,7 +43,6 @@
0
C
000064
- X
CHAR
000032
CHAR
@@ -54,7 +52,6 @@
0
C
000064
- X
CHAR
000032
CHAR
@@ -64,7 +61,6 @@
0
C
000064
- X
CHAR
000032
CHAR
diff --git a/src/01/03/z2ui5_cl_fw_app_startup.clas.abap b/src/01/03/z2ui5_cl_fw_app_startup.clas.abap
index 76241400..455e52de 100644
--- a/src/01/03/z2ui5_cl_fw_app_startup.clas.abap
+++ b/src/01/03/z2ui5_cl_fw_app_startup.clas.abap
@@ -75,6 +75,10 @@ CLASS z2ui5_cl_fw_app_startup IMPLEMENTATION.
editable = `true`
)->content( )->_ns_m( ).
+ DATA(lv_url_search) = z2ui5_cl_util_func=>app_get_url(
+ client = client
+ classname = 'z2ui5_cl_app_search_apps' ).
+
content->label( `Step 1`
)->text( `Create a new class in your abap system`
)->label( `Step 2`
@@ -86,6 +90,7 @@ CLASS z2ui5_cl_fw_app_startup IMPLEMENTATION.
href = `https://github.com/abap2UI5/abap2UI5/blob/main/src/03/02/z2ui5_cl_app_hello_world.clas.abap`
)->label( `Step 4` ).
+
IF ms_home-class_editable = abap_true.
content->input( placeholder = `fill in the class name and press 'check'`
@@ -109,7 +114,8 @@ CLASS z2ui5_cl_fw_app_startup IMPLEMENTATION.
href = lv_url
enabled = z2ui5_cl_util_func=>boolean_abap_2_json( xsdbool( ms_home-class_editable = abap_false ) ) ).
- DATA(form) = grid->simpleform( title = `Samples`
+
+ DATA(form) = grid->simpleform( title = `Apps`
editable = abap_true
layout = `ResponsiveGridLayout` ).
@@ -121,15 +127,35 @@ CLASS z2ui5_cl_fw_app_startup IMPLEMENTATION.
href = `https://github.com/abap2UI5/abap2UI5-samples` ).
ENDIF.
+data(lv_url_samples) = z2ui5_cl_util_func=>app_get_url(
+ client = client
+ classname = 'z2ui5_cl_demo_app_000' ).
+
DATA(cont) = form->content( )->_ns_m( ).
- cont->label( ).
- cont->button(
+ cont->label( `Samples`).
+* cont->button(
+* text = `Continue...`
+* press = client->_event( val = `DEMOS` check_view_destroy = abap_true )
+* enabled = xsdbool( mv_check_demo = abap_true ) )->_go_new( ).
+ cont->link(
text = `Continue...`
- press = client->_event( val = `DEMOS` check_view_destroy = abap_true )
- enabled = xsdbool( mv_check_demo = abap_true ) )->_go_new( ).
- cont->button( visible = abap_false )->link( text = `More on GitHub...`
- target = `_blank`
- href = `https://github.com/abap2UI5/abap2UI5-documentation/blob/main/docs/links.md` ).
+ target = `_blank`
+* press = client->_event( val = `DEMOS` check_view_destroy = abap_true )
+ href = lv_url_samples
+ enabled = xsdbool( mv_check_demo = abap_true )
+ )->_go_new( ).
+ cont->button( visible = abap_false ).
+
+ cont->label( `Local`
+ )->link( text = `Search apps on your system...`
+ target = `_blank`
+ href = lv_url_search
+ ).
+
+ cont->label( `Online` )->link( text = `More on GitHub...`
+ target = `_blank`
+ href = `https://github.com/abap2UI5/abap2UI5-documentation/blob/main/docs/links.md` ).
+
client->view_display( form->_stringify( ) ).
@@ -143,8 +169,8 @@ CLASS z2ui5_cl_fw_app_startup IMPLEMENTATION.
IF mv_check_initialized = abap_false.
mv_check_initialized = abap_true.
z2ui5_on_init( ).
- view_display_start( ).
- return.
+ view_display_start( ).
+ RETURN.
ENDIF.
IF client->get( )-check_on_navigated = abap_true.
@@ -156,7 +182,7 @@ CLASS z2ui5_cl_fw_app_startup IMPLEMENTATION.
ASSIGN ls_result-row->* TO .
ms_home-classname = .
view_display_start( ).
- return.
+ RETURN.
ENDIF.
CATCH cx_root.
ENDTRY.
diff --git a/src/02/02/z2ui5_cl_app_search_apps.clas.abap b/src/02/02/z2ui5_cl_app_search_apps.clas.abap
new file mode 100644
index 00000000..5c31744f
--- /dev/null
+++ b/src/02/02/z2ui5_cl_app_search_apps.clas.abap
@@ -0,0 +1,120 @@
+CLASS z2ui5_cl_app_search_apps DEFINITION
+ PUBLIC
+ CREATE PUBLIC .
+
+ PUBLIC SECTION.
+
+ INTERFACES z2ui5_if_app.
+
+ TYPES:
+ BEGIN OF ty_app,
+ name TYPE string,
+ visible TYPE abap_bool,
+ END OF ty_app.
+ DATA mt_apps TYPE STANDARD TABLE OF ty_app WITH EMPTY KEY.
+
+ DATA check_initialized TYPE abap_bool.
+ DATA mv_search_value TYPE string.
+
+ PROTECTED SECTION.
+ METHODS search.
+ METHODS view_display
+ IMPORTING
+ client TYPE REF TO z2ui5_if_client.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS z2ui5_cl_app_search_apps IMPLEMENTATION.
+
+
+ METHOD z2ui5_if_app~main.
+
+ IF check_initialized = abap_false.
+ check_initialized = abap_true.
+
+ mt_apps = VALUE #( FOR row IN z2ui5_cl_util_func=>rtti_get_classes_impl_intf( `Z2UI5_IF_APP` )
+ ( name = row ) ).
+ search( ).
+ view_display( client ).
+ RETURN.
+ ENDIF.
+
+ IF client->get( )-check_on_navigated = abap_true.
+ view_display( client ).
+ ENDIF.
+
+ CASE client->get( )-event.
+
+ WHEN `ON_PRESS`.
+ DATA(lt_arg) = client->get( )-t_event_arg.
+ DATA(lv_app) = lt_arg[ 1 ].
+
+ DATA li_app TYPE REF TO z2ui5_if_app.
+ CREATE OBJECT li_app TYPE (lv_app).
+ client->nav_app_call( li_app ).
+
+* client->message_toast_display( lv_app ).
+
+ WHEN 'BACK'.
+ client->nav_app_leave( client->get_app( client->get( )-s_draft-id_prev_app_stack ) ).
+
+ WHEN 'ON_SEARCH'.
+ search( ).
+ client->view_model_update( ).
+ client->message_toast_display( |backend search done| ).
+ ENDCASE.
+
+ ENDMETHOD.
+
+ METHOD search.
+
+ DATA lr_app TYPE REF TO ty_app.
+
+ LOOP AT mt_apps REFERENCE INTO lr_app.
+ lr_app->visible = abap_false.
+ IF lr_app->name CS 'DEMO'.
+ CONTINUE.
+ ENDIF.
+ IF lr_app->name CS mv_search_value.
+ lr_app->visible = abap_true.
+ ENDIF.
+ ENDLOOP.
+
+ ENDMETHOD.
+
+
+ METHOD view_display.
+
+
+
+ DATA(page) = z2ui5_cl_xml_view=>factory(
+ )->shell(
+ )->page(
+ title = 'abap2UI5 - Search Apps'
+ navbuttonpress = client->_event( 'BACK' )
+ shownavbutton = xsdbool( client->get( )-s_draft-id_prev_app_stack is not initial )
+ )->header_content(
+ )->search_field(
+ value = client->_bind_edit( mv_search_value )
+ search = client->_event( 'ON_SEARCH' )
+ change = client->_event( 'ON_SEARCH' )
+ width = `17.5rem`
+ id = `SEARCH`
+ )->get_parent( ).
+
+ LOOP AT mt_apps REFERENCE INTO DATA(lr_app).
+ DATA(lv_tabix) = sy-tabix.
+ page->generic_tile(
+ class = 'sapUiTinyMarginBegin sapUiTinyMarginTop tileLayout'
+ press = client->_event( val = `ON_PRESS` t_arg = VALUE #( ( `${$source>/header}` ) ) )
+ header = client->_bind( val = lr_app->name tab = mt_apps tab_index = lv_tabix )
+ visible = client->_bind( val = lr_app->visible tab = mt_apps tab_index = lv_tabix ) ).
+ ENDLOOP.
+
+ client->view_display( page->stringify( ) ).
+
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/02/02/z2ui5_cl_app_search_apps.clas.testclasses.abap b/src/02/02/z2ui5_cl_app_search_apps.clas.testclasses.abap
new file mode 100644
index 00000000..b6345815
--- /dev/null
+++ b/src/02/02/z2ui5_cl_app_search_apps.clas.testclasses.abap
@@ -0,0 +1,19 @@
+CLASS ltcl_unit_test DEFINITION FINAL FOR TESTING
+ DURATION short
+ RISK LEVEL dangerous.
+
+ PRIVATE SECTION.
+ METHODS first_test FOR TESTING RAISING cx_static_check.
+
+ENDCLASS.
+
+
+CLASS ltcl_unit_test IMPLEMENTATION.
+
+ METHOD first_test.
+
+ DATA(lo_app) = NEW z2ui5_cl_app_search_apps( ) ##NEEDED.
+
+ ENDMETHOD.
+
+ENDCLASS.
diff --git a/src/02/02/z2ui5_cl_app_search_apps.clas.xml b/src/02/02/z2ui5_cl_app_search_apps.clas.xml
new file mode 100644
index 00000000..95fd3923
--- /dev/null
+++ b/src/02/02/z2ui5_cl_app_search_apps.clas.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+ Z2UI5_CL_APP_SEARCH_APPS
+ E
+ abap2UI5 - find all apps on the system
+ 1
+ X
+ X
+ X
+ X
+
+
+
+