diff --git a/src/persist/zcl_abapgit_persistence_user.clas.abap b/src/persist/zcl_abapgit_persistence_user.clas.abap index 394e89ba0..7856d3a51 100644 --- a/src/persist/zcl_abapgit_persistence_user.clas.abap +++ b/src/persist/zcl_abapgit_persistence_user.clas.abap @@ -34,6 +34,7 @@ CLASS zcl_abapgit_persistence_user DEFINITION repo_show TYPE zif_abapgit_persistence=>ty_repo-key, hide_files TYPE abap_bool, changes_only TYPE abap_bool, + show_order_by TYPE abap_bool, diff_unified TYPE abap_bool, favorites TYPE tt_favorites, repo_config TYPE ty_repo_config_tt, @@ -453,4 +454,25 @@ CLASS ZCL_ABAPGIT_PERSISTENCE_USER IMPLEMENTATION. rv_hide = ls_user-hide_files. ENDMETHOD. + + + METHOD zif_abapgit_persist_user~get_show_order_by. + + rv_show_order_by = read( )-show_order_by. + + ENDMETHOD. + + + METHOD zif_abapgit_persist_user~toggle_show_order_by. + + DATA ls_user TYPE ty_user. + + ls_user = read( ). + ls_user-show_order_by = boolc( ls_user-show_order_by = abap_false ). + update( ls_user ). + + rv_show_order_by = ls_user-show_order_by. + + ENDMETHOD. + ENDCLASS. diff --git a/src/persist/zif_abapgit_persist_user.intf.abap b/src/persist/zif_abapgit_persist_user.intf.abap index 745a65f3a..698bf13d6 100644 --- a/src/persist/zif_abapgit_persist_user.intf.abap +++ b/src/persist/zif_abapgit_persist_user.intf.abap @@ -3,6 +3,11 @@ INTERFACE zif_abapgit_persist_user TYPES tt_favorites TYPE zif_abapgit_persistence=>tt_repo_keys . + METHODS get_show_order_by + RETURNING + VALUE(rv_show_order_by) TYPE abap_bool + RAISING + zcx_abapgit_exception . METHODS get_changes_only RETURNING VALUE(rv_changes_only) TYPE abap_bool @@ -142,6 +147,11 @@ INTERFACE zif_abapgit_persist_user is_user_settings TYPE zif_abapgit_definitions=>ty_s_user_settings RAISING zcx_abapgit_exception. + METHODS toggle_show_order_by + RETURNING + VALUE(rv_show_order_by) TYPE abap_bool + RAISING + zcx_abapgit_exception . ENDINTERFACE. diff --git a/src/ui/zabapgit_css_common.w3mi.data.css b/src/ui/zabapgit_css_common.w3mi.data.css index eec3eb7a6..38da21386 100644 --- a/src/ui/zabapgit_css_common.w3mi.data.css +++ b/src/ui/zabapgit_css_common.w3mi.data.css @@ -184,6 +184,12 @@ table.repo_tab { border-radius: 3px; width: 100%; } +.repo_tab th { + text-align: left; + padding: 0.5em; + border-bottom: 1px solid; + font-weight: normal; +} .repo_tab td { border-top: 1px solid; vertical-align: middle; @@ -201,7 +207,8 @@ table.repo_tab { text-align: left; } .repo_tab td.type { - width: 3em; + width: 4em; + padding-left: 0.5em; } .repo_tab td.object { padding-left: 0.5em; @@ -209,11 +216,14 @@ table.repo_tab { .repo_tab td.files { padding-left: 0.5em; } -.repo_tab td.cmd { +.repo_tab td.cmd, .repo_tab th.cmd { text-align: right; padding-left: 0.5em; padding-right: 0.7em; } +.repo_tab th.cmd .icon{ + padding-right: 8px; +} .repo_tab tr:first-child td { border-top: 0px; } .repo_tab td.cmd span.state-block { margin-left: 1em; diff --git a/src/ui/zabapgit_css_theme_default.w3mi.data.css b/src/ui/zabapgit_css_theme_default.w3mi.data.css index bd3134faa..f54f11989 100644 --- a/src/ui/zabapgit_css_theme_default.w3mi.data.css +++ b/src/ui/zabapgit_css_theme_default.w3mi.data.css @@ -108,6 +108,10 @@ table.repo_tab { border-color: #ddd; background-color: #fff; } +.repo_tab th { + color: #888888; + border-bottom-color: #ddd; +} .repo_tab td { color: #333; border-top-color: var(--theme-table-border-color); @@ -303,7 +307,7 @@ div.tutorial h1, h2 { color: #404040; } /* MENU */ .nav-container ul ul li:hover { background-color: #f6f6f6; } -.nav-container > ul > li:hover > a { background-color: #ffffff80; } +.nav-container > ul > li:hover > a { background-color: #ffffff80; } .nav-container ul ul { background-color: #fff; } .nav-container.corner > ul > li:hover > a { background-color: inherit; } diff --git a/src/ui/zabapgit_js_common.w3mi.data.js b/src/ui/zabapgit_js_common.w3mi.data.js index 29065e9e3..8e922ac3e 100644 --- a/src/ui/zabapgit_js_common.w3mi.data.js +++ b/src/ui/zabapgit_js_common.w3mi.data.js @@ -24,6 +24,7 @@ /* exported addMarginBottom */ /* exported enumerateTocAllRepos */ /* exported enumerateJumpAllFiles */ +/* exported enumerateToolbarActions */ /********************************************************** * Polyfills diff --git a/src/ui/zcl_abapgit_gui_chunk_lib.clas.abap b/src/ui/zcl_abapgit_gui_chunk_lib.clas.abap index 5bd35e34d..ac54df75d 100644 --- a/src/ui/zcl_abapgit_gui_chunk_lib.clas.abap +++ b/src/ui/zcl_abapgit_gui_chunk_lib.clas.abap @@ -5,6 +5,7 @@ CLASS zcl_abapgit_gui_chunk_lib DEFINITION PUBLIC SECTION. + CLASS-METHODS class_constructor. CLASS-METHODS render_error IMPORTING !ix_error TYPE REF TO zcx_abapgit_exception OPTIONAL @@ -61,8 +62,27 @@ CLASS zcl_abapgit_gui_chunk_lib DEFINITION ix_error TYPE REF TO zcx_abapgit_exception RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html. + CLASS-METHODS parse_change_order_by + IMPORTING + iv_query_str TYPE clike + RETURNING + VALUE(rv_order_by) TYPE string. + CLASS-METHODS parse_direction + IMPORTING + iv_query_str TYPE clike + RETURNING + VALUE(rv_order_descending) TYPE abap_bool. + CLASS-METHODS render_order_by_header_cells + IMPORTING + it_col_spec TYPE zif_abapgit_definitions=>tty_col_spec + iv_order_by TYPE string + iv_order_descending TYPE abap_bool + RETURNING + VALUE(ro_html) TYPE REF TO zcl_abapgit_html. + PROTECTED SECTION. PRIVATE SECTION. + CLASS-DATA gv_time_zone TYPE timezone. CLASS-METHODS render_branch_span IMPORTING @@ -96,12 +116,37 @@ CLASS zcl_abapgit_gui_chunk_lib DEFINITION iv_program_name TYPE syrepid RETURNING VALUE(rv_normalized_program_name) TYPE string. + ENDCLASS. CLASS zcl_abapgit_gui_chunk_lib IMPLEMENTATION. + METHOD class_constructor. + + CALL FUNCTION 'GET_SYSTEM_TIMEZONE' + IMPORTING + timezone = gv_time_zone + EXCEPTIONS + customizing_missing = 1 + OTHERS = 2. + ASSERT sy-subrc = 0. + + ENDMETHOD. + + + METHOD get_t100_text. + + SELECT SINGLE text + FROM t100 + INTO rv_text + WHERE arbgb = iv_msgid + AND msgnr = iv_msgno + AND sprsl = sy-langu. + + ENDMETHOD. + METHOD normalize_program_name. @@ -112,6 +157,30 @@ CLASS zcl_abapgit_gui_chunk_lib IMPLEMENTATION. ENDMETHOD. + METHOD parse_change_order_by. + + FIND FIRST OCCURRENCE OF REGEX `orderBy=(.*)` + IN iv_query_str + SUBMATCHES rv_order_by. + + rv_order_by = condense( rv_order_by ). + + ENDMETHOD. + + + METHOD parse_direction. + + DATA: lv_direction TYPE string. + + FIND FIRST OCCURRENCE OF REGEX `direction=(.*)` + IN iv_query_str + SUBMATCHES lv_direction. + + rv_order_descending = boolc( condense( lv_direction ) = 'DESCENDING' ). + + ENDMETHOD. + + METHOD render_branch_span. DATA: lv_text TYPE string, @@ -139,6 +208,65 @@ CLASS zcl_abapgit_gui_chunk_lib IMPLEMENTATION. ENDMETHOD. + METHOD render_order_by_header_cells. + + DATA: + lt_colspec TYPE zif_abapgit_definitions=>tty_col_spec, + lv_tmp TYPE string, + lv_disp_name TYPE string. + + FIELD-SYMBOLS LIKE LINE OF lt_colspec. + + CREATE OBJECT ro_html. + + LOOP AT it_col_spec ASSIGNING . + " e.g. Created at [{ gv_time_zone }] + lv_tmp = '-css_class IS NOT INITIAL. + lv_tmp = lv_tmp && | class="{ -css_class }"|. + ENDIF. + lv_tmp = lv_tmp && '>'. + + IF -display_name IS NOT INITIAL. + lv_disp_name = -display_name. + IF -add_tz = abap_true. + lv_disp_name = lv_disp_name && | [{ gv_time_zone }]|. + ENDIF. + IF -tech_name = iv_order_by. + IF iv_order_descending = abap_true. + lv_tmp = lv_tmp && zcl_abapgit_html=>a( + iv_txt = lv_disp_name + iv_act = |{ zif_abapgit_definitions=>c_action-direction }?direction=ASCENDING| + iv_title = -title ). + ELSE. + lv_tmp = lv_tmp && zcl_abapgit_html=>a( + iv_txt = lv_disp_name + iv_act = |{ zif_abapgit_definitions=>c_action-direction }?direction=DESCENDING| + iv_title = -title ). + ENDIF. + ELSE. + lv_tmp = lv_tmp && zcl_abapgit_html=>a( + iv_txt = lv_disp_name + iv_act = |{ zif_abapgit_definitions=>c_action-change_order_by }?orderBy={ -tech_name }| + iv_title = -title ). + ENDIF. + ENDIF. + IF -tech_name = iv_order_by + AND iv_order_by IS NOT INITIAL. + IF iv_order_descending = abap_true. + lv_tmp = lv_tmp && | ▴|. " arrow up + ELSE. + lv_tmp = lv_tmp && | ▾|. " arrow down + ENDIF. + ENDIF. + + lv_tmp = lv_tmp && ''. + ro_html->add( lv_tmp ). + ENDLOOP. + + ENDMETHOD. + + METHOD render_commit_popup. CREATE OBJECT ro_html. @@ -594,16 +722,4 @@ CLASS zcl_abapgit_gui_chunk_lib IMPLEMENTATION. ro_html->add( '' ). ENDMETHOD. - - METHOD get_t100_text. - - SELECT SINGLE text - FROM t100 - INTO rv_text - WHERE arbgb = iv_msgid - AND msgnr = iv_msgno - AND sprsl = sy-langu. - - ENDMETHOD. - ENDCLASS. diff --git a/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap b/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap index df845f812..6a7efa957 100644 --- a/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_repo_over.clas.abap @@ -33,10 +33,8 @@ CLASS zcl_abapgit_gui_page_repo_over DEFINITION WITH NON-UNIQUE DEFAULT KEY. CONSTANTS: BEGIN OF c_action, - 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', + select TYPE string VALUE 'select', + apply_filter TYPE string VALUE 'apply_filter', END OF c_action . DATA: @@ -53,22 +51,10 @@ CLASS zcl_abapgit_gui_page_repo_over DEFINITION iv_max_length TYPE string OPTIONAL RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html, - parse_change_order_by - IMPORTING - iv_query_str TYPE clike, - - parse_direction - IMPORTING - iv_query_str TYPE clike, - parse_filter IMPORTING it_postdata TYPE cnht_post_data_tab, - 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, @@ -97,13 +83,16 @@ CLASS zcl_abapgit_gui_page_repo_over DEFINITION render_header_bar IMPORTING - io_html TYPE REF TO zcl_abapgit_html. + io_html TYPE REF TO zcl_abapgit_html, + + apply_order_by + CHANGING ct_overview TYPE zcl_abapgit_gui_page_repo_over=>tty_overview. ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_OVER IMPLEMENTATION. +CLASS zcl_abapgit_gui_page_repo_over IMPLEMENTATION. METHOD apply_filter. @@ -125,25 +114,6 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_OVER IMPLEMENTATION. 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( ). @@ -213,30 +183,6 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_OVER IMPLEMENTATION. ENDMETHOD. - METHOD parse_change_order_by. - - FIND FIRST OCCURRENCE OF REGEX `orderBy=(.*)` - IN iv_query_str - SUBMATCHES mv_order_by. - - mv_order_by = condense( mv_order_by ). - - ENDMETHOD. - - - METHOD parse_direction. - - DATA: lv_direction TYPE string. - - FIND FIRST OCCURRENCE OF REGEX `direction=(.*)` - IN iv_query_str - SUBMATCHES lv_direction. - - mv_order_descending = boolc( condense( lv_direction ) = 'DESCENDING' ). - - ENDMETHOD. - - METHOD parse_filter. FIELD-SYMBOLS: LIKE LINE OF it_postdata. @@ -258,7 +204,6 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_OVER IMPLEMENTATION. DATA: lt_overview TYPE tty_overview. - lt_overview = map_repo_list_to_overview( zcl_abapgit_persist_factory=>get_repo( )->list( ) ). @@ -280,6 +225,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_OVER IMPLEMENTATION. io_html->add( |
| ). io_html->add( |
| ). + io_html->add( render_text_input( iv_name = |filter| iv_label = |Filter: | @@ -315,8 +261,8 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_OVER IMPLEMENTATION. METHOD render_table_body. DATA: - lv_type_icon TYPE string, - lv_favorite_icon TYPE string. + lv_type_icon TYPE string, + lv_favorite_icon TYPE string. FIELD-SYMBOLS: LIKE LINE OF it_overview. @@ -374,21 +320,11 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_OVER IMPLEMENTATION. METHOD render_table_header. - TYPES: - BEGIN OF lty_col_spec, - tech_name TYPE string, - display_name TYPE string, - css_class TYPE string, - add_tz TYPE abap_bool, - END OF lty_col_spec. - DATA lt_colspec TYPE STANDARD TABLE OF lty_col_spec. - DATA lv_tmp TYPE string. - DATA lv_disp_name TYPE string. - - FIELD-SYMBOLS LIKE LINE OF lt_colspec. + DATA lt_col_spec TYPE zif_abapgit_definitions=>tty_col_spec. + FIELD-SYMBOLS LIKE LINE OF lt_col_spec. DEFINE _add_col. - APPEND INITIAL LINE TO lt_colspec ASSIGNING . + APPEND INITIAL LINE TO lt_col_spec ASSIGNING . -tech_name = &1. -display_name = &2. -css_class = &3. @@ -408,50 +344,13 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_OVER IMPLEMENTATION. _add_col 'CREATED_AT' 'Created at' 'ro-detail' 'X'. _add_col 'KEY' 'Key' 'ro-detail' ''. - io_html->add( || ). io_html->add( || ). - LOOP AT lt_colspec ASSIGNING . - " e.g. Created at [{ mv_time_zone }] - lv_tmp = '-css_class IS NOT INITIAL. - lv_tmp = lv_tmp && | class="{ -css_class }"|. - ENDIF. - lv_tmp = lv_tmp && '>'. - - IF -display_name IS NOT INITIAL. - lv_disp_name = -display_name. - IF -add_tz = abap_true. - lv_disp_name = lv_disp_name && | [{ mv_time_zone }]|. - ENDIF. - IF -tech_name = mv_order_by. - IF mv_order_descending = abap_true. - lv_tmp = lv_tmp && zcl_abapgit_html=>a( - iv_txt = lv_disp_name - iv_act = |{ c_action-direction }?direction=ASCENDING| ). - ELSE. - lv_tmp = lv_tmp && zcl_abapgit_html=>a( - iv_txt = lv_disp_name - iv_act = |{ c_action-direction }?direction=DESCENDING| ). - ENDIF. - ELSE. - lv_tmp = lv_tmp && zcl_abapgit_html=>a( - iv_txt = lv_disp_name - iv_act = |{ c_action-change_order_by }?orderBy={ -tech_name }| ). - ENDIF. - ENDIF. - IF -tech_name = mv_order_by. - IF mv_order_descending = abap_true. - lv_tmp = lv_tmp && | ▴|. " arrow up - ELSE. - lv_tmp = lv_tmp && | ▾|. " arrow down - ENDIF. - ENDIF. - - lv_tmp = lv_tmp && ''. - io_html->add( lv_tmp ). - ENDLOOP. + io_html->add( zcl_abapgit_gui_chunk_lib=>render_order_by_header_cells( + it_col_spec = lt_col_spec + iv_order_by = mv_order_by + iv_order_descending = mv_order_descending ) ). io_html->add( '' ). io_html->add( '' ). @@ -507,15 +406,14 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_OVER IMPLEMENTATION. ev_state = zcl_abapgit_gui=>c_event_state-go_back. - WHEN c_action-change_order_by. + WHEN zif_abapgit_definitions=>c_action-change_order_by. - CLEAR mv_order_descending. - parse_change_order_by( iv_getdata ). + mv_order_by = zcl_abapgit_gui_chunk_lib=>parse_change_order_by( iv_getdata ). ev_state = zcl_abapgit_gui=>c_event_state-re_render. - WHEN c_action-direction. + WHEN zif_abapgit_definitions=>c_action-direction. - parse_direction( iv_getdata ). + mv_order_descending = zcl_abapgit_gui_chunk_lib=>parse_direction( iv_getdata ). ev_state = zcl_abapgit_gui=>c_event_state-re_render. WHEN c_action-apply_filter. @@ -538,4 +436,23 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_OVER IMPLEMENTATION. ENDCASE. 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. + ENDCLASS. diff --git a/src/ui/zcl_abapgit_gui_view_repo.clas.abap b/src/ui/zcl_abapgit_gui_view_repo.clas.abap index a05db8efc..037cb663f 100644 --- a/src/ui/zcl_abapgit_gui_view_repo.clas.abap +++ b/src/ui/zcl_abapgit_gui_view_repo.clas.abap @@ -18,9 +18,10 @@ CLASS zcl_abapgit_gui_view_repo DEFINITION toggle_hide_files TYPE string VALUE 'toggle_hide_files' ##NO_TEXT, toggle_folders TYPE string VALUE 'toggle_folders' ##NO_TEXT, toggle_changes TYPE string VALUE 'toggle_changes' ##NO_TEXT, + toggle_order_by TYPE string VALUE 'toggle_order_by' ##NO_TEXT, + toggle_diff_first TYPE string VALUE 'toggle_diff_first ' ##NO_TEXT, display_more TYPE string VALUE 'display_more' ##NO_TEXT, END OF c_actions . - METHODS constructor IMPORTING !iv_key TYPE zif_abapgit_persistence=>ty_repo-key @@ -30,13 +31,17 @@ CLASS zcl_abapgit_gui_view_repo DEFINITION PROTECTED SECTION. PRIVATE SECTION. - DATA: mo_repo TYPE REF TO zcl_abapgit_repo, - mv_cur_dir TYPE string, - mv_hide_files TYPE abap_bool, - mv_max_lines TYPE i, - mv_max_setting TYPE i, - mv_show_folders TYPE abap_bool, - mv_changes_only TYPE abap_bool. + DATA: mo_repo TYPE REF TO zcl_abapgit_repo, + mv_cur_dir TYPE string, + mv_hide_files TYPE abap_bool, + mv_max_lines TYPE i, + mv_max_setting TYPE i, + mv_show_folders TYPE abap_bool, + mv_changes_only TYPE abap_bool, + mv_show_order_by TYPE abap_bool, + mv_order_by TYPE string, + mv_order_descending TYPE abap_bool, + mv_diff_first TYPE abap_bool. METHODS: render_head_line @@ -89,13 +94,17 @@ CLASS zcl_abapgit_gui_view_repo DEFINITION IMPORTING is_item TYPE zif_abapgit_definitions=>ty_repo_item RETURNING VALUE(rv_inactive_html_code) TYPE string, open_in_master_language - RAISING zcx_abapgit_exception. + RAISING zcx_abapgit_exception, + render_order_by + RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html, + apply_order_by + CHANGING ct_repo_items TYPE zif_abapgit_definitions=>tt_repo_items. ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_VIEW_REPO IMPLEMENTATION. +CLASS zcl_abapgit_gui_view_repo IMPLEMENTATION. METHOD build_dir_jump_link. @@ -134,6 +143,11 @@ CLASS ZCL_ABAPGIT_GUI_VIEW_REPO IMPLEMENTATION. iv_chk = mv_show_folders iv_act = c_actions-toggle_folders ). + ro_toolbar->add( + iv_txt = 'Show order by' + iv_chk = mv_show_order_by + iv_act = c_actions-toggle_order_by ). + ENDMETHOD. @@ -335,10 +349,12 @@ CLASS ZCL_ABAPGIT_GUI_VIEW_REPO IMPLEMENTATION. super->constructor( ). - mo_repo = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). - mv_cur_dir = '/'. " Root - mv_hide_files = zcl_abapgit_persistence_user=>get_instance( )->get_hide_files( ). - mv_changes_only = zcl_abapgit_persistence_user=>get_instance( )->get_changes_only( ). + mo_repo = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). + mv_cur_dir = '/'. " Root + mv_hide_files = zcl_abapgit_persistence_user=>get_instance( )->get_hide_files( ). + mv_changes_only = zcl_abapgit_persistence_user=>get_instance( )->get_changes_only( ). + mv_show_order_by = zcl_abapgit_persistence_user=>get_instance( )->get_show_order_by( ). + mv_diff_first = abap_true. " Read global settings to get max # of objects to be listed lo_settings = zcl_abapgit_persist_settings=>get_instance( )->read( ). @@ -681,9 +697,21 @@ CLASS ZCL_ABAPGIT_GUI_VIEW_REPO IMPLEMENTATION. WHEN c_actions-toggle_changes. " Toggle changes only view mv_changes_only = zcl_abapgit_persistence_user=>get_instance( )->toggle_changes_only( ). ev_state = zcl_abapgit_gui=>c_event_state-re_render. + WHEN c_actions-toggle_order_by. + mv_show_order_by = zcl_abapgit_persistence_user=>get_instance( )->toggle_show_order_by( ). + ev_state = zcl_abapgit_gui=>c_event_state-re_render. + WHEN c_actions-toggle_diff_first. + mv_diff_first = boolc( mv_diff_first = abap_false ). + ev_state = zcl_abapgit_gui=>c_event_state-re_render. WHEN c_actions-display_more. " Increase MAX lines limit mv_max_lines = mv_max_lines + mv_max_setting. ev_state = zcl_abapgit_gui=>c_event_state-re_render. + WHEN zif_abapgit_definitions=>c_action-change_order_by. + mv_order_by = zcl_abapgit_gui_chunk_lib=>parse_change_order_by( iv_getdata ). + ev_state = zcl_abapgit_gui=>c_event_state-re_render. + WHEN zif_abapgit_definitions=>c_action-direction. + mv_order_descending = zcl_abapgit_gui_chunk_lib=>parse_direction( iv_getdata ). + ev_state = zcl_abapgit_gui=>c_event_state-re_render. WHEN zif_abapgit_definitions=>c_action-repo_open_in_master_lang. open_in_master_language( ). ev_state = zcl_abapgit_gui=>c_event_state-re_render. @@ -731,6 +759,10 @@ CLASS ZCL_ABAPGIT_GUI_VIEW_REPO IMPLEMENTATION. iv_by_folders = mv_show_folders iv_changes_only = mv_changes_only ). + IF mv_show_order_by = abap_true. + apply_order_by( CHANGING ct_repo_items = lt_repo_items ). + ENDIF. + LOOP AT lt_repo_items ASSIGNING . zcl_abapgit_state=>reduce( EXPORTING iv_cur = -lstate CHANGING cv_prev = lv_lstate ). @@ -767,6 +799,10 @@ CLASS ZCL_ABAPGIT_GUI_VIEW_REPO IMPLEMENTATION. ro_html->add( render_parent_dir( ) ). ENDIF. + IF mv_show_order_by = abap_true. + ro_html->add( render_order_by( ) ). + ENDIF. + IF lines( lt_repo_items ) = 0. ro_html->add( render_empty_package( ) ). ELSE. @@ -805,4 +841,113 @@ CLASS ZCL_ABAPGIT_GUI_VIEW_REPO IMPLEMENTATION. ENDTRY. ENDMETHOD. + + + METHOD render_order_by. + + DATA: + lt_col_spec TYPE zif_abapgit_definitions=>tty_col_spec, + lv_icon TYPE string, + lv_html TYPE string. + FIELD-SYMBOLS LIKE LINE OF lt_col_spec. + + DEFINE _add_col. + APPEND INITIAL LINE TO lt_col_spec ASSIGNING . + -tech_name = &1. + -display_name = &2. + -css_class = &3. + -add_tz = &4. + -title = &5. + END-OF-DEFINITION. + + CREATE OBJECT ro_html. + + " technical name display name css class add timezone title + _add_col '' '' '' '' ''. + _add_col 'OBJ_TYPE' 'Type' '' '' ''. + _add_col 'OBJ_NAME' 'Name' '' '' ''. + _add_col 'PATH' 'Path' '' '' ''. + + ro_html->add( || ). + ro_html->add( || ). + + ro_html->add( zcl_abapgit_gui_chunk_lib=>render_order_by_header_cells( + it_col_spec = lt_col_spec + iv_order_by = mv_order_by + iv_order_descending = mv_order_descending ) ). + + IF mv_diff_first = abap_true. + lv_icon = 'check/blue'. + ELSE. + lv_icon = 'check/grey'. + ENDIF. + + lv_html = || + && zcl_abapgit_html=>icon( lv_icon ) + && zcl_abapgit_html=>a( + iv_txt = |diffs first| + iv_act = c_actions-toggle_diff_first ). + + ro_html->add( lv_html ). + + ro_html->add( '' ). + ro_html->add( '' ). + + ENDMETHOD. + + + METHOD apply_order_by. + + DATA: + lt_sort TYPE abap_sortorder_tab, + ls_sort LIKE LINE OF lt_sort, + lt_non_code_and_metadata_items LIKE ct_repo_items, + lt_code_items LIKE ct_repo_items, + lt_diff_items LIKE ct_repo_items. + + FIELD-SYMBOLS: + TYPE zif_abapgit_definitions=>ty_repo_item. + + IF mv_order_by IS INITIAL. + RETURN. + ENDIF. + + " we want to preserve non-code and metadata files at the top, + " so we isolate them and and sort only the code artifacts + LOOP AT ct_repo_items ASSIGNING . + + IF -obj_type IS INITIAL + AND -is_dir = abap_false. + INSERT INTO TABLE lt_non_code_and_metadata_items. + ELSE. + INSERT INTO TABLE lt_code_items. + ENDIF. + + ENDLOOP. + + IF mv_diff_first = abap_true. + " fix diffs on the top, right after non-code and metadata + LOOP AT lt_code_items ASSIGNING + WHERE changes > 0. + INSERT INTO TABLE lt_diff_items. + ENDLOOP. + + DELETE lt_code_items WHERE changes > 0. + ENDIF. + + CLEAR: ct_repo_items. + + 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 lt_code_items BY (lt_sort). + SORT lt_diff_items BY (lt_sort). + + INSERT LINES OF lt_non_code_and_metadata_items INTO TABLE ct_repo_items. + INSERT LINES OF lt_diff_items INTO TABLE ct_repo_items. + INSERT LINES OF lt_code_items INTO TABLE ct_repo_items. + + ENDMETHOD. + ENDCLASS. diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 1ba7821be..d476cca03 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -350,6 +350,17 @@ INTERFACE zif_abapgit_definitions tty_lines TYPE STANDARD TABLE OF i WITH NON-UNIQUE DEFAULT KEY . + TYPES: + BEGIN OF ty_col_spec, + tech_name TYPE string, + display_name TYPE string, + css_class TYPE string, + add_tz TYPE abap_bool, + title TYPE string, + END OF ty_col_spec, + tty_col_spec TYPE STANDARD TABLE OF ty_col_spec + WITH NON-UNIQUE KEY tech_name. + CONSTANTS: BEGIN OF c_git_branch_type, branch TYPE ty_git_branch_type VALUE 'HD', @@ -450,6 +461,8 @@ INTERFACE zif_abapgit_definitions goto_source TYPE string VALUE 'goto_source', show_callstack TYPE string VALUE 'show_callstack', goto_message TYPE string VALUE 'goto_message', + change_order_by TYPE string VALUE 'change_order_by', + direction TYPE string VALUE 'direction', END OF c_action . CONSTANTS c_tag_prefix TYPE string VALUE 'refs/tags/' ##NO_TEXT. CONSTANTS c_spagpa_param_repo_key TYPE char20 VALUE 'REPO_KEY' ##NO_TEXT.