From 9a6e6e8b240b7f02fb2d81b111a15be0ea4907d1 Mon Sep 17 00:00:00 2001 From: Jakub Filak Date: Thu, 22 Aug 2019 07:18:45 +0200 Subject: [PATCH] ui: add a workaround for JavaGUI dyn form bug (#2873) JavaGUI does not pass values of options from forms generated via JavaScript. This commit adds enhances the base page class to render stub forms (empty form elements), so the page's JavaScript does not need to create the form element on its own. It is an optional behavior and can be enabled by redefining the method get_events which should return table of required events and the base page object will add the empty form elements for them. Every table line will be converted to a form with id = "form_" + the event's name. On the action submit SAP event in the common JavaScript, the method checks if there is the stub form and if so, the method uses it instead of creating the dynamic one. Otherwise, it follows the old approach that creates the form at run-time. --- v2 Use 'null' instead of 'undefined' to check the form was not found in the JavaScript code. --- Issues: #1866, #2769 --- src/ui/zabapgit_js_common.w3mi.data.js | 19 +++++++--- src/ui/zcl_abapgit_gui_page.clas.abap | 41 ++++++++++++++++++++- src/ui/zcl_abapgit_gui_page_stage.clas.abap | 13 ++++++- 3 files changed, 66 insertions(+), 7 deletions(-) diff --git a/src/ui/zabapgit_js_common.w3mi.data.js b/src/ui/zabapgit_js_common.w3mi.data.js index 0bb91c967..cd6526a6f 100644 --- a/src/ui/zabapgit_js_common.w3mi.data.js +++ b/src/ui/zabapgit_js_common.w3mi.data.js @@ -93,11 +93,17 @@ function debugOutput(text, dstID) { stdout.innerHTML = stdout.innerHTML + wrapped; } -// Create hidden form and submit with sapevent +// Use a pre-created form or create a hidden form +// and submit with sapevent function submitSapeventForm(params, action, method) { - var form = document.createElement("form"); - form.setAttribute("method", method || "post"); - form.setAttribute("action", "sapevent:" + action); + var stub_form_id = "form_" + action; + var form = document.getElementById(stub_form_id); + + if (form === null) { + form = document.createElement("form"); + form.setAttribute("method", method || "post"); + form.setAttribute("action", "sapevent:" + action); + } for(var key in params) { var hiddenField = document.createElement("input"); @@ -107,7 +113,10 @@ function submitSapeventForm(params, action, method) { form.appendChild(hiddenField); } - document.body.appendChild(form); + if (form.id !== stub_form_id) { + document.body.appendChild(form); + } + form.submit(); } diff --git a/src/ui/zcl_abapgit_gui_page.clas.abap b/src/ui/zcl_abapgit_gui_page.clas.abap index 90cf5d988..350f094e3 100644 --- a/src/ui/zcl_abapgit_gui_page.clas.abap +++ b/src/ui/zcl_abapgit_gui_page.clas.abap @@ -28,12 +28,28 @@ CLASS zcl_abapgit_gui_page DEFINITION PUBLIC ABSTRACT CREATE PUBLIC. page_menu TYPE REF TO zcl_abapgit_html_toolbar, END OF ty_control. + TYPES: BEGIN OF ty_event, + method TYPE string, + name TYPE string, + END OF ty_event. + + TYPES: tt_events TYPE STANDARD TABLE OF ty_event WITH DEFAULT KEY. + DATA: ms_control TYPE ty_control. METHODS render_content ABSTRACT RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html RAISING zcx_abapgit_exception. + METHODS get_events + RETURNING VALUE(rt_events) TYPE tt_events + RAISING zcx_abapgit_exception. + + METHODS render_event_as_form + IMPORTING is_event TYPE ty_event + RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html + RAISING zcx_abapgit_exception. + METHODS scripts RETURNING VALUE(ro_html) TYPE REF TO zcl_abapgit_html RAISING zcx_abapgit_exception. @@ -346,6 +362,19 @@ CLASS ZCL_ABAPGIT_GUI_PAGE IMPLEMENTATION. ENDMETHOD. + METHOD get_events. + + " Return actions you need on your page. + + ENDMETHOD. + + METHOD render_event_as_form. + + CREATE OBJECT ro_html. + ro_html->add( + |
| ). + + ENDMETHOD. METHOD scripts. @@ -434,7 +463,11 @@ CLASS ZCL_ABAPGIT_GUI_PAGE IMPLEMENTATION. METHOD zif_abapgit_gui_renderable~render. - DATA: lo_script TYPE REF TO zcl_abapgit_html. + DATA: lo_script TYPE REF TO zcl_abapgit_html, + lt_events TYPE zcl_abapgit_gui_page=>tt_events. + + FIELD-SYMBOLS: + LIKE LINE OF lt_events. " Redirect IF ms_control-redirect_url IS NOT INITIAL. @@ -455,6 +488,12 @@ CLASS ZCL_ABAPGIT_GUI_PAGE IMPLEMENTATION. ro_html->add( render_hotkey_overview( ) ). ro_html->add( render_content( ) ). ro_html->add( render_error_message_box( ) ). + + lt_events = me->get_events( ). + LOOP AT lt_events ASSIGNING . + ro_html->add( render_event_as_form( ) ). + ENDLOOP. + ro_html->add( footer( ) ). ro_html->add( '' ). "#EC NOTEXT diff --git a/src/ui/zcl_abapgit_gui_page_stage.clas.abap b/src/ui/zcl_abapgit_gui_page_stage.clas.abap index 51feb9a55..9ee9b5b9e 100644 --- a/src/ui/zcl_abapgit_gui_page_stage.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_stage.clas.abap @@ -23,6 +23,7 @@ CLASS zcl_abapgit_gui_page_stage DEFINITION PROTECTED SECTION. METHODS: render_content REDEFINITION, + get_events REDEFINITION, scripts REDEFINITION. PRIVATE SECTION. @@ -147,7 +148,6 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION. ENDMETHOD. - METHOD find_transports. DATA: li_cts_api TYPE REF TO zif_abapgit_cts_api, ls_new LIKE LINE OF rt_transports. @@ -183,6 +183,17 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION. CATCH zcx_abapgit_exception. ASSERT 1 = 2. ENDTRY. + + ENDMETHOD. + + METHOD get_events. + + FIELD-SYMBOLS: TYPE zcl_abapgit_gui_page=>ty_event. + + APPEND INITIAL LINE TO rt_events ASSIGNING . + -method = 'post'. + -name = 'stage_commit'. + ENDMETHOD.