CLASS zcl_abapgit_gui_page_repo_over DEFINITION
PUBLIC
INHERITING FROM zcl_abapgit_gui_page
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
METHODS constructor .
METHODS zif_abapgit_gui_page~on_event
REDEFINITION .
PROTECTED SECTION.
METHODS:
render_content REDEFINITION,
scripts REDEFINITION.
PRIVATE SECTION.
TYPES:
BEGIN OF ty_overview,
favorite TYPE string,
type TYPE string,
key TYPE string,
name TYPE string,
url TYPE string,
package TYPE string,
branch TYPE string,
created_by TYPE string,
created_at TYPE string,
deserialized_by TYPE string,
deserialized_at TYPE string,
END OF ty_overview,
tty_overview TYPE STANDARD TABLE OF ty_overview
WITH NON-UNIQUE DEFAULT KEY.
CONSTANTS:
BEGIN OF gc_action,
delete TYPE string VALUE 'delete',
select TYPE string VALUE 'select',
change_order_by TYPE string VALUE 'change_order_by',
direction TYPE string VALUE 'direction',
apply_filter TYPE string VALUE 'apply_filter',
END OF gc_action .
DATA:
mv_order_by TYPE string,
mv_order_descending TYPE char01,
mv_filter TYPE string,
mv_time_zone TYPE timezone.
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(ro_html) TYPE REF TO zcl_abapgit_html,
parse_change_order_by
IMPORTING
it_postdata TYPE cnht_post_data_tab,
parse_direction
IMPORTING
it_postdata TYPE cnht_post_data_tab,
parse_filter
IMPORTING
it_postdata TYPE cnht_post_data_tab,
add_order_by_option
IMPORTING
iv_option TYPE string
io_html TYPE REF TO zcl_abapgit_html,
add_direction_option
IMPORTING
iv_option TYPE string
io_html TYPE REF TO zcl_abapgit_html
iv_selected TYPE abap_bool,
apply_order_by
CHANGING
ct_overview TYPE zcl_abapgit_gui_page_repo_over=>tty_overview,
apply_filter
CHANGING
ct_overview TYPE zcl_abapgit_gui_page_repo_over=>tty_overview,
map_repo_list_to_overview
IMPORTING
it_repo_list TYPE zif_abapgit_persistence=>tt_repo
RETURNING
VALUE(rt_overview) TYPE zcl_abapgit_gui_page_repo_over=>tty_overview
RAISING
zcx_abapgit_exception,
render_table_header
IMPORTING
io_html TYPE REF TO zcl_abapgit_html,
render_table
IMPORTING
io_html TYPE REF TO zcl_abapgit_html
it_overview TYPE zcl_abapgit_gui_page_repo_over=>tty_overview,
render_table_body
IMPORTING
io_html TYPE REF TO zcl_abapgit_html
it_overview TYPE zcl_abapgit_gui_page_repo_over=>tty_overview,
render_order_by
IMPORTING
io_html TYPE REF TO zcl_abapgit_html,
render_order_by_direction
IMPORTING
io_html TYPE REF TO zcl_abapgit_html,
render_header_bar
IMPORTING
io_html TYPE REF TO zcl_abapgit_html.
ENDCLASS.
CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION.
METHOD add_direction_option.
DATA: lv_selected TYPE string.
IF iv_selected = abap_true.
lv_selected = 'selected'.
ENDIF.
io_html->add( || ).
ENDMETHOD.
METHOD add_order_by_option.
DATA: lv_selected TYPE string.
IF mv_order_by = iv_option.
lv_selected = 'selected'.
ENDIF.
io_html->add( || ).
ENDMETHOD.
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.
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.
SORT ct_overview BY (lt_sort).
ENDIF.
ENDMETHOD.
METHOD constructor.
super->constructor( ).
ms_control-page_title = |Repository Overview|.
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. " constructor.
METHOD map_repo_list_to_overview.
DATA: ls_overview LIKE LINE OF rt_overview,
lo_repo_srv TYPE REF TO zcl_abapgit_repo,
lo_user TYPE REF TO zcl_abapgit_persistence_user,
lv_date TYPE d,
lv_time TYPE t.
FIELD-SYMBOLS: LIKE LINE OF it_repo_list.
lo_user = zcl_abapgit_persistence_user=>get_instance( ).
LOOP AT it_repo_list ASSIGNING .
CLEAR: ls_overview.
lo_repo_srv = zcl_abapgit_repo_srv=>get_instance( )->get( -key ).
ls_overview-favorite = lo_user->is_favorite_repo( -key ).
ls_overview-type = -offline.
ls_overview-key = -key.
ls_overview-name = lo_repo_srv->get_name( ).
ls_overview-url = -url.
ls_overview-package = -package.
ls_overview-branch = zcl_abapgit_git_branch_list=>get_display_name( -branch_name ).
ls_overview-created_by = -created_by.
IF -created_at IS NOT INITIAL.
CONVERT TIME STAMP -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 = -deserialized_by.
IF -deserialized_at IS NOT INITIAL.
CONVERT TIME STAMP -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 parse_change_order_by.
FIELD-SYMBOLS: TYPE cnht_post_data_line.
READ TABLE it_postdata ASSIGNING
INDEX 1.
IF sy-subrc = 0.
FIND FIRST OCCURRENCE OF REGEX `orderBy=(.*)`
IN
SUBMATCHES mv_order_by.
ENDIF.
mv_order_by = condense( mv_order_by ).
ENDMETHOD.
METHOD parse_direction.
DATA: lv_direction TYPE string.
FIELD-SYMBOLS: TYPE cnht_post_data_line.
CLEAR: mv_order_descending.
READ TABLE it_postdata ASSIGNING
INDEX 1.
IF sy-subrc = 0.
FIND FIRST OCCURRENCE OF REGEX `direction=(.*)`
IN
SUBMATCHES lv_direction.
ENDIF.
IF condense( lv_direction ) = 'DESCENDING'.
mv_order_descending = abap_true.
ENDIF.
ENDMETHOD.
METHOD parse_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 render_content.
DATA: lo_persistence_repo TYPE REF TO zcl_abapgit_persistence_repo,
lt_overview TYPE tty_overview.
CREATE OBJECT lo_persistence_repo.
lt_overview = map_repo_list_to_overview( lo_persistence_repo->list( ) ).
apply_order_by( CHANGING ct_overview = lt_overview ).
apply_filter( CHANGING ct_overview = lt_overview ).
CREATE OBJECT ro_html.
ro_html->add( |
| ).
ro_html->add( |
| ).
ENDMETHOD. "render_content
METHOD render_text_input.
DATA lv_attrs TYPE string.
CREATE OBJECT ro_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.
ro_html->add( || ).
ro_html->add( || ).
ENDMETHOD. " render_text_input
METHOD zif_abapgit_gui_page~on_event.
DATA: lv_key TYPE zif_abapgit_persistence=>ty_value.
CASE iv_action.
WHEN gc_action-select.
lv_key = iv_getdata.
zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lv_key ).
TRY.
zcl_abapgit_repo_srv=>get_instance( )->get( lv_key )->refresh( ).
CATCH zcx_abapgit_exception ##NO_HANDLER.
ENDTRY.
ev_state = zif_abapgit_definitions=>gc_event_state-go_back.
WHEN gc_action-change_order_by.
parse_change_order_by( it_postdata ).
ev_state = zif_abapgit_definitions=>gc_event_state-re_render.
WHEN gc_action-direction.
parse_direction( it_postdata ).
ev_state = zif_abapgit_definitions=>gc_event_state-re_render.
WHEN gc_action-apply_filter.
parse_filter( it_postdata ).
ev_state = zif_abapgit_definitions=>gc_event_state-re_render.
ENDCASE.
ENDMETHOD.
METHOD render_table_header.
io_html->add( || ).
io_html->add( |