demos and refactoring (#237)

* overflow toolbar menu item

* table popin

* test

* popups features

* popup

* popup

* POPUPS

* popups

* popup

* popups

* refactoring

* REFACTORING

* popover

* refactoring

* demos

* refactoring

* refactoring

* demos

* demos

* demos

* demo

* demos

* demos

* demo

* demos

* demo

* demos

* demos

* demos

* refactoring

* abaplint
This commit is contained in:
oblomov 2023-05-20 08:55:19 +02:00
parent 84c66a73ba
commit dd31464414
28 changed files with 3678 additions and 1133 deletions

View File

@ -70,7 +70,7 @@ CLASS Z2UI5_CL_APP_DEMO_00 IMPLEMENTATION.
grid->simple_form( title = 'HowTo - Tables I' layout = 'ResponsiveGridLayout' )->content( 'form'
)->button( text = 'List I' press = client->_event( 'z2ui5_cl_app_demo_03' )
)->button( text = 'List II' press = client->_event( 'z2ui5_cl_app_demo_48' )
)->button( text = 'Toolbar, Container, Sort' press = client->_event( 'z2ui5_cl_app_demo_06' )
)->button( text = 'Toolbar & Container' press = client->_event( 'z2ui5_cl_app_demo_06' )
).
grid->simple_form( title = 'HowTo - Tables II' layout = 'ResponsiveGridLayout' )->content( 'form'
@ -103,6 +103,7 @@ CLASS Z2UI5_CL_APP_DEMO_00 IMPLEMENTATION.
)->button( text = 'Views - Normal, Generic, XML' press = client->_event( 'z2ui5_cl_app_demo_23' )
)->button( text = 'Import UI5-XML-View' press = client->_event( 'z2ui5_cl_app_demo_31' )
)->button( text = 'Custom Control' press = client->_event( 'z2ui5_cl_app_demo_37' )
)->button( text = 'Change CSS' press = client->_event( 'z2ui5_cl_app_demo_50' )
).
grid->simple_form( title = 'HowTo - Extensions II' layout = 'ResponsiveGridLayout' )->content( 'form'
@ -111,15 +112,19 @@ CLASS Z2UI5_CL_APP_DEMO_00 IMPLEMENTATION.
)->button( text = 'ext. Library' press = client->_event( 'z2ui5_cl_app_demo_40' )
).
grid->simple_form( title = 'HowTo - More I' layout = 'ResponsiveGridLayout' )->content( 'form'
grid->simple_form( title = 'HowTo - More' layout = 'ResponsiveGridLayout' )->content( 'form'
)->button( text = 'Side Effects' press = client->_event( 'z2ui5_cl_app_demo_27' )
)->button( text = 'Integer, Decimals, Dates, Time' press = client->_event( 'z2ui5_cl_app_demo_47' )
)->button( text = 'Change Model at Runtime' press = client->_event( 'z2ui5_cl_app_demo_35' )
" )->button( text = 'FE Table' press = client->_event( 'z2ui5_cl_app_demo_49' )
).
grid->simple_form( title = 'HowTo - More II' layout = 'ResponsiveGridLayout' )->content( 'form'
)->button( text = 'Change CSS' press = client->_event( 'z2ui5_cl_app_demo_50' )
)->button( text = 'Change Model at Runtime' press = client->_event( 'z2ui5_cl_app_demo_35' )
grid->simple_form( title = 'HowTo -List Report' layout = 'ResponsiveGridLayout' )->content( 'form'
)->button( text = 'Cell with Popover' press = client->_event( 'z2ui5_cl_app_demo_52' )
)->button( text = 'Filter' press = client->_event( 'z2ui5_cl_app_demo_53' )
)->button( text = 'Layout' press = client->_event( 'z2ui5_cl_app_demo_55' )
)->button( text = 'Navigation' press = client->_event( 'z2ui5_cl_app_demo_54' )
).
DATA(form) = page->grid( 'L9 M12 S12'

View File

@ -60,6 +60,15 @@ CLASS Z2UI5_CL_APP_DEMO_06 IMPLEMENTATION.
WHEN 'BUTTON_POST'.
client->popup_message_box( 'button post was pressed' ).
WHEN 'MENU_DEFAULT'.
client->popup_message_box( 'menu default pressed' ).
WHEN 'MENU_01'.
client->popup_message_box( 'menu 01 pressed' ).
WHEN 'MENU_02'.
client->popup_message_box( 'menu 02 pressed' ).
WHEN 'BACK'.
client->nav_app_leave( client->get_app( client->get( )-id_prev_app_stack ) ).
@ -117,15 +126,30 @@ CLASS Z2UI5_CL_APP_DEMO_06 IMPLEMENTATION.
unit = 'EUR'
)->get_parent(
)->toolbar_spacer(
)->button(
text = 'counter descending'
)->overflow_toolbar_toggle_button(
icon = 'sap-icon://sort-descending'
press = client->_event( 'SORT_DESCENDING' )
)->button(
text = 'counter ascending'
)->overflow_toolbar_toggle_button(
icon = 'sap-icon://sort-ascending'
press = client->_event( 'SORT_ASCENDING' )
).
)->overflow_toolbar_menu_button(
text = `Export`
type = `Transparent`
tooltip = `Export`
defaultaction = client->_event( 'MENU_DEFAULT' )
icon = `sap-icon://share`
buttonMode = `Split`
)->_generic( `menu` )->_generic( `Menu`
)->menu_item(
press = client->_event( 'MENU_01' )
text = `Export as PDF`
icon = `sap-icon://pdf-attachment`
)->menu_item(
press = client->_event( 'MENU_02' )
text = `Export to Excel`
icon = `sap-icon://excel-attachment`
).
tab->columns(
)->column(

View File

@ -58,6 +58,7 @@ ENDCLASS.
CLASS Z2UI5_CL_APP_DEMO_07 IMPLEMENTATION.
METHOD ui5_on_event.
CASE client->get( )-event.
@ -85,12 +86,10 @@ CLASS Z2UI5_CL_APP_DEMO_07 IMPLEMENTATION.
WHEN 'POPUP_DESCR'.
ms_file_edit = mt_file[ selkz = abap_true ].
app-view_popup = 'DESCR'.
app-next-check_set_prev_view = abap_true.
WHEN 'POPUP_DATA'.
ms_file_edit = mt_file[ selkz = abap_true ].
app-view_popup = 'DATA'.
app-next-check_set_prev_view = abap_true.
WHEN 'BACK'.
client->nav_app_leave( client->get_app( client->get( )-id_prev_app_stack ) ).

View File

@ -7,7 +7,10 @@ CLASS z2ui5_cl_app_demo_12 DEFINITION PUBLIC.
DATA mv_popup_view TYPE string.
DATA mv_main_view TYPE string.
DATA mv_check_initialized TYPE abap_bool.
data mv_set_prev_view type abap_bool.
DATA mv_set_prev_view TYPE abap_bool.
DATA mv_check_popup TYPE abap_bool.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
@ -27,6 +30,12 @@ CLASS Z2UI5_CL_APP_DEMO_12 IMPLEMENTATION.
mv_set_prev_view = ''.
mv_popup_view = ''.
IF mv_check_popup = abap_true.
mv_check_popup = abap_false.
DATA(app) = CAST z2ui5_cl_app_demo_20( client->get_app( client->get( )-id_prev_app ) ).
client->popup_message_toast( app->mv_event && ` pressed` ).
ENDIF.
CASE client->get( )-event.
WHEN 'BUTTON_POPUP_01'.
@ -50,32 +59,36 @@ CLASS Z2UI5_CL_APP_DEMO_12 IMPLEMENTATION.
mv_popup_view = 'POPUP_INFO_FRONTEND_CLOSE'.
WHEN 'BUTTON_POPUP_04'.
mv_set_prev_view = abap_true.
mv_main_view = ``.
mv_popup_view = 'POPUP_DECIDE'.
WHEN 'BUTTON_POPUP_05'.
mv_check_popup = abap_true.
client->nav_app_call( z2ui5_cl_app_demo_20=>factory(
i_text = '(new app )this is a popup to decide, the text is send from the previous app and the answer will be send back'
i_cancel_text = 'Cancel '
i_cancel_event = 'POPUP_DECIDE_CANCEL'
i_confirm_text = 'Continue'
i_confirm_event = 'POPUP_DECIDE_CONTINUE'
i_check_show_previous_view = abap_false ) ).
) ).
RETURN.
WHEN 'BUTTON_POPUP_06'.
mv_check_popup = abap_true.
client->nav_app_call( z2ui5_cl_app_demo_20=>factory(
i_text = '(new app )this is a popup to decide, the text is send from the previous app and the answer will be send back'
i_cancel_text = 'Cancel'
i_cancel_event = 'POPUP_DECIDE_CANCEL'
i_confirm_text = 'Continue'
i_confirm_event = 'POPUP_DECIDE_CONTINUE' ) ).
RETURN.
WHEN 'BACK'.
client->nav_app_leave( client->get_app( client->get( )-id_prev_app_stack ) ).
ENDCASE.
DATA(lo_main) = Z2UI5_CL_XML_VIEW=>factory( )->shell( ).
DATA(lo_main) = z2ui5_cl_xml_view=>factory( )->shell( ).
CASE mv_main_view.
@ -88,7 +101,7 @@ CLASS Z2UI5_CL_APP_DEMO_12 IMPLEMENTATION.
)->header_content(
)->link(
text = 'Source_Code' target = '_blank'
href = Z2UI5_CL_XML_VIEW=>hlp_get_source_code_url( app = me get = client->get( ) )
href = z2ui5_cl_xml_view=>hlp_get_source_code_url( app = me get = client->get( ) )
)->get_parent( ).
DATA(grid) = page->grid( 'L7 M12 S12' )->content( 'layout'
@ -107,8 +120,8 @@ CLASS Z2UI5_CL_APP_DEMO_12 IMPLEMENTATION.
press = client->_event( 'BUTTON_POPUP_03' )
)->label( 'Demo'
)->button(
text = 'popup rendering, background rendering (previous view)'
press = client->_event( 'BUTTON_POPUP_04' )
text = 'popup rendering, hold background view'
press = client->_event( val = 'BUTTON_POPUP_04' hold_view = abap_true )
)->get_parent( )->get_parent( ).
grid->simple_form( 'Popup in new App' )->content( 'form'
@ -118,12 +131,12 @@ CLASS Z2UI5_CL_APP_DEMO_12 IMPLEMENTATION.
press = client->_event( 'BUTTON_POPUP_05' )
)->label( 'Demo'
)->button(
text = 'popup rendering, background rendering (previous view)'
press = client->_event( 'BUTTON_POPUP_06' ) ).
text = 'popup rendering, hold previous view'
press = client->_event( val = 'BUTTON_POPUP_06' hold_view = abap_true ) ).
ENDCASE.
DATA(lo_popup) = Z2UI5_CL_XML_VIEW=>factory_popup( ).
DATA(lo_popup) = z2ui5_cl_xml_view=>factory_popup( ).
CASE mv_popup_view.
@ -158,11 +171,14 @@ CLASS Z2UI5_CL_APP_DEMO_12 IMPLEMENTATION.
ENDCASE.
client->set_next( VALUE #(
xml_main = lo_main->get_root( )->xml_get( )
xml_popup = cond #( when mv_popup_view is not INITIAL then lo_popup->get_root( )->xml_get( ) )
check_set_prev_view = mv_set_prev_view
) ).
DATA(ls_next) = VALUE z2ui5_if_client=>ty_s_next(
xml_main = lo_main->get_root( )->xml_get( )
xml_popup = COND #( WHEN mv_popup_view IS NOT INITIAL THEN lo_popup->get_root( )->xml_get( ) )
).
IF mv_main_view = ``.
ls_next-xml_main = ``.
ENDIF.
client->set_next( ls_next ).
ENDMETHOD.
ENDCLASS.

View File

