From 9f9f6b191d1089bf69d66d9d90cdefde5aa2a7dc Mon Sep 17 00:00:00 2001 From: sbcgua Date: Tue, 4 Oct 2016 23:20:02 +0200 Subject: [PATCH] lcl_gui_view_repo_content - code reorg #280 --- src/zabapgit.prog.abap | 8 +- src/zabapgit_page.prog.abap | 14 ++ src/zabapgit_page_main.prog.abap | 397 +----------------------------- src/zabapgit_view_repo.prog.abap | 405 +++++++++++++++++++++++++++++++ src/zabapgit_view_repo.prog.xml | 48 ++++ 5 files changed, 483 insertions(+), 389 deletions(-) create mode 100644 src/zabapgit_view_repo.prog.abap create mode 100644 src/zabapgit_view_repo.prog.xml 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( '' ) ##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( '
' - && '
Empty package
' - && '
' ). - 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( '' ) ##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( '
' + && '
Empty package
' + && '
' ). + 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 + + + + + +