From e2b2f1712d3c74d13eb177a979e006277338dcb6 Mon Sep 17 00:00:00 2001 From: Alexander Tsybulsky Date: Thu, 1 Jun 2023 18:39:41 +0300 Subject: [PATCH] Refactoring in settings-remote (WIP) (#6300) Co-authored-by: Marc Bernard <59966492+mbtools@users.noreply.github.com> --- src/ui/core/zcl_abapgit_gui.clas.abap | 4 +- src/ui/core/zcl_abapgit_html.clas.abap | 25 ++- .../zcl_abapgit_html.clas.testclasses.abap | 39 ++++ src/ui/core/zif_abapgit_html.intf.abap | 7 + .../lib/zcl_abapgit_html_form_utils.clas.abap | 41 ++-- .../zcl_abapgit_gui_page_sett_remo.clas.abap | 204 +++++++----------- src/utils/zcl_abapgit_string_map.clas.abap | 21 ++ 7 files changed, 200 insertions(+), 141 deletions(-) diff --git a/src/ui/core/zcl_abapgit_gui.clas.abap b/src/ui/core/zcl_abapgit_gui.clas.abap index 07ca4965d..0a5c845b7 100644 --- a/src/ui/core/zcl_abapgit_gui.clas.abap +++ b/src/ui/core/zcl_abapgit_gui.clas.abap @@ -118,7 +118,7 @@ ENDCLASS. -CLASS zcl_abapgit_gui IMPLEMENTATION. +CLASS ZCL_ABAPGIT_GUI IMPLEMENTATION. METHOD back. @@ -180,6 +180,8 @@ CLASS zcl_abapgit_gui IMPLEMENTATION. IF ls_handled-state = c_event_state-re_render. " soft exit, probably popup render( ). rv_handled = abap_true. + ELSEIF ls_handled-state = c_event_state-no_more_act. " soft exit, probably GUI popup + rv_handled = abap_true. ENDIF. ENDIF. diff --git a/src/ui/core/zcl_abapgit_html.clas.abap b/src/ui/core/zcl_abapgit_html.clas.abap index c80547286..4966010c9 100644 --- a/src/ui/core/zcl_abapgit_html.clas.abap +++ b/src/ui/core/zcl_abapgit_html.clas.abap @@ -14,6 +14,7 @@ CLASS zcl_abapgit_html DEFINITION !iv_initial_chunk TYPE any OPTIONAL RETURNING VALUE(ri_instance) TYPE REF TO zif_abapgit_html. + CLASS-METHODS icon IMPORTING !iv_name TYPE string @@ -58,6 +59,7 @@ CLASS zcl_abapgit_html DEFINITION CLASS-DATA go_single_tags_re TYPE REF TO cl_abap_regex . DATA mt_buffer TYPE string_table . CLASS-DATA gv_spaces TYPE string . + CLASS-DATA gv_debug_mode TYPE abap_bool . METHODS indent_line CHANGING @@ -73,7 +75,7 @@ ENDCLASS. -CLASS zcl_abapgit_html IMPLEMENTATION. +CLASS ZCL_ABAPGIT_HTML IMPLEMENTATION. METHOD checkbox. @@ -95,6 +97,9 @@ CLASS zcl_abapgit_html IMPLEMENTATION. METHOD class_constructor. + + DATA lv_mode TYPE tabname. + CREATE OBJECT go_single_tags_re EXPORTING pattern = '<(AREA|BASE|BR|COL|COMMAND|EMBED|HR|IMG|INPUT|LINK|META|PARAM|SOURCE|!)' @@ -104,6 +109,9 @@ CLASS zcl_abapgit_html IMPLEMENTATION. val = ` ` occ = 200 ). + GET PARAMETER ID 'DBT' FIELD lv_mode. + gv_debug_mode = boolc( lv_mode = 'HREF' ). + ENDMETHOD. @@ -294,7 +302,6 @@ CLASS zcl_abapgit_html IMPLEMENTATION. lv_act TYPE string, lv_style TYPE string, lv_title TYPE string. - DATA lv_mode TYPE tabname. lv_class = iv_class. @@ -348,8 +355,7 @@ CLASS zcl_abapgit_html IMPLEMENTATION. ENDIF. " Debug option to display href-link on hover - GET PARAMETER ID 'DBT' FIELD lv_mode. - IF lv_mode = 'HREF'. + IF gv_debug_mode = abap_true. lv_title = | title="{ escape( val = lv_href format = cl_abap_format=>e_html_attr ) }"|. @@ -364,6 +370,8 @@ CLASS zcl_abapgit_html IMPLEMENTATION. METHOD zif_abapgit_html~add. DATA: lv_type TYPE c, + li_renderable TYPE REF TO zif_abapgit_gui_renderable, + lx_error TYPE REF TO zcx_abapgit_exception, lo_html TYPE REF TO zcl_abapgit_html. FIELD-SYMBOLS: TYPE string_table. @@ -381,7 +389,14 @@ CLASS zcl_abapgit_html IMPLEMENTATION. TRY. lo_html ?= ig_chunk. CATCH cx_sy_move_cast_error. - ASSERT 1 = 0. " Dev mistake + TRY. + li_renderable ?= ig_chunk. + lo_html ?= li_renderable->render( ). + CATCH cx_sy_move_cast_error. + ASSERT 1 = 0. " Dev mistake + CATCH zcx_abapgit_exception INTO lx_error. + lo_html ?= create( |Render error: { lx_error->get_text( ) }| ). + ENDTRY. ENDTRY. APPEND LINES OF lo_html->mt_buffer TO mt_buffer. WHEN OTHERS. diff --git a/src/ui/core/zcl_abapgit_html.clas.testclasses.abap b/src/ui/core/zcl_abapgit_html.clas.testclasses.abap index 18b0c5af2..cda950ec8 100644 --- a/src/ui/core/zcl_abapgit_html.clas.testclasses.abap +++ b/src/ui/core/zcl_abapgit_html.clas.testclasses.abap @@ -1,3 +1,23 @@ +CLASS lcl_good_renderable DEFINITION FINAL. + PUBLIC SECTION. + INTERFACES zif_abapgit_gui_renderable. +ENDCLASS. +CLASS lcl_good_renderable IMPLEMENTATION. + METHOD zif_abapgit_gui_renderable~render. + ri_html = zcl_abapgit_html=>create( 'Hello' ). + ENDMETHOD. +ENDCLASS. + +CLASS lcl_bad_renderable DEFINITION FINAL. + PUBLIC SECTION. + INTERFACES zif_abapgit_gui_renderable. +ENDCLASS. +CLASS lcl_bad_renderable IMPLEMENTATION. + METHOD zif_abapgit_gui_renderable~render. + zcx_abapgit_exception=>raise( 'Fail!' ). + ENDMETHOD. +ENDCLASS. + CLASS ltcl_html DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. @@ -5,6 +25,7 @@ CLASS ltcl_html DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. METHODS: wrap FOR TESTING RAISING zcx_abapgit_exception, + add_renderable FOR TESTING RAISING zcx_abapgit_exception, td FOR TESTING RAISING zcx_abapgit_exception, th FOR TESTING RAISING zcx_abapgit_exception, wrap_ii FOR TESTING RAISING zcx_abapgit_exception, @@ -200,4 +221,22 @@ CLASS ltcl_html IMPLEMENTATION. ENDMETHOD. + METHOD add_renderable. + + DATA lo_good TYPE REF TO lcl_good_renderable. + DATA lo_bad TYPE REF TO lcl_bad_renderable. + + CREATE OBJECT lo_good. + CREATE OBJECT lo_bad. + + cl_abap_unit_assert=>assert_equals( + act = zcl_abapgit_html=>create( lo_good )->render( ) + exp = 'Hello' ). + + cl_abap_unit_assert=>assert_char_cp( + act = zcl_abapgit_html=>create( lo_bad )->render( ) + exp = 'get_popups( )->popup_to_confirm( iv_titlebar = 'abapGit - Unsaved Changes' iv_text_question = 'There are unsaved changes. Do you want to exit the form?' @@ -97,7 +110,7 @@ CLASS zcl_abapgit_html_form_utils IMPLEMENTATION. METHOD is_dirty. - rv_dirty = boolc( io_form_data->mt_entries <> mo_form_data->mt_entries ). + rv_dirty = boolc( io_form_data->mt_entries <> io_compare_with->mt_entries ). ENDMETHOD. diff --git a/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.abap index 557761a11..06af4783c 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_sett_remo.clas.abap @@ -74,22 +74,15 @@ CLASS zcl_abapgit_gui_page_sett_remo DEFINITION END OF c_popup. DATA mo_repo TYPE REF TO zcl_abapgit_repo . - DATA ms_settings_old TYPE ty_remote_settings. + DATA ms_settings_snapshot TYPE ty_remote_settings. DATA mo_form TYPE REF TO zcl_abapgit_html_form . DATA mo_form_data TYPE REF TO zcl_abapgit_string_map . - DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils . DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map . DATA mv_refresh_on_back TYPE abap_bool. DATA mv_offline_switch_saved_url TYPE string. DATA mo_popup_picklist TYPE REF TO zcl_abapgit_gui_picklist. - METHODS init - IMPORTING - !io_repo TYPE REF TO zcl_abapgit_repo - RAISING - zcx_abapgit_exception. - METHODS get_remote_settings_from_repo IMPORTING io_repo TYPE REF TO zcl_abapgit_repo @@ -108,18 +101,15 @@ CLASS zcl_abapgit_gui_page_sett_remo DEFINITION METHODS get_form_schema IMPORTING - is_settings TYPE ty_remote_settings - io_form_data TYPE REF TO zcl_abapgit_string_map OPTIONAL + io_existing_form_data TYPE REF TO zcl_abapgit_string_map OPTIONAL RETURNING VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form RAISING zcx_abapgit_exception. METHODS initialize_form_data - IMPORTING - is_settings TYPE ty_remote_settings - io_form_data TYPE REF TO zcl_abapgit_string_map - io_form_util TYPE REF TO zcl_abapgit_html_form_utils + RETURNING + VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map RAISING zcx_abapgit_exception. @@ -190,11 +180,17 @@ CLASS zcl_abapgit_gui_page_sett_remo DEFINITION RAISING zcx_abapgit_exception. + METHODS render_content + RETURNING + VALUE(ri_html) TYPE REF TO zif_abapgit_html + RAISING + zcx_abapgit_exception. + ENDCLASS. -CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. +CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_REMO IMPLEMENTATION. METHOD check_protection. @@ -358,15 +354,11 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. METHOD constructor. super->constructor( ). - init( io_repo ). + mo_repo = io_repo. + ms_settings_snapshot = get_remote_settings_from_repo( mo_repo ). + mo_form = get_form_schema( ). + mo_form_data = initialize_form_data( ). CREATE OBJECT mo_validation_log. - CREATE OBJECT mo_form_data. - - mo_form = get_form_schema( ms_settings_old ). - mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ). - initialize_form_data( io_form_data = mo_form_data - is_settings = ms_settings_old - io_form_util = mo_form_util ). ENDMETHOD. @@ -400,14 +392,14 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. lv_offline TYPE abap_bool, lv_head_type TYPE ty_head_type. - IF io_form_data IS BOUND AND io_form_data->is_empty( ) = abap_false. - lv_offline = io_form_data->get( c_id-offline ). + IF io_existing_form_data IS BOUND AND io_existing_form_data->is_empty( ) = abap_false. + lv_offline = io_existing_form_data->get( c_id-offline ). IF lv_offline = abap_false. - lv_head_type = io_form_data->get( c_id-head_type ). + lv_head_type = io_existing_form_data->get( c_id-head_type ). ENDIF. ELSE. - lv_offline = is_settings-offline. - lv_head_type = is_settings-head_type. + lv_offline = ms_settings_snapshot-offline. + lv_head_type = ms_settings_snapshot-head_type. ENDIF. ro_form = zcl_abapgit_html_form=>create( @@ -471,8 +463,6 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. iv_label = 'Branch' iv_required = abap_true iv_side_action = c_event-choose_branch ). - ELSE. - ro_form->hidden( c_id-branch ). ENDIF. IF lv_head_type = c_head_types-tag. @@ -481,8 +471,6 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. iv_label = 'Tag' iv_required = abap_true iv_side_action = c_event-choose_tag ). - ELSE. - ro_form->hidden( c_id-tag ). ENDIF. IF lv_head_type = c_head_types-commit. @@ -493,8 +481,6 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. iv_min = 40 iv_max = 40 iv_side_action = c_event-choose_commit ). - ELSE. - ro_form->hidden( c_id-commit ). ENDIF. IF lv_head_type = c_head_types-pull_request. @@ -503,16 +489,8 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. iv_label = 'Pull Request' iv_required = abap_true iv_side_action = c_event-choose_pull_request ). - ELSE. - ro_form->hidden( c_id-pull_request ). ENDIF. - ELSE. - ro_form->hidden( c_id-head_type ). - ro_form->hidden( c_id-branch ). - ro_form->hidden( c_id-tag ). - ro_form->hidden( c_id-commit ). - ro_form->hidden( c_id-pull_request ). ENDIF. ro_form->command( @@ -530,6 +508,7 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. METHOD get_remote_settings_from_form. + rs_settings-url = io_form_data->get( c_id-url ). rs_settings-offline = io_form_data->get( c_id-offline ). @@ -548,10 +527,12 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. rs_settings-pull_request = io_form_data->get( c_id-pull_request ). ENDCASE. ENDIF. + ENDMETHOD. METHOD get_remote_settings_from_repo. + DATA: lo_repo_online TYPE REF TO zcl_abapgit_repo_online, lo_repo_offline TYPE REF TO zcl_abapgit_repo_offline, lv_branch TYPE ty_remote_settings-branch. @@ -601,6 +582,7 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. rs_settings-url = lo_repo_offline->get_name( ). rs_settings-offline = abap_true. ENDIF. + ENDMETHOD. @@ -627,69 +609,73 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. ENDMETHOD. - METHOD init. - mo_repo = io_repo. - ms_settings_old = get_remote_settings_from_repo( mo_repo ). - FREE mo_form_data. - ENDMETHOD. - - METHOD initialize_form_data. DATA: lv_type TYPE string, - lv_url TYPE ty_remote_settings-url, lv_head TYPE string. - lv_type = 'Online repository'. - lv_url = is_settings-url. + CREATE OBJECT ro_form_data. - IF is_settings-offline = abap_true. + IF ms_settings_snapshot-offline = abap_true. lv_type = 'Offline repository'. + ELSE. + lv_type = 'Online repository'. ENDIF. - io_form_data->set( + ro_form_data->set( iv_key = c_id-offline - iv_val = is_settings-offline ). - - io_form_data->set( + iv_val = ms_settings_snapshot-offline ). + ro_form_data->set( iv_key = c_id-repo_type iv_val = lv_type ). - io_form_data->set( + ro_form_data->set( iv_key = c_id-url - iv_val = lv_url ). + iv_val = ms_settings_snapshot-url ). - IF is_settings-offline = abap_false. - io_form_data->set( + IF ms_settings_snapshot-offline = abap_false. + ro_form_data->set( iv_key = c_id-head_type - iv_val = is_settings-head_type ). + iv_val = ms_settings_snapshot-head_type ). " When pull request is selected the previously selected branch/tag is also loaded to be able to switch back to it - lv_head = is_settings-branch. - REPLACE FIRST OCCURRENCE OF zif_abapgit_definitions=>c_git_branch-heads_prefix IN lv_head WITH space. - CONDENSE lv_head. - io_form_data->set( + lv_head = zcl_abapgit_git_branch_list=>get_display_name( ms_settings_snapshot-branch ). + ro_form_data->set( iv_key = c_id-branch iv_val = lv_head ). - lv_head = is_settings-tag. - REPLACE FIRST OCCURRENCE OF zif_abapgit_definitions=>c_git_branch-heads_prefix IN lv_head WITH space. - CONDENSE lv_head. - io_form_data->set( + lv_head = zcl_abapgit_git_branch_list=>get_display_name( ms_settings_snapshot-tag ). + ro_form_data->set( iv_key = c_id-tag iv_val = lv_head ). - io_form_data->set( + ro_form_data->set( iv_key = c_id-commit - iv_val = is_settings-commit ). + iv_val = ms_settings_snapshot-commit ). - io_form_data->set( + ro_form_data->set( iv_key = c_id-pull_request - iv_val = is_settings-pull_request ). + iv_val = ms_settings_snapshot-pull_request ). ENDIF. " Set for is_dirty check - io_form_util->set_data( io_form_data ). + zcl_abapgit_html_form_utils=>create( mo_form )->set_data( ro_form_data ). + + ENDMETHOD. + + + METHOD render_content. + + CREATE OBJECT ri_html TYPE zcl_abapgit_html. + + ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top( + io_repo = mo_repo + iv_show_commit = abap_false + iv_interactive_branch = abap_false ) ). + + ri_html->add( mo_form->render( + io_values = mo_form_data + io_validation_log = mo_validation_log ) ). ENDMETHOD. @@ -704,7 +690,7 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. ls_settings_new = get_remote_settings_from_form( mo_form_data ). " Switch online / offline - IF ls_settings_new-offline <> ms_settings_old-offline. + IF ls_settings_new-offline <> ms_settings_snapshot-offline. " Remember key, switch, retrieve new instance (todo, refactor #2244) mo_repo->switch_repo_type( ls_settings_new-offline ). mo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( mo_repo->get_key( ) ). @@ -748,13 +734,13 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. MESSAGE 'Settings succesfully saved' TYPE 'S'. mv_refresh_on_back = abap_true. - init( mo_repo ). - FREE mo_form_data. + ms_settings_snapshot = get_remote_settings_from_repo( mo_repo ). ENDMETHOD. METHOD switch_online_offline. + DATA: lv_offline_new TYPE abap_bool, lv_url TYPE ty_remote_settings-url, lv_branch TYPE ty_remote_settings-branch. @@ -798,6 +784,7 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. ENDTRY. ENDIF. ENDIF. + ENDMETHOD. @@ -806,9 +793,7 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. DATA lo_repo TYPE REF TO zcl_abapgit_repo_online. check_protection( ). - lo_repo ?= mo_repo. - lo_repo->select_branch( iv_name ). ENDMETHOD. @@ -869,7 +854,7 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. lv_pull_request TYPE ty_remote_settings-pull_request, lv_commit TYPE ty_remote_settings-commit. - ro_validation_log = mo_form_util->validate( io_form_data ). + ro_validation_log = zcl_abapgit_html_form_utils=>create( mo_form )->validate( io_form_data ). lv_offline = io_form_data->get( c_id-offline ). lv_url = io_form_data->get( c_id-url ). @@ -951,16 +936,12 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. METHOD zif_abapgit_gui_event_handler~on_event. DATA: - lo_form_data_raw TYPE REF TO zcl_abapgit_string_map, - lv_url TYPE ty_remote_settings-url, - lv_branch TYPE ty_remote_settings-branch, - lv_tag TYPE ty_remote_settings-tag, - lv_commit TYPE ty_remote_settings-commit. + lv_url TYPE ty_remote_settings-url, + lv_branch TYPE ty_remote_settings-branch, + lv_tag TYPE ty_remote_settings-tag, + lv_commit TYPE ty_remote_settings-commit. - lo_form_data_raw = ii_event->form_data( ). - IF lo_form_data_raw->is_empty( ) = abap_false. " If form-related action - mo_form_data = mo_form_util->normalize( lo_form_data_raw ). - ENDIF. + mo_form_data->merge( zcl_abapgit_html_form_utils=>create( mo_form )->normalize( ii_event->form_data( ) ) ). CASE ii_event->mv_action. WHEN zif_abapgit_definitions=>c_action-go_back. @@ -969,7 +950,9 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. mo_repo->refresh( ). ENDIF. - rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark. + rs_handled-state = zcl_abapgit_html_form_utils=>create( mo_form )->exit( + io_form_data = mo_form_data + io_check_changes_versus = initialize_form_data( ) ). WHEN c_event-choose_url. lv_url = choose_url( ). @@ -1037,22 +1020,10 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. ENDIF. ENDIF. - " If staying on form, initialize it with current settings IF rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render AND mo_popup_picklist IS NOT BOUND. - " TODO refactor: same as in constructor - mo_form = get_form_schema( - is_settings = ms_settings_old - io_form_data = mo_form_data ). - mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ). - - IF mo_form_data IS NOT BOUND. - CREATE OBJECT mo_form_data. - initialize_form_data( - io_form_data = mo_form_data - is_settings = ms_settings_old - io_form_util = mo_form_util ). - ENDIF. + " Switching tabs must change the form layout + mo_form = get_form_schema( io_existing_form_data = mo_form_data ). ENDIF. ENDMETHOD. @@ -1070,9 +1041,9 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. lv_head_type = mo_form_data->get( c_id-head_type ). ENDIF. ELSE. - lv_offline = ms_settings_old-offline. + lv_offline = ms_settings_snapshot-offline. IF lv_offline = abap_false. - lv_head_type = ms_settings_old-head_type. + lv_head_type = ms_settings_snapshot-head_type. ENDIF. ENDIF. @@ -1133,25 +1104,16 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. CREATE OBJECT ri_html TYPE zcl_abapgit_html. - ri_html->add( `
` ). " TODO own setting frame CSS class - - ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top( - io_repo = mo_repo - iv_show_commit = abap_false - iv_interactive_branch = abap_false ) ). - - ri_html->add( mo_form->render( - io_values = mo_form_data - io_validation_log = mo_validation_log ) ). - - ri_html->add( `
` ). + ri_html->wrap( + iv_tag = 'div' + iv_class = 'repo' " It's OK because it's repo settings ... for now + ii_content = render_content( ) ). IF mo_popup_picklist IS NOT BOUND OR mo_popup_picklist->is_in_page( ) = abap_false. register_handlers( ). ELSEIF mo_popup_picklist->is_in_page( ) = abap_true. " Block usual page events if the popup is an in-page popup - ri_html->add( zcl_abapgit_gui_in_page_modal=>create( mo_popup_picklist - )->zif_abapgit_gui_renderable~render( ) ). + ri_html->add( zcl_abapgit_gui_in_page_modal=>create( mo_popup_picklist ) ). ENDIF. ENDMETHOD. diff --git a/src/utils/zcl_abapgit_string_map.clas.abap b/src/utils/zcl_abapgit_string_map.clas.abap index 704bd4776..8d85764af 100644 --- a/src/utils/zcl_abapgit_string_map.clas.abap +++ b/src/utils/zcl_abapgit_string_map.clas.abap @@ -66,6 +66,14 @@ CLASS zcl_abapgit_string_map DEFINITION RETURNING VALUE(ro_instance) TYPE REF TO zcl_abapgit_string_map . METHODS freeze . + METHODS merge + IMPORTING + !io_string_map TYPE REF TO zcl_abapgit_string_map + RETURNING + VALUE(ro_instance) TYPE REF TO zcl_abapgit_string_map + RAISING + zcx_abapgit_exception . + PROTECTED SECTION. PRIVATE SECTION. DATA mv_read_only TYPE abap_bool. @@ -148,6 +156,19 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION. ENDMETHOD. + METHOD merge. + + FIELD-SYMBOLS LIKE LINE OF mt_entries. + + LOOP AT io_string_map->mt_entries ASSIGNING . + set( + iv_key = -k + iv_val = -v ). + ENDLOOP. + + ENDMETHOD. + + METHOD set. DATA lv_key LIKE iv_key.