From 25774396e6527bf7c3b94472b6b9939ace927d38 Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Sat, 3 Oct 2020 04:18:45 -0400 Subject: [PATCH] Dialogs: add offline repo HTML form (#3960) * Dialogs: add offline repo HTML form * Dialogs: add offline repo HTML form * Dialogs: add offline repo HTML form * Lint * Lint * Chaining * Set required attribute * Check for empty display name * Change validation Co-authored-by: Lars Hvam --- .../zcl_abapgit_gui_page_addofflin.clas.abap | 247 ++++++++++++++++++ .../zcl_abapgit_gui_page_addofflin.clas.xml | 16 ++ .../zcl_abapgit_gui_page_addonline.clas.abap | 58 ++-- src/ui/zcl_abapgit_gui_router.clas.abap | 38 +-- src/ui/zcl_abapgit_html_form.clas.abap | 113 ++++---- src/ui/zcl_abapgit_popups.clas.abap | 164 +++--------- src/ui/zcl_abapgit_services_repo.clas.abap | 126 +++++---- ..._abapgit_ui_injector.clas.testclasses.abap | 4 - src/ui/zif_abapgit_popups.intf.abap | 51 ++-- src/zcl_abapgit_repo_srv.clas.abap | 4 + 10 files changed, 498 insertions(+), 323 deletions(-) create mode 100644 src/ui/zcl_abapgit_gui_page_addofflin.clas.abap create mode 100644 src/ui/zcl_abapgit_gui_page_addofflin.clas.xml diff --git a/src/ui/zcl_abapgit_gui_page_addofflin.clas.abap b/src/ui/zcl_abapgit_gui_page_addofflin.clas.abap new file mode 100644 index 000000000..fa78adf1d --- /dev/null +++ b/src/ui/zcl_abapgit_gui_page_addofflin.clas.abap @@ -0,0 +1,247 @@ +CLASS zcl_abapgit_gui_page_addofflin DEFINITION + PUBLIC + INHERITING FROM zcl_abapgit_gui_component + FINAL + CREATE PRIVATE . + + PUBLIC SECTION. + INTERFACES zif_abapgit_gui_event_handler . + INTERFACES zif_abapgit_gui_renderable . + + CLASS-METHODS create + " TODO importing prefilled form data + RETURNING + VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable + RAISING + zcx_abapgit_exception . + METHODS constructor + RAISING + zcx_abapgit_exception . + PROTECTED SECTION. + PRIVATE SECTION. + + CONSTANTS: + BEGIN OF c_id, + url TYPE string VALUE 'url', + package TYPE string VALUE 'package', + folder_logic TYPE string VALUE 'folder_logic', + master_lang_only TYPE string VALUE 'master_lang_only', + END OF c_id . + CONSTANTS: + BEGIN OF c_event, + go_back TYPE string VALUE 'go-back', + choose_package TYPE string VALUE 'choose-package', + create_package TYPE string VALUE 'create-package', + add_offline_repo TYPE string VALUE 'add-repo-offline', + END OF c_event . + DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map . + DATA mo_form_data TYPE REF TO zcl_abapgit_string_map . + DATA mo_form TYPE REF TO zcl_abapgit_html_form . + + METHODS parse_form + IMPORTING + !it_form_fields TYPE tihttpnvp + RETURNING + VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map + RAISING + zcx_abapgit_exception . + METHODS validate_form + IMPORTING + !io_form_data TYPE REF TO zcl_abapgit_string_map + RETURNING + VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map + RAISING + zcx_abapgit_exception . + METHODS get_form_schema + RETURNING + VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form . +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_GUI_PAGE_ADDOFFLIN IMPLEMENTATION. + + + METHOD constructor. + super->constructor( ). + CREATE OBJECT mo_validation_log. + CREATE OBJECT mo_form_data. + mo_form = get_form_schema( ). + ENDMETHOD. + + + METHOD create. + + DATA lo_component TYPE REF TO zcl_abapgit_gui_page_addofflin. + + CREATE OBJECT lo_component. + + ri_page = zcl_abapgit_gui_page_hoc=>create( + iv_page_title = 'Create offline repository' + ii_child_component = lo_component ). + + ENDMETHOD. + + + METHOD get_form_schema. + + ro_form = zcl_abapgit_html_form=>create( iv_form_id = 'add-repo-offline-form' ). + + ro_form->text( + iv_name = c_id-url + iv_required = abap_true + iv_label = 'Repository name' + iv_hint = 'Unique name for repository' + )->text( + iv_name = c_id-package + iv_side_action = c_event-choose_package + iv_required = abap_true + iv_label = 'Package' + iv_hint = 'SAP package for the code (should be a dedicated one)' + iv_placeholder = 'Z... / $...' + )->radio( + iv_name = c_id-folder_logic + iv_default_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix + iv_label = 'Folder logic' + iv_hint = 'Define how package folders are named in the repo (see https://docs.abapgit.org)' + )->option( + iv_label = 'Prefix' + iv_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix + )->option( + iv_label = 'Full' + iv_value = zif_abapgit_dot_abapgit=>c_folder_logic-full + )->checkbox( + iv_name = c_id-master_lang_only + iv_label = 'Serialize master language only' + iv_hint = 'Ignore translations, serialize just master language' + )->command( + iv_label = 'Create offline repo' + iv_is_main = abap_true + iv_action = c_event-add_offline_repo + )->command( + iv_label = 'Create package' + iv_action = c_event-create_package + )->command( + iv_label = 'Back' + iv_action = c_event-go_back ). + + ENDMETHOD. + + + METHOD parse_form. + + DATA ls_field LIKE LINE OF it_form_fields. + + CREATE OBJECT ro_form_data. + + " temporary, TODO refactor later, after gui_event class is ready, move to on_event + LOOP AT it_form_fields INTO ls_field. + ro_form_data->set( + iv_key = ls_field-name + iv_val = ls_field-value ). + ENDLOOP. + + ro_form_data = mo_form->validate_normalize_form_data( ro_form_data ). + + ENDMETHOD. + + + METHOD validate_form. + + DATA lx_err TYPE REF TO zcx_abapgit_exception. + + ro_validation_log = mo_form->validate_required_fields( io_form_data ). + + IF io_form_data->get( c_id-package ) IS NOT INITIAL. + TRY. + zcl_abapgit_repo_srv=>get_instance( )->validate_package( + iv_package = |{ io_form_data->get( c_id-package ) }| ). + CATCH zcx_abapgit_exception INTO lx_err. + ro_validation_log->set( + iv_key = c_id-package + iv_val = lx_err->get_text( ) ). + ENDTRY. + ENDIF. + + IF io_form_data->get( c_id-folder_logic ) <> zif_abapgit_dot_abapgit=>c_folder_logic-prefix + AND io_form_data->get( c_id-folder_logic ) <> zif_abapgit_dot_abapgit=>c_folder_logic-full. + ro_validation_log->set( + iv_key = c_id-folder_logic + iv_val = |Invalid folder logic { io_form_data->get( c_id-folder_logic ) + }. Must be { zif_abapgit_dot_abapgit=>c_folder_logic-prefix + } or { zif_abapgit_dot_abapgit=>c_folder_logic-full } | ). + ENDIF. + + ENDMETHOD. + + + METHOD zif_abapgit_gui_event_handler~on_event. + + DATA: ls_repo_params TYPE zif_abapgit_services_repo=>ty_repo_params, + lo_new_offline_repo TYPE REF TO zcl_abapgit_repo_offline. + + " import data from html before re-render + mo_form_data = parse_form( zcl_abapgit_html_action_utils=>parse_post_form_data( ii_event->mt_postdata ) ). + + CASE ii_event->mv_action. + WHEN c_event-go_back. + rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back. + + WHEN c_event-create_package. + + mo_form_data->set( + iv_key = c_id-package + iv_val = zcl_abapgit_services_basis=>create_package( + iv_prefill_package = |{ mo_form_data->get( 'package' ) }| ) ). + IF mo_form_data->get( c_id-package ) IS NOT INITIAL. + mo_validation_log = validate_form( mo_form_data ). + rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. + ELSE. + rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act. + ENDIF. + + WHEN c_event-choose_package. + + mo_form_data->set( + iv_key = c_id-package + iv_val = zcl_abapgit_ui_factory=>get_popups( )->popup_search_help( 'TDEVC-DEVCLASS' ) ). + IF mo_form_data->get( c_id-package ) IS NOT INITIAL. + mo_validation_log = validate_form( mo_form_data ). + rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. + ELSE. + rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act. + ENDIF. + + WHEN c_event-add_offline_repo. + + mo_validation_log = validate_form( mo_form_data ). + + IF mo_validation_log->is_empty( ) = abap_true. + mo_form_data->to_abap( CHANGING cs_container = ls_repo_params ). + lo_new_offline_repo = zcl_abapgit_services_repo=>new_offline( ls_repo_params ). + CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_view_repo + EXPORTING + iv_key = lo_new_offline_repo->get_key( ). + rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing. + ELSE. + rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. " Display errors + ENDIF. + + ENDCASE. + + ENDMETHOD. + + + METHOD zif_abapgit_gui_renderable~render. + + gui_services( )->register_event_handler( me ). + + CREATE OBJECT ri_html TYPE zcl_abapgit_html. + + ri_html->add( mo_form->render( + iv_form_class = 'dialog w600px m-em5-sides margin-v1' " to center add wmax600px and auto-center instead + io_values = mo_form_data + io_validation_log = mo_validation_log ) ). + + ENDMETHOD. +ENDCLASS. diff --git a/src/ui/zcl_abapgit_gui_page_addofflin.clas.xml b/src/ui/zcl_abapgit_gui_page_addofflin.clas.xml new file mode 100644 index 000000000..7ce6015f5 --- /dev/null +++ b/src/ui/zcl_abapgit_gui_page_addofflin.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_GUI_PAGE_ADDOFFLIN + E + abapgit GUI add repo offline page + 1 + X + X + X + + + + diff --git a/src/ui/zcl_abapgit_gui_page_addonline.clas.abap b/src/ui/zcl_abapgit_gui_page_addonline.clas.abap index d0593d2f0..65b400eff 100644 --- a/src/ui/zcl_abapgit_gui_page_addonline.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_addonline.clas.abap @@ -102,52 +102,52 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_ADDONLINE IMPLEMENTATION. iv_required = abap_true iv_label = 'Git repository URL' iv_hint = 'HTTPS address of the repository to clone' - iv_placeholder = 'https://github.com/...git' ). - ro_form->text( + iv_placeholder = 'https://github.com/...git' + )->text( iv_name = c_id-package iv_side_action = c_event-choose_package iv_required = abap_true iv_upper_case = abap_true iv_label = 'Package' iv_hint = 'SAP package for the code (should be a dedicated one)' - iv_placeholder = 'Z... / $...' ). - ro_form->text( + iv_placeholder = 'Z... / $...' + )->text( iv_name = c_id-branch_name iv_side_action = c_event-choose_branch iv_label = 'Branch' iv_hint = 'Switch to a specific branch on clone (default: master)' - iv_placeholder = 'master' ). - ro_form->radio( + iv_placeholder = 'master' + )->radio( iv_name = c_id-folder_logic iv_default_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix iv_label = 'Folder logic' - iv_hint = 'Define how package folders are named in the repo (see https://docs.abapgit.org)' ). - ro_form->option( + iv_hint = 'Define how package folders are named in the repo (see https://docs.abapgit.org)' + )->option( iv_label = 'Prefix' - iv_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix ). - ro_form->option( + iv_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix + )->option( iv_label = 'Full' - iv_value = zif_abapgit_dot_abapgit=>c_folder_logic-full ). - ro_form->text( + iv_value = zif_abapgit_dot_abapgit=>c_folder_logic-full + )->text( iv_name = c_id-display_name iv_label = 'Display name' - iv_hint = 'Name to show instead of original repo name (optional)' ). - ro_form->checkbox( + iv_hint = 'Name to show instead of original repo name (optional)' + )->checkbox( iv_name = c_id-ignore_subpackages iv_label = 'Ignore subpackages' - iv_hint = 'Syncronize root package only (see https://docs.abapgit.org)' ). - ro_form->checkbox( + iv_hint = 'Syncronize root package only (see https://docs.abapgit.org)' + )->checkbox( iv_name = c_id-master_lang_only iv_label = 'Serialize master language only' - iv_hint = 'Ignore translations, serialize just master language' ). - ro_form->command( + iv_hint = 'Ignore translations, serialize just master language' + )->command( iv_label = 'Clone online repo' iv_is_main = abap_true - iv_action = c_event-add_online_repo ). - ro_form->command( + iv_action = c_event-add_online_repo + )->command( iv_label = 'Create package' - iv_action = c_event-create_package ). - ro_form->command( + iv_action = c_event-create_package + )->command( iv_label = 'Back' iv_action = c_event-go_back ). @@ -176,13 +176,9 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_ADDONLINE IMPLEMENTATION. DATA lx_err TYPE REF TO zcx_abapgit_exception. - CREATE OBJECT ro_validation_log. + ro_validation_log = mo_form->validate_required_fields( io_form_data ). - IF io_form_data->get( c_id-url ) IS INITIAL. - ro_validation_log->set( - iv_key = c_id-url - iv_val = 'Url cannot be empty' ). - ELSE. + IF io_form_data->get( c_id-url ) IS NOT INITIAL. TRY. zcl_abapgit_url=>validate( io_form_data->get( c_id-url ) ). CATCH zcx_abapgit_exception INTO lx_err. @@ -192,11 +188,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_ADDONLINE IMPLEMENTATION. ENDTRY. ENDIF. - IF io_form_data->get( c_id-package ) IS INITIAL. - ro_validation_log->set( - iv_key = c_id-package - iv_val = 'Package cannot be empty' ). - ELSE. + IF io_form_data->get( c_id-package ) IS NOT INITIAL. TRY. zcl_abapgit_repo_srv=>get_instance( )->validate_package( iv_package = |{ io_form_data->get( c_id-package ) }| diff --git a/src/ui/zcl_abapgit_gui_router.clas.abap b/src/ui/zcl_abapgit_gui_router.clas.abap index 06a4535dd..23a051c36 100644 --- a/src/ui/zcl_abapgit_gui_router.clas.abap +++ b/src/ui/zcl_abapgit_gui_router.clas.abap @@ -12,21 +12,21 @@ CLASS zcl_abapgit_gui_router DEFINITION METHODS general_page_routing IMPORTING - !ii_event TYPE REF TO zif_abapgit_gui_event + !ii_event TYPE REF TO zif_abapgit_gui_event RETURNING VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result RAISING zcx_abapgit_exception. METHODS abapgit_services_actions IMPORTING - !ii_event TYPE REF TO zif_abapgit_gui_event + !ii_event TYPE REF TO zif_abapgit_gui_event RETURNING VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result RAISING zcx_abapgit_exception. METHODS db_actions IMPORTING - !ii_event TYPE REF TO zif_abapgit_gui_event + !ii_event TYPE REF TO zif_abapgit_gui_event RETURNING VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result RAISING @@ -39,63 +39,63 @@ CLASS zcl_abapgit_gui_router DEFINITION zcx_abapgit_exception . METHODS git_services IMPORTING - !ii_event TYPE REF TO zif_abapgit_gui_event + !ii_event TYPE REF TO zif_abapgit_gui_event RETURNING VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result RAISING zcx_abapgit_exception. METHODS remote_origin_manipulations IMPORTING - !ii_event TYPE REF TO zif_abapgit_gui_event + !ii_event TYPE REF TO zif_abapgit_gui_event RETURNING VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result RAISING zcx_abapgit_exception. METHODS sap_gui_actions IMPORTING - !ii_event TYPE REF TO zif_abapgit_gui_event + !ii_event TYPE REF TO zif_abapgit_gui_event RETURNING VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result RAISING zcx_abapgit_exception. METHODS other_utilities IMPORTING - !ii_event TYPE REF TO zif_abapgit_gui_event + !ii_event TYPE REF TO zif_abapgit_gui_event RETURNING VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result RAISING zcx_abapgit_exception. METHODS zip_services IMPORTING - !ii_event TYPE REF TO zif_abapgit_gui_event + !ii_event TYPE REF TO zif_abapgit_gui_event RETURNING VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result RAISING zcx_abapgit_exception. METHODS repository_services IMPORTING - !ii_event TYPE REF TO zif_abapgit_gui_event + !ii_event TYPE REF TO zif_abapgit_gui_event RETURNING VALUE(rs_handled) TYPE zif_abapgit_gui_event_handler=>ty_handling_result RAISING zcx_abapgit_exception. METHODS get_page_diff IMPORTING - !ii_event TYPE REF TO zif_abapgit_gui_event + !ii_event TYPE REF TO zif_abapgit_gui_event RETURNING VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable RAISING zcx_abapgit_exception . METHODS get_page_branch_overview IMPORTING - !iv_key TYPE zif_abapgit_persistence=>ty_repo-key + !iv_key TYPE zif_abapgit_persistence=>ty_repo-key RETURNING VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable RAISING zcx_abapgit_exception . METHODS get_page_stage IMPORTING - !ii_event TYPE REF TO zif_abapgit_gui_event + !ii_event TYPE REF TO zif_abapgit_gui_event RETURNING VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable RAISING @@ -505,8 +505,8 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION. CASE ii_event->mv_action. WHEN zif_abapgit_definitions=>c_action-repo_newoffline. " New offline repo - zcl_abapgit_services_repo=>new_offline( ). - rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. + rs_handled-page = zcl_abapgit_gui_page_addofflin=>create( ). + rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page. WHEN zif_abapgit_definitions=>c_action-repo_add_all_obj_to_trans_req. zcl_abapgit_transport=>add_all_objects_to_trans_req( lv_key ). rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. @@ -620,11 +620,11 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION. METHOD zip_services. - DATA: lv_key TYPE zif_abapgit_persistence=>ty_repo-key, - lo_repo TYPE REF TO zcl_abapgit_repo, - lv_package TYPE devclass, - lv_path TYPE string, - lv_xstr TYPE xstring. + DATA: lv_key TYPE zif_abapgit_persistence=>ty_repo-key, + lo_repo TYPE REF TO zcl_abapgit_repo, + lv_package TYPE devclass, + lv_path TYPE string, + lv_xstr TYPE xstring. " TODO refactor CONSTANTS: diff --git a/src/ui/zcl_abapgit_html_form.clas.abap b/src/ui/zcl_abapgit_html_form.clas.abap index 2df378d6f..d1eb3311a 100644 --- a/src/ui/zcl_abapgit_html_form.clas.abap +++ b/src/ui/zcl_abapgit_html_form.clas.abap @@ -7,79 +7,77 @@ CLASS zcl_abapgit_html_form DEFINITION CLASS-METHODS create IMPORTING - iv_form_id TYPE string OPTIONAL + !iv_form_id TYPE string OPTIONAL RETURNING - VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form. - + VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form . METHODS render IMPORTING - iv_form_class TYPE string - io_values TYPE REF TO zcl_abapgit_string_map - io_validation_log TYPE REF TO zcl_abapgit_string_map OPTIONAL + !iv_form_class TYPE string + !io_values TYPE REF TO zcl_abapgit_string_map + !io_validation_log TYPE REF TO zcl_abapgit_string_map OPTIONAL RETURNING - VALUE(ri_html) TYPE REF TO zif_abapgit_html. - + VALUE(ri_html) TYPE REF TO zif_abapgit_html . METHODS command IMPORTING - iv_label TYPE string - iv_action TYPE string - iv_is_main TYPE abap_bool DEFAULT abap_false - iv_as_a TYPE abap_bool DEFAULT abap_false + !iv_label TYPE string + !iv_action TYPE string + !iv_is_main TYPE abap_bool DEFAULT abap_false + !iv_as_a TYPE abap_bool DEFAULT abap_false RETURNING - VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form. - + VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . METHODS text IMPORTING - iv_label TYPE string - iv_name TYPE string - iv_hint TYPE string OPTIONAL - iv_required TYPE abap_bool DEFAULT abap_false - iv_upper_case TYPE abap_bool DEFAULT abap_false - iv_placeholder TYPE string OPTIONAL - iv_side_action TYPE string OPTIONAL + !iv_label TYPE string + !iv_name TYPE string + !iv_hint TYPE string OPTIONAL + !iv_required TYPE abap_bool DEFAULT abap_false + !iv_upper_case TYPE abap_bool DEFAULT abap_false + !iv_placeholder TYPE string OPTIONAL + !iv_side_action TYPE string OPTIONAL RETURNING - VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form. - + VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . METHODS checkbox IMPORTING - iv_label TYPE string - iv_name TYPE string - iv_hint TYPE string OPTIONAL + !iv_label TYPE string + !iv_name TYPE string + !iv_hint TYPE string OPTIONAL RETURNING - VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form. - + VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . METHODS radio IMPORTING - iv_label TYPE string - iv_name TYPE string - iv_default_value TYPE string OPTIONAL - iv_hint TYPE string OPTIONAL + !iv_label TYPE string + !iv_name TYPE string + !iv_default_value TYPE string OPTIONAL + !iv_hint TYPE string OPTIONAL RETURNING - VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form. - + VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . METHODS option IMPORTING - iv_label TYPE string - iv_value TYPE string + !iv_label TYPE string + !iv_value TYPE string RETURNING - VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form. - + VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . METHODS start_group IMPORTING - iv_label TYPE string - iv_name TYPE string - iv_hint TYPE string OPTIONAL + !iv_label TYPE string + !iv_name TYPE string + !iv_hint TYPE string OPTIONAL RETURNING - VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form. - + VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . METHODS validate_normalize_form_data IMPORTING - io_form_data TYPE REF TO zcl_abapgit_string_map + !io_form_data TYPE REF TO zcl_abapgit_string_map RETURNING VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map RAISING - zcx_abapgit_exception. - + zcx_abapgit_exception . + METHODS validate_required_fields + IMPORTING + !io_form_data TYPE REF TO zcl_abapgit_string_map + RETURNING + VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map + RAISING + zcx_abapgit_exception . PROTECTED SECTION. PRIVATE SECTION. @@ -500,4 +498,27 @@ CLASS ZCL_ABAPGIT_HTML_FORM IMPLEMENTATION. ENDLOOP. ENDMETHOD. + + + METHOD validate_required_fields. + + DATA ls_field LIKE LINE OF mt_fields. + FIELD-SYMBOLS LIKE LINE OF io_form_data->mt_entries. + + CREATE OBJECT ro_validation_log. + + LOOP AT io_form_data->mt_entries ASSIGNING . + READ TABLE mt_fields INTO ls_field WITH KEY by_name COMPONENTS name = -k. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |Unexpected form field [{ -k }]| ). + ENDIF. + + IF ls_field-required IS NOT INITIAL AND -v IS INITIAL. + ro_validation_log->set( + iv_key = ls_field-name + iv_val = |{ ls_field-label } cannot be empty| ). + ENDIF. + ENDLOOP. + + ENDMETHOD. ENDCLASS. diff --git a/src/ui/zcl_abapgit_popups.clas.abap b/src/ui/zcl_abapgit_popups.clas.abap index 66e63361d..e80ddb2e1 100644 --- a/src/ui/zcl_abapgit_popups.clas.abap +++ b/src/ui/zcl_abapgit_popups.clas.abap @@ -2,31 +2,46 @@ CLASS zcl_abapgit_popups DEFINITION PUBLIC FINAL CREATE PRIVATE - GLOBAL FRIENDS zcl_abapgit_ui_factory. + GLOBAL FRIENDS zcl_abapgit_ui_factory . PUBLIC SECTION. - CONSTANTS: c_default_column TYPE lvc_fname VALUE `DEFAULT_COLUMN` ##NO_TEXT. - INTERFACES: zif_abapgit_popups. - ALIASES: - popup_package_export FOR zif_abapgit_popups~popup_package_export, - popup_folder_logic FOR zif_abapgit_popups~popup_folder_logic, - popup_object FOR zif_abapgit_popups~popup_object, - create_branch_popup FOR zif_abapgit_popups~create_branch_popup, - repo_new_offline FOR zif_abapgit_popups~repo_new_offline, - branch_list_popup FOR zif_abapgit_popups~branch_list_popup, - repo_popup FOR zif_abapgit_popups~repo_popup, - popup_to_confirm FOR zif_abapgit_popups~popup_to_confirm, - popup_to_inform FOR zif_abapgit_popups~popup_to_inform, - popup_to_create_package FOR zif_abapgit_popups~popup_to_create_package, - popup_to_create_transp_branch FOR zif_abapgit_popups~popup_to_create_transp_branch, - popup_to_select_transports FOR zif_abapgit_popups~popup_to_select_transports, - popup_to_select_from_list FOR zif_abapgit_popups~popup_to_select_from_list, - branch_popup_callback FOR zif_abapgit_popups~branch_popup_callback, - package_popup_callback FOR zif_abapgit_popups~package_popup_callback, - popup_transport_request FOR zif_abapgit_popups~popup_transport_request, - popup_proxy_bypass FOR zif_abapgit_popups~popup_proxy_bypass. + INTERFACES zif_abapgit_popups . + ALIASES branch_list_popup + FOR zif_abapgit_popups~branch_list_popup . + ALIASES branch_popup_callback + FOR zif_abapgit_popups~branch_popup_callback . + ALIASES create_branch_popup + FOR zif_abapgit_popups~create_branch_popup . + ALIASES package_popup_callback + FOR zif_abapgit_popups~package_popup_callback . + ALIASES popup_folder_logic + FOR zif_abapgit_popups~popup_folder_logic . + ALIASES popup_object + FOR zif_abapgit_popups~popup_object . + ALIASES popup_package_export + FOR zif_abapgit_popups~popup_package_export . + ALIASES popup_proxy_bypass + FOR zif_abapgit_popups~popup_proxy_bypass . + ALIASES popup_to_confirm + FOR zif_abapgit_popups~popup_to_confirm . + ALIASES popup_to_create_package + FOR zif_abapgit_popups~popup_to_create_package . + ALIASES popup_to_create_transp_branch + FOR zif_abapgit_popups~popup_to_create_transp_branch . + ALIASES popup_to_inform + FOR zif_abapgit_popups~popup_to_inform . + ALIASES popup_to_select_from_list + FOR zif_abapgit_popups~popup_to_select_from_list . + ALIASES popup_to_select_transports + FOR zif_abapgit_popups~popup_to_select_transports . + ALIASES popup_transport_request + FOR zif_abapgit_popups~popup_transport_request . + ALIASES repo_popup + FOR zif_abapgit_popups~repo_popup . + + CONSTANTS c_default_column TYPE lvc_fname VALUE `DEFAULT_COLUMN` ##NO_TEXT. PROTECTED SECTION. PRIVATE SECTION. @@ -1264,113 +1279,6 @@ CLASS ZCL_ABAPGIT_POPUPS IMPLEMENTATION. ENDMETHOD. - METHOD zif_abapgit_popups~repo_new_offline. - - DATA: lv_returncode TYPE c, - lt_fields TYPE TABLE OF sval, - lv_icon_ok TYPE icon-name, - lv_button1 TYPE svalbutton-buttontext, - lv_icon1 TYPE icon-name, - lv_finished TYPE abap_bool, - lx_error TYPE REF TO zcx_abapgit_exception. - - FIELD-SYMBOLS: LIKE LINE OF lt_fields. - - - add_field( EXPORTING iv_tabname = 'ABAPTXT255' - iv_fieldname = 'LINE' - iv_fieldtext = 'Name' - iv_obligatory = abap_true - CHANGING ct_fields = lt_fields ). - - add_field( EXPORTING iv_tabname = 'TDEVC' - iv_fieldname = 'DEVCLASS' - iv_fieldtext = 'Package' - iv_obligatory = abap_true - CHANGING ct_fields = lt_fields ). - - add_field( EXPORTING iv_tabname = 'ZABAPGIT' - iv_fieldname = 'VALUE' - iv_fieldtext = 'Folder logic' - iv_obligatory = abap_true - iv_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix - CHANGING ct_fields = lt_fields ). - - add_field( EXPORTING iv_tabname = 'DOKIL' - iv_fieldname = 'MASTERLANG' - iv_fieldtext = 'Master language only' - iv_value = abap_true - CHANGING ct_fields = lt_fields ). - - WHILE lv_finished = abap_false. - - lv_icon_ok = icon_okay. - lv_button1 = 'Create package'. - lv_icon1 = icon_folder. - - CALL FUNCTION 'POPUP_GET_VALUES_USER_BUTTONS' - EXPORTING - popup_title = 'New Offline Project' - programname = sy-cprog - formname = 'PACKAGE_POPUP' - ok_pushbuttontext = 'OK' - icon_ok_push = lv_icon_ok - first_pushbutton = lv_button1 - icon_button_1 = lv_icon1 - second_pushbutton = '' - icon_button_2 = '' - IMPORTING - returncode = lv_returncode - TABLES - fields = lt_fields - EXCEPTIONS - error_in_fields = 1 - OTHERS = 2. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'Error from POPUP_GET_VALUES' ). - ENDIF. - - IF lv_returncode = c_answer_cancel. - rs_popup-cancel = abap_true. - RETURN. - ENDIF. - - READ TABLE lt_fields INDEX 1 ASSIGNING . - ASSERT sy-subrc = 0. - rs_popup-url = -value. - - READ TABLE lt_fields INDEX 2 ASSIGNING . - ASSERT sy-subrc = 0. - TRANSLATE -value TO UPPER CASE. - rs_popup-package = -value. - - READ TABLE lt_fields INDEX 3 ASSIGNING . - ASSERT sy-subrc = 0. - TRANSLATE -value TO UPPER CASE. - rs_popup-folder_logic = -value. - - READ TABLE lt_fields INDEX 4 ASSIGNING . - ASSERT sy-subrc = 0. - rs_popup-master_lang_only = -value. - - lv_finished = abap_true. - - TRY. - zcl_abapgit_repo_srv=>get_instance( )->validate_package( iv_package = rs_popup-package - iv_chk_exists = abap_false ). - validate_folder_logic( rs_popup-folder_logic ). - - CATCH zcx_abapgit_exception INTO lx_error. - " in case of validation errors we display the popup again - MESSAGE lx_error TYPE 'S' DISPLAY LIKE 'E'. - CLEAR lv_finished. - ENDTRY. - - ENDWHILE. - - ENDMETHOD. - - METHOD zif_abapgit_popups~repo_popup. DATA: lv_returncode TYPE c, diff --git a/src/ui/zcl_abapgit_services_repo.clas.abap b/src/ui/zcl_abapgit_services_repo.clas.abap index 8bb8f451f..4d0889a89 100644 --- a/src/ui/zcl_abapgit_services_repo.clas.abap +++ b/src/ui/zcl_abapgit_services_repo.clas.abap @@ -11,7 +11,7 @@ CLASS zcl_abapgit_services_repo DEFINITION RETURNING VALUE(ro_repo) TYPE REF TO zcl_abapgit_repo_online RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . CLASS-METHODS refresh IMPORTING !iv_key TYPE zif_abapgit_persistence=>ty_repo-key @@ -21,35 +21,39 @@ CLASS zcl_abapgit_services_repo DEFINITION IMPORTING !iv_key TYPE zif_abapgit_persistence=>ty_repo-key RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . CLASS-METHODS purge IMPORTING !iv_key TYPE zif_abapgit_persistence=>ty_repo-key RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . CLASS-METHODS new_offline + IMPORTING + !is_repo_params TYPE zif_abapgit_services_repo=>ty_repo_params + RETURNING + VALUE(ro_repo) TYPE REF TO zcl_abapgit_repo_offline RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . CLASS-METHODS remote_attach IMPORTING !iv_key TYPE zif_abapgit_persistence=>ty_repo-key RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . CLASS-METHODS remote_detach IMPORTING !iv_key TYPE zif_abapgit_persistence=>ty_repo-key RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . CLASS-METHODS remote_change IMPORTING !iv_key TYPE zif_abapgit_persistence=>ty_repo-key RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . CLASS-METHODS refresh_local_checksums IMPORTING !iv_key TYPE zif_abapgit_persistence=>ty_repo-key RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . CLASS-METHODS toggle_favorite IMPORTING !iv_key TYPE zif_abapgit_persistence=>ty_repo-key @@ -59,7 +63,7 @@ CLASS zcl_abapgit_services_repo DEFINITION IMPORTING !iv_repository_key TYPE zif_abapgit_persistence=>ty_value RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . CLASS-METHODS gui_deserialize IMPORTING !io_repo TYPE REF TO zcl_abapgit_repo @@ -78,11 +82,41 @@ CLASS zcl_abapgit_services_repo DEFINITION !ct_overwrite TYPE zif_abapgit_definitions=>ty_overwrite_tt RAISING zcx_abapgit_exception. + CLASS-METHODS check_package + IMPORTING + !is_repo_params TYPE zif_abapgit_services_repo=>ty_repo_params + RAISING + zcx_abapgit_exception . ENDCLASS. -CLASS zcl_abapgit_services_repo IMPLEMENTATION. +CLASS ZCL_ABAPGIT_SERVICES_REPO IMPLEMENTATION. + + + METHOD check_package. + + DATA: + lo_repo TYPE REF TO zcl_abapgit_repo, + li_repo_srv TYPE REF TO zif_abapgit_repo_srv, + lv_reason TYPE string. + + " make sure package is not already in use for a different repository + " 702: chaining calls with exp&imp parameters causes syntax error + li_repo_srv = zcl_abapgit_repo_srv=>get_instance( ). + li_repo_srv->get_repo_from_package( + EXPORTING + iv_package = is_repo_params-package + iv_ign_subpkg = is_repo_params-ignore_subpackages + IMPORTING + eo_repo = lo_repo + ev_reason = lv_reason ). + + IF lo_repo IS BOUND. + zcx_abapgit_exception=>raise( lv_reason ). + ENDIF. + + ENDMETHOD. METHOD gui_deserialize. @@ -129,73 +163,32 @@ CLASS zcl_abapgit_services_repo IMPLEMENTATION. METHOD new_offline. - DATA: ls_popup TYPE zif_abapgit_popups=>ty_popup, - lo_repo TYPE REF TO zcl_abapgit_repo, - lo_repo_offline TYPE REF TO zcl_abapgit_repo_offline, - li_repo_srv TYPE REF TO zif_abapgit_repo_srv, - lv_reason TYPE string. + check_package( is_repo_params ). - ls_popup = zcl_abapgit_ui_factory=>get_popups( )->repo_new_offline( ). - IF ls_popup-cancel = abap_true. - RAISE EXCEPTION TYPE zcx_abapgit_cancel. - ENDIF. + " create new repo and add to favorites + ro_repo = zcl_abapgit_repo_srv=>get_instance( )->new_offline( + iv_url = is_repo_params-url + iv_package = is_repo_params-package + iv_folder_logic = is_repo_params-folder_logic + iv_master_lang_only = is_repo_params-master_lang_only ). - " make sure package is not already in use for a different repository - " 702: chaining calls with exp&imp parameters causes syntax error - li_repo_srv = zcl_abapgit_repo_srv=>get_instance( ). - li_repo_srv->get_repo_from_package( - EXPORTING - iv_package = ls_popup-package - IMPORTING - eo_repo = lo_repo - ev_reason = lv_reason ). + " Make sure there're no leftovers from previous repos + ro_repo->rebuild_local_checksums( ). - IF lo_repo IS BOUND. - MESSAGE lv_reason TYPE 'S'. - ELSE. - " create new repo and add to favorites - lo_repo_offline = zcl_abapgit_repo_srv=>get_instance( )->new_offline( - iv_url = ls_popup-url - iv_package = ls_popup-package - iv_folder_logic = ls_popup-folder_logic - iv_master_lang_only = ls_popup-master_lang_only ). - - lo_repo_offline->rebuild_local_checksums( ). - - lo_repo ?= lo_repo_offline. - - toggle_favorite( lo_repo->get_key( ) ). - ENDIF. + toggle_favorite( ro_repo->get_key( ) ). " Set default repo for user - zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lo_repo->get_key( ) ). + zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( ro_repo->get_key( ) ). COMMIT WORK AND WAIT. + ENDMETHOD. METHOD new_online. - DATA: - lo_repo TYPE REF TO zcl_abapgit_repo, - li_repo_srv TYPE REF TO zif_abapgit_repo_srv, - lv_reason TYPE string. - - " make sure package is not already in use for a different repository - " 702: chaining calls with exp&imp parameters causes syntax error - li_repo_srv = zcl_abapgit_repo_srv=>get_instance( ). - li_repo_srv->get_repo_from_package( - EXPORTING - iv_package = is_repo_params-package - iv_ign_subpkg = is_repo_params-ignore_subpackages - IMPORTING - eo_repo = lo_repo - ev_reason = lv_reason ). - - IF lo_repo IS BOUND. - zcx_abapgit_exception=>raise( lv_reason ). - ENDIF. + check_package( is_repo_params ). ro_repo = zcl_abapgit_repo_srv=>get_instance( )->new_online( iv_url = is_repo_params-url @@ -206,12 +199,15 @@ CLASS zcl_abapgit_services_repo IMPLEMENTATION. iv_ign_subpkg = is_repo_params-ignore_subpackages iv_master_lang_only = is_repo_params-master_lang_only ). + " Make sure there're no leftovers from previous repos + ro_repo->rebuild_local_checksums( ). + toggle_favorite( ro_repo->get_key( ) ). " Set default repo for user zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( ro_repo->get_key( ) ). - COMMIT WORK. + COMMIT WORK AND WAIT. ENDMETHOD. diff --git a/src/ui/zcl_abapgit_ui_injector.clas.testclasses.abap b/src/ui/zcl_abapgit_ui_injector.clas.testclasses.abap index 46dfac4a3..a687fca9e 100644 --- a/src/ui/zcl_abapgit_ui_injector.clas.testclasses.abap +++ b/src/ui/zcl_abapgit_ui_injector.clas.testclasses.abap @@ -84,10 +84,6 @@ CLASS ltcl_abapgit_popups_mock IMPLEMENTATION. ENDMETHOD. - METHOD zif_abapgit_popups~repo_new_offline. - - ENDMETHOD. - METHOD zif_abapgit_popups~repo_popup. ENDMETHOD. diff --git a/src/ui/zif_abapgit_popups.intf.abap b/src/ui/zif_abapgit_popups.intf.abap index 75bf30713..e64efb453 100644 --- a/src/ui/zif_abapgit_popups.intf.abap +++ b/src/ui/zif_abapgit_popups.intf.abap @@ -42,15 +42,10 @@ INTERFACE zif_abapgit_popups zcx_abapgit_exception . METHODS create_branch_popup IMPORTING - iv_source_branch_name TYPE string + !iv_source_branch_name TYPE string EXPORTING - !ev_name TYPE string - !ev_cancel TYPE abap_bool - RAISING - zcx_abapgit_exception . - METHODS repo_new_offline - RETURNING - VALUE(rs_popup) TYPE ty_popup + !ev_name TYPE string + !ev_cancel TYPE abap_bool RAISING zcx_abapgit_exception . METHODS branch_list_popup @@ -109,23 +104,23 @@ INTERFACE zif_abapgit_popups RETURNING VALUE(rs_transport_branch) TYPE zif_abapgit_definitions=>ty_transport_to_branch RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . METHODS popup_to_select_transports RETURNING VALUE(rt_trkorr) TYPE trwbo_request_headers . METHODS popup_to_select_from_list IMPORTING !it_list TYPE STANDARD TABLE - !iv_title TYPE lvc_title DEFAULT space - !iv_header_text TYPE csequence DEFAULT space - !iv_start_column TYPE i DEFAULT 2 - !iv_end_column TYPE i DEFAULT 65 - !iv_start_line TYPE i DEFAULT 8 - !iv_end_line TYPE i DEFAULT 20 - !iv_striped_pattern TYPE abap_bool DEFAULT abap_false - !iv_optimize_col_width TYPE abap_bool DEFAULT abap_true + !iv_title TYPE lvc_title DEFAULT space + !iv_header_text TYPE csequence DEFAULT space + !iv_start_column TYPE i DEFAULT 2 + !iv_end_column TYPE i DEFAULT 65 + !iv_start_line TYPE i DEFAULT 8 + !iv_end_line TYPE i DEFAULT 20 + !iv_striped_pattern TYPE abap_bool DEFAULT abap_false + !iv_optimize_col_width TYPE abap_bool DEFAULT abap_true !iv_selection_mode TYPE salv_de_constant DEFAULT if_salv_c_selection_mode=>multiple - !iv_select_column_text TYPE csequence DEFAULT space + !iv_select_column_text TYPE csequence DEFAULT space !it_columns_to_display TYPE zif_abapgit_definitions=>ty_alv_column_tt EXPORTING VALUE(et_list) TYPE STANDARD TABLE @@ -155,29 +150,29 @@ INTERFACE zif_abapgit_popups RETURNING VALUE(rv_transport) TYPE trkorr RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . METHODS popup_proxy_bypass IMPORTING !it_proxy_bypass TYPE zif_abapgit_definitions=>ty_range_proxy_bypass_url RETURNING VALUE(rt_proxy_bypass) TYPE zif_abapgit_definitions=>ty_range_proxy_bypass_url RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . METHODS choose_pr_popup IMPORTING - it_pulls TYPE zif_abapgit_pr_enum_provider=>tty_pulls + !it_pulls TYPE zif_abapgit_pr_enum_provider=>tty_pulls RETURNING VALUE(rs_pull) TYPE zif_abapgit_pr_enum_provider=>ty_pull_request RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . METHODS popup_perf_test_parameters EXPORTING - et_object_type_filter TYPE zif_abapgit_definitions=>ty_object_type_range - et_object_name_filter TYPE zif_abapgit_definitions=>ty_object_name_range + !et_object_type_filter TYPE zif_abapgit_definitions=>ty_object_type_range + !et_object_name_filter TYPE zif_abapgit_definitions=>ty_object_name_range CHANGING - cv_package TYPE devclass - cv_include_sub_packages TYPE abap_bool - cv_serialize_master_lang_only TYPE abap_bool + !cv_package TYPE devclass + !cv_include_sub_packages TYPE abap_bool + !cv_serialize_master_lang_only TYPE abap_bool RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . ENDINTERFACE. diff --git a/src/zcl_abapgit_repo_srv.clas.abap b/src/zcl_abapgit_repo_srv.clas.abap index b0cc75ab5..d9bc0785a 100644 --- a/src/zcl_abapgit_repo_srv.clas.abap +++ b/src/zcl_abapgit_repo_srv.clas.abap @@ -365,6 +365,10 @@ CLASS ZCL_ABAPGIT_REPO_SRV IMPLEMENTATION. validate_package( iv_package ). + IF iv_url IS INITIAL. + zcx_abapgit_exception=>raise( 'Missing display name for repo' ). + ENDIF. + lo_dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( ). lo_dot_abapgit->set_folder_logic( iv_folder_logic ).