folders part 1 #280

This commit is contained in:
sbcgua 2016-10-05 23:17:29 +02:00
parent cc1e5693ba
commit 362a8de7de
5 changed files with 479 additions and 176 deletions

View File

@ -32,6 +32,15 @@ CLASS lcl_html_action_utils DEFINITION FINAL.
ev_obj_name TYPE tadir-obj_name ev_obj_name TYPE tadir-obj_name
RAISING lcx_exception. 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 CLASS-METHODS file_encode
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
ig_file TYPE any "assuming ty_file ig_file TYPE any "assuming ty_file
@ -162,6 +171,22 @@ CLASS lcl_html_action_utils IMPLEMENTATION.
ENDMETHOD. "jump_decode 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. METHOD file_encode.
DATA: lt_fields TYPE tihttpnvp. DATA: lt_fields TYPE tihttpnvp.

View File

@ -19,7 +19,8 @@ CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
show TYPE string VALUE 'show' ##NO_TEXT, show TYPE string VALUE 'show' ##NO_TEXT,
END OF c_actions. 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: METHODS:
styles styles
@ -48,19 +49,19 @@ CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
ENDCLASS. ENDCLASS.
CLASS lcl_gui_page_main IMPLEMENTATION. CLASS lcl_gui_page_main IMPLEMENTATION.
METHOD constructor. METHOD constructor.
super->constructor( ). super->constructor( ).
mv_cur_dir = '/'. " Root
ENDMETHOD. " constructor ENDMETHOD. " constructor
METHOD lif_gui_page~on_event. METHOD lif_gui_page~on_event.
DATA: lv_key TYPE lcl_persistence_repo=>ty_repo-key, DATA: lv_key TYPE lcl_persistence_repo=>ty_repo-key,
lv_url TYPE string. lv_path TYPE string.
lv_key = iv_getdata. 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 WHEN lcl_gui_view_repo_content=>c_actions-toggle_hide_files. " Toggle file diplay
lcl_app=>user( )->toggle_hide_files( ). lcl_app=>user( )->toggle_hide_files( ).
ev_state = gc_event_state-re_render. 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. ENDCASE.
ENDMETHOD. "on_event 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 ) ). 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. 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( '</div>' ). ro_html->add( '</div>' ).
@ -329,12 +335,12 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
_add ' padding-left: 0.5em;'. _add ' padding-left: 0.5em;'.
_add ' padding-right: 1em;'. _add ' padding-right: 1em;'.
_add '}'. _add '}'.
_add '.repo_tab tr.unsupported { color: lightgrey; }'. _add '.repo_tab tr.unsupported { color: lightgrey; }'.
_add '.repo_tab tr.modified { background: #fbf7e9; }'. _add '.repo_tab tr.modified { background: #fbf7e9; }'.
_add '.repo_tab tr.firstrow td { border-top: 0px; }'. _add '.repo_tab tr:first-child td { border-top: 0px; }'.
_add '.repo_tab td.files span { display: block; }'. _add '.repo_tab td.files span { display: block; }'.
_add '.repo_tab td.cmd span { display: block; }'. _add '.repo_tab td.cmd span { display: block; }'.
_add '.repo_tab td.cmd a { display: block; }'. _add '.repo_tab td.cmd a { display: block; }'.
ENDMETHOD. "styles ENDMETHOD. "styles
@ -468,6 +474,15 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
&& '1gQQfzKDhgCSPFw9Kg2yZ9WqAgBWJBENLk6V3AAAAABJRU5ErkJggg=='. && '1gQQfzKDhgCSPFw9Kg2yZ9WqAgBWJBENLk6V3AAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_assets. 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 ENDMETHOD. "get_assets
ENDCLASS. ENDCLASS.

View File

