From 8ad8067d33aace080350d93f54ea5616f69e5883 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Thu, 16 Nov 2023 17:03:48 +0100 Subject: [PATCH] flow page: add basic pull page (#6644) --- .../pages/zcl_abapgit_gui_page_flow.clas.abap | 46 +++- .../pages/zcl_abapgit_gui_page_pull.clas.abap | 241 ++++++++++++++++++ .../pages/zcl_abapgit_gui_page_pull.clas.xml | 16 ++ .../zcl_abapgit_gui_page_sett_locl.clas.abap | 3 +- 4 files changed, 293 insertions(+), 13 deletions(-) create mode 100644 src/ui/pages/zcl_abapgit_gui_page_pull.clas.abap create mode 100644 src/ui/pages/zcl_abapgit_gui_page_pull.clas.xml diff --git a/src/ui/pages/zcl_abapgit_gui_page_flow.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_flow.clas.abap index 621052fc2..306f3361e 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_flow.clas.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_flow.clas.abap @@ -92,6 +92,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_FLOW IMPLEMENTATION. METHOD render_table. DATA ls_path_name LIKE LINE OF is_feature-changed_files. + DATA lo_toolbar TYPE REF TO zcl_abapgit_html_toolbar. DATA lv_status TYPE string. DATA lv_branch TYPE string. DATA lv_param TYPE string. @@ -100,8 +101,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_FLOW IMPLEMENTATION. CREATE OBJECT ri_html TYPE zcl_abapgit_html. ri_html->add( || ). - ri_html->add( || && - || ). + ri_html->add( || ). lv_branch = is_feature-branch-display_name. IF lv_branch IS INITIAL. @@ -129,13 +129,15 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_FLOW IMPLEMENTATION. ri_html->add( |
FilenameRemote SHA1Local SHA1
FilenameRemoteLocal
| ). * todo: crossout if write protected - ri_html->add( ri_html->a( - iv_txt = 'Pull' - iv_act = |{ c_action-pull }?index={ iv_index }&key={ is_feature-repo-key }| ) ). - ri_html->add( ri_html->a( - iv_txt = 'Stage' - iv_act = |{ c_action-stage }?index={ iv_index }&key={ is_feature-repo-key }&branch={ lv_branch }| ) ). - ri_html->add( |
| ). + + CREATE OBJECT lo_toolbar EXPORTING iv_id = 'toolbar-flow'. + lo_toolbar->add( iv_txt = 'Pull' + iv_act = |{ c_action-pull }?index={ iv_index }&key={ is_feature-repo-key }&branch={ lv_branch }| + iv_opt = zif_abapgit_html=>c_html_opt-strong ). + lo_toolbar->add( iv_txt = 'Stage' + iv_act = |{ c_action-stage }?index={ iv_index }&key={ is_feature-repo-key }&branch={ lv_branch }| + iv_opt = zif_abapgit_html=>c_html_opt-strong ). + ri_html->add( lo_toolbar->render( ) ). ENDMETHOD. @@ -205,17 +207,37 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_FLOW IMPLEMENTATION. io_repo = lo_online ii_obj_filter = lo_filter ). - rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page. + rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_w_bookmark. + + refresh( ). WHEN c_action-pull. lv_key = ii_event->query( )->get( 'KEY' ). lv_index = ii_event->query( )->get( 'INDEX' ). + lv_branch = ii_event->query( )->get( 'BRANCH' ). lo_online ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ). READ TABLE mt_features INTO ls_feature INDEX lv_index. ASSERT sy-subrc = 0. -* todo: set filter, - zcl_abapgit_services_repo=>gui_deserialize( lo_online ). + LOOP AT ls_feature-changed_objects ASSIGNING . + APPEND INITIAL LINE TO lt_filter ASSIGNING . + -object = -obj_type. + -obj_name = -obj_name. + ENDLOOP. + CREATE OBJECT lo_filter EXPORTING it_filter = lt_filter. + + set_branch( + iv_branch = lv_branch + iv_key = lv_key ). + + rs_handled-page = zcl_abapgit_gui_page_pull=>create( + io_repo = lo_online + iv_trkorr = ls_feature-transport-trkorr + ii_obj_filter = lo_filter ). + + rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page. + + refresh( ). ENDCASE. ENDMETHOD. diff --git a/src/ui/pages/zcl_abapgit_gui_page_pull.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_pull.clas.abap new file mode 100644 index 000000000..119e308e0 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_pull.clas.abap @@ -0,0 +1,241 @@ +CLASS zcl_abapgit_gui_page_pull DEFINITION + PUBLIC + INHERITING FROM zcl_abapgit_gui_component + FINAL + CREATE PRIVATE. + + PUBLIC SECTION. + + INTERFACES zif_abapgit_gui_event_handler. + INTERFACES zif_abapgit_gui_menu_provider. + INTERFACES zif_abapgit_gui_renderable. + + CONSTANTS: + BEGIN OF c_id, + transport_request TYPE string VALUE 'transport_request', + END OF c_id . + + CONSTANTS: BEGIN OF c_action, + pull TYPE string VALUE 'pull', + refresh TYPE string VALUE 'refresh', + choose_tr TYPE string VALUE 'choose_tr', + END OF c_action. + + CLASS-METHODS create + IMPORTING + io_repo TYPE REF TO zcl_abapgit_repo + iv_trkorr TYPE trkorr OPTIONAL + ii_obj_filter TYPE REF TO zif_abapgit_object_filter OPTIONAL + RETURNING + VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable + RAISING + zcx_abapgit_exception. + + METHODS constructor + IMPORTING + io_repo TYPE REF TO zcl_abapgit_repo + iv_trkorr TYPE trkorr + ii_obj_filter TYPE REF TO zif_abapgit_object_filter OPTIONAL + RAISING + zcx_abapgit_exception. + + PROTECTED SECTION. + + PRIVATE SECTION. + + DATA mo_repo TYPE REF TO zcl_abapgit_repo. + DATA mi_obj_filter TYPE REF TO zif_abapgit_object_filter. + DATA mo_form_data TYPE REF TO zcl_abapgit_string_map. + DATA ms_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks. + + + METHODS form + RETURNING + VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form + RAISING + zcx_abapgit_exception. + + METHODS choose_transport_request + RAISING + zcx_abapgit_exception . + +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_GUI_PAGE_PULL IMPLEMENTATION. + + + METHOD choose_transport_request. + + DATA lv_transport_request TYPE trkorr. + + lv_transport_request = zcl_abapgit_ui_factory=>get_popups( )->popup_transport_request( ). + + IF lv_transport_request IS NOT INITIAL. + mo_form_data->set( + iv_key = c_id-transport_request + iv_val = lv_transport_request ). + ENDIF. + + ENDMETHOD. + + + METHOD constructor. + + super->constructor( ). + + mo_repo = io_repo. + mi_obj_filter = ii_obj_filter. + + CREATE OBJECT mo_form_data. + mo_form_data->set( + iv_key = c_id-transport_request + iv_val = iv_trkorr ). + + ENDMETHOD. + + + METHOD create. + + DATA lo_component TYPE REF TO zcl_abapgit_gui_page_pull. + + CREATE OBJECT lo_component + EXPORTING + io_repo = io_repo + iv_trkorr = iv_trkorr + ii_obj_filter = ii_obj_filter. + + ri_page = zcl_abapgit_gui_page_hoc=>create( + iv_page_title = 'Pull' + ii_page_menu_provider = lo_component + ii_child_component = lo_component ). + + ENDMETHOD. + + + METHOD form. + + DATA lt_filter TYPE zif_abapgit_definitions=>ty_tadir_tt. + + FIELD-SYMBOLS LIKE LINE OF ms_checks-overwrite. + + + IF mi_obj_filter IS NOT INITIAL. + lt_filter = mi_obj_filter->get_filter( ). + ENDIF. + + ro_form = zcl_abapgit_html_form=>create( iv_form_id = 'pull-form' ). + + ro_form->start_group( + iv_name = 'id-objects' + iv_label = 'Objects' ). + + LOOP AT ms_checks-overwrite ASSIGNING . + IF lines( lt_filter ) > 0. + READ TABLE lt_filter WITH KEY object = -obj_type + obj_name = -obj_name TRANSPORTING NO FIELDS. + IF sy-subrc <> 0. + CONTINUE. + ENDIF. + ENDIF. + ro_form->checkbox( + iv_label = |{ -obj_type } { -obj_name }| + iv_name = |{ -obj_type }-{ -obj_name }| ). + ENDLOOP. + + ro_form->text( + iv_name = c_id-transport_request + iv_required = abap_true + iv_upper_case = abap_true + iv_side_action = c_action-choose_tr + iv_max = 10 + iv_label = |Transport Request| ). + + ro_form->command( + iv_label = 'Pull' + iv_cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main + iv_action = c_action-pull + )->command( + iv_label = 'Back' + iv_action = zif_abapgit_definitions=>c_action-go_back ). + + ENDMETHOD. + + + METHOD zif_abapgit_gui_event_handler~on_event. + + DATA lo_log TYPE REF TO zcl_abapgit_log. + DATA lv_value TYPE string. + + FIELD-SYMBOLS LIKE LINE OF ms_checks-overwrite. + + + mo_form_data = ii_event->form_data( ). + + CASE ii_event->mv_action. + WHEN c_action-refresh. + mo_repo->refresh( ). + rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. + WHEN c_action-choose_tr. + choose_transport_request( ). + rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. + WHEN c_action-pull. + ms_checks-transport-transport = mo_form_data->get( c_id-transport_request ). + + LOOP AT ms_checks-overwrite ASSIGNING . + lv_value = mo_form_data->get( |{ -obj_type }-{ -obj_name }| ). + IF lv_value = 'on'. + -decision = zif_abapgit_definitions=>c_yes. + ELSE. + -decision = zif_abapgit_definitions=>c_no. + ENDIF. + ENDLOOP. + +* todo, show log? + CREATE OBJECT lo_log. + mo_repo->deserialize( + is_checks = ms_checks + ii_log = lo_log ). + + rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back. + ENDCASE. + + ENDMETHOD. + + + METHOD zif_abapgit_gui_menu_provider~get_menu. + + CREATE OBJECT ro_toolbar EXPORTING iv_id = 'toolbar-main'. + + ro_toolbar->add( + iv_txt = 'Refresh' + iv_act = c_action-refresh ). + + ro_toolbar->add( + iv_txt = 'Back' + iv_act = zif_abapgit_definitions=>c_action-go_back ). + + ENDMETHOD. + + + METHOD zif_abapgit_gui_renderable~render. + + register_handlers( ). + + CREATE OBJECT ri_html TYPE zcl_abapgit_html. + ri_html->add( '
' ). + + ms_checks = mo_repo->deserialize_checks( ). + + IF lines( ms_checks-overwrite ) = 0. + zcx_abapgit_exception=>raise( + 'There is nothing to pull. The local state completely matches the remote repository.' ). + ENDIF. + + ri_html->add( form( )->render( mo_form_data ) ). + + ri_html->add( '
' ). + + ENDMETHOD. +ENDCLASS. diff --git a/src/ui/pages/zcl_abapgit_gui_page_pull.clas.xml b/src/ui/pages/zcl_abapgit_gui_page_pull.clas.xml new file mode 100644 index 000000000..852455887 --- /dev/null +++ b/src/ui/pages/zcl_abapgit_gui_page_pull.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_GUI_PAGE_PULL + E + abapGit - GUI Pull + 1 + X + X + X + + + + 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 3275ad8ae..7ac661a09 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 @@ -274,7 +274,8 @@ CLASS zcl_abapgit_gui_page_sett_locl IMPLEMENTATION. iv_label = 'Only Serialize Main Language' iv_hint = 'Ignore translations; serialize only main language of repository' ). - IF zcl_abapgit_feature=>is_enabled( 'FLOW' ) = abap_true. + IF zcl_abapgit_feature=>is_enabled( 'FLOW' ) = abap_true + AND li_package->are_changes_recorded_in_tr_req( ) = abap_true. ro_form->checkbox( iv_name = c_id-flow iv_label = 'Enable Flow Page' ).