CLASS zcl_abapgit_gui_view_repo DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES zif_abapgit_gui_page . INTERFACES zif_abapgit_gui_page_hotkey. ALIASES render FOR zif_abapgit_gui_page~render . CONSTANTS: BEGIN OF c_actions, change_dir TYPE string VALUE 'change_dir' ##NO_TEXT, toggle_hide_files TYPE string VALUE 'toggle_hide_files' ##NO_TEXT, toggle_folders TYPE string VALUE 'toggle_folders' ##NO_TEXT, toggle_changes TYPE string VALUE 'toggle_changes' ##NO_TEXT, display_more TYPE string VALUE 'display_more' ##NO_TEXT, END OF c_actions . METHODS constructor IMPORTING !iv_key TYPE zif_abapgit_persistence=>ty_repo-key RAISING zcx_abapgit_exception . PRIVATE SECTION. DATA: mo_repo TYPE REF TO zcl_abapgit_repo, mv_cur_dir TYPE string, mv_hide_files TYPE abap_bool, mv_max_lines TYPE i, mv_max_setting TYPE i, mv_show_folders TYPE abap_bool, mv_changes_only TYPE abap_bool. METHODS: render_head_line IMPORTING iv_lstate TYPE char1 iv_rstate TYPE char1 RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html RAISING zcx_abapgit_exception, build_head_menu IMPORTING iv_lstate TYPE char1 iv_rstate TYPE char1 RETURNING VALUE(ro_toolbar) TYPE REF TO zcl_abapgit_html_toolbar RAISING zcx_abapgit_exception, build_grid_menu RETURNING VALUE(ro_toolbar) TYPE REF TO zcl_abapgit_html_toolbar RAISING zcx_abapgit_exception, render_item IMPORTING is_item TYPE zif_abapgit_definitions=>ty_repo_item iv_render_transports TYPE abap_bool RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html RAISING zcx_abapgit_exception, render_item_files IMPORTING is_item TYPE zif_abapgit_definitions=>ty_repo_item RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html, render_item_command IMPORTING is_item TYPE zif_abapgit_definitions=>ty_repo_item RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html, get_item_class IMPORTING is_item TYPE zif_abapgit_definitions=>ty_repo_item RETURNING VALUE(rv_html) TYPE string, get_item_icon IMPORTING is_item TYPE zif_abapgit_definitions=>ty_repo_item RETURNING VALUE(rv_html) TYPE string, render_item_lock_column IMPORTING is_item TYPE zif_abapgit_definitions=>ty_repo_item RETURNING VALUE(rv_html) TYPE string, render_empty_package RETURNING VALUE(rv_html) TYPE string, render_parent_dir RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html RAISING zcx_abapgit_exception. METHODS: build_obj_jump_link IMPORTING is_item TYPE zif_abapgit_definitions=>ty_repo_item RETURNING VALUE(rv_html) TYPE string, build_dir_jump_link IMPORTING iv_path TYPE string RETURNING VALUE(rv_html) TYPE string, build_inactive_object_code IMPORTING is_item TYPE zif_abapgit_definitions=>ty_repo_item RETURNING VALUE(rv_inactive_html_code) TYPE string, open_in_master_language RAISING zcx_abapgit_exception. ENDCLASS. CLASS ZCL_ABAPGIT_GUI_VIEW_REPO IMPLEMENTATION. METHOD build_dir_jump_link. DATA: lv_path TYPE string, lv_encode TYPE string. lv_path = iv_path. REPLACE FIRST OCCURRENCE OF mv_cur_dir IN lv_path WITH ''. lv_encode = zcl_abapgit_html_action_utils=>dir_encode( lv_path ). rv_html = zcl_abapgit_html=>a( iv_txt = lv_path iv_act = |{ c_actions-change_dir }?{ lv_encode }| ). ENDMETHOD. METHOD build_grid_menu. CREATE OBJECT ro_toolbar. IF mo_repo->has_remote_source( ) = abap_true. ro_toolbar->add( " Show/Hide files iv_txt = 'Show files' iv_chk = boolc( NOT mv_hide_files = abap_true ) iv_act = c_actions-toggle_hide_files ). ro_toolbar->add( " Show changes only iv_txt = 'Show changes only' iv_chk = mv_changes_only iv_act = c_actions-toggle_changes ). ENDIF. ro_toolbar->add( " Show/Hide folders iv_txt = 'Show folders' iv_chk = mv_show_folders iv_act = c_actions-toggle_folders ). ENDMETHOD. METHOD build_head_menu. DATA: lo_tb_advanced TYPE REF TO zcl_abapgit_html_toolbar, lo_tb_branch TYPE REF TO zcl_abapgit_html_toolbar, lo_tb_tag TYPE REF TO zcl_abapgit_html_toolbar, lv_key TYPE zif_abapgit_persistence=>ty_value, lv_wp_opt LIKE zif_abapgit_definitions=>c_html_opt-crossout, lv_crossout LIKE zif_abapgit_definitions=>c_html_opt-crossout, lv_pull_opt LIKE zif_abapgit_definitions=>c_html_opt-crossout. CREATE OBJECT ro_toolbar. CREATE OBJECT lo_tb_branch. CREATE OBJECT lo_tb_advanced. CREATE OBJECT lo_tb_tag. lv_key = mo_repo->get_key( ). IF mo_repo->get_local_settings( )-write_protected = abap_true. lv_wp_opt = zif_abapgit_definitions=>c_html_opt-crossout. lv_pull_opt = zif_abapgit_definitions=>c_html_opt-crossout. ELSE. lv_pull_opt = zif_abapgit_definitions=>c_html_opt-strong. ENDIF. " Build branch drop-down ======================== IF mo_repo->is_offline( ) = abap_false. " Online ? lo_tb_branch->add( iv_txt = 'Overview' iv_act = |{ zif_abapgit_definitions=>c_action-go_branch_overview }?{ lv_key }| ). lo_tb_branch->add( iv_txt = 'Switch' iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_switch }?{ lv_key }| iv_opt = lv_wp_opt ). lo_tb_branch->add( iv_txt = 'Create' iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_create }?{ lv_key }| ). lo_tb_branch->add( iv_txt = 'Delete' iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_delete }?{ lv_key }| ). lo_tb_tag->add( iv_txt = 'Overview' iv_act = |{ zif_abapgit_definitions=>c_action-go_tag_overview }?{ lv_key }| ). lo_tb_tag->add( iv_txt = 'Switch' iv_act = |{ zif_abapgit_definitions=>c_action-git_tag_switch }?{ lv_key }| iv_opt = lv_wp_opt ). lo_tb_tag->add( iv_txt = 'Create' iv_act = |{ zif_abapgit_definitions=>c_action-git_tag_create }?{ lv_key }| ). lo_tb_tag->add( iv_txt = 'Delete' iv_act = |{ zif_abapgit_definitions=>c_action-git_tag_delete }?{ lv_key }| ). ENDIF. " Build advanced drop-down ======================== IF iv_rstate IS NOT INITIAL OR iv_lstate IS NOT INITIAL. " In case of asyncronicities lo_tb_advanced->add( iv_txt = 'Reset local' iv_act = |{ zif_abapgit_definitions=>c_action-git_reset }?{ lv_key }| iv_opt = lv_wp_opt ). ENDIF. IF mo_repo->is_offline( ) = abap_false. " Online ? lo_tb_advanced->add( iv_txt = 'Background mode' iv_act = |{ zif_abapgit_definitions=>c_action-go_background }?{ lv_key }| ). lo_tb_advanced->add( iv_txt = 'Change remote' iv_act = |{ zif_abapgit_definitions=>c_action-repo_remote_change }?{ lv_key }| ). lo_tb_advanced->add( iv_txt = 'Make off-line' iv_act = |{ zif_abapgit_definitions=>c_action-repo_remote_detach }?{ lv_key }| ). lo_tb_advanced->add( iv_txt = 'Force stage' iv_act = |{ zif_abapgit_definitions=>c_action-go_stage }?{ lv_key }| ). CLEAR lv_crossout. IF zcl_abapgit_auth=>is_allowed( zif_abapgit_auth=>gc_authorization-transport_to_branch ) = abap_false. lv_crossout = zif_abapgit_definitions=>c_html_opt-crossout. ENDIF. lo_tb_advanced->add( iv_txt = 'Transport to Branch' iv_act = |{ zif_abapgit_definitions=>c_action-repo_transport_to_branch }?{ lv_key }| iv_opt = lv_crossout ). ELSE. lo_tb_advanced->add( iv_txt = 'Make on-line' iv_act = |{ zif_abapgit_definitions=>c_action-repo_remote_attach }?{ lv_key }| ). ENDIF. lo_tb_advanced->add( iv_txt = 'Syntax Check' iv_act = |{ zif_abapgit_definitions=>c_action-repo_syntax_check }?{ lv_key }| ). lo_tb_advanced->add( iv_txt = 'Run Code Inspector' iv_act = |{ zif_abapgit_definitions=>c_action-repo_code_inspector }?{ lv_key }| ). lo_tb_advanced->add( iv_txt = 'Repo settings' iv_act = |{ zif_abapgit_definitions=>c_action-repo_settings }?{ lv_key }| ). CLEAR lv_crossout. IF zcl_abapgit_auth=>is_allowed( zif_abapgit_auth=>gc_authorization-update_local_checksum ) = abap_false. lv_crossout = zif_abapgit_definitions=>c_html_opt-crossout. ENDIF. lo_tb_advanced->add( iv_txt = 'Update local checksums' iv_act = |{ zif_abapgit_definitions=>c_action-repo_refresh_checksums }?{ lv_key }| iv_opt = lv_crossout ). IF mo_repo->get_dot_abapgit( )->get_master_language( ) <> sy-langu. lo_tb_advanced->add( iv_txt = 'Open in master language' iv_act = |{ zif_abapgit_definitions=>c_action-repo_open_in_master_lang }?{ lv_key }| ). ENDIF. lo_tb_advanced->add( iv_txt = 'Remove' iv_act = |{ zif_abapgit_definitions=>c_action-repo_remove }?{ lv_key }| ). CLEAR lv_crossout. IF mo_repo->get_local_settings( )-write_protected = abap_true OR zcl_abapgit_auth=>is_allowed( zif_abapgit_auth=>gc_authorization-uninstall ) = abap_false. lv_crossout = zif_abapgit_definitions=>c_html_opt-crossout. ENDIF. lo_tb_advanced->add( iv_txt = 'Uninstall' iv_act = |{ zif_abapgit_definitions=>c_action-repo_purge }?{ lv_key }| iv_opt = lv_crossout ). " Build main toolbar ============================== IF mo_repo->is_offline( ) = abap_false. " Online ? IF iv_rstate IS NOT INITIAL. " Something new at remote ro_toolbar->add( iv_txt = 'Pull' iv_act = |{ zif_abapgit_definitions=>c_action-git_pull }?{ lv_key }| iv_opt = lv_pull_opt ). ENDIF. IF iv_lstate IS NOT INITIAL. " Something new at local ro_toolbar->add( iv_txt = 'Stage' iv_act = |{ zif_abapgit_definitions=>c_action-go_stage }?{ lv_key }| iv_opt = zif_abapgit_definitions=>c_html_opt-strong ). ENDIF. IF iv_rstate IS NOT INITIAL OR iv_lstate IS NOT INITIAL. " Any changes ro_toolbar->add( iv_txt = 'Show diff' iv_act = |{ zif_abapgit_definitions=>c_action-go_diff }?key={ lv_key }| iv_opt = zif_abapgit_definitions=>c_html_opt-strong ). ENDIF. ro_toolbar->add( iv_txt = 'Branch' io_sub = lo_tb_branch ) ##NO_TEXT. ro_toolbar->add( iv_txt = 'Tag' io_sub = lo_tb_tag ) ##NO_TEXT. ELSE. IF mo_repo->has_remote_source( ) = abap_true AND iv_rstate IS NOT INITIAL. ro_toolbar->add( iv_txt = 'Pull zip' iv_act = |{ zif_abapgit_definitions=>c_action-git_pull }?{ lv_key }| iv_opt = zif_abapgit_definitions=>c_html_opt-strong ). ro_toolbar->add( iv_txt = 'Show diff' iv_act = |{ zif_abapgit_definitions=>c_action-go_diff }?key={ lv_key }| iv_opt = zif_abapgit_definitions=>c_html_opt-strong ). ENDIF. ro_toolbar->add( iv_txt = 'Import zip' iv_act = |{ zif_abapgit_definitions=>c_action-zip_import }?{ lv_key }| iv_opt = zif_abapgit_definitions=>c_html_opt-strong ). ro_toolbar->add( iv_txt = 'Export zip' iv_act = |{ zif_abapgit_definitions=>c_action-zip_export }?{ lv_key }| iv_opt = zif_abapgit_definitions=>c_html_opt-strong ). ENDIF. ro_toolbar->add( iv_txt = 'Advanced' io_sub = lo_tb_advanced ) ##NO_TEXT. ro_toolbar->add( iv_txt = 'Refresh' iv_act = |{ zif_abapgit_definitions=>c_action-repo_refresh }?{ lv_key }| ). ro_toolbar->add( iv_txt = zcl_abapgit_html=>icon( iv_name = 'settings/grey70' ) io_sub = build_grid_menu( ) ). ENDMETHOD. METHOD build_inactive_object_code. IF is_item-inactive = abap_true. rv_inactive_html_code = zcl_abapgit_html=>icon( iv_name = 'zap/orange' iv_hint = 'Object or object part is inactive' iv_class = 'inactive' ). ENDIF. ENDMETHOD. METHOD build_obj_jump_link. DATA: lv_encode TYPE string. lv_encode = zcl_abapgit_html_action_utils=>jump_encode( iv_obj_type = is_item-obj_type iv_obj_name = is_item-obj_name ). rv_html = zcl_abapgit_html=>a( iv_txt = |{ is_item-obj_name }| iv_act = |{ zif_abapgit_definitions=>c_action-jump }?{ lv_encode }| ). ENDMETHOD. METHOD constructor. DATA lo_settings TYPE REF TO zcl_abapgit_settings. super->constructor( ). mo_repo = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). mv_cur_dir = '/'. " Root mv_hide_files = zcl_abapgit_persistence_user=>get_instance( )->get_hide_files( ). mv_changes_only = zcl_abapgit_persistence_user=>get_instance( )->get_changes_only( ). " Read global settings to get max # of objects to be listed lo_settings = zcl_abapgit_persist_settings=>get_instance( )->read( ). mv_max_lines = lo_settings->get_max_lines( ). mv_max_setting = mv_max_lines. ENDMETHOD. METHOD get_item_class. DATA lt_class TYPE TABLE OF string. IF is_item-is_dir = abap_true. APPEND 'folder' TO lt_class. ELSEIF is_item-changes > 0. APPEND 'modified' TO lt_class. ELSEIF is_item-obj_name IS INITIAL. APPEND 'unsupported' TO lt_class. ENDIF. IF lines( lt_class ) > 0. rv_html = | class="{ concat_lines_of( table = lt_class sep = ` ` ) }"|. ENDIF. ENDMETHOD. METHOD get_item_icon. CASE is_item-obj_type. WHEN 'PROG' OR 'CLAS' OR 'FUGR'. rv_html = zcl_abapgit_html=>icon( 'file-code/darkgrey' ). WHEN 'W3MI' OR 'W3HT'. rv_html = zcl_abapgit_html=>icon( 'file-binary/darkgrey' ). WHEN ''. rv_html = space. " no icon WHEN OTHERS. rv_html = zcl_abapgit_html=>icon( 'file/darkgrey' ). ENDCASE. IF is_item-is_dir = abap_true. rv_html = zcl_abapgit_html=>icon( 'file-directory/darkgrey' ). ENDIF. ENDMETHOD. METHOD open_in_master_language. CONSTANTS: lc_abapgit_tcode TYPE tcode VALUE `ZABAPGIT` ##NO_TEXT. DATA: lv_master_language TYPE spras, lt_spagpa TYPE STANDARD TABLE OF rfc_spagpa, ls_spagpa LIKE LINE OF lt_spagpa, ls_item TYPE zif_abapgit_definitions=>ty_item, lv_subrc TYPE syst-subrc, lv_save_sy_langu TYPE sy-langu. " https://blogs.sap.com/2017/01/13/logon-language-sy-langu-and-rfc/ lv_master_language = mo_repo->get_dot_abapgit( )->get_master_language( ). IF lv_master_language = sy-langu. zcx_abapgit_exception=>raise( |Repo already opened in master language| ). ENDIF. ls_item-obj_name = lc_abapgit_tcode. ls_item-obj_type = |TRAN|. IF zcl_abapgit_objects=>exists( ls_item ) = abap_false. zcx_abapgit_exception=>raise( |Please install the abapGit repository| ). ENDIF. lv_save_sy_langu = sy-langu. SET LOCALE LANGUAGE lv_master_language. ls_spagpa-parid = zif_abapgit_definitions=>c_spagpa_param_repo_key. ls_spagpa-parval = mo_repo->get_key( ). INSERT ls_spagpa INTO TABLE lt_spagpa. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' DESTINATION 'NONE' STARTING NEW TASK 'ABAPGIT' EXPORTING tcode = lc_abapgit_tcode TABLES spagpa_tab = lt_spagpa EXCEPTIONS call_transaction_denied = 1 tcode_invalid = 2 communication_failure = 3 system_failure = 4 OTHERS = 5. lv_subrc = sy-subrc. SET LOCALE LANGUAGE lv_save_sy_langu. IF lv_subrc <> 0. zcx_abapgit_exception=>raise( |Error from ABAP4_CALL_TRANSACTION. Subrc = { lv_subrc }| ). ENDIF. MESSAGE 'Repository opened in a new window' TYPE 'S'. ENDMETHOD. METHOD render_empty_package. DATA: lv_text TYPE string. IF mv_changes_only = abap_true. lv_text = |No changes|. ELSE. lv_text = |Empty package|. ENDIF. rv_html = |
{ mv_cur_dir } | | ). ENDIF. ro_html->add( '' ). ro_html->add( lo_toolbar->render( iv_right = abap_true ) ). ro_html->add( ' | ' ). ro_html->add( '