@ -105,9 +105,9 @@ CLASS lcl_gui_page_stage IMPLEMENTATION.
LOOP AT lt_fields ASSIGNING <ls_item>. LOOP AT lt_fields ASSIGNING <ls_item>.
lcl_url=>split_file_location( EXPORTING iv_fullpath = <ls_item>-name lcl_path=>split_file_location( EXPORTING iv_fullpath = <ls_item>-name
IMPORTING ev_path = ls_file-path IMPORTING ev_path = ls_file-path
ev_filename = ls_file-filename ). ev_filename = ls_file-filename ).
CASE <ls_item>-value. CASE <ls_item>-value.
WHEN lcl_stage=>c_method-add. WHEN lcl_stage=>c_method-add.

View File

@ -337,6 +337,105 @@ CLASS lcl_hash IMPLEMENTATION.
ENDCLASS. "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 * CLASS lcl_url DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
@ -360,11 +459,6 @@ CLASS lcl_url DEFINITION FINAL.
RETURNING VALUE(rv_path_name) TYPE string RETURNING VALUE(rv_path_name) TYPE string
RAISING lcx_exception. RAISING lcx_exception.
CLASS-METHODS split_file_location
IMPORTING iv_fullpath TYPE string
EXPORTING ev_path TYPE string
ev_filename TYPE string.
PRIVATE SECTION. PRIVATE SECTION.
CLASS-METHODS regex CLASS-METHODS regex
IMPORTING iv_repo TYPE string IMPORTING iv_repo TYPE string
@ -382,27 +476,6 @@ ENDCLASS. "lcl_repo DEFINITION
*----------------------------------------------------------------------* *----------------------------------------------------------------------*
CLASS lcl_url IMPLEMENTATION. 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. METHOD host.
regex( EXPORTING iv_repo = iv_repo regex( EXPORTING iv_repo = iv_repo
IMPORTING ev_host = rv_host ). IMPORTING ev_host = rv_host ).

View File

