diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap
index d79ca5acd..4a561cb42 100644
--- a/src/zabapgit.prog.abap
+++ b/src/zabapgit.prog.abap
@@ -42,7 +42,7 @@ INCLUDE zabapgit_html.
INCLUDE zabapgit_util.
INCLUDE zabapgit_xml.
-INCLUDE zabapgit_app. " Some deferred definitions here
+INCLUDE zabapgit_app. " Some deferred definitions here
INCLUDE zabapgit_persistence_old.
INCLUDE zabapgit_persistence.
INCLUDE zabapgit_dot_abapgit.
@@ -60,14 +60,14 @@ INCLUDE zabapgit_popups.
INCLUDE zabapgit_zip.
INCLUDE zabapgit_objects_impl.
-INCLUDE zabapgit_object_serializing. " All serializing classes here
+INCLUDE zabapgit_object_serializing. " All serializing classes here
INCLUDE zabapgit_repo_impl.
INCLUDE zabapgit_background.
INCLUDE zabapgit_transport.
-INCLUDE zabapgit_services. " All services here
-INCLUDE zabapgit_gui_pages. " All GUI pages here
+INCLUDE zabapgit_services. " All services here
+INCLUDE zabapgit_gui_pages. " All GUI pages here
INCLUDE zabapgit_gui_pages_userexit IF FOUND.
INCLUDE zabapgit_gui_router.
INCLUDE zabapgit_gui.
diff --git a/src/zabapgit_page.prog.abap b/src/zabapgit_page.prog.abap
index b694933b0..a520d3d85 100644
--- a/src/zabapgit_page.prog.abap
+++ b/src/zabapgit_page.prog.abap
@@ -29,6 +29,10 @@ CLASS lcl_gui_page_super DEFINITION ABSTRACT.
PUBLIC SECTION.
INTERFACES lif_gui_page ABSTRACT METHODS render.
+ CLASS-METHODS render_error
+ IMPORTING ix_error TYPE REF TO lcx_exception
+ RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
+
PROTECTED SECTION.
METHODS render_repo_top
IMPORTING io_repo TYPE REF TO lcl_repo
@@ -251,6 +255,16 @@ CLASS lcl_gui_page_super IMPLEMENTATION.
ENDMETHOD. "render html footer & logo
+ METHOD render_error.
+
+ CREATE OBJECT ro_html.
+
+ ro_html->add( '
' ).
+ ro_html->add( |Error: { ix_error->mv_text }| ).
+ ro_html->add( '
' ).
+
+ ENDMETHOD. "render_error
+
METHOD redirect.
CREATE OBJECT ro_html.
diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap
index 0e8c9ac86..8a2f8ffe8 100644
--- a/src/zabapgit_page_main.prog.abap
+++ b/src/zabapgit_page_main.prog.abap
@@ -2,6 +2,8 @@
*& Include ZABAPGIT_PAGE_MAIN
*&---------------------------------------------------------------------*
+INCLUDE zabapgit_view_repo.
+
CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
PUBLIC SECTION.
@@ -15,32 +17,15 @@ CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
PRIVATE SECTION.
CONSTANTS: BEGIN OF c_actions,
show TYPE string VALUE 'show' ##NO_TEXT,
- toggle_hide_files TYPE string VALUE 'toggle_hide_files' ##NO_TEXT,
END OF c_actions.
- CONSTANTS: c_default_sortkey TYPE i VALUE 9999.
-
- TYPES: BEGIN OF ty_repo_item,
- obj_type TYPE tadir-object,
- obj_name TYPE tadir-obj_name,
- is_first TYPE abap_bool,
- files TYPE tt_repo_files,
- sortkey TYPE i,
- changes TYPE i,
- END OF ty_repo_item.
- TYPES tt_repo_items TYPE STANDARD TABLE OF ty_repo_item WITH DEFAULT KEY.
-
- DATA: mv_show TYPE lcl_persistence_db=>ty_value,
- mv_hide_files TYPE abap_bool.
+ DATA: mv_show TYPE lcl_persistence_db=>ty_value.
METHODS:
- retrieve_active_repo
- RAISING lcx_exception,
styles
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper,
- render_error
- IMPORTING ix_error TYPE REF TO lcx_exception
- RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper,
+ retrieve_active_repo
+ RAISING lcx_exception,
render_toc
IMPORTING it_list TYPE lcl_repo_srv=>ty_repo_tt
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
@@ -52,34 +37,18 @@ CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
RAISING lcx_exception,
build_main_menu
RETURNING VALUE(ro_menu) TYPE REF TO lcl_html_toolbar,
- render_repo_menu
- IMPORTING io_repo TYPE REF TO lcl_repo
+ render_explore
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
RAISING lcx_exception,
render_repo
IMPORTING io_repo TYPE REF TO lcl_repo
- RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
- RAISING lcx_exception,
- extract_repo_content
- IMPORTING io_repo TYPE REF TO lcl_repo
- EXPORTING et_repo_items TYPE tt_repo_items
- eo_log TYPE REF TO lcl_log
- RAISING lcx_exception,
- render_repo_item
- IMPORTING io_repo TYPE REF TO lcl_repo
- is_item TYPE ty_repo_item
- RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
- RAISING lcx_exception,
- render_obj_jump_link
- IMPORTING iv_obj_type TYPE tadir-object
- iv_obj_name TYPE tadir-obj_name
- RETURNING VALUE(rv_html) TYPE string,
- render_explore
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
RAISING lcx_exception.
ENDCLASS.
+
+
CLASS lcl_gui_page_main IMPLEMENTATION.
METHOD constructor.
@@ -99,7 +68,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
WHEN c_actions-show. " Change displayed repo
lcl_app=>user( )->set_repo_show( lv_key ).
ev_state = gc_event_state-re_render.
- WHEN c_actions-toggle_hide_files. " Toggle file diplay
+ WHEN lcl_gui_view_repo_content=>c_actions-toggle_hide_files. " Toggle file diplay
lcl_app=>user( )->toggle_hide_files( ).
ev_state = gc_event_state-re_render.
ENDCASE.
@@ -117,7 +86,6 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
lo_repo LIKE LINE OF lt_repos.
retrieve_active_repo( ). " Get and validate key of user default repo
- mv_hide_files = lcl_app=>user( )->get_hide_files( ).
CREATE OBJECT ro_html.
@@ -175,20 +143,6 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
ENDMETHOD. "retrieve_active_repo
- METHOD render_obj_jump_link.
-
- DATA: lv_encode TYPE string,
- lo_html TYPE REF TO lcl_html_helper.
-
- lv_encode = lcl_html_action_utils=>jump_encode( iv_obj_type = iv_obj_type
- iv_obj_name = iv_obj_name ).
-
- CREATE OBJECT lo_html.
- lo_html->add_anchor( iv_txt = |{ iv_obj_name }| iv_act = |{ gc_action-jump }?{ lv_encode }| ).
- rv_html = lo_html->mv_html.
-
- ENDMETHOD. "render_obj_jump_link
-
METHOD build_main_menu.
DATA lo_betasub TYPE REF TO lcl_html_toolbar.
@@ -300,16 +254,6 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
ENDMETHOD. "render_toc_line
- METHOD render_error.
-
- CREATE OBJECT ro_html.
-
- ro_html->add( '' ).
- ro_html->add( |Error: { ix_error->mv_text }| ).
- ro_html->add( '
' ).
-
- ENDMETHOD. "render_error
-
METHOD render_explore.
DATA lo_toolbar TYPE REF TO lcl_html_toolbar.
@@ -326,339 +270,22 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
ENDMETHOD. "render_explore
-**********************************************************************
-* SELECTED REPO RENDERING
-**********************************************************************
-
METHOD render_repo.
- DATA: lt_repo_items TYPE tt_repo_items,
- lo_tab_menu TYPE REF TO lcl_html_toolbar,
- lx_error TYPE REF TO lcx_exception,
- lo_log TYPE REF TO lcl_log.
+ DATA: lo_repo_content TYPE REF TO lcl_gui_view_repo_content.
- FIELD-SYMBOLS LIKE LINE OF lt_repo_items.
-
- CREATE OBJECT lo_tab_menu.
CREATE OBJECT ro_html.
ro_html->add( || ).
ro_html->add( render_repo_top( io_repo = io_repo iv_interactive_branch = abap_true ) ).
- TRY.
- extract_repo_content( EXPORTING io_repo = io_repo
- IMPORTING et_repo_items = lt_repo_items
- eo_log = lo_log ).
-
- " extract_repo_content must be called before rendering the menu
- " so that lo_log is filled with errors from the serialization
- ro_html->add( render_repo_menu( io_repo ) ).
-
- IF io_repo->is_offline( ) = abap_false and lo_log->count( ) > 0.
- ro_html->add( '
' ).
- ro_html->add( lo_log->to_html( ) ). " shows eg. list of unsupported objects
- ro_html->add( '
' ).
- ENDIF.
-
- ro_html->add( '
' ).
- IF io_repo->is_offline( ) = abap_false.
- IF mv_hide_files = abap_true.
- lo_tab_menu->add( iv_txt = 'Show files' iv_act = c_actions-toggle_hide_files ).
- ELSE.
- lo_tab_menu->add( iv_txt = 'Hide files' iv_act = c_actions-toggle_hide_files ).
- ENDIF.
- ro_html->add( lo_tab_menu->render( iv_as_angle = abap_true ) ).
- ENDIF.
-
- ro_html->add( '
' ).
- IF lines( lt_repo_items ) = 0.
- ro_html->add( ''
- && 'Empty package'
- && ' |
' ) ##NO_TEXT.
- ELSE.
- LOOP AT lt_repo_items ASSIGNING .
- ro_html->add( render_repo_item( io_repo = io_repo is_item = ) ).
- ENDLOOP.
- ENDIF.
- ro_html->add( '
' ).
- ro_html->add( '
' ).
-
- CATCH lcx_exception INTO lx_error.
- ro_html->add( render_repo_menu( io_repo ) ).
- ro_html->add( render_error( lx_error ) ).
- ENDTRY.
+ CREATE OBJECT lo_repo_content EXPORTING io_repo = io_repo.
+ ro_html->add( lo_repo_content->render( ) ).
ro_html->add( '
' ).
ENDMETHOD. "render_repo
- METHOD render_repo_menu.
-
- DATA: lo_toolbar TYPE REF TO lcl_html_toolbar,
- lo_tb_advanced TYPE REF TO lcl_html_toolbar,
- lo_tb_branch TYPE REF TO lcl_html_toolbar,
- lv_key TYPE lcl_persistence_db=>ty_value,
- lv_wp_opt LIKE gc_html_opt-crossout,
- lv_pull_opt LIKE gc_html_opt-crossout,
- lo_repo_online TYPE REF TO lcl_repo_online.
-
- CREATE OBJECT ro_html.
- CREATE OBJECT lo_toolbar.
- CREATE OBJECT lo_tb_branch.
- CREATE OBJECT lo_tb_advanced.
-
- lv_key = io_repo->get_key( ).
- IF io_repo->is_offline( ) = abap_false.
- lo_repo_online ?= io_repo.
- ENDIF.
-
- IF io_repo->is_write_protected( ) = abap_true.
- lv_wp_opt = gc_html_opt-crossout.
- lv_pull_opt = gc_html_opt-crossout.
- ELSE.
- lv_pull_opt = gc_html_opt-emphas.
- ENDIF.
-
- " Build branch drop-down ========================
- IF io_repo->is_offline( ) = abap_false. " Online ?
- lo_tb_branch->add( iv_txt = 'Overview'
- iv_act = |{ gc_action-go_branch_overview }?{ lv_key }| ).
- lo_tb_branch->add( iv_txt = 'Switch'
- iv_act = |{ gc_action-git_branch_switch }?{ lv_key }|
- iv_opt = lv_wp_opt ).
- lo_tb_branch->add( iv_txt = 'Create'
- iv_act = |{ gc_action-git_branch_create }?{ lv_key }| ).
- lo_tb_branch->add( iv_txt = 'Delete'
- iv_act = |{ gc_action-git_branch_delete }?{ lv_key }| ).
- ENDIF.
-
- " Build advanced drop-down ========================
- IF io_repo->is_offline( ) = abap_false. " Online ?
- lo_tb_advanced->add( iv_txt = 'Reset local'
- iv_act = |{ gc_action-git_reset }?{ lv_key }|
- iv_opt = lv_wp_opt ).
- lo_tb_advanced->add( iv_txt = 'Background mode'
- iv_act = |{ gc_action-go_background }?{ lv_key }| ).
- lo_tb_advanced->add( iv_txt = 'Change remote'
- iv_act = |{ gc_action-repo_remote_change }?{ lv_key }| ).
- lo_tb_advanced->add( iv_txt = 'Make off-line'
- iv_act = |{ gc_action-repo_remote_detach }?{ lv_key }| ).
- ELSE.
- lo_tb_advanced->add( iv_txt = 'Make on-line'
- iv_act = |{ gc_action-repo_remote_attach }?{ lv_key }| ).
- ENDIF.
- lo_tb_advanced->add( iv_txt = 'Remove'
- iv_act = |{ gc_action-repo_remove }?{ lv_key }| ).
- lo_tb_advanced->add( iv_txt = 'Uninstall'
- iv_act = |{ gc_action-repo_purge }?{ lv_key }|
- iv_opt = lv_wp_opt ).
-
- " Build main toolbar ==============================
- IF io_repo->is_offline( ) = abap_false. " Online ?
- TRY.
- IF lo_repo_online->get_sha1_remote( ) <> lo_repo_online->get_sha1_local( ).
- lo_toolbar->add( iv_txt = 'Pull'
- iv_act = |{ gc_action-git_pull }?{ lv_key }|
- iv_opt = lv_pull_opt ).
- ENDIF.
- IF lcl_stage_logic=>count( lo_repo_online ) > 0.
- lo_toolbar->add( iv_txt = 'Stage'
- iv_act = |{ gc_action-go_stage }?{ lv_key }|
- iv_opt = gc_html_opt-emphas ).
- ENDIF.
- CATCH lcx_exception ##NO_HANDLER.
- " authorization error or repository does not exist
- " ignore error
- ENDTRY.
- lo_toolbar->add( iv_txt = 'Branch'
- io_sub = lo_tb_branch ) ##NO_TEXT.
- ELSE.
- lo_toolbar->add( iv_txt = 'Import ZIP'
- iv_act = |{ gc_action-zip_import }?{ lv_key }|
- iv_opt = gc_html_opt-emphas ).
- lo_toolbar->add( iv_txt = 'Export ZIP'
- iv_act = |{ gc_action-zip_export }?{ lv_key }|
- iv_opt = gc_html_opt-emphas ).
- ENDIF.
-
- lo_toolbar->add( iv_txt = 'Advanced'
- io_sub = lo_tb_advanced ) ##NO_TEXT.
- lo_toolbar->add( iv_txt = 'Refresh'
- iv_act = |{ gc_action-repo_refresh }?{ lv_key }| ).
-
- " Render ==========================================
- ro_html->add( '' ).
- ro_html->add( lo_toolbar->render( ) ).
- ro_html->add( '
' ).
-
- ENDMETHOD. "render_repo_menu
-
- METHOD extract_repo_content.
-
- DATA: lo_repo_online TYPE REF TO lcl_repo_online,
- lt_tadir TYPE ty_tadir_tt,
- ls_file TYPE ty_repo_file,
- lt_results TYPE ty_results_tt.
-
- FIELD-SYMBOLS: LIKE LINE OF lt_results,
- LIKE LINE OF et_repo_items,
- LIKE LINE OF lt_tadir.
-
-
- CLEAR et_repo_items.
-
- IF io_repo->is_offline( ) = abap_true.
- lt_tadir = lcl_tadir=>read( io_repo->get_package( ) ).
- LOOP AT lt_tadir ASSIGNING .
- APPEND INITIAL LINE TO et_repo_items ASSIGNING .
- IF sy-tabix = 1.
- -is_first = abap_true.
- ENDIF.
- -obj_type = -object.
- -obj_name = -obj_name.
- ENDLOOP.
-
- ELSE.
- CREATE OBJECT eo_log.
- lo_repo_online ?= io_repo.
- lt_results = lo_repo_online->status( eo_log ).
- LOOP AT lt_results ASSIGNING .
- AT NEW obj_name. "obj_type + obj_name
- APPEND INITIAL LINE TO et_repo_items ASSIGNING .
- -obj_type = -obj_type.
- -obj_name = -obj_name.
- -sortkey = c_default_sortkey. " Default sort key
- -changes = 0.
- ENDAT.
-
- IF -filename IS NOT INITIAL.
- ls_file-path = -path.
- ls_file-filename = -filename.
- ls_file-is_changed = boolc( NOT -match = abap_true ).
- ls_file-new = -new.
- APPEND ls_file TO -files.
-
- IF ls_file-is_changed = abap_true OR ls_file-new IS NOT INITIAL.
- -sortkey = 2. " Changed files
- -changes = -changes + 1.
- ENDIF.
- ENDIF.
-
- AT END OF obj_name. "obj_type + obj_name
- IF -obj_type IS INITIAL.
- -sortkey = 0. "Virtual objects
- ELSEIF lines( -files ) = 0.
- -sortkey = 1. "New object to commit
- ENDIF.
- ENDAT.
- ENDLOOP.
-
- SORT et_repo_items BY sortkey obj_type obj_name ASCENDING.
- READ TABLE et_repo_items ASSIGNING INDEX 1.
- IF sy-subrc IS INITIAL.
- -is_first = abap_true.
- ENDIF.
- ENDIF.
-
-
- ENDMETHOD. "extract_repo_content
-
- METHOD render_repo_item.
- DATA:
- lv_link TYPE string,
- lv_icon TYPE string,
- lv_difflink TYPE string,
- ls_file LIKE LINE OF is_item-files,
- lv_trclass TYPE string.
-
- CREATE OBJECT ro_html.
-
- IF is_item-is_first = abap_true. " TR class
- lv_trclass = 'firstrow' ##NO_TEXT.
- ENDIF.
- IF is_item-obj_name IS INITIAL.
- lv_trclass = lv_trclass && ' unsupported' ##NO_TEXT.
- ENDIF.
- IF is_item-sortkey > 0 AND is_item-sortkey < c_default_sortkey.
- lv_trclass = lv_trclass && ' modified' ##NO_TEXT.
- ENDIF.
- IF lv_trclass IS NOT INITIAL.
- SHIFT lv_trclass LEFT DELETING LEADING space.
- lv_trclass = | class="{ lv_trclass }"|.
- ENDIF.
-
- ro_html->add( || ).
-
- IF is_item-obj_name IS INITIAL.
- ro_html->add( ' | '
- && 'non-code and meta files | ' ).
- ELSE.
- CASE is_item-obj_type. "TODO ??
- WHEN 'PROG' OR 'CLAS' OR 'FUGR'.
- lv_icon = |
|.
- WHEN 'W3MI' OR 'W3HT'.
- lv_icon = |
|.
- WHEN ''.
- lv_icon = space. " no icon
- WHEN OTHERS.
- lv_icon = |
|.
- ENDCASE.
-
- lv_link = render_obj_jump_link( iv_obj_name = is_item-obj_name
- iv_obj_type = is_item-obj_type ).
- ro_html->add( |{ lv_icon } | | ).
- ro_html->add( |{ is_item-obj_type } | | ).
- ro_html->add( |{ lv_link } | | ).
- ENDIF.
-
- IF io_repo->is_offline( ) = abap_false. " Files for online repos only
-
- ro_html->add( '' ).
- IF mv_hide_files = abap_false OR is_item-obj_type IS INITIAL.
- LOOP AT is_item-files INTO ls_file.
- ro_html->add( |{ ls_file-path && ls_file-filename }| ).
- ENDLOOP.
- ENDIF.
- ro_html->add( ' | ' ).
-
- ro_html->add( '' ).
- IF lines( is_item-files ) = 0.
- ro_html->add( 'new @local' ).
- ELSEIF is_item-changes > 0.
- IF mv_hide_files = abap_true AND is_item-obj_name IS NOT INITIAL.
- lv_difflink = lcl_html_action_utils=>obj_encode(
- iv_key = io_repo->get_key( )
- ig_object = is_item ).
- ro_html->add_anchor(
- iv_txt = |diff ({ is_item-changes })|
- iv_act = |{ gc_action-go_diff }?{ lv_difflink }| ).
- ELSE.
- LOOP AT is_item-files INTO ls_file.
- IF ls_file-new = gc_new-remote.
- ro_html->add( 'new @remote' ).
- ELSEIF ls_file-new = gc_new-local.
- ro_html->add( 'new @local' ).
- ELSEIF ls_file-is_changed = abap_true.
- lv_difflink = lcl_html_action_utils=>file_encode(
- iv_key = io_repo->get_key( )
- ig_file = ls_file ).
- ro_html->add_anchor(
- iv_txt = 'diff'
- iv_act = |{ gc_action-go_diff }?{ lv_difflink }| ).
- ELSE.
- ro_html->add( | | ).
- ENDIF.
- ENDLOOP.
- ENDIF.
- ENDIF.
- ro_html->add( ' | ' ).
-
- ENDIF.
-
- ro_html->add( '
' ).
-
- ENDMETHOD. "render_repo_item
-
**********************************************************************
* ASSETS, STYLES, SCRIPTS
**********************************************************************
diff --git a/src/zabapgit_view_repo.prog.abap b/src/zabapgit_view_repo.prog.abap
new file mode 100644
index 000000000..1cce2df0b
--- /dev/null
+++ b/src/zabapgit_view_repo.prog.abap
@@ -0,0 +1,405 @@
+*&---------------------------------------------------------------------*
+*& Include ZABAPGIT_VIEW_REPO
+*&---------------------------------------------------------------------*
+
+CLASS lcl_gui_view_repo_content DEFINITION FINAL.
+ PUBLIC SECTION.
+
+ CONSTANTS: BEGIN OF c_actions,
+ toggle_hide_files TYPE string VALUE 'toggle_hide_files' ##NO_TEXT,
+ END OF c_actions.
+
+ METHODS constructor
+ IMPORTING io_repo TYPE REF TO lcl_repo
+ RAISING lcx_exception.
+ METHODS render
+ RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
+ RAISING lcx_exception.
+
+ PRIVATE SECTION.
+
+ CONSTANTS: c_default_sortkey TYPE i VALUE 9999.
+
+ TYPES: BEGIN OF ty_repo_item,
+ obj_type TYPE tadir-object,
+ obj_name TYPE tadir-obj_name,
+ is_first TYPE abap_bool,
+ files TYPE tt_repo_files,
+ sortkey TYPE i,
+ changes TYPE i,
+ END OF ty_repo_item.
+ TYPES tt_repo_items TYPE STANDARD TABLE OF ty_repo_item WITH DEFAULT KEY.
+
+ DATA: mo_repo TYPE REF TO lcl_repo,
+ mv_hide_files TYPE abap_bool.
+
+ METHODS:
+ render_repo_menu
+ IMPORTING io_repo TYPE REF TO lcl_repo
+ RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
+ RAISING lcx_exception,
+ extract_repo_content
+ IMPORTING io_repo TYPE REF TO lcl_repo
+ EXPORTING et_repo_items TYPE tt_repo_items
+ eo_log TYPE REF TO lcl_log
+ RAISING lcx_exception,
+ render_repo_item
+ IMPORTING io_repo TYPE REF TO lcl_repo
+ is_item TYPE ty_repo_item
+ RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
+ RAISING lcx_exception,
+ render_obj_jump_link
+ IMPORTING iv_obj_type TYPE tadir-object
+ iv_obj_name TYPE tadir-obj_name
+ RETURNING VALUE(rv_html) TYPE string.
+
+ENDCLASS. "lcl_gui_view_repo_content
+
+CLASS lcl_gui_view_repo_content IMPLEMENTATION.
+
+ METHOD constructor.
+
+ mo_repo ?= io_repo.
+ mv_hide_files = lcl_app=>user( )->get_hide_files( ).
+
+ ENDMETHOD. "constructor
+
+ METHOD render.
+
+ DATA: lt_repo_items TYPE tt_repo_items,
+ lo_tab_menu TYPE REF TO lcl_html_toolbar,
+ lx_error TYPE REF TO lcx_exception,
+ lo_log TYPE REF TO lcl_log.
+
+ FIELD-SYMBOLS LIKE LINE OF lt_repo_items.
+
+ CREATE OBJECT lo_tab_menu.
+ CREATE OBJECT ro_html.
+
+ TRY.
+ extract_repo_content( EXPORTING io_repo = mo_repo
+ IMPORTING et_repo_items = lt_repo_items
+ eo_log = lo_log ).
+
+ " extract_repo_content must be called before rendering the menu
+ " so that lo_log is filled with errors from the serialization
+ ro_html->add( render_repo_menu( mo_repo ) ).
+
+ IF mo_repo->is_offline( ) = abap_false and lo_log->count( ) > 0.
+ ro_html->add( '' ).
+ ro_html->add( lo_log->to_html( ) ). " shows eg. list of unsupported objects
+ ro_html->add( '
' ).
+ ENDIF.
+
+ ro_html->add( '' ).
+ IF mo_repo->is_offline( ) = abap_false.
+ IF mv_hide_files = abap_true.
+* lo_tab_menu->add( iv_txt = 'Show files' iv_act = c_actions-toggle_hide_files ).
+ ELSE.
+* lo_tab_menu->add( iv_txt = 'Hide files' iv_act = c_actions-toggle_hide_files ).
+ ENDIF.
+ ro_html->add( lo_tab_menu->render( iv_as_angle = abap_true ) ).
+ ENDIF.
+
+ ro_html->add( '
' ).
+ IF lines( lt_repo_items ) = 0.
+ ro_html->add( ''
+ && 'Empty package'
+ && ' |
' ) ##NO_TEXT.
+ ELSE.
+ LOOP AT lt_repo_items ASSIGNING .
+ ro_html->add( render_repo_item( io_repo = mo_repo is_item = ) ).
+ ENDLOOP.
+ ENDIF.
+ ro_html->add( '
' ).
+ ro_html->add( '
' ).
+
+ CATCH lcx_exception INTO lx_error.
+ ro_html->add( render_repo_menu( mo_repo ) ).
+ ro_html->add( lcl_gui_page_super=>render_error( lx_error ) ).
+ ENDTRY.
+
+ ENDMETHOD. "render
+
+ METHOD render_repo_menu.
+
+ DATA: lo_toolbar TYPE REF TO lcl_html_toolbar,
+ lo_tb_advanced TYPE REF TO lcl_html_toolbar,
+ lo_tb_branch TYPE REF TO lcl_html_toolbar,
+ lv_key TYPE lcl_persistence_db=>ty_value,
+ lv_wp_opt LIKE gc_html_opt-crossout,
+ lv_pull_opt LIKE gc_html_opt-crossout,
+ lo_repo_online TYPE REF TO lcl_repo_online.
+
+ CREATE OBJECT ro_html.
+ CREATE OBJECT lo_toolbar.
+ CREATE OBJECT lo_tb_branch.
+ CREATE OBJECT lo_tb_advanced.
+
+ lv_key = io_repo->get_key( ).
+ IF io_repo->is_offline( ) = abap_false.
+ lo_repo_online ?= io_repo.
+ ENDIF.
+
+ IF io_repo->is_write_protected( ) = abap_true.
+ lv_wp_opt = gc_html_opt-crossout.
+ lv_pull_opt = gc_html_opt-crossout.
+ ELSE.
+ lv_pull_opt = gc_html_opt-emphas.
+ ENDIF.
+
+ " Build branch drop-down ========================
+ IF io_repo->is_offline( ) = abap_false. " Online ?
+ lo_tb_branch->add( iv_txt = 'Overview'
+ iv_act = |{ gc_action-go_branch_overview }?{ lv_key }| ).
+ lo_tb_branch->add( iv_txt = 'Switch'
+ iv_act = |{ gc_action-git_branch_switch }?{ lv_key }|
+ iv_opt = lv_wp_opt ).
+ lo_tb_branch->add( iv_txt = 'Create'
+ iv_act = |{ gc_action-git_branch_create }?{ lv_key }| ).
+ lo_tb_branch->add( iv_txt = 'Delete'
+ iv_act = |{ gc_action-git_branch_delete }?{ lv_key }| ).
+ ENDIF.
+
+ " Build advanced drop-down ========================
+ IF io_repo->is_offline( ) = abap_false. " Online ?
+ lo_tb_advanced->add( iv_txt = 'Reset local'
+ iv_act = |{ gc_action-git_reset }?{ lv_key }|
+ iv_opt = lv_wp_opt ).
+ lo_tb_advanced->add( iv_txt = 'Background mode'
+ iv_act = |{ gc_action-go_background }?{ lv_key }| ).
+ lo_tb_advanced->add( iv_txt = 'Change remote'
+ iv_act = |{ gc_action-repo_remote_change }?{ lv_key }| ).
+ lo_tb_advanced->add( iv_txt = 'Make off-line'
+ iv_act = |{ gc_action-repo_remote_detach }?{ lv_key }| ).
+ ELSE.
+ lo_tb_advanced->add( iv_txt = 'Make on-line'
+ iv_act = |{ gc_action-repo_remote_attach }?{ lv_key }| ).
+ ENDIF.
+ lo_tb_advanced->add( iv_txt = 'Remove'
+ iv_act = |{ gc_action-repo_remove }?{ lv_key }| ).
+ lo_tb_advanced->add( iv_txt = 'Uninstall'
+ iv_act = |{ gc_action-repo_purge }?{ lv_key }|
+ iv_opt = lv_wp_opt ).
+
+ " Build main toolbar ==============================
+ IF io_repo->is_offline( ) = abap_false. " Online ?
+ TRY.
+ IF lo_repo_online->get_sha1_remote( ) <> lo_repo_online->get_sha1_local( ).
+ lo_toolbar->add( iv_txt = 'Pull'
+ iv_act = |{ gc_action-git_pull }?{ lv_key }|
+ iv_opt = lv_pull_opt ).
+ ENDIF.
+ IF lcl_stage_logic=>count( lo_repo_online ) > 0.
+ lo_toolbar->add( iv_txt = 'Stage'
+ iv_act = |{ gc_action-go_stage }?{ lv_key }|
+ iv_opt = gc_html_opt-emphas ).
+ ENDIF.
+ CATCH lcx_exception ##NO_HANDLER.
+ " authorization error or repository does not exist
+ " ignore error
+ ENDTRY.
+ lo_toolbar->add( iv_txt = 'Branch'
+ io_sub = lo_tb_branch ) ##NO_TEXT.
+ ELSE.
+ lo_toolbar->add( iv_txt = 'Import ZIP'
+ iv_act = |{ gc_action-zip_import }?{ lv_key }|
+ iv_opt = gc_html_opt-emphas ).
+ lo_toolbar->add( iv_txt = 'Export ZIP'
+ iv_act = |{ gc_action-zip_export }?{ lv_key }|
+ iv_opt = gc_html_opt-emphas ).
+ ENDIF.
+
+ lo_toolbar->add( iv_txt = 'Advanced'
+ io_sub = lo_tb_advanced ) ##NO_TEXT.
+ lo_toolbar->add( iv_txt = 'Refresh'
+ iv_act = |{ gc_action-repo_refresh }?{ lv_key }| ).
+
+ " Render ==========================================
+ ro_html->add( '' ).
+ ro_html->add( lo_toolbar->render( ) ).
+ ro_html->add( '
' ).
+
+ ENDMETHOD. "render_repo_menu
+
+ METHOD extract_repo_content.
+
+ DATA: lo_repo_online TYPE REF TO lcl_repo_online,
+ lt_tadir TYPE ty_tadir_tt,
+ ls_file TYPE ty_repo_file,
+ lt_results TYPE ty_results_tt.
+
+ FIELD-SYMBOLS: LIKE LINE OF lt_results,
+ LIKE LINE OF et_repo_items,
+ LIKE LINE OF lt_tadir.
+
+
+ CLEAR et_repo_items.
+
+ IF io_repo->is_offline( ) = abap_true.
+ lt_tadir = lcl_tadir=>read( io_repo->get_package( ) ).
+ LOOP AT lt_tadir ASSIGNING .
+ APPEND INITIAL LINE TO et_repo_items ASSIGNING .
+ IF sy-tabix = 1.
+ -is_first = abap_true.
+ ENDIF.
+ -obj_type = -object.
+ -obj_name = -obj_name.
+ ENDLOOP.
+
+ ELSE.
+ CREATE OBJECT eo_log.
+ lo_repo_online ?= io_repo.
+ lt_results = lo_repo_online->status( eo_log ).
+ LOOP AT lt_results ASSIGNING .
+ AT NEW obj_name. "obj_type + obj_name
+ APPEND INITIAL LINE TO et_repo_items ASSIGNING .
+ -obj_type = -obj_type.
+ -obj_name = -obj_name.
+ -sortkey = c_default_sortkey. " Default sort key
+ -changes = 0.
+ ENDAT.
+
+ IF -filename IS NOT INITIAL.
+ ls_file-path = -path.
+ ls_file-filename = -filename.
+ ls_file-is_changed = boolc( NOT -match = abap_true ).
+ ls_file-new = -new.
+ APPEND ls_file TO -files.
+
+ IF ls_file-is_changed = abap_true OR ls_file-new IS NOT INITIAL.
+ -sortkey = 2. " Changed files
+ -changes = -changes + 1.
+ ENDIF.
+ ENDIF.
+
+ AT END OF obj_name. "obj_type + obj_name
+ IF -obj_type IS INITIAL.
+ -sortkey = 0. "Virtual objects
+ ELSEIF lines( -files ) = 0.
+ -sortkey = 1. "New object to commit
+ ENDIF.
+ ENDAT.
+ ENDLOOP.
+
+ SORT et_repo_items BY sortkey obj_type obj_name ASCENDING.
+ READ TABLE et_repo_items ASSIGNING INDEX 1.
+ IF sy-subrc IS INITIAL.
+ -is_first = abap_true.
+ ENDIF.
+ ENDIF.
+
+
+ ENDMETHOD. "extract_repo_content
+
+ METHOD render_repo_item.
+ DATA:
+ lv_link TYPE string,
+ lv_icon TYPE string,
+ lv_difflink TYPE string,
+ ls_file LIKE LINE OF is_item-files,
+ lv_trclass TYPE string.
+
+ CREATE OBJECT ro_html.
+
+ IF is_item-is_first = abap_true. " TR class
+ lv_trclass = 'firstrow' ##NO_TEXT.
+ ENDIF.
+ IF is_item-obj_name IS INITIAL.
+ lv_trclass = lv_trclass && ' unsupported' ##NO_TEXT.
+ ENDIF.
+ IF is_item-sortkey > 0 AND is_item-sortkey < c_default_sortkey.
+ lv_trclass = lv_trclass && ' modified' ##NO_TEXT.
+ ENDIF.
+ IF lv_trclass IS NOT INITIAL.
+ SHIFT lv_trclass LEFT DELETING LEADING space.
+ lv_trclass = | class="{ lv_trclass }"|.
+ ENDIF.
+
+ ro_html->add( || ).
+
+ IF is_item-obj_name IS INITIAL.
+ ro_html->add( ' | '
+ && 'non-code and meta files | ' ).
+ ELSE.
+ CASE is_item-obj_type. "TODO ??
+ WHEN 'PROG' OR 'CLAS' OR 'FUGR'.
+ lv_icon = |
|.
+ WHEN 'W3MI' OR 'W3HT'.
+ lv_icon = |
|.
+ WHEN ''.
+ lv_icon = space. " no icon
+ WHEN OTHERS.
+ lv_icon = |
|.
+ ENDCASE.
+
+ lv_link = render_obj_jump_link( iv_obj_name = is_item-obj_name
+ iv_obj_type = is_item-obj_type ).
+ ro_html->add( |{ lv_icon } | | ).
+ ro_html->add( |{ is_item-obj_type } | | ).
+ ro_html->add( |{ lv_link } | | ).
+ ENDIF.
+
+ IF io_repo->is_offline( ) = abap_false. " Files for online repos only
+
+ ro_html->add( '' ).
+ IF mv_hide_files = abap_false OR is_item-obj_type IS INITIAL.
+ LOOP AT is_item-files INTO ls_file.
+ ro_html->add( |{ ls_file-path && ls_file-filename }| ).
+ ENDLOOP.
+ ENDIF.
+ ro_html->add( ' | ' ).
+
+ ro_html->add( '' ).
+ IF lines( is_item-files ) = 0.
+ ro_html->add( 'new @local' ).
+ ELSEIF is_item-changes > 0.
+ IF mv_hide_files = abap_true AND is_item-obj_name IS NOT INITIAL.
+ lv_difflink = lcl_html_action_utils=>obj_encode(
+ iv_key = io_repo->get_key( )
+ ig_object = is_item ).
+ ro_html->add_anchor(
+ iv_txt = |diff ({ is_item-changes })|
+ iv_act = |{ gc_action-go_diff }?{ lv_difflink }| ).
+ ELSE.
+ LOOP AT is_item-files INTO ls_file.
+ IF ls_file-new = gc_new-remote.
+ ro_html->add( 'new @remote' ).
+ ELSEIF ls_file-new = gc_new-local.
+ ro_html->add( 'new @local' ).
+ ELSEIF ls_file-is_changed = abap_true.
+ lv_difflink = lcl_html_action_utils=>file_encode(
+ iv_key = io_repo->get_key( )
+ ig_file = ls_file ).
+ ro_html->add_anchor(
+ iv_txt = 'diff'
+ iv_act = |{ gc_action-go_diff }?{ lv_difflink }| ).
+ ELSE.
+ ro_html->add( | | ).
+ ENDIF.
+ ENDLOOP.
+ ENDIF.
+ ENDIF.
+ ro_html->add( ' | ' ).
+
+ ENDIF.
+
+ ro_html->add( '
' ).
+
+ ENDMETHOD. "render_repo_item
+
+ METHOD render_obj_jump_link.
+
+ DATA: lv_encode TYPE string,
+ lo_html TYPE REF TO lcl_html_helper.
+
+ lv_encode = lcl_html_action_utils=>jump_encode( iv_obj_type = iv_obj_type
+ iv_obj_name = iv_obj_name ).
+
+ CREATE OBJECT lo_html.
+ lo_html->add_anchor( iv_txt = |{ iv_obj_name }| iv_act = |{ gc_action-jump }?{ lv_encode }| ).
+ rv_html = lo_html->mv_html.
+
+ ENDMETHOD. "render_obj_jump_link
+
+ENDCLASS. "lcl_gui_view_repo_content
\ No newline at end of file
diff --git a/src/zabapgit_view_repo.prog.xml b/src/zabapgit_view_repo.prog.xml
new file mode 100644
index 000000000..6da1c7449
--- /dev/null
+++ b/src/zabapgit_view_repo.prog.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+ ZABAPGIT_VIEW_REPO
+ A
+
+
+ X
+
+
+
+
+
+ I
+
+
+
+ 0000-00-00
+
+ 0000-00-00
+
+
+
+
+ E
+
+
+ 0000-00-00
+
+ 0000-00-00
+
+
+ X
+
+
+ -
+ R
+
+ Include ZABAPGIT_VIEW_REPO
+ 26
+
+
+
+
+
+