gui changes, close #283

- use top breadcrumb/toc to switch between repositories

* move main and background to new includes

* done, close #283

- hide/show feature removed

- refresh all freature removed

- error log moved to before file list

* minor changes
This commit is contained in:
Lars Hvam 2016-07-08 09:33:57 +02:00 committed by GitHub
parent a2bd714ef2
commit 5e2991fc35
8 changed files with 1036 additions and 950 deletions

View File

@ -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.

View File

@ -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( '<div id="toc">' ).
LOOP AT mt_text INTO lv_text.
ro_html->add( '<pre>' && lv_text && '</pre><br>' ).
ENDLOOP.
ro_html->add( '</div>' ).
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 <ls_field> WITH KEY name = &1 ##NO_TEXT.
IF sy-subrc = 0.
rs_fields-&2 = <ls_field>-value.
ENDIF.
END-OF-DEFINITION.
DATA: lt_fields TYPE tihttpnvp,
lv_string TYPE string.
FIELD-SYMBOLS: <ls_field> 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( '<div id="toc">' ).
ro_html->add( 'Listing online repositories' ) ##NO_TEXT.
ro_html->add( '<br><br>' ).
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( '<h1>' && lo_online->get_name( ) && '</h1>' ).
ro_html->add( '<form method="get" action="sapevent:save">' ).
ro_html->add( '<input type="hidden" name="key" value="' &&
lo_repo->get_key( ) && '">' ).
ro_html->add( '<input type="radio" name="method" value="nothing"' &&
lv_nothing && '>Do nothing<br>' ) ##NO_TEXT.
ro_html->add( '<input type="radio" name="method" value="push"' &&
lv_push && '>Automatic push<br>' ) ##NO_TEXT.
ro_html->add( '<input type="radio" name="method" value="pull"' &&
lv_pull && '>Automatic pull<br>' ) ##NO_TEXT.
ro_html->add( '<br>' ).
ro_html->add( 'Authentication, optional<br>' ) ##NO_TEXT.
ro_html->add( '(password will be saved in clear text)<br>' ) ##NO_TEXT.
ro_html->add( '<table>' ).
ro_html->add( '<tr>' ).
ro_html->add( '<td>Username:</td>' ).
ro_html->add( '<td><input type="text" name="username" value="' &&
ls_per-username && '"></td>' ).
ro_html->add( '</tr>' ).
ro_html->add( '<tr>' ).
ro_html->add( '<td>Password:</td>' ).
ro_html->add( '<td><input type="text" name="password" value="' &&
ls_per-password && '"></td>' ).
ro_html->add( '</tr>' ).
ro_html->add( '<tr><td colspan="2" align="right">' ).
ro_html->add( '<input type="submit" value="Save">' ).
ro_html->add( '</td></tr>' ).
ro_html->add( '</table>' ).
ro_html->add( '</form>' ).
ro_html->add( '<br>' ).
ENDIF.
ENDLOOP.
ro_html->add( '</div>' ).
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 = '&#x03b2;' 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( '<div class="paddings right">' ).
ro_html->add( lo_toolbar->render( ) ).
ro_html->add( '</div>' ).
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&amp;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( '<div class="paddings right">' ).
ro_html->add( lo_toolbar->render( ) ).
ro_html->add( '</div>' ).
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 <ls_item> LIKE LINE OF lt_repo_items.
CREATE OBJECT ro_html.
ro_html->add( |<div class="repo" id="repo{ io_repo->get_key( ) }">| ).
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( '<table width="100%" class="repo_tab">' ).
IF lines( lt_repo_items ) = 0.
ro_html->add( '<tr class="unsupported firstrow"><td class="paddings">'
&& '<center>Empty package</center>'
&& '</td></tr>' ) ##NO_TEXT.
ELSE.
LOOP AT lt_repo_items ASSIGNING <ls_item>.
ro_html->add( render_repo_item( io_repo = io_repo is_item = <ls_item> ) ).
ENDLOOP.
ENDIF.
ro_html->add( '</table>' ).
IF io_repo->is_offline( ) = abap_false.
ro_html->add( '<div class="log">' ).
* shows eg. list of unsupported objects
ro_html->add( lo_log->to_html( ) ).
ro_html->add( '</div>' ).
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( '</div>' ).
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: <ls_result> LIKE LINE OF lt_results,
<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>.
CLEAR 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.
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 <ls_result>.
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 = <ls_result>-obj_type.
ls_repo_item-obj_name = <ls_result>-obj_name.
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 ).
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( |<tr{ lv_trclass }>| ).
IF is_item-obj_name IS INITIAL.
ro_html->add( '<td colspan="3"></td>' ).
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 ''.
" no icon
WHEN OTHERS.
lv_icon = |<img src="img/obj">|.
ENDCASE.
lv_link = render_obj_jump_link( iv_obj_name = is_item-obj_name
iv_obj_type = is_item-obj_type ).
ro_html->add( |<td class="icon">{ lv_icon }</td>| ).
ro_html->add( |<td class="type">{ is_item-obj_type }</td>| ).
ro_html->add( |<td class="object">{ lv_link }</td>| ).
ENDIF.
IF io_repo->is_offline( ) = abap_false. " Files for online repos only
ro_html->add( '<td class="files">' ).
LOOP AT is_item-files INTO ls_file.
ro_html->add( |<span>{ ls_file-path && ls_file-filename }</span>| ).
ENDLOOP.
ro_html->add( '</td>' ).
ro_html->add( '<td class="cmd">' ).
IF lines( is_item-files ) = 0.
ro_html->add( '<span class="grey">new</span>' ).
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( |<span>&nbsp;</span>| ).
ENDIF.
ENDLOOP.
ENDIF.
ro_html->add( '</td>' ).
ENDIF.
ro_html->add( '</tr>' ).
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( '<div id="toc">' ) ##NO_TEXT.
ro_html->add( '<img src="img/toc">' ).
ro_html->add( lo_toolbar->render( ) ).
ro_html->add( '</div>' ).
ENDMETHOD.
METHOD render_error.
CREATE OBJECT ro_html.
ro_html->add( '<div class="dummydiv attention">' ).
ro_html->add( |Error: { ix_error->mv_text }| ).
ro_html->add( '</div>' ).
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( '<div class="dummydiv">' ).
ro_html->add( lo_toolbar->render( ) ).
ro_html->add( '</div>' ).
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

