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
This commit is contained in:
Jakub Filak 2019-08-22 07:18:45 +02:00 committed by Lars Hvam
parent d19ce7c4e3
commit 9a6e6e8b24
3 changed files with 66 additions and 7 deletions

View File

@ -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");
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);
}
if (form.id !== stub_form_id) {
document.body.appendChild(form);
}
form.submit();
}

View File

@ -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(
|<form id='form_{ is_event-name }' method={ is_event-method } action='sapevent:{ is_event-name }'></from>| ).
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:
<ls_event> 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 <ls_event>.
ro_html->add( render_event_as_form( <ls_event> ) ).
ENDLOOP.
ro_html->add( footer( ) ).
ro_html->add( '</body>' ). "#EC NOTEXT

View File

@ -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: <ls_event> TYPE zcl_abapgit_gui_page=>ty_event.
APPEND INITIAL LINE TO rt_events ASSIGNING <ls_event>.
<ls_event>-method = 'post'.
<ls_event>-name = 'stage_commit'.
ENDMETHOD.