add-search-app (#824)

* add-search-app

* Update src/02/02/z2ui5_cl_app_search_apps.clas.abap

Co-authored-by: abaplint[bot] <24845621+abaplint[bot]@users.noreply.github.com>

* update abaplint fixes

* update startup app

* update

* update

* update

* update

* update

---------

Co-authored-by: abaplint[bot] <24845621+abaplint[bot]@users.noreply.github.com>
This commit is contained in:
oblomov 2024-01-27 12:31:11 +01:00 committed by GitHub
parent fc6952a072
commit 63ff4eed6d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 384 additions and 16 deletions

View File

@ -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.

View File

@ -0,0 +1,98 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD02V>
<TABNAME>Z2UI5_T_FW_02</TABNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<TABCLASS>TRANSP</TABCLASS>
<DDTEXT>abap2UI5 - data storage</DDTEXT>
<CONTFLAG>A</CONTFLAG>
<EXCLASS>1</EXCLASS>
</DD02V>
<DD09L>
<TABNAME>Z2UI5_T_FW_02</TABNAME>
<AS4LOCAL>A</AS4LOCAL>
<TABKAT>0</TABKAT>
<TABART>APPL0</TABART>
<BUFALLOW>N</BUFALLOW>
</DD09L>
<DD03P_TABLE>
<DD03P>
<FIELDNAME>MANDT</FIELDNAME>
<KEYFLAG>X</KEYFLAG>
<ADMINFIELD>0</ADMINFIELD>
<INTTYPE>C</INTTYPE>
<INTLEN>000006</INTLEN>
<NOTNULL>X</NOTNULL>
<DATATYPE>CHAR</DATATYPE>
<LENG>000003</LENG>
<MASK> CHAR</MASK>
</DD03P>
<DD03P>
<FIELDNAME>ID</FIELDNAME>
<KEYFLAG>X</KEYFLAG>
<ADMINFIELD>0</ADMINFIELD>
<INTTYPE>C</INTTYPE>
<INTLEN>000064</INTLEN>
<NOTNULL>X</NOTNULL>
<DATATYPE>CHAR</DATATYPE>
<LENG>000032</LENG>
<MASK> CHAR</MASK>
</DD03P>
<DD03P>
<FIELDNAME>UNAME</FIELDNAME>
<ADMINFIELD>0</ADMINFIELD>
<INTTYPE>C</INTTYPE>
<INTLEN>000064</INTLEN>
<DATATYPE>CHAR</DATATYPE>
<LENG>000032</LENG>
<MASK> CHAR</MASK>
</DD03P>
<DD03P>
<FIELDNAME>HANDLE</FIELDNAME>
<ADMINFIELD>0</ADMINFIELD>
<INTTYPE>C</INTTYPE>
<INTLEN>000064</INTLEN>
<DATATYPE>CHAR</DATATYPE>
<LENG>000032</LENG>
<MASK> CHAR</MASK>
</DD03P>
<DD03P>
<FIELDNAME>HANDLE2</FIELDNAME>
<ADMINFIELD>0</ADMINFIELD>
<INTTYPE>C</INTTYPE>
<INTLEN>000064</INTLEN>
<DATATYPE>CHAR</DATATYPE>
<LENG>000032</LENG>
<MASK> CHAR</MASK>
</DD03P>
<DD03P>
<FIELDNAME>HANDLE3</FIELDNAME>
<ADMINFIELD>0</ADMINFIELD>
<INTTYPE>C</INTTYPE>
<INTLEN>000064</INTLEN>
<DATATYPE>CHAR</DATATYPE>
<LENG>000032</LENG>
<MASK> CHAR</MASK>
</DD03P>
<DD03P>
<FIELDNAME>DATA</FIELDNAME>
<ADMINFIELD>0</ADMINFIELD>
<INTTYPE>g</INTTYPE>
<INTLEN>000008</INTLEN>
<DATATYPE>STRG</DATATYPE>
<MASK> STRG</MASK>
</DD03P>
<DD03P>
<FIELDNAME>DATA2</FIELDNAME>
<ADMINFIELD>0</ADMINFIELD>
<INTTYPE>g</INTTYPE>
<INTLEN>000008</INTLEN>
<DATATYPE>STRG</DATATYPE>
<MASK> STRG</MASK>
</DD03P>
</DD03P_TABLE>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -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| &&

View File

@ -8,7 +8,6 @@
<TABCLASS>TRANSP</TABCLASS>
<CLIDEP>X</CLIDEP>
<DDTEXT>abap2UI5 - drafts</DDTEXT>
<MASTERLANG>E</MASTERLANG>
<CONTFLAG>A</CONTFLAG>
<EXCLASS>1</EXCLASS>
</DD02V>
@ -44,7 +43,6 @@
<ADMINFIELD>0</ADMINFIELD>
<INTTYPE>C</INTTYPE>
<INTLEN>000064</INTLEN>
<NOTNULL>X</NOTNULL>
<DATATYPE>CHAR</DATATYPE>
<LENG>000032</LENG>
<MASK> CHAR</MASK>
@ -54,7 +52,6 @@
<ADMINFIELD>0</ADMINFIELD>
<INTTYPE>C</INTTYPE>
<INTLEN>000064</INTLEN>
<NOTNULL>X</NOTNULL>
<DATATYPE>CHAR</DATATYPE>
<LENG>000032</LENG>
<MASK> CHAR</MASK>
@ -64,7 +61,6 @@
<ADMINFIELD>0</ADMINFIELD>
<INTTYPE>C</INTTYPE>
<INTLEN>000064</INTLEN>
<NOTNULL>X</NOTNULL>
<DATATYPE>CHAR</DATATYPE>
<LENG>000032</LENG>
<MASK> CHAR</MASK>

View File

@ -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,16 +127,36 @@ 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`
* 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( ) ).
ENDMETHOD.
@ -144,7 +170,7 @@ CLASS z2ui5_cl_fw_app_startup IMPLEMENTATION.
mv_check_initialized = abap_true.
z2ui5_on_init( ).
view_display_start( ).
return.
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 <class>.
ms_home-classname = <class>.
view_display_start( ).
return.
RETURN.
ENDIF.
CATCH cx_root.
ENDTRY.

View File

@ -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.

View File

@ -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.

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_APP_SEARCH_APPS</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abap2UI5 - find all apps on the system</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>