From 6dfb6316c6a630da0aa22a8e66870d6d714e69d8 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Fri, 29 Jun 2018 16:28:17 +0000 Subject: [PATCH] Repository overview page --- src/ui/zcl_abapgit_gui_page_main.clas.abap | 68 ++- .../zcl_abapgit_gui_page_repo_over.clas.abap | 448 ++++++++++++++++++ .../zcl_abapgit_gui_page_repo_over.clas.xml | 19 + src/ui/zcl_abapgit_gui_router.clas.abap | 3 + src/ui/zcl_abapgit_html_toolbar.clas.abap | 7 +- src/zabapgit_js_common.w3mi.data.js | 14 + src/zif_abapgit_definitions.intf.abap | 1 + 7 files changed, 537 insertions(+), 23 deletions(-) create mode 100644 src/ui/zcl_abapgit_gui_page_repo_over.clas.abap create mode 100644 src/ui/zcl_abapgit_gui_page_repo_over.clas.xml diff --git a/src/ui/zcl_abapgit_gui_page_main.clas.abap b/src/ui/zcl_abapgit_gui_page_main.clas.abap index fa778f26d..842442b10 100644 --- a/src/ui/zcl_abapgit_gui_page_main.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_main.clas.abap @@ -16,6 +16,7 @@ CLASS zcl_abapgit_gui_page_main DEFINITION CONSTANTS: BEGIN OF c_actions, show TYPE string VALUE 'show' ##NO_TEXT, changed_by TYPE string VALUE 'changed_by', + overview TYPE string VALUE 'overview', END OF c_actions. DATA: mv_show TYPE zif_abapgit_persistence=>ty_value, @@ -40,7 +41,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION. +CLASS zcl_abapgit_gui_page_main IMPLEMENTATION. METHOD build_main_menu. @@ -52,24 +53,41 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION. CREATE OBJECT lo_advsub. CREATE OBJECT lo_helpsub. - lo_advsub->add( iv_txt = 'Database util' iv_act = zif_abapgit_definitions=>gc_action-go_db ) ##NO_TEXT. - lo_advsub->add( iv_txt = 'Package to zip' iv_act = zif_abapgit_definitions=>gc_action-zip_package ) ##NO_TEXT. - lo_advsub->add( iv_txt = 'Transport to zip' iv_act = zif_abapgit_definitions=>gc_action-zip_transport ) ##NO_TEXT. - lo_advsub->add( iv_txt = 'Object to files' iv_act = zif_abapgit_definitions=>gc_action-zip_object ) ##NO_TEXT. - lo_advsub->add( iv_txt = 'Test changed by' iv_act = c_actions-changed_by ) ##NO_TEXT. - lo_advsub->add( iv_txt = 'Page playground' iv_act = zif_abapgit_definitions=>gc_action-go_playground ) ##NO_TEXT. - lo_advsub->add( iv_txt = 'Debug info' iv_act = zif_abapgit_definitions=>gc_action-go_debuginfo ) ##NO_TEXT. - lo_advsub->add( iv_txt = 'Settings' iv_act = zif_abapgit_definitions=>gc_action-go_settings ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Repository overview' + iv_act = zif_abapgit_definitions=>gc_action-go_repo_overview ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Database util' + iv_act = zif_abapgit_definitions=>gc_action-go_db ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Package to zip' + iv_act = zif_abapgit_definitions=>gc_action-zip_package ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Transport to zip' + iv_act = zif_abapgit_definitions=>gc_action-zip_transport ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Object to files' + iv_act = zif_abapgit_definitions=>gc_action-zip_object ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Test changed by' + iv_act = c_actions-changed_by ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Page playground' + iv_act = zif_abapgit_definitions=>gc_action-go_playground ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Debug info' + iv_act = zif_abapgit_definitions=>gc_action-go_debuginfo ) ##NO_TEXT. + lo_advsub->add( iv_txt = 'Settings' + iv_act = zif_abapgit_definitions=>gc_action-go_settings ) ##NO_TEXT. - lo_helpsub->add( iv_txt = 'Tutorial' iv_act = zif_abapgit_definitions=>gc_action-go_tutorial ) ##NO_TEXT. - lo_helpsub->add( iv_txt = 'abapGit wiki' iv_act = zif_abapgit_definitions=>gc_action-abapgit_wiki ) ##NO_TEXT. + lo_helpsub->add( iv_txt = 'Tutorial' + iv_act = zif_abapgit_definitions=>gc_action-go_tutorial ) ##NO_TEXT. + lo_helpsub->add( iv_txt = 'abapGit wiki' + iv_act = zif_abapgit_definitions=>gc_action-abapgit_wiki ) ##NO_TEXT. - ro_menu->add( iv_txt = '+ Online' iv_act = zif_abapgit_definitions=>gc_action-repo_newonline ) ##NO_TEXT. - ro_menu->add( iv_txt = '+ Offline' iv_act = zif_abapgit_definitions=>gc_action-repo_newoffline ) ##NO_TEXT. - ro_menu->add( iv_txt = 'Explore' iv_act = zif_abapgit_definitions=>gc_action-go_explore ) ##NO_TEXT. + ro_menu->add( iv_txt = '+ Online' + iv_act = zif_abapgit_definitions=>gc_action-repo_newonline ) ##NO_TEXT. + ro_menu->add( iv_txt = '+ Offline' + iv_act = zif_abapgit_definitions=>gc_action-repo_newoffline ) ##NO_TEXT. + ro_menu->add( iv_txt = 'Explore' + iv_act = zif_abapgit_definitions=>gc_action-go_explore ) ##NO_TEXT. - ro_menu->add( iv_txt = 'Advanced' io_sub = lo_advsub ) ##NO_TEXT. - ro_menu->add( iv_txt = 'Help' io_sub = lo_helpsub ) ##NO_TEXT. + ro_menu->add( iv_txt = 'Advanced' + io_sub = lo_advsub ) ##NO_TEXT. + ro_menu->add( iv_txt = 'Help' + io_sub = lo_helpsub ) ##NO_TEXT. ENDMETHOD. "build main_menu @@ -217,9 +235,10 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION. ro_html->add( '' ). ro_html->add( lo_allbar->render_as_droplist( - iv_label = zcl_abapgit_html=>icon( iv_name = 'three-bars/blue' ) - iv_right = abap_true - iv_sort = abap_true ) ). + iv_label = zcl_abapgit_html=>icon( iv_name = 'three-bars/blue' ) + iv_action = c_actions-overview + iv_right = abap_true + iv_sort = abap_true ) ). ro_html->add( '' ). ro_html->add( '' ). @@ -287,7 +306,8 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION. METHOD zif_abapgit_gui_page~on_event. - DATA: lv_key TYPE zif_abapgit_persistence=>ty_repo-key. + DATA: lv_key TYPE zif_abapgit_persistence=>ty_repo-key, + li_repo_overview TYPE REF TO zif_abapgit_gui_page. IF NOT mo_repo_content IS INITIAL. @@ -320,6 +340,14 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION. WHEN c_actions-changed_by. test_changed_by( ). ev_state = zif_abapgit_definitions=>gc_event_state-no_more_act. + + WHEN c_actions-overview. + + CREATE OBJECT li_repo_overview TYPE zcl_abapgit_gui_page_repo_over. + + ei_page = li_repo_overview. + ev_state = zif_abapgit_definitions=>gc_event_state-new_page. + ENDCASE. ENDMETHOD. "on_event diff --git a/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap b/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap new file mode 100644 index 000000000..e1c19fada --- /dev/null +++ b/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap @@ -0,0 +1,448 @@ +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 . + + 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, + 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. + + 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. + +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. + + 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|. + + 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. + + 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 ). + 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: lv_trclass TYPE string, + lo_persistence_repo TYPE REF TO zcl_abapgit_persistence_repo, + lt_overview TYPE tty_overview, + lv_type_icon TYPE string, + lv_favorite_icon TYPE string. + + FIELD-SYMBOLS: LIKE LINE OF lt_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( |
| ). + + ro_html->add( |
| ). + + ro_html->add( |Order by: | ). + + ro_html->add( || ). + + ro_html->add( render_text_input( iv_name = |filter| + iv_label = |Filter: | + iv_value = mv_filter ) ). + + ro_html->add( || ). + + ro_html->add( |
| ). + + ro_html->add( |
| ). + ro_html->add( |
| ). + + ro_html->add( |
| ). + ro_html->add( || ). + + " Header + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( '' ). + ro_html->add( '' ). + ro_html->add( '' ). + + + LOOP AT lt_overview ASSIGNING . + CLEAR lv_trclass. + IF sy-tabix = 1. + lv_trclass = ' class="firstrow"' ##NO_TEXT. + ENDIF. + + IF -type = abap_true. + lv_type_icon = 'plug/darkgrey'. + ELSE. + lv_type_icon = 'cloud-upload/blue'. + ENDIF. + + IF -favorite = abap_true. + lv_favorite_icon = 'star/blue'. + ELSE. + lv_favorite_icon = 'star/grey'. + ENDIF. + + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ro_html->add( || ). + ENDLOOP. + + ro_html->add( || ). + ro_html->add( |
FavoriteTypeKeyNameUrlPackageBranch name
| ). + ro_html->add_a( iv_act = |{ zif_abapgit_definitions=>gc_action-repo_toggle_fav }?{ -key }| + iv_txt = zcl_abapgit_html=>icon( iv_name = lv_favorite_icon + iv_class = 'pad-sides' + iv_hint = 'Click to toggle favorite' ) ). + ro_html->add( |{ zcl_abapgit_html=>icon( lv_type_icon ) }{ -key }{ zcl_abapgit_html=>a( iv_txt = -name + iv_act = |{ gc_action-select }?{ -key }| ) }{ -url }{ -package }{ -branch }| ). + 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. +ENDCLASS. diff --git a/src/ui/zcl_abapgit_gui_page_repo_over.clas.xml b/src/ui/zcl_abapgit_gui_page_repo_over.clas.xml new file mode 100644 index 000000000..38f072849 --- /dev/null +++ b/src/ui/zcl_abapgit_gui_page_repo_over.clas.xml @@ -0,0 +1,19 @@ + + + + + + ZCL_ABAPGIT_GUI_PAGE_REPO_OVER + 1 + E + GUI - DB page + 2 + 1 + X + X + X + X + + + + diff --git a/src/ui/zcl_abapgit_gui_router.clas.abap b/src/ui/zcl_abapgit_gui_router.clas.abap index ca0c2c871..33cd01f6b 100644 --- a/src/ui/zcl_abapgit_gui_router.clas.abap +++ b/src/ui/zcl_abapgit_gui_router.clas.abap @@ -189,6 +189,9 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION. WHEN zif_abapgit_definitions=>gc_action-go_explore. " Go Explore page CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_explore. ev_state = zif_abapgit_definitions=>gc_event_state-new_page. + WHEN zif_abapgit_definitions=>gc_action-go_repo_overview. " Go Repository overview + CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_repo_over. + ev_state = zif_abapgit_definitions=>gc_event_state-new_page. WHEN zif_abapgit_definitions=>gc_action-go_db. " Go DB util page CREATE OBJECT ei_page TYPE zcl_abapgit_gui_page_db. ev_state = zif_abapgit_definitions=>gc_event_state-new_page. diff --git a/src/ui/zcl_abapgit_html_toolbar.clas.abap b/src/ui/zcl_abapgit_html_toolbar.clas.abap index 771e04f76..214b80e64 100644 --- a/src/ui/zcl_abapgit_html_toolbar.clas.abap +++ b/src/ui/zcl_abapgit_html_toolbar.clas.abap @@ -33,6 +33,7 @@ CLASS zcl_abapgit_html_toolbar DEFINITION iv_right TYPE abap_bool OPTIONAL iv_sort TYPE abap_bool OPTIONAL iv_corner TYPE abap_bool OPTIONAL + iv_action TYPE string OPTIONAL RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html. @@ -67,7 +68,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_HTML_TOOLBAR IMPLEMENTATION. +CLASS zcl_abapgit_html_toolbar IMPLEMENTATION. METHOD add. @@ -142,8 +143,8 @@ CLASS ZCL_ABAPGIT_HTML_TOOLBAR IMPLEMENTATION. ro_html->add( |
| ). ro_html->add( '
  • ' ). ro_html->add_a( iv_txt = iv_label - iv_typ = zif_abapgit_definitions=>gc_action_type-dummy - iv_act = '' ). + iv_typ = zif_abapgit_definitions=>gc_action_type-sapevent + iv_act = iv_action ). ro_html->add( '
    ' ). ro_html->add( render_items( iv_sort = iv_sort ) ). ro_html->add( '
' ). diff --git a/src/zabapgit_js_common.w3mi.data.js b/src/zabapgit_js_common.w3mi.data.js index a2cff0744..5a8a73f5f 100644 --- a/src/zabapgit_js_common.w3mi.data.js +++ b/src/zabapgit_js_common.w3mi.data.js @@ -127,6 +127,20 @@ window.onTagTypeChange = function(oSelectObject){ submitSapeventForm({ 'type': sValue }, "change_tag_type", "post"); } +/********************************************************** + * Repo Overview Logic + **********************************************************/ +// somehow only functions on window are visible for the select tag +window.onOrderByChange = function(oSelectObject){ + var sValue = oSelectObject.value; + submitSapeventForm({ 'orderBy': sValue }, "change_order_by", "post"); +} + +window.onDirectionChange = function(oSelectObject){ + var sValue = oSelectObject.value; + submitSapeventForm({ 'direction': sValue }, "direction", "post"); +} + /********************************************************** * STAGE PAGE Logic **********************************************************/ diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 77c6cdc3b..0120a2021 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -424,6 +424,7 @@ INTERFACE zif_abapgit_definitions PUBLIC. go_main TYPE string VALUE 'go_main', go_explore TYPE string VALUE 'go_explore', + go_repo_overview TYPE string VALUE 'go_repo_overview', go_db TYPE string VALUE 'go_db', go_background TYPE string VALUE 'go_background', go_background_run TYPE string VALUE 'go_background_run',