CLASS zcl_abapgit_gui_page_repo_over DEFINITION PUBLIC INHERITING FROM zcl_abapgit_gui_component FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES zif_abapgit_gui_renderable . DATA mv_order_by TYPE string READ-ONLY . METHODS constructor RAISING zcx_abapgit_exception . METHODS set_order_by IMPORTING !iv_order_by TYPE string . METHODS set_order_direction IMPORTING !iv_order_descending TYPE abap_bool . METHODS set_filter IMPORTING !it_postdata TYPE zif_abapgit_html_viewer=>ty_post_data . PROTECTED SECTION. PRIVATE SECTION. TYPES: BEGIN OF ty_overview, favorite TYPE string, "! True for offline, false for online repo type TYPE string, key TYPE zif_abapgit_persistence=>ty_value, name TYPE string, url TYPE string, package TYPE devclass, branch TYPE string, created_by TYPE xubname, created_at TYPE string, deserialized_by TYPE xubname, deserialized_at TYPE string, write_protected TYPE abap_bool, END OF ty_overview, ty_overviews TYPE STANDARD TABLE OF ty_overview WITH NON-UNIQUE DEFAULT KEY. CONSTANTS: BEGIN OF c_action, select TYPE string VALUE 'select', apply_filter TYPE string VALUE 'apply_filter', END OF c_action . DATA: mv_order_descending TYPE abap_bool, mv_filter TYPE string, mv_time_zone TYPE timezone, mt_col_spec TYPE zif_abapgit_definitions=>ty_col_spec_tt, mt_overview TYPE ty_overviews. METHODS: render_text_input IMPORTING iv_name TYPE string iv_label TYPE string iv_value TYPE string OPTIONAL iv_max_length TYPE string OPTIONAL RETURNING VALUE(ri_html) TYPE REF TO zif_abapgit_html, apply_filter CHANGING ct_overview TYPE ty_overviews, map_repo_list_to_overview RETURNING VALUE(rt_overview) TYPE ty_overviews RAISING zcx_abapgit_exception, render_table_header IMPORTING ii_html TYPE REF TO zif_abapgit_html, render_table IMPORTING ii_html TYPE REF TO zif_abapgit_html it_overview TYPE ty_overviews RAISING zcx_abapgit_exception, render_table_body IMPORTING ii_html TYPE REF TO zif_abapgit_html it_overview TYPE ty_overviews RAISING zcx_abapgit_exception, render_header_bar IMPORTING ii_html TYPE REF TO zif_abapgit_html, apply_order_by CHANGING ct_overview TYPE ty_overviews, _add_column IMPORTING iv_tech_name TYPE string OPTIONAL iv_display_name TYPE string OPTIONAL iv_css_class TYPE string OPTIONAL iv_add_tz TYPE abap_bool OPTIONAL iv_title TYPE string OPTIONAL iv_allow_order_by TYPE any OPTIONAL. METHODS render_scripts RETURNING VALUE(ri_html) TYPE REF TO zif_abapgit_html RAISING zcx_abapgit_exception. ENDCLASS. CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_OVER IMPLEMENTATION. METHOD apply_filter. IF mv_filter IS NOT INITIAL. DELETE ct_overview WHERE key NS mv_filter AND name NS mv_filter AND url NS mv_filter AND package NS mv_filter AND branch NS mv_filter AND created_by NS mv_filter AND created_at NS mv_filter AND deserialized_by NS mv_filter AND deserialized_at NS mv_filter. ENDIF. ENDMETHOD. METHOD apply_order_by. DATA: lt_sort TYPE abap_sortorder_tab, ls_sort LIKE LINE OF lt_sort. ls_sort-name = 'FAVORITE'. ls_sort-descending = abap_true. ls_sort-astext = abap_true. INSERT ls_sort INTO TABLE lt_sort. IF mv_order_by IS NOT INITIAL. ls_sort-name = mv_order_by. ls_sort-descending = mv_order_descending. ls_sort-astext = abap_true. INSERT ls_sort INTO TABLE lt_sort. ENDIF. SORT ct_overview BY (lt_sort). ENDMETHOD. METHOD constructor. super->constructor( ). mv_order_by = |NAME|. CALL FUNCTION 'GET_SYSTEM_TIMEZONE' IMPORTING timezone = mv_time_zone EXCEPTIONS customizing_missing = 1 OTHERS = 2. ASSERT sy-subrc = 0. ENDMETHOD. METHOD map_repo_list_to_overview. DATA: ls_overview LIKE LINE OF rt_overview, lv_date TYPE d, lv_time TYPE t, lt_repo_obj_list TYPE zif_abapgit_repo_srv=>ty_repo_list. FIELD-SYMBOLS LIKE LINE OF lt_repo_obj_list. lt_repo_obj_list = zcl_abapgit_repo_srv=>get_instance( )->list( ). LOOP AT lt_repo_obj_list ASSIGNING . CLEAR: ls_overview. ls_overview-favorite = zcl_abapgit_persistence_user=>get_instance( )->is_favorite_repo( ->ms_data-key ). ls_overview-type = ->ms_data-offline. ls_overview-key = ->ms_data-key. ls_overview-name = ->get_name( ). ls_overview-url = ->ms_data-url. ls_overview-package = ->ms_data-package. ls_overview-branch = ->ms_data-branch_name. ls_overview-created_by = ->ms_data-created_by. ls_overview-write_protected = ->ms_data-local_settings-write_protected. IF ->ms_data-created_at IS NOT INITIAL. CONVERT TIME STAMP ->ms_data-created_at TIME ZONE mv_time_zone INTO DATE lv_date TIME lv_time. ls_overview-created_at = |{ lv_date DATE = USER } { lv_time TIME = USER }|. ENDIF. ls_overview-deserialized_by = ->ms_data-deserialized_by. IF ->ms_data-deserialized_at IS NOT INITIAL. CONVERT TIME STAMP ->ms_data-deserialized_at TIME ZONE mv_time_zone INTO DATE lv_date TIME lv_time. ls_overview-deserialized_at = |{ lv_date DATE = USER } { lv_time TIME = USER }|. ENDIF. INSERT ls_overview INTO TABLE rt_overview. ENDLOOP. ENDMETHOD. METHOD render_header_bar. ii_html->add( |
| ). ii_html->add( |
| ). ii_html->add( render_text_input( iv_name = |filter| iv_label = |Filter: | iv_value = mv_filter ) ). ii_html->add( || ). ii_html->add( |
| ). ii_html->add( ii_html->a( iv_txt = ' Only Favorites' iv_act = |gHelper.toggleRepoListFavorites()| iv_typ = zif_abapgit_html=>c_action_type-onclick ) ). ii_html->add( `|` ). ii_html->add( ii_html->a( iv_txt = ' Detail' iv_act = |gHelper.toggleRepoListDetail()| iv_typ = zif_abapgit_html=>c_action_type-onclick ) ). ii_html->add( |
| ). ENDMETHOD. METHOD render_scripts. CREATE OBJECT ri_html TYPE zcl_abapgit_html. ri_html->set_title( cl_abap_typedescr=>describe_by_object_ref( me )->get_relative_name( ) ). ri_html->add( 'setInitialFocus("filter");' ). ri_html->add( 'var gHelper = new RepoOverViewHelper();' ). ENDMETHOD. METHOD render_table. ii_html->add( |
| ). ii_html->add( || ). render_table_header( ii_html ). render_table_body( ii_html = ii_html it_overview = it_overview ). ii_html->add( |
| ). ii_html->add( |
| ). ENDMETHOD. METHOD render_table_body. CONSTANTS: lc_separator TYPE string VALUE `|`. DATA: lv_type_icon TYPE string, lv_favorite_icon TYPE string, lv_favorite_class TYPE string, lv_stage_link TYPE string, lv_patch_link TYPE string, lv_zip_import_link TYPE string, lv_zip_export_link TYPE string, lv_check_link TYPE string, lv_text TYPE string, lv_lock TYPE string, lv_settings_link TYPE string. DATA lv_new_length TYPE i. FIELD-SYMBOLS: LIKE LINE OF it_overview. ii_html->add( '' ). LOOP AT it_overview ASSIGNING . IF -type = abap_true. lv_type_icon = 'plug/darkgrey'. ELSE. lv_type_icon = 'cloud-upload-alt/darkgrey'. ENDIF. IF -favorite = abap_true. lv_favorite_icon = 'star/blue'. lv_favorite_class = 'favorite'. ELSE. lv_favorite_icon = 'star/grey'. lv_favorite_class = ''. ENDIF. ii_html->add( || ). ii_html->add( || ). ii_html->add_a( iv_act = |{ zif_abapgit_definitions=>c_action-repo_toggle_fav }?key={ -key }| iv_txt = ii_html->icon( iv_name = lv_favorite_icon iv_class = 'pad-sides' iv_hint = 'Click to toggle favorite' ) ). ii_html->add( || ). CLEAR lv_lock. IF -write_protected = abap_true. lv_lock = ii_html->icon( iv_name = 'lock/grey70' iv_class = 'm-em5-sides' iv_hint = 'Locked from pulls' ). ENDIF. ii_html->add( |{ ii_html->icon( lv_type_icon ) }| ). ii_html->add( |{ ii_html->a( iv_txt = -name iv_act = |{ c_action-select }?key={ -key }| ) }{ lv_lock }| ). IF -type = abap_false. lv_text = -url. REPLACE FIRST OCCURRENCE OF 'https://' IN lv_text WITH ''. REPLACE FIRST OCCURRENCE OF 'http://' IN lv_text WITH ''. IF lv_text CP '*.git'. lv_new_length = strlen( lv_text ) - 4. lv_text = lv_text(lv_new_length). ENDIF. ii_html->add( |{ ii_html->a( iv_txt = lv_text iv_title = -url iv_act = |{ zif_abapgit_definitions=>c_action-url }?url={ -url }| ) }| ). ELSE. ii_html->add( || ). ENDIF. ii_html->add( || ). ii_html->add( zcl_abapgit_gui_chunk_lib=>render_package_name( iv_package = -package iv_suppress_title = abap_true ) ). ii_html->add( || ). IF -branch IS INITIAL. ii_html->add( | | ). ELSE. ii_html->add( || ). ii_html->add( zcl_abapgit_gui_chunk_lib=>render_branch_name( iv_branch = -branch iv_repo_key = -key ) ). ii_html->add( || ). ENDIF. ii_html->add( || ). ii_html->add( zcl_abapgit_gui_chunk_lib=>render_user_name( iv_username = -deserialized_by iv_suppress_title = abap_true ) ). ii_html->add( || ). ii_html->add( |{ -deserialized_at }| ). ii_html->add( || ). ii_html->add( zcl_abapgit_gui_chunk_lib=>render_user_name( iv_username = -created_by iv_suppress_title = abap_true ) ). ii_html->add( || ). ii_html->add( |{ -created_at }| ). ii_html->add( |{ -key }| ). ii_html->add( | | ). lv_check_link = ii_html->a( iv_txt = |Check| iv_act = |{ zif_abapgit_definitions=>c_action-repo_code_inspector }?key={ -key } | ). ii_html->add( lv_check_link && lc_separator ). IF -type = abap_false. " online repo lv_stage_link = ii_html->a( iv_txt = |Stage| iv_act = |{ zif_abapgit_definitions=>c_action-go_stage }?key={ -key } | ). ii_html->add( lv_stage_link && lc_separator ). lv_patch_link = ii_html->a( iv_txt = |Patch| iv_act = |{ zif_abapgit_definitions=>c_action-go_patch }?key={ -key } | ). ii_html->add( lv_patch_link && lc_separator ). ELSE. " offline repo lv_zip_import_link = ii_html->a( iv_txt = |Import| iv_act = |{ zif_abapgit_definitions=>c_action-zip_import }?key={ -key } | ). ii_html->add( lv_zip_import_link && lc_separator ). lv_zip_export_link = ii_html->a( iv_txt = |Export| iv_act = |{ zif_abapgit_definitions=>c_action-zip_export }?key={ -key } | ). ii_html->add( lv_zip_export_link && lc_separator ). ENDIF. lv_settings_link = ii_html->a( iv_txt = |Settings| iv_act = |{ zif_abapgit_definitions=>c_action-repo_settings }?key={ -key } | ). ii_html->add( lv_settings_link ). ii_html->add( || ). ii_html->add( |{ ii_html->a( iv_txt = `›` iv_act = |{ c_action-select }?key={ -key }| ) }| ). ii_html->add( || ). ENDLOOP. ii_html->add( || ). ENDMETHOD. METHOD render_table_header. CLEAR mt_col_spec. _add_column( iv_tech_name = 'FAVORITE' iv_css_class = 'wmin' iv_allow_order_by = abap_false ). _add_column( iv_tech_name = 'TYPE' iv_css_class = 'wmin' iv_allow_order_by = abap_false ). _add_column( iv_tech_name = 'NAME' iv_display_name = 'Name' iv_allow_order_by = abap_true ). _add_column( iv_tech_name = 'URL' iv_display_name = 'Url' iv_allow_order_by = abap_true ). _add_column( iv_tech_name = 'PACKAGE' iv_display_name = 'Package' iv_allow_order_by = abap_true ). _add_column( iv_tech_name = 'BRANCH' iv_display_name = 'Branch' iv_allow_order_by = abap_true ). _add_column( iv_tech_name = 'DESERIALIZED_BY' iv_display_name = 'Deserialized by' iv_css_class = 'ro-detail' iv_allow_order_by = abap_true ). _add_column( iv_tech_name = 'DESERIALIZED_AT' iv_display_name = 'Deserialized at' iv_css_class = 'ro-detail' iv_allow_order_by = abap_true ). _add_column( iv_tech_name = 'CREATED_BY' iv_display_name = 'Created by' iv_css_class = 'ro-detail' iv_allow_order_by = abap_true ). _add_column( iv_tech_name = 'CREATED_AT' iv_display_name = 'Created at' iv_css_class = 'ro-detail' iv_add_tz = abap_true iv_allow_order_by = abap_true ). _add_column( iv_tech_name = 'KEY' iv_display_name = 'Key' iv_css_class = 'ro-detail' iv_allow_order_by = abap_true ). _add_column( iv_tech_name = 'ACTION' iv_display_name = 'Action' iv_css_class = 'ro-action' iv_allow_order_by = abap_false ). _add_column( iv_tech_name = 'GO' iv_css_class = 'ro-go' iv_allow_order_by = abap_false ). ii_html->add( || ). ii_html->add( || ). ii_html->add( zcl_abapgit_gui_chunk_lib=>render_order_by_header_cells( it_col_spec = mt_col_spec iv_order_by = mv_order_by iv_order_descending = mv_order_descending ) ). ii_html->add( '' ). ii_html->add( '' ). ENDMETHOD. METHOD render_text_input. DATA lv_attrs TYPE string. CREATE OBJECT ri_html TYPE zcl_abapgit_html. IF iv_value IS NOT INITIAL. lv_attrs = | value="{ iv_value }"|. ENDIF. IF iv_max_length IS NOT INITIAL. lv_attrs = | maxlength="{ iv_max_length }"|. ENDIF. ri_html->add( || ). ri_html->add( || ). ENDMETHOD. METHOD set_filter. FIELD-SYMBOLS: LIKE LINE OF it_postdata. READ TABLE it_postdata ASSIGNING INDEX 1. IF sy-subrc = 0. FIND FIRST OCCURRENCE OF REGEX `filter=(.*)` IN SUBMATCHES mv_filter. ENDIF. mv_filter = condense( mv_filter ). ENDMETHOD. METHOD set_order_by. mv_order_by = iv_order_by. ENDMETHOD. METHOD set_order_direction. mv_order_descending = iv_order_descending. ENDMETHOD. METHOD zif_abapgit_gui_renderable~render. mt_overview = map_repo_list_to_overview( ). apply_order_by( CHANGING ct_overview = mt_overview ). apply_filter( CHANGING ct_overview = mt_overview ). CREATE OBJECT ri_html TYPE zcl_abapgit_html. render_header_bar( ri_html ). zcl_abapgit_exit=>get_instance( )->wall_message_list( ri_html ). render_table( ii_html = ri_html it_overview = mt_overview ). register_deferred_script( render_scripts( ) ). ENDMETHOD. METHOD _add_column. FIELD-SYMBOLS LIKE LINE OF mt_col_spec. APPEND INITIAL LINE TO mt_col_spec ASSIGNING . -display_name = iv_display_name. -tech_name = iv_tech_name. -title = iv_title. -css_class = iv_css_class. -add_tz = iv_add_tz. -allow_order_by = iv_allow_order_by. ENDMETHOD. ENDCLASS.