Order by on repo page (#2933)

* Order by on repo page

* move render_cols_pec to zcl_abapgit_gui_chunk_lib

* cleanup

* cleanup

* first new working version

* fix lint

* add OrderByHelper

* add new feature clear

* rename ICON to CLEAR

* cleanup

* refactor actions

* fix typo in method name

* remove duplication

* rename render_col_spec to render_order_by_table_he

* refactor type

* fix eslint warning

* isoltate repo_tab CSS

* fix non-code and metadata files at the top

* refactor

* cleanup

* new features "diffs first" + remove clear

* refactor

* take directories into account

* cleanup
This commit is contained in:
Christian Günter 2019-10-06 07:54:04 +02:00 committed by Lars Hvam
parent 67ebff3b7c
commit 3905c67edd
9 changed files with 390 additions and 152 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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;

View File

@ -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; }

View File

@ -24,6 +24,7 @@
/* exported addMarginBottom */
/* exported enumerateTocAllRepos */
/* exported enumerateJumpAllFiles */
/* exported enumerateToolbarActions */
/**********************************************************
* Polyfills

View File

@ -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 <ls_col> LIKE LINE OF lt_colspec.
CREATE OBJECT ro_html.
LOOP AT it_col_spec ASSIGNING <ls_col>.
" e.g. <th class="ro-detail">Created at [{ gv_time_zone }]</th>
lv_tmp = '<th'.
IF <ls_col>-css_class IS NOT INITIAL.
lv_tmp = lv_tmp && | class="{ <ls_col>-css_class }"|.
ENDIF.
lv_tmp = lv_tmp && '>'.
IF <ls_col>-display_name IS NOT INITIAL.
lv_disp_name = <ls_col>-display_name.
IF <ls_col>-add_tz = abap_true.
lv_disp_name = lv_disp_name && | [{ gv_time_zone }]|.
ENDIF.
IF <ls_col>-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 = <ls_col>-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 = <ls_col>-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={ <ls_col>-tech_name }|
iv_title = <ls_col>-title ).
ENDIF.
ENDIF.
IF <ls_col>-tech_name = iv_order_by
AND iv_order_by IS NOT INITIAL.
IF iv_order_descending = abap_true.
lv_tmp = lv_tmp && | &#x25B4;|. " arrow up
ELSE.
lv_tmp = lv_tmp && | &#x25BE;|. " arrow down
ENDIF.
ENDIF.
lv_tmp = lv_tmp && '</th>'.
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( '</tr></table>' ).
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.

View File

@ -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: <lv_postdata> 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( |<div class="form-container">| ).
io_html->add( |<form class="inline" method="post" action="sapevent:{ c_action-apply_filter }">| ).
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: <ls_overview> 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 <ls_col> LIKE LINE OF lt_colspec.
DATA lt_col_spec TYPE zif_abapgit_definitions=>tty_col_spec.
FIELD-SYMBOLS <ls_col> LIKE LINE OF lt_col_spec.
DEFINE _add_col.
APPEND INITIAL LINE TO lt_colspec ASSIGNING <ls_col>.
APPEND INITIAL LINE TO lt_col_spec ASSIGNING <ls_col>.
<ls_col>-tech_name = &1.
<ls_col>-display_name = &2.
<ls_col>-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( |<thead>| ).
io_html->add( |<tr>| ).
LOOP AT lt_colspec ASSIGNING <ls_col>.
" e.g. <th class="ro-detail">Created at [{ mv_time_zone }]</th>
lv_tmp = '<th'.
IF <ls_col>-css_class IS NOT INITIAL.
lv_tmp = lv_tmp && | class="{ <ls_col>-css_class }"|.
ENDIF.
lv_tmp = lv_tmp && '>'.
IF <ls_col>-display_name IS NOT INITIAL.
lv_disp_name = <ls_col>-display_name.
IF <ls_col>-add_tz = abap_true.
lv_disp_name = lv_disp_name && | [{ mv_time_zone }]|.
ENDIF.
IF <ls_col>-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={ <ls_col>-tech_name }| ).
ENDIF.
ENDIF.
IF <ls_col>-tech_name = mv_order_by.
IF mv_order_descending = abap_true.
lv_tmp = lv_tmp && | &#x25B4;|. " arrow up
ELSE.
lv_tmp = lv_tmp && | &#x25BE;|. " arrow down
ENDIF.
ENDIF.
lv_tmp = lv_tmp && '</th>'.
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( '</tr>' ).
io_html->add( '</thead>' ).
@ -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.

View File

@ -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 <ls_item>.
zcl_abapgit_state=>reduce( EXPORTING iv_cur = <ls_item>-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 <ls_col> LIKE LINE OF lt_col_spec.
DEFINE _add_col.
APPEND INITIAL LINE TO lt_col_spec ASSIGNING <ls_col>.
<ls_col>-tech_name = &1.
<ls_col>-display_name = &2.
<ls_col>-css_class = &3.
<ls_col>-add_tz = &4.
<ls_col>-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( |<thead>| ).
ro_html->add( |<tr>| ).
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 = |<th class="cmd">|
&& 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( '</tr>' ).
ro_html->add( '</thead>' ).
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:
<ls_repo_item> 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 <ls_repo_item>.
IF <ls_repo_item>-obj_type IS INITIAL
AND <ls_repo_item>-is_dir = abap_false.
INSERT <ls_repo_item> INTO TABLE lt_non_code_and_metadata_items.
ELSE.
INSERT <ls_repo_item> 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 <ls_repo_item>
WHERE changes > 0.
INSERT <ls_repo_item> 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.

View File

@ -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.