From e74d40516c13d40158cfff35276e73d2d77911b8 Mon Sep 17 00:00:00 2001 From: Eduardo Ferrari Copat Date: Fri, 13 Mar 2020 05:09:00 +1300 Subject: [PATCH] Diff - Add option to collapse files (#3248) * Update zcl_abapgit_gui_page_diff.clas.abap * Update zcl_abapgit_gui_page_diff.clas.abap * Update zabapgit_css_common.w3mi.data.css * Update zabapgit_css_common.w3mi.data.css * test * Update zabapgit_css_theme_default.w3mi.data.css * Add collapse to css * Add user select * onDiffCollapse * show source * src * Tries text * hide/show * uses nodisplay instead of hidden * good hide * === * Add button * lint * lint * set function as global * lint * Exclude gui page diff * remove extra space * chevron * pointer * class * Icons * lint * lint * hide Co-authored-by: Lars Hvam --- src/ui/core/zcl_abapgit_html.clas.abap | 23 +++++++----- src/ui/core/zif_abapgit_html.intf.abap | 1 + src/ui/zabapgit_css_common.w3mi.data.css | 4 +++ src/ui/zabapgit_icon_font.w3mi.data.woff | Bin 3392 -> 3568 bytes src/ui/zabapgit_icon_font_css.w3mi.data.css | 38 +++++++++++--------- src/ui/zabapgit_js_common.w3mi.data.js | 20 +++++++++++ src/ui/zcl_abapgit_gui_page_diff.clas.abap | 8 ++++- 7 files changed, 68 insertions(+), 26 deletions(-) diff --git a/src/ui/core/zcl_abapgit_html.clas.abap b/src/ui/core/zcl_abapgit_html.clas.abap index 8719b35ba..a3766b678 100644 --- a/src/ui/core/zcl_abapgit_html.clas.abap +++ b/src/ui/core/zcl_abapgit_html.clas.abap @@ -19,9 +19,10 @@ CLASS zcl_abapgit_html DEFINITION CLASS-METHODS class_constructor. METHODS add_icon IMPORTING - !iv_name TYPE string - !iv_hint TYPE string OPTIONAL - !iv_class TYPE string OPTIONAL. + !iv_name TYPE string + !iv_hint TYPE string OPTIONAL + !iv_class TYPE string OPTIONAL + !iv_onclick TYPE string OPTIONAL. PROTECTED SECTION. PRIVATE SECTION. CLASS-DATA: go_single_tags_re TYPE REF TO cl_abap_regex. @@ -76,9 +77,10 @@ CLASS zcl_abapgit_html IMPLEMENTATION. METHOD add_icon. - add( icon( iv_name = iv_name - iv_class = iv_class - iv_hint = iv_hint ) ). + add( icon( iv_name = iv_name + iv_class = iv_class + iv_hint = iv_hint + iv_onclick = iv_onclick ) ). ENDMETHOD. @@ -329,13 +331,17 @@ CLASS zcl_abapgit_html IMPLEMENTATION. lv_color TYPE string, lv_class TYPE string, lv_large_icon TYPE string, - lv_xpixel TYPE i. + lv_xpixel TYPE i, + lv_onclick TYPE string. SPLIT iv_name AT '/' INTO lv_name lv_color. IF iv_hint IS NOT INITIAL. lv_hint = | title="{ iv_hint }"|. ENDIF. + IF iv_onclick IS NOT INITIAL. + lv_onclick = | onclick="{ iv_onclick }"|. + ENDIF. IF iv_class IS NOT INITIAL. lv_class = | { iv_class }|. ENDIF. @@ -348,7 +354,8 @@ CLASS zcl_abapgit_html IMPLEMENTATION. lv_large_icon = ' large'. ENDIF. - rv_str = ||. + rv_str = ||. ENDMETHOD. diff --git a/src/ui/core/zif_abapgit_html.intf.abap b/src/ui/core/zif_abapgit_html.intf.abap index 369322084..7657fc882 100644 --- a/src/ui/core/zif_abapgit_html.intf.abap +++ b/src/ui/core/zif_abapgit_html.intf.abap @@ -57,6 +57,7 @@ INTERFACE zif_abapgit_html PUBLIC. !iv_name TYPE string !iv_hint TYPE string OPTIONAL !iv_class TYPE string OPTIONAL + !iv_onclick TYPE string OPTIONAL RETURNING VALUE(rv_str) TYPE string . diff --git a/src/ui/zabapgit_css_common.w3mi.data.css b/src/ui/zabapgit_css_common.w3mi.data.css index 1bc27f6fd..30129cc93 100644 --- a/src/ui/zabapgit_css_common.w3mi.data.css +++ b/src/ui/zabapgit_css_common.w3mi.data.css @@ -36,6 +36,10 @@ input:focus, textarea:focus { border: 1px solid; } +.cursor-pointer { + cursor: pointer; +} + /* MODIFIERS */ .emphasis { font-weight: bold !important; } .crossout { text-decoration: line-through !important; } diff --git a/src/ui/zabapgit_icon_font.w3mi.data.woff b/src/ui/zabapgit_icon_font.w3mi.data.woff index 0902f124c8e04a895ef55300728528833701d6cf..b36876a5a5245c4c593f4c6e235c33eec1e85737 100644 GIT binary patch delta 3119 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 J9~P2h8UT`-(D48O delta 2957 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 D%#wKv diff --git a/src/ui/zabapgit_icon_font_css.w3mi.data.css b/src/ui/zabapgit_icon_font_css.w3mi.data.css index ac505fa49..2fb07f2f4 100644 --- a/src/ui/zabapgit_icon_font_css.w3mi.data.css +++ b/src/ui/zabapgit_icon_font_css.w3mi.data.css @@ -33,20 +33,24 @@ .icon-box:before { content: "\f104"; } .icon-briefcase:before { content: "\f105"; } .icon-check:before { content: "\f106"; } -.icon-cloud-upload-alt:before { content: "\f107"; } -.icon-code-branch:before { content: "\f108"; } -.icon-code-commit:before { content: "\f109"; } -.icon-cog:before { content: "\f10a"; } -.icon-exclamation-circle:before { content: "\f10b"; } -.icon-exclamation-triangle:before { content: "\f10c"; } -.icon-file-alt:before { content: "\f10d"; } -.icon-file-code:before { content: "\f10e"; } -.icon-file-image:before { content: "\f10f"; } -.icon-file:before { content: "\f110"; } -.icon-fire-alt:before { content: "\f111"; } -.icon-folder:before { content: "\f112"; } -.icon-lock:before { content: "\f113"; } -.icon-plug:before { content: "\f114"; } -.icon-sliders-h:before { content: "\f115"; } -.icon-snowflake:before { content: "\f116"; } -.icon-star:before { content: "\f117"; } +.icon-chevron-down:before { content: "\f107"; } +.icon-chevron-left:before { content: "\f108"; } +.icon-chevron-right:before { content: "\f109"; } +.icon-chevron-up:before { content: "\f10a"; } +.icon-cloud-upload-alt:before { content: "\f10b"; } +.icon-code-branch:before { content: "\f10c"; } +.icon-code-commit:before { content: "\f10d"; } +.icon-cog:before { content: "\f10e"; } +.icon-exclamation-circle:before { content: "\f10f"; } +.icon-exclamation-triangle:before { content: "\f110"; } +.icon-file-alt:before { content: "\f111"; } +.icon-file-code:before { content: "\f112"; } +.icon-file-image:before { content: "\f113"; } +.icon-file:before { content: "\f114"; } +.icon-fire-alt:before { content: "\f115"; } +.icon-folder:before { content: "\f116"; } +.icon-lock:before { content: "\f117"; } +.icon-plug:before { content: "\f118"; } +.icon-sliders-h:before { content: "\f119"; } +.icon-snowflake:before { content: "\f11a"; } +.icon-star:before { content: "\f11b"; } diff --git a/src/ui/zabapgit_js_common.w3mi.data.js b/src/ui/zabapgit_js_common.w3mi.data.js index 194ff9d42..466187d3e 100644 --- a/src/ui/zabapgit_js_common.w3mi.data.js +++ b/src/ui/zabapgit_js_common.w3mi.data.js @@ -25,6 +25,7 @@ /* exported enumerateTocAllRepos */ /* exported enumerateJumpAllFiles */ /* exported enumerateToolbarActions */ +/* exported onDiffCollapse */ /********************************************************** * Polyfills @@ -765,6 +766,25 @@ DiffHelper.prototype.highlightButton = function(state) { } }; +//Collapse/Expand diffs +function onDiffCollapse(event) { + var source = event.target || event.srcElement; + var nextDiffContent = source.parentElement.nextElementSibling; + var hide; + + if(source.classList.contains("icon-chevron-down")){ + source.classList.remove("icon-chevron-down"); + source.classList.add("icon-chevron-right"); + hide = true; + } else { + source.classList.remove("icon-chevron-right"); + source.classList.add("icon-chevron-down"); + hide = false; + } + + hide ? nextDiffContent.classList.add("nodisplay") : nextDiffContent.classList.remove("nodisplay"); +} + // Add Bottom margin, so that we can scroll to the top of the last file function addMarginBottom(){ document.getElementsByTagName("body")[0].style.marginBottom = screen.height + "px"; diff --git a/src/ui/zcl_abapgit_gui_page_diff.clas.abap b/src/ui/zcl_abapgit_gui_page_diff.clas.abap index 321cba621..85f96b33f 100644 --- a/src/ui/zcl_abapgit_gui_page_diff.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_diff.clas.abap @@ -218,7 +218,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_DIFF IMPLEMENTATION. +CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION. METHOD add_filter_sub_menu. @@ -826,6 +826,12 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DIFF IMPLEMENTATION. ro_html->add( '
' ). "#EC NOTEXT + ro_html->add_icon( + iv_name = 'chevron-down' + iv_hint = 'Collapse/Expand' + iv_class = 'cursor-pointer' + iv_onclick = 'onDiffCollapse(event)' ). + IF is_diff-type <> 'binary'. ls_stats = is_diff-o_diff->stats( ). IF is_diff-fstate = c_fstate-both. " Merge stats into 'update' if both were changed