From abbfdfd68f1c1929c70cafc7968d40854c550176 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Wed, 26 Jul 2023 08:10:59 +0200 Subject: [PATCH] check variant popup refactoring (#6350) Co-authored-by: Marc Bernard <59966492+mbtools@users.noreply.github.com> --- .../zcl_abapgit_code_inspector.clas.abap | 63 ++++++++----- .../zif_abapgit_code_inspector.intf.abap | 17 ++++ .../zcl_abapgit_gui_page_sett_locl.clas.abap | 92 +++++++++++++++---- src/ui/popups/package.devc.xml | 10 ++ .../zcl_abapgit_popup_code_insp.clas.abap | 63 +++++++++++++ .../zcl_abapgit_popup_code_insp.clas.xml | 16 ++++ 6 files changed, 220 insertions(+), 41 deletions(-) create mode 100644 src/ui/popups/package.devc.xml create mode 100644 src/ui/popups/zcl_abapgit_popup_code_insp.clas.abap create mode 100644 src/ui/popups/zcl_abapgit_popup_code_insp.clas.xml diff --git a/src/inspect/zcl_abapgit_code_inspector.clas.abap b/src/inspect/zcl_abapgit_code_inspector.clas.abap index 27d95d81e..0268284a8 100644 --- a/src/inspect/zcl_abapgit_code_inspector.clas.abap +++ b/src/inspect/zcl_abapgit_code_inspector.clas.abap @@ -12,11 +12,7 @@ CLASS zcl_abapgit_code_inspector DEFINITION !iv_package TYPE devclass RAISING zcx_abapgit_exception . - CLASS-METHODS validate_check_variant - IMPORTING - !iv_check_variant_name TYPE sci_chkv - RAISING - zcx_abapgit_exception . + PROTECTED SECTION. DATA mv_package TYPE devclass . @@ -85,7 +81,7 @@ ENDCLASS. -CLASS zcl_abapgit_code_inspector IMPLEMENTATION. +CLASS ZCL_ABAPGIT_CODE_INSPECTOR IMPLEMENTATION. METHOD cleanup. @@ -316,24 +312,6 @@ CLASS zcl_abapgit_code_inspector IMPLEMENTATION. ENDMETHOD. - METHOD validate_check_variant. - - cl_ci_checkvariant=>get_ref( - EXPORTING - p_user = '' - p_name = iv_check_variant_name - EXCEPTIONS - chkv_not_exists = 1 - missing_parameter = 2 - OTHERS = 3 ). - - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( |No valid check variant { iv_check_variant_name }| ). - ENDIF. - - ENDMETHOD. - - METHOD zif_abapgit_code_inspector~get_summary. rv_summary = mv_summary. ENDMETHOD. @@ -346,6 +324,25 @@ CLASS zcl_abapgit_code_inspector IMPLEMENTATION. ENDMETHOD. + METHOD zif_abapgit_code_inspector~list_global_variants. + + DATA lt_result TYPE if_satc_ci_variant_access=>ty_variant_infos. + FIELD-SYMBOLS LIKE LINE OF lt_result. + FIELD-SYMBOLS LIKE LINE OF rt_list. + + lt_result = cl_satc_db_access=>get_ci_variants_with_filter( sy-langu ). + SORT lt_result BY name. + +* convert types + LOOP AT lt_result ASSIGNING . + APPEND INITIAL LINE TO rt_list ASSIGNING . + -name = -name. + -description = -description. + ENDLOOP. + + ENDMETHOD. + + METHOD zif_abapgit_code_inspector~run. DATA: lo_set TYPE REF TO cl_ci_objectset, @@ -399,4 +396,22 @@ CLASS zcl_abapgit_code_inspector IMPLEMENTATION. mv_summary = lo_timer->end( ). ENDMETHOD. + + + METHOD zif_abapgit_code_inspector~validate_check_variant. + + cl_ci_checkvariant=>get_ref( + EXPORTING + p_user = '' + p_name = iv_check_variant_name + EXCEPTIONS + chkv_not_exists = 1 + missing_parameter = 2 + OTHERS = 3 ). + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |No valid check variant { iv_check_variant_name }| ). + ENDIF. + + ENDMETHOD. ENDCLASS. diff --git a/src/inspect/zif_abapgit_code_inspector.intf.abap b/src/inspect/zif_abapgit_code_inspector.intf.abap index 480b21292..6495460c1 100644 --- a/src/inspect/zif_abapgit_code_inspector.intf.abap +++ b/src/inspect/zif_abapgit_code_inspector.intf.abap @@ -17,6 +17,13 @@ INTERFACE zif_abapgit_code_inspector TYPES ty_results TYPE STANDARD TABLE OF ty_result WITH DEFAULT KEY. + TYPES: BEGIN OF ty_variant, + name TYPE sci_chkv, + description TYPE string, + END OF ty_variant. + + TYPES ty_variants TYPE STANDARD TABLE OF ty_variant WITH DEFAULT KEY. + METHODS run IMPORTING !iv_variant TYPE sci_chkv @@ -33,4 +40,14 @@ INTERFACE zif_abapgit_code_inspector METHODS get_summary RETURNING VALUE(rv_summary) TYPE string. + + METHODS validate_check_variant + IMPORTING + !iv_check_variant_name TYPE sci_chkv + RAISING + zcx_abapgit_exception. + + METHODS list_global_variants + RETURNING + VALUE(rt_list) TYPE ty_variants. ENDINTERFACE. diff --git a/src/ui/pages/zcl_abapgit_gui_page_sett_locl.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_sett_locl.clas.abap index 83314f52f..1b81fad09 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_sett_locl.clas.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_sett_locl.clas.abap @@ -25,6 +25,8 @@ CLASS zcl_abapgit_gui_page_sett_locl DEFINITION PROTECTED SECTION. PRIVATE SECTION. + DATA mo_popup_picklist TYPE REF TO zcl_abapgit_gui_picklist. + CONSTANTS: BEGIN OF c_id, local TYPE string VALUE 'local', @@ -48,11 +50,9 @@ CLASS zcl_abapgit_gui_page_sett_locl DEFINITION choose_labels TYPE string VALUE 'choose-labels', choose_check_variant TYPE string VALUE 'choose_check_variant', END OF c_event . - DATA mo_form TYPE REF TO zcl_abapgit_html_form . DATA mo_form_data TYPE REF TO zcl_abapgit_string_map . DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map . - DATA mo_repo TYPE REF TO zcl_abapgit_repo . DATA ms_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings . @@ -78,22 +78,26 @@ CLASS zcl_abapgit_gui_page_sett_locl DEFINITION zcx_abapgit_exception . METHODS choose_labels RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . METHODS choose_check_variant + IMPORTING + iv_is_return TYPE abap_bool DEFAULT abap_false RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . METHODS choose_transport_request RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . METHODS choose_customizing_request RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . METHODS is_customizing_included RETURNING VALUE(rv_result) TYPE abap_bool RAISING - zcx_abapgit_exception. - + zcx_abapgit_exception . + METHODS handle_picklist_state + RAISING + zcx_abapgit_exception . ENDCLASS. @@ -103,14 +107,28 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_LOCL IMPLEMENTATION. METHOD choose_check_variant. - DATA: lv_check_variant TYPE sci_chkv. + DATA ls_variant TYPE zif_abapgit_code_inspector=>ty_variant. + DATA lv_popup_cancelled TYPE abap_bool. - lv_check_variant = zcl_abapgit_ui_factory=>get_popups( )->choose_code_insp_check_variant( ). + IF iv_is_return = abap_false. + + mo_popup_picklist = zcl_abapgit_popup_code_insp=>create( + )->create_picklist( + )->set_id( c_event-choose_check_variant + )->set_in_page( abap_false ). + + ELSE. + + lv_popup_cancelled = mo_popup_picklist->was_cancelled( ). + IF lv_popup_cancelled = abap_false. + mo_popup_picklist->get_result_item( CHANGING cs_selected = ls_variant ). + IF ls_variant IS NOT INITIAL. + mo_form_data->set( + iv_key = c_id-code_inspector_check_variant + iv_val = ls_variant-name ). + ENDIF. + ENDIF. - IF lv_check_variant IS NOT INITIAL. - mo_form_data->set( - iv_key = c_id-code_inspector_check_variant - iv_val = lv_check_variant ). ENDIF. ENDMETHOD. @@ -278,6 +296,25 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_LOCL IMPLEMENTATION. ENDMETHOD. + METHOD handle_picklist_state. + + IF mo_popup_picklist IS BOUND AND + ( mo_popup_picklist->is_fulfilled( ) = abap_true OR mo_popup_picklist->is_in_page( ) = abap_false ). + " Picklist is either fullfilled OR + " it was on its own page and user went back from it via F3/ESC and the picklist had no "graceful back" handler + CASE mo_popup_picklist->id( ). + WHEN c_event-choose_check_variant. + choose_check_variant( iv_is_return = abap_true ). + WHEN OTHERS. + zcx_abapgit_exception=>raise( |Unexpected picklist id { mo_popup_picklist->id( ) }| ). + ENDCASE. + + CLEAR mo_popup_picklist. + ENDIF. + + ENDMETHOD. + + METHOD is_customizing_included. DATA lt_files TYPE zif_abapgit_definitions=>ty_files_item_tt. @@ -404,7 +441,8 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_LOCL IMPLEMENTATION. lv_check_variant = to_upper( io_form_data->get( c_id-code_inspector_check_variant ) ). IF lv_check_variant IS NOT INITIAL. TRY. - zcl_abapgit_code_inspector=>validate_check_variant( lv_check_variant ). + zcl_abapgit_factory=>get_code_inspector( mo_repo->get_package( ) + )->validate_check_variant( lv_check_variant ). CATCH zcx_abapgit_exception INTO lx_error. ro_validation_log->set( iv_key = c_id-code_inspector_check_variant @@ -457,7 +495,6 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_LOCL IMPLEMENTATION. WHEN c_event-choose_check_variant. choose_check_variant( ). - rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. WHEN c_event-save. " Validate form entries before saving @@ -471,12 +508,26 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_LOCL IMPLEMENTATION. ENDCASE. + IF mo_popup_picklist IS BOUND. " Uniform popup state handling + " This should happen only for a new popup because + " on the first re-render main component event handling is blocked + " and not called again until the popup distruction + IF mo_popup_picklist->is_in_page( ) = abap_true. + rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. + ELSE. + rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page. + rs_handled-page = zcl_abapgit_gui_page_hoc=>create( + ii_child_component = mo_popup_picklist + iv_show_as_modal = abap_true ). + ENDIF. + ENDIF. + ENDMETHOD. METHOD zif_abapgit_gui_renderable~render. - register_handlers( ). + handle_picklist_state( ). CREATE OBJECT ri_html TYPE zcl_abapgit_html. @@ -493,5 +544,12 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_SETT_LOCL IMPLEMENTATION. ri_html->add( `` ). + 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 ) ). + ENDIF. + ENDMETHOD. ENDCLASS. diff --git a/src/ui/popups/package.devc.xml b/src/ui/popups/package.devc.xml new file mode 100644 index 000000000..3a88bee53 --- /dev/null +++ b/src/ui/popups/package.devc.xml @@ -0,0 +1,10 @@ + + + + + + abapGit - GUI Popups + + + + diff --git a/src/ui/popups/zcl_abapgit_popup_code_insp.clas.abap b/src/ui/popups/zcl_abapgit_popup_code_insp.clas.abap new file mode 100644 index 000000000..4e39b9984 --- /dev/null +++ b/src/ui/popups/zcl_abapgit_popup_code_insp.clas.abap @@ -0,0 +1,63 @@ +CLASS zcl_abapgit_popup_code_insp DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + INTERFACES zif_abapgit_gui_render_item . + INTERFACES zif_abapgit_html_popup . + + CLASS-METHODS create + RETURNING + VALUE(ri_popup) TYPE REF TO zif_abapgit_html_popup . + PROTECTED SECTION. + PRIVATE SECTION. + + METHODS fetch_list + RETURNING + VALUE(rt_list) TYPE zif_abapgit_code_inspector=>ty_variants + RAISING + zcx_abapgit_exception. + +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_POPUP_CODE_INSP IMPLEMENTATION. + + + METHOD create. + CREATE OBJECT ri_popup TYPE zcl_abapgit_popup_code_insp. + ENDMETHOD. + + + METHOD fetch_list. + + rt_list = zcl_abapgit_factory=>get_code_inspector( '$TMP' )->list_global_variants( ). + + ENDMETHOD. + + + METHOD zif_abapgit_gui_render_item~render. + + FIELD-SYMBOLS TYPE LINE OF zif_abapgit_code_inspector=>ty_variants. + + ASSIGN iv_item TO . + ASSERT sy-subrc = 0. + + ri_html = zcl_abapgit_html=>create( |{ -name } - { -description }| ). + + ENDMETHOD. + + + METHOD zif_abapgit_html_popup~create_picklist. + + CREATE OBJECT ro_picklist + EXPORTING + iv_title = 'Choose Variant' + it_list = fetch_list( ) + ii_item_renderer = me. + + ENDMETHOD. +ENDCLASS. diff --git a/src/ui/popups/zcl_abapgit_popup_code_insp.clas.xml b/src/ui/popups/zcl_abapgit_popup_code_insp.clas.xml new file mode 100644 index 000000000..d6c578508 --- /dev/null +++ b/src/ui/popups/zcl_abapgit_popup_code_insp.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_POPUP_CODE_INSP + E + abapGit - Select code inspector variant + 1 + X + X + X + + + +