diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap
index 2d67a86f9..36faa3297 100644
--- a/src/zabapgit.prog.abap
+++ b/src/zabapgit.prog.abap
@@ -3,7 +3,7 @@ REPORT zabapgit LINE-SIZE 100.
* See http://www.abapgit.org
CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT
- gc_abap_version TYPE string VALUE 'v1.14.0'. "#EC NOTEXT
+ gc_abap_version TYPE string VALUE 'v1.15.0'. "#EC NOTEXT
********************************************************************************
* The MIT License (MIT)
@@ -116,6 +116,8 @@ INCLUDE zabapgit_page_merge.
INCLUDE zabapgit_page_branch_overview.
INCLUDE zabapgit_page_stage.
INCLUDE zabapgit_page_db.
+INCLUDE zabapgit_page_main.
+INCLUDE zabapgit_page_background.
INCLUDE zabapgit_gui.
INCLUDE zabapgit_app_impl.
INCLUDE zabapgit_unit_test.
diff --git a/src/zabapgit_gui.prog.abap b/src/zabapgit_gui.prog.abap
index 76d7da871..ddbfc9f80 100644
--- a/src/zabapgit_gui.prog.abap
+++ b/src/zabapgit_gui.prog.abap
@@ -399,79 +399,6 @@ CLASS lcl_gui_page_explore IMPLEMENTATION.
ENDCLASS. "lcl_gui_page_explore IMPLEMENTATION
-
-CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
-
- PUBLIC SECTION.
- METHODS lif_gui_page~render REDEFINITION.
- METHODS lif_gui_page~get_assets REDEFINITION.
-
- PRIVATE SECTION.
-
- 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,
- END OF ty_repo_item.
- TYPES tt_repo_items TYPE STANDARD TABLE OF ty_repo_item WITH DEFAULT KEY.
-
- METHODS styles
- RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
-
- METHODS render_error
- IMPORTING ix_error TYPE REF TO lcx_exception
- RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
-
- METHODS render_toc
- IMPORTING it_list TYPE lcl_repo_srv=>ty_repo_tt
- RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
- RAISING lcx_exception.
-
- METHODS build_main_menu
- RETURNING VALUE(ro_menu) TYPE REF TO lcl_html_toolbar.
-
- 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.
-
- METHODS render_menu_hidden
- IMPORTING io_repo TYPE REF TO lcl_repo
- RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
- RAISING lcx_exception.
-
- METHODS render_repo
- IMPORTING io_repo TYPE REF TO lcl_repo
- RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
- RAISING lcx_exception.
-
- METHODS 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.
-
- METHODS 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.
-
- 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.
-
- METHODS render_explore
- RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
- RAISING lcx_exception.
-
- METHODS needs_installation
- RETURNING VALUE(rv_not_completely_installed) TYPE abap_bool.
-
-ENDCLASS.
-
CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
PUBLIC SECTION.
@@ -709,820 +636,6 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
ENDCLASS.
-CLASS lcl_gui_page_background_run DEFINITION FINAL
- INHERITING FROM lcl_gui_page_super.
-
- PUBLIC SECTION.
- METHODS:
- lif_gui_page~on_event REDEFINITION,
- lif_gui_page~render REDEFINITION.
-
- PRIVATE SECTION.
- DATA: mt_text TYPE TABLE OF string.
-
- METHODS: run.
-
-ENDCLASS.
-
-CLASS lcl_gui_page_background_run IMPLEMENTATION.
-
- METHOD lif_gui_page~on_event.
- RETURN.
- ENDMETHOD.
-
- METHOD run.
-
- DATA: lx_error TYPE REF TO lcx_exception,
- lv_text TYPE string,
- lv_line TYPE i VALUE 1.
-
-
- TRY.
- lcl_background=>run( ).
-
- DO.
- READ LINE lv_line LINE VALUE INTO lv_text.
- IF sy-subrc <> 0.
- EXIT.
- ENDIF.
- APPEND lv_text TO mt_text.
- lv_line = lv_line + 1.
- ENDDO.
- CATCH lcx_exception INTO lx_error.
- APPEND lx_error->mv_text TO mt_text.
- ENDTRY.
-
- ENDMETHOD.
-
- METHOD lif_gui_page~render.
-
- DATA: lv_text LIKE LINE OF mt_text.
-
-
- run( ).
-
- CREATE OBJECT ro_html.
-
- ro_html->add( header( ) ).
- ro_html->add( title( 'BACKGROUND_RUN' ) ).
- ro_html->add( '
' ).
- LOOP AT mt_text INTO lv_text.
- ro_html->add( '
' && lv_text && '
' ).
- ENDLOOP.
- ro_html->add( '
' ).
- ro_html->add( footer( ) ).
-
- ENDMETHOD.
-
-ENDCLASS.
-
-CLASS lcl_gui_page_background DEFINITION FINAL
- INHERITING FROM lcl_gui_page_super.
-
- PUBLIC SECTION.
- METHODS:
- lif_gui_page~on_event REDEFINITION,
- lif_gui_page~render REDEFINITION.
-
- PRIVATE SECTION.
-
- METHODS:
- parse_fields
- IMPORTING iv_getdata TYPE clike
- RETURNING VALUE(rs_fields) TYPE lcl_persistence_background=>ty_background,
- render_data
- RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
- RAISING lcx_exception,
- save
- IMPORTING iv_getdata TYPE clike
- RAISING lcx_exception.
-
-ENDCLASS.
-
-CLASS lcl_gui_page_background IMPLEMENTATION.
-
- METHOD parse_fields.
-
- DEFINE _field.
- READ TABLE lt_fields ASSIGNING WITH KEY name = &1 ##NO_TEXT.
- IF sy-subrc = 0.
- rs_fields-&2 = -value.
- ENDIF.
- END-OF-DEFINITION.
-
- DATA: lt_fields TYPE tihttpnvp,
- lv_string TYPE string.
-
- FIELD-SYMBOLS: LIKE LINE OF lt_fields.
-
-
- lv_string = iv_getdata. " type conversion
- lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ).
-
- _field 'key' key.
- _field 'method' method.
- _field 'username' username.
- _field 'password' password.
-
- ASSERT NOT rs_fields IS INITIAL.
-
- ENDMETHOD.
-
- METHOD lif_gui_page~on_event.
-
- CASE iv_action.
- WHEN 'save'.
- save( iv_getdata ).
- ev_state = gc_event_state-re_render.
- ENDCASE.
-
- ENDMETHOD.
-
- METHOD save.
-
- DATA: ls_fields TYPE lcl_persistence_background=>ty_background,
- lo_persistence TYPE REF TO lcl_persistence_background.
-
-
- ls_fields = parse_fields( iv_getdata ).
-
- CREATE OBJECT lo_persistence.
-
- IF ls_fields-method = lcl_persistence_background=>c_method-nothing.
- lo_persistence->delete( ls_fields-key ).
- ELSE.
- lo_persistence->modify( ls_fields ).
- ENDIF.
-
- COMMIT WORK.
-
- ENDMETHOD.
-
- METHOD render_data.
-
- DATA: lo_repo TYPE REF TO lcl_repo,
- lo_online TYPE REF TO lcl_repo_online,
- lo_per TYPE REF TO lcl_persistence_background,
- lt_per TYPE lcl_persistence_background=>tt_background,
- ls_per LIKE LINE OF lt_per,
- lv_nothing TYPE string,
- lv_push TYPE string,
- lv_pull TYPE string,
- lt_list TYPE lcl_repo_srv=>ty_repo_tt.
-
-
- CREATE OBJECT ro_html.
-
- ro_html->add( '' ).
- ro_html->add( 'Listing online repositories' ) ##NO_TEXT.
- ro_html->add( '
' ).
-
- CREATE OBJECT lo_per.
- lt_per = lo_per->list( ).
- lt_list = lcl_app=>repo_srv( )->list( ).
-
- LOOP AT lt_list INTO lo_repo.
- IF lo_repo->is_offline( ) = abap_false.
- lo_online ?= lo_repo.
-
- READ TABLE lt_per INTO ls_per WITH KEY key = lo_online->get_key( ).
- IF sy-subrc <> 0.
- CLEAR ls_per.
- ENDIF.
-
- CLEAR lv_push.
- CLEAR lv_pull.
- CLEAR lv_nothing.
- CASE ls_per-method.
- WHEN lcl_persistence_background=>c_method-push.
- lv_push = ' checked' ##NO_TEXT.
- WHEN lcl_persistence_background=>c_method-pull.
- lv_pull = ' checked' ##NO_TEXT.
- WHEN OTHERS.
- lv_nothing = ' checked' ##NO_TEXT.
- ENDCASE.
-
- ro_html->add( '
' && lo_online->get_name( ) && '
' ).
- ro_html->add( '
' ).
- ro_html->add( '
' ).
- ENDIF.
- ENDLOOP.
-
- ro_html->add( '
' ).
-
- ENDMETHOD.
-
- METHOD lif_gui_page~render.
-
- DATA lo_toolbar TYPE REF TO lcl_html_toolbar.
-
- CREATE OBJECT lo_toolbar.
- CREATE OBJECT ro_html.
-
- lo_toolbar->add( iv_txt = 'Run background logic'
- iv_act = 'background_run' ) ##NO_TEXT.
-
- ro_html->add( header( ) ).
- ro_html->add( title( iv_title = 'BACKGROUND' io_menu = lo_toolbar ) ).
- ro_html->add( render_data( ) ).
- ro_html->add( footer( ) ).
-
- ENDMETHOD.
-
-ENDCLASS.
-
-CLASS lcl_gui_page_main IMPLEMENTATION.
-
- 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 = |jump?{ lv_encode }| ).
- rv_html = lo_html->mv_html.
-
- ENDMETHOD.
-
- METHOD build_main_menu.
-
- DATA lo_betasub TYPE REF TO lcl_html_toolbar.
-
-
- CREATE OBJECT ro_menu.
- CREATE OBJECT lo_betasub.
-
- lo_betasub->add( iv_txt = 'Database util' iv_act = 'db' ) ##NO_TEXT.
- lo_betasub->add( iv_txt = 'Package to zip' iv_act = 'packagezip' ) ##NO_TEXT.
- lo_betasub->add( iv_txt = 'Transport to zip' iv_act = 'transportzip' ) ##NO_TEXT.
- lo_betasub->add( iv_txt = 'Background mode' iv_act = 'background' ) ##NO_TEXT.
-
- ro_menu->add( iv_txt = 'Refresh all' iv_act = 'refresh' ) ##NO_TEXT.
- ro_menu->add( iv_txt = 'Clone' iv_act = 'install' ) ##NO_TEXT.
- ro_menu->add( iv_txt = 'Explore' iv_act = 'explore' ) ##NO_TEXT.
- ro_menu->add( iv_txt = 'New offline repo' iv_act = 'newoffline' ) ##NO_TEXT.
- IF needs_installation( ) = abap_true.
- ro_menu->add( iv_txt = 'Get abapGit' iv_act = 'abapgit_installation' ) ##NO_TEXT.
- ENDIF.
- ro_menu->add( iv_txt = 'β' io_sub = lo_betasub ).
-
- ENDMETHOD. "build main_menu
-
- METHOD styles.
-
- CREATE OBJECT ro_html.
-
- _add '/* REPOSITORY TABLE*/'.
- _add '.repo_tab {'.
- _add ' border: 1px solid #DDD;'.
- _add ' border-radius: 3px;'.
- _add ' background: #fff;'.
- _add ' margin-top: 0.5em;'.
- _add '}'.
- _add '.repo_tab td {'.
- _add ' border-top: 1px solid #eee;'.
- _add ' vertical-align: middle;'.
- _add ' color: #333;'.
- _add ' padding-top: 2px;'.
- _add ' padding-bottom: 2px;'.
- _add '}'.
- _add '.repo_tab td.icon {'.
- _add ' width: 32px;'.
- _add ' text-align: center;'.
- _add '}'.
- _add '.repo_tab td.type {'.
- _add ' width: 3em;'.
- _add '}'.
- _add '.repo_tab td.object {'.
- _add ' padding-left: 0.5em;'.
- _add '}'.
- _add '.repo_tab td.files {'.
- _add ' padding-left: 0.5em;'.
- _add '}'.
- _add '.repo_tab td.cmd {'.
- _add ' text-align: right;'.
- _add ' padding-left: 0.5em;'.
- _add ' padding-right: 1em;'.
- _add '}'.
- _add '.repo_tab tr.unsupported { color: lightgrey; }'.
- _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; }'.
-
- ENDMETHOD.
-
- METHOD render_menu_hidden.
-
- DATA: lv_key TYPE lcl_persistence_db=>ty_value,
- lo_toolbar TYPE REF TO lcl_html_toolbar.
-
-
- CREATE OBJECT ro_html.
- CREATE OBJECT lo_toolbar.
-
- lv_key = io_repo->get_key( ).
-
- lo_toolbar->add( iv_txt = 'Show'
- iv_act = |unhide?{ lv_key }| ).
-
- ro_html->add( '' ).
- ro_html->add( lo_toolbar->render( ) ).
- ro_html->add( '
' ).
-
- ENDMETHOD.
-
- METHOD render_repo_menu.
-
- DATA: lo_toolbar TYPE REF TO lcl_html_toolbar,
- lv_key TYPE lcl_persistence_db=>ty_value,
- lo_sub TYPE REF TO lcl_html_toolbar,
- lo_repo_online TYPE REF TO lcl_repo_online.
-
-
- CREATE OBJECT ro_html.
- CREATE OBJECT lo_toolbar.
-
- lv_key = io_repo->get_key( ).
-
- IF io_repo->is_offline( ) = abap_true.
- lo_toolbar->add( iv_txt = 'Import ZIP'
- iv_act = |zipimport?{ lv_key }|
- iv_opt = gc_html_opt-emphas ).
- lo_toolbar->add( iv_txt = 'Export ZIP'
- iv_act = |zipexport?{ lv_key }|
- iv_opt = gc_html_opt-emphas ).
- lo_toolbar->add( iv_txt = 'Export&Commit'
- iv_act = |files_commit?{ lv_key }|
- iv_opt = gc_html_opt-emphas ).
- ELSE.
- lo_repo_online ?= io_repo.
- TRY.
- IF lo_repo_online->get_sha1_remote( ) <> lo_repo_online->get_sha1_local( ).
- lo_toolbar->add( iv_txt = 'Pull'
- iv_act = |pull?{ lv_key }|
- iv_opt = gc_html_opt-emphas ).
- ELSEIF lcl_stage_logic=>count( lo_repo_online ) > 0.
- lo_toolbar->add( iv_txt = 'Stage'
- iv_act = |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.
- ENDIF.
-
- CREATE OBJECT lo_sub.
- lo_sub->add( iv_txt = 'Remove'
- iv_act = |remove?{ lv_key }| ).
- lo_sub->add( iv_txt = 'Uninstall'
- iv_act = |uninstall?{ lv_key }| ).
- lo_sub->add( iv_txt = 'Switch branch'
- iv_act = |switch_branch?{ lv_key }| ).
- lo_sub->add( iv_txt = 'Reset'
- iv_act = |reset?{ lv_key }| ).
- lo_sub->add( iv_txt = 'Create branch'
- iv_act = |create_branch?{ lv_key }| ).
- lo_sub->add( iv_txt = 'Branch overview'
- iv_act = |branch_overview?{ lv_key }| ).
- lo_toolbar->add( iv_txt = 'Advanced'
- io_sub = lo_sub ) ##NO_TEXT.
-
- lo_toolbar->add( iv_txt = 'Refresh'
- iv_act = |refresh?{ lv_key }| ).
- lo_toolbar->add( iv_txt = 'Hide'
- iv_act = |hide?{ lv_key }| ).
-
- ro_html->add( '' ).
- ro_html->add( lo_toolbar->render( ) ).
- ro_html->add( '
' ).
-
- ENDMETHOD.
-
- METHOD render_repo.
- DATA: lt_repo_items TYPE tt_repo_items,
- lx_error TYPE REF TO lcx_exception,
- lo_log TYPE REF TO lcl_log.
-
- FIELD-SYMBOLS LIKE LINE OF lt_repo_items.
-
-
- CREATE OBJECT ro_html.
-
- ro_html->add( || ).
- ro_html->add( render_repo_top( io_repo ) ).
-
- IF lcl_app=>user( )->is_hidden( io_repo->get_key( ) ) = abap_false.
- 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 ) ).
-
- ro_html->add( '
' ).
-
- IF lines( lt_repo_items ) = 0.
- ro_html->add( ''
- && 'Empty package'
- && ' |
' ) ##NO_TEXT.
- ELSE.
- LOOP AT lt_repo_items ASSIGNING .
- ro_html->add( render_repo_item( io_repo = io_repo is_item = ) ).
- ENDLOOP.
- ENDIF.
-
- ro_html->add( '
' ).
-
- IF io_repo->is_offline( ) = abap_false.
- ro_html->add( '
' ).
-* shows eg. list of unsupported objects
- ro_html->add( lo_log->to_html( ) ).
- ro_html->add( '
' ).
- ENDIF.
- CATCH lcx_exception INTO lx_error.
- ro_html->add( render_repo_menu( io_repo ) ).
- ro_html->add( render_error( lx_error ) ).
- ENDTRY.
- ELSE.
- ro_html->add( render_menu_hidden( io_repo ) ).
- ENDIF.
-
- ro_html->add( '
' ).
-
- ENDMETHOD.
-
- METHOD extract_repo_content.
-
- DATA: lo_repo_online TYPE REF TO lcl_repo_online,
- lt_tadir TYPE ty_tadir_tt,
- ls_repo_item TYPE ty_repo_item,
- ls_file TYPE ty_repo_file,
- lt_results TYPE ty_results_tt.
-
- FIELD-SYMBOLS: LIKE LINE OF lt_results,
- 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 .
- CLEAR ls_repo_item.
- IF sy-tabix = 1.
- ls_repo_item-is_first = abap_true.
- ENDIF.
- ls_repo_item-obj_type = -object.
- ls_repo_item-obj_name = -obj_name.
- APPEND ls_repo_item TO et_repo_items.
- 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
- CLEAR ls_repo_item.
- IF sy-tabix = 1.
- ls_repo_item-is_first = abap_true.
- ENDIF.
- ls_repo_item-obj_type = -obj_type.
- ls_repo_item-obj_name = -obj_name.
- ENDAT.
-
- IF -filename IS NOT INITIAL.
- ls_file-path = -path.
- ls_file-filename = -filename.
- ls_file-is_changed = boolc( NOT -match = abap_true ).
- APPEND ls_file TO ls_repo_item-files.
- ENDIF.
-
- AT END OF obj_name. "obj_type + obj_name
- APPEND ls_repo_item TO et_repo_items.
- ENDAT.
- ENDLOOP.
- ENDIF.
-
- ENDMETHOD.
-
- 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 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( ' | ' ).
- ELSE.
- CASE is_item-obj_type. "TODO ??
- WHEN 'PROG' OR 'CLAS' OR 'FUGR'.
- lv_icon = |
|.
- WHEN 'W3MI' OR 'W3HT'.
- lv_icon = |
|.
- WHEN ''.
- " 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( '' ).
- LOOP AT is_item-files INTO ls_file.
- ro_html->add( |{ ls_file-path && ls_file-filename }| ).
- ENDLOOP.
- ro_html->add( ' | ' ).
-
- ro_html->add( '' ).
- IF lines( is_item-files ) = 0.
- ro_html->add( 'new' ).
- ELSE.
- LOOP AT is_item-files INTO ls_file.
- IF 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 = |diff?{ lv_difflink }| ).
- ELSE.
- ro_html->add( | | ).
- ENDIF.
- ENDLOOP.
- ENDIF.
- ro_html->add( ' | ' ).
-
- ENDIF.
-
- ro_html->add( '
' ).
-
- ENDMETHOD.
-
- METHOD needs_installation.
-
- CONSTANTS:
- lc_abapgit TYPE string VALUE 'https://github.com/larshp/abapGit.git',
- lc_plugins TYPE string VALUE 'https://github.com/larshp/abapGit-plugins.git' ##NO_TEXT.
-
- TRY.
- IF lcl_app=>repo_srv( )->is_repo_installed( lc_abapgit ) = abap_false
- OR lcl_app=>repo_srv( )->is_repo_installed( lc_plugins ) = abap_false.
- rv_not_completely_installed = abap_true.
- ENDIF.
- CATCH lcx_exception.
- " cannot be installed anyway in this case, e.g. no connection
- rv_not_completely_installed = abap_false.
- ENDTRY.
- ENDMETHOD. "needs_installation
-
- METHOD render_toc.
-
- DATA: lo_repo LIKE LINE OF it_list,
- lo_toolbar TYPE REF TO lcl_html_toolbar.
-
-
- CREATE OBJECT ro_html.
- CREATE OBJECT lo_toolbar.
-
- IF lines( it_list ) = 0.
- RETURN.
- ENDIF.
-
- LOOP AT it_list INTO lo_repo.
- lo_toolbar->add( iv_txt = lo_repo->get_name( )
- iv_typ = gc_action_type-url
- iv_act = |#repo{ lo_repo->get_key( ) }| ).
- ENDLOOP.
-
- ro_html->add( '' ) ##NO_TEXT.
- ro_html->add( '

' ).
- ro_html->add( lo_toolbar->render( ) ).
- ro_html->add( '
' ).
-
- ENDMETHOD.
-
- METHOD render_error.
-
- CREATE OBJECT ro_html.
-
- ro_html->add( '' ).
- ro_html->add( |Error: { ix_error->mv_text }| ).
- ro_html->add( '
' ).
-
- ENDMETHOD.
-
- METHOD render_explore.
-
- DATA lo_toolbar TYPE REF TO lcl_html_toolbar.
-
- CREATE OBJECT ro_html.
- CREATE OBJECT lo_toolbar.
-
- lo_toolbar->add( iv_txt = 'Explore new projects'
- iv_act = 'explore' ) ##NO_TEXT.
-
- ro_html->add( '' ).
- ro_html->add( lo_toolbar->render( ) ).
- ro_html->add( '
' ).
-
- ENDMETHOD.
-
- 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.
-
-
- CREATE OBJECT ro_html.
-
- ro_html->add( header( io_include_style = styles( ) ) ).
- ro_html->add( title( iv_title = 'HOME' io_menu = build_main_menu( ) ) ).
-
- TRY.
- lt_repos = lcl_app=>repo_srv( )->list( ).
- CATCH lcx_exception INTO lx_error.
- ro_html->add( render_error( lx_error ) ).
- ENDTRY.
-
- ro_html->add( render_toc( lt_repos ) ).
-
- IF lines( lt_repos ) = 0 AND lx_error IS INITIAL.
- ro_html->add( render_explore( ) ).
- ELSE.
- LOOP AT lt_repos INTO lo_repo.
- lcl_progress=>show( iv_key = 'Render'
- iv_current = sy-tabix
- iv_total = lines( lt_repos )
- iv_text = lo_repo->get_name( ) ) ##NO_TEXT.
- ro_html->add( render_repo( lo_repo ) ).
- ENDLOOP.
- ENDIF.
-
- ro_html->add( footer( ) ).
-
- ENDMETHOD.
-
- METHOD lif_gui_page~get_assets.
-
- DATA ls_image TYPE ty_web_asset.
-
- rt_assets = super->lif_gui_page~get_assets( ).
-
- ls_image-url = 'img/toc' ##NO_TEXT.
- ls_image-content =
- 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAFVBMVEUAAACAgICAgICA'
- && 'gICAgICAgICAgIAO39T0AAAABnRSTlMABBCRlMXJzV0oAAAAN0lEQVQIW2NgwABuaWlB'
- && 'YWlpDgwJDAxiAgxACshgYwAz0tLY2NISSBWBMYAmg4ADyBZhARCJAQBBchGypGCbQgAA'
- && 'AABJRU5ErkJggg=='.
- APPEND ls_image TO rt_assets.
-
- ls_image-url = 'img/repo_online' ##NO_TEXT.
- ls_image-content =
- 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAApVBMVEUAAABQbJxQbJxQ'
- && 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ'
- && 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ'
- && 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ'
- && 'bJz+TJ01AAAANnRSTlMAAQIDBAcJCgwSFBocHygqMTM1NkRHSU1QUWFiZGlweHuDiImL'
- && 'lZiio6a5vsfT3uTo6e3x9fsxY2JuAAAAgUlEQVQYGXXB6RaBUBSA0e+IEuIiMs9zhlDn'
- && '/R/NZWmt/LA3f1RcoaB50SydCbn20wjedkPu3sKSpMGH21PhLdZ0BATZ+cCXtxtDHGLV'
- && 'pgFW9QqJj2U0wvJvMF+5jiNGI3HK9dMQSouH6sRoFGoWd8l1dEDRWlWPQsFS98KPvvDH'
- && 'C3HLClrWc70ZAAAAAElFTkSuQmCC'.
- APPEND ls_image TO rt_assets.
-
- ls_image-url = 'img/repo_offline' ##NO_TEXT.
- ls_image-content =
- 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBB'
- && 'ZG9iZSBJbWFnZVJlYWR5ccllPAAAAWNJREFUeNrEkr1KxFAQhe9P/iS6goLWiiB2PoCN'
- && 'lYW9ChbbiFhYRAQ7MaS2SOdT2PkSvoGPINiF1YTNz/WceC+sohDYwoFvZ/Zm78mcmZXG'
- && 'GDFPKDFn/L+AdEWWZUIptRmG4bLWeglHNXjHjGoppUa9CiaoX3ieJEl/z3MCXdfdIKXT'
- && '6bRFju2xYeASJ618338Dl6gf8zw3FOktpGk6QrrFmyPP82J0IgmCHxq1F0URBdbxuzuw'
- && '9nMGR2CRltCBbJpG1HUtmNGZcN/tynfAgbPgBMbWxp/DcmIIDaFdWOjtK7S/hbxnDQu0'
- && 'LGBFBEHQg7YNbAnCZ5xJWZbnRVFsuw7GM4P8hhXkPLgh0batqKqKFmM8O3FbeAanIOAM'
- && 'cJFQWNoBLpAv/e6D4PKEK3UCh+DiN9/sgG8lbhSWCNyDJ2U3MDSOwQa7cfc828rKQIF9'
- && '+x9QsxauwAMYDRA4s/kVXLP4FGAAajajeu7yxJkAAAAASUVORK5CYII='.
- APPEND ls_image TO rt_assets.
-
- ls_image-url = 'img/pkg' ##NO_TEXT.
- ls_image-content =
- 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA30lEQVQoU43OIUuDcRSF'
- && '8fvqhuB0mFwaKLbVBVdkX0GTFss+wYL2H4rJIIgyQQSzZcUPoGHZ9CKCmAwTMS8Y/ga3'
- && 'BWVjT7hwOQ+HEzEbMhU7jrTd69q2KhtFRU2nrvS927dm3pyqPXcuNRVD7sxiRIQlDSc+'
- && 'PGjZUFDWkYekLfdoV2XYua4rSZ61pZBkEUq2XPty41XuXJIiZGNhPDVZiFCYIMSor+Db'
- && '7RQhYnQnCsNvNmGgPFFYMQh1PU9aqrLxyGUNx/p66r9mUc2hFx3JhU9vDtQU4y9KGjaV'
- && '/gXT+AGZVIinhU2EAwAAAABJRU5ErkJggg=='.
- APPEND ls_image TO rt_assets.
-
- ls_image-url = 'img/branch' ##NO_TEXT.
- ls_image-content =
- 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAqFBMVEUAAACAgICAgICA'
- && 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
- && 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
- && 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
- && 'gICAgID/OyosAAAAN3RSTlMAAQIDBAYICQ8TFRweJScoKSo3Oj1FRk1dYWJjZmhzdIaJ'
- && 'j5GVm6CwsrS5vsHDyszV19ne7/X583teZAAAAIFJREFUGFdVytkagVAYheFvFzJlnqc0'
- && 'EEoR+u//zhxI7dbZ9z4LMJ1op9DmjpntdXiBigHbLiAYqukBVr63+YGRSazgCY/iEooP'
- && 'xKZxr0EnSbo14B1Rg4msKzj150fJrQpERPLBv7mIfNxlq+zRbZsu0JYpGlcdwjY9Twfr'
- && 'nAbNsr6IKQxJI/U5CgAAAABJRU5ErkJggg=='.
- APPEND ls_image TO rt_assets.
-
- ls_image-url = 'img/link' ##NO_TEXT.
- ls_image-content =
- 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAXVBMVEUAAACAgICAgICA'
- && 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
- && 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVwFMKAAAAHnRSTlMAAwQFBgcK'
- && 'FR4gIiMmP0JHSm+RmKDByM/R09rg+/0jN/q+AAAAX0lEQVQYV43Nxw6AIBAE0FGw916Z'
- && '//9MRQ0S4sG5bPZlCxqSCyBGXgFUJKUA4A8PUOKONzuQOxOZIjcLkrMvxGQg3skSCFYL'
- && 'Kl1Ds5LWz+33yyf4rQOSf6CjnV6rHeAA87gJtKzI8ocAAAAASUVORK5CYII='.
- APPEND ls_image TO rt_assets.
-
- ls_image-url = 'img/code' ##NO_TEXT.
- ls_image-content =
- 'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAElBMVEUAAACAgICAgICA'
- && 'gICAgICAgIC07w1vAAAABXRSTlMABECUxcOwZQcAAAA1SURBVAhbY2AODQ0NEWBgYGVg'
- && 'YGByhNAMKgIMrKyhAQxMDhA+QwCCZgVqIIUP1Q+yJzTUAAAfUAq+Os55uAAAAABJRU5E'
- && 'rkJggg=='.
- APPEND ls_image TO rt_assets.
-
- ls_image-url = 'img/bin' ##NO_TEXT.
- ls_image-content =
- 'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAElBMVEUAAACAgICAgICA'
- && 'gICAgICAgIC07w1vAAAABXRSTlMABECUxcOwZQcAAABBSURBVAhbXcqxDYAwAMRAK8h9'
- && 'hmAARoANvuD3X4UCiojqZMlsbe8JAuN6ZZ9ozThRCVmsJe9H0HwdXf19W9v2eAA6Fws2'
- && 'RotPsQAAAABJRU5ErkJggg=='.
- APPEND ls_image TO rt_assets.
-
- ls_image-url = 'img/obj' ##NO_TEXT.
- ls_image-content =
- 'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAIVBMVEUAAACAgICAgICA'
- && 'gICAgICAgICAgICAgICAgICAgICAgIDcWqnoAAAACnRSTlMABD1AZI+RlcPFIaFe1gAA'
- && 'AEVJREFUCFtjYF+1atVKAQYGLgYGBuaJEJrBUgBCM0+A0AwLgLQIgyOIZmwCSgNptgAG'
- && '1gQQfzKDhgCSPFw9Kg2yZ9WqAgBWJBENLk6V3AAAAABJRU5ErkJggg=='.
- APPEND ls_image TO rt_assets.
-
- ENDMETHOD.
-
-ENDCLASS.
-
*----------------------------------------------------------------------*
* CLASS lcl_gui_router IMPLEMENTATION
*----------------------------------------------------------------------*
@@ -1617,21 +730,9 @@ CLASS lcl_gui_router IMPLEMENTATION.
WHEN 'transportzip'.
lcl_transport=>zip( ).
ev_state = gc_event_state-no_more_act.
- WHEN 'hide'.
- lv_key = iv_getdata.
- lcl_app=>user( )->hide( lv_key ).
- ev_state = gc_event_state-re_render.
- WHEN 'unhide'.
- lv_key = iv_getdata.
- lcl_app=>user( )->unhide( lv_key ).
- ev_state = gc_event_state-re_render.
WHEN 'refresh'.
lv_key = iv_getdata.
- IF lv_key IS INITIAL. " Refresh all or single
- lcl_app=>repo_srv( )->refresh( ).
- ELSE.
- lcl_app=>repo_srv( )->get( lv_key )->refresh( ).
- ENDIF.
+ lcl_app=>repo_srv( )->get( lv_key )->refresh( ).
ev_state = gc_event_state-re_render.
" Repository online actions
diff --git a/src/zabapgit_html.prog.abap b/src/zabapgit_html.prog.abap
index 15343cd3c..17b1748d5 100644
--- a/src/zabapgit_html.prog.abap
+++ b/src/zabapgit_html.prog.abap
@@ -393,7 +393,6 @@ CLASS lcl_html_helper IMPLEMENTATION.
lv_href = | href="sapevent:{ iv_act }"|.
WHEN gc_action_type-onclick.
lv_href = | onclick="{ iv_act }"|.
- WHEN OTHERS.
ENDCASE.
ENDIF.
diff --git a/src/zabapgit_page_background.prog.abap b/src/zabapgit_page_background.prog.abap
new file mode 100644
index 000000000..b1eafa895
--- /dev/null
+++ b/src/zabapgit_page_background.prog.abap
@@ -0,0 +1,252 @@
+*&---------------------------------------------------------------------*
+*& Include ZABAPGIT_PAGE_BACKGROUND
+*&---------------------------------------------------------------------*
+
+CLASS lcl_gui_page_background_run DEFINITION FINAL
+ INHERITING FROM lcl_gui_page_super.
+
+ PUBLIC SECTION.
+ METHODS:
+ lif_gui_page~on_event REDEFINITION,
+ lif_gui_page~render REDEFINITION.
+
+ PRIVATE SECTION.
+ DATA: mt_text TYPE TABLE OF string.
+
+ METHODS: run.
+
+ENDCLASS.
+
+CLASS lcl_gui_page_background_run IMPLEMENTATION.
+
+ METHOD lif_gui_page~on_event.
+ RETURN.
+ ENDMETHOD.
+
+ METHOD run.
+
+ DATA: lx_error TYPE REF TO lcx_exception,
+ lv_text TYPE string,
+ lv_line TYPE i VALUE 1.
+
+
+ TRY.
+ lcl_background=>run( ).
+
+ DO.
+ READ LINE lv_line LINE VALUE INTO lv_text.
+ IF sy-subrc <> 0.
+ EXIT.
+ ENDIF.
+ APPEND lv_text TO mt_text.
+ lv_line = lv_line + 1.
+ ENDDO.
+ CATCH lcx_exception INTO lx_error.
+ APPEND lx_error->mv_text TO mt_text.
+ ENDTRY.
+
+ ENDMETHOD.
+
+ METHOD lif_gui_page~render.
+
+ DATA: lv_text LIKE LINE OF mt_text.
+
+
+ run( ).
+
+ CREATE OBJECT ro_html.
+
+ ro_html->add( header( ) ).
+ ro_html->add( title( 'BACKGROUND_RUN' ) ).
+ ro_html->add( '' ).
+ LOOP AT mt_text INTO lv_text.
+ ro_html->add( '
' && lv_text && '
' ).
+ ENDLOOP.
+ ro_html->add( '
' ).
+ ro_html->add( footer( ) ).
+
+ ENDMETHOD.
+
+ENDCLASS.
+
+CLASS lcl_gui_page_background DEFINITION FINAL
+ INHERITING FROM lcl_gui_page_super.
+
+ PUBLIC SECTION.
+ METHODS:
+ lif_gui_page~on_event REDEFINITION,
+ lif_gui_page~render REDEFINITION.
+
+ PRIVATE SECTION.
+
+ METHODS:
+ parse_fields
+ IMPORTING iv_getdata TYPE clike
+ RETURNING VALUE(rs_fields) TYPE lcl_persistence_background=>ty_background,
+ render_data
+ RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
+ RAISING lcx_exception,
+ save
+ IMPORTING iv_getdata TYPE clike
+ RAISING lcx_exception.
+
+ENDCLASS.
+
+CLASS lcl_gui_page_background IMPLEMENTATION.
+
+ METHOD parse_fields.
+
+ DEFINE _field.
+ READ TABLE lt_fields ASSIGNING WITH KEY name = &1 ##NO_TEXT.
+ IF sy-subrc = 0.
+ rs_fields-&2 = -value.
+ ENDIF.
+ END-OF-DEFINITION.
+
+ DATA: lt_fields TYPE tihttpnvp,
+ lv_string TYPE string.
+
+ FIELD-SYMBOLS: LIKE LINE OF lt_fields.
+
+
+ lv_string = iv_getdata. " type conversion
+ lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ).
+
+ _field 'key' key.
+ _field 'method' method.
+ _field 'username' username.
+ _field 'password' password.
+
+ ASSERT NOT rs_fields IS INITIAL.
+
+ ENDMETHOD.
+
+ METHOD lif_gui_page~on_event.
+
+ CASE iv_action.
+ WHEN 'save'.
+ save( iv_getdata ).
+ ev_state = gc_event_state-re_render.
+ ENDCASE.
+
+ ENDMETHOD.
+
+ METHOD save.
+
+ DATA: ls_fields TYPE lcl_persistence_background=>ty_background,
+ lo_persistence TYPE REF TO lcl_persistence_background.
+
+
+ ls_fields = parse_fields( iv_getdata ).
+
+ CREATE OBJECT lo_persistence.
+
+ IF ls_fields-method = lcl_persistence_background=>c_method-nothing.
+ lo_persistence->delete( ls_fields-key ).
+ ELSE.
+ lo_persistence->modify( ls_fields ).
+ ENDIF.
+
+ COMMIT WORK.
+
+ ENDMETHOD.
+
+ METHOD render_data.
+
+ DATA: lo_repo TYPE REF TO lcl_repo,
+ lo_online TYPE REF TO lcl_repo_online,
+ lo_per TYPE REF TO lcl_persistence_background,
+ lt_per TYPE lcl_persistence_background=>tt_background,
+ ls_per LIKE LINE OF lt_per,
+ lv_nothing TYPE string,
+ lv_push TYPE string,
+ lv_pull TYPE string,
+ lt_list TYPE lcl_repo_srv=>ty_repo_tt.
+
+
+ CREATE OBJECT ro_html.
+
+ ro_html->add( '' ).
+ ro_html->add( 'Listing online repositories' ) ##NO_TEXT.
+ ro_html->add( '
' ).
+
+ CREATE OBJECT lo_per.
+ lt_per = lo_per->list( ).
+ lt_list = lcl_app=>repo_srv( )->list( ).
+
+ LOOP AT lt_list INTO lo_repo.
+ IF lo_repo->is_offline( ) = abap_false.
+ lo_online ?= lo_repo.
+
+ READ TABLE lt_per INTO ls_per WITH KEY key = lo_online->get_key( ).
+ IF sy-subrc <> 0.
+ CLEAR ls_per.
+ ENDIF.
+
+ CLEAR lv_push.
+ CLEAR lv_pull.
+ CLEAR lv_nothing.
+ CASE ls_per-method.
+ WHEN lcl_persistence_background=>c_method-push.
+ lv_push = ' checked' ##NO_TEXT.
+ WHEN lcl_persistence_background=>c_method-pull.
+ lv_pull = ' checked' ##NO_TEXT.
+ WHEN OTHERS.
+ lv_nothing = ' checked' ##NO_TEXT.
+ ENDCASE.
+
+ ro_html->add( '
' && lo_online->get_name( ) && '
' ).
+ ro_html->add( '
' ).
+ ro_html->add( '
' ).
+ ENDIF.
+ ENDLOOP.
+
+ ro_html->add( '
' ).
+
+ ENDMETHOD.
+
+ METHOD lif_gui_page~render.
+
+ DATA lo_toolbar TYPE REF TO lcl_html_toolbar.
+
+ CREATE OBJECT lo_toolbar.
+ CREATE OBJECT ro_html.
+
+ lo_toolbar->add( iv_txt = 'Run background logic'
+ iv_act = 'background_run' ) ##NO_TEXT.
+
+ ro_html->add( header( ) ).
+ ro_html->add( title( iv_title = 'BACKGROUND' io_menu = lo_toolbar ) ).
+ ro_html->add( render_data( ) ).
+ ro_html->add( footer( ) ).
+
+ ENDMETHOD.
+
+ENDCLASS.
\ No newline at end of file
diff --git a/src/zabapgit_page_background.prog.xml b/src/zabapgit_page_background.prog.xml
new file mode 100644
index 000000000..8edbac35e
--- /dev/null
+++ b/src/zabapgit_page_background.prog.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+ ZABAPGIT_PAGE_BACKGROUND
+ A
+
+
+ X
+
+
+
+
+
+ I
+
+
+
+ 0000-00-00
+
+ 0000-00-00
+
+
+
+
+ E
+
+
+ 0000-00-00
+
+ 0000-00-00
+
+
+ X
+
+
+ -
+ R
+
+ Include ZABAPGIT_PAGE_BACKGROUND
+ 32
+
+
+
+
+
+
diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap
new file mode 100644
index 000000000..7f665bfe3
--- /dev/null
+++ b/src/zabapgit_page_main.prog.abap
@@ -0,0 +1,661 @@
+*&---------------------------------------------------------------------*
+*& Include ZABAPGIT_PAGE_MAIN
+*&---------------------------------------------------------------------*
+
+CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
+
+ PUBLIC SECTION.
+ METHODS:
+ constructor
+ RAISING lcx_exception,
+ lif_gui_page~render REDEFINITION,
+ lif_gui_page~on_event REDEFINITION,
+ lif_gui_page~get_assets REDEFINITION.
+
+ PRIVATE SECTION.
+
+ 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,
+ 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.
+
+
+ METHODS:
+ check_show
+ 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,
+ render_toc
+ IMPORTING it_list TYPE lcl_repo_srv=>ty_repo_tt
+ RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
+ 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
+ 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,
+ needs_installation
+ RETURNING VALUE(rv_not_completely_installed) TYPE abap_bool.
+
+ENDCLASS.
+
+CLASS lcl_gui_page_main IMPLEMENTATION.
+
+ METHOD constructor.
+
+ super->constructor( ).
+
+ mv_show = lcl_app=>user( )->get_repo_show( ).
+
+ check_show( ).
+
+ ENDMETHOD.
+
+ METHOD check_show.
+
+ DATA: lt_repos TYPE lcl_repo_srv=>ty_repo_tt,
+ lo_repo LIKE LINE OF lt_repos.
+
+
+ TRY.
+ lt_repos = lcl_app=>repo_srv( )->list( ).
+ CATCH lcx_exception.
+ RETURN.
+ ENDTRY.
+
+ IF mv_show IS INITIAL.
+ READ TABLE lt_repos INTO lo_repo INDEX 1.
+ ASSERT sy-subrc = 0.
+ mv_show = lo_repo->get_key( ).
+ ELSE.
+ TRY.
+* verify the key exists
+ lo_repo = lcl_app=>repo_srv( )->get( mv_show ).
+ CATCH lcx_exception.
+ READ TABLE lt_repos INTO lo_repo INDEX 1.
+ ASSERT sy-subrc = 0.
+ mv_show = lo_repo->get_key( ).
+ ENDTRY.
+ ENDIF.
+
+ ENDMETHOD.
+
+ 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 = |jump?{ lv_encode }| ).
+ rv_html = lo_html->mv_html.
+
+ ENDMETHOD.
+
+ METHOD build_main_menu.
+
+ DATA lo_betasub TYPE REF TO lcl_html_toolbar.
+
+
+ CREATE OBJECT ro_menu.
+ CREATE OBJECT lo_betasub.
+
+ lo_betasub->add( iv_txt = 'Database util' iv_act = 'db' ) ##NO_TEXT.
+ lo_betasub->add( iv_txt = 'Package to zip' iv_act = 'packagezip' ) ##NO_TEXT.
+ lo_betasub->add( iv_txt = 'Transport to zip' iv_act = 'transportzip' ) ##NO_TEXT.
+ lo_betasub->add( iv_txt = 'Background mode' iv_act = 'background' ) ##NO_TEXT.
+
+ ro_menu->add( iv_txt = 'Clone' iv_act = 'install' ) ##NO_TEXT.
+ ro_menu->add( iv_txt = 'Explore' iv_act = 'explore' ) ##NO_TEXT.
+ ro_menu->add( iv_txt = 'New offline repo' iv_act = 'newoffline' ) ##NO_TEXT.
+ IF needs_installation( ) = abap_true.
+ ro_menu->add( iv_txt = 'Get abapGit' iv_act = 'abapgit_installation' ) ##NO_TEXT.
+ ENDIF.
+ ro_menu->add( iv_txt = 'β' io_sub = lo_betasub ).
+
+ ENDMETHOD. "build main_menu
+
+ METHOD styles.
+
+ CREATE OBJECT ro_html.
+
+ _add '/* REPOSITORY TABLE*/'.
+ _add '.repo_tab {'.
+ _add ' border: 1px solid #DDD;'.
+ _add ' border-radius: 3px;'.
+ _add ' background: #fff;'.
+ _add ' margin-top: 0.5em;'.
+ _add '}'.
+ _add '.repo_tab td {'.
+ _add ' border-top: 1px solid #eee;'.
+ _add ' vertical-align: middle;'.
+ _add ' color: #333;'.
+ _add ' padding-top: 2px;'.
+ _add ' padding-bottom: 2px;'.
+ _add '}'.
+ _add '.repo_tab td.icon {'.
+ _add ' width: 32px;'.
+ _add ' text-align: center;'.
+ _add '}'.
+ _add '.repo_tab td.type {'.
+ _add ' width: 3em;'.
+ _add '}'.
+ _add '.repo_tab td.object {'.
+ _add ' padding-left: 0.5em;'.
+ _add '}'.
+ _add '.repo_tab td.files {'.
+ _add ' padding-left: 0.5em;'.
+ _add '}'.
+ _add '.repo_tab td.cmd {'.
+ _add ' text-align: right;'.
+ _add ' padding-left: 0.5em;'.
+ _add ' padding-right: 1em;'.
+ _add '}'.
+ _add '.repo_tab tr.unsupported { color: lightgrey; }'.
+ _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; }'.
+
+ ENDMETHOD.
+
+ METHOD render_repo_menu.
+
+ DATA: lo_toolbar TYPE REF TO lcl_html_toolbar,
+ lv_key TYPE lcl_persistence_db=>ty_value,
+ lo_sub TYPE REF TO lcl_html_toolbar,
+ lo_repo_online TYPE REF TO lcl_repo_online.
+
+
+ CREATE OBJECT ro_html.
+ CREATE OBJECT lo_toolbar.
+
+ lv_key = io_repo->get_key( ).
+
+ IF io_repo->is_offline( ) = abap_true.
+ lo_toolbar->add( iv_txt = 'Import ZIP'
+ iv_act = |zipimport?{ lv_key }|
+ iv_opt = gc_html_opt-emphas ).
+ lo_toolbar->add( iv_txt = 'Export ZIP'
+ iv_act = |zipexport?{ lv_key }|
+ iv_opt = gc_html_opt-emphas ).
+ lo_toolbar->add( iv_txt = 'Export&Commit'
+ iv_act = |files_commit?{ lv_key }|
+ iv_opt = gc_html_opt-emphas ).
+ ELSE.
+ lo_repo_online ?= io_repo.
+ TRY.
+ IF lo_repo_online->get_sha1_remote( ) <> lo_repo_online->get_sha1_local( ).
+ lo_toolbar->add( iv_txt = 'Pull'
+ iv_act = |pull?{ lv_key }|
+ iv_opt = gc_html_opt-emphas ).
+ ELSEIF lcl_stage_logic=>count( lo_repo_online ) > 0.
+ lo_toolbar->add( iv_txt = 'Stage'
+ iv_act = |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.
+ ENDIF.
+
+ CREATE OBJECT lo_sub.
+ lo_sub->add( iv_txt = 'Remove'
+ iv_act = |remove?{ lv_key }| ).
+ lo_sub->add( iv_txt = 'Uninstall'
+ iv_act = |uninstall?{ lv_key }| ).
+ lo_sub->add( iv_txt = 'Switch branch'
+ iv_act = |switch_branch?{ lv_key }| ).
+ lo_sub->add( iv_txt = 'Reset'
+ iv_act = |reset?{ lv_key }| ).
+ lo_sub->add( iv_txt = 'Create branch'
+ iv_act = |create_branch?{ lv_key }| ).
+ lo_sub->add( iv_txt = 'Branch overview'
+ iv_act = |branch_overview?{ lv_key }| ).
+
+ lo_toolbar->add( iv_txt = 'Advanced'
+ io_sub = lo_sub ) ##NO_TEXT.
+
+ lo_toolbar->add( iv_txt = 'Refresh'
+ iv_act = |refresh?{ lv_key }| ).
+
+ ro_html->add( '' ).
+ ro_html->add( lo_toolbar->render( ) ).
+ ro_html->add( '
' ).
+
+ ENDMETHOD.
+
+ METHOD render_repo.
+
+ DATA: lt_repo_items TYPE tt_repo_items,
+ lx_error TYPE REF TO lcx_exception,
+ lo_log TYPE REF TO lcl_log.
+
+ FIELD-SYMBOLS LIKE LINE OF lt_repo_items.
+
+
+ CREATE OBJECT ro_html.
+
+ ro_html->add( || ).
+ ro_html->add( render_repo_top( io_repo ) ).
+
+ 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.
+ ro_html->add( '
' ).
+* shows eg. list of unsupported objects
+ ro_html->add( lo_log->to_html( ) ).
+ ro_html->add( '
' ).
+ ENDIF.
+
+ ro_html->add( '
' ).
+ IF lines( lt_repo_items ) = 0.
+ ro_html->add( ''
+ && 'Empty package'
+ && ' |
' ) ##NO_TEXT.
+ ELSE.
+ LOOP AT lt_repo_items ASSIGNING .
+ ro_html->add( render_repo_item( io_repo = io_repo is_item = ) ).
+ ENDLOOP.
+ ENDIF.
+ ro_html->add( '
' ).
+
+ CATCH lcx_exception INTO lx_error.
+ ro_html->add( render_repo_menu( io_repo ) ).
+ ro_html->add( render_error( lx_error ) ).
+ ENDTRY.
+
+ ro_html->add( '
' ).
+
+ ENDMETHOD.
+
+ METHOD extract_repo_content.
+
+ DATA: lo_repo_online TYPE REF TO lcl_repo_online,
+ lt_tadir TYPE ty_tadir_tt,
+ ls_repo_item TYPE ty_repo_item,
+ ls_file TYPE ty_repo_file,
+ lt_results TYPE ty_results_tt.
+
+ FIELD-SYMBOLS: LIKE LINE OF lt_results,
+ 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 .
+ CLEAR ls_repo_item.
+ IF sy-tabix = 1.
+ ls_repo_item-is_first = abap_true.
+ ENDIF.
+ ls_repo_item-obj_type = -object.
+ ls_repo_item-obj_name = -obj_name.
+ APPEND ls_repo_item TO et_repo_items.
+ 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
+ CLEAR ls_repo_item.
+ IF sy-tabix = 1.
+ ls_repo_item-is_first = abap_true.
+ ENDIF.
+ ls_repo_item-obj_type = -obj_type.
+ ls_repo_item-obj_name = -obj_name.
+ ENDAT.
+
+ IF -filename IS NOT INITIAL.
+ ls_file-path = -path.
+ ls_file-filename = -filename.
+ ls_file-is_changed = boolc( NOT -match = abap_true ).
+ APPEND ls_file TO ls_repo_item-files.
+ ENDIF.
+
+ AT END OF obj_name. "obj_type + obj_name
+ APPEND ls_repo_item TO et_repo_items.
+ ENDAT.
+ ENDLOOP.
+ ENDIF.
+
+ ENDMETHOD.
+
+ 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 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( ' | ' ).
+ 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( '' ).
+ LOOP AT is_item-files INTO ls_file.
+ ro_html->add( |{ ls_file-path && ls_file-filename }| ).
+ ENDLOOP.
+ ro_html->add( ' | ' ).
+
+ ro_html->add( '' ).
+ IF lines( is_item-files ) = 0.
+ ro_html->add( 'new' ).
+ ELSE.
+ LOOP AT is_item-files INTO ls_file.
+ IF 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 = |diff?{ lv_difflink }| ).
+ ELSE.
+ ro_html->add( | | ).
+ ENDIF.
+ ENDLOOP.
+ ENDIF.
+ ro_html->add( ' | ' ).
+
+ ENDIF.
+
+ ro_html->add( '
' ).
+
+ ENDMETHOD.
+
+ METHOD needs_installation.
+
+ CONSTANTS:
+ lc_abapgit TYPE string VALUE 'https://github.com/larshp/abapGit.git',
+ lc_plugins TYPE string VALUE 'https://github.com/larshp/abapGit-plugins.git' ##NO_TEXT.
+
+ TRY.
+ IF lcl_app=>repo_srv( )->is_repo_installed( lc_abapgit ) = abap_false
+ OR lcl_app=>repo_srv( )->is_repo_installed( lc_plugins ) = abap_false.
+ rv_not_completely_installed = abap_true.
+ ENDIF.
+ CATCH lcx_exception.
+ " cannot be installed anyway in this case, e.g. no connection
+ rv_not_completely_installed = abap_false.
+ ENDTRY.
+ ENDMETHOD. "needs_installation
+
+ METHOD render_toc.
+
+ DATA: lo_repo LIKE LINE OF it_list,
+ lo_toolbar TYPE REF TO lcl_html_toolbar.
+
+
+ CREATE OBJECT ro_html.
+ CREATE OBJECT lo_toolbar.
+
+ IF lines( it_list ) = 0.
+ RETURN.
+ ENDIF.
+
+ LOOP AT it_list INTO lo_repo.
+ IF mv_show = lo_repo->get_key( ).
+ lo_toolbar->add( iv_txt = lo_repo->get_name( )
+ iv_act = |show?{ lo_repo->get_key( ) }|
+ iv_opt = gc_html_opt-emphas ).
+ ELSE.
+ lo_toolbar->add( iv_txt = lo_repo->get_name( )
+ iv_act = |show?{ lo_repo->get_key( ) }| ).
+ ENDIF.
+ ENDLOOP.
+
+ ro_html->add( '' ) ##NO_TEXT.
+ ro_html->add( '

' ).
+ ro_html->add( lo_toolbar->render( ) ).
+ ro_html->add( '
' ).
+
+ ENDMETHOD.
+
+ METHOD render_error.
+
+ CREATE OBJECT ro_html.
+
+ ro_html->add( '' ).
+ ro_html->add( |Error: { ix_error->mv_text }| ).
+ ro_html->add( '
' ).
+
+ ENDMETHOD.
+
+ METHOD render_explore.
+
+ DATA lo_toolbar TYPE REF TO lcl_html_toolbar.
+
+ CREATE OBJECT ro_html.
+ CREATE OBJECT lo_toolbar.
+
+ lo_toolbar->add( iv_txt = 'Explore new projects'
+ iv_act = 'explore' ) ##NO_TEXT.
+
+ ro_html->add( '' ).
+ ro_html->add( lo_toolbar->render( ) ).
+ ro_html->add( '
' ).
+
+ ENDMETHOD.
+
+ METHOD lif_gui_page~on_event.
+
+ CASE iv_action.
+ WHEN 'show'.
+ mv_show = iv_getdata.
+ lcl_app=>user( )->set_repo_show( mv_show ).
+ ev_state = gc_event_state-re_render.
+ ENDCASE.
+
+ ENDMETHOD.
+
+ 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.
+
+
+ CREATE OBJECT ro_html.
+
+ ro_html->add( header( io_include_style = styles( ) ) ).
+ ro_html->add( title( iv_title = 'HOME'
+ io_menu = build_main_menu( ) ) ).
+
+ TRY.
+ lt_repos = lcl_app=>repo_srv( )->list( ).
+ CATCH lcx_exception INTO lx_error.
+ ro_html->add( render_error( lx_error ) ).
+ ENDTRY.
+
+ ro_html->add( render_toc( lt_repos ) ).
+
+ IF lines( lt_repos ) = 0 AND lx_error IS INITIAL.
+ ro_html->add( render_explore( ) ).
+ ELSE.
+ check_show( ).
+ lo_repo = lcl_app=>repo_srv( )->get( mv_show ).
+ ro_html->add( render_repo( lo_repo ) ).
+ ENDIF.
+
+ ro_html->add( footer( ) ).
+
+ ENDMETHOD.
+
+ METHOD lif_gui_page~get_assets.
+
+ DATA ls_image TYPE ty_web_asset.
+
+ rt_assets = super->lif_gui_page~get_assets( ).
+
+ ls_image-url = 'img/toc' ##NO_TEXT.
+ ls_image-content =
+ 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAFVBMVEUAAACAgICAgICA'
+ && 'gICAgICAgICAgIAO39T0AAAABnRSTlMABBCRlMXJzV0oAAAAN0lEQVQIW2NgwABuaWlB'
+ && 'YWlpDgwJDAxiAgxACshgYwAz0tLY2NISSBWBMYAmg4ADyBZhARCJAQBBchGypGCbQgAA'
+ && 'AABJRU5ErkJggg=='.
+ APPEND ls_image TO rt_assets.
+
+ ls_image-url = 'img/repo_online' ##NO_TEXT.
+ ls_image-content =
+ 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAApVBMVEUAAABQbJxQbJxQ'
+ && 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ'
+ && 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ'
+ && 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ'
+ && 'bJz+TJ01AAAANnRSTlMAAQIDBAcJCgwSFBocHygqMTM1NkRHSU1QUWFiZGlweHuDiImL'
+ && 'lZiio6a5vsfT3uTo6e3x9fsxY2JuAAAAgUlEQVQYGXXB6RaBUBSA0e+IEuIiMs9zhlDn'
+ && '/R/NZWmt/LA3f1RcoaB50SydCbn20wjedkPu3sKSpMGH21PhLdZ0BATZ+cCXtxtDHGLV'
+ && 'pgFW9QqJj2U0wvJvMF+5jiNGI3HK9dMQSouH6sRoFGoWd8l1dEDRWlWPQsFS98KPvvDH'
+ && 'C3HLClrWc70ZAAAAAElFTkSuQmCC'.
+ APPEND ls_image TO rt_assets.
+
+ ls_image-url = 'img/repo_offline' ##NO_TEXT.
+ ls_image-content =
+ 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBB'
+ && 'ZG9iZSBJbWFnZVJlYWR5ccllPAAAAWNJREFUeNrEkr1KxFAQhe9P/iS6goLWiiB2PoCN'
+ && 'lYW9ChbbiFhYRAQ7MaS2SOdT2PkSvoGPINiF1YTNz/WceC+sohDYwoFvZ/Zm78mcmZXG'
+ && 'GDFPKDFn/L+AdEWWZUIptRmG4bLWeglHNXjHjGoppUa9CiaoX3ieJEl/z3MCXdfdIKXT'
+ && '6bRFju2xYeASJ618338Dl6gf8zw3FOktpGk6QrrFmyPP82J0IgmCHxq1F0URBdbxuzuw'
+ && '9nMGR2CRltCBbJpG1HUtmNGZcN/tynfAgbPgBMbWxp/DcmIIDaFdWOjtK7S/hbxnDQu0'
+ && 'LGBFBEHQg7YNbAnCZ5xJWZbnRVFsuw7GM4P8hhXkPLgh0batqKqKFmM8O3FbeAanIOAM'
+ && 'cJFQWNoBLpAv/e6D4PKEK3UCh+DiN9/sgG8lbhSWCNyDJ2U3MDSOwQa7cfc828rKQIF9'
+ && '+x9QsxauwAMYDRA4s/kVXLP4FGAAajajeu7yxJkAAAAASUVORK5CYII='.
+ APPEND ls_image TO rt_assets.
+
+ ls_image-url = 'img/pkg' ##NO_TEXT.
+ ls_image-content =
+ 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA30lEQVQoU43OIUuDcRSF'
+ && '8fvqhuB0mFwaKLbVBVdkX0GTFss+wYL2H4rJIIgyQQSzZcUPoGHZ9CKCmAwTMS8Y/ga3'
+ && 'BWVjT7hwOQ+HEzEbMhU7jrTd69q2KhtFRU2nrvS927dm3pyqPXcuNRVD7sxiRIQlDSc+'
+ && 'PGjZUFDWkYekLfdoV2XYua4rSZ61pZBkEUq2XPty41XuXJIiZGNhPDVZiFCYIMSor+Db'
+ && '7RQhYnQnCsNvNmGgPFFYMQh1PU9aqrLxyGUNx/p66r9mUc2hFx3JhU9vDtQU4y9KGjaV'
+ && '/gXT+AGZVIinhU2EAwAAAABJRU5ErkJggg=='.
+ APPEND ls_image TO rt_assets.
+
+ ls_image-url = 'img/branch' ##NO_TEXT.
+ ls_image-content =
+ 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAqFBMVEUAAACAgICAgICA'
+ && 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
+ && 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
+ && 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
+ && 'gICAgID/OyosAAAAN3RSTlMAAQIDBAYICQ8TFRweJScoKSo3Oj1FRk1dYWJjZmhzdIaJ'
+ && 'j5GVm6CwsrS5vsHDyszV19ne7/X583teZAAAAIFJREFUGFdVytkagVAYheFvFzJlnqc0'
+ && 'EEoR+u//zhxI7dbZ9z4LMJ1op9DmjpntdXiBigHbLiAYqukBVr63+YGRSazgCY/iEooP'
+ && 'xKZxr0EnSbo14B1Rg4msKzj150fJrQpERPLBv7mIfNxlq+zRbZsu0JYpGlcdwjY9Twfr'
+ && 'nAbNsr6IKQxJI/U5CgAAAABJRU5ErkJggg=='.
+ APPEND ls_image TO rt_assets.
+
+ ls_image-url = 'img/link' ##NO_TEXT.
+ ls_image-content =
+ 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAXVBMVEUAAACAgICAgICA'
+ && 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
+ && 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVwFMKAAAAHnRSTlMAAwQFBgcK'
+ && 'FR4gIiMmP0JHSm+RmKDByM/R09rg+/0jN/q+AAAAX0lEQVQYV43Nxw6AIBAE0FGw916Z'
+ && '//9MRQ0S4sG5bPZlCxqSCyBGXgFUJKUA4A8PUOKONzuQOxOZIjcLkrMvxGQg3skSCFYL'
+ && 'Kl1Ds5LWz+33yyf4rQOSf6CjnV6rHeAA87gJtKzI8ocAAAAASUVORK5CYII='.
+ APPEND ls_image TO rt_assets.
+
+ ls_image-url = 'img/code' ##NO_TEXT.
+ ls_image-content =
+ 'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAElBMVEUAAACAgICAgICA'
+ && 'gICAgICAgIC07w1vAAAABXRSTlMABECUxcOwZQcAAAA1SURBVAhbY2AODQ0NEWBgYGVg'
+ && 'YGByhNAMKgIMrKyhAQxMDhA+QwCCZgVqIIUP1Q+yJzTUAAAfUAq+Os55uAAAAABJRU5E'
+ && 'rkJggg=='.
+ APPEND ls_image TO rt_assets.
+
+ ls_image-url = 'img/bin' ##NO_TEXT.
+ ls_image-content =
+ 'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAElBMVEUAAACAgICAgICA'
+ && 'gICAgICAgIC07w1vAAAABXRSTlMABECUxcOwZQcAAABBSURBVAhbXcqxDYAwAMRAK8h9'
+ && 'hmAARoANvuD3X4UCiojqZMlsbe8JAuN6ZZ9ozThRCVmsJe9H0HwdXf19W9v2eAA6Fws2'
+ && 'RotPsQAAAABJRU5ErkJggg=='.
+ APPEND ls_image TO rt_assets.
+
+ ls_image-url = 'img/obj' ##NO_TEXT.
+ ls_image-content =
+ 'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAIVBMVEUAAACAgICAgICA'
+ && 'gICAgICAgICAgICAgICAgICAgICAgIDcWqnoAAAACnRSTlMABD1AZI+RlcPFIaFe1gAA'
+ && 'AEVJREFUCFtjYF+1atVKAQYGLgYGBuaJEJrBUgBCM0+A0AwLgLQIgyOIZmwCSgNptgAG'
+ && '1gQQfzKDhgCSPFw9Kg2yZ9WqAgBWJBENLk6V3AAAAABJRU5ErkJggg=='.
+ APPEND ls_image TO rt_assets.
+
+ ENDMETHOD.
+
+ENDCLASS.
\ No newline at end of file
diff --git a/src/zabapgit_page_main.prog.xml b/src/zabapgit_page_main.prog.xml
new file mode 100644
index 000000000..3ac53fc8d
--- /dev/null
+++ b/src/zabapgit_page_main.prog.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+ ZABAPGIT_PAGE_MAIN
+ A
+
+
+ X
+
+
+
+
+
+ I
+
+
+
+ 0000-00-00
+
+ 0000-00-00
+
+
+
+
+ E
+
+
+ 0000-00-00
+
+ 0000-00-00
+
+
+ X
+
+
+ -
+ R
+
+ Include ZABAPGIT_PAGE_MAIN
+ 26
+
+
+
+
+
+
diff --git a/src/zabapgit_persistence.prog.abap b/src/zabapgit_persistence.prog.abap
index 6f96edd2e..a8d2cd706 100644
--- a/src/zabapgit_persistence.prog.abap
+++ b/src/zabapgit_persistence.prog.abap
@@ -684,17 +684,12 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app.
RETURNING VALUE(rv_email) TYPE string
RAISING lcx_exception.
- METHODS is_hidden
- IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
- RETURNING VALUE(rv_hidden) TYPE abap_bool
- RAISING lcx_exception.
-
- METHODS hide
+ METHODS set_repo_show
IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
RAISING lcx_exception.
- METHODS unhide
- IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key
+ METHODS get_repo_show
+ RETURNING VALUE(rv_key) TYPE lcl_persistence_repo=>ty_repo-key
RAISING lcx_exception.
PRIVATE SECTION.
@@ -708,9 +703,9 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app.
WITH DEFAULT KEY.
TYPES: BEGIN OF ty_user,
- username TYPE string,
- email TYPE string,
- repo_hidden TYPE ty_repo_hidden_tt,
+ username TYPE string,
+ email TYPE string,
+ repo_show TYPE lcl_persistence_repo=>ty_repo-key,
END OF ty_user.
METHODS constructor
@@ -982,6 +977,23 @@ CLASS lcl_persistence_user IMPLEMENTATION.
ENDMETHOD.
+ METHOD set_repo_show.
+
+ DATA: ls_user TYPE ty_user.
+
+
+ ls_user = read( ).
+ ls_user-repo_show = iv_key.
+ update( ls_user ).
+
+ ENDMETHOD.
+
+ METHOD get_repo_show.
+
+ rv_key = read( )-repo_show.
+
+ ENDMETHOD.
+
METHOD update.
DATA: lv_xml TYPE string.
@@ -1014,43 +1026,6 @@ CLASS lcl_persistence_user IMPLEMENTATION.
ENDMETHOD.
- METHOD is_hidden.
-
- DATA: lt_hidden TYPE ty_repo_hidden_tt.
-
-
- lt_hidden = read( )-repo_hidden.
- READ TABLE lt_hidden FROM iv_key TRANSPORTING NO FIELDS.
- IF sy-subrc = 0.
- rv_hidden = abap_true.
- ELSE.
- rv_hidden = abap_false.
- ENDIF.
-
- ENDMETHOD.
-
- METHOD hide.
-
- DATA: ls_user TYPE ty_user.
-
-
- ls_user = read( ).
- APPEND iv_key TO ls_user-repo_hidden.
- update( ls_user ).
-
- ENDMETHOD.
-
- METHOD unhide.
-
- DATA: ls_user TYPE ty_user.
-
-
- ls_user = read( ).
- DELETE TABLE ls_user-repo_hidden FROM iv_key.
- update( ls_user ).
-
- ENDMETHOD.
-
METHOD set_email.
DATA: ls_user TYPE ty_user.