session-stickyness (#1435)

* Added Component and Session Stateful (#1433)

- Added Component support (TODO refactoring sap.z2ui5 and view handling -> instead of .placeAt use mainView of component manifest)
- Added Session Stateful support

*add the following lines to your REST handler in order to support stateful session handling*
'''abap
    if attributes-stateful-switched = abap_true.
      server->set_session_stateful( stateful = attributes-stateful-active ).
    endif.
'''

And here is an ABAP example class for testing session handling
'''abap
"! <p class="shorttext synchronized" lang="en">Session Demo</p>
class z2ui5_cl_demo_app_session definition
  public
  create public.

  public section.
    interfaces z2ui5_if_app.
    data instance_counter type i read-only.
    data check_initialized type abap_bool read-only.
    data session_is_stateful type abap_bool read-only.
    data session_text type string read-only.
  protected section.
  private section.
    methods initialize_view
      importing
        client type ref to z2ui5_if_client.
    methods on_event
      importing
        client type ref to z2ui5_if_client.

    methods set_session_stateful
      importing
        client   type ref to z2ui5_if_client
        stateful type abap_bool.
endclass.

class z2ui5_cl_demo_app_session implementation.
  method z2ui5_if_app~main.
    if check_initialized = abap_false.
      check_initialized = abap_true.
      initialize_view( client ).
    endif.

    on_event( client ).
  endmethod.

  method initialize_view.
    set_session_stateful( client = client stateful = abap_true ).

    data(view) = z2ui5_cl_xml_view=>factory( ).

    data(page) = view->shell( )->page(
      title          = `abap2UI5 - Sample: Sticky Session`
      navbuttonpress = client->_event( 'BACK' )
      shownavbutton  = xsdbool( client->get( )-s_draft-id_prev_app_stack is not initial ) ).

    data(vbox) = page->vbox( ).
    vbox->info_label( text = client->_bind( session_text ) ).

    data(hbox) = vbox->hbox( alignitems = 'Center' ).
    hbox->label( text = 'press button to increment counter in backend session' class = 'sapUiTinyMarginEnd' ).
    hbox->button(
      text  = client->_bind( instance_counter )
      press = client->_event( 'INCREMENT' )
      type = 'Emphasized' ).

    hbox = vbox->hbox( ).
    hbox->button(
      text  = 'End session'
      press = client->_event( 'END_SESSION' ) ).

    hbox->button(
      text  = 'Start session again'
      press = client->_event( 'START_SESSION' ) ).

    client->view_display( view->stringify( ) ).
  endmethod.

  method on_event.
    case client->get( )-event.
      when 'BACK'.
        client->nav_app_leave( ).
      when 'INCREMENT'.
        instance_counter = lcl_static_container=>increment( ).
        client->view_model_update( ).
      when 'END_SESSION'.
        set_session_stateful( client = client stateful = abap_false ).
      when 'START_SESSION'.
        set_session_stateful( client = client stateful = abap_true ).
    endcase.
  endmethod.

  method set_session_stateful.
    client->set_session_stateful( stateful ).
    session_is_stateful = stateful.
    if stateful = abap_true.
      session_text = 'Session ON (stateful)'.
    else.
      session_text = 'Session OFF (stateless)'.
    endif.
    client->view_model_update( ).
  endmethod.
endclass.
'''

* Update z2ui5_cl_core_http_get.clas.abap (#1434)

updated to reflect latest changes (sorry some local changes were los)

* lint fix

* lint fix

* xml fix

---------

Co-authored-by: Michael Zinnöcker <29286643+mzinnoecker@users.noreply.github.com>
This commit is contained in:
oblomov-dev 2024-09-16 16:45:41 +02:00 committed by GitHub
parent 1e929668b0
commit 1fba55457c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 88 additions and 9 deletions

View File

@ -186,7 +186,7 @@
"severity": "Error"
},
"method_parameter_names": false,
"mix_returning": true,
"mix_returning": false,
"modify_only_own_db_tables": {
"reportDynamic": true,
"ownTables": "^[yz]"

View File

@ -341,4 +341,14 @@ CLASS z2ui5_cl_core_client IMPLEMENTATION.
ENDMETHOD.
METHOD z2ui5_if_client~set_session_stateful.
IF stateful = abap_true.
mo_action->ms_next-s_set-handler_attrs-stateful-active = 1.
ELSE.
mo_action->ms_next-s_set-handler_attrs-stateful-active = 0.
ENDIF.
mo_action->ms_next-s_set-handler_attrs-stateful-switched = abap_true.
ENDMETHOD.
ENDCLASS.

View File

@ -40,6 +40,9 @@ CLASS z2ui5_cl_core_http_get DEFINITION
cs_config TYPE z2ui5_if_types=>ty_s_http_request_get
RETURNING VALUE(result) TYPE string.
METHODS main_get_component_script
RETURNING
VALUE(result) TYPE string.
PRIVATE SECTION.
ENDCLASS.
@ -84,7 +87,9 @@ CLASS z2ui5_cl_core_http_get IMPLEMENTATION.
( n = `id` v = `sap-ui-bootstrap` )
( n = `data-sap-ui-bindingSyntax` v = `complex` )
( n = `data-sap-ui-frameOptions` v = `trusted` )
( n = `data-sap-ui-compatVersion` v = `edge` ) )
( n = `data-sap-ui-compatVersion` v = `edge` )
( n = `data-sap-ui-resourceroots` v = `{"z2ui5": "./"}` )
( n = `data-sap-ui-oninit` v = `onInitComponent` ) )
content_security_policy = lv_csp ).
ENDMETHOD.
@ -153,6 +158,7 @@ CLASS z2ui5_cl_core_http_get IMPLEMENTATION.
` <meta http-equiv="X-UA-Compatible" content="IE=edge">` && |\n| &&
| <title>{ cs_config-t_param[ n = `TITLE` ]-v }</title> \n| &&
| <style>{ cs_config-t_param[ n = `STYLE` ]-v }</style> \n| &&
main_get_component_script( ) && |\n| &&
` <script id="sap-ui-bootstrap"`.
LOOP AT cs_config-t_config REFERENCE INTO DATA(lr_config).
@ -161,8 +167,8 @@ CLASS z2ui5_cl_core_http_get IMPLEMENTATION.
result = result &&
` ></script></head>` && |\n| &&
`<body class="sapUiBody sapUiSizeCompact" >` && |\n| &&
` <div id="content" data-handle-validation="true" ></div>` && |\n| &&
`<body class="sapUiBody sapUiSizeCompact" id="content">` && |\n| &&
` <div data-sap-ui-component data-name="z2ui5" id="content_container" data-id="container" data-handle-validation="true" data-settings=''{"id" : "z2ui5"}''></div>` && |\n| &&
`<abc/>` && |\n|.
DATA(lv_add_js) = get_js_cc_startup( ) && cs_config-custom_js.
@ -603,7 +609,7 @@ CLASS z2ui5_cl_core_http_get IMPLEMENTATION.
` sap.z2ui5.oParent.removeAllPages();` && |\n| &&
` sap.z2ui5.oParent.insertPage(sap.z2ui5.oView);` && |\n| &&
` } else {` && |\n| &&
` sap.z2ui5.oView.placeAt("content");` && |\n| &&
` sap.z2ui5.oView.placeAt("container-uiarea");` && |\n| &&
` }` && |\n| &&
` },` && |\n| &&
` async readHttp() {` && |\n| &&
@ -680,5 +686,40 @@ CLASS z2ui5_cl_core_http_get IMPLEMENTATION.
ENDMETHOD.
METHOD main_get_component_script.
result = `<script>` && |\n| &&
` function onInitComponent(){` && |\n| &&
` sap.ui.require.preload({` && |\n| &&
` "z2ui5/manifest.json": '{}', //todo define json` && |\n| &&
` "z2ui5/Component.js": function(){` && |\n| &&
` sap.ui.define(["sap/ui/core/UIComponent"], function(UIComponent){` && |\n| &&
` return UIComponent.extend("z2ui5.Component", {` && |\n| &&
` metadata: { manifest: "json" },` && |\n| &&
` init: function(){` && |\n| &&
` UIComponent.prototype.init.apply(this, arguments);` && |\n| &&
` },` && |\n| &&
` destroy: function(){` && |\n| &&
` const sContextId = document.cookie.match(new RegExp("(^| )sap-contextid=([^;]+)"))?.at(2);` && |\n| &&
` if(sContextId){` && |\n| &&
` fetch(sap.z2ui5.pathname, {` && |\n| &&
` method: 'HEAD',` && |\n| &&
` headers: {` && |\n| &&
` 'sap-terminate': 'session',` && |\n| &&
` 'sap-contextid': sContextId,` && |\n| &&
` 'sap-contextid-accept': 'header'` && |\n| &&
` }` && |\n| &&
` });` && |\n| &&
` }` && |\n| &&
` UIComponent.prototype.destroy.apply(this, arguments);` && |\n| &&
` },` && |\n| &&
` });` && |\n| &&
` });` && |\n| &&
` }` && |\n| &&
` });` && |\n| &&
` sap.ui.require(["sap/ui/core/ComponentSupport"], function(ComponentSupport){` && |\n| &&
` ComponentSupport.run();` && |\n| &&
` });` && |\n| &&
` }` && |\n| &&
`</script>`.
ENDMETHOD.
ENDCLASS.

