diff --git a/src/git_platform/zcl_abapgit_pr_enumerator.clas.abap b/src/git_platform/zcl_abapgit_pr_enumerator.clas.abap index af68ab9b5..6d731a02f 100644 --- a/src/git_platform/zcl_abapgit_pr_enumerator.clas.abap +++ b/src/git_platform/zcl_abapgit_pr_enumerator.clas.abap @@ -7,7 +7,7 @@ CLASS zcl_abapgit_pr_enumerator DEFINITION METHODS constructor IMPORTING - io_repo TYPE REF TO zcl_abapgit_repo + iv_url TYPE string RAISING zcx_abapgit_exception. @@ -19,7 +19,7 @@ CLASS zcl_abapgit_pr_enumerator DEFINITION CLASS-METHODS new IMPORTING - io_repo TYPE REF TO zcl_abapgit_repo + iv_url TYPE string RETURNING VALUE(ro_instance) TYPE REF TO zcl_abapgit_pr_enumerator RAISING @@ -32,7 +32,7 @@ CLASS zcl_abapgit_pr_enumerator DEFINITION CLASS-METHODS create_provider IMPORTING - iv_repo_url TYPE string + iv_repo_url TYPE string RETURNING VALUE(ri_provider) TYPE REF TO zif_abapgit_pr_enum_provider RAISING @@ -42,19 +42,12 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_PR_ENUMERATOR IMPLEMENTATION. +CLASS zcl_abapgit_pr_enumerator IMPLEMENTATION. METHOD constructor. - DATA lo_repo_online TYPE REF TO zcl_abapgit_repo_online. - - IF io_repo IS NOT BOUND OR io_repo->is_offline( ) = abap_true. - RETURN. - ENDIF. - - lo_repo_online ?= io_repo. - mv_repo_url = to_lower( lo_repo_online->get_url( ) ). + mv_repo_url = to_lower( iv_url ). TRY. mi_enum_provider = create_provider( mv_repo_url ). CATCH zcx_abapgit_exception. @@ -81,8 +74,8 @@ CLASS ZCL_ABAPGIT_PR_ENUMERATOR IMPLEMENTATION. with = '' ). CREATE OBJECT ri_provider TYPE zcl_abapgit_pr_enum_github EXPORTING - iv_user_and_repo = |{ lv_user }/{ lv_repo }| - ii_http_agent = li_agent. + iv_user_and_repo = |{ lv_user }/{ lv_repo }| + ii_http_agent = li_agent. ELSE. zcx_abapgit_exception=>raise( |PR enumeration is not supported for { iv_repo_url }| ). ENDIF. @@ -104,6 +97,6 @@ CLASS ZCL_ABAPGIT_PR_ENUMERATOR IMPLEMENTATION. METHOD new. - CREATE OBJECT ro_instance EXPORTING io_repo = io_repo. + CREATE OBJECT ro_instance EXPORTING iv_url = iv_url. ENDMETHOD. ENDCLASS. diff --git a/src/repo/zcl_abapgit_repo_online.clas.abap b/src/repo/zcl_abapgit_repo_online.clas.abap index 59db7d897..3cda5576a 100644 --- a/src/repo/zcl_abapgit_repo_online.clas.abap +++ b/src/repo/zcl_abapgit_repo_online.clas.abap @@ -28,6 +28,8 @@ CLASS zcl_abapgit_repo_online DEFINITION FOR zif_abapgit_repo_online~set_url . ALIASES switch_origin FOR zif_abapgit_repo_online~switch_origin . + ALIASES get_switched_origin + FOR zif_abapgit_repo_online~get_switched_origin. METHODS check_and_create_package IMPORTING @@ -385,4 +387,8 @@ CLASS ZCL_ABAPGIT_REPO_ONLINE IMPLEMENTATION. ENDIF. ENDMETHOD. + + METHOD zif_abapgit_repo_online~get_switched_origin. + rv_switched_origin = ms_data-switched_origin. + ENDMETHOD. ENDCLASS. diff --git a/src/repo/zif_abapgit_repo_online.intf.abap b/src/repo/zif_abapgit_repo_online.intf.abap index 13ac517f7..be836fab5 100644 --- a/src/repo/zif_abapgit_repo_online.intf.abap +++ b/src/repo/zif_abapgit_repo_online.intf.abap @@ -40,6 +40,9 @@ INTERFACE zif_abapgit_repo_online !iv_overwrite TYPE abap_bool DEFAULT abap_false RAISING zcx_abapgit_exception . + METHODS get_switched_origin + RETURNING + VALUE(rv_switched_origin) TYPE zif_abapgit_persistence=>ty_repo-switched_origin. METHODS push IMPORTING !is_comment TYPE zif_abapgit_definitions=>ty_comment diff --git a/src/ui/zabapgit_css_common.w3mi.data.css b/src/ui/zabapgit_css_common.w3mi.data.css index 977999886..e36cdec08 100644 --- a/src/ui/zabapgit_css_common.w3mi.data.css +++ b/src/ui/zabapgit_css_common.w3mi.data.css @@ -1196,6 +1196,9 @@ settings_tab tr:first-child td { border-top: 0px; } margin: 4px 0px; padding-left: 0.5em; } +.dialog li.hidden { + padding: 0px 0px; +} .dialog .radio-container { border: 1px solid; display: inline-block; diff --git a/src/ui/zcl_abapgit_gui_page_sett_remo.clas.abap b/src/ui/zcl_abapgit_gui_page_sett_remo.clas.abap index 7db892665..11baf2f98 100644 --- a/src/ui/zcl_abapgit_gui_page_sett_remo.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_sett_remo.clas.abap @@ -32,125 +32,167 @@ CLASS zcl_abapgit_gui_page_sett_remo DEFINITION datetime TYPE c LENGTH 20, END OF ty_commit_value_tab . TYPES: - ty_commit_value_tab_tt TYPE STANDARD TABLE OF ty_commit_value_tab WITH DEFAULT KEY . - + ty_commit_value_tab_tt TYPE STANDARD TABLE OF ty_commit_value_tab WITH DEFAULT KEY, + ty_head_type TYPE c LENGTH 1, + BEGIN OF ty_remote_settings, + offline TYPE zif_abapgit_persistence=>ty_repo-offline, + url TYPE zif_abapgit_persistence=>ty_repo-url, + branch TYPE zif_abapgit_definitions=>ty_git_branch-name, + tag TYPE zif_abapgit_definitions=>ty_git_tag-name, + commit TYPE zif_abapgit_definitions=>ty_commit-sha1, + pull_request TYPE string, + head_type TYPE ty_head_type, + switched_origin TYPE zif_abapgit_persistence=>ty_repo-switched_origin, + END OF ty_remote_settings. CONSTANTS: - BEGIN OF c_mode, - offline TYPE i VALUE 0, - branch TYPE i VALUE 1, - tag TYPE i VALUE 2, - commit TYPE i VALUE 3, - pull_request TYPE i VALUE 4, - END OF c_mode . + BEGIN OF c_head_types, + branch TYPE ty_head_type VALUE 'B', + tag TYPE ty_head_type VALUE 'T', + commit TYPE ty_head_type VALUE 'C', + pull_request TYPE ty_head_type VALUE 'P', + END OF c_head_types. CONSTANTS: BEGIN OF c_id, general TYPE string VALUE 'general', repo_type TYPE string VALUE 'repo_type', - head TYPE string VALUE 'head', + offline TYPE string VALUE 'offline', url TYPE string VALUE 'url', + head_group TYPE string VALUE 'head_group', branch TYPE string VALUE 'branch', tag TYPE string VALUE 'tag', - commit TYPE string VALUE 'commmit', + commit TYPE string VALUE 'commit', pull_request TYPE string VALUE 'pull_request', - END OF c_id . + head_type TYPE string VALUE 'head_type', + END OF c_id. CONSTANTS: BEGIN OF c_event, - save TYPE string VALUE 'save', - switch TYPE string VALUE 'switch', - choose_url TYPE string VALUE 'choose_url', - choose_branch TYPE string VALUE 'choose_branch', - choose_tag TYPE string VALUE 'choose_tag', - choose_commit TYPE string VALUE 'choose_commit', - choose_pull_req TYPE string VALUE 'choose_pull_req', + save TYPE string VALUE 'save', + switch TYPE string VALUE 'switch', + choose_url TYPE string VALUE 'choose_url', + choose_branch TYPE string VALUE 'choose_branch', + choose_tag TYPE string VALUE 'choose_tag', + choose_commit TYPE string VALUE 'choose_commit', + choose_pull_request TYPE string VALUE 'choose_pull_request', + change_head_type TYPE string VALUE 'change_head_type', END OF c_event . + DATA mo_repo TYPE REF TO zcl_abapgit_repo . + DATA ms_settings_old 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 mo_repo TYPE REF TO zcl_abapgit_repo . - DATA ms_repo_current TYPE zif_abapgit_persistence=>ty_repo . - DATA ms_repo_new TYPE zif_abapgit_persistence=>ty_repo . - DATA mv_pull_req TYPE string . - DATA mv_mode TYPE i . - DATA mv_original_url TYPE string . + DATA mv_refresh_on_back TYPE abap_bool. + DATA mv_offline_switch_saved_url TYPE string. METHODS init IMPORTING !io_repo TYPE REF TO zcl_abapgit_repo RAISING - zcx_abapgit_exception . + zcx_abapgit_exception. + + METHODS get_remote_settings_from_repo + IMPORTING + io_repo TYPE REF TO zcl_abapgit_repo + RETURNING + VALUE(rs_settings) TYPE ty_remote_settings + RAISING + zcx_abapgit_exception. + + METHODS get_remote_settings_from_form + IMPORTING + io_form_data TYPE REF TO zcl_abapgit_string_map + RETURNING + VALUE(rs_settings) TYPE ty_remote_settings + RAISING + zcx_abapgit_exception. + + METHODS get_form_schema + IMPORTING + is_settings TYPE ty_remote_settings + io_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 + RAISING + zcx_abapgit_exception. + + METHODS check_protection + 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 save_settings + RAISING + zcx_abapgit_exception. + METHODS choose_url RETURNING VALUE(rv_url) TYPE string RAISING - zcx_abapgit_exception . + zcx_abapgit_exception. METHODS choose_branch RETURNING - VALUE(rv_branch) TYPE string + VALUE(rv_branch) TYPE ty_remote_settings-branch RAISING - zcx_abapgit_exception . + zcx_abapgit_exception. METHODS choose_tag RETURNING - VALUE(rv_tag) TYPE string + VALUE(rv_tag) TYPE ty_remote_settings-tag RAISING - zcx_abapgit_exception . + zcx_abapgit_exception. METHODS choose_commit RETURNING - VALUE(rv_commit) TYPE string + VALUE(rv_commit) TYPE ty_remote_settings-commit RAISING - zcx_abapgit_exception . + zcx_abapgit_exception. METHODS choose_pull_req RETURNING - VALUE(rv_pull) TYPE string + VALUE(rv_pull_request) TYPE ty_remote_settings-pull_request RAISING - zcx_abapgit_exception . - METHODS check_protection - RAISING - zcx_abapgit_exception . + zcx_abapgit_exception. + METHODS switch_online_offline RAISING - zcx_abapgit_exception . + zcx_abapgit_exception. METHODS switch_to_branch_tag IMPORTING !iv_name TYPE string OPTIONAL RAISING - zcx_abapgit_exception . + zcx_abapgit_exception. METHODS switch_to_commit IMPORTING !iv_revert TYPE abap_bool DEFAULT abap_false - !iv_commit TYPE string OPTIONAL + !iv_commit TYPE ty_remote_settings-commit OPTIONAL RAISING - zcx_abapgit_exception . + zcx_abapgit_exception. METHODS switch_to_pull_req IMPORTING !iv_revert TYPE abap_bool DEFAULT abap_false !iv_pull TYPE string OPTIONAL 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 - RAISING - zcx_abapgit_exception . - METHODS read_settings - RAISING - zcx_abapgit_exception . - METHODS save_settings - RAISING - zcx_abapgit_exception . + zcx_abapgit_exception. + METHODS checkout_commit_build_list IMPORTING - !io_repo TYPE REF TO zcl_abapgit_repo_online + !iv_branch_name TYPE string + !iv_repo_url TYPE string EXPORTING - !et_value_tab TYPE ty_commit_value_tab_tt - !et_commits TYPE zif_abapgit_definitions=>ty_commit_tt + !et_value_tab TYPE ty_commit_value_tab_tt + !et_commits TYPE zif_abapgit_definitions=>ty_commit_tt RAISING zcx_abapgit_exception . METHODS checkout_commit_build_popup @@ -161,11 +203,6 @@ CLASS zcl_abapgit_gui_page_sett_remo DEFINITION VALUE(rs_selected_commit) TYPE zif_abapgit_definitions=>ty_commit RAISING zcx_abapgit_exception . - METHODS get_mode - IMPORTING - !is_repo TYPE zif_abapgit_persistence=>ty_repo - RETURNING - VALUE(rv_mode) TYPE i . ENDCLASS. @@ -186,11 +223,10 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. CLEAR: et_commits, et_value_tab. - et_commits = zcl_abapgit_git_commit=>get_by_branch( iv_branch_name = io_repo->get_selected_branch( ) - iv_repo_url = io_repo->get_url( ) + et_commits = zcl_abapgit_git_commit=>get_by_branch( iv_branch_name = iv_branch_name + iv_repo_url = iv_repo_url iv_deepen_level = 99 )-commits. - DELETE et_commits WHERE sha1 = io_repo->get_selected_commit( ). SORT et_commits BY time DESCENDING. IF et_commits IS INITIAL. @@ -252,7 +288,7 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. iv_selection_mode = if_salv_c_selection_mode=>single it_columns_to_display = lt_columns IMPORTING - et_list = lt_selected_values ). + et_list = lt_selected_values ). IF lt_selected_values IS INITIAL. RAISE EXCEPTION TYPE zcx_abapgit_cancel. @@ -288,23 +324,16 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. METHOD choose_branch. DATA: - lo_repo TYPE REF TO zcl_abapgit_repo_online, - lv_url LIKE lo_repo->ms_data-url, - lv_branch_name LIKE lo_repo->ms_data-branch_name, + lv_url TYPE zif_abapgit_persistence=>ty_repo-url, + lv_branch_name TYPE zif_abapgit_persistence=>ty_repo-branch_name, ls_branch TYPE zif_abapgit_definitions=>ty_git_branch. - IF mo_repo->is_offline( ) = abap_true. + IF mo_form_data->get( c_id-offline ) = abap_true. RETURN. ENDIF. - lo_repo ?= mo_repo. - - IF lo_repo->ms_data-switched_origin IS NOT INITIAL. - SPLIT lo_repo->ms_data-switched_origin AT '@' INTO lv_url lv_branch_name. - ELSE. - lv_url = lo_repo->get_url( ). - lv_branch_name = lo_repo->get_selected_branch( ). - ENDIF. + lv_url = mo_form_data->get( c_id-url ). + lv_branch_name = zif_abapgit_definitions=>c_git_branch-heads_prefix && mo_form_data->get( c_id-branch ). ls_branch = zcl_abapgit_ui_factory=>get_popups( )->branch_list_popup( iv_url = lv_url @@ -313,6 +342,8 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. IF ls_branch IS NOT INITIAL. rv_branch = ls_branch-name. + REPLACE FIRST OCCURRENCE OF zif_abapgit_definitions=>c_git_branch-heads_prefix IN rv_branch WITH space. + CONDENSE rv_branch. ENDIF. ENDMETHOD. @@ -321,20 +352,22 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. METHOD choose_commit. DATA: - lo_repo TYPE REF TO zcl_abapgit_repo_online, lt_value_tab TYPE ty_commit_value_tab_tt, lt_commits TYPE zif_abapgit_definitions=>ty_commit_tt, - ls_selected_commit TYPE zif_abapgit_definitions=>ty_commit. + ls_selected_commit TYPE zif_abapgit_definitions=>ty_commit, + lv_branch TYPE ty_remote_settings-branch. - IF mo_repo->is_offline( ) = abap_true. + IF mo_form_data->get( c_id-offline ) = abap_true. RETURN. ENDIF. - lo_repo ?= mo_repo. + lv_branch = zif_abapgit_definitions=>c_git_branch-heads_prefix && mo_form_data->get( c_id-branch ). + CONDENSE lv_branch. checkout_commit_build_list( EXPORTING - io_repo = lo_repo + iv_branch_name = lv_branch + iv_repo_url = mo_form_data->get( c_id-url ) IMPORTING et_value_tab = lt_value_tab et_commits = lt_commits ). @@ -353,17 +386,17 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. METHOD choose_pull_req. DATA: - lo_repo TYPE REF TO zcl_abapgit_repo_online, lt_pulls TYPE zif_abapgit_pr_enum_provider=>ty_pull_requests, - ls_pull LIKE LINE OF lt_pulls. + ls_pull LIKE LINE OF lt_pulls, + lv_url TYPE ty_remote_settings-url. - IF mo_repo->is_offline( ) = abap_true. + IF mo_form_data->get( c_id-offline ) = abap_true. RETURN. ENDIF. - lo_repo ?= mo_repo. + lv_url = mo_form_data->get( c_id-url ). - lt_pulls = zcl_abapgit_pr_enumerator=>new( lo_repo )->get_pulls( ). + lt_pulls = zcl_abapgit_pr_enumerator=>new( lv_url )->get_pulls( ). IF lines( lt_pulls ) = 0. MESSAGE 'No pull requests found' TYPE 'S'. @@ -373,7 +406,7 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. ls_pull = zcl_abapgit_ui_factory=>get_popups( )->choose_pr_popup( lt_pulls ). IF ls_pull IS NOT INITIAL. - rv_pull = ls_pull-head_url && '@' && ls_pull-head_branch. + rv_pull_request = ls_pull-head_url && '@' && ls_pull-head_branch. ENDIF. ENDMETHOD. @@ -383,18 +416,25 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, - ls_tag TYPE zif_abapgit_definitions=>ty_git_tag. + ls_tag TYPE zif_abapgit_definitions=>ty_git_tag, + lv_url TYPE ty_remote_settings-url. - IF mo_repo->is_offline( ) = abap_true. + IF mo_form_data->get( c_id-offline ) = abap_true. + RETURN. + ELSEIF mo_repo->is_offline( ) = abap_true. + MESSAGE 'Please save conversion to online repository before choosing a tag' TYPE 'S'. RETURN. ENDIF. lo_repo ?= mo_repo. + lv_url = mo_form_data->get( c_id-url ). - ls_tag = zcl_abapgit_ui_factory=>get_popups( )->tag_list_popup( lo_repo->get_url( ) ). + ls_tag = zcl_abapgit_ui_factory=>get_popups( )->tag_list_popup( lv_url ). IF ls_tag IS NOT INITIAL. rv_tag = ls_tag-name. + REPLACE FIRST OCCURRENCE OF zif_abapgit_definitions=>c_git_branch-tags_prefix IN rv_tag WITH space. + CONDENSE rv_tag. ENDIF. ENDMETHOD. @@ -411,16 +451,15 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. METHOD constructor. super->constructor( ). + init( io_repo ). CREATE OBJECT mo_validation_log. CREATE OBJECT mo_form_data. - init( io_repo ). - mv_original_url = ms_repo_current-url. - - mo_form = get_form_schema( ). + mo_form = get_form_schema( ms_settings_old ). mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ). - - read_settings( ). + initialize_form_data( io_form_data = mo_form_data + is_settings = ms_settings_old + io_form_util = mo_form_util ). ENDMETHOD. @@ -450,13 +489,25 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. lv_label TYPE string, lv_icon TYPE string, lv_hint TYPE string, - lv_placeholder TYPE string. + lv_placeholder TYPE string, + 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 lv_offline = abap_false. + lv_head_type = io_form_data->get( c_id-head_type ). + ENDIF. + ELSE. + lv_offline = is_settings-offline. + lv_head_type = is_settings-head_type. + ENDIF. ro_form = zcl_abapgit_html_form=>create( - iv_form_id = 'repo-remote-settings-form' - iv_help_page = 'https://docs.abapgit.org/settings-remote.html' ). + iv_form_id = 'repo-remote-settings-form' + iv_help_page = 'https://docs.abapgit.org/settings-remote.html' ). - IF mv_mode = c_mode-offline. + IF lv_offline = abap_true. lv_button = 'Switch to Online'. lv_icon = 'plug/darkgrey'. lv_label = 'Repository Name'. @@ -469,13 +520,14 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. ENDIF. ro_form->start_group( - iv_name = c_id-general - iv_label = 'General' - iv_hint = 'Change the general type and origin of the repository' + iv_name = c_id-general + iv_label = 'General' + iv_hint = 'Change the general type and origin of the repository' )->text( iv_name = c_id-repo_type iv_label = |Type of Repository: { zcl_abapgit_html=>icon( lv_icon ) }| iv_readonly = abap_true + )->hidden( c_id-offline )->text( iv_name = c_id-url iv_condense = abap_true @@ -483,146 +535,156 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. iv_hint = lv_hint iv_placeholder = lv_placeholder ). - IF mv_mode <> c_mode-offline. + IF lv_offline = abap_false. ro_form->start_group( - iv_name = c_id-head - iv_label = 'Head' - )->text( - iv_name = c_id-branch - iv_label = 'Branch' - iv_hint = 'Switch to a branch of the repository' - iv_readonly = abap_true - iv_side_action = c_event-choose_branch - )->text( - iv_name = c_id-tag - iv_label = 'Tag' - iv_hint = 'Switch to a tag of the repository' - iv_readonly = abap_true - iv_side_action = c_event-choose_tag - )->text( - iv_name = c_id-commit - iv_label = 'Commit' - iv_hint = 'Switch to a commit of the repository' - iv_readonly = abap_true - iv_side_action = c_event-choose_commit - )->text( - iv_name = c_id-pull_request - iv_label = 'Pull Request' - iv_hint = 'Switch to a pull request of the repository or its forks' - iv_readonly = abap_true - iv_side_action = c_event-choose_pull_req ). + iv_name = c_id-head_group + iv_label = 'Head' + )->radio( + iv_label = 'Type' + iv_name = c_id-head_type + iv_action = c_event-change_head_type + )->option( + iv_label = 'Branch' + iv_value = c_head_types-branch + )->option( + iv_label = 'Tag' + iv_value = c_head_types-tag + )->option( + iv_label = 'Commit' + iv_value = c_head_types-commit + )->option( + iv_label = 'Pull Request' + iv_value = c_head_types-pull_request ). + IF lv_head_type = c_head_types-branch OR + lv_head_type = c_head_types-commit. + ro_form->text( + iv_name = c_id-branch + 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. + ro_form->text( + iv_name = c_id-tag + 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. + ro_form->text( + iv_name = c_id-commit + iv_label = 'Commit' + iv_required = abap_true + 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. + ro_form->text( + iv_name = c_id-pull_request + 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( - iv_label = 'Save Settings' - iv_cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main - iv_action = c_event-save + iv_label = 'Save Settings' + iv_cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main + iv_action = c_event-save )->command( - iv_label = lv_button - iv_action = c_event-switch + iv_label = lv_button + iv_action = c_event-switch )->command( - iv_label = 'Back' - iv_action = zif_abapgit_definitions=>c_action-go_back ). - - ENDMETHOD. - - - METHOD get_mode. - - IF is_repo-offline = abap_true. - rv_mode = c_mode-offline. - ELSEIF is_repo-selected_commit IS NOT INITIAL. - rv_mode = c_mode-commit. - ELSEIF is_repo-switched_origin IS NOT INITIAL. - rv_mode = c_mode-pull_request. - ELSEIF is_repo-branch_name CP zif_abapgit_definitions=>c_git_branch-tags. - rv_mode = c_mode-tag. - ELSE. - rv_mode = c_mode-branch. - ENDIF. + iv_label = 'Back' + iv_action = zif_abapgit_definitions=>c_action-go_back ). ENDMETHOD. METHOD init. - - DATA lv_branch TYPE string. - mo_repo = io_repo. - - " Get repo settings when starting dialog - TRY. - ms_repo_current = zcl_abapgit_persist_factory=>get_repo( )->read( mo_repo->get_key( ) ). - CATCH zcx_abapgit_not_found. - zcx_abapgit_exception=>raise( 'Repository not found' ). - ENDTRY. - - " Initialize new repo settings which are modified using this form (and saved) - mv_mode = get_mode( ms_repo_current ). - - IF mv_mode = c_mode-pull_request. - lv_branch = ms_repo_current-branch_name. - REPLACE zif_abapgit_definitions=>c_git_branch-heads_prefix IN lv_branch WITH ''. - mv_pull_req = ms_repo_current-url && '@' && lv_branch. - SPLIT ms_repo_current-switched_origin AT '@' INTO ms_repo_current-url ms_repo_current-branch_name. - ENDIF. - - ms_repo_new = ms_repo_current. - + ms_settings_old = get_remote_settings_from_repo( mo_repo ). + FREE mo_form_data. ENDMETHOD. - METHOD read_settings. + METHOD initialize_form_data. DATA: - lv_type TYPE string, - lv_url TYPE string, - lv_rest TYPE string, - lv_branch TYPE string, - lv_tag TYPE string, - lv_commit TYPE string, - lv_pull_req TYPE string. + lv_type TYPE string, + lv_url TYPE ty_remote_settings-url, + lv_head TYPE string. lv_type = 'Online repository'. - lv_url = ms_repo_new-url. + lv_url = is_settings-url. - CASE mv_mode. - WHEN c_mode-offline. - lv_type = 'Offline repository'. - WHEN c_mode-branch. - lv_branch = ms_repo_new-branch_name. - WHEN c_mode-tag. - lv_tag = ms_repo_new-branch_name. - WHEN c_mode-commit. - lv_commit = ms_repo_new-selected_commit. - WHEN c_mode-pull_request. - SPLIT ms_repo_new-switched_origin AT '@' INTO lv_url lv_rest."original repo URL - lv_pull_req = mv_pull_req. - ENDCASE. + IF is_settings-offline = abap_true. + lv_type = 'Offline repository'. + ENDIF. - mo_form_data->set( + io_form_data->set( + iv_key = c_id-offline + iv_val = is_settings-offline ). + + io_form_data->set( iv_key = c_id-repo_type iv_val = lv_type ). - mo_form_data->set( + io_form_data->set( iv_key = c_id-url iv_val = lv_url ). - mo_form_data->set( - iv_key = c_id-branch - iv_val = lv_branch ). - mo_form_data->set( - iv_key = c_id-tag - iv_val = lv_tag ). - mo_form_data->set( - iv_key = c_id-commit - iv_val = lv_commit ). - mo_form_data->set( - iv_key = c_id-pull_request - iv_val = lv_pull_req ). + + IF is_settings-offline = abap_false. + io_form_data->set( + iv_key = c_id-head_type + iv_val = is_settings-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( + 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( + iv_key = c_id-tag + iv_val = lv_head ). + + io_form_data->set( + iv_key = c_id-commit + iv_val = is_settings-commit ). + + io_form_data->set( + iv_key = c_id-pull_request + iv_val = is_settings-pull_request ). + ENDIF. " Set for is_dirty check - mo_form_util->set_data( mo_form_data ). + io_form_util->set_data( io_form_data ). ENDMETHOD. @@ -630,105 +692,107 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. METHOD save_settings. DATA: - lv_key TYPE zif_abapgit_persistence=>ty_repo-key, lo_repo_online TYPE REF TO zcl_abapgit_repo_online, lo_repo_offline TYPE REF TO zcl_abapgit_repo_offline, - lo_branch_list TYPE REF TO zcl_abapgit_git_branch_list, - lv_url TYPE string, - lv_branch TYPE string, - lv_tag TYPE string, - lv_commit TYPE string, - lv_pull TYPE string. + ls_settings_new TYPE ty_remote_settings. - lv_url = mo_form_data->get( c_id-url ). - lv_branch = mo_form_data->get( c_id-branch ). - lv_tag = mo_form_data->get( c_id-tag ). - lv_commit = mo_form_data->get( c_id-commit ). - lv_pull = mo_form_data->get( c_id-pull_request ). + ls_settings_new = get_remote_settings_from_form( mo_form_data ). " Switch online / offline - IF ms_repo_new-offline <> ms_repo_current-offline. + IF ls_settings_new-offline <> ms_settings_old-offline. " Remember key, switch, retrieve new instance (todo, refactor #2244) - lv_key = ms_repo_current-key. - mo_repo->switch_repo_type( ms_repo_new-offline ). - mo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ). + mo_repo->switch_repo_type( ls_settings_new-offline ). + mo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( mo_repo->get_key( ) ). ENDIF. IF mo_repo->is_offline( ) = abap_true. " Offline: Save repo name lo_repo_offline ?= mo_repo. - lo_repo_offline->set_name( lv_url ). + lo_repo_offline->set_name( ls_settings_new-url ). ELSE. " Online: Save url lo_repo_online ?= mo_repo. - lo_repo_online->set_url( lv_url ). - - " Check branch/tag and reset to default if not found - lo_branch_list = zcl_abapgit_git_transport=>branches( lv_url ). - TRY. - IF lv_branch IS INITIAL AND lv_tag IS INITIAL. - lv_branch = lo_branch_list->get_head_symref( ). - ELSEIF lv_tag IS INITIAL. - lo_branch_list->find_by_name( lv_branch ). - ELSE. - lo_branch_list->find_by_name( lv_tag ). - ENDIF. - CATCH zcx_abapgit_exception. - lv_branch = lo_branch_list->get_head_symref( ). - ENDTRY. - - mv_original_url = lv_url. + lo_repo_online->set_url( ls_settings_new-url ). ENDIF. - CASE mv_mode. - WHEN c_mode-branch. + CASE ls_settings_new-head_type. + WHEN c_head_types-branch. switch_to_pull_req( iv_revert = abap_true ). switch_to_commit( iv_revert = abap_true ). - switch_to_branch_tag( lv_branch ). - WHEN c_mode-tag. + switch_to_branch_tag( ls_settings_new-branch ). + WHEN c_head_types-tag. switch_to_pull_req( iv_revert = abap_true ). switch_to_commit( iv_revert = abap_true ). - switch_to_branch_tag( lv_tag ). - WHEN c_mode-commit. + switch_to_branch_tag( ls_settings_new-tag ). + WHEN c_head_types-commit. switch_to_pull_req( iv_revert = abap_true ). - switch_to_commit( iv_commit = lv_commit ). - WHEN c_mode-pull_request. + switch_to_commit( iv_commit = ls_settings_new-commit ). + WHEN c_head_types-pull_request. switch_to_commit( iv_revert = abap_true ). - switch_to_pull_req( iv_pull = lv_pull ). + switch_to_pull_req( iv_pull = ls_settings_new-pull_request ). ENDCASE. + IF ls_settings_new-head_type <> c_head_types-pull_request. + " Switching from PR to something else will reset the URL in repo->switch_origin( space ) + " -> set URL again + lo_repo_online->set_url( ls_settings_new-url ). + ENDIF. + COMMIT WORK AND WAIT. MESSAGE 'Settings succesfully saved' TYPE 'S'. + mv_refresh_on_back = abap_true. init( mo_repo ). + FREE mo_form_data. 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. - DATA lv_url TYPE string. - - ms_repo_new-offline = boolc( ms_repo_new-offline = abap_false ). - mv_mode = get_mode( ms_repo_new ). - - lv_url = mo_form_data->get( c_id-url ). - - IF mv_mode = c_mode-offline AND lv_url CP 'http*'. - " Switch from URL to name - lv_url = zcl_abapgit_url=>name( lv_url ). - ENDIF. - - IF mv_mode <> c_mode-offline AND lv_url NP 'http*' AND mv_original_url CP 'http*'. - " Switch back to original URL - lv_url = mv_original_url. - ENDIF. - + lv_offline_new = boolc( mo_form_data->get( c_id-offline ) = abap_false ). mo_form_data->set( - iv_key = c_id-url - iv_val = lv_url ). + iv_key = c_id-offline + iv_val = lv_offline_new ). + IF lv_offline_new = abap_true. + lv_url = mo_form_data->get( c_id-url ). + mv_offline_switch_saved_url = lv_url. + IF lv_url CP 'http*'. + lv_url = zcl_abapgit_url=>name( lv_url ). + mo_form_data->set( + iv_key = c_id-url + iv_val = lv_url ). + ENDIF. + + ELSE. + IF mv_offline_switch_saved_url IS NOT INITIAL. + mo_form_data->set( + iv_key = c_id-url + iv_val = mv_offline_switch_saved_url ). + ENDIF. + + lv_url = mo_form_data->get( c_id-url ). + IF mo_form_data->get( c_id-head_type ) IS INITIAL. + TRY. + mo_form_data->set( + iv_key = c_id-head_type + iv_val = c_head_types-branch ). + + IF lv_url CP 'http*'. + lv_branch = zcl_abapgit_git_transport=>branches( lv_url )->get_head_symref( ). + mo_form_data->set( + iv_key = c_id-branch + iv_val = lv_branch ). + ENDIF. + CATCH zcx_abapgit_exception ##NO_HANDLER. + ENDTRY. + ENDIF. + ENDIF. ENDMETHOD. @@ -756,7 +820,7 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. IF iv_revert = abap_true. lo_repo->select_commit( '' ). ELSE. - lo_repo->select_commit( |{ iv_commit }| ). + lo_repo->select_commit( iv_commit ). ENDIF. ENDMETHOD. @@ -766,8 +830,8 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, - lv_url TYPE string, - lv_branch TYPE string. + lv_url TYPE ty_remote_settings-url, + lv_branch TYPE ty_remote_settings-branch. check_protection( ). @@ -789,24 +853,31 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. METHOD validate_form. DATA: - lv_url TYPE string, - lx_error TYPE REF TO zcx_abapgit_exception. + lx_error TYPE REF TO zcx_abapgit_exception, + lo_branch_list TYPE REF TO zcl_abapgit_git_branch_list, + lv_offline TYPE abap_bool, + lv_head_type TYPE ty_head_type, + lv_branch TYPE ty_remote_settings-branch, + lv_url TYPE ty_remote_settings-url, + lv_branch_check_error_id TYPE string, + 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 ). + lv_offline = io_form_data->get( c_id-offline ). + lv_url = io_form_data->get( c_id-url ). - lv_url = mo_form_data->get( c_id-url ). - - IF mv_mode = c_mode-offline AND lv_url IS INITIAL. + IF lv_offline = abap_true AND lv_url IS INITIAL. ro_validation_log->set( iv_key = c_id-url iv_val = 'Enter a name for the repository and save' ). ENDIF. - IF mv_mode <> c_mode-offline AND lv_url NP 'http*'. + IF lv_offline = abap_false AND lv_url NP 'http*'. ro_validation_log->set( iv_key = c_id-url iv_val = 'Enter the URL of the repository and save' ). - ELSEIF mv_mode <> c_mode-offline. + ELSEIF lv_offline = abap_false. TRY. zcl_abapgit_url=>name( iv_url = lv_url @@ -818,23 +889,70 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. ENDTRY. ENDIF. + IF lv_offline = abap_false. + lv_head_type = io_form_data->get( c_id-head_type ). + + CASE lv_head_type. + WHEN c_head_types-branch. + lv_branch = zif_abapgit_definitions=>c_git_branch-heads_prefix && io_form_data->get( c_id-branch ). + CONDENSE lv_branch. + lv_branch_check_error_id = c_id-branch. + WHEN c_head_types-tag. + lv_branch = zif_abapgit_definitions=>c_git_branch-tags_prefix && io_form_data->get( c_id-tag ). + CONDENSE lv_branch. + lv_branch_check_error_id = c_id-tag. + WHEN c_head_types-pull_request. + lv_pull_request = io_form_data->get( c_id-pull_request ). + SPLIT lv_pull_request AT '@' INTO lv_url lv_branch. + IF lv_branch IS NOT INITIAL. + lv_branch = zif_abapgit_definitions=>c_git_branch-heads_prefix && lv_branch. + ENDIF. + lv_branch_check_error_id = c_id-pull_request. + WHEN c_head_types-commit. + lv_commit = io_form_data->get( c_id-commit ). + + " Cannot check for commit existence currently (needs API that doesn't rely on finding the first commit + " in the branch), check format instead + IF lv_commit CN '0123456789abcdef'. + ro_validation_log->set( + iv_key = c_id-commit + iv_val = 'Commit needs to be hexadecimal and in lowercase' ). + ENDIF. + WHEN OTHERS. + ro_validation_log->set( + iv_key = c_id-head_type + iv_val = 'Unknown head type' ). + ENDCASE. + + TRY. + IF lv_branch IS NOT INITIAL. + lo_branch_list = zcl_abapgit_git_transport=>branches( lv_url ). + lo_branch_list->find_by_name( lv_branch ). + ENDIF. + CATCH zcx_abapgit_exception INTO lx_error. + ro_validation_log->set( + iv_key = lv_branch_check_error_id + iv_val = lx_error->get_text( ) ). + ENDTRY. + ENDIF. ENDMETHOD. METHOD zif_abapgit_gui_event_handler~on_event. DATA: - lv_url TYPE string, - lv_branch TYPE string, - lv_tag TYPE string, - lv_pull TYPE string, - lv_commit TYPE string. + 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_pull_request TYPE ty_remote_settings-pull_request. mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ). CASE ii_event->mv_action. WHEN zif_abapgit_definitions=>c_action-go_back. - IF ms_repo_new <> ms_repo_current. + IF mv_refresh_on_back = abap_true. + " Note this doesn't trigger if the tab is switched first mo_repo->refresh( ). ENDIF. @@ -847,65 +965,69 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. IF lv_url IS INITIAL. rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act. ELSE. - ms_repo_new-url = lv_url. + mo_form_data->set( + iv_key = c_id-url + iv_val = lv_url ). rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. ENDIF. - WHEN c_event-choose_branch. + WHEN c_event-change_head_type. + rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. + mo_validation_log->clear( ). + WHEN c_event-choose_branch. lv_branch = choose_branch( ). IF lv_branch IS INITIAL. rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act. ELSE. - ms_repo_new-branch_name = lv_branch. - mv_mode = c_mode-branch. + mo_form_data->set( + iv_key = c_id-branch + iv_val = lv_branch ). rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. ENDIF. WHEN c_event-choose_tag. - lv_tag = choose_tag( ). IF lv_tag IS INITIAL. rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act. ELSE. - ms_repo_new-branch_name = lv_tag. - mv_mode = c_mode-tag. + mo_form_data->set( + iv_key = c_id-tag + iv_val = lv_tag ). rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. ENDIF. WHEN c_event-choose_commit. - lv_commit = choose_commit( ). IF lv_commit IS INITIAL. rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act. ELSE. - ms_repo_new-selected_commit = lv_commit. - mv_mode = c_mode-commit. + mo_form_data->set( + iv_key = c_id-commit + iv_val = lv_commit ). rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. ENDIF. - WHEN c_event-choose_pull_req. + WHEN c_event-choose_pull_request. + lv_pull_request = choose_pull_req( ). - lv_pull = choose_pull_req( ). - - IF lv_pull IS INITIAL. + IF lv_pull_request IS INITIAL. rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act. ELSE. - ms_repo_new-switched_origin = ms_repo_new-url. - mv_pull_req = lv_pull. - mv_mode = c_mode-pull_request. + mo_form_data->set( + iv_key = c_id-pull_request + iv_val = lv_pull_request ). rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. ENDIF. - WHEN c_event-switch OR c_event-save. - - IF ii_event->mv_action = c_event-switch. - switch_online_offline( ). - ENDIF. + WHEN c_event-switch. + switch_online_offline( ). + rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. + WHEN c_event-save. mo_validation_log = validate_form( mo_form_data ). IF mo_validation_log->is_empty( ) = abap_true. @@ -918,8 +1040,18 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. " If staying on form, initialize it with current settings IF rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. - mo_form = get_form_schema( ). - read_settings( ). + mo_form = get_form_schema( is_settings = ms_settings_old + io_form_data = mo_form_data ). + CREATE OBJECT mo_form_util + EXPORTING + io_form = 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. ENDIF. ENDMETHOD. @@ -927,44 +1059,67 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions. - DATA: ls_hotkey_action LIKE LINE OF rt_hotkey_actions. + DATA: ls_hotkey_action LIKE LINE OF rt_hotkey_actions, + lv_head_type TYPE ty_head_type, + lv_offline TYPE abap_bool. + + IF mo_form_data IS BOUND AND mo_form_data->is_empty( ) = abap_false. + lv_offline = mo_form_data->get( c_id-offline ). + IF lv_offline = abap_false. + lv_head_type = mo_form_data->get( c_id-head_type ). + ENDIF. + ELSE. + lv_offline = ms_settings_old-offline. + IF lv_offline = abap_false. + lv_head_type = ms_settings_old-head_type. + ENDIF. + ENDIF. ls_hotkey_action-ui_component = 'Remote'. - ls_hotkey_action-description = |Choose Branch|. - ls_hotkey_action-action = c_event-choose_branch. - ls_hotkey_action-hotkey = |b|. - INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions. - - ls_hotkey_action-description = |Choose Commit|. - ls_hotkey_action-action = c_event-choose_commit. - ls_hotkey_action-hotkey = |c|. - INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions. - - ls_hotkey_action-description = |Choose Pull Request|. - ls_hotkey_action-action = c_event-choose_pull_req. - ls_hotkey_action-hotkey = |p|. - INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions. - - ls_hotkey_action-description = |Choose Tag|. - ls_hotkey_action-action = c_event-choose_tag. - ls_hotkey_action-hotkey = |t|. - INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions. - - ls_hotkey_action-description = |Choose URL|. + ls_hotkey_action-description = 'Choose URL'. ls_hotkey_action-action = c_event-choose_url. - ls_hotkey_action-hotkey = |u|. + ls_hotkey_action-hotkey = 'u'. INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions. - IF mo_repo->is_offline( ) = abap_true. - ls_hotkey_action-description = |Switch to Online|. + IF lv_head_type = c_head_types-branch OR + lv_head_type = c_head_types-commit. + ls_hotkey_action-description = 'Choose Branch'. + ls_hotkey_action-action = c_event-choose_branch. + ls_hotkey_action-hotkey = 'b'. + INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions. + ENDIF. + + IF lv_head_type = c_head_types-tag. + ls_hotkey_action-description = 'Choose Tag'. + ls_hotkey_action-action = c_event-choose_tag. + ls_hotkey_action-hotkey = 't'. + INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions. + ENDIF. + + IF lv_head_type = c_head_types-commit. + ls_hotkey_action-description = 'Choose Commit'. + ls_hotkey_action-action = c_event-choose_commit. + ls_hotkey_action-hotkey = 'c'. + INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions. + ENDIF. + + IF lv_head_type = c_head_types-pull_request. + ls_hotkey_action-description = 'Choose Pull Request'. + ls_hotkey_action-action = c_event-choose_pull_request. + ls_hotkey_action-hotkey = 'p'. + INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions. + ENDIF. + + IF lv_offline = abap_true. + ls_hotkey_action-description = 'Switch to Online'. ls_hotkey_action-action = c_event-switch. - ls_hotkey_action-hotkey = |o|. + ls_hotkey_action-hotkey = 'o'. INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions. ELSE. - ls_hotkey_action-description = |Switch to Offline|. + ls_hotkey_action-description = 'Switch to Offline'. ls_hotkey_action-action = c_event-switch. - ls_hotkey_action-hotkey = |o|. + ls_hotkey_action-hotkey = 'o'. INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions. ENDIF. @@ -975,10 +1130,6 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. gui_services( )->register_event_handler( me ). - IF mo_form_util->is_empty( mo_form_data ) = abap_true. - read_settings( ). - ENDIF. - CREATE OBJECT ri_html TYPE zcl_abapgit_html. ri_html->add( `
` ). @@ -997,4 +1148,77 @@ CLASS zcl_abapgit_gui_page_sett_remo IMPLEMENTATION. gui_services( )->get_hotkeys_ctl( )->register_hotkeys( zif_abapgit_gui_hotkeys~get_hotkey_actions( ) ). 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. + + IF io_repo->is_offline( ) = abap_false. + lo_repo_online ?= io_repo. + + rs_settings-url = lo_repo_online->get_url( ). + rs_settings-offline = abap_false. + rs_settings-switched_origin = lo_repo_online->get_switched_origin( ). + + IF lo_repo_online->get_selected_commit( ) IS NOT INITIAL. + rs_settings-commit = lo_repo_online->get_selected_commit( ). + rs_settings-branch = lo_repo_online->get_selected_branch( ). + rs_settings-head_type = c_head_types-commit. + ELSEIF lo_repo_online->get_switched_origin( ) IS NOT INITIAL. + " get_switched_origin( ) returns the original repo url + HEAD concatenated with @ + " get_branch( ) returns the branch of the PR in the source repo + " get_url( ) returns the source repo of the PR branch + + rs_settings-switched_origin = lo_repo_online->get_switched_origin( ). + SPLIT rs_settings-switched_origin AT '@' INTO rs_settings-url rs_settings-branch. + IF rs_settings-branch CP zif_abapgit_definitions=>c_git_branch-tags. + rs_settings-tag = rs_settings-branch. + CLEAR rs_settings-branch. + ENDIF. + + lv_branch = lo_repo_online->get_selected_branch( ). + REPLACE FIRST OCCURRENCE OF zif_abapgit_definitions=>c_git_branch-heads_prefix IN lv_branch WITH space. + CONDENSE lv_branch. + rs_settings-pull_request = |{ lo_repo_online->get_url( ) }@{ lv_branch }|. + rs_settings-head_type = c_head_types-pull_request. + ELSE. + rs_settings-branch = lo_repo_online->get_selected_branch( ). + rs_settings-head_type = c_head_types-branch. + + IF rs_settings-branch CP zif_abapgit_definitions=>c_git_branch-tags. + rs_settings-head_type = c_head_types-tag. + rs_settings-tag = rs_settings-branch. + CLEAR rs_settings-branch. + ENDIF. + ENDIF. + + ELSE. + lo_repo_offline ?= io_repo. + + rs_settings-url = lo_repo_offline->get_name( ). + rs_settings-offline = abap_true. + ENDIF. + ENDMETHOD. + + 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 ). + + IF rs_settings-offline = abap_false. + rs_settings-head_type = io_form_data->get( c_id-head_type ). + + CASE rs_settings-head_type. + WHEN c_head_types-branch. + rs_settings-branch = zif_abapgit_definitions=>c_git_branch-heads_prefix && io_form_data->get( c_id-branch ). + WHEN c_head_types-tag. + rs_settings-tag = zif_abapgit_definitions=>c_git_branch-tags_prefix && io_form_data->get( c_id-tag ). + WHEN c_head_types-commit. + rs_settings-branch = zif_abapgit_definitions=>c_git_branch-heads_prefix && io_form_data->get( c_id-branch ). + rs_settings-commit = io_form_data->get( c_id-commit ). + WHEN c_head_types-pull_request. + rs_settings-pull_request = io_form_data->get( c_id-pull_request ). + ENDCASE. + ENDIF. + ENDMETHOD. ENDCLASS. diff --git a/src/ui/zcl_abapgit_html_form.clas.abap b/src/ui/zcl_abapgit_html_form.clas.abap index c92fab63a..cead41405 100644 --- a/src/ui/zcl_abapgit_html_form.clas.abap +++ b/src/ui/zcl_abapgit_html_form.clas.abap @@ -83,6 +83,7 @@ CLASS zcl_abapgit_html_form DEFINITION !iv_default_value TYPE csequence OPTIONAL !iv_hint TYPE csequence OPTIONAL !iv_condense TYPE abap_bool DEFAULT abap_false + !iv_action TYPE csequence OPTIONAL RETURNING VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . METHODS option @@ -332,6 +333,7 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. ls_field-label = iv_label. ls_field-default_value = iv_default_value. ls_field-hint = iv_hint. + ls_field-click = iv_action. " put options into one column instead of side-by-side ls_field-condense = iv_condense. @@ -535,6 +537,9 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. " Reduced width for short fields lv_item_class = lv_item_class && ' w40'. ENDIF. + IF is_field-type = zif_abapgit_html_form=>c_field_type-hidden. + lv_item_class = lv_item_class && ' hidden'. + ENDIF. IF lv_item_class IS NOT INITIAL. lv_item_class = | class="{ lv_item_class }"|. ENDIF. @@ -627,7 +632,8 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. DATA: lv_checked TYPE string, lv_opt_id TYPE string, - lv_opt_value TYPE string. + lv_opt_value TYPE string, + lv_onclick TYPE string. FIELD-SYMBOLS LIKE LINE OF is_field-subitems. @@ -648,12 +654,19 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. lv_checked = ' checked'. ENDIF. + CLEAR lv_onclick. + IF is_field-click IS NOT INITIAL. + lv_onclick = |onclick="document.getElementById('{ mv_form_id }').action = 'sapevent:| + && |{ is_field-click }'; document.getElementById('{ mv_form_id }').submit()"|. + ENDIF. + lv_opt_id = |{ is_field-name }{ sy-tabix }|. IF is_field-condense = abap_true. ii_html->add( '
' ). ENDIF. ii_html->add( || ). + && | value="{ lv_opt_value }"{ lv_checked }{ is_attr-autofocus }| + && | { lv_onclick }>| ). ii_html->add( || ). IF is_field-condense = abap_true. ii_html->add( '
' ). diff --git a/src/ui/zif_abapgit_html_form.intf.abap b/src/ui/zif_abapgit_html_form.intf.abap index a30e2872a..6f49edc90 100644 --- a/src/ui/zif_abapgit_html_form.intf.abap +++ b/src/ui/zif_abapgit_html_form.intf.abap @@ -16,6 +16,7 @@ INTERFACE zif_abapgit_html_form label TYPE string, hint TYPE string, dblclick TYPE string, + click TYPE string, placeholder TYPE string, required TYPE string, upper_case TYPE abap_bool,