From 362a8de7deb475396aa87fbb01ba06c6c88ad3fe Mon Sep 17 00:00:00 2001 From: sbcgua Date: Wed, 5 Oct 2016 23:17:29 +0200 Subject: [PATCH] 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,