View File

@ -16,6 +16,8 @@ CLASS z2ui5_cl_core_http_post DEFINITION
val TYPE string.
METHODS main
EXPORTING
attributes TYPE z2ui5_if_types=>ty_s_http_handler_attributes
RETURNING
VALUE(result) TYPE string.
@ -46,6 +48,7 @@ CLASS z2ui5_cl_core_http_post IMPLEMENTATION.
METHOD main.
CLEAR attributes.
main_begin( ).
DO.
@ -54,6 +57,7 @@ CLASS z2ui5_cl_core_http_post IMPLEMENTATION.
ENDIF.
ENDDO.
result = mv_response.
attributes = ms_response-s_front-params-handler_attrs.
ENDMETHOD.

View File

@ -120,6 +120,7 @@ INTERFACE z2ui5_if_core_types
BEGIN OF s_follow_up_action,
custom_js TYPE string,
END OF s_follow_up_action,
handler_attrs TYPE z2ui5_if_types=>ty_s_http_handler_attributes,
END OF ty_s_next_frontend.
TYPES:

View File

@ -8,12 +8,16 @@ CLASS z2ui5_cl_http_handler DEFINITION
IMPORTING
body TYPE string
config TYPE z2ui5_if_types=>ty_s_http_request_get OPTIONAL
EXPORTING
attributes TYPE z2ui5_if_types=>ty_s_http_handler_attributes
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS http_post
IMPORTING
val TYPE string
EXPORTING
attributes TYPE z2ui5_if_types=>ty_s_http_handler_attributes
RETURNING
VALUE(result) TYPE string.
@ -41,20 +45,26 @@ CLASS z2ui5_cl_http_handler IMPLEMENTATION.
METHOD http_post.
CLEAR attributes.
DATA(lo_post) = NEW z2ui5_cl_core_http_post( val ).
result = lo_post->main( ).
result = lo_post->main(
IMPORTING
attributes = attributes ).
ENDMETHOD.
METHOD main.
CLEAR attributes.
IF body IS INITIAL.
DATA(lo_get) = NEW z2ui5_cl_core_http_get( config ).
result = lo_get->main( ).
ELSE.
DATA(lo_post) = NEW z2ui5_cl_core_http_post( body ).
result = lo_post->main( ).
result = lo_post->main(
IMPORTING
attributes = attributes ).
ENDIF.
ENDMETHOD.

