From 5c2a646809a16da80215abee83cdcb2e44cab102 Mon Sep 17 00:00:00 2001 From: Christian Guenter Date: Thu, 16 Aug 2018 19:27:42 +0000 Subject: [PATCH] Hotkey overview After this commit is applied one can open the hotkey overview with '?'. --- src/ui/zcl_abapgit_gui_chunk_lib.clas.abap | 65 ++++++ src/ui/zcl_abapgit_gui_page.clas.abap | 185 +++++++----------- .../zcl_abapgit_gui_page_settings.clas.abap | 46 +---- src/ui/zcl_abapgit_hotkeys.clas.abap | 102 ++++++++++ src/ui/zcl_abapgit_hotkeys.clas.xml | 19 ++ src/zabapgit_css_common.w3mi.data.css | 4 + src/zabapgit_js_common.w3mi.data.js | 8 +- src/zcl_abapgit_settings.clas.abap | 30 ++- src/zif_abapgit_gui_page_hotkey.intf.abap | 4 +- 9 files changed, 301 insertions(+), 162 deletions(-) create mode 100644 src/ui/zcl_abapgit_hotkeys.clas.abap create mode 100644 src/ui/zcl_abapgit_hotkeys.clas.xml diff --git a/src/ui/zcl_abapgit_gui_chunk_lib.clas.abap b/src/ui/zcl_abapgit_gui_chunk_lib.clas.abap index bbe0d8056..ac05e6727 100644 --- a/src/ui/zcl_abapgit_gui_chunk_lib.clas.abap +++ b/src/ui/zcl_abapgit_gui_chunk_lib.clas.abap @@ -39,6 +39,12 @@ CLASS zcl_abapgit_gui_chunk_lib DEFINITION PUBLIC FINAL CREATE PUBLIC. RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html RAISING zcx_abapgit_exception. + CLASS-METHODS render_hotkey_overview + RETURNING + VALUE(ro_html) TYPE REF TO zcl_abapgit_html + RAISING + zcx_abapgit_exception. + ENDCLASS. @@ -92,6 +98,65 @@ CLASS ZCL_ABAPGIT_GUI_CHUNK_LIB IMPLEMENTATION. ENDMETHOD. "render_error + METHOD render_hotkey_overview. + + DATA: lv_display TYPE string, + lt_hotkeys TYPE zif_abapgit_definitions=>tty_hotkey, + lt_actions TYPE zif_abapgit_gui_page_hotkey=>tty_hotkey_action, + lo_settings TYPE REF TO zcl_abapgit_settings. + + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_hotkey, + LIKE LINE OF lt_actions. + + lo_settings = zcl_abapgit_persist_settings=>get_instance( )->read( ). + + lt_hotkeys = lo_settings->get_hotkeys( ). + + lt_actions = zcl_abapgit_hotkeys=>get_default_hotkeys_from_pages( ). + + CREATE OBJECT ro_html. + + lv_display = 'display:none'. + + ro_html->add( |
| ). + + ro_html->add( '
Hotkeys' + && '
' + && zcl_abapgit_html=>a( + iv_txt = '❌' + iv_typ = zif_abapgit_definitions=>gc_action_type-onclick + iv_act = 'displayNews()' + iv_class = 'close-btn' ) + && '
' ). + + " Generate hotkeys + ro_html->add( |
| ). + + ro_html->add( '' ). + + LOOP AT lt_hotkeys ASSIGNING . + + READ TABLE lt_actions ASSIGNING + WITH TABLE KEY action + COMPONENTS action = -action. + + IF sy-subrc = 0. + ro_html->add( '' ). + ro_html->add( || ). + ro_html->add( '' ). + ENDIF. + + ENDLOOP. + + ro_html->add( '
{ -sequence }-{ -name }
' ). + + ro_html->add( '
' ). + + ro_html->add( '
' ). + + ENDMETHOD. + + METHOD render_item_state. DATA: lv_system TYPE string. diff --git a/src/ui/zcl_abapgit_gui_page.clas.abap b/src/ui/zcl_abapgit_gui_page.clas.abap index e4d579f65..10dd854f3 100644 --- a/src/ui/zcl_abapgit_gui_page.clas.abap +++ b/src/ui/zcl_abapgit_gui_page.clas.abap @@ -41,13 +41,17 @@ CLASS zcl_abapgit_gui_page DEFINITION PUBLIC ABSTRACT CREATE PUBLIC. RAISING zcx_abapgit_exception. - METHODS hotkeys + METHODS add_hotkeys IMPORTING - io_html TYPE REF TO zcl_abapgit_html. + io_html TYPE REF TO zcl_abapgit_html + RAISING + zcx_abapgit_exception. - METHODS get_relevant_hotkeys + METHODS render_hotkey_overview RETURNING - VALUE(rt_hotkeys) TYPE zif_abapgit_definitions=>tty_hotkey. + VALUE(ro_html) TYPE REF TO zcl_abapgit_html + RAISING + zcx_abapgit_exception. ENDCLASS. @@ -75,6 +79,34 @@ CLASS zcl_abapgit_gui_page IMPLEMENTATION. ENDMETHOD. "footer + METHOD add_hotkeys. + + DATA: lv_json TYPE string, + lt_hotkeys TYPE zif_abapgit_definitions=>tty_hotkey. + + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_hotkey. + + lt_hotkeys = zcl_abapgit_hotkeys=>get_relevant_hotkeys_for_page( me ). + + lv_json = `{`. + + LOOP AT lt_hotkeys ASSIGNING . + + IF sy-tabix > 1. + lv_json = lv_json && |,|. + ENDIF. + + lv_json = lv_json && | "{ -sequence }" : "{ -action }" |. + + ENDLOOP. + + lv_json = lv_json && `}`. + + io_html->add( |setKeyBindings({ lv_json });| ). + + ENDMETHOD. + + METHOD html_head. CREATE OBJECT ro_html. @@ -95,6 +127,29 @@ CLASS zcl_abapgit_gui_page IMPLEMENTATION. ENDMETHOD. "html_head + METHOD link_hints. + + DATA: lo_settings TYPE REF TO zcl_abapgit_settings, + lv_link_hint_key TYPE char01, + lv_background_color TYPE string. + + lo_settings = zcl_abapgit_persist_settings=>get_instance( )->read( ). + + lv_link_hint_key = lo_settings->get_link_hint_key( ). + lv_background_color = lo_settings->get_link_hint_background_color( ). + + IF lo_settings->get_link_hints_enabled( ) = abap_true + AND lv_link_hint_key IS NOT INITIAL. + + io_html->add( |setLinkHints("{ lv_link_hint_key }","{ lv_background_color }");| ). + io_html->add( |setInitialFocusWithQuerySelector('a span', true);| ). + io_html->add( |enableArrowListNavigation();| ). + + ENDIF. + + ENDMETHOD. + + METHOD redirect. CREATE OBJECT ro_html. @@ -110,12 +165,20 @@ CLASS zcl_abapgit_gui_page IMPLEMENTATION. ENDMETHOD. + METHOD render_hotkey_overview. + + CREATE OBJECT ro_html. + ro_html->add( zcl_abapgit_gui_chunk_lib=>render_hotkey_overview( ) ). + + ENDMETHOD. + + METHOD scripts. CREATE OBJECT ro_html. link_hints( ro_html ). - hotkeys( ro_html ). + add_hotkeys( ro_html ). ENDMETHOD. "scripts @@ -172,6 +235,7 @@ CLASS zcl_abapgit_gui_page IMPLEMENTATION. ro_html->add( html_head( ) ). ro_html->add( '' ). "#EC NOTEXT ro_html->add( title( ) ). + ro_html->add( render_hotkey_overview( ) ). ro_html->add( render_content( ) ). ro_html->add( footer( ) ). ro_html->add( '' ). "#EC NOTEXT @@ -188,115 +252,4 @@ CLASS zcl_abapgit_gui_page IMPLEMENTATION. ro_html->add( '' ). "#EC NOTEXT ENDMETHOD. " lif_gui_page~render. - - METHOD link_hints. - - DATA: lo_settings TYPE REF TO zcl_abapgit_settings, - lv_link_hint_key TYPE char01, - lv_background_color TYPE string. - - lo_settings = zcl_abapgit_persist_settings=>get_instance( )->read( ). - - lv_link_hint_key = lo_settings->get_link_hint_key( ). - lv_background_color = lo_settings->get_link_hint_background_color( ). - - IF lo_settings->get_link_hints_enabled( ) = abap_true - AND lv_link_hint_key IS NOT INITIAL. - - io_html->add( |setLinkHints("{ lv_link_hint_key }","{ lv_background_color }");| ). - io_html->add( |setInitialFocusWithQuerySelector('a span', true);| ). - io_html->add( |enableArrowListNavigation();| ). - - ENDIF. - - ENDMETHOD. - - - METHOD hotkeys. - - DATA: lv_json TYPE string, - lt_hotkeys TYPE zif_abapgit_definitions=>tty_hotkey. - - FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_hotkey. - - lt_hotkeys = get_relevant_hotkeys( ). - - IF lines( lt_hotkeys ) = 0. - RETURN. - ENDIF. - - lv_json = `{`. - - LOOP AT lt_hotkeys ASSIGNING . - - IF sy-tabix > 1. - lv_json = lv_json && |,|. - ENDIF. - - lv_json = lv_json && | "{ -sequence }" : "{ -action }" |. - - ENDLOOP. - - lv_json = lv_json && `}`. - - io_html->add( |setKeyBindings({ lv_json });| ). - - ENDMETHOD. - - - METHOD get_relevant_hotkeys. - - DATA: lo_settings TYPE REF TO zcl_abapgit_settings, - lv_class_name TYPE abap_abstypename, - lt_hotkey_actions_of_curr_page TYPE zif_abapgit_gui_page_hotkey=>tty_hotkey_action, - lv_save_tabix TYPE syst-tabix, - ls_hotkey LIKE LINE OF rt_hotkeys. - - FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_hotkey, - TYPE zif_abapgit_gui_page_hotkey=>ty_hotkey_action. - - lo_settings = zcl_abapgit_persist_settings=>get_instance( )->read( ). - - rt_hotkeys = lo_settings->get_hotkeys( ). - - lv_class_name = cl_abap_classdescr=>get_class_name( me ). - - TRY. - CALL METHOD (lv_class_name)=>zif_abapgit_gui_page_hotkey~get_hotkey_actions - RECEIVING - rt_hotkey_actions = lt_hotkey_actions_of_curr_page. - - CATCH cx_root. - RETURN. - ENDTRY. - - IF lines( rt_hotkeys ) = 0. - " when no use defined hotkeys exist, we use the default - LOOP AT lt_hotkey_actions_of_curr_page ASSIGNING . - - ls_hotkey-action = -action. - ls_hotkey-sequence = -default_hotkey. - INSERT ls_hotkey INTO TABLE rt_hotkeys. - - ENDLOOP. - - ELSE. - - LOOP AT rt_hotkeys ASSIGNING . - - lv_save_tabix = sy-tabix. - - READ TABLE lt_hotkey_actions_of_curr_page TRANSPORTING NO FIELDS - WITH KEY action = -action. - IF sy-subrc <> 0. - " We only offer hotkeys which are supported by the current page - DELETE rt_hotkeys INDEX lv_save_tabix. - ENDIF. - - ENDLOOP. - - ENDIF. - - ENDMETHOD. - ENDCLASS. diff --git a/src/ui/zcl_abapgit_gui_page_settings.clas.abap b/src/ui/zcl_abapgit_gui_page_settings.clas.abap index 1887e506f..a84535921 100644 --- a/src/ui/zcl_abapgit_gui_page_settings.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_settings.clas.abap @@ -74,11 +74,7 @@ CLASS zcl_abapgit_gui_page_settings DEFINITION VALUE(rt_hotkey_actions) TYPE zif_abapgit_gui_page_hotkey=>tty_hotkey_action RAISING zcx_abapgit_exception. - METHODS get_hotkey_actions_from_pages - RETURNING - VALUE(rt_hotkey_actions) TYPE zif_abapgit_gui_page_hotkey=>tty_hotkey_action - RAISING - zcx_abapgit_exception. + METHODS get_default_hotkeys RETURNING VALUE(rt_default_hotkeys) TYPE zif_abapgit_definitions=>tty_hotkey @@ -234,7 +230,7 @@ CLASS zcl_abapgit_gui_page_settings IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF lt_actions. - lt_actions = get_hotkey_actions_from_pages( ). + lt_actions = zcl_abapgit_hotkeys=>get_default_hotkeys_from_pages( ). LOOP AT lt_actions ASSIGNING . ls_hotkey-action = -action. @@ -245,48 +241,14 @@ CLASS zcl_abapgit_gui_page_settings IMPLEMENTATION. ENDMETHOD. - METHOD get_hotkey_actions_from_pages. - - DATA: lt_hotkey_actions TYPE zif_abapgit_gui_page_hotkey=>tty_hotkey_action, - lo_interface TYPE REF TO cl_oo_interface, - lt_classes TYPE seo_relkeys. - - FIELD-SYMBOLS: TYPE seorelkey. - - TRY. - lo_interface ?= cl_oo_class=>get_instance( |ZIF_ABAPGIT_GUI_PAGE_HOTKEY| ). - - CATCH cx_class_not_existent. - " hotkeys are only available with installed abapGit repository - RETURN. - ENDTRY. - - lt_classes = lo_interface->get_implementing_classes( ). - - LOOP AT lt_classes ASSIGNING . - - CALL METHOD (-clsname)=>zif_abapgit_gui_page_hotkey~get_hotkey_actions - RECEIVING - rt_hotkey_actions = lt_hotkey_actions. - - INSERT LINES OF lt_hotkey_actions INTO TABLE rt_hotkey_actions. - - ENDLOOP. - - ENDMETHOD. - - METHOD get_possible_hotkey_actions. DATA: ls_hotkey_action LIKE LINE OF rt_hotkey_actions. - rt_hotkey_actions = get_hotkey_actions_from_pages( ). + rt_hotkey_actions = zcl_abapgit_hotkeys=>get_default_hotkeys_from_pages( ). " insert empty row at the beginning, so that we can unset a hotkey - INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions. - - SORT rt_hotkey_actions. - DELETE ADJACENT DUPLICATES FROM rt_hotkey_actions. + INSERT ls_hotkey_action INTO rt_hotkey_actions INDEX 1. ENDMETHOD. diff --git a/src/ui/zcl_abapgit_hotkeys.clas.abap b/src/ui/zcl_abapgit_hotkeys.clas.abap new file mode 100644 index 000000000..fdacb31a3 --- /dev/null +++ b/src/ui/zcl_abapgit_hotkeys.clas.abap @@ -0,0 +1,102 @@ +CLASS zcl_abapgit_hotkeys DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + CLASS-METHODS: + get_default_hotkeys_from_pages + RETURNING + VALUE(rt_hotkey_actions) TYPE zif_abapgit_gui_page_hotkey=>tty_hotkey_action + RAISING + zcx_abapgit_exception, + + get_relevant_hotkeys_for_page + IMPORTING + io_page TYPE REF TO zcl_abapgit_gui_page + RETURNING + VALUE(rt_hotkeys) TYPE zif_abapgit_definitions=>tty_hotkey + RAISING + zcx_abapgit_exception. + +ENDCLASS. + + + +CLASS zcl_abapgit_hotkeys IMPLEMENTATION. + + METHOD get_default_hotkeys_from_pages. + + DATA: lt_hotkey_actions TYPE zif_abapgit_gui_page_hotkey=>tty_hotkey_action, + lo_interface TYPE REF TO cl_oo_interface, + lt_classes TYPE seo_relkeys. + + FIELD-SYMBOLS: TYPE seorelkey. + + TRY. + lo_interface ?= cl_oo_class=>get_instance( |ZIF_ABAPGIT_GUI_PAGE_HOTKEY| ). + + CATCH cx_class_not_existent. + " hotkeys are only available with installed abapGit repository + RETURN. + ENDTRY. + + lt_classes = lo_interface->get_implementing_classes( ). + + LOOP AT lt_classes ASSIGNING . + + CALL METHOD (-clsname)=>zif_abapgit_gui_page_hotkey~get_hotkey_actions + RECEIVING + rt_hotkey_actions = lt_hotkey_actions. + + INSERT LINES OF lt_hotkey_actions INTO TABLE rt_hotkey_actions. + + ENDLOOP. + + SORT rt_hotkey_actions. + DELETE ADJACENT DUPLICATES FROM rt_hotkey_actions. + + ENDMETHOD. + + + METHOD get_relevant_hotkeys_for_page. + + DATA: lo_settings TYPE REF TO zcl_abapgit_settings, + lv_class_name TYPE abap_abstypename, + lt_hotkey_actions_of_curr_page TYPE zif_abapgit_gui_page_hotkey=>tty_hotkey_action, + lv_save_tabix TYPE syst-tabix. + + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_hotkey. + + lo_settings = zcl_abapgit_persist_settings=>get_instance( )->read( ). + + rt_hotkeys = lo_settings->get_hotkeys( ). + + lv_class_name = cl_abap_classdescr=>get_class_name( io_page ). + + TRY. + CALL METHOD (lv_class_name)=>zif_abapgit_gui_page_hotkey~get_hotkey_actions + RECEIVING + rt_hotkey_actions = lt_hotkey_actions_of_curr_page. + + CATCH cx_root. + RETURN. + ENDTRY. + + LOOP AT rt_hotkeys ASSIGNING . + + lv_save_tabix = sy-tabix. + + READ TABLE lt_hotkey_actions_of_curr_page TRANSPORTING NO FIELDS + WITH TABLE KEY action + COMPONENTS action = -action. + IF sy-subrc <> 0. + " We only offer hotkeys which are supported by the current page + DELETE rt_hotkeys INDEX lv_save_tabix. + ENDIF. + + ENDLOOP. + + ENDMETHOD. + +ENDCLASS. diff --git a/src/ui/zcl_abapgit_hotkeys.clas.xml b/src/ui/zcl_abapgit_hotkeys.clas.xml new file mode 100644 index 000000000..85407ca5d --- /dev/null +++ b/src/ui/zcl_abapgit_hotkeys.clas.xml @@ -0,0 +1,19 @@ + + + + + + ZCL_ABAPGIT_HOTKEYS + 1 + E + abapGit hotkeys + 2 + 1 + X + X + X + X + + + + diff --git a/src/zabapgit_css_common.w3mi.data.css b/src/zabapgit_css_common.w3mi.data.css index 63fb09878..b8cccf669 100644 --- a/src/zabapgit_css_common.w3mi.data.css +++ b/src/zabapgit_css_common.w3mi.data.css @@ -830,6 +830,10 @@ div.news .update { background-color: #f5c538; } +.newslist td { + padding-right: 1em +} + /* Tooltip text */ .tooltiptext { line-height: 15px; diff --git a/src/zabapgit_js_common.w3mi.data.js b/src/zabapgit_js_common.w3mi.data.js index 08a107169..2deab858b 100644 --- a/src/zabapgit_js_common.w3mi.data.js +++ b/src/zabapgit_js_common.w3mi.data.js @@ -821,7 +821,7 @@ function setLinkHints(sLinkHintKey, sColor) { } function Hotkeys(oKeyMap){ - this.oKeyMap = oKeyMap; + this.oKeyMap = oKeyMap || {}; } Hotkeys.prototype.getSapEvent = function(sSapEvent) { @@ -862,6 +862,12 @@ Hotkeys.prototype.onkeydown = function(oEvent){ submitSapeventForm({}, sSapEvent, "post"); oEvent.preventDefault(); } + } else if (sKey === "?" ) { + var elHotkeys = document.querySelector('#hotkeys'); + + if (elHotkeys) { + elHotkeys.style.display = (elHotkeys.style.display) ? '' : 'none'; + } } } diff --git a/src/zcl_abapgit_settings.clas.abap b/src/zcl_abapgit_settings.clas.abap index 347c1418e..025aad937 100644 --- a/src/zcl_abapgit_settings.clas.abap +++ b/src/zcl_abapgit_settings.clas.abap @@ -108,7 +108,9 @@ CLASS zcl_abapgit_settings DEFINITION PUBLIC CREATE PUBLIC. it_hotkeys TYPE zif_abapgit_definitions=>tty_hotkey, get_hotkeys RETURNING - VALUE(rt_hotkeys) TYPE zif_abapgit_definitions=>tty_hotkey. + VALUE(rt_hotkeys) TYPE zif_abapgit_definitions=>tty_hotkey + RAISING + zcx_abapgit_exception. PRIVATE SECTION. TYPES: BEGIN OF ty_s_settings, @@ -348,7 +350,31 @@ CLASS zcl_abapgit_settings IMPLEMENTATION. ENDMETHOD. METHOD get_hotkeys. - rt_hotkeys = ms_user_settings-hotkeys. + + DATA: lt_default_hotkeys TYPE zif_abapgit_gui_page_hotkey=>tty_hotkey_action, + ls_hotkey LIKE LINE OF rt_hotkeys. + + FIELD-SYMBOLS: LIKE LINE OF lt_default_hotkeys. + + IF lines( ms_user_settings-hotkeys ) > 0. + + rt_hotkeys = ms_user_settings-hotkeys. + + ELSE. + + " provide default hotkeys + lt_default_hotkeys = zcl_abapgit_hotkeys=>get_default_hotkeys_from_pages( ). + + LOOP AT lt_default_hotkeys ASSIGNING . + + ls_hotkey-action = -action. + ls_hotkey-sequence = -default_hotkey. + INSERT ls_hotkey INTO TABLE rt_hotkeys. + + ENDLOOP. + + ENDIF. + ENDMETHOD. ENDCLASS. diff --git a/src/zif_abapgit_gui_page_hotkey.intf.abap b/src/zif_abapgit_gui_page_hotkey.intf.abap index c5407f35f..2a56ba997 100644 --- a/src/zif_abapgit_gui_page_hotkey.intf.abap +++ b/src/zif_abapgit_gui_page_hotkey.intf.abap @@ -8,7 +8,9 @@ INTERFACE zif_abapgit_gui_page_hotkey default_hotkey TYPE string, END OF ty_hotkey_action, tty_hotkey_action TYPE STANDARD TABLE OF ty_hotkey_action - WITH NON-UNIQUE DEFAULT KEY. + WITH NON-UNIQUE DEFAULT KEY + WITH NON-UNIQUE SORTED KEY action + COMPONENTS action. CLASS-METHODS get_hotkey_actions