View File

@ -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.

View File

@ -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( '<div id="toc">' ).
LOOP AT mt_text INTO lv_text.
ro_html->add( '<pre>' && lv_text && '</pre><br>' ).
ENDLOOP.
ro_html->add( '</div>' ).
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 <ls_field> WITH KEY name = &1 ##NO_TEXT.
IF sy-subrc = 0.
rs_fields-&2 = <ls_field>-value.
ENDIF.
END-OF-DEFINITION.
DATA: lt_fields TYPE tihttpnvp,
lv_string TYPE string.
FIELD-SYMBOLS: <ls_field> 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( '<div id="toc">' ).
ro_html->add( 'Listing online repositories' ) ##NO_TEXT.
ro_html->add( '<br><br>' ).
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( '<h1>' && lo_online->get_name( ) && '</h1>' ).
ro_html->add( '<form method="get" action="sapevent:save">' ).
ro_html->add( '<input type="hidden" name="key" value="' &&
lo_repo->get_key( ) && '">' ).
ro_html->add( '<input type="radio" name="method" value="nothing"' &&
lv_nothing && '>Do nothing<br>' ) ##NO_TEXT.
ro_html->add( '<input type="radio" name="method" value="push"' &&
lv_push && '>Automatic push<br>' ) ##NO_TEXT.
ro_html->add( '<input type="radio" name="method" value="pull"' &&
lv_pull && '>Automatic pull<br>' ) ##NO_TEXT.
ro_html->add( '<br>' ).
ro_html->add( 'Authentication, optional<br>' ) ##NO_TEXT.
ro_html->add( '(password will be saved in clear text)<br>' ) ##NO_TEXT.
ro_html->add( '<table>' ).
ro_html->add( '<tr>' ).
ro_html->add( '<td>Username:</td>' ).
ro_html->add( '<td><input type="text" name="username" value="' &&
ls_per-username && '"></td>' ).
ro_html->add( '</tr>' ).
ro_html->add( '<tr>' ).
ro_html->add( '<td>Password:</td>' ).
ro_html->add( '<td><input type="text" name="password" value="' &&
ls_per-password && '"></td>' ).
ro_html->add( '</tr>' ).
ro_html->add( '<tr><td colspan="2" align="right">' ).
ro_html->add( '<input type="submit" value="Save">' ).
ro_html->add( '</td></tr>' ).
ro_html->add( '</table>' ).
ro_html->add( '</form>' ).
ro_html->add( '<br>' ).
ENDIF.
ENDLOOP.
ro_html->add( '</div>' ).
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.

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_PAGE_BACKGROUND</NAME>
<STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_PAGE_BACKGROUND</ENTRY>
<LENGTH>32</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -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 = '&#x03b2;' 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&amp;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( '<div class="paddings right">' ).
ro_html->add( lo_toolbar->render( ) ).
ro_html->add( '</div>' ).
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 <ls_item> LIKE LINE OF lt_repo_items.
CREATE OBJECT ro_html.
ro_html->add( |<div class="repo" id="repo{ io_repo->get_key( ) }">| ).
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( '<div class="log">' ).
* shows eg. list of unsupported objects
ro_html->add( lo_log->to_html( ) ).
ro_html->add( '</div>' ).
ENDIF.
ro_html->add( '<table width="100%" class="repo_tab">' ).
IF lines( lt_repo_items ) = 0.
ro_html->add( '<tr class="unsupported firstrow"><td class="paddings">'
&& '<center>Empty package</center>'
&& '</td></tr>' ) ##NO_TEXT.
ELSE.
LOOP AT lt_repo_items ASSIGNING <ls_item>.
ro_html->add( render_repo_item( io_repo = io_repo is_item = <ls_item> ) ).
ENDLOOP.
ENDIF.
ro_html->add( '</table>' ).
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( '</div>' ).
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: <ls_result> LIKE LINE OF lt_results,
<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>.
CLEAR 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.
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 <ls_result>.
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 = <ls_result>-obj_type.
ls_repo_item-obj_name = <ls_result>-obj_name.
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 ).
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( |<tr{ lv_trclass }>| ).
IF is_item-obj_name IS INITIAL.
ro_html->add( '<td colspan="3"></td>' ).
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
iv_obj_type = is_item-obj_type ).
ro_html->add( |<td class="icon">{ lv_icon }</td>| ).
ro_html->add( |<td class="type">{ is_item-obj_type }</td>| ).
ro_html->add( |<td class="object">{ lv_link }</td>| ).
ENDIF.
IF io_repo->is_offline( ) = abap_false. " Files for online repos only
ro_html->add( '<td class="files">' ).
LOOP AT is_item-files INTO ls_file.
ro_html->add( |<span>{ ls_file-path && ls_file-filename }</span>| ).
ENDLOOP.
ro_html->add( '</td>' ).
ro_html->add( '<td class="cmd">' ).
IF lines( is_item-files ) = 0.
ro_html->add( '<span class="grey">new</span>' ).
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( |<span>&nbsp;</span>| ).
ENDIF.
ENDLOOP.
ENDIF.
ro_html->add( '</td>' ).
ENDIF.
ro_html->add( '</tr>' ).
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( '<div id="toc">' ) ##NO_TEXT.
ro_html->add( '<img src="img/toc">' ).
ro_html->add( lo_toolbar->render( ) ).
ro_html->add( '</div>' ).
ENDMETHOD.
METHOD render_error.
CREATE OBJECT ro_html.
ro_html->add( '<div class="dummydiv attention">' ).
ro_html->add( |Error: { ix_error->mv_text }| ).
ro_html->add( '</div>' ).
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( '<div class="dummydiv">' ).
ro_html->add( lo_toolbar->render( ) ).
ro_html->add( '</div>' ).
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.

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_PAGE_MAIN</NAME>
<STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_PAGE_MAIN</ENTRY>
<LENGTH>26</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -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.