View File

@ -9732,6 +9732,7 @@ CLASS z2ui5_cl_xml_view IMPLEMENTATION.
( n = `sap` v = `sap` )
( n = `text` v = `sap.ui.richtexteditor` )
( n = `html` v = `http://www.w3.org/1999/xhtml` )
* ( n = `unified` v = `sap.ui.unified` )
( n = `fb` v = `sap.ui.comp.filterbar` )
( n = `u` v = `sap.ui.unified` )
( n = `gantt` v = `sap.gantt.simple` )
@ -10031,7 +10032,7 @@ CLASS z2ui5_cl_xml_view IMPLEMENTATION.
METHOD color_picker.
result = me.
_generic( ns = `unified`
_generic( ns = `u`
name = `ColorPicker`
t_prop = VALUE #( ( n = `colorString` v = colorstring )
( n = `displayMode` v = displaymode )

View File

@ -32,6 +32,10 @@ INTERFACE z2ui5_if_client
METHODS view_model_update.
METHODS set_session_stateful
IMPORTING
stateful TYPE abap_bool DEFAULT abap_true.
METHODS nest_view_display
IMPORTING
val TYPE clike

View File

@ -16,6 +16,14 @@ INTERFACE z2ui5_if_types
t_param TYPE ty_t_name_value,
END OF ty_s_http_request_get.
TYPES:
BEGIN OF ty_s_http_handler_attributes,
BEGIN OF stateful,
active TYPE i,
switched TYPE abap_bool,
END OF stateful,
END OF ty_s_http_handler_attributes.
TYPES:
BEGIN OF ty_s_draft,
id TYPE string,