From a6a7523b0be6d25210f96ec178366e78a6556d1a Mon Sep 17 00:00:00 2001 From: sbcgua Date: Mon, 3 Oct 2016 09:08:25 +0300 Subject: [PATCH 01/16] cherrypick cache repo results (#280) --- src/zabapgit_file_status.prog.abap | 25 +++++++++++-------------- src/zabapgit_repo.prog.abap | 3 ++- src/zabapgit_repo_impl.prog.abap | 8 ++++++-- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/zabapgit_file_status.prog.abap b/src/zabapgit_file_status.prog.abap index 8ade9c97a..105c3b2dd 100644 --- a/src/zabapgit_file_status.prog.abap +++ b/src/zabapgit_file_status.prog.abap @@ -37,15 +37,12 @@ CLASS lcl_file_status IMPLEMENTATION. METHOD compare_files. READ TABLE it_repo WITH KEY - path = is_gen-path + path = is_gen-path filename = is_gen-filename - data = is_gen-data + sha1 = is_gen-sha1 TRANSPORTING NO FIELDS. - IF sy-subrc <> 0. - rv_match = abap_false. - ELSE. - rv_match = abap_true. - ENDIF. + + rv_match = boolc( sy-subrc = 0 ). ENDMETHOD. "compare_files @@ -70,7 +67,7 @@ CLASS lcl_file_status IMPLEMENTATION. lt_remote = io_repo->get_files_remote( ). - lt_local = io_repo->get_files_local( io_log ). + lt_local = io_repo->get_files_local( io_log ). LOOP AT lt_remote ASSIGNING . lcl_progress=>show( iv_key = 'Status' @@ -112,8 +109,8 @@ CLASS lcl_file_status IMPLEMENTATION. LOOP AT lt_files ASSIGNING . ls_result-filename = -filename. - ls_result-match = compare_files( it_repo = lt_remote - is_gen = ). + ls_result-match = compare_files( it_repo = lt_remote + is_gen = ). APPEND ls_result TO rt_results. ENDLOOP. ENDLOOP. @@ -124,7 +121,7 @@ CLASS lcl_file_status IMPLEMENTATION. TRANSPORTING NO FIELDS. IF sy-subrc <> 0. IF io_repo->get_dot_abapgit( )->is_ignored( - iv_path = -path + iv_path = -path iv_filename = -filename ) = abap_true. CONTINUE. ENDIF. @@ -149,7 +146,7 @@ CLASS lcl_file_status IMPLEMENTATION. LOOP AT lt_tadir ASSIGNING . READ TABLE rt_results WITH KEY obj_type = -object - obj_name = -obj_name + obj_name = -obj_name TRANSPORTING NO FIELDS. IF sy-subrc <> 0. ls_item-obj_type = -object. @@ -168,8 +165,8 @@ CLASS lcl_file_status IMPLEMENTATION. LOOP AT rt_results ASSIGNING WHERE obj_type = -object - AND obj_name = -obj_name - AND path IS INITIAL. + AND obj_name = -obj_name + AND path IS INITIAL. * new file added locally to existing object -path = io_repo->get_dot_abapgit( )->get_starting_folder( ) && -path. -new = gc_new-local. diff --git a/src/zabapgit_repo.prog.abap b/src/zabapgit_repo.prog.abap index 43288f1da..ba68c567b 100644 --- a/src/zabapgit_repo.prog.abap +++ b/src/zabapgit_repo.prog.abap @@ -121,7 +121,8 @@ CLASS lcl_repo_online DEFINITION INHERITING FROM lcl_repo FINAL. mt_objects TYPE ty_objects_tt, mv_branch TYPE ty_sha1, mv_initialized TYPE abap_bool, - mo_branches TYPE REF TO lcl_git_branch_list. + mo_branches TYPE REF TO lcl_git_branch_list, + mt_status TYPE ty_results_tt. METHODS: handle_stage_ignore diff --git a/src/zabapgit_repo_impl.prog.abap b/src/zabapgit_repo_impl.prog.abap index 21e8c5e8b..5aa3702a3 100644 --- a/src/zabapgit_repo_impl.prog.abap +++ b/src/zabapgit_repo_impl.prog.abap @@ -42,8 +42,11 @@ CLASS lcl_repo_online IMPLEMENTATION. initialize( ). - rt_results = lcl_file_status=>status( io_repo = me - io_log = io_log ). + IF lines( mt_status ) = 0. + mt_status = lcl_file_status=>status( io_repo = me + io_log = io_log ). + ENDIF. + rt_results = mt_status. ENDMETHOD. "status @@ -66,6 +69,7 @@ CLASS lcl_repo_online IMPLEMENTATION. METHOD refresh. super->refresh( ). + CLEAR mt_status. lcl_progress=>show( iv_key = 'Fetch' iv_current = 1 From 9f9f6b191d1089bf69d66d9d90cdefde5aa2a7dc Mon Sep 17 00:00:00 2001 From: sbcgua Date: Tue, 4 Oct 2016 23:20:02 +0200 Subject: [PATCH 02/16] 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 + + + + + + From cc1e5693ba05237fa6537bd8c314462bf87c9fd3 Mon Sep 17 00:00:00 2001 From: sbcgua Date: Wed, 5 Oct 2016 08:20:06 +0200 Subject: [PATCH 03/16] fix --- src/zabapgit_view_repo.prog.abap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/zabapgit_view_repo.prog.abap b/src/zabapgit_view_repo.prog.abap index 1cce2df0b..89ad74f96 100644 --- a/src/zabapgit_view_repo.prog.abap +++ b/src/zabapgit_view_repo.prog.abap @@ -94,9 +94,9 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. 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 ). + 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 ). + 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. From 362a8de7deb475396aa87fbb01ba06c6c88ad3fe Mon Sep 17 00:00:00 2001 From: sbcgua Date: Wed, 5 Oct 2016 23:17:29 +0200 Subject: [PATCH 04/16] folders part 1 #280 --- src/zabapgit_html_action_utils.prog.abap | 25 ++ src/zabapgit_page_main.prog.abap | 35 +- src/zabapgit_page_stage.prog.abap | 6 +- src/zabapgit_util.prog.abap | 125 ++++-- src/zabapgit_view_repo.prog.abap | 464 ++++++++++++++++------- 5 files changed, 479 insertions(+), 176 deletions(-) diff --git a/src/zabapgit_html_action_utils.prog.abap b/src/zabapgit_html_action_utils.prog.abap index 0e79640a0..bf425fa06 100644 --- a/src/zabapgit_html_action_utils.prog.abap +++ b/src/zabapgit_html_action_utils.prog.abap @@ -32,6 +32,15 @@ CLASS lcl_html_action_utils DEFINITION FINAL. ev_obj_name TYPE tadir-obj_name RAISING lcx_exception. + CLASS-METHODS dir_encode + IMPORTING iv_path TYPE string + RETURNING VALUE(rv_string) TYPE string. + + CLASS-METHODS dir_decode + IMPORTING iv_string TYPE clike + RETURNING VALUE(rv_path) TYPE string + RAISING lcx_exception. + CLASS-METHODS file_encode IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key ig_file TYPE any "assuming ty_file @@ -162,6 +171,22 @@ CLASS lcl_html_action_utils IMPLEMENTATION. ENDMETHOD. "jump_decode + METHOD dir_encode. + + DATA: lt_fields TYPE tihttpnvp. + add_field( EXPORTING name = 'PATH' iv = iv_path CHANGING ct = lt_fields ). + rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). + + ENDMETHOD. "dir_encode + + METHOD dir_decode. + + DATA: lt_fields TYPE tihttpnvp. + lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_string }| ). + get_field( EXPORTING name = 'PATH' it = lt_fields CHANGING cv = rv_path ). + + ENDMETHOD. "dir_decode + METHOD file_encode. DATA: lt_fields TYPE tihttpnvp. diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap index 8a2f8ffe8..fd36ca39a 100644 --- a/src/zabapgit_page_main.prog.abap +++ b/src/zabapgit_page_main.prog.abap @@ -19,7 +19,8 @@ CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super. show TYPE string VALUE 'show' ##NO_TEXT, END OF c_actions. - DATA: mv_show TYPE lcl_persistence_db=>ty_value. + DATA: mv_show TYPE lcl_persistence_db=>ty_value, + mv_cur_dir TYPE string. METHODS: styles @@ -48,19 +49,19 @@ CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super. ENDCLASS. - CLASS lcl_gui_page_main IMPLEMENTATION. METHOD constructor. super->constructor( ). + mv_cur_dir = '/'. " Root ENDMETHOD. " constructor METHOD lif_gui_page~on_event. DATA: lv_key TYPE lcl_persistence_repo=>ty_repo-key, - lv_url TYPE string. + lv_path TYPE string. lv_key = iv_getdata. @@ -71,6 +72,11 @@ CLASS lcl_gui_page_main IMPLEMENTATION. 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. + WHEN lcl_gui_view_repo_content=>c_actions-change_dir. " Toggle file diplay + lv_path = lcl_html_action_utils=>dir_decode( iv_getdata ). + mv_cur_dir = lcl_path=>change_dir( iv_cur_dir = mv_cur_dir iv_cd = lv_path ). + ev_state = gc_event_state-re_render. + ENDCASE. ENDMETHOD. "on_event @@ -280,7 +286,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ro_html->add( render_repo_top( io_repo = io_repo iv_interactive_branch = abap_true ) ). CREATE OBJECT lo_repo_content EXPORTING io_repo = io_repo. - ro_html->add( lo_repo_content->render( ) ). + ro_html->add( lo_repo_content->render( iv_path = mv_cur_dir ) ). ro_html->add( '
' ). @@ -329,12 +335,12 @@ CLASS lcl_gui_page_main IMPLEMENTATION. _add ' padding-left: 0.5em;'. _add ' padding-right: 1em;'. _add '}'. - _add '.repo_tab tr.unsupported { color: lightgrey; }'. - _add '.repo_tab tr.modified { background: #fbf7e9; }'. - _add '.repo_tab tr.firstrow td { border-top: 0px; }'. - _add '.repo_tab td.files span { display: block; }'. - _add '.repo_tab td.cmd span { display: block; }'. - _add '.repo_tab td.cmd a { display: block; }'. + _add '.repo_tab tr.unsupported { color: lightgrey; }'. + _add '.repo_tab tr.modified { background: #fbf7e9; }'. + _add '.repo_tab tr:first-child td { border-top: 0px; }'. + _add '.repo_tab td.files span { display: block; }'. + _add '.repo_tab td.cmd span { display: block; }'. + _add '.repo_tab td.cmd a { display: block; }'. ENDMETHOD. "styles @@ -468,6 +474,15 @@ CLASS lcl_gui_page_main IMPLEMENTATION. && '1gQQfzKDhgCSPFw9Kg2yZ9WqAgBWJBENLk6V3AAAAABJRU5ErkJggg=='. APPEND ls_image TO rt_assets. + ls_image-url = 'img/dir' ##NO_TEXT. + ls_image-content = + 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAASFBMVEUAAABmksxmksxm' + && 'ksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxm' + && 'ksxmksxmksxmksxMwQo8AAAAF3RSTlMABhIYIy1fZmhpe3+IiYuMkZvD7e/x93sipD4A' + && 'AAA+SURBVBhXY2BABzwiokAgzAYXEGdiBAIWIYQAPzcQCApzgwEXM4M4KuBDFxAYKAEx' + && 'VAFeBlYOTiTAzoThewD5hBAcnWM4gwAAAABJRU5ErkJggg=='. + APPEND ls_image TO rt_assets. + ENDMETHOD. "get_assets ENDCLASS. \ No newline at end of file diff --git a/src/zabapgit_page_stage.prog.abap b/src/zabapgit_page_stage.prog.abap index d0411902a..adce12564 100644 --- a/src/zabapgit_page_stage.prog.abap +++ b/src/zabapgit_page_stage.prog.abap @@ -105,9 +105,9 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. LOOP AT lt_fields ASSIGNING . - lcl_url=>split_file_location( EXPORTING iv_fullpath = -name - IMPORTING ev_path = ls_file-path - ev_filename = ls_file-filename ). + lcl_path=>split_file_location( EXPORTING iv_fullpath = -name + IMPORTING ev_path = ls_file-path + ev_filename = ls_file-filename ). CASE -value. WHEN lcl_stage=>c_method-add. diff --git a/src/zabapgit_util.prog.abap b/src/zabapgit_util.prog.abap index 78b1cddb0..c39b1cd9b 100644 --- a/src/zabapgit_util.prog.abap +++ b/src/zabapgit_util.prog.abap @@ -337,6 +337,105 @@ CLASS lcl_hash IMPLEMENTATION. ENDCLASS. "lcl_hash IMPLEMENTATION +CLASS lcl_path DEFINITION FINAL. + + PUBLIC SECTION. + + CLASS-METHODS split_file_location + IMPORTING iv_fullpath TYPE string + EXPORTING ev_path TYPE string + ev_filename TYPE string. + + CLASS-METHODS is_root + IMPORTING iv_path TYPE string + RETURNING VALUE(rv_yes) TYPE abap_bool. + + CLASS-METHODS is_subdir + IMPORTING iv_path TYPE string + iv_parent TYPE string + RETURNING VALUE(rv_yes) TYPE abap_bool. + + CLASS-METHODS change_dir + IMPORTING iv_cur_dir TYPE string + iv_cd TYPE string + RETURNING VALUE(rv_path) TYPE string. + +ENDCLASS. "lcl_path + +CLASS lcl_path IMPLEMENTATION. + + METHOD split_file_location. + + DATA: lv_cnt TYPE i, + lv_off TYPE i, + lv_len TYPE i. + + FIND FIRST OCCURRENCE OF REGEX '^/(.*/)?' IN iv_fullpath + MATCH COUNT lv_cnt + MATCH OFFSET lv_off + MATCH LENGTH lv_len. + + IF lv_cnt > 0. + ev_path = iv_fullpath+0(lv_len). + ev_filename = iv_fullpath+lv_len. + ELSE. + CLEAR ev_path. + ev_filename = iv_fullpath. + ENDIF. + + ENDMETHOD. "split_file_location + + METHOD is_root. + rv_yes = boolc( iv_path = '/' ). + ENDMETHOD. "is_root + + METHOD is_subdir. + + DATA lv_len TYPE i. + + lv_len = strlen( iv_parent ). + rv_yes = boolc( strlen( iv_path ) > lv_len AND iv_path+0(lv_len) = iv_parent ). + + ENDMETHOD. "is_subdir + + METHOD change_dir. + + DATA lv_last TYPE i. + DATA lv_temp TYPE string. + DATA lv_len TYPE i. + + lv_last = strlen( iv_cd ) - 1. + + IF iv_cd = '' OR iv_cd = '.'. " No change + rv_path = iv_cur_dir. + ELSEIF iv_cd+0(1) = '/'. " Absolute path + rv_path = iv_cd. + ELSEIF iv_cd = '..'. " CD back + IF iv_cur_dir = '/' OR iv_cur_dir = ''. " Back from root = root + rv_path = iv_cur_dir. + ELSE. + lv_temp = reverse( iv_cur_dir ). + IF lv_temp+0(1) = '/'. + SHIFT lv_temp BY 1 PLACES LEFT. + ENDIF. + SHIFT lv_temp UP TO '/' LEFT. + rv_path = reverse( lv_temp ). + ENDIF. + ELSE. + IF iv_cd+lv_last(1) = '/'. " Append cd to cur_dir separated by / + rv_path = iv_cur_dir && iv_cd. + ELSE. + rv_path = iv_cur_dir && '/' && iv_cd. + ENDIF. + ENDIF. + + " TODO: improve logic and cases + " TODO: Unit test + + ENDMETHOD. "change_dir + +ENDCLASS. "lcl_path + *----------------------------------------------------------------------* * CLASS lcl_url DEFINITION *----------------------------------------------------------------------* @@ -360,11 +459,6 @@ CLASS lcl_url DEFINITION FINAL. RETURNING VALUE(rv_path_name) TYPE string RAISING lcx_exception. - CLASS-METHODS split_file_location - IMPORTING iv_fullpath TYPE string - EXPORTING ev_path TYPE string - ev_filename TYPE string. - PRIVATE SECTION. CLASS-METHODS regex IMPORTING iv_repo TYPE string @@ -382,27 +476,6 @@ ENDCLASS. "lcl_repo DEFINITION *----------------------------------------------------------------------* CLASS lcl_url IMPLEMENTATION. - METHOD split_file_location. - - DATA: lv_cnt TYPE i, - lv_off TYPE i, - lv_len TYPE i. - - FIND FIRST OCCURRENCE OF REGEX '^/(.*/)?' IN iv_fullpath - MATCH COUNT lv_cnt - MATCH OFFSET lv_off - MATCH LENGTH lv_len. - - IF lv_cnt > 0. - ev_path = iv_fullpath+0(lv_len). - ev_filename = iv_fullpath+lv_len. - ELSE. - CLEAR ev_path. - ev_filename = iv_fullpath. - ENDIF. - - ENDMETHOD. "split_file_location - METHOD host. regex( EXPORTING iv_repo = iv_repo IMPORTING ev_host = rv_host ). diff --git a/src/zabapgit_view_repo.prog.abap b/src/zabapgit_view_repo.prog.abap index 89ad74f96..d06ec7e29 100644 --- a/src/zabapgit_view_repo.prog.abap +++ b/src/zabapgit_view_repo.prog.abap @@ -2,55 +2,242 @@ *& Include ZABAPGIT_VIEW_REPO *&---------------------------------------------------------------------* +CLASS lcl_repo_content_browser DEFINITION FINAL. + + PUBLIC SECTION. + + CONSTANTS: BEGIN OF c_sortkey, + default TYPE i VALUE 9999, + parent_dir TYPE i VALUE 0, + dir TYPE i VALUE 1, + wo_obj TYPE i VALUE 2, + new TYPE i VALUE 3, + changed TYPE i VALUE 4, + END OF c_sortkey. + + TYPES: BEGIN OF ty_repo_item, + obj_type TYPE tadir-object, + obj_name TYPE tadir-obj_name, + sortkey TYPE i, + path TYPE string, + is_dir TYPE abap_bool, + changes TYPE i, + files TYPE tt_repo_files, + END OF ty_repo_item. + TYPES tt_repo_items TYPE STANDARD TABLE OF ty_repo_item WITH DEFAULT KEY. + + METHODS constructor + IMPORTING io_repo TYPE REF TO lcl_repo. + + METHODS list + IMPORTING iv_path TYPE string + EXPORTING et_repo_items TYPE tt_repo_items + eo_log TYPE REF TO lcl_log + RAISING lcx_exception. + + PRIVATE SECTION. + DATA mo_repo TYPE REF TO lcl_repo. + DATA mo_log TYPE REF TO lcl_log. + + METHODS get_local + RETURNING VALUE(rt_repo_items) TYPE tt_repo_items + RAISING lcx_exception. + + METHODS get_remote + RETURNING VALUE(rt_repo_items) TYPE tt_repo_items + RAISING lcx_exception. + + METHODS build_folders + IMPORTING iv_cur_dir TYPE string + CHANGING ct_repo_items TYPE tt_repo_items + RAISING lcx_exception. + +ENDCLASS. "lcl_repo_content_browser + +CLASS lcl_repo_content_browser IMPLEMENTATION. + + METHOD constructor. + mo_repo = io_repo. + ENDMETHOD. "constructor + + METHOD list. + + CLEAR et_repo_items. + + IF mo_repo->is_offline( ) = abap_true. + et_repo_items = get_local( ). + ELSE. + CREATE OBJECT mo_log. + et_repo_items = get_remote( ). + eo_log = mo_log. + ENDIF. + + build_folders( + EXPORTING iv_cur_dir = iv_path + CHANGING ct_repo_items = et_repo_items ). + + SORT et_repo_items BY sortkey obj_type obj_name ASCENDING. + + ENDMETHOD. "list + + METHOD build_folders. + + DATA: lv_index TYPE i, + lt_folders LIKE ct_repo_items, + ls_folder LIKE LINE OF ct_repo_items. + + FIELD-SYMBOLS LIKE LINE OF ct_repo_items. + + LOOP AT ct_repo_items ASSIGNING . + lv_index = sy-tabix. + CHECK -path <> iv_cur_dir. " files in target dir - just leave them be + + IF lcl_path=>is_subdir( iv_path = -path iv_parent = iv_cur_dir ) = abap_true. + ls_folder-changes = -changes. + ls_folder-path = -path. + APPEND ls_folder TO lt_folders. + ENDIF. + + DELETE ct_repo_items INDEX lv_index. + ENDLOOP. + + SORT lt_folders BY path. + + LOOP AT lt_folders ASSIGNING . + AT NEW path. + CLEAR ls_folder. + ls_folder-path = -path. + ls_folder-sortkey = c_sortkey-dir. " Directory + ls_folder-is_dir = abap_true. + ENDAT. + + ls_folder-changes = ls_folder-changes + -changes. + + AT END OF path. + APPEND ls_folder TO ct_repo_items. + ENDAT. + ENDLOOP. + + ENDMETHOD. "build_folders + + METHOD get_local. + + DATA: lt_tadir TYPE ty_tadir_tt. + + FIELD-SYMBOLS: LIKE LINE OF rt_repo_items, + LIKE LINE OF lt_tadir. + + lt_tadir = lcl_tadir=>read( mo_repo->get_package( ) ). + LOOP AT lt_tadir ASSIGNING . + APPEND INITIAL LINE TO rt_repo_items ASSIGNING . + -obj_type = -object. + -obj_name = -obj_name. + -path = '/' && -path. " Add root anchor + -sortkey = c_sortkey-default. " Default sort key + ENDLOOP. + + ENDMETHOD. "get_local + + METHOD get_remote. + + DATA: lo_repo_online TYPE REF TO lcl_repo_online, + ls_file TYPE ty_repo_file, + lt_results TYPE ty_results_tt. + + FIELD-SYMBOLS: LIKE LINE OF lt_results, + LIKE LINE OF rt_repo_items. + + lo_repo_online ?= mo_repo. + lt_results = lo_repo_online->status( mo_log ). + + LOOP AT lt_results ASSIGNING . + AT NEW obj_name. "obj_type + obj_name + APPEND INITIAL LINE TO rt_repo_items ASSIGNING . + -obj_type = -obj_type. + -obj_name = -obj_name. + -sortkey = c_sortkey-default. " Default sort key + -changes = 0. + -path = -path. + 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 = c_sortkey-changed. " Changed files + -changes = -changes + 1. + ENDIF. + ENDIF. + + AT END OF obj_name. "obj_type + obj_name + IF -obj_type IS INITIAL. + -sortkey = c_sortkey-wo_obj. "Virtual objects + ELSEIF lines( -files ) = 0. + -sortkey = c_sortkey-new. "New object to commit + ENDIF. + ENDAT. + ENDLOOP. + + ENDMETHOD. "get_remote + +ENDCLASS. "lcl_repo_content_browser + +********************************************************************** +********************************************************************** + CLASS lcl_gui_view_repo_content DEFINITION FINAL. PUBLIC SECTION. 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, END OF c_actions. METHODS constructor IMPORTING io_repo TYPE REF TO lcl_repo RAISING lcx_exception. + METHODS render + IMPORTING iv_path TYPE string 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_cur_dir TYPE string, 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 + IMPORTING is_item TYPE lcl_repo_content_browser=>ty_repo_item RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper RAISING lcx_exception, + get_item_class + IMPORTING is_item TYPE lcl_repo_content_browser=>ty_repo_item + RETURNING VALUE(rv_html) TYPE string, + get_item_icon + IMPORTING is_item TYPE lcl_repo_content_browser=>ty_repo_item + RETURNING VALUE(rv_html) TYPE string, + render_empty_package + RETURNING VALUE(rv_html) TYPE string, + render_parent_dir_line + RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + + METHODS: 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_dir_jump_link + IMPORTING iv_path TYPE string RETURNING VALUE(rv_html) TYPE string. ENDCLASS. "lcl_gui_view_repo_content @@ -66,8 +253,9 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. METHOD render. - DATA: lt_repo_items TYPE tt_repo_items, + DATA: lt_repo_items TYPE lcl_repo_content_browser=>tt_repo_items, lo_tab_menu TYPE REF TO lcl_html_toolbar, + lo_browser TYPE REF TO lcl_repo_content_browser, lx_error TYPE REF TO lcx_exception, lo_log TYPE REF TO lcl_log. @@ -75,15 +263,15 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. CREATE OBJECT lo_tab_menu. CREATE OBJECT ro_html. + mv_cur_dir = iv_path. TRY. - extract_repo_content( EXPORTING io_repo = mo_repo - IMPORTING et_repo_items = lt_repo_items - eo_log = lo_log ). + ro_html->add( render_repo_menu( ) ). - " 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 ) ). + CREATE OBJECT lo_browser EXPORTING io_repo = mo_repo. + lo_browser->list( EXPORTING iv_path = iv_path + IMPORTING et_repo_items = lt_repo_items + eo_log = lo_log ). IF mo_repo->is_offline( ) = abap_false and lo_log->count( ) > 0. ro_html->add( '
' ). @@ -92,6 +280,8 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ENDIF. ro_html->add( '
' ). + + " Table menu 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 ). @@ -101,21 +291,26 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ro_html->add( lo_tab_menu->render( iv_as_angle = abap_true ) ). ENDIF. + " Repo content table ro_html->add( '' ). + + IF lcl_path=>is_root( iv_path ) = abap_false. + ro_html->add( render_parent_dir_line( ) ). + ENDIF. + IF lines( lt_repo_items ) = 0. - ro_html->add( '' ) ##NO_TEXT. + ro_html->add( render_empty_package( ) ). ELSE. LOOP AT lt_repo_items ASSIGNING . - ro_html->add( render_repo_item( io_repo = mo_repo is_item = ) ). + ro_html->add( render_repo_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( render_repo_menu( ) ). ro_html->add( lcl_gui_page_super=>render_error( lx_error ) ). ENDTRY. @@ -136,12 +331,12 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. 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. + lv_key = mo_repo->get_key( ). + IF mo_repo->is_offline( ) = abap_false. + lo_repo_online ?= mo_repo. ENDIF. - IF io_repo->is_write_protected( ) = abap_true. + IF mo_repo->is_write_protected( ) = abap_true. lv_wp_opt = gc_html_opt-crossout. lv_pull_opt = gc_html_opt-crossout. ELSE. @@ -149,7 +344,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ENDIF. " Build branch drop-down ======================== - IF io_repo->is_offline( ) = abap_false. " Online ? + IF mo_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' @@ -162,7 +357,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ENDIF. " Build advanced drop-down ======================== - IF io_repo->is_offline( ) = abap_false. " Online ? + IF mo_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 ). @@ -183,7 +378,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. iv_opt = lv_wp_opt ). " Build main toolbar ============================== - IF io_repo->is_offline( ) = abap_false. " Online ? + IF mo_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' @@ -216,131 +411,91 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. iv_act = |{ gc_action-repo_refresh }?{ lv_key }| ). " Render ========================================== - ro_html->add( '
' ). +* ro_html->add( '
' ). +* ro_html->add( lo_toolbar->render( ) ). +* ro_html->add( '
' ). + + ro_html->add( '
' ). + ro_html->add( '' ). + ro_html->add( || ). + ro_html->add( '' ). + ro_html->add( '
{ mv_cur_dir }' ). ro_html->add( lo_toolbar->render( ) ). + ro_html->add( '
' ). ro_html->add( '
' ). + ENDMETHOD. "render_repo_menu - METHOD extract_repo_content. + METHOD get_item_class. - 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. + DATA lt_class TYPE TABLE OF string. - 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. + IF is_item-obj_name IS INITIAL AND is_item-is_dir = abap_false. + APPEND 'unsupported' TO lt_class. ENDIF. + IF is_item-is_dir = abap_true. + APPEND 'folder' TO lt_class. + ENDIF. + + IF is_item-changes > 0. + APPEND 'modified' TO lt_class. + ENDIF. + + IF lines( lt_class ) > 0. + rv_html = | class="{ concat_lines_of( table = lt_class sep = ` ` ) }"|. + ENDIF. + + ENDMETHOD. "get_item_class + + METHOD get_item_icon. + + CASE is_item-obj_type. + WHEN 'PROG' OR 'CLAS' OR 'FUGR'. + rv_html = ||. + WHEN 'W3MI' OR 'W3HT'. + rv_html = ||. + WHEN ''. + rv_html = space. " no icon + WHEN OTHERS. + rv_html = ||. + ENDCASE. + + IF is_item-is_dir = abap_true. + rv_html = ||. + ENDIF. + + ENDMETHOD. "get_item_icon - 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. + ls_file LIKE LINE OF is_item-files. 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( || ). + ro_html->add( || ). - IF is_item-obj_name IS INITIAL. + IF is_item-obj_name IS INITIAL AND is_item-is_dir = abap_false. ro_html->add( '' && 'non-code and meta files' ). + ELSEIF is_item-is_dir = abap_true. + lv_link = render_dir_jump_link( iv_path = is_item-path ). + ro_html->add( |{ get_item_icon( is_item ) }| ). + ro_html->add( |{ lv_link }| ). 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( |{ get_item_icon( is_item ) }| ). 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 + IF mo_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. @@ -356,7 +511,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. 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( ) + iv_key = mo_repo->get_key( ) ig_object = is_item ). ro_html->add_anchor( iv_txt = |diff ({ is_item-changes })| @@ -369,7 +524,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. 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( ) + iv_key = mo_repo->get_key( ) ig_file = ls_file ). ro_html->add_anchor( iv_txt = 'diff' @@ -388,6 +543,41 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ENDMETHOD. "render_repo_item + METHOD render_empty_package. + + rv_html = '' + && '
Empty package
' + && '' ##NO_TEXT. + + ENDMETHOD. "render_empty_package + + METHOD render_parent_dir_line. + + CREATE OBJECT ro_html. + + ro_html->add( '' ). + ro_html->add( || ). + ro_html->add( |{ render_dir_jump_link( '..' ) }| ). + ro_html->add( '' ). + + ENDMETHOD. "render_parent_dir_line + + METHOD render_dir_jump_link. + + DATA: lv_path TYPE string, + lv_encode TYPE string, + lo_html TYPE REF TO lcl_html_helper. + + lv_path = iv_path. + REPLACE FIRST OCCURRENCE OF mv_cur_dir IN lv_path WITH ''. + lv_encode = lcl_html_action_utils=>dir_encode( lv_path ). + + CREATE OBJECT lo_html. + lo_html->add_anchor( iv_txt = lv_path iv_act = |{ c_actions-change_dir }?{ lv_encode }| ). + rv_html = lo_html->mv_html. + + ENDMETHOD. "render_dir_jump_link + METHOD render_obj_jump_link. DATA: lv_encode TYPE string, From 73daebf4f8dd71013c0ff5e5855e053f08265f47 Mon Sep 17 00:00:00 2001 From: sbcgua Date: Wed, 12 Oct 2016 20:04:29 +0300 Subject: [PATCH 05/16] cherrypick refresh --- src/zabapgit_page_main.prog.abap | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap index fd36ca39a..b6045c066 100644 --- a/src/zabapgit_page_main.prog.abap +++ b/src/zabapgit_page_main.prog.abap @@ -68,6 +68,10 @@ CLASS lcl_gui_page_main IMPLEMENTATION. CASE iv_action. WHEN c_actions-show. " Change displayed repo lcl_app=>user( )->set_repo_show( lv_key ). + TRY. + lcl_app=>repo_srv( )->get( lv_key )->refresh( ). + CATCH lcx_exception. + ENDTRY. ev_state = gc_event_state-re_render. WHEN lcl_gui_view_repo_content=>c_actions-toggle_hide_files. " Toggle file diplay lcl_app=>user( )->toggle_hide_files( ). From 1495a1783705006738b57ba7d9d8b1a2891f472e Mon Sep 17 00:00:00 2001 From: sbcgua Date: Wed, 12 Oct 2016 20:05:05 +0300 Subject: [PATCH 06/16] cherrypick 2 pretty print --- src/zabapgit_gui.prog.abap | 6 +++--- src/zabapgit_page_main.prog.abap | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/zabapgit_gui.prog.abap b/src/zabapgit_gui.prog.abap index 57aa70416..1bfa828e0 100644 --- a/src/zabapgit_gui.prog.abap +++ b/src/zabapgit_gui.prog.abap @@ -14,7 +14,7 @@ CLASS lcl_gui DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. METHODS back IMPORTING iv_to_bookmark TYPE abap_bool DEFAULT abap_false - RETURNING value(rv_exit) TYPE xfeld + RETURNING VALUE(rv_exit) TYPE xfeld RAISING lcx_exception. METHODS on_event FOR EVENT sapevent OF cl_gui_html_viewer @@ -45,13 +45,13 @@ CLASS lcl_gui DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. METHODS cache_html IMPORTING iv_html TYPE string - RETURNING value(rv_url) TYPE w3url. + RETURNING VALUE(rv_url) TYPE w3url. METHODS render RAISING lcx_exception. METHODS get_current_page_name - RETURNING value(rv_page_name) TYPE string. + RETURNING VALUE(rv_page_name) TYPE string. METHODS call_page IMPORTING ii_page TYPE REF TO lif_gui_page diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap index b6045c066..d8e79b447 100644 --- a/src/zabapgit_page_main.prog.abap +++ b/src/zabapgit_page_main.prog.abap @@ -91,9 +91,9 @@ CLASS lcl_gui_page_main IMPLEMENTATION. METHOD lif_gui_page~render. - DATA: lt_repos TYPE lcl_repo_srv=>ty_repo_tt, - lx_error TYPE REF TO lcx_exception, - lo_repo LIKE LINE OF lt_repos. + DATA: lt_repos TYPE lcl_repo_srv=>ty_repo_tt, + lx_error TYPE REF TO lcx_exception, + lo_repo LIKE LINE OF lt_repos. retrieve_active_repo( ). " Get and validate key of user default repo @@ -139,7 +139,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. TRY. " verify the key exists lo_repo = lcl_app=>repo_srv( )->get( mv_show ). CATCH lcx_exception. - clear mv_show. + CLEAR mv_show. ENDTRY. ENDIF. From e2c7ade099b8fd84b4ba8ba7c4a2b30cfdf88f51 Mon Sep 17 00:00:00 2001 From: sbcgua Date: Wed, 12 Oct 2016 20:08:15 +0300 Subject: [PATCH 07/16] cherrypick log style --- src/zabapgit_view_repo.prog.abap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zabapgit_view_repo.prog.abap b/src/zabapgit_view_repo.prog.abap index d06ec7e29..27adb40e0 100644 --- a/src/zabapgit_view_repo.prog.abap +++ b/src/zabapgit_view_repo.prog.abap @@ -274,7 +274,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. eo_log = lo_log ). IF mo_repo->is_offline( ) = abap_false and lo_log->count( ) > 0. - ro_html->add( '
' ). + ro_html->add( '
' ). ro_html->add( lo_log->to_html( ) ). " shows eg. list of unsupported objects ro_html->add( '
' ). ENDIF. From acbb05fe4da534c4b9b97e158afb942dab1c2142 Mon Sep 17 00:00:00 2001 From: sbcgua Date: Wed, 12 Oct 2016 20:10:24 +0300 Subject: [PATCH 08/16] cherrypick lock icon --- src/zabapgit_page.prog.abap | 4 ++++ src/zabapgit_page_main.prog.abap | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/src/zabapgit_page.prog.abap b/src/zabapgit_page.prog.abap index a520d3d85..62e2ee456 100644 --- a/src/zabapgit_page.prog.abap +++ b/src/zabapgit_page.prog.abap @@ -102,6 +102,10 @@ CLASS lcl_gui_page_super IMPLEMENTATION. ro_html->add( '' ). + IF io_repo->is_write_protected( ) = abap_true. + ro_html->add( '' ). + ENDIF. + IF io_repo->is_offline( ) = abap_false. lo_repo_online ?= io_repo. IF iv_show_branch = abap_true. diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap index d8e79b447..5eaeb18e4 100644 --- a/src/zabapgit_page_main.prog.abap +++ b/src/zabapgit_page_main.prog.abap @@ -478,6 +478,15 @@ CLASS lcl_gui_page_main IMPLEMENTATION. && '1gQQfzKDhgCSPFw9Kg2yZ9WqAgBWJBENLk6V3AAAAABJRU5ErkJggg=='. APPEND ls_image TO rt_assets. + ls_image-url = 'img/lock' ##NO_TEXT. + ls_image-content = + 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAOVBMVEUAAACIiIiIiIiI' + && 'iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIjNaTNB' + && 'AAAAEnRSTlMABgdBVXt8iYuRsNXZ3uDi6Pmu6tfUAAAASUlEQVQYV63KSxJAQBAE0TQ0' + && 'Znym1f0PayE0QdjJ5asCgGTu1hClqjppvaRXB60swBeA2QNUAIq+ICvKx367nqAn/P8Y' + && 't2jg3Q5rgASaF3KNRwAAAABJRU5ErkJggg=='. + APPEND ls_image TO rt_assets. + ls_image-url = 'img/dir' ##NO_TEXT. ls_image-content = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAASFBMVEUAAABmksxmksxm' From 4940e7538ff2a6f5b0087b6eb22de9b64d12d1e8 Mon Sep 17 00:00:00 2001 From: sbcgua Date: Wed, 12 Oct 2016 15:09:07 +0200 Subject: [PATCH 09/16] cherrypick background icon and toc marker --- src/zabapgit_page.prog.abap | 14 ++++++++++++++ src/zabapgit_page_main.prog.abap | 31 +++++++++++------------------- src/zabapgit_persistence.prog.abap | 28 ++++++++++++++++++++++++++- 3 files changed, 52 insertions(+), 21 deletions(-) diff --git a/src/zabapgit_page.prog.abap b/src/zabapgit_page.prog.abap index 62e2ee456..657d659ee 100644 --- a/src/zabapgit_page.prog.abap +++ b/src/zabapgit_page.prog.abap @@ -77,10 +77,12 @@ CLASS lcl_gui_page_super IMPLEMENTATION. METHOD render_repo_top. DATA: lo_repo_online TYPE REF TO lcl_repo_online, + lo_pback TYPE REF TO lcl_persistence_background, lv_icon TYPE string. CREATE OBJECT ro_html. + CREATE OBJECT lo_pback. IF io_repo->is_offline( ) = abap_true. lv_icon = 'img/repo_offline' ##NO_TEXT. @@ -102,6 +104,10 @@ CLASS lcl_gui_page_super IMPLEMENTATION. ro_html->add( '' ). + IF lo_pback->exists( io_repo->get_key( ) ) = abap_true. + ro_html->add( 'BG' ). + ENDIF. + IF io_repo->is_write_protected( ) = abap_true. ro_html->add( '' ). ENDIF. @@ -452,6 +458,14 @@ CLASS lcl_gui_page_super IMPLEMENTATION. _add ' margin-left: 0.2em;'. _add ' margin-right: 0.5em;'. _add '}'. + _add '.repo_attr span.bg_marker {'. + _add ' border: 1px solid #d2d2d2;'. + _add ' border-radius: 3px;'. + _add ' background: #d8d8d8;'. + _add ' color: #fff;'. + _add ' font-size: 8pt;'. + _add ' padding: 4px 2px 3px 2px;'. + _add '}'. " Branch tag design _add '.repo_attr span.branch {'. diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap index 5eaeb18e4..0c090081f 100644 --- a/src/zabapgit_page_main.prog.abap +++ b/src/zabapgit_page_main.prog.abap @@ -180,20 +180,17 @@ CLASS lcl_gui_page_main IMPLEMENTATION. METHOD render_toc. DATA: lo_pback TYPE REF TO lcl_persistence_background, - lt_repo_bkg TYPE lcl_persistence_background=>tt_background, lo_repo LIKE LINE OF it_list, lv_opt TYPE c LENGTH 1, lo_online TYPE REF TO lcl_html_toolbar, - lo_background TYPE REF TO lcl_html_toolbar, - lo_offline TYPE REF TO lcl_html_toolbar. + lo_offline TYPE REF TO lcl_html_toolbar, + lv_repo_title TYPE string. CREATE OBJECT ro_html. CREATE OBJECT lo_online. CREATE OBJECT lo_offline. - CREATE OBJECT lo_background. CREATE OBJECT lo_pback. - lt_repo_bkg = lo_pback->list( ). IF lines( it_list ) = 0. RETURN. @@ -211,17 +208,16 @@ CLASS lcl_gui_page_main IMPLEMENTATION. iv_act = |{ c_actions-show }?{ lo_repo->get_key( ) }| iv_opt = lv_opt ). ELSE. - READ TABLE lt_repo_bkg WITH KEY key = lo_repo->get_key( ) - TRANSPORTING NO FIELDS. - IF sy-subrc = 0. - lo_background->add( iv_txt = lo_repo->get_name( ) - iv_act = |{ c_actions-show }?{ lo_repo->get_key( ) }| - iv_opt = lv_opt ). - ELSE. - lo_online->add( iv_txt = lo_repo->get_name( ) - iv_act = |{ c_actions-show }?{ lo_repo->get_key( ) }| - iv_opt = lv_opt ). + + lv_repo_title = lo_repo->get_name( ). + IF lo_pback->exists( lo_repo->get_key( ) ) = abap_true. + lv_repo_title = lv_repo_title && 'bg'. " Background marker ENDIF. + + lo_online->add( iv_txt = lv_repo_title + iv_act = |{ c_actions-show }?{ lo_repo->get_key( ) }| + iv_opt = lv_opt ). + ENDIF. ENDLOOP. @@ -238,11 +234,6 @@ CLASS lcl_gui_page_main IMPLEMENTATION. iv_image_url = 'img/repo_offline' ) ). ENDIF. - IF lo_background->count( ) > 0. - ro_html->add( render_toc_line( io_toolbar = lo_background - iv_image_url = 'img/sync' ) ). - ENDIF. - ro_html->add( '
' ). ENDMETHOD. "render_toc diff --git a/src/zabapgit_persistence.prog.abap b/src/zabapgit_persistence.prog.abap index fe8f5a88a..159618316 100644 --- a/src/zabapgit_persistence.prog.abap +++ b/src/zabapgit_persistence.prog.abap @@ -239,10 +239,16 @@ CLASS lcl_persistence_background DEFINITION FINAL. IMPORTING iv_key TYPE ty_background-key RAISING lcx_exception. + METHODS exists + IMPORTING iv_key TYPE ty_background-key + RETURNING VALUE(rv_yes) TYPE abap_bool + RAISING lcx_exception. + PRIVATE SECTION. CONSTANTS c_type TYPE lcl_persistence_db=>ty_type VALUE 'BACKGROUND'. - DATA: mo_db TYPE REF TO lcl_persistence_db. + DATA: mo_db TYPE REF TO lcl_persistence_db, + mt_jobs TYPE tt_background. METHODS from_xml IMPORTING iv_string TYPE string @@ -269,6 +275,11 @@ CLASS lcl_persistence_background IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF lt_list, LIKE LINE OF rt_list. + IF lines( mt_jobs ) > 0. + rt_list = mt_jobs. + RETURN. + ENDIF. + lt_list = mo_db->list_by_type( c_type ). @@ -280,8 +291,18 @@ CLASS lcl_persistence_background IMPLEMENTATION. -key = -value. ENDLOOP. + mt_jobs = rt_list. + ENDMETHOD. + METHOD exists. + + list( ). " Ensure mt_jobs is populated + READ TABLE mt_jobs WITH KEY key = iv_key TRANSPORTING NO FIELDS. + rv_yes = boolc( sy-subrc = 0 ). + + ENDMETHOD. "exists + METHOD modify. ASSERT NOT is_data-key IS INITIAL. @@ -291,6 +312,9 @@ CLASS lcl_persistence_background IMPLEMENTATION. iv_value = is_data-key iv_data = to_xml( is_data ) ). + DELETE mt_jobs WHERE key = is_data-key. + APPEND is_data TO mt_jobs. + ENDMETHOD. METHOD delete. @@ -305,6 +329,8 @@ CLASS lcl_persistence_background IMPLEMENTATION. mo_db->delete( iv_type = c_type iv_value = iv_key ). + DELETE mt_jobs WHERE key = iv_key. + ENDMETHOD. METHOD from_xml. From c0fb995e249cd2671e173a5defca4b447eb62a7d Mon Sep 17 00:00:00 2001 From: sbcgua Date: Wed, 12 Oct 2016 20:58:18 +0200 Subject: [PATCH 10/16] cherrypick macro include --- src/zabapgit_macros.prog.abap | 23 +++++++++++++++++ src/zabapgit_macros.prog.xml | 48 +++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 src/zabapgit_macros.prog.abap create mode 100644 src/zabapgit_macros.prog.xml diff --git a/src/zabapgit_macros.prog.abap b/src/zabapgit_macros.prog.abap new file mode 100644 index 000000000..5bf603e19 --- /dev/null +++ b/src/zabapgit_macros.prog.abap @@ -0,0 +1,23 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_MACROS +*&---------------------------------------------------------------------* + +* Macros + +DEFINE _object_check_timestamp. + IF sy-subrc = 0 AND &1 IS NOT INITIAL AND &2 IS NOT INITIAL. + cl_abap_tstmp=>systemtstmp_syst2utc( + EXPORTING syst_date = &1 + syst_time = &2 + IMPORTING utc_tstmp = lv_ts ). + IF lv_ts < iv_timestamp. + rv_changed = abap_false. " Unchanged + ELSE. + rv_changed = abap_true. + RETURN. + ENDIF. + ELSE. " Not found? => changed + rv_changed = abap_true. + RETURN. + ENDIF. +END-OF-DEFINITION. \ No newline at end of file diff --git a/src/zabapgit_macros.prog.xml b/src/zabapgit_macros.prog.xml new file mode 100644 index 000000000..0e9ebfa35 --- /dev/null +++ b/src/zabapgit_macros.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_MACROS + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_MACROS + 23 + + + + + + From 4e97075a550d12d2986398612388bcea9dffedbc Mon Sep 17 00:00:00 2001 From: sbcgua Date: Thu, 13 Oct 2016 09:52:52 +0200 Subject: [PATCH 11/16] unit test for lcl_path and fixes --- src/zabapgit_unit_test.prog.abap | 131 ++++++++++++++++++++++++++++++- src/zabapgit_util.prog.abap | 15 ++-- 2 files changed, 139 insertions(+), 7 deletions(-) diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index df226946d..9c8f61b24 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -1617,4 +1617,133 @@ CLASS ltcl_html_action_utils IMPLEMENTATION. ENDMETHOD. "get_field -ENDCLASS. "ltcl_html_action_utils \ No newline at end of file +ENDCLASS. "ltcl_html_action_utils + +CLASS ltcl_path DEFINITION + FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL + INHERITING FROM CL_AUNIT_ASSERT. + + PUBLIC SECTION. + METHODS is_root FOR TESTING. + METHODS split_file_location FOR TESTING. + METHODS is_subdir FOR TESTING. + METHODS change_dir FOR TESTING. + +ENDCLASS. "ltcl_path + +CLASS ltcl_path IMPLEMENTATION. + + + METHOD is_root. + + assert_equals( exp = abap_true act = lcl_path=>is_root( '/' ) ). + assert_equals( exp = abap_false act = lcl_path=>is_root( '' ) ). + assert_equals( exp = abap_false act = lcl_path=>is_root( 'somedir' ) ). + assert_equals( exp = abap_false act = lcl_path=>is_root( '/somedir' ) ). + + ENDMETHOD. + + METHOD split_file_location. + + DATA: lv_path TYPE string, + lv_name TYPE string. + + lcl_path=>split_file_location( EXPORTING iv_fullpath = '' + IMPORTING ev_path = lv_path ev_filename = lv_name ). + assert_equals( act = lv_path exp = '' ). + assert_equals( act = lv_name exp = '' ). + + lcl_path=>split_file_location( EXPORTING iv_fullpath = 'somefile' + IMPORTING ev_path = lv_path ev_filename = lv_name ). + assert_equals( act = lv_path exp = '' ). + assert_equals( act = lv_name exp = 'somefile' ). + + lcl_path=>split_file_location( EXPORTING iv_fullpath = '/' + IMPORTING ev_path = lv_path ev_filename = lv_name ). + assert_equals( act = lv_path exp = '/' ). + assert_equals( act = lv_name exp = '' ). + + lcl_path=>split_file_location( EXPORTING iv_fullpath = '/somefile' + IMPORTING ev_path = lv_path ev_filename = lv_name ). + assert_equals( act = lv_path exp = '/' ). + assert_equals( act = lv_name exp = 'somefile' ). + + lcl_path=>split_file_location( EXPORTING iv_fullpath = '/somedir/' + IMPORTING ev_path = lv_path ev_filename = lv_name ). + assert_equals( act = lv_path exp = '/somedir/' ). + assert_equals( act = lv_name exp = '' ). + + lcl_path=>split_file_location( EXPORTING iv_fullpath = '/somedir/somefile' + IMPORTING ev_path = lv_path ev_filename = lv_name ). + assert_equals( act = lv_path exp = '/somedir/' ). + assert_equals( act = lv_name exp = 'somefile' ). + + + ENDMETHOD. + + METHOD is_subdir. + + DATA lv_yes TYPE abap_bool. + + lv_yes = lcl_path=>is_subdir( iv_path = '/dir/subdir' + iv_parent = '/dir' ). + assert_equals( act = lv_yes exp = abap_true ). + + lv_yes = lcl_path=>is_subdir( iv_path = '/dir/subdir' + iv_parent = '/dir/' ). + assert_equals( act = lv_yes exp = abap_true ). + + lv_yes = lcl_path=>is_subdir( iv_path = '/another' + iv_parent = '/dir' ). + assert_equals( act = lv_yes exp = abap_false ). + + lv_yes = lcl_path=>is_subdir( iv_path = '/dir' + iv_parent = '/dir' ). + assert_equals( act = lv_yes exp = abap_false ). + + lv_yes = lcl_path=>is_subdir( iv_path = '/dir' + iv_parent = '/' ). + assert_equals( act = lv_yes exp = abap_true ). + + lv_yes = lcl_path=>is_subdir( iv_path = '/dir2' + iv_parent = '/dir' ). + assert_equals( act = lv_yes exp = abap_false ). + + ENDMETHOD. + + METHOD change_dir. + + DATA lv_path TYPE string. + + lv_path = lcl_path=>change_dir( iv_cur_dir = '' + iv_cd = '' ). + assert_equals( act = lv_path exp = '' ). + + lv_path = lcl_path=>change_dir( iv_cur_dir = '/dir' + iv_cd = '' ). + assert_equals( act = lv_path exp = '/dir' ). + + lv_path = lcl_path=>change_dir( iv_cur_dir = '/dir' + iv_cd = '.' ). + assert_equals( act = lv_path exp = '/dir' ). + + lv_path = lcl_path=>change_dir( iv_cur_dir = '/dir' + iv_cd = '..' ). + assert_equals( act = lv_path exp = '/' ). + + lv_path = lcl_path=>change_dir( iv_cur_dir = '/dir/sub' + iv_cd = '..' ). + assert_equals( act = lv_path exp = '/dir/' ). + + lv_path = lcl_path=>change_dir( iv_cur_dir = '/dir/' + iv_cd = 'sub' ). + assert_equals( act = lv_path exp = '/dir/sub' ). + + lv_path = lcl_path=>change_dir( iv_cur_dir = '/dir' + iv_cd = 'sub' ). + assert_equals( act = lv_path exp = '/dir/sub' ). + + + ENDMETHOD. + +ENDCLASS. "ltcl_path \ No newline at end of file diff --git a/src/zabapgit_util.prog.abap b/src/zabapgit_util.prog.abap index c39b1cd9b..ba9584157 100644 --- a/src/zabapgit_util.prog.abap +++ b/src/zabapgit_util.prog.abap @@ -391,10 +391,14 @@ CLASS lcl_path IMPLEMENTATION. METHOD is_subdir. - DATA lv_len TYPE i. + DATA lv_len TYPE i. + DATA lv_last TYPE i. - lv_len = strlen( iv_parent ). - rv_yes = boolc( strlen( iv_path ) > lv_len AND iv_path+0(lv_len) = iv_parent ). + lv_len = strlen( iv_parent ). + lv_last = lv_len - 1. + rv_yes = boolc( strlen( iv_path ) > lv_len + AND iv_path+0(lv_len) = iv_parent + AND ( iv_parent+lv_last(1) = '/' OR iv_path+lv_Len(1) = '/' ) ). ENDMETHOD. "is_subdir @@ -404,7 +408,7 @@ CLASS lcl_path IMPLEMENTATION. DATA lv_temp TYPE string. DATA lv_len TYPE i. - lv_last = strlen( iv_cd ) - 1. + lv_last = strlen( iv_cur_dir ) - 1. IF iv_cd = '' OR iv_cd = '.'. " No change rv_path = iv_cur_dir. @@ -422,7 +426,7 @@ CLASS lcl_path IMPLEMENTATION. rv_path = reverse( lv_temp ). ENDIF. ELSE. - IF iv_cd+lv_last(1) = '/'. " Append cd to cur_dir separated by / + IF iv_cur_dir+lv_last(1) = '/'. " Append cd to cur_dir separated by / rv_path = iv_cur_dir && iv_cd. ELSE. rv_path = iv_cur_dir && '/' && iv_cd. @@ -430,7 +434,6 @@ CLASS lcl_path IMPLEMENTATION. ENDIF. " TODO: improve logic and cases - " TODO: Unit test ENDMETHOD. "change_dir From 43da32bb1a19e91c759df6a54123401bb1234f1b Mon Sep 17 00:00:00 2001 From: sbcgua Date: Thu, 13 Oct 2016 23:02:24 +0200 Subject: [PATCH 12/16] folders part2 #280 --- src/zabapgit_page_main.prog.abap | 48 ++++--- src/zabapgit_persistence.prog.abap | 3 + src/zabapgit_view_repo.prog.abap | 219 ++++++++++++++++++++--------- 3 files changed, 182 insertions(+), 88 deletions(-) diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap index 0c090081f..7ce2e6d75 100644 --- a/src/zabapgit_page_main.prog.abap +++ b/src/zabapgit_page_main.prog.abap @@ -19,8 +19,8 @@ CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super. show TYPE string VALUE 'show' ##NO_TEXT, END OF c_actions. - DATA: mv_show TYPE lcl_persistence_db=>ty_value, - mv_cur_dir TYPE string. + DATA: mv_show TYPE lcl_persistence_db=>ty_value, + mo_repo_content TYPE REF TO lcl_gui_view_repo_content. METHODS: styles @@ -52,16 +52,27 @@ ENDCLASS. CLASS lcl_gui_page_main IMPLEMENTATION. METHOD constructor. - super->constructor( ). - mv_cur_dir = '/'. " Root - ENDMETHOD. " constructor METHOD lif_gui_page~on_event. DATA: lv_key TYPE lcl_persistence_repo=>ty_repo-key, - lv_path TYPE string. + lo_repo TYPE REF TO lcl_repo. + + mo_repo_content->lif_gui_page~on_event( + EXPORTING + iv_action = iv_action + iv_prev_page = iv_prev_page + iv_getdata = iv_getdata + it_postdata = it_postdata + IMPORTING + ei_page = ei_page + ev_state = ev_state ). + + IF ev_state <> gc_event_state-not_handled. + RETURN. + ENDIF. lv_key = iv_getdata. @@ -69,18 +80,13 @@ CLASS lcl_gui_page_main IMPLEMENTATION. WHEN c_actions-show. " Change displayed repo lcl_app=>user( )->set_repo_show( lv_key ). TRY. - lcl_app=>repo_srv( )->get( lv_key )->refresh( ). + lo_repo = lcl_app=>repo_srv( )->get( lv_key ). + lo_repo->refresh( ). CATCH lcx_exception. ENDTRY. - ev_state = gc_event_state-re_render. - 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. - WHEN lcl_gui_view_repo_content=>c_actions-change_dir. " Toggle file diplay - lv_path = lcl_html_action_utils=>dir_decode( iv_getdata ). - mv_cur_dir = lcl_path=>change_dir( iv_cur_dir = mv_cur_dir iv_cd = lv_path ). - ev_state = gc_event_state-re_render. + CREATE OBJECT mo_repo_content EXPORTING io_repo = lo_repo. " Reinit content state + ev_state = gc_event_state-re_render. ENDCASE. ENDMETHOD. "on_event @@ -273,16 +279,15 @@ CLASS lcl_gui_page_main IMPLEMENTATION. METHOD render_repo. - DATA: lo_repo_content TYPE REF TO lcl_gui_view_repo_content. - CREATE OBJECT ro_html. + IF mo_repo_content IS NOT BOUND. + CREATE OBJECT mo_repo_content EXPORTING io_repo = io_repo. + ENDIF. + ro_html->add( |
| ). ro_html->add( render_repo_top( io_repo = io_repo iv_interactive_branch = abap_true ) ). - - CREATE OBJECT lo_repo_content EXPORTING io_repo = io_repo. - ro_html->add( lo_repo_content->render( iv_path = mv_cur_dir ) ). - + ro_html->add( mo_repo_content->lif_gui_page~render( ) ). ro_html->add( '
' ). ENDMETHOD. "render_repo @@ -336,6 +341,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. _add '.repo_tab td.files span { display: block; }'. _add '.repo_tab td.cmd span { display: block; }'. _add '.repo_tab td.cmd a { display: block; }'. + _add 'td.current_dir { color: #ccc; }'. ENDMETHOD. "styles diff --git a/src/zabapgit_persistence.prog.abap b/src/zabapgit_persistence.prog.abap index 159618316..eb239132e 100644 --- a/src/zabapgit_persistence.prog.abap +++ b/src/zabapgit_persistence.prog.abap @@ -404,6 +404,7 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. RAISING lcx_exception. METHODS toggle_hide_files + RETURNING VALUE(rv_hide) TYPE abap_bool RAISING lcx_exception. METHODS get_hide_files @@ -648,6 +649,8 @@ CLASS lcl_persistence_user IMPLEMENTATION. ls_user-hide_files = boolc( ls_user-hide_files = abap_false ). update( ls_user ). + rv_hide = ls_user-hide_files. + ENDMETHOD. "toggle_hide_files METHOD get_hide_files. diff --git a/src/zabapgit_view_repo.prog.abap b/src/zabapgit_view_repo.prog.abap index 27adb40e0..8f05057e0 100644 --- a/src/zabapgit_view_repo.prog.abap +++ b/src/zabapgit_view_repo.prog.abap @@ -30,11 +30,15 @@ CLASS lcl_repo_content_browser DEFINITION FINAL. IMPORTING io_repo TYPE REF TO lcl_repo. METHODS list - IMPORTING iv_path TYPE string - EXPORTING et_repo_items TYPE tt_repo_items - eo_log TYPE REF TO lcl_log + IMPORTING iv_path TYPE string + iv_by_folders TYPE abap_bool + iv_changes_only TYPE abap_bool + RETURNING VALUE(rt_repo_items) TYPE tt_repo_items RAISING lcx_exception. + METHODS get_log + RETURNING VALUE(ro_log) TYPE REF TO lcl_log. + PRIVATE SECTION. DATA mo_repo TYPE REF TO lcl_repo. DATA mo_log TYPE REF TO lcl_log. @@ -52,6 +56,9 @@ CLASS lcl_repo_content_browser DEFINITION FINAL. CHANGING ct_repo_items TYPE tt_repo_items RAISING lcx_exception. + METHODS filter_changes + CHANGING ct_repo_items TYPE tt_repo_items. + ENDCLASS. "lcl_repo_content_browser CLASS lcl_repo_content_browser IMPLEMENTATION. @@ -60,23 +67,31 @@ CLASS lcl_repo_content_browser IMPLEMENTATION. mo_repo = io_repo. ENDMETHOD. "constructor + METHOD get_log. + ro_log = mo_log. + ENDMETHOD. "get_log + METHOD list. - CLEAR et_repo_items. + CREATE OBJECT mo_log. IF mo_repo->is_offline( ) = abap_true. - et_repo_items = get_local( ). + rt_repo_items = get_local( ). ELSE. - CREATE OBJECT mo_log. - et_repo_items = get_remote( ). - eo_log = mo_log. + rt_repo_items = get_remote( ). ENDIF. - build_folders( - EXPORTING iv_cur_dir = iv_path - CHANGING ct_repo_items = et_repo_items ). + IF iv_by_folders = abap_true. + build_folders( + EXPORTING iv_cur_dir = iv_path + CHANGING ct_repo_items = rt_repo_items ). + ENDIF. - SORT et_repo_items BY sortkey obj_type obj_name ASCENDING. + IF iv_changes_only = abap_true. + filter_changes( CHANGING ct_repo_items = rt_repo_items ). + ENDIF. + + SORT rt_repo_items BY sortkey obj_type obj_name ASCENDING. ENDMETHOD. "list @@ -120,6 +135,17 @@ CLASS lcl_repo_content_browser IMPLEMENTATION. ENDMETHOD. "build_folders + METHOD filter_changes. + + FIELD-SYMBOLS LIKE LINE OF ct_repo_items. + + LOOP AT ct_repo_items ASSIGNING . + CHECK -changes = 0. + DELETE ct_repo_items INDEX sy-tabix. + ENDLOOP. + + ENDMETHOD. "filter_changes + METHOD get_local. DATA: lt_tadir TYPE ty_tadir_tt. @@ -189,33 +215,38 @@ ENDCLASS. "lcl_repo_content_browser ********************************************************************** ********************************************************************** -CLASS lcl_gui_view_repo_content DEFINITION FINAL. +CLASS lcl_gui_view_repo_content DEFINITION FINAL INHERITING FROM lcl_gui_page_super. PUBLIC SECTION. 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, END OF c_actions. + METHODS: lif_gui_page~render REDEFINITION, + lif_gui_page~on_event REDEFINITION. + METHODS constructor IMPORTING io_repo TYPE REF TO lcl_repo RAISING lcx_exception. - METHODS render - IMPORTING iv_path TYPE string - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper - RAISING lcx_exception. - PRIVATE SECTION. - DATA: mo_repo TYPE REF TO lcl_repo, - mv_cur_dir TYPE string, - mv_hide_files TYPE abap_bool. + DATA: mo_repo TYPE REF TO lcl_repo, + mv_cur_dir TYPE string, + mv_hide_files TYPE abap_bool, + mv_show_folders TYPE abap_bool, + mv_changes_only TYPE abap_bool. METHODS: render_repo_menu RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper RAISING lcx_exception, + render_tab_menu + RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper + RAISING lcx_exception, render_repo_item IMPORTING is_item TYPE lcl_repo_content_browser=>ty_repo_item RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper @@ -229,14 +260,15 @@ CLASS lcl_gui_view_repo_content DEFINITION FINAL. render_empty_package RETURNING VALUE(rv_html) TYPE string, render_parent_dir_line - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper + RAISING lcx_exception. METHODS: - render_obj_jump_link + build_obj_jump_link IMPORTING iv_obj_type TYPE tadir-object iv_obj_name TYPE tadir-obj_name RETURNING VALUE(rv_html) TYPE string, - render_dir_jump_link + build_dir_jump_link IMPORTING iv_path TYPE string RETURNING VALUE(rv_html) TYPE string. @@ -246,33 +278,57 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. METHOD constructor. - mo_repo ?= io_repo. + super->constructor( ). + + mo_repo ?= io_repo. + mv_cur_dir = '/'. " Root mv_hide_files = lcl_app=>user( )->get_hide_files( ). ENDMETHOD. "constructor - METHOD render. + METHOD lif_gui_page~on_event. + + DATA: lv_path TYPE string. + + CASE iv_action. + WHEN c_actions-toggle_hide_files. " Toggle file diplay + mv_hide_files = lcl_app=>user( )->toggle_hide_files( ). + ev_state = gc_event_state-re_render. + WHEN c_actions-change_dir. " Change dir + lv_path = lcl_html_action_utils=>dir_decode( iv_getdata ). + mv_cur_dir = lcl_path=>change_dir( iv_cur_dir = mv_cur_dir iv_cd = lv_path ). + ev_state = gc_event_state-re_render. + WHEN c_actions-toggle_folders. " Toggle folder view + mv_show_folders = boolc( mv_show_folders <> abap_true ). + mv_cur_dir = '/'. " Root + ev_state = gc_event_state-re_render. + WHEN c_actions-toggle_changes. " Toggle changes only view + mv_changes_only = boolc( mv_changes_only <> abap_true ). + ev_state = gc_event_state-re_render. + ENDCASE. + + ENDMETHOD. "lif_gui_page~on_event + + METHOD lif_gui_page~render. DATA: lt_repo_items TYPE lcl_repo_content_browser=>tt_repo_items, - lo_tab_menu TYPE REF TO lcl_html_toolbar, lo_browser TYPE REF TO lcl_repo_content_browser, 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. - mv_cur_dir = iv_path. TRY. ro_html->add( render_repo_menu( ) ). - CREATE OBJECT lo_browser EXPORTING io_repo = mo_repo. - lo_browser->list( EXPORTING iv_path = iv_path - IMPORTING et_repo_items = lt_repo_items - eo_log = lo_log ). + CREATE OBJECT lo_browser EXPORTING io_repo = mo_repo. + lt_repo_items = lo_browser->list( iv_path = mv_cur_dir + iv_by_folders = mv_show_folders + iv_changes_only = mv_changes_only ). + lo_log = lo_browser->get_log( ). 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 @@ -280,21 +336,12 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ENDIF. ro_html->add( '
' ). - - " Table menu - 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( render_tab_menu( ) ). " Repo content table ro_html->add( '' ). - IF lcl_path=>is_root( iv_path ) = abap_false. + IF lcl_path=>is_root( mv_cur_dir ) = abap_false. ro_html->add( render_parent_dir_line( ) ). ENDIF. @@ -314,7 +361,42 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ro_html->add( lcl_gui_page_super=>render_error( lx_error ) ). ENDTRY. - ENDMETHOD. "render + ENDMETHOD. "lif_gui_page~render + + METHOD render_tab_menu. + + DATA lo_tab_menu TYPE REF TO lcl_html_toolbar. + + CREATE OBJECT lo_tab_menu. + + IF mo_repo->is_offline( ) = abap_false. + + " Show/Hide files + 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. + + " Show changes only + IF mv_changes_only = abap_true. + lo_tab_menu->add( iv_txt = 'All objects' iv_act = c_actions-toggle_changes ). + ELSE. + lo_tab_menu->add( iv_txt = 'Changed only' iv_act = c_actions-toggle_changes ). + ENDIF. + + ENDIF. + + " Show/Hide folders + IF mv_show_folders = abap_true. + lo_tab_menu->add( iv_txt = 'Plain list' iv_act = c_actions-toggle_folders ). + ELSE. + lo_tab_menu->add( iv_txt = 'With folders' iv_act = c_actions-toggle_folders ). + ENDIF. + + ro_html = lo_tab_menu->render( iv_as_angle = abap_true ). + + ENDMETHOD. "render_tab_menu METHOD render_repo_menu. @@ -411,10 +493,6 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. iv_act = |{ gc_action-repo_refresh }?{ lv_key }| ). " Render ========================================== -* ro_html->add( '
' ). -* ro_html->add( lo_toolbar->render( ) ). -* ro_html->add( '
' ). - ro_html->add( '
' ). ro_html->add( '
' ). ro_html->add( || ). @@ -431,16 +509,14 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. DATA lt_class TYPE TABLE OF string. - IF is_item-obj_name IS INITIAL AND is_item-is_dir = abap_false. - APPEND 'unsupported' TO lt_class. - ENDIF. + "TODO REFACTOR !!! Depends on if folder woth changes should be highlited IF is_item-is_dir = abap_true. APPEND 'folder' TO lt_class. - ENDIF. - - IF is_item-changes > 0. + 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. @@ -484,19 +560,20 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ro_html->add( '' && '' ). ELSEIF is_item-is_dir = abap_true. - lv_link = render_dir_jump_link( iv_path = is_item-path ). + lv_link = build_dir_jump_link( iv_path = is_item-path ). ro_html->add( || ). ro_html->add( || ). ELSE. - lv_link = render_obj_jump_link( iv_obj_name = is_item-obj_name + lv_link = build_obj_jump_link( iv_obj_name = is_item-obj_name iv_obj_type = is_item-obj_type ). ro_html->add( || ). ro_html->add( || ). ro_html->add( || ). ENDIF. - IF mo_repo->is_offline( ) = abap_false. " Files for online repos only + IF mo_repo->is_offline( ) = abap_false. + " Files ro_html->add( '' ). + " TODO Refactor + " Command ro_html->add( '' ). @@ -546,8 +628,8 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. METHOD render_empty_package. rv_html = '' ##NO_TEXT. + && '
Empty package
' + && '' ##NO_TEXT. ENDMETHOD. "render_empty_package @@ -557,12 +639,15 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ro_html->add( '' ). ro_html->add( || ). - ro_html->add( || ). + ro_html->add( || ). + IF mo_repo->is_offline( ) = abap_false. + ro_html->add( || ). " Dummy for online + ENDIF. ro_html->add( '' ). ENDMETHOD. "render_parent_dir_line - METHOD render_dir_jump_link. + METHOD build_dir_jump_link. DATA: lv_path TYPE string, lv_encode TYPE string, @@ -576,9 +661,9 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. lo_html->add_anchor( iv_txt = lv_path iv_act = |{ c_actions-change_dir }?{ lv_encode }| ). rv_html = lo_html->mv_html. - ENDMETHOD. "render_dir_jump_link + ENDMETHOD. "build_dir_jump_link - METHOD render_obj_jump_link. + METHOD build_obj_jump_link. DATA: lv_encode TYPE string, lo_html TYPE REF TO lcl_html_helper. @@ -590,6 +675,6 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. 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 + ENDMETHOD. "build_obj_jump_link ENDCLASS. "lcl_gui_view_repo_content \ No newline at end of file From ee6eaad06fb4aa059a944b7262e42f5f83d81363 Mon Sep 17 00:00:00 2001 From: sbcgua Date: Fri, 14 Oct 2016 10:35:24 +0200 Subject: [PATCH 13/16] changes_only at user profile #280 --- src/zabapgit_persistence.prog.abap | 38 ++++++++++++++++++++++++++---- src/zabapgit_view_repo.prog.abap | 19 ++++++++------- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/src/zabapgit_persistence.prog.abap b/src/zabapgit_persistence.prog.abap index eb239132e..a16349ade 100644 --- a/src/zabapgit_persistence.prog.abap +++ b/src/zabapgit_persistence.prog.abap @@ -411,6 +411,14 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. RETURNING VALUE(rv_hide) TYPE abap_bool RAISING lcx_exception. + METHODS toggle_changes_only + RETURNING VALUE(rv_changes_only) TYPE abap_bool + RAISING lcx_exception. + + METHODS get_changes_only + RETURNING VALUE(rv_changes_only) TYPE abap_bool + RAISING lcx_exception. + PRIVATE SECTION. CONSTANTS c_type_user TYPE lcl_persistence_db=>ty_type VALUE 'USER'. @@ -429,11 +437,12 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. TYPES: ty_repo_config_tt TYPE STANDARD TABLE OF ty_repo_config WITH DEFAULT KEY. TYPES: BEGIN OF ty_user, - username TYPE string, - email TYPE string, - repo_show TYPE lcl_persistence_repo=>ty_repo-key, - repo_config TYPE ty_repo_config_tt, - hide_files TYPE abap_bool, + username TYPE string, + email TYPE string, + repo_show TYPE lcl_persistence_repo=>ty_repo-key, + repo_config TYPE ty_repo_config_tt, + hide_files TYPE abap_bool, + changes_only TYPE abap_bool, END OF ty_user. METHODS constructor @@ -659,6 +668,25 @@ CLASS lcl_persistence_user IMPLEMENTATION. ENDMETHOD. "get_hide_files + METHOD toggle_changes_only. + + DATA ls_user TYPE ty_user. + + ls_user = read( ). + ls_user-changes_only = boolc( ls_user-changes_only = abap_false ). + update( ls_user ). + + rv_changes_only = ls_user-changes_only. + + ENDMETHOD. "toggle_changes_only + + METHOD get_changes_only. + + rv_changes_only = read( )-changes_only. + + ENDMETHOD. "get_changes_only + + ENDCLASS. CLASS lcl_persistence_db IMPLEMENTATION. diff --git a/src/zabapgit_view_repo.prog.abap b/src/zabapgit_view_repo.prog.abap index 8f05057e0..044ea53fa 100644 --- a/src/zabapgit_view_repo.prog.abap +++ b/src/zabapgit_view_repo.prog.abap @@ -280,9 +280,10 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. super->constructor( ). - mo_repo ?= io_repo. - mv_cur_dir = '/'. " Root - mv_hide_files = lcl_app=>user( )->get_hide_files( ). + mo_repo ?= io_repo. + mv_cur_dir = '/'. " Root + mv_hide_files = lcl_app=>user( )->get_hide_files( ). + mv_changes_only = lcl_app=>user( )->get_changes_only( ). ENDMETHOD. "constructor @@ -292,18 +293,18 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. CASE iv_action. WHEN c_actions-toggle_hide_files. " Toggle file diplay - mv_hide_files = lcl_app=>user( )->toggle_hide_files( ). - ev_state = gc_event_state-re_render. + mv_hide_files = lcl_app=>user( )->toggle_hide_files( ). + ev_state = gc_event_state-re_render. WHEN c_actions-change_dir. " Change dir - lv_path = lcl_html_action_utils=>dir_decode( iv_getdata ). - mv_cur_dir = lcl_path=>change_dir( iv_cur_dir = mv_cur_dir iv_cd = lv_path ). - ev_state = gc_event_state-re_render. + lv_path = lcl_html_action_utils=>dir_decode( iv_getdata ). + mv_cur_dir = lcl_path=>change_dir( iv_cur_dir = mv_cur_dir iv_cd = lv_path ). + ev_state = gc_event_state-re_render. WHEN c_actions-toggle_folders. " Toggle folder view mv_show_folders = boolc( mv_show_folders <> abap_true ). mv_cur_dir = '/'. " Root ev_state = gc_event_state-re_render. WHEN c_actions-toggle_changes. " Toggle changes only view - mv_changes_only = boolc( mv_changes_only <> abap_true ). + mv_changes_only = lcl_app=>user( )->toggle_changes_only( ). ev_state = gc_event_state-re_render. ENDCASE. From a74b341cd4d0162131e09a0508f48bcd2538d08d Mon Sep 17 00:00:00 2001 From: sbcgua Date: Fri, 14 Oct 2016 10:42:29 +0200 Subject: [PATCH 14/16] fix empty package --- src/zabapgit_view_repo.prog.abap | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/zabapgit_view_repo.prog.abap b/src/zabapgit_view_repo.prog.abap index 044ea53fa..8ed079c17 100644 --- a/src/zabapgit_view_repo.prog.abap +++ b/src/zabapgit_view_repo.prog.abap @@ -137,13 +137,19 @@ CLASS lcl_repo_content_browser IMPLEMENTATION. METHOD filter_changes. + DATA lt_repo_temp LIKE ct_repo_items. + FIELD-SYMBOLS LIKE LINE OF ct_repo_items. LOOP AT ct_repo_items ASSIGNING . - CHECK -changes = 0. - DELETE ct_repo_items INDEX sy-tabix. + CHECK -changes > 0. + APPEND TO lt_repo_temp. ENDLOOP. + IF lines( lt_repo_temp ) > 0. " Prevent showing empty package if no changes, show all + ct_repo_items = lt_repo_temp. + ENDIF. + ENDMETHOD. "filter_changes METHOD get_local. From 485e336df6d8524ab49c520119d8b4aaf718a96b Mon Sep 17 00:00:00 2001 From: sbcgua Date: Fri, 14 Oct 2016 11:01:06 +0200 Subject: [PATCH 15/16] fix dump on type change --- src/zabapgit_page_main.prog.abap | 10 ++++------ src/zabapgit_view_repo.prog.abap | 7 +++++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap index 793076547..437da9aed 100644 --- a/src/zabapgit_page_main.prog.abap +++ b/src/zabapgit_page_main.prog.abap @@ -57,8 +57,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. METHOD lif_gui_page~on_event. - DATA: lv_key TYPE lcl_persistence_repo=>ty_repo-key, - lo_repo TYPE REF TO lcl_repo. + DATA: lv_key TYPE lcl_persistence_repo=>ty_repo-key. mo_repo_content->lif_gui_page~on_event( EXPORTING @@ -80,12 +79,11 @@ CLASS lcl_gui_page_main IMPLEMENTATION. WHEN c_actions-show. " Change displayed repo lcl_app=>user( )->set_repo_show( lv_key ). TRY. - lo_repo = lcl_app=>repo_srv( )->get( lv_key ). - lo_repo->refresh( ). + lcl_app=>repo_srv( )->get( lv_key )->refresh( ). CATCH lcx_exception. ENDTRY. - CREATE OBJECT mo_repo_content EXPORTING io_repo = lo_repo. " Reinit content state + CREATE OBJECT mo_repo_content EXPORTING iv_key = lv_key. " Reinit content state ev_state = gc_event_state-re_render. ENDCASE. @@ -283,7 +281,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. CREATE OBJECT ro_html. IF mo_repo_content IS NOT BOUND. - CREATE OBJECT mo_repo_content EXPORTING io_repo = io_repo. + CREATE OBJECT mo_repo_content EXPORTING iv_key = io_repo->get_key( ). ENDIF. ro_html->add( |
| ). diff --git a/src/zabapgit_view_repo.prog.abap b/src/zabapgit_view_repo.prog.abap index 8ed079c17..1c8d5b091 100644 --- a/src/zabapgit_view_repo.prog.abap +++ b/src/zabapgit_view_repo.prog.abap @@ -235,7 +235,7 @@ CLASS lcl_gui_view_repo_content DEFINITION FINAL INHERITING FROM lcl_gui_page_su lif_gui_page~on_event REDEFINITION. METHODS constructor - IMPORTING io_repo TYPE REF TO lcl_repo + IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key RAISING lcx_exception. PRIVATE SECTION. @@ -286,7 +286,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. super->constructor( ). - mo_repo ?= io_repo. + mo_repo = lcl_app=>repo_srv( )->get( iv_key ). mv_cur_dir = '/'. " Root mv_hide_files = lcl_app=>user( )->get_hide_files( ). mv_changes_only = lcl_app=>user( )->get_changes_only( ). @@ -325,6 +325,9 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. FIELD-SYMBOLS LIKE LINE OF lt_repo_items. + " Reinit, for the case of type change + mo_repo = lcl_app=>repo_srv( )->get( mo_repo->get_key( ) ). + CREATE OBJECT ro_html. TRY. From 91525b9462fdc7740970537eeff93e390f411423 Mon Sep 17 00:00:00 2001 From: sbcgua Date: Fri, 14 Oct 2016 16:33:00 +0200 Subject: [PATCH 16/16] new repo, remove fixes, close #393, close #394 --- src/zabapgit_page_main.prog.abap | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap index 437da9aed..8dbb8008c 100644 --- a/src/zabapgit_page_main.prog.abap +++ b/src/zabapgit_page_main.prog.abap @@ -83,7 +83,6 @@ CLASS lcl_gui_page_main IMPLEMENTATION. CATCH lcx_exception. ENDTRY. - CREATE OBJECT mo_repo_content EXPORTING iv_key = lv_key. " Reinit content state ev_state = gc_event_state-re_render. ENDCASE. @@ -128,8 +127,9 @@ CLASS lcl_gui_page_main IMPLEMENTATION. METHOD retrieve_active_repo. - DATA: lt_repos TYPE lcl_repo_srv=>ty_repo_tt, - lo_repo LIKE LINE OF lt_repos. + DATA: lt_repos TYPE lcl_repo_srv=>ty_repo_tt, + lo_repo LIKE LINE OF lt_repos, + lv_show_old LIKE mv_show. TRY. lt_repos = lcl_app=>repo_srv( )->list( ). @@ -137,7 +137,8 @@ CLASS lcl_gui_page_main IMPLEMENTATION. RETURN. ENDTRY. - mv_show = lcl_app=>user( )->get_repo_show( ). " Get default repo from user cfg + lv_show_old = mv_show. + mv_show = lcl_app=>user( )->get_repo_show( ). " Get default repo from user cfg IF mv_show IS NOT INITIAL. TRY. " verify the key exists @@ -155,6 +156,10 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ENDIF. ENDIF. + IF lv_show_old <> mv_show. + CREATE OBJECT mo_repo_content EXPORTING iv_key = mv_show. " Reinit content state + ENDIF. + ENDMETHOD. "retrieve_active_repo METHOD build_main_menu. @@ -280,10 +285,6 @@ CLASS lcl_gui_page_main IMPLEMENTATION. CREATE OBJECT ro_html. - IF mo_repo_content IS NOT BOUND. - CREATE OBJECT mo_repo_content EXPORTING iv_key = io_repo->get_key( ). - ENDIF. - ro_html->add( |
| ). ro_html->add( render_repo_top( io_repo = io_repo iv_interactive_branch = abap_true ) ). ro_html->add( mo_repo_content->lif_gui_page~render( ) ).
{ mv_cur_dir }non-code and meta files{ get_item_icon( is_item ) }{ lv_link }{ get_item_icon( is_item ) }{ is_item-obj_type }{ lv_link }' ). IF mv_hide_files = abap_false OR is_item-obj_type IS INITIAL. LOOP AT is_item-files INTO ls_file. @@ -505,8 +582,12 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ENDIF. ro_html->add( '' ). - IF lines( is_item-files ) = 0. + IF is_item-is_dir = abap_true. + ro_html->add( |{ is_item-changes } changes| ). + ELSEIF 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. @@ -514,7 +595,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. iv_key = mo_repo->get_key( ) ig_object = is_item ). ro_html->add_anchor( - iv_txt = |diff ({ is_item-changes })| + iv_txt = |{ is_item-changes } diffs| iv_act = |{ gc_action-go_diff }?{ lv_difflink }| ). ELSE. LOOP AT is_item-files INTO ls_file. @@ -534,6 +615,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION. ENDIF. ENDLOOP. ENDIF. + ENDIF. ro_html->add( '
' - && '
Empty package
' - && '
{ render_dir_jump_link( '..' ) }{ build_dir_jump_link( '..' ) }