@ -11,7 +11,6 @@ CLASS z2ui5_cl_app_demo_20 DEFINITION PUBLIC.
i_cancel_event TYPE string
i_confirm_text TYPE string
i_confirm_event TYPE string
i_check_show_previous_view TYPE abap_bool DEFAULT abap_true
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_app_demo_20.
@ -22,8 +21,7 @@ CLASS z2ui5_cl_app_demo_20 DEFINITION PUBLIC.
DATA mv_cancel_event TYPE string.
DATA mv_confirm_text TYPE string.
DATA mv_confirm_event TYPE string.
DATA mv_check_show_previous_view TYPE abap_bool.
data mv_next_event type string.
data mv_event type string.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
@ -42,7 +40,7 @@ CLASS Z2UI5_CL_APP_DEMO_20 IMPLEMENTATION.
result->mv_cancel_event = i_cancel_event.
result->mv_confirm_text = i_confirm_text.
result->mv_confirm_event = i_confirm_event.
result->mv_check_show_previous_view = i_check_show_previous_view.
" result->mv_check_show_previous_view = i_check_show_previous_view.
ENDMETHOD.
@ -56,13 +54,11 @@ CLASS Z2UI5_CL_APP_DEMO_20 IMPLEMENTATION.
CASE client->get( )-event.
WHEN mv_cancel_event OR mv_confirm_event.
mv_next_event = client->get( )-event.
mv_event = client->get( )-event.
client->nav_app_leave( client->get_app( client->get( )-id_prev_app_stack ) ).
ENDCASE.
client->set_next( VALUE #(
check_set_prev_view = mv_check_show_previous_view
xml_main = Z2UI5_CL_XML_VIEW=>factory( )->get_root( )->xml_get( )
xml_popup = Z2UI5_CL_XML_VIEW=>factory_popup(
)->dialog( 'abap2UI5 - Popup to decide'
)->vbox(

View File

@ -34,7 +34,7 @@ ENDCLASS.
CLASS z2ui5_cl_app_demo_22 IMPLEMENTATION.
CLASS Z2UI5_CL_APP_DEMO_22 IMPLEMENTATION.
METHOD z2ui5_if_app~main.
@ -59,7 +59,7 @@ CLASS z2ui5_cl_app_demo_22 IMPLEMENTATION.
ENDIF.
app-s_next-t_scroll_pos = VALUE #(
app-s_next-t_scroll = VALUE #(
( name = 'id_page' )
( name = 'id_text3' )
).
@ -70,35 +70,36 @@ CLASS z2ui5_cl_app_demo_22 IMPLEMENTATION.
"nothing to do, default mode
WHEN 'BUTTON_SCROLL_BOTTOM'.
app-s_next-t_scroll_pos = VALUE #( ( name = 'id_page' value = '99999' ) ).
app-s_next-t_scroll = VALUE #( ( name = 'id_page' value = '99999' ) ).
WHEN 'BUTTON_SCROLL_UP'.
DATA(lv_pos) = CONV i( app-s_get-t_scroll_pos[ name = `id_page` ]-value ) - 500.
app-s_next-t_scroll_pos = VALUE #( ( name = 'id_page' value = lv_pos ) ).
app-s_next-t_scroll = VALUE #( ( name = 'id_page' value = lv_pos ) ).
WHEN 'BUTTON_SCROLL_DOWN'.
lv_pos = CONV i( app-s_get-t_scroll_pos[ name = `id_page` ]-value ) + 500.
app-s_next-t_scroll_pos = VALUE #( ( name = 'id_page' value = lv_pos ) ).
lv_pos = CONV i( value #( app-s_get-t_scroll_pos[ name = `id_page` ]-value optional ) ) + 500.
app-s_next-t_scroll = VALUE #( ( name = 'id_page' value = lv_pos ) ).
WHEN 'BUTTON_SCROLL_HOLD'.
app-s_next-t_scroll_pos = app-s_get-t_scroll_pos.
app-s_next-t_scroll = app-s_get-t_scroll_pos.
WHEN 'BUTTON_FOCUS_FIRST'.
app-s_next-s_cursor_pos = VALUE #( id = 'id_text1' cursorpos = '3' selectionstart = '3' selectionend = '3' ).
app-s_next-s_cursor = VALUE #( id = 'id_text1' cursorpos = '3' selectionstart = '3' selectionend = '3' ).
WHEN 'BUTTON_FOCUS_SECOND'.
app-s_next-s_cursor_pos = VALUE #( id = 'id_text2' cursorpos = '5' selectionstart = '5' selectionend = '10' ).
app-s_next-s_cursor = VALUE #( id = 'id_text2' cursorpos = '5' selectionstart = '5' selectionend = '10' ).
WHEN 'BUTTON_FOCUS_END'.
app-s_next-s_cursor_pos = VALUE #( id = 'id_text3' cursorpos = '99999' selectionstart = '99999' selectionend = '999999' ).
app-s_next-s_cursor = VALUE #( id = 'id_text3' cursorpos = '99999' selectionstart = '99999' selectionend = '999999' ).
app-s_next-t_scroll_pos = VALUE #(
app-s_next-t_scroll = VALUE #(
( name = 'id_page' value = '99999' )
( name = 'id_text3' value = '99999' )
).
WHEN 'BACK'.
client->nav_app_leave( client->get_app( client->get( )-id_prev_app_stack ) ).

View File

@ -90,7 +90,7 @@ CLASS Z2UI5_CL_APP_DEMO_25 IMPLEMENTATION.
WHEN 'SECOND'.
page = Z2UI5_CL_XML_VIEW=>factory(
page = Z2UI5_CL_XML_VIEW=>factory( )->shell(
)->page(
title = 'abap2UI5 - flow logic - APP 02'
navbuttonpress = client->_event( 'BACK' ) shownavbutton = abap_true

View File

@ -64,7 +64,7 @@ CLASS Z2UI5_CL_APP_DEMO_26 IMPLEMENTATION.
WHEN 'POPOVER'.
app-view_popup = 'POPOVER'.
app-s_next-popup_open_by_id = 'TEST'.
app-s_next-popover_open_by_id = 'TEST'.
WHEN 'BUTTON_CONFIRM'.
client->popup_message_toast( |confirm| ).

View File

@ -58,7 +58,7 @@ CLASS Z2UI5_CL_APP_DEMO_38 IMPLEMENTATION.
app-view_popup = 'POPUP'.
WHEN 'POPOVER'.
app-view_popup = 'POPOVER'.
app-next-popup_open_by_id = 'test'.
app-next-popover_open_by_id = 'test'.
WHEN 'BACK'.
client->nav_app_leave( client->get_app( client->get( )-id_prev_app_stack ) ).
ENDCASE.

View File

@ -5,10 +5,12 @@ CLASS z2ui5_cl_app_demo_44 DEFINITION PUBLIC.
ENDCLASS.
CLASS z2ui5_cl_app_demo_44 IMPLEMENTATION.
CLASS Z2UI5_CL_APP_DEMO_44 IMPLEMENTATION.
METHOD z2ui5_if_app~main.
client->set_next( VALUE #( xml_main = z2ui5_cl_xml_view=>factory( )->label( `Hello World!` )->get_root( )->xml_get( ) ) ).
ENDMETHOD.
ENDCLASS.

View File

@ -155,7 +155,64 @@ ENDCLASS.
CLASS z2ui5_cl_app_demo_49 IMPLEMENTATION.
CLASS Z2UI5_CL_APP_DEMO_49 IMPLEMENTATION.
METHOD encode_base64.
TRY.
CALL METHOD ('CL_WEB_HTTP_UTILITY')=>encode_base64
EXPORTING
unencoded = val
RECEIVING
encoded = result.
CATCH cx_sy_dyn_call_illegal_class.
DATA(classname) = 'CL_HTTP_UTILITY'.
CALL METHOD (classname)=>encode_base64
EXPORTING
unencoded = val
RECEIVING
encoded = result.
ENDTRY.
ENDMETHOD.
METHOD init_table_output.
" CLEAR ms_layout-s_table.
" CLEAR mt_cols.
" CLEAR ms_layout-t_cols.
ms_view-headerexpanded = abap_true.
ms_view-headerpinned = abap_true.
DATA(lt_cols) = lcl_db=>get_fieldlist_by_table( mt_table ).
LOOP AT lt_cols REFERENCE INTO DATA(lr_col) FROM 2.
INSERT VALUE #(
name = lr_col->*
) INTO TABLE ms_layout-t_filter_show.
INSERT VALUE #(
visible = abap_true
name = lr_col->*
" length = `10px`
title = lr_col->*
) INTO TABLE ms_layout-t_cols.
* INSERT VALUE #(
* " selkz = abap_true
* name = lr_col->*
* " length = `10px`
* ) INTO TABLE ms_layout-t_cols.
ENDLOOP.
ENDMETHOD.
METHOD z2ui5_if_app~main.
@ -228,10 +285,10 @@ CLASS z2ui5_cl_app_demo_49 IMPLEMENTATION.
INSERT ls_layout INTO TABLE mt_db_layout.
WHEN 'BUTTON_SEARCH'.
app-next-s_cursor_pos-id = 'SEARCH'.
app-next-s_cursor_pos-cursorpos = '99'.
app-next-s_cursor_pos-selectionend = '99'.
app-next-s_cursor_pos-selectionstart = '99'.
app-next-s_cursor-id = 'SEARCH'.
app-next-s_cursor-cursorpos = '99'.
app-next-s_cursor-selectionend = '99'.
app-next-s_cursor-selectionstart = '99'.
z2ui5_set_search( ).
WHEN 'MAIN'.
@ -242,11 +299,11 @@ CLASS z2ui5_cl_app_demo_49 IMPLEMENTATION.
app-view_main = 'DETAIL'.
WHEN 'POPUP_DETAIL'.
app-next-popup_open_by_id = app-get-event_data.
app-next-popover_open_by_id = app-get-event_data.
app-view_popup = 'POPUP_LAYOUT'.
WHEN 'POPUP_LAYOUT'.
app-next-popup_open_by_id = `btn_layout`.
app-next-popover_open_by_id = `btn_layout`.
app-view_popup = 'POPUP_LAYOUT'.
WHEN 'POPUP_FILTER'.
@ -286,7 +343,7 @@ CLASS z2ui5_cl_app_demo_49 IMPLEMENTATION.
ms_layout-sticky_header = `HeaderToolbar,InfoToolbar,ColumnHeaders`.
ms_layout-title = `Drafts`.
app-next-t_scroll_pos = VALUE #( ( name = `page_main` ) ).
app-next-t_scroll = VALUE #( ( name = `page_main` ) ).
mt_token = VALUE #(
( key = 'VAL1' text = 'value_1' selkz = abap_true visible = abap_true )
@ -359,176 +416,6 @@ CLASS z2ui5_cl_app_demo_49 IMPLEMENTATION.
ENDMETHOD.
METHOD init_table_output.
" CLEAR ms_layout-s_table.
" CLEAR mt_cols.
" CLEAR ms_layout-t_cols.
ms_view-headerexpanded = abap_true.
ms_view-headerpinned = abap_true.
DATA(lt_cols) = lcl_db=>get_fieldlist_by_table( mt_table ).
LOOP AT lt_cols REFERENCE INTO DATA(lr_col) FROM 2.
INSERT VALUE #(
name = lr_col->*
) INTO TABLE ms_layout-t_filter_show.
INSERT VALUE #(
visible = abap_true
name = lr_col->*
" length = `10px`
title = lr_col->*
) INTO TABLE ms_layout-t_cols.
* INSERT VALUE #(
* " selkz = abap_true
* name = lr_col->*
* " length = `10px`
* ) INTO TABLE ms_layout-t_cols.
ENDLOOP.
ENDMETHOD.
METHOD z2ui5_on_render_main.
z2ui5_set_sort( ).
" DATA(view) = z2ui5_cl_xml_view=>factory( )->shell( ).
DATA(view) = z2ui5_cl_xml_view=>factory(
)->page( id = `page_main`
title = 'abap2UI5 - List Report'
navbuttonpress = client->_event( 'BACK' )
shownavbutton = abap_true
)->header_content(
)->link(
text = 'Demo' target = '_blank'
href = 'https://twitter.com/OblomovDev/status/1637163852264624139'
)->link(
text = 'Source_Code' target = '_blank' href = z2ui5_cl_xml_view=>hlp_get_source_code_url( app = me get = client->get( ) )
)->get_parent( ).
IF mv_check_download_csv = abap_true.
z2ui5_set_download_csv( view ).
ENDIF.
DATA(page) = view->dynamic_page(
headerexpanded = client->_bind( ms_view-headerexpanded )
headerpinned = client->_bind( ms_view-headerpinned ) ).
DATA(header_title) = page->title( ns = 'f'
)->get( )->dynamic_page_title( ).
header_title->heading( ns = 'f' )->hbox( )->title( ms_view-title
)->button( id = `btn_layout` press = client->_event( `POPUP_LAYOUT` ) type = `Transparent` icon = `sap-icon://dropdown` ).
header_title->expanded_content( 'f'
)->label( text = 'Drafts of abap2UI5' ).
header_title->snapped_content( ns = 'f'
)->label( text = 'Drafts of abap2UI5' ).
header_title->actions( ns = 'f' )->overflow_toolbar(
)->button( text = `Custom Function` press = client->_event( `BUTTON_CUSTOM` )
).
DATA(lo_box) = page->header( )->dynamic_page_header( pinnable = abap_true
)->flex_box( alignitems = `Start` justifycontent = `SpaceBetween` )->flex_box( alignItems = `Start` ).
z2ui5_set_filter( lo_box ).
DATA(cont) = page->content( ns = 'f' ).
DATA(tab) = cont->table(
items = client->_bind( val = ms_view-t_tab )
alternaterowcolors = ms_layout-check_zebra
sticky = ms_layout-sticky_header
mode = ms_layout-selmode ).
tab->header_toolbar(
)->toolbar(
)->title( text = ms_layout-title && ` (` && shift_right( CONV string( lines( ms_view-t_tab ) ) ) && `)` level = `H2`
)->toolbar_spacer(
)->button(
icon = 'sap-icon://refresh'
press = client->_event( 'BUTTON_REFRESH' )
)->multi_input(
tokens = client->_bind( mt_token )
showclearicon = abap_true
* showvaluehelp = abap_true
* suggestionitems = client->_bind( mt_token_sugg )
)->item(
key = `{KEY}`
text = `{TEXT}`
)->tokens(
)->token(
key = `{KEY}`
text = `{TEXT}`
selected = `{SELKZ}`
* visible = `{VISIBLE}`
)->get_parent( )->get_parent(
)->search_field(
value = client->_bind( ms_view-search_val )
search = client->_event( 'BUTTON_SEARCH' )
change = client->_event( 'BUTTON_SEARCH' )
width = `17.5rem`
id = `SEARCH`
)->toolbar_spacer(
* )->button(
* text = `Custom Action`
* press = client->_event( 'BUTTON_CUSTOM' )
)->button(
text = `Anlegen`
enabled = abap_false
press = client->_event( 'BUTTON_CREATE' )
)->button(
text = `Löschen`
press = client->_event( 'BUTTON_DELETE' )
)->button(
icon = 'sap-icon://action-settings'
press = client->_event( 'BUTTON_SETUP' )
)->button(
icon = 'sap-icon://download'
press = client->_event( 'BUTTON_DOWNLOAD' )
).
DATA(lo_columns) = tab->columns( ).
LOOP AT ms_layout-t_cols REFERENCE INTO DATA(lr_field)
WHERE visible = abap_true.
lo_columns->column( width = lr_field->length )->text( text = CONV char10( lr_field->title )
)->footer(
)->object_number( number = `Summe` unit = 'ST' state = `Warning` ).
ENDLOOP.
DATA(lo_cells) = tab->items( )->column_list_item(
press = client->_event( val = 'DETAIL' data = `${UUID}` )
selected = `{SELKZ}`
type = `Navigation` )->cells( ).
LOOP AT ms_layout-t_cols REFERENCE INTO lr_field
WHERE visible = abap_true.
IF lr_field->editable = abap_true.
lo_cells->input( `{` && lr_field->name && `}` ).
ELSE.
" lo_cells->text( `{` && lr_field->name && `}` ).
lo_cells->link( text = `{` && lr_field->name && `}`
" press = client->_event( val = `POPUP_DETAIL` data = `${` && lr_field->name && `}` ) ).
press = client->_event( val = `POPUP_DETAIL` data = `${$source>/id}` ) ).
" press = client->_event( val = `POPUP_DETAIL` data = `$event` ) ).
ENDIF.
ENDLOOP.
app-next-xml_main = page->get_root( )->xml_get( ).
ENDMETHOD.
@ -615,6 +502,256 @@ CLASS z2ui5_cl_app_demo_49 IMPLEMENTATION.
ENDMETHOD.
METHOD z2ui5_on_render_main.
z2ui5_set_sort( ).
" DATA(view) = z2ui5_cl_xml_view=>factory( )->shell( ).
DATA(view) = z2ui5_cl_xml_view=>factory(
)->page( id = `page_main`
title = 'abap2UI5 - List Report'
navbuttonpress = client->_event( 'BACK' )
shownavbutton = abap_true
)->header_content(
)->link(
text = 'Demo' target = '_blank'
href = 'https://twitter.com/OblomovDev/status/1637163852264624139'
)->link(
text = 'Source_Code' target = '_blank' href = z2ui5_cl_xml_view=>hlp_get_source_code_url( app = me get = client->get( ) )
)->get_parent( ).
IF mv_check_download_csv = abap_true.
z2ui5_set_download_csv( view ).
ENDIF.
DATA(page) = view->dynamic_page(
headerexpanded = client->_bind( ms_view-headerexpanded )
headerpinned = client->_bind( ms_view-headerpinned ) ).
DATA(header_title) = page->title( ns = 'f'
)->get( )->dynamic_page_title( ).
header_title->heading( ns = 'f' )->hbox( )->title( ms_view-title
)->button( id = `btn_layout` press = client->_event( `POPUP_LAYOUT` ) type = `Transparent` icon = `sap-icon://dropdown` ).
header_title->expanded_content( 'f'
)->label( text = 'Drafts of abap2UI5' ).
header_title->snapped_content( ns = 'f'
)->label( text = 'Drafts of abap2UI5' ).
header_title->actions( ns = 'f' )->overflow_toolbar(
)->button( text = `Custom Function` press = client->_event( `BUTTON_CUSTOM` )
).
DATA(lo_box) = page->header( )->dynamic_page_header( pinnable = abap_true
)->flex_box( alignitems = `Start` justifycontent = `SpaceBetween` )->flex_box( alignItems = `Start` ).
z2ui5_set_filter( lo_box ).
DATA(cont) = page->content( ns = 'f' ).
DATA(tab) = cont->table(
items = client->_bind( val = ms_view-t_tab )
alternaterowcolors = ms_layout-check_zebra
sticky = ms_layout-sticky_header
autopopinmode = abap_true
mode = ms_layout-selmode ).
tab->header_toolbar(
)->toolbar(
)->title( text = ms_layout-title && ` (` && shift_right( CONV string( lines( ms_view-t_tab ) ) ) && `)` level = `H2`
)->toolbar_spacer(
)->button(
icon = 'sap-icon://refresh'
press = client->_event( 'BUTTON_REFRESH' )
)->multi_input(
tokens = client->_bind( mt_token )
showclearicon = abap_true
* showvaluehelp = abap_true
* suggestionitems = client->_bind( mt_token_sugg )
)->item(
key = `{KEY}`
text = `{TEXT}`
)->tokens(
)->token(
key = `{KEY}`
text = `{TEXT}`
selected = `{SELKZ}`
* visible = `{VISIBLE}`
)->get_parent( )->get_parent(
)->toolbar_spacer(
* )->button(
* text = `Custom Action`
* press = client->_event( 'BUTTON_CUSTOM' )
)->button(
text = `Anlegen`
enabled = abap_false
press = client->_event( 'BUTTON_CREATE' )
)->button(
text = `Löschen`
press = client->_event( 'BUTTON_DELETE' )
)->button(
icon = 'sap-icon://action-settings'
press = client->_event( 'BUTTON_SETUP' )
)->button(
icon = 'sap-icon://download'
press = client->_event( 'BUTTON_DOWNLOAD' )
).
data(lv_width) = 10.
DATA(lo_columns) = tab->columns( ).
LOOP AT ms_layout-t_cols REFERENCE INTO DATA(lr_field)
WHERE visible = abap_true.
lo_columns->column(
minscreenwidth = shift_right( conv string( lv_width ) ) && `px`
demandpopin = abap_true width = lr_field->length )->text( text = CONV char10( lr_field->title )
)->footer(
)->object_number( number = `Summe` unit = 'ST' state = `Warning` ).
lv_width = lv_width + 10.
ENDLOOP.
DATA(lo_cells) = tab->items( )->column_list_item(
press = client->_event( val = 'DETAIL' data = `${UUID}` )
selected = `{SELKZ}`
type = `Navigation` )->cells( ).
LOOP AT ms_layout-t_cols REFERENCE INTO lr_field
WHERE visible = abap_true.
IF lr_field->editable = abap_true.
lo_cells->input( `{` && lr_field->name && `}` ).
ELSE.
" lo_cells->text( `{` && lr_field->name && `}` ).
lo_cells->link( text = `{` && lr_field->name && `}`
" press = client->_event( val = `POPUP_DETAIL` data = `${` && lr_field->name && `}` ) ).
press = client->_event( val = `POPUP_DETAIL` data = `${$source>/id}` ) ).
" press = client->_event( val = `POPUP_DETAIL` data = `$event` ) ).
ENDIF.
ENDLOOP.
app-next-xml_main = page->get_root( )->xml_get( ).
ENDMETHOD.
METHOD z2ui5_on_render_pop_detail.
DATA(lo_popup) = z2ui5_cl_xml_view=>factory_popup( ).
lo_popup->popover( placement = `Bottom` title = 'abap2UI5 - Layout' contentwidth = `50%`
)->input( description = `Name` value = client->_bind( mv_layout_name )
)->button( text = `Save` press = client->_event( `BUTTON_SAVE_LAYOUT` )
)->table(
mode = 'SingleSelectLeft'
items = client->_bind( mt_db_layout )
)->columns(
)->column( )->text( 'Name' )->get_parent(
)->column( )->text( 'User' )->get_parent(
)->column( )->text( 'Default' )->get_parent(
" )->column( )->text( 'Description' )->get_parent(
)->get_parent(
)->items( )->column_list_item( selected = '{SELKZ}'
)->cells(
" )->checkbox( '{SELKZ}'
)->text( '{NAME}'
)->text( '{USER}'
)->text( '{DEFAULT}'
" )->text( '{DESCR}'
)->get_parent( )->get_parent( )->get_parent( )->get_parent(
)->footer( )->overflow_toolbar(
)->toolbar_spacer(
)->button(
text = 'load'
press = client->_event( 'POPUP_LAYOUT_LOAD' )
type = 'Emphasized'
)->button(
text = 'close'
press = client->_event( 'POPUP_LAYOUT_CONTINUE' )
type = 'Emphasized' ).
app-next-xml_popup = lo_popup->get_root( )->xml_get( ).
ENDMETHOD.
METHOD z2ui5_on_render_pop_filter.
DATA(lo_popup) = z2ui5_cl_xml_view=>factory_popup( ).
lo_popup->dialog( 'abap2UI5 - Popup to select entry'
)->table(
mode = 'MultiSelect'
items = client->_bind( ms_layout-t_filter_show )
)->columns(
)->column( )->text( 'Title' )->get_parent(
)->column( )->text( 'Color' )->get_parent(
)->column( )->text( 'Info' )->get_parent(
)->column( )->text( 'Description' )->get_parent(
)->get_parent(
)->items( )->column_list_item( selected = '{SELKZ}'
)->cells(
" )->checkbox( '{SELKZ}'
)->text( '{NAME}'
)->text( '{VALUE}'
" )->text( '{DESCR}'
)->get_parent( )->get_parent( )->get_parent( )->get_parent(
)->footer( )->overflow_toolbar(
)->toolbar_spacer(
)->button(
text = 'continue'
press = client->_event( 'POPUP_FILTER_CONTINUE' )
type = 'Emphasized' ).
app-next-xml_popup = lo_popup->get_root( )->xml_get( ).
ENDMETHOD.
METHOD z2ui5_on_render_pop_layout.
DATA(lo_popup) = z2ui5_cl_xml_view=>factory_popup( ).
lo_popup->popover( placement = `Bottom` title = 'abap2UI5 - Layout' contentwidth = `50%`
)->input( description = `Name` value = client->_bind( mv_layout_name )
)->button( text = `Save` press = client->_event( `BUTTON_SAVE_LAYOUT` )
)->table(
mode = 'SingleSelectLeft'
items = client->_bind( mt_db_layout )
)->columns(
)->column( )->text( 'Name' )->get_parent(
)->column( )->text( 'User' )->get_parent(
)->column( )->text( 'Default' )->get_parent(
" )->column( )->text( 'Description' )->get_parent(
)->get_parent(
)->items( )->column_list_item( selected = '{SELKZ}'
)->cells(
" )->checkbox( '{SELKZ}'
)->text( '{NAME}'
)->text( '{USER}'
)->text( '{DEFAULT}'
" )->text( '{DESCR}'
)->get_parent( )->get_parent( )->get_parent( )->get_parent(
)->footer( )->overflow_toolbar(
)->toolbar_spacer(
)->button(
text = 'load'
press = client->_event( 'POPUP_LAYOUT_LOAD' )
type = 'Emphasized'
)->button(
text = 'close'
press = client->_event( 'POPUP_LAYOUT_CONTINUE' )
type = 'Emphasized' ).
app-next-xml_popup = lo_popup->get_root( )->xml_get( ).
ENDMETHOD.
METHOD z2ui5_on_render_pop_setup.
DATA(ro_popup) = z2ui5_cl_xml_view=>factory_popup( ).
@ -739,115 +876,45 @@ CLASS z2ui5_cl_app_demo_49 IMPLEMENTATION.
ENDMETHOD.
METHOD z2ui5_on_render_pop_filter.
METHOD z2ui5_set_data.
DATA(lo_popup) = z2ui5_cl_xml_view=>factory_popup( ).
"dirty solution
"todo: map filters to rangetab and make a nice select
lo_popup->dialog( 'abap2UI5 - Popup to select entry'
)->table(
mode = 'MultiSelect'
items = client->_bind( ms_layout-t_filter_show )
)->columns(
)->column( )->text( 'Title' )->get_parent(
)->column( )->text( 'Color' )->get_parent(
)->column( )->text( 'Info' )->get_parent(
)->column( )->text( 'Description' )->get_parent(
)->get_parent(
)->items( )->column_list_item( selected = '{SELKZ}'
)->cells(
" )->checkbox( '{SELKZ}'
)->text( '{NAME}'
)->text( '{VALUE}'
" )->text( '{DESCR}'
)->get_parent( )->get_parent( )->get_parent( )->get_parent(
)->footer( )->overflow_toolbar(
)->toolbar_spacer(
)->button(
text = 'continue'
press = client->_event( 'POPUP_FILTER_CONTINUE' )
type = 'Emphasized' ).
IF ms_layout-s_filter-uuid IS INITIAL.
app-next-xml_popup = lo_popup->get_root( )->xml_get( ).
SELECT FROM z2ui5_t_draft
FIELDS uuid, uuid_prev, timestampl, uname
INTO CORRESPONDING FIELDS OF TABLE @mt_table
UP TO 50 ROWS.
ELSE.
SELECT FROM z2ui5_t_draft
FIELDS uuid, uuid_prev, timestampl, uname
WHERE uuid = @ms_layout-s_filter-uuid
INTO CORRESPONDING FIELDS OF TABLE @mt_table
UP TO 50 ROWS.
ENDIF.
ms_view-t_tab = CORRESPONDING #( mt_table ).
ENDMETHOD.
METHOD z2ui5_on_render_pop_detail.
DATA(lo_popup) = z2ui5_cl_xml_view=>factory_popup( ).
METHOD z2ui5_set_detail.
lo_popup->popover( placement = `Bottom` title = 'abap2UI5 - Layout' contentwidth = `50%`
)->input( description = `Name` value = client->_bind( mv_layout_name )
)->button( text = `Save` press = client->_event( `BUTTON_SAVE_LAYOUT` )
)->table(
mode = 'SingleSelectLeft'
items = client->_bind( mt_db_layout )
)->columns(
)->column( )->text( 'Name' )->get_parent(
)->column( )->text( 'User' )->get_parent(
)->column( )->text( 'Default' )->get_parent(
" )->column( )->text( 'Description' )->get_parent(
)->get_parent(
)->items( )->column_list_item( selected = '{SELKZ}'
)->cells(
" )->checkbox( '{SELKZ}'
)->text( '{NAME}'
)->text( '{USER}'
)->text( '{DEFAULT}'
" )->text( '{DESCR}'
)->get_parent( )->get_parent( )->get_parent( )->get_parent(
)->footer( )->overflow_toolbar(
)->toolbar_spacer(
)->button(
text = 'load'
press = client->_event( 'POPUP_LAYOUT_LOAD' )
type = 'Emphasized'
)->button(
text = 'close'
press = client->_event( 'POPUP_LAYOUT_CONTINUE' )
type = 'Emphasized' ).
ms_detail = mt_table[ uuid = client->get( )-event_data ].
app-next-xml_popup = lo_popup->get_root( )->xml_get( ).
SELECT SINGLE FROM z2ui5_t_draft
FIELDS *
WHERE uuid = @ms_detail-uuid
INTO CORRESPONDING FIELDS OF @ms_detail
.
ENDMETHOD.
METHOD z2ui5_on_render_pop_layout.
DATA(lo_popup) = z2ui5_cl_xml_view=>factory_popup( ).
lo_popup->popover( placement = `Bottom` title = 'abap2UI5 - Layout' contentwidth = `50%`
)->input( description = `Name` value = client->_bind( mv_layout_name )
)->button( text = `Save` press = client->_event( `BUTTON_SAVE_LAYOUT` )
)->table(
mode = 'SingleSelectLeft'
items = client->_bind( mt_db_layout )
)->columns(
)->column( )->text( 'Name' )->get_parent(
)->column( )->text( 'User' )->get_parent(
)->column( )->text( 'Default' )->get_parent(
" )->column( )->text( 'Description' )->get_parent(
)->get_parent(
)->items( )->column_list_item( selected = '{SELKZ}'
)->cells(
" )->checkbox( '{SELKZ}'
)->text( '{NAME}'
)->text( '{USER}'
)->text( '{DEFAULT}'
" )->text( '{DESCR}'
)->get_parent( )->get_parent( )->get_parent( )->get_parent(
)->footer( )->overflow_toolbar(
)->toolbar_spacer(
)->button(
text = 'load'
press = client->_event( 'POPUP_LAYOUT_LOAD' )
type = 'Emphasized'
)->button(
text = 'close'
press = client->_event( 'POPUP_LAYOUT_CONTINUE' )
type = 'Emphasized' ).
app-next-xml_popup = lo_popup->get_root( )->xml_get( ).
ENDMETHOD.
METHOD z2ui5_set_download_csv.
@ -888,25 +955,33 @@ CLASS z2ui5_cl_app_demo_49 IMPLEMENTATION.
ENDMETHOD.
METHOD encode_base64.
METHOD z2ui5_set_filter.
TRY.
CALL METHOD ('CL_WEB_HTTP_UTILITY')=>encode_base64
EXPORTING
unencoded = val
RECEIVING
encoded = result.
io_box->search_field(
value = client->_bind( ms_view-search_val )
search = client->_event( 'BUTTON_SEARCH' )
change = client->_event( 'BUTTON_SEARCH' )
width = `17.5rem`
id = `SEARCH`
).
CATCH cx_sy_dyn_call_illegal_class.
IF line_exists( ms_layout-t_filter_show[ name = `UUID` selkz = abap_true ] ).
io_box->input( value = client->_bind( ms_layout-s_filter-uuid ) description = `UUID` ).
ENDIF.
DATA(classname) = 'CL_HTTP_UTILITY'.
CALL METHOD (classname)=>encode_base64
EXPORTING
unencoded = val
RECEIVING
encoded = result.
IF line_exists( ms_layout-t_filter_show[ name = `UUID_PREV` selkz = abap_true ] ).
io_box->input( value = client->_bind( ms_layout-s_filter-uuid_prev ) description = `UUID_PREV` ).
ENDIF.
ENDTRY.
"todo other columns...
DATA(rt_filter) = ms_layout-t_filter_show.
DELETE rt_filter WHERE selkz = abap_false.
io_box->get_parent( )->hbox( justifycontent = `End`
)->button( text = `Go` press = client->_event( `BUTTON_START` ) type = `Emphasized`
)->button( text = `Adapt Filters (` && shift_right( CONV string( lines( rt_filter ) ) ) && `)` press = client->_event( `POPUP_FILTER` )
).
ENDMETHOD.
@ -936,19 +1011,6 @@ CLASS z2ui5_cl_app_demo_49 IMPLEMENTATION.
ENDMETHOD.
METHOD z2ui5_set_detail.
ms_detail = mt_table[ uuid = client->get( )-event_data ].
SELECT SINGLE FROM z2ui5_t_draft
FIELDS *
WHERE uuid = @ms_detail-uuid
INTO CORRESPONDING FIELDS OF @ms_detail
.
ENDMETHOD.
METHOD z2ui5_set_sort.
"quick and dirty - todo
@ -967,55 +1029,4 @@ CLASS z2ui5_cl_app_demo_49 IMPLEMENTATION.
ENDTRY.
ENDMETHOD.
METHOD z2ui5_set_filter.
IF line_exists( ms_layout-t_filter_show[ name = `UUID` selkz = abap_true ] ).
io_box->input( value = client->_bind( ms_layout-s_filter-uuid ) description = `UUID` ).
ENDIF.
IF line_exists( ms_layout-t_filter_show[ name = `UUID_PREV` selkz = abap_true ] ).
io_box->input( value = client->_bind( ms_layout-s_filter-uuid_prev ) description = `UUID_PREV` ).
ENDIF.
"todo other columns...
DATA(rt_filter) = ms_layout-t_filter_show.
DELETE rt_filter WHERE selkz = abap_false.
io_box->get_parent( )->hbox( justifycontent = `End`
)->button( text = `Go` press = client->_event( `BUTTON_START` ) type = `Emphasized`
)->button( text = `Adapt Filters (` && shift_right( CONV string( lines( rt_filter ) ) ) && `)` press = client->_event( `POPUP_FILTER` )
).
ENDMETHOD.
METHOD z2ui5_set_data.
"dirty solution
"todo: map filters to rangetab and make a nice select
IF ms_layout-s_filter-uuid IS INITIAL.
SELECT FROM z2ui5_t_draft
FIELDS uuid, uuid_prev, timestampl, uname
INTO CORRESPONDING FIELDS OF TABLE @mt_table
UP TO 50 ROWS.
ELSE.
SELECT FROM z2ui5_t_draft
FIELDS uuid, uuid_prev, timestampl, uname
WHERE uuid = @ms_layout-s_filter-uuid
INTO CORRESPONDING FIELDS OF TABLE @mt_table
UP TO 50 ROWS.
ENDIF.
ms_view-t_tab = CORRESPONDING #( mt_table ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,103 @@
CLASS z2ui5_cl_app_demo_51 DEFINITION PUBLIC.
PUBLIC SECTION.
INTERFACES z2ui5_if_app.
DATA product TYPE string.
DATA quantity TYPE string.
DATA check_initialized TYPE abap_bool.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS z2ui5_cl_app_demo_51 IMPLEMENTATION.
METHOD z2ui5_if_app~main.
IF check_initialized = abap_false.
check_initialized = abap_true.
product = 'tomato'.
quantity = '500'.
ENDIF.
CASE client->get( )-event.
WHEN 'BUTTON_POST'.
client->popup_message_toast( |{ product } { quantity } - send to the server| ).
WHEN 'BACK'.
client->nav_app_leave( client->get_app( client->get( )-id_prev_app_stack ) ).
ENDCASE.
DATA(page) = z2ui5_cl_xml_view=>factory( )->shell(
)->page(
id = 'id_page'
title = 'abapScheme - Workbench'
shownavbutton = abap_true
navbuttonpress = client->_event( 'BACK' ) ).
page->header_content(
)->toolbar(
)->button(
text = 'Evaluate'
press = client->_event( 'BUTTON_EVAL' )
icon = 'sap-icon://begin'
type = 'Emphasized'
")->toolbar_spacer(
)->button( text = 'S-Expression' press = client->_event( 'BUTTON_SEXP' )
icon = 'sap-icon://tree'
)->button( text = 'Trace' press = client->_event( 'BUTTON_TRACE' )
icon = 'sap-icon://step'
)->button(
text = 'Previous'
press = client->_event( 'BUTTON_PREV' )
icon = 'sap-icon://navigation-left-arrow'
)->button(
text = 'Next'
press = client->_event( 'BUTTON_NEXT' )
icon = 'sap-icon://navigation-right-arrow'
)->button(
text = 'Refresh'
type = 'Reject'
press = client->_event( 'BUTTON_RESET' )
icon = 'sap-icon://delete'
)->link( text = 'Help on..' href = 'https://github.com/nomssi/abap_scheme/wiki'
" icon = 'sap-icon://learning-assistant' // 'sap-icon://sys-help'
)->get_parent( ).
* )->toolbar(
* )->button(
* text = 'Evaluate'
* press = client->_event( 'BUTTON_EVAL' )
* icon = 'sap-icon://begin'
* type = 'Emphasized'
* )->toolbar_spacer(
* )->button( text = 'S-Expression' press = client->_event( 'BUTTON_SEXP' )
* icon = 'sap-icon://tree'
* )->button( text = 'Trace' press = client->_event( 'BUTTON_TRACE' )
* icon = 'sap-icon://step'
* )->button(
* text = 'Previous'
* press = client->_event( 'BUTTON_PREV' )
* icon = 'sap-icon://navigation-left-arrow'
* )->button(
* text = 'Next'
* press = client->_event( 'BUTTON_NEXT' )
* icon = 'sap-icon://navigation-right-arrow'
* )->button(
* text = 'Refresh'
* type = 'Reject'
* press = client->_event( 'BUTTON_RESET' )
* icon = 'sap-icon://delete'
* )->link( text = 'Help on..' href = 'https://github.com/nomssi/abap_scheme/wiki'
* " icon = 'sap-icon://learning-assistant' // 'sap-icon://sys-help'
* ).
client->set_next( VALUE #( xml_main = page->get_root( )->xml_get( ) ) ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,16 @@
<?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_DEMO_51</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>test -test</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,142 @@
CLASS z2ui5_cl_app_demo_52 DEFINITION PUBLIC.
PUBLIC SECTION.
INTERFACES z2ui5_if_app.
TYPES:
BEGIN OF ty_row,
count TYPE string,
value TYPE string,
descr TYPE string,
icon TYPE string,
info TYPE string,
checkbox TYPE abap_bool,
END OF ty_row.
DATA t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY.
DATA check_initialized TYPE abap_bool.
METHODS refresh_data.
data next type z2ui5_if_client=>ty_s_next.
DATA mv_check_popover TYPE abap_bool.
ENDCLASS.
CLASS z2ui5_cl_app_demo_52 IMPLEMENTATION.
METHOD refresh_data.
DO 100 TIMES.
DATA(ls_row) = VALUE ty_row( count = sy-index value = 'red'
info = COND #( WHEN sy-index < 50 THEN 'completed' ELSE 'uncompleted' )
descr = 'this is a description' checkbox = abap_true ).
INSERT ls_row INTO TABLE t_tab.
ENDDO.
ENDMETHOD.
METHOD z2ui5_if_app~main.
IF check_initialized = abap_false.
check_initialized = abap_true.
refresh_data( ).
ENDIF.
clear next.
CASE client->get( )-event.
WHEN `POPOVER_DETAIL`.
DATA(lv_id) = client->get( )-event_data.
mv_check_popover = abap_true.
next-popover_open_by_id = lv_id.
WHEN 'BUTTON_POST'.
client->popup_message_box( 'button post was pressed' ).
WHEN 'BACK'.
client->nav_app_leave( client->get_app( client->get( )-id_prev_app_stack ) ).
ENDCASE.
IF mv_check_popover = abap_false.
DATA(page) = z2ui5_cl_xml_view=>factory( )->shell(
)->page(
title = 'abap2UI5 - Demo displaying popver without rerendering the main view'
navbuttonpress = client->_event( 'BACK' )
shownavbutton = abap_true
)->header_content(
)->link(
text = 'Source_Code' target = '_blank'
href = z2ui5_cl_xml_view=>hlp_get_source_code_url( app = me get = client->get( ) )
)->get_parent( ).
DATA(tab) = page->scroll_container( height = '70%' vertical = abap_true
)->table(
growing = abap_true
growingthreshold = '20'
growingscrolltoload = abap_true
items = client->_bind_one( t_tab )
sticky = 'ColumnHeaders,HeaderToolbar' ).
tab->columns(
)->column(
)->text( 'Color' )->get_parent(
)->column(
)->text( 'Info' )->get_parent(
)->column(
)->text( 'Description' )->get_parent(
)->column(
)->text( 'Checkbox' )->get_parent(
)->column(
)->text( 'Counter' ).
tab->items( )->column_list_item( )->cells(
)->link( text = '{COUNT}' press = client->_event( val = `POPOVER_DETAIL` data = `${$source>/id}` hold_view = abap_true )
)->text( '{INFO}'
)->text( '{DESCR}'
)->checkbox( selected = '{CHECKBOX}' enabled = abap_false
)->text( '{COUNT}' ).
next-xml_main = page->get_root( )->xml_get( ).
else.
mv_check_popover = abap_false.
DATA(lo_popup) = z2ui5_cl_xml_view=>factory_popup( ).
lo_popup->popover( placement = `Bottom` title = 'abap2UI5 - this is a popover' contentwidth = `50%`
)->simple_form( editable = abap_true
)->content( 'form'
)->label( 'info1'
)->text( `this is a text`
)->label( 'info2'
)->text( `this is a text`
)->label( 'info3'
)->text( `this is a text`
)->text( `this is a text`
)->get_parent( )->get_parent(
)->footer(
)->overflow_toolbar(
)->toolbar_spacer(
)->button(
text = 'details'
press = client->_event( 'BUTTON_DETAILS' )
type = 'Emphasized'
).
next-xml_popup = lo_popup->get_root( )->xml_get( ).
ENDIF.
client->set_next( next ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,16 @@
<?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_DEMO_52</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>list report - cell with popover</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,747 @@
CLASS lcl_db DEFINITION.
PUBLIC SECTION.
TYPES ty_t_table TYPE z2ui5_cl_app_demo_13=>ty_t_table.
CLASS-DATA app TYPE REF TO z2ui5_cl_app_demo_13.
"CLASS-DATA st_table TYPE ty_t_table.
CLASS-METHODS generate_test_data.
CLASS-METHODS get_table_by_json
IMPORTING
val TYPE string
RETURNING
VALUE(result) TYPE ty_t_table.
CLASS-METHODS get_table_by_xml
IMPORTING
val TYPE string
RETURNING
VALUE(result) TYPE ty_t_table.
CLASS-METHODS get_table_by_csv
IMPORTING
val TYPE string
RETURNING
VALUE(result) TYPE ty_t_table.
CLASS-METHODS get_csv_by_table
IMPORTING
val TYPE ty_t_table
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS get_xml_by_table
IMPORTING
val TYPE ty_t_table
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS get_json_by_table
IMPORTING
val TYPE ty_t_table
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS get_fieldlist_by_table
IMPORTING
it_table TYPE table
RETURNING
VALUE(result) TYPE string_table.
CLASS-METHODS db_save
IMPORTING
value TYPE ty_t_table.
CLASS-METHODS db_read
RETURNING
VALUE(result) TYPE ty_t_table.
CLASS-METHODS get_test_data_json
RETURNING
VALUE(result) TYPE string.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS lcl_db IMPLEMENTATION.
METHOD generate_test_data.
app->st_db = VALUE #(
( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' )
( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' )
( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' )
( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' )
( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' )
( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' )
( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' )
( carrid = 'DL' connid = '0106' countryfr = 'US' cityfrom = 'NEW YORK' airpfrom = 'JFK' countryto = 'DE' cityto = 'FRANKFURT' airpto = 'FR' )
).
ENDMETHOD.
METHOD get_table_by_json.
DATA lt_tab TYPE ty_t_table.
/ui2/cl_json=>deserialize(
EXPORTING
json = val
* jsonx =
* pretty_name =
* assoc_arrays =
* assoc_arrays_opt =
* name_mappings =
* conversion_exits =
* hex_as_base64 =
CHANGING
data = lt_tab
).
result = lt_tab.
ENDMETHOD.
METHOD get_table_by_xml.
DATA lt_tab TYPE ty_t_table.
CALL TRANSFORMATION id SOURCE xml = val RESULT data = lt_tab.
result = lt_tab.
ENDMETHOD.
METHOD get_table_by_csv.
SPLIT val AT ';' INTO TABLE DATA(lt_cols).
LOOP AT lt_cols INTO DATA(lv_field).
DATA(ls_row) = VALUE z2ui5_cl_app_demo_13=>ty_s_spfli( ).
DATA(lv_index) = 1.
DO.
ASSIGN COMPONENT lv_index OF STRUCTURE ls_row TO FIELD-SYMBOL(<field>).
IF sy-subrc <> 0.
EXIT.
ENDIF.
<field> = lv_field.
lv_index = lv_index + 1.
ENDDO.
INSERT ls_row INTO TABLE result.
ENDLOOP.
ENDMETHOD.
METHOD db_save.
"normally modify database here
"test scenario, therefore write internal table instead
app->st_db = value.
ENDMETHOD.
METHOD db_read.
"normally read database here
"test scenario, therefore read internal table instead
result = app->st_db.
ENDMETHOD.
METHOD get_csv_by_table.
LOOP AT val INTO DATA(ls_row).
DATA(lv_index) = 1.
DO.
ASSIGN COMPONENT lv_index OF STRUCTURE ls_row TO FIELD-SYMBOL(<field>).
IF sy-subrc <> 0.
EXIT.
ENDIF.
lv_index = lv_index + 1.
result = result && <field> && ';'.
ENDDO.
result = result && cl_abap_char_utilities=>cr_lf.
ENDLOOP.
ENDMETHOD.
METHOD get_json_by_table.
result = /ui2/cl_json=>serialize(
val
* compress =
* name =
* pretty_name =
* type_descr =
* assoc_arrays =
* ts_as_iso8601 =
* expand_includes =
* assoc_arrays_opt =
* numc_as_string =
* name_mappings =
* conversion_exits =
" format_output = abap_true
* hex_as_base64 =
).
ENDMETHOD.
METHOD get_xml_by_table.
CALL TRANSFORMATION id SOURCE values = val RESULT XML result.
ENDMETHOD.
METHOD get_fieldlist_by_table.
DATA(lo_tab) = CAST cl_abap_tabledescr( cl_abap_datadescr=>describe_by_data( it_table ) ).
DATA(lo_struc) = CAST cl_abap_structdescr( lo_tab->get_table_line_type( ) ).
DATA(lt_comp) = lo_struc->get_components( ).
LOOP AT lt_comp INTO DATA(ls_comp).
INSERT ls_comp-name INTO TABLE result.
ENDLOOP.
ENDMETHOD.
METHOD get_test_data_json.
result = `[` && |\n| &&
` {` && |\n| &&
` "CARRID": "DL",` && |\n| &&
` "CONNID": 106,` && |\n| &&
` "COUNTRYFR": "US",` && |\n| &&
` "CITYFROM": "NEW YORK",` && |\n| &&
` "AIRPFROM": "JFK",` && |\n| &&
` "COUNTRYTO": "DE",` && |\n| &&
` "CITYTO": "FRANKFURT",` && |\n| &&
` "AIRPTO": "FR"` && |\n| &&
` },` && |\n| &&
` {` && |\n| &&
` "CARRID": "DL",` && |\n| &&
` "CONNID": 106,` && |\n| &&
` "COUNTRYFR": "US",` && |\n| &&
` "CITYFROM": "NEW YORK",` && |\n| &&
` "AIRPFROM": "JFK",` && |\n| &&
` "COUNTRYTO": "DE",` && |\n| &&
` "CITYTO": "FRANKFURT",` && |\n| &&
` "AIRPTO": "FR"` && |\n| &&
` },` && |\n| &&
` {` && |\n| &&
` "CARRID": "DL",` && |\n| &&
` "CONNID": 106,` && |\n| &&
` "COUNTRYFR": "US",` && |\n| &&
` "CITYFROM": "NEW YORK",` && |\n| &&
` "AIRPFROM": "JFK",` && |\n| &&
` "COUNTRYTO": "DE",` && |\n| &&
` "CITYTO": "FRANKFURT",` && |\n| &&
` "AIRPTO": "FR"` && |\n| &&
` },` && |\n| &&
` {` && |\n| &&
` "CARRID": "DL",` && |\n| &&
` "CONNID": 106,` && |\n| &&
` "COUNTRYFR": "US",` && |\n| &&
` "CITYFROM": "NEW YORK",` && |\n| &&
` "AIRPFROM": "JFK",` && |\n| &&
` "COUNTRYTO": "DE",` && |\n| &&
` "CITYTO": "FRANKFURT",` && |\n| &&
` "AIRPTO": "FR"` && |\n| &&
` },` && |\n| &&
` {` && |\n| &&
` "CARRID": "DL",` && |\n| &&
` "CONNID": 106,` && |\n| &&
` "COUNTRYFR": "US",` && |\n| &&
` "CITYFROM": "NEW YORK",` && |\n| &&
` "AIRPFROM": "JFK",` && |\n| &&
` "COUNTRYTO": "DE",` && |\n| &&
` "CITYTO": "FRANKFURT",` && |\n| &&
` "AIRPTO": "FR"` && |\n| &&
` },` && |\n| &&
` {` && |\n| &&
` "CARRID": "DL",` && |\n| &&
` "CONNID": 106,` && |\n| &&
` "COUNTRYFR": "US",` && |\n| &&
` "CITYFROM": "NEW YORK",` && |\n| &&
` "AIRPFROM": "JFK",` && |\n| &&
` "COUNTRYTO": "DE",` && |\n| &&
` "CITYTO": "FRANKFURT",` && |\n| &&
` "AIRPTO": "FR"` && |\n| &&
` },` && |\n| &&
` {` && |\n| &&
` "CARRID": "DL",` && |\n| &&
` "CONNID": 106,` && |\n| &&
` "COUNTRYFR": "US",` && |\n| &&
` "CITYFROM": "NEW YORK",` && |\n| &&
` "AIRPFROM": "JFK",` && |\n| &&
` "COUNTRYTO": "DE",` && |\n| &&
` "CITYTO": "FRANKFURT",` && |\n| &&
` "AIRPTO": "FR"` && |\n| &&
` },` && |\n| &&
` {` && |\n| &&
` "CARRID": "DL",` && |\n| &&
` "CONNID": 106,` && |\n| &&
` "COUNTRYFR": "US",` && |\n| &&
` "CITYFROM": "NEW YORK",` && |\n| &&
` "AIRPFROM": "JFK",` && |\n| &&
` "COUNTRYTO": "DE",` && |\n| &&
` "CITYTO": "FRANKFURT",` && |\n| &&
` "AIRPTO": "FR"` && |\n| &&
` }` && |\n| &&
`]`.
ENDMETHOD.
ENDCLASS.
CLASS z2ui5_lcl_utility DEFINITION INHERITING FROM cx_no_check.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_attri,
name TYPE string,
type_kind TYPE string,
type TYPE string,
bind_type TYPE string,
data_stringify TYPE string,
gen_type_kind TYPE string,
gen_type TYPE string,
gen_kind TYPE string,
END OF ty_attri.
TYPES ty_T_attri TYPE STANDARD TABLE OF ty_attri WITH EMPTY KEY.
DATA:
BEGIN OF ms_error,
x_root TYPE REF TO cx_root,
uuid TYPE string,
s_msg TYPE LINE OF bapirettab,
END OF ms_error.
METHODS constructor
IMPORTING
val TYPE any OPTIONAL
previous TYPE REF TO cx_root OPTIONAL
PREFERRED PARAMETER val.
METHODS get_text REDEFINITION.
CLASS-METHODS raise
IMPORTING
v TYPE clike DEFAULT `CX_SY_SUBRC`
when TYPE abap_bool DEFAULT abap_true
PREFERRED PARAMETER v.
CLASS-METHODS get_header_val
IMPORTING
v TYPE clike
RETURNING
VALUE(result) TYPE z2ui5_if_client=>ty_s_name_value-value.
CLASS-METHODS get_param_val
IMPORTING
v TYPE clike
RETURNING
VALUE(result) TYPE z2ui5_if_client=>ty_s_name_value-value.
CLASS-METHODS get_uuid
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS get_uuid_session
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS get_user_tech
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS get_timestampl
RETURNING
VALUE(result) TYPE timestampl.
CLASS-METHODS trans_any_2_json
IMPORTING
any TYPE any
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS trans_xml_2_object
IMPORTING
xml TYPE clike
EXPORTING
data TYPE data.
CLASS-METHODS get_t_attri_by_ref
IMPORTING
io_app TYPE REF TO object
RETURNING
VALUE(result) TYPE ty_t_attri ##NEEDED.
CLASS-METHODS trans_data_2_xml
IMPORTING
data TYPE data
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS get_abap_2_json
IMPORTING
val TYPE any
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS check_is_boolean
IMPORTING
val TYPE any
RETURNING
VALUE(result) TYPE abap_bool.
CLASS-METHODS get_json_boolean
IMPORTING
val TYPE any
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS trans_ref_tab_2_tab
IMPORTING
ir_tab_from TYPE REF TO data
EXPORTING
t_result TYPE STANDARD TABLE.
CLASS-METHODS get_trim_upper
IMPORTING
val TYPE any
RETURNING
VALUE(result) TYPE string.
PROTECTED SECTION.
CLASS-DATA mv_counter TYPE i.
CLASS-METHODS _get_t_attri
IMPORTING
io_app TYPE REF TO object
iv_attri TYPE csequence
RETURNING
VALUE(result) TYPE abap_attrdescr_tab.
PRIVATE SECTION.
ENDCLASS.
CLASS z2ui5_lcl_utility IMPLEMENTATION.
METHOD get_trim_upper.
result = CONV #( val ).
result = to_upper( shift_left( shift_right( result ) ) ).
ENDMETHOD.
METHOD constructor.
super->constructor( previous = previous ).
CLEAR textid.
TRY.
ms_error-x_root ?= val.
CATCH cx_root ##CATCH_ALL.
ms_error-s_msg-message = val.
ENDTRY.
TRY.
ms_error-uuid = get_uuid( ).
CATCH cx_root ##CATCH_ALL.
ENDTRY.
ENDMETHOD.
METHOD get_abap_2_json.
IF check_is_boolean( val ).
result = COND #( WHEN val = abap_true THEN `true` ELSE `false` ).
ELSE.
result = |"{ escape( val = val format = cl_abap_format=>e_json_string ) }"|.
ENDIF.
ENDMETHOD.
METHOD check_is_boolean.
TRY.
DATA(lo_ele) = CAST cl_abap_elemdescr( cl_abap_elemdescr=>describe_by_data( val ) ).
CASE lo_ele->get_relative_name( ).
WHEN `ABAP_BOOL` OR `ABAP_BOOLEAN` OR `XSDBOOLEAN`.
result = abap_true.
ENDCASE.
CATCH cx_root.
ENDTRY.
ENDMETHOD.
METHOD get_json_boolean.
IF check_is_boolean( val ).
result = COND #( WHEN val = abap_true THEN `true` ELSE `false` ).
ELSE.
result = val.
ENDIF.
ENDMETHOD.
METHOD get_timestampl.
GET TIME STAMP FIELD result.
ENDMETHOD.
METHOD get_user_tech.
result = sy-uname.
ENDMETHOD.
METHOD get_uuid.
TRY.
DATA uuid TYPE c LENGTH 32.
TRY.
CALL METHOD (`CL_SYSTEM_UUID`)=>if_system_uuid_static~create_uuid_c32
RECEIVING
uuid = uuid.
CATCH cx_sy_dyn_call_illegal_class.
DATA(lv_fm) = `GUID_CREATE`.
CALL FUNCTION lv_fm
IMPORTING
ev_guid_32 = uuid.
ENDTRY.
result = uuid.
CATCH cx_root.
ASSERT 1 = 0.
ENDTRY.
ENDMETHOD.
METHOD get_uuid_session.
mv_counter = mv_counter + 1.
result = get_trim_upper( mv_counter ).
ENDMETHOD.
METHOD get_header_val.
result = z2ui5_cl_http_handler=>client-t_header[ name = v ]-value.
ENDMETHOD.
METHOD get_param_val.
DATA(lt_param) = VALUE z2ui5_if_client=>ty_t_name_value( LET tab = z2ui5_cl_http_handler=>client-t_param IN FOR row IN tab
( name = to_upper( row-name ) value = to_upper( row-value ) ) ).
TRY.
result = lt_param[ name = get_trim_upper( v ) ]-value.
CATCH cx_root.
ENDTRY.
ENDMETHOD.
METHOD get_t_attri_by_ref.
DATA(lt_attri) = CAST cl_abap_classdescr( cl_abap_objectdescr=>describe_by_object_ref( io_app ) )->attributes.
DELETE lt_attri WHERE visibility <> cl_abap_classdescr=>public.
LOOP AT lt_attri INTO DATA(ls_attri)
WHERE type_kind = cl_abap_classdescr=>typekind_struct2
OR type_kind = cl_abap_classdescr=>typekind_struct1.
DELETE lt_attri INDEX sy-tabix.
INSERT LINES OF _get_t_attri(
io_app = io_app
iv_attri = ls_attri-name ) INTO TABLE lt_attri.
ENDLOOP.
LOOP AT lt_attri INTO ls_attri.
DATA(ls_attri2) = VALUE ty_attri( ).
ls_attri2 = CORRESPONDING #( ls_attri ).
FIELD-SYMBOLS <any> TYPE any.
UNASSIGN <any>.
DATA(lv_assign) = `IO_APP->` && ls_attri-name.
ASSIGN (lv_assign) TO <any>.
DATA(lo_descr) = cl_abap_datadescr=>describe_by_data( <any> ).
CASE lo_descr->kind.
WHEN lo_descr->kind_elem.
ls_attri2-type = CAST cl_abap_elemdescr( lo_descr )->get_relative_name( ).
ENDCASE.
APPEND ls_attri2 TO result.
ENDLOOP.
ENDMETHOD.
METHOD _get_t_attri.
CONSTANTS c_prefix TYPE string VALUE `IO_APP->`.
FIELD-SYMBOLS <attribute> TYPE any.
DATA(lv_name) = c_prefix && to_upper( iv_attri ).
ASSIGN (lv_name) TO <attribute>.
raise( when = xsdbool( sy-subrc <> 0 ) ).
DATA(lo_type) = cl_abap_structdescr=>describe_by_data( <attribute> ).
DATA(lo_struct) = CAST cl_abap_structdescr( lo_type ).
LOOP AT lo_struct->get_components( ) REFERENCE INTO DATA(lr_comp).
DATA(lv_element) = iv_attri && `-` && lr_comp->name.
IF lr_comp->as_include = abap_true.
INSERT LINES OF _get_t_attri( io_app = io_app
iv_attri = lv_element ) INTO TABLE result.
ELSE.
INSERT VALUE #( name = lv_element
type_kind = lr_comp->type->type_kind ) INTO TABLE result.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD trans_any_2_json.
result = /ui2/cl_json=>serialize( any ).
ENDMETHOD.
METHOD trans_data_2_xml.
" FIELD-SYMBOLS <object> TYPE any.
" ASSIGN object->* TO <object>.
" raise( when = xsdbool( sy-subrc <> 0 ) ).
CALL TRANSFORMATION id
SOURCE data = data
RESULT XML result
OPTIONS data_refs = `heap-or-create`.
ENDMETHOD.
METHOD trans_ref_tab_2_tab.
TYPES ty_t_ref TYPE STANDARD TABLE OF REF TO data.
FIELD-SYMBOLS <lt_from> TYPE ty_t_ref.
ASSIGN ir_tab_from->* TO <lt_from>.
raise( when = xsdbool( sy-subrc <> 0 ) ).
CLEAR t_result.
DATA(lo_tab) = CAST cl_abap_tabledescr( cl_abap_datadescr=>describe_by_data( t_result ) ).
DATA(lo_struc) = CAST cl_abap_structdescr( lo_tab->get_table_line_type( ) ).
DATA(lt_components) = lo_struc->get_components( ).
LOOP AT <lt_from> INTO DATA(lr_from).
DATA lr_row TYPE REF TO data.
CREATE DATA lr_row LIKE LINE OF t_result.
ASSIGN lr_row->* TO FIELD-SYMBOL(<row>).
ASSIGN lr_from->* TO FIELD-SYMBOL(<row_ui5>).
raise( when = xsdbool( sy-subrc <> 0 ) ).
LOOP AT lt_components INTO DATA(ls_comp).
FIELD-SYMBOLS <comp> TYPE data.
ASSIGN COMPONENT ls_comp-name OF STRUCTURE <row> TO <comp>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
FIELD-SYMBOLS <comp_ui5> TYPE data.
ASSIGN COMPONENT ls_comp-name OF STRUCTURE <row_ui5> TO <comp_ui5>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
ASSIGN <comp_ui5>->* TO FIELD-SYMBOL(<ls_data_ui5>).
IF sy-subrc = 0.
<comp> = <ls_data_ui5>.
ENDIF.
ENDLOOP.
INSERT <row> INTO TABLE t_result.
ENDLOOP.
ENDMETHOD.
METHOD trans_xml_2_object.
CALL TRANSFORMATION id
SOURCE XML xml
RESULT data = data.
ENDMETHOD.
METHOD get_text.
IF ms_error-x_root IS NOT INITIAL.
result = ms_error-x_root->get_text( ).
DATA(error) = abap_true.
ELSEIF ms_error-s_msg-message IS NOT INITIAL.
result = ms_error-s_msg-message.
error = abap_true.
ENDIF.
IF error = abap_true AND result IS INITIAL.
result = `unknown error`.
ENDIF.
ENDMETHOD.
METHOD raise.
IF when = abap_false.
RETURN.
ENDIF.
RAISE EXCEPTION TYPE z2ui5_lcl_utility EXPORTING val = v.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,16 @@
<?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_DEMO_53</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>list report - filter</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,151 @@
CLASS z2ui5_cl_app_demo_54 DEFINITION PUBLIC.
PUBLIC SECTION.
INTERFACES z2ui5_if_app.
TYPES:
BEGIN OF ty_row,
count TYPE i,
value TYPE string,
descr TYPE string,
icon TYPE string,
info TYPE string,
checkbox TYPE abap_bool,
END OF ty_row.
DATA t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY.
DATA check_initialized TYPE abap_bool.
METHODS refresh_data.
data next type z2ui5_if_client=>ty_s_next.
DATA mv_check_popover TYPE abap_bool.
ENDCLASS.
CLASS z2ui5_cl_app_demo_54 IMPLEMENTATION.
METHOD refresh_data.
DO 100 TIMES.
DATA(ls_row) = VALUE ty_row( count = sy-index value = 'red'
info = COND #( WHEN sy-index < 50 THEN 'completed' ELSE 'uncompleted' )
descr = 'this is a description' checkbox = abap_true ).
INSERT ls_row INTO TABLE t_tab.
ENDDO.
ENDMETHOD.
METHOD z2ui5_if_app~main.
IF check_initialized = abap_false.
check_initialized = abap_true.
refresh_data( ).
ENDIF.
clear next.
CASE client->get( )-event.
WHEN `POPOVER_DETAIL`.
DATA(lv_id) = client->get( )-event_data.
mv_check_popover = abap_true.
next-popover_open_by_id = lv_id.
WHEN 'BUTTON_POST'.
client->popup_message_box( 'button post was pressed' ).
WHEN 'BACK'.
client->nav_app_leave( client->get_app( client->get( )-id_prev_app_stack ) ).
ENDCASE.
IF mv_check_popover = abap_false.
DATA(page) = z2ui5_cl_xml_view=>factory( )->shell(
)->page(
title = 'abap2UI5 - Scroll Container with Table and Toolbar'
navbuttonpress = client->_event( 'BACK' )
shownavbutton = abap_true
)->header_content(
)->link(
text = 'Source_Code' target = '_blank'
href = z2ui5_cl_xml_view=>hlp_get_source_code_url( app = me get = client->get( ) )
)->get_parent( ).
DATA(tab) = page->scroll_container( height = '70%' vertical = abap_true
)->table(
growing = abap_true
growingthreshold = '20'
growingscrolltoload = abap_true
items = client->_bind_one( t_tab )
sticky = 'ColumnHeaders,HeaderToolbar' ).
tab->columns(
)->column(
)->text( 'Color' )->get_parent(
)->column(
)->text( 'Info' )->get_parent(
)->column(
)->text( 'Description' )->get_parent(
)->column(
)->text( 'Checkbox' )->get_parent(
)->column(
)->text( 'Counter' ).
tab->items( )->column_list_item( )->cells(
)->link( text = '{VALUE}' press = client->_event( val = `POPOVER_DETAIL` data = `${$source>/id}` hold_view = abap_true )
)->text( '{INFO}'
)->text( '{DESCR}'
)->checkbox( selected = '{CHECKBOX}' enabled = abap_false
)->text( '{COUNT}' ).
next-xml_main = page->get_root( )->xml_get( ).
else.
mv_check_popover = abap_false.
DATA(lo_popup) = z2ui5_cl_xml_view=>factory_popup( ).
lo_popup->popover( placement = `Bottom` title = 'abap2UI5 - Layout' contentwidth = `50%`
" )->input( description = `Name` value = client->_bind( mv_layout_name )
)->button( text = `Save` press = client->_event( `BUTTON_SAVE_LAYOUT` )
* )->table(
* mode = 'SingleSelectLeft'
* items = client->_bind( mt_db_layout )
* )->columns(
* )->column( )->text( 'Name' )->get_parent(
* )->column( )->text( 'User' )->get_parent(
* )->column( )->text( 'Default' )->get_parent(
* " )->column( )->text( 'Description' )->get_parent(
* )->get_parent(
* )->items( )->column_list_item( selected = '{SELKZ}'
* )->cells(
* " )->checkbox( '{SELKZ}'
* )->text( '{NAME}'
* )->text( '{USER}'
* )->text( '{DEFAULT}'
* " )->text( '{DESCR}'
)->footer( )->overflow_toolbar(
)->toolbar_spacer(
)->button(
text = 'load'
press = client->_event( 'POPUP_LAYOUT_LOAD' )
type = 'Emphasized'
)->button(
text = 'close'
press = client->_event( 'POPUP_LAYOUT_CONTINUE' )
type = 'Emphasized' ).
next-xml_popup = lo_popup->get_root( )->xml_get( ).
ENDIF.
client->set_next( next ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,16 @@
<?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_DEMO_54</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>list report - navigation</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,151 @@
CLASS z2ui5_cl_app_demo_55 DEFINITION PUBLIC.
PUBLIC SECTION.
INTERFACES z2ui5_if_app.
TYPES:
BEGIN OF ty_row,
count TYPE i,
value TYPE string,
descr TYPE string,
icon TYPE string,
info TYPE string,
checkbox TYPE abap_bool,
END OF ty_row.
DATA t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY.
DATA check_initialized TYPE abap_bool.
METHODS refresh_data.
data next type z2ui5_if_client=>ty_s_next.
DATA mv_check_popover TYPE abap_bool.
ENDCLASS.
CLASS z2ui5_cl_app_demo_55 IMPLEMENTATION.
METHOD refresh_data.
DO 100 TIMES.
DATA(ls_row) = VALUE ty_row( count = sy-index value = 'red'
info = COND #( WHEN sy-index < 50 THEN 'completed' ELSE 'uncompleted' )
descr = 'this is a description' checkbox = abap_true ).
INSERT ls_row INTO TABLE t_tab.
ENDDO.
ENDMETHOD.
METHOD z2ui5_if_app~main.
IF check_initialized = abap_false.
check_initialized = abap_true.
refresh_data( ).
ENDIF.
clear next.
CASE client->get( )-event.
WHEN `POPOVER_DETAIL`.
DATA(lv_id) = client->get( )-event_data.
mv_check_popover = abap_true.
next-popover_open_by_id = lv_id.
WHEN 'BUTTON_POST'.
client->popup_message_box( 'button post was pressed' ).
WHEN 'BACK'.
client->nav_app_leave( client->get_app( client->get( )-id_prev_app_stack ) ).
ENDCASE.
IF mv_check_popover = abap_false.
DATA(page) = z2ui5_cl_xml_view=>factory( )->shell(
)->page(
title = 'abap2UI5 - Scroll Container with Table and Toolbar'
navbuttonpress = client->_event( 'BACK' )
shownavbutton = abap_true
)->header_content(
)->link(
text = 'Source_Code' target = '_blank'
href = z2ui5_cl_xml_view=>hlp_get_source_code_url( app = me get = client->get( ) )
)->get_parent( ).
DATA(tab) = page->scroll_container( height = '70%' vertical = abap_true
)->table(
growing = abap_true
growingthreshold = '20'
growingscrolltoload = abap_true
items = client->_bind_one( t_tab )
sticky = 'ColumnHeaders,HeaderToolbar' ).
tab->columns(
)->column(
)->text( 'Color' )->get_parent(
)->column(
)->text( 'Info' )->get_parent(
)->column(
)->text( 'Description' )->get_parent(
)->column(
)->text( 'Checkbox' )->get_parent(
)->column(
)->text( 'Counter' ).
tab->items( )->column_list_item( )->cells(
)->link( text = '{VALUE}' press = client->_event( val = `POPOVER_DETAIL` data = `${$source>/id}` hold_view = abap_true )
)->text( '{INFO}'
)->text( '{DESCR}'
)->checkbox( selected = '{CHECKBOX}' enabled = abap_false
)->text( '{COUNT}' ).
next-xml_main = page->get_root( )->xml_get( ).
else.
mv_check_popover = abap_false.
DATA(lo_popup) = z2ui5_cl_xml_view=>factory_popup( ).
lo_popup->popover( placement = `Bottom` title = 'abap2UI5 - Layout' contentwidth = `50%`
" )->input( description = `Name` value = client->_bind( mv_layout_name )
)->button( text = `Save` press = client->_event( `BUTTON_SAVE_LAYOUT` )
* )->table(
* mode = 'SingleSelectLeft'
* items = client->_bind( mt_db_layout )
* )->columns(
* )->column( )->text( 'Name' )->get_parent(
* )->column( )->text( 'User' )->get_parent(
* )->column( )->text( 'Default' )->get_parent(
* " )->column( )->text( 'Description' )->get_parent(
* )->get_parent(
* )->items( )->column_list_item( selected = '{SELKZ}'
* )->cells(
* " )->checkbox( '{SELKZ}'
* )->text( '{NAME}'
* )->text( '{USER}'
* )->text( '{DEFAULT}'
* " )->text( '{DESCR}'
)->footer( )->overflow_toolbar(
)->toolbar_spacer(
)->button(
text = 'load'
press = client->_event( 'POPUP_LAYOUT_LOAD' )
type = 'Emphasized'
)->button(
text = 'close'
press = client->_event( 'POPUP_LAYOUT_CONTINUE' )
type = 'Emphasized' ).
next-xml_popup = lo_popup->get_root( )->xml_get( ).
ENDIF.
client->set_next( next ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,16 @@
<?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_DEMO_55</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>tab - layout</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

File diff suppressed because it is too large Load Diff

View File

@ -22,7 +22,6 @@ CLASS z2ui5_cl_http_handler DEFINITION
t_config TYPE z2ui5_if_client=>ty_t_name_value OPTIONAL
content_security_policy TYPE clike OPTIONAL
check_logging TYPE abap_bool DEFAULT abap_false
title TYPE string DEFAULT `abap2UI5`
RETURNING
VALUE(r_result) TYPE string.
@ -37,12 +36,12 @@ ENDCLASS.
CLASS z2ui5_cl_http_handler IMPLEMENTATION.
CLASS Z2UI5_CL_HTTP_HANDLER IMPLEMENTATION.
METHOD http_post.
DATA(lo_handler) = z2ui5_lcl_fw_handler=>request_begin( ).
DATA(lo_handler) = z2ui5_lcl_fw_handler=>request_begin( ).
DO.
TRY.
@ -94,13 +93,6 @@ CLASS z2ui5_cl_http_handler IMPLEMENTATION.
ELSE.
lv_sec_policy = content_security_policy.
ENDIF.
DATA(lv_url) = z2ui5_lcl_utility=>get_header_val( '~path' ).
DATA(lv_app) = z2ui5_lcl_utility=>get_param_val( 'app' ).
IF lv_app IS INITIAL.
DATA(lv_path) = z2ui5_lcl_utility=>get_header_val( '~path_info' ).
SPLIT lv_path AT `/` INTO lv_app DATA(lv_dummy).
ENDIF.
z2ui5_lcl_fw_db=>cleanup( ).
r_result = `<html>` && |\n| &&
@ -109,7 +101,7 @@ CLASS z2ui5_cl_http_handler IMPLEMENTATION.
` <meta charset="UTF-8">` && |\n| &&
` <meta name="viewport" content="width=device-width, initial-scale=1.0">` && |\n| &&
` <meta http-equiv="X-UA-Compatible" content="IE=edge">` && |\n| &&
` <title>` && title && `</title>` && |\n| &&
` <title>abap2UI5</title>` && |\n| &&
` <style>` && |\n| &&
` html, body, body > div, #container, #container-uiarea {` && |\n| &&
` height: 100%;` && |\n| &&
@ -131,195 +123,199 @@ CLASS z2ui5_cl_http_handler IMPLEMENTATION.
` sap.ui.getCore().attachInit(function () {` && |\n| &&
` "use strict";` && |\n| &&
|\n| &&
` sap.ui.controller("z2ui5_controller", {` && |\n| &&
` sap.ui.controller("z2ui5_controller", {` && |\n| &&
|\n| &&
` onAfterRendering: function () {` && |\n| &&
` if(sap.z2ui5.oResponse.title != ""){ document.title = sap.z2ui5.oResponse.title; }` && |\n| &&
` if(sap.z2ui5.oResponse.path != ""){ window.history.replaceState( "" , "" , window.location.origin + sap.z2ui5.oResponse.path + window.location.search ); }` && |\n| &&
` var oView = this.getView();` && |\n| &&
` try {` && |\n| &&
` if (sap.z2ui5.oResponse.oCursor) {` && |\n| &&
` var ofocus = oView.byId(sap.z2ui5.oResponse.oCursor.ID).getFocusInfo();` && |\n| &&
` ofocus.cursorPos = parseInt( sap.z2ui5.oResponse.oCursor.CURSORPOS );` && |\n| &&
` ofocus.selectionStart = parseInt( sap.z2ui5.oResponse.oCursor.SELECTIONSTART );` && |\n| &&
` ofocus.selectionEnd = parseInt( sap.z2ui5.oResponse.oCursor.SELECTIONEND );` && |\n| &&
` onAfterRendering: function () {` && |\n| &&
` sap.z2ui5.onAfter();` && |\n| &&
` },` && |\n| &&
|\n| &&
` onEventFrontend: function (vAction) {` && |\n| &&
|\n| &&
` if (vAction == 'POPUP_CLOSE') {` && |\n| &&
` if (sap.z2ui5.oResponse.oViewPopup.close) {` && |\n| &&
` sap.z2ui5.oResponse.oViewPopup.close();` && |\n| &&
` }` && |\n| &&
` sap.z2ui5.oResponse.oViewPopup.destroy();` && |\n| &&
` delete sap.z2ui5.oResponse.oViewPopup;` && |\n| &&
` delete sap.z2ui5.oResponse.oSystem.VIEW_POPUP;` && |\n| &&
` }` && |\n| &&
` },` && |\n| &&
|\n| &&
` onEvent: function (oEvent, vData, isHoldView) {` && |\n| &&
|\n| &&
` if (!window.navigator.onLine) {` && |\n| &&
` sap.m.MessageBox.alert('No internet connection! Please reconnect to the server and try again.');` && |\n| &&
` return;` && |\n| &&
` }` && |\n| &&
|\n| &&
` sap.ui.core.BusyIndicator.show();` && |\n| &&
` this.oBody = {};` && |\n| &&
|\n| &&
` if (sap.z2ui5.oResponse.oViewPopup) {` && |\n| &&
` this.oBody.oUpdate = sap.z2ui5.oResponse.oViewPopup.getModel().oData.oUpdate;` && |\n| &&
` if (sap.z2ui5.oResponse.oViewPopup.close) {` && |\n| &&
` sap.z2ui5.oResponse.oViewPopup.close();` && |\n| &&
` }` && |\n| &&
` sap.z2ui5.oResponse.oViewPopup.destroy();` && |\n| &&
` } else {` && |\n| &&
` this.oBody.oUpdate = sap.z2ui5.oView.getModel().oData.oUpdate;` && |\n| &&
` }` && |\n| &&
|\n| &&
` if (sap.z2ui5.oResponse.PARAMS.T_SCROLL) {` && |\n| &&
` this.oBody.oScroll = sap.z2ui5.oResponse.PARAMS.T_SCROLL;` && |\n| &&
` this.oBody.oScroll.forEach(item => {` && |\n| &&
` try {` && |\n| &&
` item.VALUE = this.getView().byId(item.NAME).getScrollDelegate().getScrollTop();` && |\n| &&
` } catch (e) {` && |\n| &&
` var ele = '#' + this.getView().byId(item.NAME).getId() + '-inner';` && |\n| &&
` item.VALUE = $(ele).scrollTop();` && |\n| &&
` }` && |\n| &&
` oView.byId(sap.z2ui5.oResponse.oCursor.ID).applyFocusInfo(ofocus);` && |\n| &&
` } catch (error) { };` && |\n| &&
` try {` && |\n| &&
` } catch (error) { };` && |\n| &&
` if (sap.z2ui5.oResponse.oScroll) {` && |\n| &&
` sap.z2ui5.oResponse.oScroll.forEach(` && |\n| &&
` item => { try { oView.byId(item.NAME).scrollTo( parseInt( item.VALUE ) ); ` && |\n| &&
` } catch (e) {` && |\n| &&
` var ele = '#' + oView.byId(item.NAME).getId() + '-inner';` && |\n| &&
` $(ele).scrollTop(item.VALUE); ` && |\n| &&
` } ` && |\n| &&
` } );` && |\n| &&
` }` && |\n| &&
` if (sap.z2ui5.oResponse.vViewPopup) {` && |\n| &&
` ` && |\n| &&
` ` && |\n| &&
` sap.ui.core.Fragment.load({` && |\n| &&
` definition: sap.z2ui5.oResponse.vViewPopup,` && |\n| &&
` controller: this,` && |\n| &&
` }).then(function (oFragment) {` && |\n| &&
` oFragment.setModel(new sap.ui.model.json.JSONModel(sap.z2ui5.oResponse.oViewModel))` && |\n| &&
` this.getView().addDependent(oFragment);` && |\n| &&
` if (!sap.z2ui5.oResponse.OPENBY) { oFragment.open(); } else {` && |\n| &&
` oFragment.openBy(this.getView().byId(sap.z2ui5.oResponse.OPENBY))` && |\n| &&
` }` && |\n| &&
` sap.z2ui5.oResponse.oViewPopup = oFragment;` && |\n| &&
` sap.ui.core.BusyIndicator.hide();` && |\n| &&
` }.bind(this));` && |\n| &&
` }` && |\n| &&
` if (sap.z2ui5.oResponse.oTimer){ ` && |\n| &&
` var oEvent = { 'EVENT' : 'BUTTON_CHECK', 'METHOD' : 'UPDATE' };` && |\n| &&
` oEvent.EVENT = sap.z2ui5.oResponse.oTimer.EVENT_FINISHED;` && |\n| &&
` sap.z2ui5.checkTimerActive = true;` && |\n| &&
` setTimeout( ( ) => { if ( sap.z2ui5.checkTimerActive ) { sap.z2ui5.oView.getController().onEvent( oEvent ); } }, parseInt( sap.z2ui5.oResponse.oTimer.INTERVAL_MS ) , oEvent );` && |\n| &&
` }` && |\n| &&
` sap.ui.core.BusyIndicator.hide();` && |\n| &&
` },` && |\n| &&
` });` && |\n| &&
` }` && |\n| &&
` this.oBody.ID = sap.z2ui5.oResponse.ID;` && |\n| &&
` this.oBody.oEvent = oEvent;` && |\n| &&
` this.oBody.oEvent.vData = vData;` && |\n| &&
|\n| &&
` onEventFrontend: function (vAction) {` && |\n| &&
` if (sap.z2ui5.checkLogActive) {` && |\n| &&
` console.log('Request Object:');` && |\n| &&
` console.log(this.oBody);` && |\n| &&
` }` && |\n| &&
` sap.z2ui5.oResponseOld = sap.z2ui5.oResponse;` && |\n| &&
` sap.z2ui5.oResponse = {};` && |\n| &&
` sap.z2ui5.oBody = this.oBody;` && |\n| &&
` sap.z2ui5.Roundtrip(isHoldView);` && |\n| &&
` },` && |\n| &&
` Roundtrip: function (isHoldView) {` && |\n| &&
` sap.z2ui5.checkTimerActive = false;` && |\n| &&
` if (sap.z2ui5.oView && !isHoldView) {` && |\n| &&
` sap.z2ui5.oView.destroy();` && |\n| &&
` }` && |\n| &&
` var xhr = new XMLHttpRequest();` && |\n| &&
` var url = "/sap/bc/http/sap/y2ui5_http_handler/";` && |\n| &&
` xhr.open("POST", url, true);` && |\n| &&
` // xhr.open("POST", window.location.pathname, true);` && |\n| &&
` xhr.onload = function (that) {` && |\n| &&
|\n| &&
` if (vAction == 'POPUP_CLOSE') {` && |\n| &&
` if (sap.z2ui5.oResponse.oViewPopup.close) {` && |\n| &&
` sap.z2ui5.oResponse.oViewPopup.close();` && |\n| &&
` if (that.target.status !== 200) {` && |\n| &&
` document.write(that.target.response);` && |\n| &&
` return;` && |\n| &&
` }` && |\n| &&
` sap.z2ui5.oResponse = JSON.parse(that.target.response);` && |\n| &&
|\n| &&
` if (sap.z2ui5.checkLogActive) {` && |\n| &&
` console.log('Response Object:');` && |\n| &&
` console.log(sap.z2ui5.oResponse);` && |\n| &&
` if (sap.z2ui5.oResponse.PARAMS.XML_VIEW !== '' ) {` && |\n| &&
` console.log('UI5-XML-View:');` && |\n| &&
` console.log(sap.z2ui5.oResponse.PARAMS.XML_VIEW);` && |\n| &&
` }` && |\n| &&
` sap.z2ui5.oResponse.oViewPopup.destroy();` && |\n| &&
` delete sap.z2ui5.oResponse.oViewPopup;` && |\n| &&
` delete sap.z2ui5.oResponse.oSystem.VIEW_POPUP;` && |\n| &&
` if (sap.z2ui5.oResponse.PARAMS.XML_POPUP !== '' ) {` && |\n| &&
` console.log('UI5-XML-Popup:');` && |\n| &&
` console.log(sap.z2ui5.oResponse.PARAMS.XML_POPUP);` && |\n| &&
` }` && |\n| &&
` }` && |\n| &&
` if (sap.z2ui5.oResponse.S_MSG.CONTROL !== '' ) {` && |\n| &&
` sap.m[sap.z2ui5.oResponse.S_MSG.CONTROL][sap.z2ui5.oResponse.S_MSG.TYPE](sap.z2ui5.oResponse.S_MSG.TEXT);` && |\n| &&
` }` && |\n| &&
|\n| &&
` },` && |\n| &&
|\n| &&
` onEvent: function (oEvent, vData) {` && |\n| &&
|\n| &&
` if (!window.navigator.onLine) {` && |\n| &&
` sap.m.MessageBox.alert('No internet connection! Please reconnect to the server and try again.');` && |\n| &&
` if (!sap.z2ui5.oResponse.PARAMS.XML_MAIN) {` && |\n| &&
` sap.z2ui5.onAfter();` && |\n| &&
` return;` && |\n| &&
` }` && |\n| &&
|\n| &&
` sap.ui.core.BusyIndicator.show();` && |\n| &&
` this.oBody = {};` && |\n| &&
` var oModel = new sap.ui.model.json.JSONModel(sap.z2ui5.oResponse.OVIEWMODEL.oViewModel);` && |\n| &&
` var oView = new sap.ui.core.mvc.XMLView.create({` && |\n| &&
` definition: sap.z2ui5.oResponse.PARAMS.XML_MAIN,` && |\n| &&
` }).then(oView => {` && |\n| &&
` oView.setModel(oModel);` && |\n| &&
` oView.placeAt("content");` && |\n| &&
` sap.z2ui5.oView = oView;` && |\n| &&
` });` && |\n| &&
` }.bind(this);` && |\n| &&
` xhr.send(JSON.stringify(sap.z2ui5.oBody));` && |\n| &&
` },` && |\n| &&
` });` && |\n| &&
|\n| &&
` if (sap.z2ui5.oResponse.oViewPopup) {` && |\n| &&
` this.oBody.oUpdate = sap.z2ui5.oResponse.oViewPopup.getModel().oData.oUpdate;` && |\n| &&
` if (sap.z2ui5.oResponse.oViewPopup.close) {` && |\n| &&
` sap.z2ui5.oResponse.oViewPopup.close();` && |\n| &&
` }` && |\n| &&
` sap.z2ui5.oResponse.oViewPopup.destroy();` && |\n| &&
` } else {` && |\n| &&
` this.oBody.oUpdate = sap.z2ui5.oView.getModel().oData.oUpdate;` && |\n| &&
` }` && |\n| &&
|\n| &&
` if (sap.z2ui5.oResponse.oScroll) {` && |\n| &&
` this.oBody.oScroll = sap.z2ui5.oResponse.oScroll; ` && |\n| &&
` this.oBody.oScroll .forEach(` && |\n| &&
` item => { try { ` && |\n| &&
` item.VALUE = this.getView().byId( item.NAME ).getScrollDelegate().getScrollTop(); ` && |\n| &&
` } catch (e) {` && |\n| &&
` var ele = '#' + this.getView( ).byId(item.NAME).getId() + '-inner';` && |\n| &&
` item.VALUE = $(ele).scrollTop(); ` && |\n| &&
` } ` && |\n| &&
` } );` && |\n| &&
` }` && |\n| &&
` this.oBody.oSystem = sap.z2ui5.oResponse.oSystem;` && |\n| &&
` this.oBody.oEvent = oEvent;` && |\n| &&
` this.oBody.oEvent.vData = vData;` && |\n| &&
|\n| &&
` if (sap.z2ui5.checkLogActive) {` && |\n| &&
` console.log('Request Object:');` && |\n| &&
` console.log(this.oBody);` && |\n| &&
` }` && |\n| &&
|\n| &&
` sap.z2ui5.oResponseOld = sap.z2ui5.oResponse;` && |\n| &&
` sap.z2ui5.oResponse = {};` && |\n| &&
` sap.z2ui5.oBody = this.oBody;` && |\n| &&
` sap.z2ui5.Roundtrip();` && |\n| &&
` sap.z2ui5.oView.destroy();` && |\n| &&
` },` && |\n| &&
|\n| &&
` Roundtrip: function () {` && |\n| &&
|\n| &&
` sap.z2ui5.checkTimerActive = false;` && |\n| &&
` if (sap.z2ui5.oView){ sap.z2ui5.oView.destroy( ); }` && |\n| &&
` var xhr = new XMLHttpRequest();` && |\n| &&
` if ( sap.startApp ) { var app = sap.startApp; }else` && |\n| &&
` { ` && |\n| &&
` app = ' ` && lv_app && `'; ` && |\n| &&
` }` && |\n| &&
` var url = '` && lv_url && `?app=' + app;` && |\n| &&
` xhr.open("POST", url, true);` && |\n| &&
` xhr.onload = function (that) {` && |\n| &&
|\n| &&
` if (that.target.status !== 200) {` && |\n| &&
` document.write(that.target.response);` && |\n| &&
` return;` && |\n| &&
` }` && |\n| &&
` sap.z2ui5.oResponse = JSON.parse(that.target.response);` && |\n| &&
|\n| &&
` if (sap.z2ui5.checkLogActive) {` && |\n| &&
` console.log('Response Object:');` && |\n| &&
` console.log(sap.z2ui5.oResponse);` && |\n| &&
` if (sap.z2ui5.oResponse.vView) {` && |\n| &&
` console.log('UI5-XML-View:');` && |\n| &&
` console.log(sap.z2ui5.oResponse.vView);` && |\n| &&
` }` && |\n| &&
` if (sap.z2ui5.oResponse.vViewPopup) {` && |\n| &&
` console.log('UI5-XML-Popup:');` && |\n| &&
` console.log(sap.z2ui5.oResponse.vViewPopup);` && |\n| &&
` }` && |\n| &&
` }` && |\n| &&
|\n| &&
` if (sap.z2ui5.oResponse.oMessage) {` && |\n| &&
` sap.m[sap.z2ui5.oResponse.oMessage.CONTROL][sap.z2ui5.oResponse.oMessage.TYPE](sap.z2ui5.oResponse.oMessage.TEXT);` && |\n| &&
` }` && |\n| &&
|\n| &&
` if (sap.z2ui5.oResponse.vView) {` && |\n| &&
` var oModel = new sap.ui.model.json.JSONModel(sap.z2ui5.oResponse.oViewModel);` && |\n| &&
` var oView = new sap.ui.core.mvc.XMLView.create({` && |\n| &&
` definition: sap.z2ui5.oResponse.vView,` && |\n| &&
` }).then(oView => {` && |\n| &&
` oView.setModel(oModel);` && |\n| &&
` oView.placeAt("content");` && |\n| &&
` this.oView = oView;` && |\n| &&
` sap.z2ui5.oView = oView;` && |\n| &&
` });` && |\n| &&
` } else if (sap.z2ui5.oResponse.SET_PREV_VIEW == true) {` && |\n| &&
` var oModel = new sap.ui.model.json.JSONModel(sap.z2ui5.oResponseOld.oViewModel);` && |\n| &&
` var oView = new sap.ui.core.mvc.XMLView.create({` && |\n| &&
` definition: sap.z2ui5.oResponseOld.vView` && |\n| &&
` }).then(oView => {` && |\n| &&
` oView.setModel(oModel);` && |\n| &&
` oView.placeAt("content");` && |\n| &&
` this.oView = oView;` && |\n| &&
` sap.z2ui5.oView = oView;` && |\n| &&
` });` && |\n| &&
` }` && |\n| &&
` }.bind(this);` && |\n| &&
` xhr.send(JSON.stringify(sap.z2ui5.oBody));` && |\n| &&
` },` && |\n| &&
` });` && |\n| &&
|\n| &&
` if (!sap.z2ui5) { sap.z2ui5 = {}; };` && |\n| &&
` sap.z2ui5.checkLogActive = ` && z2ui5_lcl_utility=>get_json_boolean( check_logging ) && `;` && |\n| &&
` if (!sap.z2ui5) {` && |\n| &&
` sap.z2ui5 = {};` && |\n| &&
` }` && |\n| &&
` var xml = '<mvc:View controllerName="z2ui5_controller" xmlns:mvc="sap.ui.core.mvc" />';` && |\n| &&
` if (xml == '') { xml = '&lt;mvc:View controllerName="z2ui5_controller" xmlns:mvc="sap.ui.core.mvc" />' };` && |\n| &&
|\n| &&
` if (xml == '') {` && |\n| &&
` xml = '&lt;mvc:View controllerName="z2ui5_controller" xmlns:mvc="sap.ui.core.mvc" />'` && |\n| &&
` }` && |\n| &&
` jQuery.sap.require("sap.ui.core.Fragment");` && |\n| &&
` jQuery.sap.require("sap.m.MessageToast");` && |\n| &&
` jQuery.sap.require("sap.m.MessageBox");` && |\n| &&
` var oView = sap.ui.xmlview({viewContent:xml});` && |\n| &&
` jQuery.sap.require("sap.ui.model.json.JSONModel");` && |\n| &&
` var oView = sap.ui.xmlview({ viewContent: xml });` && |\n| &&
` sap.z2ui5.Roundtrip = oView.getController().Roundtrip;` && |\n| &&
` sap.z2ui5.oController = oView.getController();` && |\n| &&
` sap.z2ui5.pathname = window.location.pathname;` && |\n| &&
` sap.z2ui5.Roundtrip();` && |\n| &&
|\n| &&
` sap.z2ui5.Roundtrip(false);` && |\n| &&
` sap.z2ui5.onAfter = () => {` && |\n| &&
` if (sap.z2ui5.oResponse.PARAMS.TITLE != "") {` && |\n| &&
` document.title = sap.z2ui5.oResponse.PARAMS.TITLE;` && |\n| &&
` }` && |\n| &&
` if (sap.z2ui5.oResponse.PARAMS.PATH != "") {` && |\n| &&
` window.history.replaceState("", "", window.location.origin + sap.z2ui5.oResponse.PARAMS.PATH + window.location.search);` && |\n| &&
` }` && |\n| &&
` var oView = sap.z2ui5.oView;` && |\n| &&
` try {` && |\n| &&
` if (sap.z2ui5.oResponse.PARAMS.S_CURSOR.ID !== '') {` && |\n| &&
` var ofocus = oView.byId(sap.z2ui5.oResponse.PARAMS.S_CURSOR.ID).getFocusInfo();` && |\n| &&
` ofocus.cursorPos = parseInt(sap.z2ui5.oResponse.PARAMS.S_CURSOR.CURSORPOS);` && |\n| &&
` ofocus.selectionStart = parseInt(sap.z2ui5.oResponse.PARAMS.S_CURSOR.SELECTIONSTART);` && |\n| &&
` ofocus.selectionEnd = parseInt(sap.z2ui5.oResponse.PARAMS.S_CURSOR.SELECTIONEND);` && |\n| &&
` }` && |\n| &&
` oView.byId(sap.z2ui5.oResponse.PARAMS.S_CURSOR.ID).applyFocusInfo(ofocus);` && |\n| &&
` } catch (error) { }` && |\n| &&
` ; try { } catch (error) { }` && |\n| &&
` ; if (sap.z2ui5.oResponse.PARAMS.T_SCROLL) {` && |\n| &&
` sap.z2ui5.oResponse.PARAMS.T_SCROLL.forEach(item => {` && |\n| &&
` try {` && |\n| &&
` oView.byId(item.NAME).scrollTo(parseInt(item.VALUE));` && |\n| &&
` } catch (e) {` && |\n| &&
` var ele = '#' + oView.byId(item.NAME).getId() + '-inner';` && |\n| &&
` $(ele).scrollTop(item.VALUE);` && |\n| &&
` }` && |\n| &&
` }` && |\n| &&
` );` && |\n| &&
` }` && |\n| &&
` if (sap.z2ui5.oResponse.PARAMS.XML_POPUP) {` && |\n| &&
` sap.ui.core.Fragment.load({` && |\n| &&
` definition: sap.z2ui5.oResponse.PARAMS.XML_POPUP,` && |\n| &&
` controller: sap.z2ui5.oController,` && |\n| &&
` }).then(function (oFragment) {` && |\n| &&
` oFragment.setModel(new sap.ui.model.json.JSONModel(sap.z2ui5.oResponse.OVIEWMODEL.oViewModel))` && |\n| &&
` sap.z2ui5.oView.addDependent(oFragment);` && |\n| &&
` if (sap.z2ui5.oResponse.PARAMS.POPOVER_OPEN_BY_ID == '' ) {` && |\n| &&
` oFragment.open();` && |\n| &&
` } else {` && |\n| &&
` var oControl = sap.ui.getCore().byId(sap.z2ui5.oResponse.PARAMS.POPOVER_OPEN_BY_ID);` && |\n| &&
` if (oControl === undefined) {` && |\n| &&
` oControl = sap.z2ui5.oView.byId(sap.z2ui5.oResponse.PARAMS.POPOVER_OPEN_BY_ID);` && |\n| &&
` }` && |\n| &&
` oFragment.openBy(oControl);` && |\n| &&
` }` && |\n| &&
` sap.z2ui5.oResponse.oViewPopup = oFragment;` && |\n| &&
` sap.ui.core.BusyIndicator.hide();` && |\n| &&
` }` && |\n| &&
` .bind(this));` && |\n| &&
` }` && |\n| &&
` if (sap.z2ui5.oResponse.PARAMS.S_TIMER.INTERVAL_MS !== '' ) {` && |\n| &&
` var oEvent = { 'EVENT': 'BUTTON_CHECK', 'METHOD': 'UPDATE' };` && |\n| &&
` oEvent.EVENT = sap.z2ui5.oResponse.PARAMS.S_TIMER.EVENT_FINISHED;` && |\n| &&
` sap.z2ui5.checkTimerActive = true;` && |\n| &&
` setTimeout(() => {` && |\n| &&
` if (sap.z2ui5.checkTimerActive) {` && |\n| &&
` sap.z2ui5.oView.getController().onEvent(oEvent);` && |\n| &&
` }` && |\n| &&
` }, parseInt(sap.z2ui5.oResponse.PARAMS.S_TIMER.INTERVAL_MS), oEvent);` && |\n| &&
` }` && |\n| &&
` sap.ui.core.BusyIndicator.hide();` && |\n| &&
` };` &&
` sap.z2ui5.checkLogActive = ` && z2ui5_lcl_utility=>get_json_boolean( check_logging ) && `;` && |\n| &&
` });` && |\n| &&
`</script>` && |\n| &&
`</html>`.

View File

@ -1056,7 +1056,8 @@ CLASS z2ui5_lcl_fw_app IMPLEMENTATION.
DATA(lv_url) = z2ui5_cl_http_handler=>client-t_header[ name = `referer` ]-value.
SPLIT lv_url AT '?' INTO lv_url DATA(lv_dummy).
DATA(lv_link) = lv_url && `?sap-client=` && sy-mandt && `&app=` && ms_home-classname.
SHIFT lv_url RIGHT DELETING TRAILING `/`.
DATA(lv_link) = lv_url && `/` && ms_home-classname.
DATA(lv_xml_main) = `<mvc:View controllerName="z2ui5_controller" displayBlock="true" height="100%" xmlns:core="sap.ui.core" xmlns:l="sap.ui.layout" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:f="sap.ui.layout.form" xmlns:mvc="sap.ui.core.mvc` &&
`" xmlns:editor="sap.ui.codeeditor" xmlns:ui="sap.ui.table" xmlns="sap.m" xmlns:uxap="sap.uxap" xmlns:mchart="sap.suite.ui.microchart" xmlns:z2ui5="z2ui5" xmlns:webc="sap.ui.webc.main" xmlns:text="sap.ui.richtexteditor" > <Shell> <Page ` && |\n| &&
@ -1247,7 +1248,8 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION.
mo_body = z2ui5_lcl_utility_tree_json=>factory( z2ui5_cl_http_handler=>client-body ).
TRY.
DATA(lv_id_prev) = mo_body->get_attribute( `OSYSTEM` )->get_attribute( `ID` )->get_val( ).
* DATA(lv_id_prev) = mo_body->get_attribute( `OSYSTEM` )->get_attribute( `ID` )->get_val( ).
DATA(lv_id_prev) = mo_body->get_attribute( `ID` )->get_val( ).
CATCH cx_root.
result = set_app_start( ).
RETURN.
@ -1260,54 +1262,6 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION.
METHOD request_end.
DATA(lo_ui5_model) = z2ui5_lcl_utility_tree_json=>factory( ).
IF ms_next-s_set-check_set_prev_view = abap_false OR ms_next-s_set-xml_popup IS NOT INITIAL.
lo_ui5_model->add_attribute_instance( request_end_model( ) ).
ENDIF.
IF ms_next-s_set-xml_main IS NOT INITIAL AND ms_next-s_set-check_set_prev_view = abap_false.
lo_ui5_model->add_attribute( n = `vView` v = ms_next-s_set-xml_main ).
ENDIF.
IF ms_next-s_set-xml_popup IS NOT INITIAL.
lo_ui5_model->add_attribute( n = `vViewPopup` v = ms_next-s_set-xml_popup ).
IF ms_next-s_set-popup_open_by_id IS NOT INITIAL.
lo_ui5_model->add_attribute( n = `OPENBY` v = ms_next-s_set-popup_open_by_id ).
ENDIF.
ENDIF.
IF ms_next-s_set-check_set_prev_view = abap_false AND ms_next-s_set-xml_popup IS INITIAL AND ms_next-s_set-xml_main IS INITIAL.
z2ui5_lcl_utility=>raise( `No view or popup found. Check your view rendering!` ).
ENDIF.
lo_ui5_model->add_attribute_object( `oSystem` )->add_attribute( n = `ID` v = ms_db-id ).
IF ms_next-s_msg IS NOT INITIAL.
lo_ui5_model->add_attribute_object( `oMessage` )->add_attribute_struc( ms_next-s_msg ).
ENDIF.
IF ms_next-s_set-t_scroll_pos IS NOT INITIAL.
DATA(lo_list) = lo_ui5_model->add_attribute_list( `oScroll` ).
LOOP AT ms_next-s_set-t_scroll_pos REFERENCE INTO DATA(lr_focus).
lo_list->add_list_object( )->add_attribute_struc( lr_focus->* ).
ENDLOOP.
ENDIF.
IF ms_next-s_set-s_cursor_pos IS NOT INITIAL.
lo_ui5_model->add_attribute_object( `oCursor` )->add_attribute_struc( ms_next-s_set-s_cursor_pos ).
ENDIF.
IF ms_next-s_set-s_timer IS NOT INITIAL.
lo_ui5_model->add_attribute_object( `oTimer` )->add_attribute_struc( ms_next-s_set-s_timer ).
ENDIF.
IF ms_next-s_set-check_set_prev_view = abap_true.
lo_ui5_model->add_attribute( n = `SET_PREV_VIEW` v = `true` apos_active = abap_false ).
ENDIF.
IF ms_next-s_set-path IS NOT INITIAL.
DATA(lv_path) = z2ui5_lcl_utility=>get_header_val( '~path' ).
DATA(lv_path_info) = z2ui5_lcl_utility=>get_header_val( '~path_info' ).
@ -1317,10 +1271,12 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION.
ms_next-s_set-path = lv_path && ms_next-s_set-path.
ENDIF.
lo_ui5_model->add_attribute( n = `path` v = ms_next-s_set-path ).
lo_ui5_model->add_attribute( n = `title` v = ms_next-s_set-title ).
result = lo_ui5_model->get_root( )->stringify( ).
DATA(lo_resp) = z2ui5_lcl_utility_tree_json=>factory( ).
lo_resp->add_attribute( n = `PARAMS` v = z2ui5_lcl_utility=>trans_any_2_json( ms_next-s_set ) apos_active = abap_false ).
lo_resp->add_attribute( n = `S_MSG` v = z2ui5_lcl_utility=>trans_any_2_json( ms_next-s_msg ) apos_active = abap_false ).
lo_resp->add_attribute( n = `ID` v = ms_db-id ).
lo_resp->add_attribute_object( `OVIEWMODEL` )->add_attribute_instance( request_end_model( ) ).
result = lo_resp->get_root( )->stringify( ).
z2ui5_lcl_fw_db=>create( id = ms_db-id db = ms_db ).
ENDMETHOD.
@ -1339,63 +1295,68 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION.
DATA(lo_app) = CAST object( result->ms_db-o_app ) ##NEEDED.
DATA(lo_model) = mo_body->get_attribute( `OUPDATE` ).
TRY.
LOOP AT result->ms_db-t_attri REFERENCE INTO DATA(lr_attri)
WHERE bind_type = cs_bind_type-two_way.
DATA(lo_model) = mo_body->get_attribute( `OUPDATE` ).
FIELD-SYMBOLS <attribute> TYPE any.
DATA(lv_name) = c_prefix && to_upper( lr_attri->name ).
ASSIGN (lv_name) TO <attribute>.
z2ui5_lcl_utility=>raise( when = xsdbool( sy-subrc <> 0 ) ).
LOOP AT result->ms_db-t_attri REFERENCE INTO DATA(lr_attri)
WHERE bind_type = cs_bind_type-two_way.
IF lr_attri->gen_kind IS NOT INITIAL.
FIELD-SYMBOLS <attribute> TYPE any.
DATA(lv_name) = c_prefix && to_upper( lr_attri->name ).
ASSIGN (lv_name) TO <attribute>.
z2ui5_lcl_utility=>raise( when = xsdbool( sy-subrc <> 0 ) ).
CASE lr_attri->gen_kind.
WHEN cl_abap_datadescr=>kind_elem.
CREATE DATA <attribute> TYPE (lr_attri->gen_type).
ASSIGN <attribute>->* TO <attribute>.
WHEN cl_abap_datadescr=>kind_table.
DATA lr_data TYPE REF TO data.
CREATE DATA lr_data TYPE (lr_attri->gen_type).
ASSIGN lr_data->* TO FIELD-SYMBOL(<field>).
CREATE DATA <attribute> LIKE STANDARD TABLE OF <field>.
ASSIGN <attribute>->* TO <attribute>.
ENDCASE.
ENDIF.
IF lr_attri->gen_kind IS NOT INITIAL.
CASE lr_attri->type_kind.
WHEN `h`.
z2ui5_lcl_utility=>trans_ref_tab_2_tab(
EXPORTING ir_tab_from = lo_model->get_attribute( lr_attri->name )->mr_actual
IMPORTING t_result = <attribute> ).
WHEN OTHERS.
DATA(lo_attri) = lo_model->get_attribute( lr_attri->name ).
FIELD-SYMBOLS <val> TYPE any.
ASSIGN lo_attri->mr_actual->* TO <val>.
CASE lr_attri->gen_kind.
WHEN cl_abap_datadescr=>kind_elem.
CREATE DATA <attribute> TYPE (lr_attri->gen_type).
ASSIGN <attribute>->* TO <attribute>.
WHEN cl_abap_datadescr=>kind_table.
DATA lr_data TYPE REF TO data.
CREATE DATA lr_data TYPE (lr_attri->gen_type).
ASSIGN lr_data->* TO FIELD-SYMBOL(<field>).
CREATE DATA <attribute> LIKE STANDARD TABLE OF <field>.
ASSIGN <attribute>->* TO <attribute>.
ENDCASE.
ENDIF.
CASE lr_attri->type_kind.
WHEN 'D' OR 'T'.
/ui2/cl_json=>deserialize(
EXPORTING
json = `"` && <val> && `"`
CHANGING
data = <attribute> ).
" WHEN 'C'.
" CASE lr_attri->type.
" WHEN `ABAP_BOOL` OR `ABAP_BOOLEAN` OR `XSDBOOLEAN`.
" <attribute> = xsdbool( <val> = `true` ).
" WHEN OTHERS.
" <attribute> = <val>.
"° ENDCASE.
WHEN `h`.
z2ui5_lcl_utility=>trans_ref_tab_2_tab(
EXPORTING ir_tab_from = lo_model->get_attribute( lr_attri->name )->mr_actual
IMPORTING t_result = <attribute> ).
WHEN OTHERS.
<attribute> = <val>.
DATA(lo_attri) = lo_model->get_attribute( lr_attri->name ).
FIELD-SYMBOLS <val> TYPE any.
ASSIGN lo_attri->mr_actual->* TO <val>.
CASE lr_attri->type_kind.
WHEN 'D' OR 'T'.
/ui2/cl_json=>deserialize(
EXPORTING
json = `"` && <val> && `"`
CHANGING
data = <attribute> ).
" WHEN 'C'.
" CASE lr_attri->type.
" WHEN `ABAP_BOOL` OR `ABAP_BOOLEAN` OR `XSDBOOLEAN`.
" <attribute> = xsdbool( <val> = `true` ).
" WHEN OTHERS.
" <attribute> = <val>.
"° ENDCASE.
WHEN OTHERS.
<attribute> = <val>.
ENDCASE.
ENDCASE.
ENDCASE.
ENDLOOP.
ENDLOOP.
CATCH cx_root.
ENDTRY.
TRY.
result->ms_actual-event = mo_body->get_attribute( `OEVENT` )->get_attribute( `EVENT` )->get_val( ).
@ -1419,17 +1380,22 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION.
result = NEW #( ).
result->ms_db-id = z2ui5_lcl_utility=>get_uuid( ).
TRY.
DATA(lv_classname) = z2ui5_lcl_utility=>get_trim_upper( z2ui5_cl_http_handler=>client-t_param[ name = `app` ]-value ).
z2ui5_lcl_utility=>raise( when = xsdbool( lv_classname = `` ) ).
CATCH cx_root.
result = result->set_app_system( ).
RETURN.
ENDTRY.
DATA(lv_classname) = ``.
DATA(lv_path) = z2ui5_lcl_utility=>get_header_val( '~path' ).
DATA(lv_origin) = z2ui5_lcl_utility=>get_header_val( 'origin' ).
DATA(lv_referer) = z2ui5_lcl_utility=>get_header_val( 'referer' ).
REPLACE lv_origin IN lv_referer WITH ``.
REPLACE lv_path IN lv_referer WITH ``.
SPLIT lv_referer AT `/` INTO lv_classname DATA(lv_dummy).
IF lv_classname IS NOT INITIAL AND lv_classname(1) <> `?`.
lv_classname = to_upper( lv_classname ).
ELSE.
result = result->set_app_system( ).
RETURN.
ENDIF.
TRY.
CREATE OBJECT result->ms_db-o_app TYPE (lv_classname).
CATCH cx_root.
result = result->set_app_system( error_text = `class with name ` && lv_classname && ` not found` ).
RETURN.
@ -1745,12 +1711,20 @@ CLASS z2ui5_lcl_fw_client IMPLEMENTATION.
METHOD z2ui5_if_client~_event.
" IF data IS INITIAL.
" result = `onEvent( { 'EVENT' : '` && val && `', 'METHOD' : 'UPDATE' } )`.
" ELSE.
IF data IS INITIAL.
result = `onEvent( { 'EVENT' : '` && val && `', 'METHOD' : 'UPDATE' } )`.
DATA(lv_data) = `''`.
ELSE.
result = `onEvent( { 'EVENT' : '` && val && `', 'METHOD' : 'UPDATE' } ,` && data && `)`.
lv_data = data.
ENDIF.
result = `onEvent( { 'EVENT' : '` && val && `', 'METHOD' : 'UPDATE' } , ` && lv_data && ` , `
&& z2ui5_lcl_utility=>get_json_boolean( hold_view ) && ` )`.
" ENDIF.
ENDMETHOD.
METHOD z2ui5_if_client~_event_close_popup.

View File

@ -371,8 +371,8 @@ CLASS ltcl_unit_02_app_start IMPLEMENTATION.
client->set_next( VALUE #(
xml_main = `test`
s_cursor_pos = VALUE #( id = 'id_text2' cursorpos = '5' selectionstart = '5' selectionend = '10' )
t_scroll_pos = VALUE #(
s_cursor = VALUE #( id = 'id_text2' cursorpos = '5' selectionstart = '5' selectionend = '10' )
t_scroll = VALUE #(
( name = 'id_page' value = '99999' )
( name = 'id_text3' value = '99999' )
)

View File

@ -1,6 +1,4 @@
INTERFACE z2ui5_if_app
PUBLIC .
INTERFACE z2ui5_if_app public.
INTERFACES if_serializable_object.
DATA id TYPE string.

View File

@ -23,23 +23,22 @@ INTERFACE z2ui5_if_client
TYPES:
BEGIN OF ty_S_next,
xml_main TYPE string,
xml_popup TYPE string,
popup_open_by_id TYPE string,
check_set_prev_view TYPE abap_bool,
t_scroll_pos TYPE ty_t_name_value,
title TYPE string,
path TYPE string,
begin OF s_cursor_pos,
id TYPE string,
cursorpos TYPE string,
selectionstart TYPE string,
selectionend TYPE string,
END OF s_cursor_pos,
BEGIN OF s_timer,
interval_ms TYPE string,
event_finished TYPE string,
END OF s_timer,
xml_main TYPE string,
xml_popup TYPE string,
popover_open_by_id TYPE string,
t_scroll TYPE ty_t_name_value,
title TYPE string,
path TYPE string,
BEGIN OF s_cursor,
id TYPE string,
cursorpos TYPE string,
selectionstart TYPE string,
selectionend TYPE string,
END OF s_cursor,
BEGIN OF s_timer,
interval_ms TYPE string,
event_finished TYPE string,
END OF s_timer,
END OF ty_s_next.
METHODS set_next
@ -94,6 +93,7 @@ INTERFACE z2ui5_if_client
IMPORTING
val TYPE clike
data TYPE clike OPTIONAL
hold_view TYPE abap_bool DEFAULT abap_false
RETURNING
VALUE(result) TYPE string.