From 63a71f15fbd06ba7ae74c907c0a5f4cbe285f26e Mon Sep 17 00:00:00 2001 From: Alexander Tsybulsky Date: Sat, 4 Mar 2017 08:15:30 +0200 Subject: [PATCH] page_diff UX filter part1 --- src/zabapgit_css_common.w3mi.data.css | 10 ++++ src/zabapgit_html.prog.abap | 21 ++++--- src/zabapgit_js_common.w3mi.data.js | 57 ++++++++++++++++++ src/zabapgit_page_diff.prog.abap | 84 ++++++++++++++++++++++++--- src/zabapgit_page_main.prog.abap | 1 - 5 files changed, 158 insertions(+), 15 deletions(-) diff --git a/src/zabapgit_css_common.w3mi.data.css b/src/zabapgit_css_common.w3mi.data.css index 31365ec0b..bf8118068 100644 --- a/src/zabapgit_css_common.w3mi.data.css +++ b/src/zabapgit_css_common.w3mi.data.css @@ -457,6 +457,16 @@ span.diff_name { padding-left: 0.5em; color: grey; } +span.diff_changed_by { + color: grey; + float: right; +} +span.diff_changed_by span.user { + border-radius: 3px; + border: solid 1px #c2d4ea; + background-color: #d9e4f2; + padding: 1px 0.4em; +} span.diff_name strong { color: #333; } diff --git a/src/zabapgit_html.prog.abap b/src/zabapgit_html.prog.abap index cba8b08e3..6c727461d 100644 --- a/src/zabapgit_html.prog.abap +++ b/src/zabapgit_html.prog.abap @@ -388,7 +388,6 @@ CLASS lcl_html_toolbar DEFINITION FINAL. iv_vertical TYPE abap_bool OPTIONAL iv_sort TYPE abap_bool OPTIONAL iv_as_angle TYPE abap_bool OPTIONAL - iv_with_icons TYPE abap_bool OPTIONAL iv_add_minizone TYPE abap_bool OPTIONAL RETURNING VALUE(ro_html) TYPE REF TO lcl_html. @@ -435,8 +434,9 @@ CLASS lcl_html_toolbar IMPLEMENTATION. METHOD render. "TODO refactor - DATA: lv_class TYPE string, - lv_is_drop TYPE abap_bool. + DATA: lv_class TYPE string, + lv_has_icons TYPE abap_bool, + lv_is_drop TYPE abap_bool. FIELD-SYMBOLS LIKE LINE OF mt_items. @@ -479,15 +479,22 @@ CLASS lcl_html_toolbar IMPLEMENTATION. SORT mt_items BY txt ASCENDING AS TEXT. ENDIF. - IF iv_with_icons = abap_true. + " Check has icons + LOOP AT mt_items ASSIGNING WHERE ico IS NOT INITIAL. + lv_has_icons = abap_true. + EXIT. + ENDLOOP. + + IF lv_has_icons = abap_true. ro_html->add( '' ). ENDIF. + " Render items LOOP AT mt_items ASSIGNING . IF -sub IS INITIAL. - IF iv_with_icons = abap_true. + IF lv_has_icons = abap_true. ro_html->add( '' ). ro_html->add( || ). ro_html->add( '' ). ro_html->add( '' ). ENDIF. @@ -509,7 +516,7 @@ CLASS lcl_html_toolbar IMPLEMENTATION. ENDLOOP. - IF iv_with_icons = abap_true. + IF lv_has_icons = abap_true. ro_html->add( '
{ lcl_html=>icon( -ico ) }' ). @@ -498,7 +505,7 @@ CLASS lcl_html_toolbar IMPLEMENTATION. iv_opt = -opt iv_typ = -typ ). - IF iv_with_icons = abap_true. + IF lv_has_icons = abap_true. ro_html->add( '
' ). ENDIF. diff --git a/src/zabapgit_js_common.w3mi.data.js b/src/zabapgit_js_common.w3mi.data.js index f37db91d9..9bc8dbbe2 100644 --- a/src/zabapgit_js_common.w3mi.data.js +++ b/src/zabapgit_js_common.w3mi.data.js @@ -363,3 +363,60 @@ StageHelper.prototype.iterateStageTab = function (changeMode, cb /*, ...*/) { window.scrollTo(0, scrollOffset); } } + +/********************************************************** + * Diff page logic + **********************************************************/ + +function diffProcessFilterClick(e) { + var target = event.target || event.srcElement; + + if (!target) return; + if (target.tagName !== "A") return; + if (target.parentNode.tagName !== "TD") return; + + var iconTd = target.parentNode.parentNode.children[0]; + + if (!iconTd) return; + if (iconTd.tagName !== "TD") return; + + var icon = iconTd.firstChild; + if (icon.tagName !== "I") return; + if (!icon.classList.contains("octicon")) return; + + var state; + if (icon.classList.contains("blue")) { + icon.classList.remove("blue"); + icon.classList.add("grey"); + state = false; + } else { + icon.classList.add("blue"); + icon.classList.remove("grey"); + state = true; + } + + return { filter: target.innerText, state: state }; +} + +function diffApplyFilter(param, action) { + var diffList = document.getElementById("diff-list"); + // console.log("Action:", param, action.filter, action.state); + for (var i = diffList.children.length - 1; i >= 0; i--) { + var div = diffList.children[i]; + if (div.className !== "diff") return; // Unexpected error ! + var attr = div.getAttribute("data-"+param); + if (attr === action.filter) { + div.style.display = action.state ? "" : "none"; + } + } +} + +function diffFilterType(e) { + var action = diffProcessFilterClick(e); + diffApplyFilter("type", action); +} + +function diffFilterUser(e) { + var action = diffProcessFilterClick(e); + diffApplyFilter("changed-by", action); +} diff --git a/src/zabapgit_page_diff.prog.abap b/src/zabapgit_page_diff.prog.abap index 29e79a0a1..51b3d61df 100644 --- a/src/zabapgit_page_diff.prog.abap +++ b/src/zabapgit_page_diff.prog.abap @@ -14,11 +14,13 @@ CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page. END OF c_fstate. TYPES: BEGIN OF ty_file_diff, - filename TYPE string, - lstate TYPE char1, - rstate TYPE char1, - fstate TYPE char1, " FILE state - Abstraction for shorter ifs - o_diff TYPE REF TO lcl_diff, + filename TYPE string, + lstate TYPE char1, + rstate TYPE char1, + fstate TYPE char1, " FILE state - Abstraction for shorter ifs + o_diff TYPE REF TO lcl_diff, + changed_by TYPE xubname, + type TYPE string, END OF ty_file_diff, tt_file_diff TYPE STANDARD TABLE OF ty_file_diff. @@ -87,7 +89,6 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. super->constructor( ). ms_control-page_title = 'DIFF'. - ms_control-page_menu = build_menu( ). mv_unified = lcl_app=>user( )->get_diff_unified( ). ASSERT is_file IS INITIAL OR is_object IS INITIAL. " just one passed @@ -131,11 +132,14 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. lcx_exception=>raise( 'PAGE_DIFF ERROR: No diff files found' ). ENDIF. + ms_control-page_menu = build_menu( ). + ENDMETHOD. METHOD append_diff. DATA: + lv_offs TYPE i, ls_r_dummy LIKE LINE OF it_remote ##NEEDED, ls_l_dummy LIKE LINE OF it_local ##NEEDED. @@ -175,6 +179,24 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. -fstate = c_fstate-remote. ENDIF. + " Changed by + IF -item-obj_type IS NOT INITIAL. + -changed_by = to_lower( lcl_objects=>changed_by( -item ) ). + ENDIF. + + " Extension + IF -file-filename IS NOT INITIAL. + -type = reverse( -file-filename ). + ELSE. + -type = reverse( -filename ). + ENDIF. + + FIND FIRST OCCURRENCE OF '.' IN -type MATCH OFFSET lv_offs. + -type = reverse( substring( val = -type len = lv_offs ) ). + IF -type <> 'xml' AND -type <> 'abap'. + -type = 'other'. + ENDIF. + IF -fstate = c_fstate-remote. " Remote file leading changes CREATE OBJECT -o_diff EXPORTING @@ -190,9 +212,51 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. ENDMETHOD. "append_diff METHOD build_menu. + + DATA: lo_sub TYPE REF TO lcl_html_toolbar, + lt_types TYPE string_table, + lt_users TYPE string_table. + + FIELD-SYMBOLS: LIKE LINE OF mt_diff_files, + TYPE string. + + LOOP AT mt_diff_files ASSIGNING . + APPEND -type TO lt_types. + APPEND -changed_by TO lt_users. + ENDLOOP. + + SORT: lt_types, lt_users. + DELETE ADJACENT DUPLICATES FROM: lt_types, lt_users. + CREATE OBJECT ro_menu. + + IF lines( lt_types ) > 1. + CREATE OBJECT lo_sub. + LOOP AT lt_types ASSIGNING . + lo_sub->add( iv_txt = + iv_typ = gc_action_type-onclick + iv_ico = 'check/blue' + iv_act = 'diffFilterType(event);' ). + ENDLOOP. + ro_menu->add( iv_txt = 'Filter type' + io_sub = lo_sub ) ##NO_TEXT. + ENDIF. + + IF lines( lt_users ) > 1. + CREATE OBJECT lo_sub. + LOOP AT lt_users ASSIGNING . + lo_sub->add( iv_txt = + iv_typ = gc_action_type-onclick + iv_ico = 'check/blue' + iv_act = 'diffFilterUser(event);' ). + ENDLOOP. + ro_menu->add( iv_txt = 'Filter user' + io_sub = lo_sub ) ##NO_TEXT. + ENDIF. + ro_menu->add( iv_txt = 'Split/Unified view' iv_act = c_actions-toggle_unified ) ##NO_TEXT. + ENDMETHOD. " build_menu. ********************************************************************** @@ -219,6 +283,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. CREATE OBJECT ro_html. + ro_html->add( '
' ). LOOP AT mt_diff_files INTO ls_diff_file. lcl_progress=>show( iv_key = 'Diff' iv_current = sy-tabix @@ -227,6 +292,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. ro_html->add( render_diff( ls_diff_file ) ). ENDLOOP. + ro_html->add( '
' ). ENDMETHOD. "render_content @@ -234,7 +300,8 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. CREATE OBJECT ro_html. - ro_html->add( '
' ). "#EC NOTEXT + ro_html->add( |
| ). "#EC NOTEXT ro_html->add( render_diff_head( is_diff ) ). " Content @@ -279,6 +346,9 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. && ' highlighting for MM assumes local file is newer ! ' ). "#EC NOTEXT ENDIF. + ro_html->add( |last change by: { + is_diff-changed_by }| ). + ro_html->add( '
' ). "#EC NOTEXT ENDMETHOD. diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap index 63adfaad4..c60e9daa2 100644 --- a/src/zabapgit_page_main.prog.abap +++ b/src/zabapgit_page_main.prog.abap @@ -292,7 +292,6 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ro_html->add( lo_allbar->render( iv_as_droplist_with_label = lcl_html=>icon( iv_name = 'three-bars/blue' iv_class = 'pad4px' ) iv_sort = abap_true - iv_with_icons = abap_true iv_add_minizone = abap_true ) ). ro_html->add( '' ). ro_html->add( '' ).