*&---------------------------------------------------------------------* *& 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. CONSTANTS: BEGIN OF c_actions, show TYPE string VALUE 'show' ##NO_TEXT, toggle_hide_files TYPE string VALUE 'toggle_hide_files' ##NO_TEXT, END OF c_actions. CONSTANTS: c_default_sortkey TYPE i VALUE 9999. TYPES: BEGIN OF ty_repo_item, obj_type TYPE tadir-object, obj_name TYPE tadir-obj_name, is_first TYPE abap_bool, files TYPE tt_repo_files, sortkey TYPE i, changes TYPE i, END OF ty_repo_item. TYPES tt_repo_items TYPE STANDARD TABLE OF ty_repo_item WITH DEFAULT KEY. DATA: mv_show TYPE lcl_persistence_db=>ty_value, mv_hide_files TYPE abap_bool. METHODS: retrieve_active_repo RAISING lcx_exception, styles RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper, render_error IMPORTING ix_error TYPE REF TO lcx_exception RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper, 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, render_toc_line IMPORTING io_toolbar TYPE REF TO lcl_html_toolbar iv_image_url TYPE string 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. ENDCLASS. CLASS lcl_gui_page_main IMPLEMENTATION. METHOD constructor. super->constructor( ). ENDMETHOD. " constructor METHOD lif_gui_page~on_event. DATA: lv_key TYPE lcl_persistence_repo=>ty_repo-key, lv_url TYPE string. lv_key = iv_getdata. CASE iv_action. WHEN c_actions-show. " Change displayed repo lcl_app=>user( )->set_repo_show( lv_key ). TRY. lcl_app=>repo_srv( )->get( lv_key )->refresh( ). CATCH lcx_exception. ENDTRY. ev_state = gc_event_state-re_render. WHEN c_actions-toggle_hide_files. " Toggle file diplay lcl_app=>user( )->toggle_hide_files( ). ev_state = gc_event_state-re_render. ENDCASE. ENDMETHOD. "on_event ********************************************************************** * RENDERING ********************************************************************** 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. retrieve_active_repo( ). " Get and validate key of user default repo mv_hide_files = lcl_app=>user( )->get_hide_files( ). 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. lo_repo = lcl_app=>repo_srv( )->get( mv_show ). ro_html->add( render_repo( lo_repo ) ). ENDIF. ro_html->add( footer( ) ). ENDMETHOD. "render METHOD retrieve_active_repo. 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. mv_show = lcl_app=>user( )->get_repo_show( ). " Get default repo from user cfg IF mv_show IS NOT INITIAL. TRY. " verify the key exists lo_repo = lcl_app=>repo_srv( )->get( mv_show ). CATCH lcx_exception. CLEAR mv_show. ENDTRY. ENDIF. IF mv_show IS INITIAL. " Fall back to first available repo READ TABLE lt_repos INTO lo_repo INDEX 1. IF sy-subrc = 0. mv_show = lo_repo->get_key( ). lcl_app=>user( )->set_repo_show( mv_show ). ENDIF. ENDIF. ENDMETHOD. "retrieve_active_repo METHOD render_obj_jump_link. DATA: lv_encode TYPE string, lo_html TYPE REF TO lcl_html_helper. lv_encode = lcl_html_action_utils=>jump_encode( iv_obj_type = iv_obj_type iv_obj_name = iv_obj_name ). CREATE OBJECT lo_html. lo_html->add_anchor( iv_txt = |{ iv_obj_name }| iv_act = |{ gc_action-jump }?{ lv_encode }| ). rv_html = lo_html->mv_html. ENDMETHOD. "render_obj_jump_link METHOD build_main_menu. DATA lo_betasub TYPE REF TO lcl_html_toolbar. CREATE OBJECT ro_menu. CREATE OBJECT lo_betasub. lo_betasub->add( iv_txt = 'Database util' iv_act = gc_action-go_db ) ##NO_TEXT. lo_betasub->add( iv_txt = 'Package to zip' iv_act = gc_action-zip_package ) ##NO_TEXT. lo_betasub->add( iv_txt = 'Transport to zip' iv_act = gc_action-zip_transport ) ##NO_TEXT. lo_betasub->add( iv_txt = 'Page playground' iv_act = gc_action-go_playground ) ##NO_TEXT. lo_betasub->add( iv_txt = 'Debug info' iv_act = gc_action-go_debuginfo ) ##NO_TEXT. ro_menu->add( iv_txt = 'Clone' iv_act = gc_action-repo_clone ) ##NO_TEXT. ro_menu->add( iv_txt = 'Explore' iv_act = gc_action-go_explore ) ##NO_TEXT. ro_menu->add( iv_txt = 'New offline repo' iv_act = gc_action-repo_newoffline ) ##NO_TEXT. IF lcl_services_abapgit=>needs_installation( ) = abap_true. ro_menu->add( iv_txt = 'Get abapGit' iv_act = gc_action-abapgit_install ) ##NO_TEXT. ENDIF. ro_menu->add( iv_txt = 'Advanced' io_sub = lo_betasub ) ##NO_TEXT. ENDMETHOD. "build main_menu METHOD render_toc. DATA: lo_pback TYPE REF TO lcl_persistence_background, lt_repo_bkg TYPE lcl_persistence_background=>tt_background, lo_repo LIKE LINE OF it_list, lv_opt TYPE c LENGTH 1, lo_online TYPE REF TO lcl_html_toolbar, lo_background TYPE REF TO lcl_html_toolbar, lo_offline TYPE REF TO lcl_html_toolbar. CREATE OBJECT ro_html. CREATE OBJECT lo_online. CREATE OBJECT lo_offline. CREATE OBJECT lo_background. CREATE OBJECT lo_pback. lt_repo_bkg = lo_pback->list( ). IF lines( it_list ) = 0. RETURN. ENDIF. LOOP AT it_list INTO lo_repo. IF mv_show = lo_repo->get_key( ). lv_opt = gc_html_opt-emphas. ELSE. CLEAR lv_opt. ENDIF. IF lo_repo->is_offline( ) = abap_true. lo_offline->add( iv_txt = lo_repo->get_name( ) iv_act = |{ c_actions-show }?{ lo_repo->get_key( ) }| iv_opt = lv_opt ). ELSE. READ TABLE lt_repo_bkg WITH KEY key = lo_repo->get_key( ) TRANSPORTING NO FIELDS. IF sy-subrc = 0. lo_background->add( iv_txt = lo_repo->get_name( ) iv_act = |{ c_actions-show }?{ lo_repo->get_key( ) }| iv_opt = lv_opt ). ELSE. lo_online->add( iv_txt = lo_repo->get_name( ) iv_act = |{ c_actions-show }?{ lo_repo->get_key( ) }| iv_opt = lv_opt ). ENDIF. ENDIF. ENDLOOP. ro_html->add( '
' ) ##NO_TEXT. IF lo_online->count( ) > 0. ro_html->add( render_toc_line( io_toolbar = lo_online iv_image_url = 'img/repo_online' ) ). ENDIF. IF lo_offline->count( ) > 0. ro_html->add( render_toc_line( io_toolbar = lo_offline iv_image_url = 'img/repo_offline' ) ). ENDIF. IF lo_background->count( ) > 0. ro_html->add( render_toc_line( io_toolbar = lo_background iv_image_url = 'img/sync' ) ). ENDIF. ro_html->add( '
' ). ENDMETHOD. "render_toc METHOD render_toc_line. CREATE OBJECT ro_html. ro_html->add( '
' ). ro_html->add( '' ). ro_html->add( '' ). ro_html->add( '
' ). ro_html->add( || ). ro_html->add( '' ). ro_html->add( io_toolbar->render( iv_sort = abap_true ) ). ro_html->add( '
' ). ENDMETHOD. "render_toc_line METHOD render_error. CREATE OBJECT ro_html. ro_html->add( '
' ). ro_html->add( |Error: { ix_error->mv_text }| ). ro_html->add( '
' ). ENDMETHOD. "render_error METHOD render_explore. DATA lo_toolbar TYPE REF TO lcl_html_toolbar. CREATE OBJECT ro_html. CREATE OBJECT lo_toolbar. lo_toolbar->add( iv_txt = 'Explore new projects' iv_act = gc_action-go_explore ) ##NO_TEXT. ro_html->add( '
' ). ro_html->add( lo_toolbar->render( ) ). ro_html->add( '
' ). ENDMETHOD. "render_explore ********************************************************************** * SELECTED REPO RENDERING ********************************************************************** METHOD render_repo. DATA: lt_repo_items TYPE tt_repo_items, lo_tab_menu TYPE REF TO lcl_html_toolbar, lx_error TYPE REF TO lcx_exception, lo_log TYPE REF TO lcl_log. FIELD-SYMBOLS LIKE LINE OF lt_repo_items. CREATE OBJECT lo_tab_menu. CREATE OBJECT ro_html. ro_html->add( |
| ). ro_html->add( render_repo_top( io_repo = io_repo iv_interactive_branch = abap_true ) ). TRY. extract_repo_content( EXPORTING io_repo = io_repo IMPORTING et_repo_items = lt_repo_items eo_log = lo_log ). " extract_repo_content must be called before rendering the menu " so that lo_log is filled with errors from the serialization ro_html->add( render_repo_menu( io_repo ) ). IF io_repo->is_offline( ) = abap_false AND lo_log->count( ) > 0. ro_html->add( '
' ). ro_html->add( lo_log->to_html( ) ). " shows eg. list of unsupported objects ro_html->add( '
' ). ENDIF. ro_html->add( '
' ). IF io_repo->is_offline( ) = abap_false. IF mv_hide_files = abap_true. lo_tab_menu->add( iv_txt = 'Show files' iv_act = c_actions-toggle_hide_files ). ELSE. lo_tab_menu->add( iv_txt = 'Hide files' iv_act = c_actions-toggle_hide_files ). ENDIF. ro_html->add( lo_tab_menu->render( iv_as_angle = abap_true ) ). ENDIF. ro_html->add( '' ). IF lines( lt_repo_items ) = 0. ro_html->add( '' ) ##NO_TEXT. ELSE. LOOP AT lt_repo_items ASSIGNING . ro_html->add( render_repo_item( io_repo = io_repo is_item = ) ). ENDLOOP. ENDIF. ro_html->add( '
' && '
Empty package
' && '
' ). ro_html->add( '
' ). CATCH lcx_exception INTO lx_error. ro_html->add( render_repo_menu( io_repo ) ). ro_html->add( render_error( lx_error ) ). ENDTRY. ro_html->add( '
' ). ENDMETHOD. "render_repo METHOD render_repo_menu. DATA: lo_toolbar TYPE REF TO lcl_html_toolbar, lo_tb_advanced TYPE REF TO lcl_html_toolbar, lo_tb_branch TYPE REF TO lcl_html_toolbar, lv_key TYPE lcl_persistence_db=>ty_value, lv_wp_opt LIKE gc_html_opt-crossout, lv_pull_opt LIKE gc_html_opt-crossout, lo_repo_online TYPE REF TO lcl_repo_online. CREATE OBJECT ro_html. CREATE OBJECT lo_toolbar. CREATE OBJECT lo_tb_branch. CREATE OBJECT lo_tb_advanced. lv_key = io_repo->get_key( ). IF io_repo->is_offline( ) = abap_false. lo_repo_online ?= io_repo. ENDIF. IF io_repo->is_write_protected( ) = abap_true. lv_wp_opt = gc_html_opt-crossout. lv_pull_opt = gc_html_opt-crossout. ELSE. lv_pull_opt = gc_html_opt-emphas. ENDIF. " Build branch drop-down ======================== IF io_repo->is_offline( ) = abap_false. " Online ? lo_tb_branch->add( iv_txt = 'Overview' iv_act = |{ gc_action-go_branch_overview }?{ lv_key }| ). lo_tb_branch->add( iv_txt = 'Switch' iv_act = |{ gc_action-git_branch_switch }?{ lv_key }| iv_opt = lv_wp_opt ). lo_tb_branch->add( iv_txt = 'Create' iv_act = |{ gc_action-git_branch_create }?{ lv_key }| ). lo_tb_branch->add( iv_txt = 'Delete' iv_act = |{ gc_action-git_branch_delete }?{ lv_key }| ). ENDIF. " Build advanced drop-down ======================== IF io_repo->is_offline( ) = abap_false. " Online ? lo_tb_advanced->add( iv_txt = 'Reset local' iv_act = |{ gc_action-git_reset }?{ lv_key }| iv_opt = lv_wp_opt ). lo_tb_advanced->add( iv_txt = 'Background mode' iv_act = |{ gc_action-go_background }?{ lv_key }| ). lo_tb_advanced->add( iv_txt = 'Change remote' iv_act = |{ gc_action-repo_remote_change }?{ lv_key }| ). lo_tb_advanced->add( iv_txt = 'Make off-line' iv_act = |{ gc_action-repo_remote_detach }?{ lv_key }| ). ELSE. lo_tb_advanced->add( iv_txt = 'Make on-line' iv_act = |{ gc_action-repo_remote_attach }?{ lv_key }| ). ENDIF. lo_tb_advanced->add( iv_txt = 'Remove' iv_act = |{ gc_action-repo_remove }?{ lv_key }| ). lo_tb_advanced->add( iv_txt = 'Uninstall' iv_act = |{ gc_action-repo_purge }?{ lv_key }| iv_opt = lv_wp_opt ). " Build main toolbar ============================== IF io_repo->is_offline( ) = abap_false. " Online ? TRY. IF lo_repo_online->get_sha1_remote( ) <> lo_repo_online->get_sha1_local( ). lo_toolbar->add( iv_txt = 'Pull' iv_act = |{ gc_action-git_pull }?{ lv_key }| iv_opt = lv_pull_opt ). ENDIF. IF lcl_stage_logic=>count( lo_repo_online ) > 0. lo_toolbar->add( iv_txt = 'Stage' iv_act = |{ gc_action-go_stage }?{ lv_key }| iv_opt = gc_html_opt-emphas ). ENDIF. CATCH lcx_exception ##NO_HANDLER. " authorization error or repository does not exist " ignore error ENDTRY. lo_toolbar->add( iv_txt = 'Branch' io_sub = lo_tb_branch ) ##NO_TEXT. ELSE. lo_toolbar->add( iv_txt = 'Import ZIP' iv_act = |{ gc_action-zip_import }?{ lv_key }| iv_opt = gc_html_opt-emphas ). lo_toolbar->add( iv_txt = 'Export ZIP' iv_act = |{ gc_action-zip_export }?{ lv_key }| iv_opt = gc_html_opt-emphas ). ENDIF. lo_toolbar->add( iv_txt = 'Advanced' io_sub = lo_tb_advanced ) ##NO_TEXT. lo_toolbar->add( iv_txt = 'Refresh' iv_act = |{ gc_action-repo_refresh }?{ lv_key }| ). " Render ========================================== ro_html->add( '
' ). ro_html->add( lo_toolbar->render( ) ). ro_html->add( '
' ). ENDMETHOD. "render_repo_menu METHOD extract_repo_content. DATA: lo_repo_online TYPE REF TO lcl_repo_online, lt_tadir TYPE ty_tadir_tt, ls_file TYPE ty_repo_file, lt_results TYPE ty_results_tt. FIELD-SYMBOLS: LIKE LINE OF lt_results, LIKE LINE OF et_repo_items, LIKE LINE OF lt_tadir. CLEAR et_repo_items. IF io_repo->is_offline( ) = abap_true. lt_tadir = lcl_tadir=>read( io_repo->get_package( ) ). LOOP AT lt_tadir ASSIGNING . APPEND INITIAL LINE TO et_repo_items ASSIGNING . IF sy-tabix = 1. -is_first = abap_true. ENDIF. -obj_type = -object. -obj_name = -obj_name. ENDLOOP. ELSE. CREATE OBJECT eo_log. lo_repo_online ?= io_repo. lt_results = lo_repo_online->status( eo_log ). LOOP AT lt_results ASSIGNING . AT NEW obj_name. "obj_type + obj_name APPEND INITIAL LINE TO et_repo_items ASSIGNING . -obj_type = -obj_type. -obj_name = -obj_name. -sortkey = c_default_sortkey. " Default sort key -changes = 0. ENDAT. IF -filename IS NOT INITIAL. ls_file-path = -path. ls_file-filename = -filename. ls_file-is_changed = boolc( NOT -match = abap_true ). ls_file-new = -new. APPEND ls_file TO -files. IF ls_file-is_changed = abap_true OR ls_file-new IS NOT INITIAL. -sortkey = 2. " Changed files -changes = -changes + 1. ENDIF. ENDIF. AT END OF obj_name. "obj_type + obj_name IF -obj_type IS INITIAL. -sortkey = 0. "Virtual objects ELSEIF lines( -files ) = 0. -sortkey = 1. "New object to commit ENDIF. ENDAT. ENDLOOP. SORT et_repo_items BY sortkey obj_type obj_name ASCENDING. READ TABLE et_repo_items ASSIGNING INDEX 1. IF sy-subrc IS INITIAL. -is_first = abap_true. ENDIF. ENDIF. ENDMETHOD. "extract_repo_content METHOD render_repo_item. DATA: lv_link TYPE string, lv_icon TYPE string, lv_difflink TYPE string, ls_file LIKE LINE OF is_item-files, lv_trclass TYPE string. CREATE OBJECT ro_html. IF is_item-is_first = abap_true. " TR class lv_trclass = 'firstrow' ##NO_TEXT. ENDIF. IF is_item-obj_name IS INITIAL. lv_trclass = lv_trclass && ' unsupported' ##NO_TEXT. ENDIF. IF is_item-sortkey > 0 AND is_item-sortkey < c_default_sortkey. lv_trclass = lv_trclass && ' modified' ##NO_TEXT. ENDIF. IF lv_trclass IS NOT INITIAL. SHIFT lv_trclass LEFT DELETING LEADING space. lv_trclass = | class="{ lv_trclass }"|. ENDIF. ro_html->add( || ). IF is_item-obj_name IS INITIAL. ro_html->add( '' && 'non-code and meta files' ). ELSE. CASE is_item-obj_type. "TODO ?? WHEN 'PROG' OR 'CLAS' OR 'FUGR'. lv_icon = ||. WHEN 'W3MI' OR 'W3HT'. lv_icon = ||. WHEN ''. lv_icon = space. " no icon WHEN OTHERS. lv_icon = ||. ENDCASE. lv_link = render_obj_jump_link( iv_obj_name = is_item-obj_name iv_obj_type = is_item-obj_type ). ro_html->add( |{ lv_icon }| ). ro_html->add( |{ is_item-obj_type }| ). ro_html->add( |{ lv_link }| ). ENDIF. IF io_repo->is_offline( ) = abap_false. " Files for online repos only ro_html->add( '' ). IF mv_hide_files = abap_false OR is_item-obj_type IS INITIAL. LOOP AT is_item-files INTO ls_file. ro_html->add( |{ ls_file-path && ls_file-filename }| ). ENDLOOP. ENDIF. ro_html->add( '' ). ro_html->add( '' ). IF lines( is_item-files ) = 0. ro_html->add( 'new @local' ). ELSEIF is_item-changes > 0. IF mv_hide_files = abap_true AND is_item-obj_name IS NOT INITIAL. lv_difflink = lcl_html_action_utils=>obj_encode( iv_key = io_repo->get_key( ) ig_object = is_item ). ro_html->add_anchor( iv_txt = |diff ({ is_item-changes })| iv_act = |{ gc_action-go_diff }?{ lv_difflink }| ). ELSE. LOOP AT is_item-files INTO ls_file. IF ls_file-new = gc_new-remote. ro_html->add( 'new @remote' ). ELSEIF ls_file-new = gc_new-local. ro_html->add( 'new @local' ). ELSEIF ls_file-is_changed = abap_true. lv_difflink = lcl_html_action_utils=>file_encode( iv_key = io_repo->get_key( ) ig_file = ls_file ). ro_html->add_anchor( iv_txt = 'diff' iv_act = |{ gc_action-go_diff }?{ lv_difflink }| ). ELSE. ro_html->add( | | ). ENDIF. ENDLOOP. ENDIF. ENDIF. ro_html->add( '' ). ENDIF. ro_html->add( '' ). ENDMETHOD. "render_repo_item ********************************************************************** * ASSETS, STYLES, SCRIPTS ********************************************************************** METHOD styles. CREATE OBJECT ro_html. _add '/* REPOSITORY TABLE*/'. _add 'div.repo_container {'. _add ' position: relative;'. _add '}'. _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.modified { background: #fbf7e9; }'. _add '.repo_tab tr.firstrow td { border-top: 0px; }'. _add '.repo_tab td.files span { display: block; }'. _add '.repo_tab td.cmd span { display: block; }'. _add '.repo_tab td.cmd a { display: block; }'. ENDMETHOD. "styles METHOD lif_gui_page~get_assets. * http://fa2png.io/r/octicons/ * colour: #808080 * size: 16 * https://www.base64-image.de/ can be used to convert images to base64 DATA ls_image TYPE ty_web_asset. rt_assets = super->lif_gui_page~get_assets( ). ls_image-url = 'img/sync' ##NO_TEXT. ls_image-content = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA6ElEQVQYGY3BIWuUAQAG' && '4Pc7N72xsbGBYNE8tYpVZKDZX2CcYLEZ9yQxOQSz3D/YmkUsVovRQ2SYNJnlkFfH7VZu' && 'wefJgrGHXnjrpQeu5B93smCwr6qqqp54433mDI5Ucds1u577o+p35hyoqe2cMThWVatJ' && '7KiZrZxz18SJqqtJPFXPssRgw0oSH9WNXMCQU76qzSxx2cxxTlk3yhKb6mcSQy7kvjpM' && 'Ylt98tpjN3POyFTdSuKSqppayxkjE/Uhc36p+m7PhhXr7vmmfhhnzpHPJqqqquqdcRY8' && 'spq47sAXMyde2c3/+wvX7Y18BexhBwAAAABJRU5ErkJggg=='. APPEND ls_image TO rt_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' && 'ZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/' && 'eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+' && 'IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2Jl' && 'IFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAg' && 'ICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5' && 'LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9' && 'IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHht' && 'bG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3Vy' && 'Y2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHht' && 'cE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpkOTZmYmU4Yi0yMjEzLTZlNDct' && 'ODZiZC05NGE1ZTM1ZmJiMzUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDQ2RTFD' && 'MTA0OTkwMTFFNjlCMzk5MTg2OTAzMDVDRDIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5p' && 'aWQ6NDQ2RTFDMEY0OTkwMTFFNjlCMzk5MTg2OTAzMDVDRDIiIHhtcDpDcmVhdG9yVG9v' && 'bD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoV2luZG93cykiPiA8eG1wTU06RGVy' && 'aXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpkOTZmYmU4Yi0yMjEzLTZl' && 'NDctODZiZC05NGE1ZTM1ZmJiMzUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6ZDk2' && 'ZmJlOGItMjIxMy02ZTQ3LTg2YmQtOTRhNWUzNWZiYjM1Ii8+IDwvcmRmOkRlc2NyaXB0' && 'aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+SXqL' && 'ugAAAWVJREFUeNrEk7tKxEAYheeSm0RXUNBaEcTOB7CxsrBXwWIbEQuLiGAnhtQW6XwK' && 'O1/CN/ARBLuwmrC5jOfEGVhFIbCFP3z7zyY7J+f8s5HGGDFPKTFnSbfIskwopTbDMFzW' && 'Wi/hUg3e4bCWUmqsV8EE6xdeT5Kk3+c5ga7rbtDS6XTaosf2smFhE3Mq3/ffwCXWj3me' && 'G4r0EdI0HaHd4smR53kxnEiC4ofG2ouiiALr+N0dWPs5gyOwyEhwIJumEXVdC3Y4E+67' && 'HfgOOHARnMDYxvhzWE4MpSG0iwh9fAX7W+h7NrCAZYEoIgiCHtg2iCUI73EmZVmeF0Wx' && '7RyMZwb5DSvIefCERNu2oqoqRoxx78SdwjM4BQFngI2EwtIOcIF86XcfBJsnPFIncAgu' && 'fstNB3wqcaOwROAePCl7AkPrGGzQjdvnWSsrAwX27X9AzUa4Ag9gNEDgzPZXcN2/C//+' && 'Nn4KMABcS6Z2qzb7wwAAAABJRU5ErkJggg=='. 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. ls_image-url = 'img/lock' ##NO_TEXT. ls_image-content = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAOVBMVEUAAACIiIiIiIiI' && 'iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIjNaTNB' && 'AAAAEnRSTlMABgdBVXt8iYuRsNXZ3uDi6Pmu6tfUAAAASUlEQVQYV63KSxJAQBAE0TQ0' && 'Znym1f0PayE0QdjJ5asCgGTu1hClqjppvaRXB60swBeA2QNUAIq+ICvKx367nqAn/P8Y' && 't2jg3Q5rgASaF3KNRwAAAABJRU5ErkJggg=='. APPEND ls_image TO rt_assets. ENDMETHOD. "get_assets ENDCLASS.