From 1059db6cc974396c5a9bba8ac6fc0ab9391eb770 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Tue, 19 Dec 2023 16:20:51 +0100 Subject: [PATCH] flow page: add user exit (#6706) --- src/ui/flow/package.devc.xml | 10 +++ src/ui/flow/zcl_abapgit_flow_exit.clas.abap | 72 +++++++++++++++++ src/ui/flow/zcl_abapgit_flow_exit.clas.xml | 16 ++++ .../zcl_abapgit_gui_page_flow.clas.abap | 79 +++++++++++++------ ...abapgit_gui_page_flow.clas.locals_imp.abap | 22 +++--- .../zcl_abapgit_gui_page_flow.clas.xml | 2 +- src/ui/flow/zif_abapgit_flow_exit.intf.abap | 25 ++++++ src/ui/flow/zif_abapgit_flow_exit.intf.xml | 15 ++++ .../flow/zif_abapgit_gui_page_flow.intf.abap | 40 ++++++++++ .../flow/zif_abapgit_gui_page_flow.intf.xml | 15 ++++ ...abapgit_gui_page_flow.clas.locals_def.abap | 39 --------- 11 files changed, 261 insertions(+), 74 deletions(-) create mode 100644 src/ui/flow/package.devc.xml create mode 100644 src/ui/flow/zcl_abapgit_flow_exit.clas.abap create mode 100644 src/ui/flow/zcl_abapgit_flow_exit.clas.xml rename src/ui/{pages => flow}/zcl_abapgit_gui_page_flow.clas.abap (83%) rename src/ui/{pages => flow}/zcl_abapgit_gui_page_flow.clas.locals_imp.abap (96%) rename src/ui/{pages => flow}/zcl_abapgit_gui_page_flow.clas.xml (90%) create mode 100644 src/ui/flow/zif_abapgit_flow_exit.intf.abap create mode 100644 src/ui/flow/zif_abapgit_flow_exit.intf.xml create mode 100644 src/ui/flow/zif_abapgit_gui_page_flow.intf.abap create mode 100644 src/ui/flow/zif_abapgit_gui_page_flow.intf.xml delete mode 100644 src/ui/pages/zcl_abapgit_gui_page_flow.clas.locals_def.abap diff --git a/src/ui/flow/package.devc.xml b/src/ui/flow/package.devc.xml new file mode 100644 index 000000000..dac1fe39f --- /dev/null +++ b/src/ui/flow/package.devc.xml @@ -0,0 +1,10 @@ + + + + + + abapGit - GUI Flow Page + + + + diff --git a/src/ui/flow/zcl_abapgit_flow_exit.clas.abap b/src/ui/flow/zcl_abapgit_flow_exit.clas.abap new file mode 100644 index 000000000..b2a886894 --- /dev/null +++ b/src/ui/flow/zcl_abapgit_flow_exit.clas.abap @@ -0,0 +1,72 @@ +CLASS zcl_abapgit_flow_exit DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + INTERFACES zif_abapgit_flow_exit . + + CLASS-METHODS get_instance + RETURNING + VALUE(ri_exit) TYPE REF TO zif_abapgit_flow_exit. + PROTECTED SECTION. + PRIVATE SECTION. + + CLASS-DATA gi_global_exit TYPE REF TO zif_abapgit_flow_exit. + CLASS-DATA gi_exit TYPE REF TO zif_abapgit_flow_exit. +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_FLOW_EXIT IMPLEMENTATION. + + + METHOD get_instance. +* this exit only works with global classes + + IF gi_global_exit IS NOT INITIAL. + ri_exit = gi_global_exit. + RETURN. + ENDIF. + + TRY. + CREATE OBJECT gi_exit TYPE ('ZCL_ABAPGIT_FLOW_USER_EXIT'). + CATCH cx_sy_create_object_error ##NO_HANDLER. + ENDTRY. + + CREATE OBJECT gi_global_exit TYPE zcl_abapgit_flow_exit. " this class + + ri_exit = gi_global_exit. + + ENDMETHOD. + + + METHOD zif_abapgit_flow_exit~on_event. + + IF gi_exit IS NOT INITIAL. + TRY. + rs_result = gi_exit->on_event( + ii_event = ii_event + it_features = it_features ). + CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER. + ENDTRY. + ENDIF. + + ENDMETHOD. + + + METHOD zif_abapgit_flow_exit~toolbar_extras. + + IF gi_exit IS NOT INITIAL. + TRY. + gi_exit->toolbar_extras( + io_toolbar = io_toolbar + iv_index = iv_index + is_feature = is_feature ). + CATCH cx_sy_ref_is_initial cx_sy_dyn_call_illegal_method ##NO_HANDLER. + ENDTRY. + ENDIF. + + ENDMETHOD. +ENDCLASS. diff --git a/src/ui/flow/zcl_abapgit_flow_exit.clas.xml b/src/ui/flow/zcl_abapgit_flow_exit.clas.xml new file mode 100644 index 000000000..783c04f2c --- /dev/null +++ b/src/ui/flow/zcl_abapgit_flow_exit.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_FLOW_EXIT + E + abapGit - Flow page default exit + 1 + X + X + X + + + + diff --git a/src/ui/pages/zcl_abapgit_gui_page_flow.clas.abap b/src/ui/flow/zcl_abapgit_gui_page_flow.clas.abap similarity index 83% rename from src/ui/pages/zcl_abapgit_gui_page_flow.clas.abap rename to src/ui/flow/zcl_abapgit_gui_page_flow.clas.abap index 4f6ad137e..39aa9d968 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_flow.clas.abap +++ b/src/ui/flow/zcl_abapgit_gui_page_flow.clas.abap @@ -2,24 +2,22 @@ CLASS zcl_abapgit_gui_page_flow DEFINITION PUBLIC INHERITING FROM zcl_abapgit_gui_component FINAL - CREATE PRIVATE. + CREATE PRIVATE . PUBLIC SECTION. - INTERFACES zif_abapgit_gui_event_handler. - INTERFACES zif_abapgit_gui_renderable. - INTERFACES zif_abapgit_gui_menu_provider. + INTERFACES zif_abapgit_gui_event_handler . + INTERFACES zif_abapgit_gui_renderable . + INTERFACES zif_abapgit_gui_menu_provider . CLASS-METHODS create RETURNING VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable RAISING - zcx_abapgit_exception. - + zcx_abapgit_exception . METHODS constructor RAISING - zcx_abapgit_exception. - + zcx_abapgit_exception . PROTECTED SECTION. PRIVATE SECTION. @@ -29,7 +27,7 @@ CLASS zcl_abapgit_gui_page_flow DEFINITION pull TYPE string VALUE 'pull', stage TYPE string VALUE 'stage', END OF c_action . - DATA mt_features TYPE ty_features . + DATA mt_features TYPE zif_abapgit_gui_page_flow=>ty_features . METHODS refresh RAISING @@ -41,16 +39,21 @@ CLASS zcl_abapgit_gui_page_flow DEFINITION RAISING zcx_abapgit_exception . METHODS render_table + IMPORTING + !is_feature TYPE zif_abapgit_gui_page_flow=>ty_feature + RETURNING + VALUE(ri_html) TYPE REF TO zif_abapgit_html . + METHODS render_toolbar IMPORTING !iv_index TYPE i - !is_feature TYPE ty_feature + !is_feature TYPE zif_abapgit_gui_page_flow=>ty_feature RETURNING VALUE(ri_html) TYPE REF TO zif_abapgit_html . ENDCLASS. -CLASS zcl_abapgit_gui_page_flow IMPLEMENTATION. +CLASS ZCL_ABAPGIT_GUI_PAGE_FLOW IMPLEMENTATION. METHOD constructor. @@ -92,7 +95,6 @@ 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. @@ -128,15 +130,34 @@ CLASS zcl_abapgit_gui_page_flow IMPLEMENTATION. ENDLOOP. ri_html->add( || ). -* todo: crossout if write protected + ENDMETHOD. + + METHOD render_toolbar. + + DATA lo_toolbar TYPE REF TO zcl_abapgit_html_toolbar. + DATA lv_extra TYPE string. + +* todo: crossout pull if write protected + + CREATE OBJECT ri_html TYPE zcl_abapgit_html. 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 ). + + IF is_feature-full_match = abap_false. + lv_extra = |?index={ iv_index }&key={ is_feature-repo-key }&branch={ is_feature-branch-display_name }|. + lo_toolbar->add( iv_txt = 'Pull' + iv_act = |{ c_action-pull }{ lv_extra }| + iv_opt = zif_abapgit_html=>c_html_opt-strong ). + lo_toolbar->add( iv_txt = 'Stage' + iv_act = |{ c_action-stage }{ lv_extra }| + iv_opt = zif_abapgit_html=>c_html_opt-strong ). + ENDIF. + + zcl_abapgit_flow_exit=>get_instance( )->toolbar_extras( + io_toolbar = lo_toolbar + iv_index = iv_index + is_feature = is_feature ). + ri_html->add( lo_toolbar->render( ) ). ENDMETHOD. @@ -167,6 +188,7 @@ CLASS zcl_abapgit_gui_page_flow IMPLEMENTATION. DATA lv_index TYPE i. DATA lo_online TYPE REF TO zcl_abapgit_repo_online. DATA ls_feature LIKE LINE OF mt_features. + DATA ls_event_result TYPE zif_abapgit_flow_exit=>ty_event_result. FIELD-SYMBOLS LIKE LINE OF ls_feature-changed_objects. FIELD-SYMBOLS LIKE LINE OF lt_filter. @@ -238,6 +260,16 @@ CLASS zcl_abapgit_gui_page_flow IMPLEMENTATION. rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page. refresh( ). + WHEN OTHERS. + ls_event_result = zcl_abapgit_flow_exit=>get_instance( )->on_event( + ii_event = ii_event + it_features = mt_features ). + + rs_handled = ls_event_result-handled. + + IF ls_event_result-refresh = abap_true. + refresh( ). + ENDIF. ENDCASE. ENDMETHOD. @@ -317,18 +349,19 @@ CLASS zcl_abapgit_gui_page_flow IMPLEMENTATION. ri_html->add( |No corresponding transport found
| ). ENDIF. - ri_html->add( '
' ). IF ls_feature-branch IS NOT INITIAL AND ls_feature-branch-up_to_date = abap_false. ri_html->add( 'Branch not up to date

' ). CONTINUE. ENDIF. + ri_html->add( render_toolbar( + iv_index = lv_index + is_feature = ls_feature ) ). + IF ls_feature-full_match = abap_true. ri_html->add( |Full Match
| ). ELSE. - ri_html->add( render_table( - is_feature = ls_feature - iv_index = lv_index ) ). + ri_html->add( render_table( ls_feature ) ). ENDIF. * todo LOOP AT ls_feature-changed_objects INTO ls_item. diff --git a/src/ui/pages/zcl_abapgit_gui_page_flow.clas.locals_imp.abap b/src/ui/flow/zcl_abapgit_gui_page_flow.clas.locals_imp.abap similarity index 96% rename from src/ui/pages/zcl_abapgit_gui_page_flow.clas.locals_imp.abap rename to src/ui/flow/zcl_abapgit_gui_page_flow.clas.locals_imp.abap index 77713875d..06942df05 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_flow.clas.locals_imp.abap +++ b/src/ui/flow/zcl_abapgit_gui_page_flow.clas.locals_imp.abap @@ -74,7 +74,7 @@ CLASS lcl_helper DEFINITION FINAL. PUBLIC SECTION. CLASS-METHODS get_information RETURNING - VALUE(rt_features) TYPE ty_features + VALUE(rt_features) TYPE zif_abapgit_gui_page_flow=>ty_features RAISING zcx_abapgit_exception. @@ -95,11 +95,11 @@ CLASS lcl_helper DEFINITION FINAL. IMPORTING io_online TYPE REF TO zif_abapgit_repo RETURNING - VALUE(rs_data) TYPE ty_feature-repo. + VALUE(rs_data) TYPE zif_abapgit_gui_page_flow=>ty_feature-repo. CLASS-METHODS map_files_to_objects IMPORTING - it_files TYPE ty_path_name_tt + it_files TYPE zif_abapgit_gui_page_flow=>ty_path_name_tt io_online TYPE REF TO zcl_abapgit_repo_online RETURNING VALUE(rt_changed_objects) TYPE zif_abapgit_definitions=>ty_items_ts @@ -113,7 +113,7 @@ CLASS lcl_helper DEFINITION FINAL. EXPORTING et_main_expanded TYPE zif_abapgit_git_definitions=>ty_expanded_tt CHANGING - ct_features TYPE ty_features + ct_features TYPE zif_abapgit_gui_page_flow=>ty_features RAISING zcx_abapgit_exception. @@ -122,7 +122,7 @@ CLASS lcl_helper DEFINITION FINAL. ii_repo TYPE REF TO zif_abapgit_repo it_main_expanded TYPE zif_abapgit_git_definitions=>ty_expanded_tt CHANGING - ct_features TYPE ty_features + ct_features TYPE zif_abapgit_gui_page_flow=>ty_features ct_transports TYPE ty_transports_tt RAISING zcx_abapgit_exception. @@ -134,7 +134,7 @@ CLASS lcl_helper DEFINITION FINAL. it_transports TYPE ty_transports_tt it_main_expanded TYPE zif_abapgit_git_definitions=>ty_expanded_tt CHANGING - cs_feature TYPE ty_feature + cs_feature TYPE zif_abapgit_gui_page_flow=>ty_feature RAISING zcx_abapgit_exception. @@ -143,7 +143,7 @@ CLASS lcl_helper DEFINITION FINAL. iv_url TYPE string it_branches TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt CHANGING - ct_features TYPE ty_features + ct_features TYPE zif_abapgit_gui_page_flow=>ty_features RAISING zcx_abapgit_exception. @@ -151,7 +151,7 @@ CLASS lcl_helper DEFINITION FINAL. IMPORTING iv_url TYPE string CHANGING - ct_features TYPE ty_features + ct_features TYPE zif_abapgit_gui_page_flow=>ty_features RAISING zcx_abapgit_exception. @@ -159,7 +159,7 @@ CLASS lcl_helper DEFINITION FINAL. IMPORTING io_online TYPE REF TO zcl_abapgit_repo_online CHANGING - ct_features TYPE ty_features + ct_features TYPE zif_abapgit_gui_page_flow=>ty_features RAISING zcx_abapgit_exception. @@ -174,7 +174,7 @@ CLASS lcl_helper DEFINITION FINAL. it_expanded1 TYPE zif_abapgit_git_definitions=>ty_expanded_tt it_expanded2 TYPE zif_abapgit_git_definitions=>ty_expanded_tt RETURNING - VALUE(rt_files) TYPE ty_path_name_tt. + VALUE(rt_files) TYPE zif_abapgit_gui_page_flow=>ty_path_name_tt. ENDCLASS. CLASS lcl_helper IMPLEMENTATION. @@ -592,7 +592,7 @@ CLASS lcl_helper IMPLEMENTATION. FIELD-SYMBOLS LIKE LINE OF ct_features. FIELD-SYMBOLS LIKE LINE OF lt_local. - FIELD-SYMBOLS TYPE ty_path_name. + FIELD-SYMBOLS TYPE zif_abapgit_gui_page_flow=>ty_path_name. FIELD-SYMBOLS LIKE LINE OF lt_filter. FIELD-SYMBOLS LIKE LINE OF -changed_objects. diff --git a/src/ui/pages/zcl_abapgit_gui_page_flow.clas.xml b/src/ui/flow/zcl_abapgit_gui_page_flow.clas.xml similarity index 90% rename from src/ui/pages/zcl_abapgit_gui_page_flow.clas.xml rename to src/ui/flow/zcl_abapgit_gui_page_flow.clas.xml index b30d50a8c..c5aab55d1 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_flow.clas.xml +++ b/src/ui/flow/zcl_abapgit_gui_page_flow.clas.xml @@ -5,7 +5,7 @@ ZCL_ABAPGIT_GUI_PAGE_FLOW E - abapGit - Flow page + abapGit - GUI Flow Page 1 X X diff --git a/src/ui/flow/zif_abapgit_flow_exit.intf.abap b/src/ui/flow/zif_abapgit_flow_exit.intf.abap new file mode 100644 index 000000000..c63de2a89 --- /dev/null +++ b/src/ui/flow/zif_abapgit_flow_exit.intf.abap @@ -0,0 +1,25 @@ +INTERFACE zif_abapgit_flow_exit + PUBLIC . + + + METHODS toolbar_extras + IMPORTING + !io_toolbar TYPE REF TO zcl_abapgit_html_toolbar + !is_feature TYPE zif_abapgit_gui_page_flow=>ty_feature + !iv_index TYPE i . + + TYPES: BEGIN OF ty_event_result, + handled TYPE zif_abapgit_gui_event_handler=>ty_handling_result, + refresh TYPE abap_bool, + END OF ty_event_result. + + METHODS on_event + IMPORTING + ii_event TYPE REF TO zif_abapgit_gui_event + it_features TYPE zif_abapgit_gui_page_flow=>ty_features + RETURNING + VALUE(rs_result) TYPE ty_event_result + RAISING + zcx_abapgit_exception. + +ENDINTERFACE. diff --git a/src/ui/flow/zif_abapgit_flow_exit.intf.xml b/src/ui/flow/zif_abapgit_flow_exit.intf.xml new file mode 100644 index 000000000..a5422c160 --- /dev/null +++ b/src/ui/flow/zif_abapgit_flow_exit.intf.xml @@ -0,0 +1,15 @@ + + + + + + ZIF_ABAPGIT_FLOW_EXIT + E + abapGit - Flow page user exit + 2 + 1 + X + + + + diff --git a/src/ui/flow/zif_abapgit_gui_page_flow.intf.abap b/src/ui/flow/zif_abapgit_gui_page_flow.intf.abap new file mode 100644 index 000000000..143549af8 --- /dev/null +++ b/src/ui/flow/zif_abapgit_gui_page_flow.intf.abap @@ -0,0 +1,40 @@ +INTERFACE zif_abapgit_gui_page_flow + PUBLIC . + + TYPES: + BEGIN OF ty_path_name, + path TYPE string, + filename TYPE string, + remote_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1, + local_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1, + END OF ty_path_name. + TYPES: + ty_path_name_tt TYPE HASHED TABLE OF ty_path_name WITH UNIQUE KEY path filename. + + TYPES: BEGIN OF ty_feature, + BEGIN OF repo, + name TYPE string, + key TYPE zif_abapgit_persistence=>ty_repo-key, + package TYPE devclass, + END OF repo, + BEGIN OF branch, + display_name TYPE string, + sha1 TYPE zif_abapgit_git_definitions=>ty_sha1, + up_to_date TYPE abap_bool, + END OF branch, + BEGIN OF pr, + title TYPE string, + url TYPE string, + draft TYPE abap_bool, + END OF pr, + BEGIN OF transport, + trkorr TYPE trkorr, + title TYPE string, + END OF transport, + full_match TYPE abap_bool, + changed_files TYPE ty_path_name_tt, + changed_objects TYPE zif_abapgit_definitions=>ty_items_ts, + END OF ty_feature. + TYPES ty_features TYPE STANDARD TABLE OF ty_feature WITH DEFAULT KEY. + +ENDINTERFACE. diff --git a/src/ui/flow/zif_abapgit_gui_page_flow.intf.xml b/src/ui/flow/zif_abapgit_gui_page_flow.intf.xml new file mode 100644 index 000000000..29ca27789 --- /dev/null +++ b/src/ui/flow/zif_abapgit_gui_page_flow.intf.xml @@ -0,0 +1,15 @@ + + + + + + ZIF_ABAPGIT_GUI_PAGE_FLOW + E + abapGit - GUI Flow Page definitions + 2 + 1 + X + + + + diff --git a/src/ui/pages/zcl_abapgit_gui_page_flow.clas.locals_def.abap b/src/ui/pages/zcl_abapgit_gui_page_flow.clas.locals_def.abap deleted file mode 100644 index 03e29a2f1..000000000 --- a/src/ui/pages/zcl_abapgit_gui_page_flow.clas.locals_def.abap +++ /dev/null @@ -1,39 +0,0 @@ -*"* use this source file for any type of declarations (class -*"* definitions, interfaces or type declarations) you need for -*"* components in the private section - -TYPES: - BEGIN OF ty_path_name, - path TYPE string, - filename TYPE string, - remote_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1, - local_sha1 TYPE zif_abapgit_git_definitions=>ty_sha1, - END OF ty_path_name. -TYPES: - ty_path_name_tt TYPE HASHED TABLE OF ty_path_name WITH UNIQUE KEY path filename. - -TYPES: BEGIN OF ty_feature, - BEGIN OF repo, - name TYPE string, - key TYPE zif_abapgit_persistence=>ty_repo-key, - package TYPE devclass, - END OF repo, - BEGIN OF branch, - display_name TYPE string, - sha1 TYPE zif_abapgit_git_definitions=>ty_sha1, - up_to_date TYPE abap_bool, - END OF branch, - BEGIN OF pr, - title TYPE string, - url TYPE string, - draft TYPE abap_bool, - END OF pr, - BEGIN OF transport, - trkorr TYPE trkorr, - title TYPE string, - END OF transport, - full_match TYPE abap_bool, - changed_files TYPE ty_path_name_tt, - changed_objects TYPE zif_abapgit_definitions=>ty_items_ts, - END OF ty_feature. -TYPES ty_features TYPE STANDARD TABLE OF ty_feature WITH DEFAULT KEY.