@ -2,55 +2,242 @@
*& Include ZABAPGIT_VIEW_REPO *& 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 <item> LIKE LINE OF ct_repo_items.
LOOP AT ct_repo_items ASSIGNING <item>.
lv_index = sy-tabix.
CHECK <item>-path <> iv_cur_dir. " files in target dir - just leave them be
IF lcl_path=>is_subdir( iv_path = <item>-path iv_parent = iv_cur_dir ) = abap_true.
ls_folder-changes = <item>-changes.
ls_folder-path = <item>-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 <item>.
AT NEW path.
CLEAR ls_folder.
ls_folder-path = <item>-path.
ls_folder-sortkey = c_sortkey-dir. " Directory
ls_folder-is_dir = abap_true.
ENDAT.
ls_folder-changes = ls_folder-changes + <item>-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: <ls_repo_item> LIKE LINE OF rt_repo_items,
<ls_tadir> LIKE LINE OF lt_tadir.
lt_tadir = lcl_tadir=>read( mo_repo->get_package( ) ).
LOOP AT lt_tadir ASSIGNING <ls_tadir>.
APPEND INITIAL LINE TO rt_repo_items ASSIGNING <ls_repo_item>.
<ls_repo_item>-obj_type = <ls_tadir>-object.
<ls_repo_item>-obj_name = <ls_tadir>-obj_name.
<ls_repo_item>-path = '/' && <ls_tadir>-path. " Add root anchor
<ls_repo_item>-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: <ls_result> LIKE LINE OF lt_results,
<ls_repo_item> LIKE LINE OF rt_repo_items.
lo_repo_online ?= mo_repo.
lt_results = lo_repo_online->status( mo_log ).
LOOP AT lt_results ASSIGNING <ls_result>.
AT NEW obj_name. "obj_type + obj_name
APPEND INITIAL LINE TO rt_repo_items ASSIGNING <ls_repo_item>.
<ls_repo_item>-obj_type = <ls_result>-obj_type.
<ls_repo_item>-obj_name = <ls_result>-obj_name.
<ls_repo_item>-sortkey = c_sortkey-default. " Default sort key
<ls_repo_item>-changes = 0.
<ls_repo_item>-path = <ls_result>-path.
ENDAT.
IF <ls_result>-filename IS NOT INITIAL.
ls_file-path = <ls_result>-path.
ls_file-filename = <ls_result>-filename.
ls_file-is_changed = boolc( NOT <ls_result>-match = abap_true ).
ls_file-new = <ls_result>-new.
APPEND ls_file TO <ls_repo_item>-files.
IF ls_file-is_changed = abap_true OR ls_file-new IS NOT INITIAL.
<ls_repo_item>-sortkey = c_sortkey-changed. " Changed files
<ls_repo_item>-changes = <ls_repo_item>-changes + 1.
ENDIF.
ENDIF.
AT END OF obj_name. "obj_type + obj_name
IF <ls_repo_item>-obj_type IS INITIAL.
<ls_repo_item>-sortkey = c_sortkey-wo_obj. "Virtual objects
ELSEIF lines( <ls_repo_item>-files ) = 0.
<ls_repo_item>-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. CLASS lcl_gui_view_repo_content DEFINITION FINAL.
PUBLIC SECTION. PUBLIC SECTION.
CONSTANTS: BEGIN OF c_actions, 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_hide_files TYPE string VALUE 'toggle_hide_files' ##NO_TEXT,
END OF c_actions. END OF c_actions.
METHODS constructor METHODS constructor
IMPORTING io_repo TYPE REF TO lcl_repo IMPORTING io_repo TYPE REF TO lcl_repo
RAISING lcx_exception. RAISING lcx_exception.
METHODS render METHODS render
IMPORTING iv_path TYPE string
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
RAISING lcx_exception. RAISING lcx_exception.
PRIVATE SECTION. 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, DATA: mo_repo TYPE REF TO lcl_repo,
mv_cur_dir TYPE string,
mv_hide_files TYPE abap_bool. mv_hide_files TYPE abap_bool.
METHODS: METHODS:
render_repo_menu render_repo_menu
IMPORTING io_repo TYPE REF TO lcl_repo
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
RAISING lcx_exception, 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 render_repo_item
IMPORTING io_repo TYPE REF TO lcl_repo IMPORTING is_item TYPE lcl_repo_content_browser=>ty_repo_item
is_item TYPE ty_repo_item
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
RAISING lcx_exception, 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 render_obj_jump_link
IMPORTING iv_obj_type TYPE tadir-object IMPORTING iv_obj_type TYPE tadir-object
iv_obj_name TYPE tadir-obj_name 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. RETURNING VALUE(rv_html) TYPE string.
ENDCLASS. "lcl_gui_view_repo_content ENDCLASS. "lcl_gui_view_repo_content
@ -66,8 +253,9 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION.
METHOD render. 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_tab_menu TYPE REF TO lcl_html_toolbar,
lo_browser TYPE REF TO lcl_repo_content_browser,
lx_error TYPE REF TO lcx_exception, lx_error TYPE REF TO lcx_exception,
lo_log TYPE REF TO lcl_log. 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 lo_tab_menu.
CREATE OBJECT ro_html. CREATE OBJECT ro_html.
mv_cur_dir = iv_path.
TRY. TRY.
extract_repo_content( EXPORTING io_repo = mo_repo ro_html->add( render_repo_menu( ) ).
IMPORTING et_repo_items = lt_repo_items
eo_log = lo_log ).
" extract_repo_content must be called before rendering the menu CREATE OBJECT lo_browser EXPORTING io_repo = mo_repo.
" so that lo_log is filled with errors from the serialization lo_browser->list( EXPORTING iv_path = iv_path
ro_html->add( render_repo_menu( mo_repo ) ). IMPORTING et_repo_items = lt_repo_items
eo_log = lo_log ).
IF mo_repo->is_offline( ) = abap_false and lo_log->count( ) > 0. IF mo_repo->is_offline( ) = abap_false and lo_log->count( ) > 0.
ro_html->add( '<div class="log">' ). ro_html->add( '<div class="log">' ).
@ -92,6 +280,8 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION.
ENDIF. ENDIF.
ro_html->add( '<div class="repo_container">' ). ro_html->add( '<div class="repo_container">' ).
" Table menu
IF mo_repo->is_offline( ) = abap_false. IF mo_repo->is_offline( ) = abap_false.
IF mv_hide_files = abap_true. 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 ).
@ -101,21 +291,26 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION.
ro_html->add( lo_tab_menu->render( iv_as_angle = abap_true ) ). ro_html->add( lo_tab_menu->render( iv_as_angle = abap_true ) ).
ENDIF. ENDIF.
" Repo content table
ro_html->add( '<table width="100%" class="repo_tab">' ). ro_html->add( '<table width="100%" class="repo_tab">' ).
IF lcl_path=>is_root( iv_path ) = abap_false.
ro_html->add( render_parent_dir_line( ) ).
ENDIF.
IF lines( lt_repo_items ) = 0. IF lines( lt_repo_items ) = 0.
ro_html->add( '<tr class="unsupported firstrow"><td class="paddings">' ro_html->add( render_empty_package( ) ).
&& '<center>Empty package</center>'
&& '</td></tr>' ) ##NO_TEXT.
ELSE. ELSE.
LOOP AT lt_repo_items ASSIGNING <ls_item>. LOOP AT lt_repo_items ASSIGNING <ls_item>.
ro_html->add( render_repo_item( io_repo = mo_repo is_item = <ls_item> ) ). ro_html->add( render_repo_item( <ls_item> ) ).
ENDLOOP. ENDLOOP.
ENDIF. ENDIF.
ro_html->add( '</table>' ). ro_html->add( '</table>' ).
ro_html->add( '</div>' ). ro_html->add( '</div>' ).
CATCH lcx_exception INTO lx_error. 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 ) ). ro_html->add( lcl_gui_page_super=>render_error( lx_error ) ).
ENDTRY. ENDTRY.
@ -136,12 +331,12 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION.
CREATE OBJECT lo_tb_branch. CREATE OBJECT lo_tb_branch.
CREATE OBJECT lo_tb_advanced. CREATE OBJECT lo_tb_advanced.
lv_key = io_repo->get_key( ). lv_key = mo_repo->get_key( ).
IF io_repo->is_offline( ) = abap_false. IF mo_repo->is_offline( ) = abap_false.
lo_repo_online ?= io_repo. lo_repo_online ?= mo_repo.
ENDIF. 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_wp_opt = gc_html_opt-crossout.
lv_pull_opt = gc_html_opt-crossout. lv_pull_opt = gc_html_opt-crossout.
ELSE. ELSE.
@ -149,7 +344,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION.
ENDIF. ENDIF.
" Build branch drop-down ======================== " 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' lo_tb_branch->add( iv_txt = 'Overview'
iv_act = |{ gc_action-go_branch_overview }?{ lv_key }| ). iv_act = |{ gc_action-go_branch_overview }?{ lv_key }| ).
lo_tb_branch->add( iv_txt = 'Switch' lo_tb_branch->add( iv_txt = 'Switch'
@ -162,7 +357,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION.
ENDIF. ENDIF.
" Build advanced drop-down ======================== " 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' lo_tb_advanced->add( iv_txt = 'Reset local'
iv_act = |{ gc_action-git_reset }?{ lv_key }| iv_act = |{ gc_action-git_reset }?{ lv_key }|
iv_opt = lv_wp_opt ). iv_opt = lv_wp_opt ).
@ -183,7 +378,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION.
iv_opt = lv_wp_opt ). iv_opt = lv_wp_opt ).
" Build main toolbar ============================== " Build main toolbar ==============================
IF io_repo->is_offline( ) = abap_false. " Online ? IF mo_repo->is_offline( ) = abap_false. " Online ?
TRY. TRY.
IF lo_repo_online->get_sha1_remote( ) <> lo_repo_online->get_sha1_local( ). IF lo_repo_online->get_sha1_remote( ) <> lo_repo_online->get_sha1_local( ).
lo_toolbar->add( iv_txt = 'Pull' 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 }| ). iv_act = |{ gc_action-repo_refresh }?{ lv_key }| ).
" Render ========================================== " Render ==========================================
ro_html->add( '<div class="paddings right">' ). * ro_html->add( '<div class="paddings right">' ).
* ro_html->add( lo_toolbar->render( ) ).
* ro_html->add( '</div>' ).
ro_html->add( '<div class="paddings">' ).
ro_html->add( '<table width="100%"><tr>' ).
ro_html->add( |<td class="current_dir">{ mv_cur_dir }</td>| ).
ro_html->add( '<td class="right">' ).
ro_html->add( lo_toolbar->render( ) ). ro_html->add( lo_toolbar->render( ) ).
ro_html->add( '</td>' ).
ro_html->add( '<tr></table>' ).
ro_html->add( '</div>' ). ro_html->add( '</div>' ).
ENDMETHOD. "render_repo_menu ENDMETHOD. "render_repo_menu
METHOD extract_repo_content. METHOD get_item_class.
DATA: lo_repo_online TYPE REF TO lcl_repo_online, DATA lt_class TYPE TABLE OF string.
lt_tadir TYPE ty_tadir_tt,
ls_file TYPE ty_repo_file,
lt_results TYPE ty_results_tt.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF lt_results, IF is_item-obj_name IS INITIAL AND is_item-is_dir = abap_false.
<ls_repo_item> LIKE LINE OF et_repo_items, APPEND 'unsupported' TO lt_class.
<ls_tadir> 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 <ls_tadir>.
APPEND INITIAL LINE TO et_repo_items ASSIGNING <ls_repo_item>.
IF sy-tabix = 1.
<ls_repo_item>-is_first = abap_true.
ENDIF.
<ls_repo_item>-obj_type = <ls_tadir>-object.
<ls_repo_item>-obj_name = <ls_tadir>-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 <ls_result>.
AT NEW obj_name. "obj_type + obj_name
APPEND INITIAL LINE TO et_repo_items ASSIGNING <ls_repo_item>.
<ls_repo_item>-obj_type = <ls_result>-obj_type.
<ls_repo_item>-obj_name = <ls_result>-obj_name.
<ls_repo_item>-sortkey = c_default_sortkey. " Default sort key
<ls_repo_item>-changes = 0.
ENDAT.
IF <ls_result>-filename IS NOT INITIAL.
ls_file-path = <ls_result>-path.
ls_file-filename = <ls_result>-filename.
ls_file-is_changed = boolc( NOT <ls_result>-match = abap_true ).
ls_file-new = <ls_result>-new.
APPEND ls_file TO <ls_repo_item>-files.
IF ls_file-is_changed = abap_true OR ls_file-new IS NOT INITIAL.
<ls_repo_item>-sortkey = 2. " Changed files
<ls_repo_item>-changes = <ls_repo_item>-changes + 1.
ENDIF.
ENDIF.
AT END OF obj_name. "obj_type + obj_name
IF <ls_repo_item>-obj_type IS INITIAL.
<ls_repo_item>-sortkey = 0. "Virtual objects
ELSEIF lines( <ls_repo_item>-files ) = 0.
<ls_repo_item>-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 <ls_repo_item> INDEX 1.
IF sy-subrc IS INITIAL.
<ls_repo_item>-is_first = abap_true.
ENDIF.
ENDIF. 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 = |<img src="img/code">|.
WHEN 'W3MI' OR 'W3HT'.
rv_html = |<img src="img/bin">|.
WHEN ''.
rv_html = space. " no icon
WHEN OTHERS.
rv_html = |<img src="img/obj">|.
ENDCASE.
IF is_item-is_dir = abap_true.
rv_html = |<img src="img/dir">|.
ENDIF.
ENDMETHOD. "get_item_icon
ENDMETHOD. "extract_repo_content
METHOD render_repo_item. METHOD render_repo_item.
DATA: DATA:
lv_link TYPE string, lv_link TYPE string,
lv_icon TYPE string,
lv_difflink TYPE string, lv_difflink TYPE string,
ls_file LIKE LINE OF is_item-files, ls_file LIKE LINE OF is_item-files.
lv_trclass TYPE string.
CREATE OBJECT ro_html. 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( |<tr{ lv_trclass }>| ). ro_html->add( |<tr{ get_item_class( is_item ) }>| ).
IF is_item-obj_name IS INITIAL. IF is_item-obj_name IS INITIAL AND is_item-is_dir = abap_false.
ro_html->add( '<td colspan="2"></td>' ro_html->add( '<td colspan="2"></td>'
&& '<td class="object"><i class="grey">non-code and meta files</i></td>' ). && '<td class="object"><i class="grey">non-code and meta files</i></td>' ).
ELSEIF is_item-is_dir = abap_true.
lv_link = render_dir_jump_link( iv_path = is_item-path ).
ro_html->add( |<td class="icon">{ get_item_icon( is_item ) }</td>| ).
ro_html->add( |<td class="dir" colspan="2">{ lv_link }</td>| ).
ELSE. ELSE.
CASE is_item-obj_type. "TODO ??
WHEN 'PROG' OR 'CLAS' OR 'FUGR'.
lv_icon = |<img src="img/code">|.
WHEN 'W3MI' OR 'W3HT'.
lv_icon = |<img src="img/bin">|.
WHEN ''.
lv_icon = space. " no icon
WHEN OTHERS.
lv_icon = |<img src="img/obj">|.
ENDCASE.
lv_link = render_obj_jump_link( iv_obj_name = is_item-obj_name lv_link = render_obj_jump_link( iv_obj_name = is_item-obj_name
iv_obj_type = is_item-obj_type ). iv_obj_type = is_item-obj_type ).
ro_html->add( |<td class="icon">{ lv_icon }</td>| ). ro_html->add( |<td class="icon">{ get_item_icon( is_item ) }</td>| ).
ro_html->add( |<td class="type">{ is_item-obj_type }</td>| ). ro_html->add( |<td class="type">{ is_item-obj_type }</td>| ).
ro_html->add( |<td class="object">{ lv_link }</td>| ). ro_html->add( |<td class="object">{ lv_link }</td>| ).
ENDIF. 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( '<td class="files">' ). ro_html->add( '<td class="files">' ).
IF mv_hide_files = abap_false OR is_item-obj_type IS INITIAL. 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. ELSEIF is_item-changes > 0.
IF mv_hide_files = abap_true AND is_item-obj_name IS NOT INITIAL. IF mv_hide_files = abap_true AND is_item-obj_name IS NOT INITIAL.
lv_difflink = lcl_html_action_utils=>obj_encode( lv_difflink = lcl_html_action_utils=>obj_encode(
iv_key = io_repo->get_key( ) iv_key = mo_repo->get_key( )
ig_object = is_item ). ig_object = is_item ).
ro_html->add_anchor( ro_html->add_anchor(
iv_txt = |diff ({ is_item-changes })| iv_txt = |diff ({ is_item-changes })|
@ -369,7 +524,7 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION.
ro_html->add( '<span class="grey">new @local</span>' ). ro_html->add( '<span class="grey">new @local</span>' ).
ELSEIF ls_file-is_changed = abap_true. ELSEIF ls_file-is_changed = abap_true.
lv_difflink = lcl_html_action_utils=>file_encode( lv_difflink = lcl_html_action_utils=>file_encode(
iv_key = io_repo->get_key( ) iv_key = mo_repo->get_key( )
ig_file = ls_file ). ig_file = ls_file ).
ro_html->add_anchor( ro_html->add_anchor(
iv_txt = 'diff' iv_txt = 'diff'
@ -388,6 +543,41 @@ CLASS lcl_gui_view_repo_content IMPLEMENTATION.
ENDMETHOD. "render_repo_item ENDMETHOD. "render_repo_item
METHOD render_empty_package.
rv_html = '<tr class="unsupported"><td class="paddings">'
&& '<center>Empty package</center>'
&& '</td></tr>' ##NO_TEXT.
ENDMETHOD. "render_empty_package
METHOD render_parent_dir_line.
CREATE OBJECT ro_html.
ro_html->add( '<tr class="folder">' ).
ro_html->add( |<td class="icon"><img src="img/dir"></td>| ).
ro_html->add( |<td class="object" colspan="2">{ render_dir_jump_link( '..' ) }</td>| ).
ro_html->add( '</tr>' ).
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. METHOD render_obj_jump_link.
DATA: lv_encode TYPE string, DATA: lv_encode TYPE string,