diff --git a/README.md b/README.md index 82785a36..0a4e705d 100644 --- a/README.md +++ b/README.md @@ -51,14 +51,9 @@ Install with [abapGit](https://abapgit.org) ![abapGit](https://docs.abapgit.org/ ```abap METHOD if_http_extension~handle_request. - DATA lt_header TYPE tihttpnvp. - server->request->get_header_fields( CHANGING fields = lt_header ). - DATA(lv_resp) = SWITCH #( server->request->get_method( ) WHEN 'GET' THEN z2ui5_cl_http_handler=>http_get( ) - WHEN 'POST' THEN z2ui5_cl_http_handler=>http_post( - body = server->request->get_cdata( ) - path_info = lt_header[ name = `~path_info` ]-value ) ). + WHEN 'POST' THEN z2ui5_cl_http_handler=>http_post( server->request->get_cdata( ) ). server->response->set_header_field( name = `cache-control` value = `no-cache` ). server->response->set_cdata( lv_resp ). @@ -70,21 +65,16 @@ ENDMETHOD. ```abap METHOD if_http_service_extension~handle_request. - DATA(lt_header) = request->get_header_fields( ). - DATA(lv_resp) = SWITCH #( request->get_method( ) WHEN 'GET' THEN z2ui5_cl_http_handler=>http_get( ) - WHEN 'POST' THEN z2ui5_cl_http_handler=>http_post( - body = request->get_text( ) - path_info = lt_header[ name = `~path_info` ]-value ) ). + WHEN 'POST' THEN z2ui5_cl_http_handler=>http_post( request->get_text( ) ). - response->set_header_field( i_name = `cache-control` i_value = `no-cache` ). - response->set_status( 200 )->set_text( lv_resp ). + response->set_status( 200 )->set_text( lv_resp + )->set_header_field( i_name = `cache-control` i_value = `no-cache` ). ENDMETHOD. ``` #### FAQ * check out this [documentation](https://blogs.sap.com/2023/04/14/abap2ui5-6-7-installation-configuration-debugging/) for detailed installation guidelines
-* read these [instructions](https://blogs.sap.com/2023/02/22/abap2ui5-development-of-ui5-apps-in-pure-abap-1-3/) when you develop your first app
* want to configure the theme, bootstrapping, language and title? see [configuration & debugging](https://blogs.sap.com/2023/04/14/abap2ui5-6-7-installation-configuration-debugging/) * as always - your comments, questions, wishes and bugs are welcome, please create an [issue](https://github.com/abap2UI5/abap2UI5/issues) diff --git a/src/z2ui5_cl_http_handler.clas.abap b/src/z2ui5_cl_http_handler.clas.abap index 96ddceb5..1d57e008 100644 --- a/src/z2ui5_cl_http_handler.clas.abap +++ b/src/z2ui5_cl_http_handler.clas.abap @@ -16,7 +16,6 @@ CLASS z2ui5_cl_http_handler DEFINITION CLASS-METHODS http_post IMPORTING body TYPE string - path_info TYPE string OPTIONAL RETURNING VALUE(result) TYPE string. @@ -27,7 +26,7 @@ ENDCLASS. -CLASS Z2UI5_CL_HTTP_HANDLER IMPLEMENTATION. +CLASS z2ui5_cl_http_handler IMPLEMENTATION. METHOD http_get. @@ -52,6 +51,7 @@ CLASS Z2UI5_CL_HTTP_HANDLER IMPLEMENTATION. ENDIF. z2ui5_lcl_fw_db=>cleanup( ). + r_result = `` && |\n| && `` && |\n| && lv_sec_policy && |\n| && @@ -75,7 +75,7 @@ CLASS Z2UI5_CL_HTTP_HANDLER IMPLEMENTATION. `` && |\n| && `
` && |\n| && `` && |\n| && - `` && |\n|. + `` && |\n|. r_result = r_result && `` && |\n| && - ``. + ``. + +* sap.z2ui5.checkLogActive = { z2ui5_lcl_utility=>get_json_boolean( check_logging ) };`| && |\n| && -* ` sap.z2ui5.checkLogActive = ` && z2ui5_lcl_utility=>get_json_boolean( check_logging ) && `;` && |\n| && ENDMETHOD. METHOD http_post. - z2ui5_lcl_fw_handler=>ss_config = VALUE #( - controller_name = `z2ui5_controller` - path_info = path_info - body = body ). - - DATA(lo_handler) = z2ui5_lcl_fw_handler=>request_begin( ). + DATA(lo_handler) = z2ui5_lcl_fw_handler=>request_begin( body ). DO. TRY. @@ -408,7 +406,7 @@ CLASS Z2UI5_CL_HTTP_HANDLER IMPLEMENTATION. result = lo_handler->request_end( ). CATCH cx_root INTO DATA(x). - lo_handler = lo_handler->set_app_system( x ). + lo_handler = z2ui5_lcl_fw_handler=>set_app_system( x ). CONTINUE. ENDTRY. diff --git a/src/z2ui5_cl_http_handler.clas.locals_imp.abap b/src/z2ui5_cl_http_handler.clas.locals_imp.abap index 81f3a643..96f5fd5f 100644 --- a/src/z2ui5_cl_http_handler.clas.locals_imp.abap +++ b/src/z2ui5_cl_http_handler.clas.locals_imp.abap @@ -29,6 +29,10 @@ CLASS z2ui5_lcl_utility DEFINITION INHERITING FROM cx_no_check. METHODS get_text REDEFINITION. + CLASS-METHODS get_classname_by_ref + IMPORTING in TYPE REF TO object + RETURNING VALUE(result) TYPE string. + CLASS-METHODS raise IMPORTING v TYPE clike DEFAULT `CX_SY_SUBRC` @@ -45,9 +49,6 @@ CLASS z2ui5_lcl_utility DEFINITION INHERITING FROM cx_no_check. CLASS-METHODS get_user_tech RETURNING VALUE(result) TYPE string. - CLASS-METHODS get_timestampl - RETURNING VALUE(result) TYPE timestampl. - CLASS-METHODS trans_any_2_json IMPORTING any TYPE any RETURNING VALUE(result) TYPE string. @@ -104,11 +105,241 @@ CLASS z2ui5_lcl_utility DEFINITION INHERITING FROM cx_no_check. EXPORTING e_data TYPE REF TO data. + CLASS-METHODS get_timestampl + RETURNING + VALUE(result) TYPE timestampl. + + CLASS-METHODS get_param + IMPORTING + val TYPE string + RETURNING + VALUE(r_result) TYPE string. + PROTECTED SECTION. CLASS-DATA mv_counter TYPE i. ENDCLASS. +CLASS z2ui5_lcl_utility_tree_json DEFINITION. + + PUBLIC SECTION. + + DATA mo_root TYPE REF TO z2ui5_lcl_utility_tree_json. + DATA mo_parent TYPE REF TO z2ui5_lcl_utility_tree_json. + DATA mv_name TYPE string. + DATA mv_value TYPE string. + DATA mt_values TYPE STANDARD TABLE OF REF TO z2ui5_lcl_utility_tree_json WITH EMPTY KEY. + DATA mv_check_list TYPE abap_bool. + DATA mr_actual TYPE REF TO data. + DATA mv_apost_active TYPE abap_bool. + + CLASS-METHODS new + IMPORTING io_root TYPE REF TO z2ui5_lcl_utility_tree_json + iv_name TYPE simple + RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. + + CLASS-METHODS factory + IMPORTING iv_json TYPE clike OPTIONAL + RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. + + METHODS constructor. + + METHODS get_root + RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. + + METHODS get_attribute + IMPORTING name TYPE string + RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. + + METHODS get_val + RETURNING VALUE(result) TYPE string. + + METHODS add_attribute + IMPORTING n TYPE clike + v TYPE clike + apos_active TYPE abap_bool DEFAULT abap_true + RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. + + METHODS add_attribute_object + IMPORTING name TYPE clike + RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. + + METHODS add_attribute_struc + IMPORTING val TYPE data + RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. + + METHODS add_attribute_instance + IMPORTING val TYPE REF TO z2ui5_lcl_utility_tree_json + RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. + + METHODS stringify + RETURNING VALUE(result) TYPE string. + + PROTECTED SECTION. + METHODS wrap_json + IMPORTING iv_text TYPE string + RETURNING VALUE(result) TYPE string. + + METHODS quote_json + IMPORTING iv_text TYPE string + iv_cond TYPE abap_bool + RETURNING VALUE(result) TYPE string. + +ENDCLASS. + + + +CLASS z2ui5_lcl_fw_handler DEFINITION. + + PUBLIC SECTION. + + CONSTANTS: + BEGIN OF cs_bind_type, + one_way TYPE string VALUE 'ONE_WAY', + two_way TYPE string VALUE 'TWO_WAY', + one_time TYPE string VALUE 'ONE_TIME', + END OF cs_bind_type. + + TYPES: + BEGIN OF ty_S_next2, + t_scroll TYPE z2ui5_if_client=>ty_t_name_value, + title TYPE string, +* path TYPE string, + search TYPE string, + BEGIN OF s_view, + xml TYPE string, + check_destroy TYPE abap_bool, + check_update_model TYPE abap_bool, + END OF s_view, + BEGIN OF s_view_nest, + xml TYPE string, + id TYPE string, + method_insert TYPE string, + method_destroy TYPE string, + check_destroy TYPE abap_bool, + check_update_model TYPE abap_bool, + END OF s_view_nest, + BEGIN OF s_popup, + xml TYPE string, + id TYPE string, + check_destroy TYPE abap_bool, + check_update_model TYPE abap_bool, + END OF s_popup, + BEGIN OF s_popover, + xml TYPE string, + id TYPE string, + open_by_id TYPE string, + check_destroy TYPE abap_bool, + check_update_model TYPE abap_bool, + END OF s_popover, + BEGIN OF s_cursor, + id TYPE string, + cursorpos TYPE string, + selectionstart TYPE string, + selectionend TYPE string, + END OF s_cursor, + BEGIN OF s_timer, + interval_ms TYPE string, + event_finished TYPE string, + END OF s_timer, + BEGIN OF s_msg_box, + type TYPE string, + text TYPE string, + END OF s_msg_box, + BEGIN OF s_msg_toast, + text TYPE string, + END OF s_msg_toast, + _viewmodel TYPE string, + END OF ty_s_next2. + + TYPES: + BEGIN OF ty_s_db, + id TYPE string, + id_prev TYPE string, + id_prev_app TYPE string, + id_prev_app_stack TYPE string, + t_attri TYPE z2ui5_lcl_utility=>ty_t_attri, + o_app TYPE REF TO z2ui5_if_app, + END OF ty_s_db. + + CLASS-DATA ss_config TYPE z2ui5_if_client=>ty_s_config. + + DATA ms_db TYPE ty_s_db. + + TYPES: + BEGIN OF ty_s_next, + o_app_call TYPE REF TO z2ui5_if_app, + o_app_leave TYPE REF TO z2ui5_if_app, + s_set TYPE ty_S_next2, + END OF ty_s_next. + + DATA ms_actual TYPE z2ui5_if_client=>ty_s_get. + DATA ms_next TYPE ty_s_next. + + CLASS-DATA so_body TYPE REF TO z2ui5_lcl_utility_tree_json. + + CLASS-METHODS request_begin + IMPORTING + body TYPE string + RETURNING + VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. + + METHODS request_end + RETURNING VALUE(result) TYPE string. + + METHODS _create_binding + IMPORTING value TYPE data + type TYPE string DEFAULT cs_bind_type-two_way + RETURNING VALUE(result) TYPE string. + + CLASS-METHODS set_app_start + RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. + + CLASS-METHODS set_app_client + IMPORTING + id_prev TYPE clike + RETURNING + VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. + + METHODS set_app_leave + IMPORTING + check_no_db_save TYPE abap_bool DEFAULT abap_false + RETURNING + VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. + + METHODS set_app_call + IMPORTING + check_no_db_save TYPE abap_bool DEFAULT abap_false + RETURNING + VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. + + CLASS-METHODS set_app_system + IMPORTING VALUE(ix) TYPE REF TO cx_root OPTIONAL + error_text TYPE string OPTIONAL + PREFERRED PARAMETER ix + RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. + + CLASS-METHODS model_set_backend + IMPORTING + model TYPE REF TO data + app TYPE REF TO object + t_attri TYPE z2ui5_lcl_utility=>ty_t_attri. + + CLASS-METHODS model_set_frontend + IMPORTING + app TYPE REF TO object + t_attri TYPE z2ui5_lcl_utility=>ty_t_attri + RETURNING + VALUE(result) TYPE string. + + METHODS app_set_next + IMPORTING + app TYPE REF TO z2ui5_if_app + RETURNING + VALUE(r_result) TYPE REF TO z2ui5_lcl_fw_handler. + +ENDCLASS. + CLASS z2ui5_lcl_utility IMPLEMENTATION. @@ -165,6 +396,7 @@ CLASS z2ui5_lcl_utility IMPLEMENTATION. GET TIME STAMP FIELD result. ENDMETHOD. + METHOD get_user_tech. result = sy-uname. ENDMETHOD. @@ -333,6 +565,11 @@ CLASS z2ui5_lcl_utility IMPLEMENTATION. ENDMETHOD. + METHOD get_classname_by_ref. + DATA(lv_classname) = cl_abap_classdescr=>get_class_name( in ). + result = substring_after( val = lv_classname sub = `\CLASS=` ). + ENDMETHOD. + METHOD trans_object_2_xml. FIELD-SYMBOLS TYPE any. @@ -421,77 +658,42 @@ CLASS z2ui5_lcl_utility IMPLEMENTATION. ENDIF. RAISE EXCEPTION TYPE z2ui5_lcl_utility EXPORTING val = v. ENDMETHOD. -ENDCLASS. + METHOD get_param. -CLASS z2ui5_lcl_utility_tree_json DEFINITION. + DATA(lt_params) = VALUE z2ui5_if_client=>ty_t_name_value( ). - PUBLIC SECTION. + DATA(lv_search) = z2ui5_lcl_fw_handler=>so_body->get_attribute( `OLOCATION` )->get_attribute( `SEARCH` )->get_val( ). - DATA mo_root TYPE REF TO z2ui5_lcl_utility_tree_json. - DATA mo_parent TYPE REF TO z2ui5_lcl_utility_tree_json. - DATA mv_name TYPE string. - DATA mv_value TYPE string. - DATA mt_values TYPE STANDARD TABLE OF REF TO z2ui5_lcl_utility_tree_json WITH EMPTY KEY. - DATA mv_check_list TYPE abap_bool. - DATA mr_actual TYPE REF TO data. - DATA mv_apost_active TYPE abap_bool. + REPLACE `%3D` IN lv_search WITH `=`. + SPLIT lv_search AT `&sap-startup-params=` INTO DATA(lv_search1) DATA(lv_search2). + IF lv_search2 IS NOT INITIAL. + lv_search = lv_search2. + ELSE. + lv_search = lv_search1. + ENDIF. - CLASS-METHODS new - IMPORTING io_root TYPE REF TO z2ui5_lcl_utility_tree_json - iv_name TYPE simple - RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. + lv_search = get_trim_upper( lv_search ). + SHIFT lv_search LEFT DELETING LEADING `?`. - CLASS-METHODS factory - IMPORTING iv_json TYPE clike OPTIONAL - RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. + SPLIT lv_search AT `&` INTO TABLE DATA(lt_param). - METHODS constructor. + LOOP AT lt_param REFERENCE INTO DATA(lr_param). - METHODS get_root - RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. + SPLIT lr_param->* AT `=` INTO DATA(lv_name) DATA(lv_value). - METHODS get_attribute - IMPORTING name TYPE string - RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. + INSERT VALUE #( n = lv_name v = lv_value ) INTO TABLE lt_params. + ENDLOOP. - METHODS get_val - RETURNING VALUE(result) TYPE string. + DATA(lv_val) = get_trim_upper( val ). + r_result = VALUE #( lt_params[ n = lv_val ]-v OPTIONAL ). - METHODS add_attribute - IMPORTING n TYPE clike - v TYPE clike - apos_active TYPE abap_bool DEFAULT abap_true - RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. - - METHODS add_attribute_object - IMPORTING name TYPE clike - RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. - - METHODS add_attribute_struc - IMPORTING val TYPE data - RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. - - METHODS add_attribute_instance - IMPORTING val TYPE REF TO z2ui5_lcl_utility_tree_json - RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. - - METHODS stringify - RETURNING VALUE(result) TYPE string. - - PROTECTED SECTION. - METHODS wrap_json - IMPORTING iv_text TYPE string - RETURNING VALUE(result) TYPE string. - - METHODS quote_json - IMPORTING iv_text TYPE string - iv_cond TYPE abap_bool - RETURNING VALUE(result) TYPE string. + ENDMETHOD. ENDCLASS. + CLASS z2ui5_lcl_utility_tree_json IMPLEMENTATION. METHOD add_attribute. @@ -634,157 +836,6 @@ CLASS z2ui5_lcl_utility_tree_json IMPLEMENTATION. ENDMETHOD. ENDCLASS. -CLASS z2ui5_lcl_fw_handler DEFINITION DEFERRED. - -CLASS z2ui5_lcl_fw_handler DEFINITION. - - PUBLIC SECTION. - - CONSTANTS: - BEGIN OF cs_bind_type, - one_way TYPE string VALUE 'ONE_WAY', - two_way TYPE string VALUE 'TWO_WAY', - one_time TYPE string VALUE 'ONE_TIME', - END OF cs_bind_type. - - TYPES: - BEGIN OF ty_S_next2, - t_scroll TYPE z2ui5_if_client=>ty_t_name_value, - title TYPE string, - path TYPE string, - url TYPE string, - BEGIN OF s_view, - xml TYPE string, - check_destroy TYPE abap_bool, - check_update_model TYPE abap_bool, - END OF s_view, - BEGIN OF s_view_nest, - xml TYPE string, - id TYPE string, - method_insert TYPE string, - method_destroy TYPE string, - check_destroy TYPE abap_bool, - check_update_model TYPE abap_bool, - END OF s_view_nest, - BEGIN OF s_popup, - xml TYPE string, - id TYPE string, - check_destroy TYPE abap_bool, - check_update_model TYPE abap_bool, - END OF s_popup, - BEGIN OF s_popover, - xml TYPE string, - id TYPE string, - open_by_id TYPE string, - check_destroy TYPE abap_bool, - check_update_model TYPE abap_bool, - END OF s_popover, - BEGIN OF s_cursor, - id TYPE string, - cursorpos TYPE string, - selectionstart TYPE string, - selectionend TYPE string, - END OF s_cursor, - BEGIN OF s_timer, - interval_ms TYPE string, - event_finished TYPE string, - END OF s_timer, - BEGIN OF s_msg_box, - type TYPE string, - text TYPE string, - END OF s_msg_box, - BEGIN OF s_msg_toast, - text TYPE string, - END OF s_msg_toast, - _viewmodel TYPE string, - END OF ty_s_next2. - - TYPES: - BEGIN OF ty_s_db, - id TYPE string, - id_prev TYPE string, - id_prev_app TYPE string, - id_prev_app_stack TYPE string, - t_attri TYPE z2ui5_lcl_utility=>ty_t_attri, - o_app TYPE REF TO z2ui5_if_app, - END OF ty_s_db. - - CLASS-DATA ss_config TYPE z2ui5_if_client=>ty_s_config. - - DATA ms_db TYPE ty_s_db. - - TYPES: - BEGIN OF ty_s_next, - o_app_call TYPE REF TO z2ui5_if_app, - o_app_leave TYPE REF TO z2ui5_if_app, - s_set TYPE ty_S_next2, - END OF ty_s_next. - - DATA ms_actual TYPE z2ui5_if_client=>ty_s_get. - DATA ms_next TYPE ty_s_next. - - CLASS-DATA so_body TYPE REF TO z2ui5_lcl_utility_tree_json. - - CLASS-METHODS request_begin - RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. - - METHODS request_end - RETURNING VALUE(result) TYPE string. - - METHODS _create_binding - IMPORTING value TYPE data - type TYPE string DEFAULT cs_bind_type-two_way - RETURNING VALUE(result) TYPE string. - - CLASS-METHODS set_app_start - RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. - - CLASS-METHODS set_app_client - IMPORTING - id_prev TYPE clike - RETURNING - VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. - - METHODS set_app_leave - IMPORTING - check_no_db_save TYPE abap_bool DEFAULT abap_false - RETURNING - VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. - - METHODS set_app_call - IMPORTING - check_no_db_save TYPE abap_bool DEFAULT abap_false - RETURNING - VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. - - METHODS set_app_system - IMPORTING VALUE(ix) TYPE REF TO cx_root OPTIONAL - error_text TYPE string OPTIONAL - PREFERRED PARAMETER ix - RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. - - CLASS-METHODS model_set_backend - IMPORTING - model TYPE REF TO data - app TYPE REF TO object - t_attri TYPE z2ui5_lcl_utility=>ty_t_attri. - - CLASS-METHODS model_set_frontend - IMPORTING - app TYPE REF TO object - t_attri TYPE z2ui5_lcl_utility=>ty_t_attri - RETURNING - VALUE(result) TYPE string. - - METHODS app_set_next - IMPORTING - app TYPE REF TO z2ui5_if_app - RETURNING - VALUE(r_result) TYPE REF TO z2ui5_lcl_fw_handler. - -ENDCLASS. - - CLASS z2ui5_lcl_fw_db DEFINITION. PUBLIC SECTION. @@ -927,6 +978,7 @@ CLASS z2ui5_lcl_fw_app IMPLEMENTATION. DATA li_app TYPE REF TO z2ui5_if_app. TRY. CREATE OBJECT li_app TYPE (`Z2UI5_CL_APP_DEMO_00`). +* CREATE OBJECT li_app TYPE (`Z2UI5_CL_APP_DEMO_00`). lv_check_demo = abap_true. client->nav_app_call( li_app ). CATCH cx_root. @@ -956,9 +1008,12 @@ CLASS z2ui5_lcl_fw_app IMPLEMENTATION. DATA(ls_get) = client->get( ). DATA(lv_url_app) = ls_get-s_config-origin && ls_get-s_config-pathname. DATA(lv_url) = lv_url_app. - SHIFT lv_url RIGHT DELETING TRAILING ls_get-s_config-path_info. +* SHIFT lv_url RIGHT DELETING TRAILING ls_get-s_config-path_info. SHIFT lv_url LEFT DELETING LEADING ` `. +* client->get( )-s_config-ms_db- +* DATA(lv_url_app_act) = ls_get-s_config-origin && ls_get-s_config-pathname. + DATA(lv_xml) = `ss_config-origin && z2ui5_lcl_fw_handler=>ss_config-pathname ). - DATA(lv_path_info) = to_lower( z2ui5_lcl_fw_handler=>ss_config-path_info ). - REPLACE lv_path_info IN lv_url WITH ``. - SPLIT lv_url AT '?' INTO lv_url DATA(lv_params). - SHIFT lv_url RIGHT DELETING TRAILING `/`. - DATA(lv_link) = lv_url && `/` && to_lower( ms_home-classname ). - IF lv_params IS NOT INITIAL. - lv_link = lv_link && `?` && lv_params. + + DATA(lv_search) = client->get( )-s_config-search. + SPLIT lv_search AT `&` INTO TABLE DATA(lt_param). + LOOP AT lt_param INTO DATA(ls_param). + TRY. + IF ls_param(9) = `app_start`. + DELETE lt_param. + ENDIF. + CATCH cx_root. + ENDTRY. + ENDLOOP. + IF lv_search IS INITIAL. + lv_url = lv_url && `?`. + ELSE. + lv_url = lv_url && lv_search && `&`. ENDIF. + DATA(lv_link) = lv_url && `app_start=` && to_lower( ms_home-classname ). + CATCH cx_root. ENDTRY. @@ -1233,17 +1298,16 @@ CLASS z2ui5_lcl_fw_db IMPLEMENTATION. METHOD cleanup. - DATA lv_ts_now TYPE timestampl. - - GET TIME STAMP FIELD lv_ts_now. - - DATA(lv_ts_four_hours_ago) = cl_abap_tstmp=>subtractsecs( tstmp = lv_ts_now + data(lv_timestampl) = z2ui5_lcl_utility=>get_timestampl( ). + DATA(lv_ts_four_hours_ago) = cl_abap_tstmp=>subtractsecs( tstmp = lv_timestampl secs = 60 * 60 * 4 ). DELETE FROM z2ui5_t_draft WHERE timestampl < @lv_ts_four_hours_ago. COMMIT WORK. ENDMETHOD. + + ENDCLASS. @@ -1265,7 +1329,10 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION. METHOD request_begin. - so_body = z2ui5_lcl_utility_tree_json=>factory( ss_config-body ). + ss_config = VALUE #( + controller_name = `z2ui5_controller` + body = body ). + so_body = z2ui5_lcl_utility_tree_json=>factory( body ). TRY. DATA(lv_id_prev) = so_body->get_attribute( `ID` )->get_val( ). @@ -1274,13 +1341,6 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION. CATCH cx_root. result = set_app_start( ). result->ms_actual-check_on_navigated = abap_true. -* RETURN. - ENDTRY. - - - TRY. - result->ms_actual-check_launchpad_active = so_body->get_attribute( `CHECKLAUNCHPADACTIVE` )->get_val( ). - CATCH cx_root. ENDTRY. TRY. @@ -1309,6 +1369,7 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION. CATCH cx_root. ENDTRY. + TRY. DATA(lo_location) = so_body->get_attribute( `OLOCATION` ). ss_config-origin = lo_location->get_attribute( `ORIGIN` )->get_val( ). @@ -1319,6 +1380,16 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION. CATCH cx_root. ENDTRY. +* TRY. +* result->ms_actual-check_launchpad_active = so_body->get_attribute( `CHECKLAUNCHPADACTIVE` )->get_val( ). +* CATCH cx_root. +* ENDTRY. + +* IF result->ms_actual-check_launchpad_active = abap_false. + IF ss_config-search CS `scenario=LAUNCHPAD`. + result->ms_actual-check_launchpad_active = abap_true. + ENDIF. +* ENDIF. ENDMETHOD. @@ -1334,7 +1405,15 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION. lo_resp->add_attribute( n = `PARAMS` v = z2ui5_lcl_utility=>trans_any_2_json( ms_next-s_set ) apos_active = abap_false ). lo_resp->add_attribute( n = `ID` v = ms_db-id ). - ms_next-s_set-path = ss_config-path_info. +* DATA(lv_app_start) = to_lower( z2ui5_lcl_utility=>get_param( `app_start` ) ). +* DATA(lv_q) = z2ui5_lcl_utility=>get_param( `q` ). +* DATA(lv_app) = to_lower( z2ui5_lcl_utility=>get_classname_by_ref( ms_db-o_app ) ). + + IF ms_next-S_set-search IS INITIAL. + lo_resp->add_attribute( n = `SEARCH` v = ms_actual-s_config-search ). + ELSE. + lo_resp->add_attribute( n = `SEARCH` v = ms_next-S_set-search ). + ENDIF. result = lo_resp->get_root( )->stringify( ). z2ui5_lcl_fw_db=>create( id = ms_db-id db = ms_db ). @@ -1469,38 +1548,25 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION. METHOD set_app_start. - result = NEW #( ). - result->ms_db-id = z2ui5_lcl_utility=>get_uuid( ). - - - " TODO: variable is assigned but never used (ABAP cleaner) - SPLIT ss_config-path_info AT `?` INTO DATA(lv_path_info) DATA(lv_dummy). - DATA(lv_classname) = z2ui5_lcl_utility=>get_trim_upper( lv_path_info ). - SHIFT lv_classname LEFT DELETING LEADING `/`. + DATA(lv_classname) = z2ui5_lcl_utility=>get_param( `app_start` ). IF lv_classname IS INITIAL. - result = result->set_app_system( ). + result = set_app_system( ). RETURN. ENDIF. TRY. - TRY. - CREATE OBJECT result->ms_db-o_app TYPE (lv_classname). - CATCH cx_root. - SPLIT lv_classname AT `/` INTO lv_classname lv_dummy. - CREATE OBJECT result->ms_db-o_app TYPE (lv_classname). - ENDTRY. + result = NEW #( ). + result->ms_db-id = z2ui5_lcl_utility=>get_uuid( ). + + CREATE OBJECT result->ms_db-o_app TYPE (lv_classname). result->ms_db-o_app->id = result->ms_db-id. result->ms_db-t_attri = z2ui5_lcl_utility=>get_t_attri_by_ref( result->ms_db-o_app ). -* result->ms_actual-check_on_navigated = abap_true. - RETURN. CATCH cx_root. - result = result->set_app_system( error_text = `App with name ` && lv_classname && ` not found...` ). - RETURN. + result = set_app_system( error_text = `App with name ` && lv_classname && ` not found...` ). ENDTRY. - ENDMETHOD. METHOD set_app_leave. @@ -1608,9 +1674,9 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION. ENDIF. IF ix IS BOUND. - ms_next-o_app_call = z2ui5_lcl_fw_app=>factory_error( error = ix ). + result->ms_next-o_app_call = z2ui5_lcl_fw_app=>factory_error( error = ix ). - result = set_app_call( check_no_db_save = abap_true ). + result = result->set_app_call( check_no_db_save = abap_true ). RETURN. ELSE. @@ -1638,7 +1704,6 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION. r_result->ms_db-t_attri = z2ui5_lcl_utility=>get_t_attri_by_ref( app ). r_result->ms_actual-check_launchpad_active = ms_actual-check_launchpad_active. - r_result->ms_actual-s_config = ms_actual-s_config. r_result->ms_actual-check_on_navigated = abap_true. r_result->ms_next-s_Set = ms_next-s_set. @@ -1675,9 +1740,10 @@ CLASS z2ui5_lcl_fw_client IMPLEMENTATION. check_launchpad_active = mo_handler->ms_actual-check_launchpad_active t_event_arg = mo_handler->ms_actual-t_event_arg t_scroll_pos = mo_handler->ms_actual-t_scroll_pos + s_DRAFT = CORRESPONDING #( mo_handler->ms_db ) check_on_navigated = mo_handler->ms_actual-check_on_navigated s_config = z2ui5_lcl_fw_handler=>ss_config ). - result-s_config-app = mo_handler->ms_db-o_app. + result-s_draft-app = mo_handler->ms_db-o_app. ENDMETHOD. METHOD z2ui5_if_client~nav_app_call. @@ -1731,6 +1797,7 @@ CLASS z2ui5_lcl_fw_client IMPLEMENTATION. METHOD z2ui5_if_client~_bind. result = mo_handler->_create_binding( value = val type = z2ui5_lcl_fw_handler=>cs_bind_type-one_way ). + IF path = abap_false. result = `{` && result && `}`. ENDIF. @@ -1739,8 +1806,8 @@ CLASS z2ui5_lcl_fw_client IMPLEMENTATION. METHOD z2ui5_if_client~_bind_edit. - result = mo_handler->_create_binding( value = val - type = z2ui5_lcl_fw_handler=>cs_bind_type-two_way ). + result = mo_handler->_create_binding( value = val type = z2ui5_lcl_fw_handler=>cs_bind_type-two_way ). + IF path = abap_false. result = `{` && result && `}`. ENDIF. @@ -1835,7 +1902,14 @@ CLASS z2ui5_lcl_fw_client IMPLEMENTATION. METHOD z2ui5_if_client~popup_model_update. - mo_handler->ms_next-s_set-s_popup-check_update_model = abap_true. + mo_handler->ms_next-s_set-s_popup-check_update_model = abap_true. + + ENDMETHOD. + + METHOD z2ui5_if_client~url_param_set. + + mo_handler->ms_next-s_set-search = val. + mo_handler->ms_actual-s_config-search = val. ENDMETHOD. diff --git a/src/z2ui5_cl_http_handler.clas.testclasses.abap b/src/z2ui5_cl_http_handler.clas.testclasses.abap index 3126048b..bb1f7fe1 100644 --- a/src/z2ui5_cl_http_handler.clas.testclasses.abap +++ b/src/z2ui5_cl_http_handler.clas.testclasses.abap @@ -1,787 +1,409 @@ -CLASS ltcl_unit_01_json DEFINITION FINAL FOR TESTING - DURATION SHORT - RISK LEVEL HARMLESS. - - PRIVATE SECTION. - METHODS test_json_attri FOR TESTING RAISING cx_static_check. - METHODS test_json_object FOR TESTING RAISING cx_static_check. - METHODS test_json_struc FOR TESTING RAISING cx_static_check. - METHODS test_json_trans FOR TESTING RAISING cx_static_check. - METHODS test_json_trans_gen FOR TESTING RAISING cx_static_check. -ENDCLASS. - - -CLASS ltcl_unit_01_utility DEFINITION FINAL FOR TESTING - DURATION SHORT - RISK LEVEL HARMLESS. - - PRIVATE SECTION. - METHODS test_util_uuid_session FOR TESTING RAISING cx_static_check. - METHODS test_util_04_attri_by_ref FOR TESTING RAISING cx_static_check. - METHODS test_util_01_get_classdescr FOR TESTING RAISING cx_static_check. - METHODS test_util_02_get_attri FOR TESTING RAISING cx_static_check. -ENDCLASS. - - -CLASS ltcl_unit_04_deep_data DEFINITION FINAL FOR TESTING - DURATION SHORT - RISK LEVEL HARMLESS. - - PUBLIC SECTION. - INTERFACES z2ui5_if_app. - - DATA check_initialized TYPE abap_bool. - - TYPES: - BEGIN OF ty_row, - title TYPE string, - value TYPE string, - descr TYPE string, - icon TYPE string, - info TYPE string, - selected TYPE abap_bool, - checkbox TYPE abap_bool, - END OF ty_row. - - CLASS-DATA t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY. - - CLASS-DATA sv_status TYPE string. - - PRIVATE SECTION. - METHODS test_app_deep_data FOR TESTING RAISING cx_static_check. - METHODS test_app_deep_data_change FOR TESTING RAISING cx_static_check. -ENDCLASS. - - -CLASS ltcl_unit_01_json IMPLEMENTATION. - - METHOD test_json_attri. - - DATA(lo_tree) = NEW z2ui5_lcl_utility_tree_json( ). - lo_tree->add_attribute( n = `AAA` v = `BBB` ). - - DATA(lv_result) = lo_tree->stringify( ). - IF `{"AAA":"BBB"}` <> lv_result. - cl_abap_unit_assert=>fail( 'json tree - wrong stringify attributes' ). - ENDIF. - - ENDMETHOD. - - METHOD test_json_object. - - DATA(lo_tree) = NEW z2ui5_lcl_utility_tree_json( ). - lo_tree->add_attribute_object( `CCC` )->add_attribute( n = `AAA` v = `BBB` ). - - DATA(lv_result) = lo_tree->stringify( ). - IF `{"CCC":{"AAA":"BBB"}}` <> lv_result. - cl_abap_unit_assert=>fail( 'json tree - wrong stringify object attributes' ). - ENDIF. - - ENDMETHOD. - - METHOD test_json_struc. - - DATA(lo_tree) = NEW z2ui5_lcl_utility_tree_json( ). - - TYPES: - BEGIN OF ty_s_test, - comp1 TYPE string, - comp2 TYPE string, - END OF ty_s_test. - - DATA(ls_test) = VALUE ty_S_test( comp1 = `AAA` comp2 = `BBB` ). - - lo_tree->add_attribute_object( `CCC` )->add_attribute_struc( ls_test ). - - DATA(lv_result) = lo_tree->stringify( ). - IF `{"CCC":{"COMP1":"AAA","COMP2":"BBB"}}` <> lv_result. - cl_abap_unit_assert=>fail( 'json tree - wrong stringify structure' ). - ENDIF. - - ENDMETHOD. - - METHOD test_json_trans. - - TYPES: - BEGIN OF ty_row, - title TYPE string, - value TYPE string, - selected TYPE abap_bool, - END OF ty_row. - TYPES ty_t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY. - - DATA(lt_tab) = VALUE ty_t_tab( ( title = 'Test' value = 'this is a description' selected = abap_true ) - ( title = 'Test2' value = 'this is a new descr' selected = abap_false ) ). - - DATA(lt_tab2) = VALUE ty_t_tab( ). - - DATA(lv_tab) = z2ui5_lcl_utility=>trans_any_2_json( lt_tab ). - - /ui2/cl_json=>deserialize( EXPORTING json = lv_tab - CHANGING data = lt_tab2 ). - - IF lt_tab <> lt_tab2. - cl_abap_unit_assert=>fail( msg = 'json serial - /ui2/cl_json wrong simple table' quit = 5 ). - ENDIF. - - ENDMETHOD. - - METHOD test_json_trans_gen. - - TYPES: - BEGIN OF ty_row, - title TYPE string, - value TYPE string, - selected TYPE abap_bool, - END OF ty_row. - TYPES ty_t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY. - - DATA(lt_tab) = VALUE ty_t_tab( ( title = 'Test' value = 'this is a description' selected = abap_true ) - ( title = 'Test2' value = 'this is a new descr' selected = abap_false ) ). - - DATA(lt_tab2) = VALUE ty_t_tab( ). - - DATA(lv_tab) = z2ui5_lcl_utility=>trans_any_2_json( lt_tab ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_tab - CHANGING data = lo_data ). - - z2ui5_lcl_utility=>trans_ref_tab_2_tab( EXPORTING ir_tab_from = lo_data - IMPORTING t_result = lt_tab2 ). - - IF lt_tab <> lt_tab2. - cl_abap_unit_assert=>fail( msg = 'json serial - /ui2/cl_json wrong generic table' quit = 5 ). - ENDIF. - - ENDMETHOD. -ENDCLASS. - - -CLASS ltcl_unit_01_utility IMPLEMENTATION. - - METHOD test_util_04_attri_by_ref. - - DATA(lo_app) = NEW ltcl_unit_04_deep_data( ). - - DATA(lt_attri) = z2ui5_lcl_utility=>get_t_attri_by_ref( lo_app ). - - DATA(lt_attri_result) = VALUE z2ui5_lcl_utility=>ty_t_attri( -( name = `Z2UI5_IF_APP~ID` type_kind = `g` type = `` bind_type = `` data_stringify = `` data_rtti = `` check_ref_data = '' ) -( name = `CHECK_INITIALIZED` type_kind = `C` type = `` bind_type = `` data_stringify = `` data_rtti = `` check_ref_data = '' ) -( name = `SV_STATUS` type_kind = `g` type = `` bind_type = `` data_stringify = `` data_rtti = `` check_ref_data = '' ) -( name = `T_TAB` type_kind = `h` type = `` bind_type = `` data_stringify = `` data_rtti = `` check_ref_data = '' ) - ). - - IF lt_attri_result <> lt_attri. - cl_abap_unit_assert=>fail( msg = 'utility - create t_attri failed' quit = 5 ). - ENDIF. - - ENDMETHOD. - - METHOD test_util_uuid_session. - - DATA(lv_one) = z2ui5_lcl_utility=>get_uuid_session( ). - DATA(lv_two) = z2ui5_lcl_utility=>get_uuid_session( ). - - IF lv_one <> `1`. - cl_abap_unit_assert=>fail( msg = 'utility - create session id' quit = 5 ). - ENDIF. - - IF lv_two <> `2`. - cl_abap_unit_assert=>fail( msg = 'utility - create session id' quit = 5 ). - ENDIF. - ENDMETHOD. - - METHOD test_util_02_get_attri. - - DATA(lo_app) = NEW ltcl_unit_04_deep_data( ). - - lo_app->sv_status = `ABC`. - FIELD-SYMBOLS TYPE any. - DATA(lv_assign) = `LO_APP->` && 'SV_STATUS'. - ASSIGN (lv_assign) TO . - - IF <> `ABC`. - cl_abap_unit_assert=>fail( msg = 'utility - assign of attribute from outside not working' quit = 5 ). - ENDIF. - - ENDMETHOD. - - METHOD test_util_01_get_classdescr. - - DATA(lo_app) = NEW ltcl_unit_04_deep_data( ). - - DATA(lt_attri) = CAST cl_abap_classdescr( cl_abap_objectdescr=>describe_by_object_ref( lo_app ) )->attributes. - - DATA(lt_test) = VALUE abap_attrdescr_tab( - decimals = '0' - visibility = 'U' - is_inherited = '' - is_constant = '' - is_virtual = '' - is_read_only = '' - alias_for = '' - ( length = '8' name = 'Z2UI5_IF_APP~ID' type_kind = 'g' is_interface = 'X' is_class = '' ) - ( length = '2' name = 'CHECK_INITIALIZED' type_kind = 'C' is_interface = '' is_class = '' ) - ( length = '8' name = 'SV_STATUS' type_kind = 'g' is_interface = '' is_class = 'X' ) - ( length = '8' name = 'T_TAB' type_kind = 'h' is_interface = '' is_class = 'X' ) ). - - IF lt_test <> lt_attri. - cl_abap_unit_assert=>fail( msg = 'utility - get abap_attrdescr_tab table wrong' quit = 5 ). - ENDIF. - - ENDMETHOD. -ENDCLASS. - - -CLASS ltcl_unit_02_app_start DEFINITION FINAL FOR TESTING - DURATION SHORT - RISK LEVEL HARMLESS. - - PUBLIC SECTION. - INTERFACES z2ui5_if_app. - - DATA product TYPE string. - DATA quantity TYPE string. - DATA check_initialized TYPE abap_bool. - - CLASS-DATA sv_state TYPE string. - - PRIVATE SECTION. - METHODS test_index_html FOR TESTING RAISING cx_static_check. - METHODS test_xml_view FOR TESTING RAISING cx_static_check. - METHODS test_id FOR TESTING RAISING cx_static_check. - METHODS test_xml_popup FOR TESTING RAISING cx_static_check. - METHODS test_bind_one_way FOR TESTING RAISING cx_static_check. - METHODS test_bind_two_way FOR TESTING RAISING cx_static_check. - METHODS test_message_toast FOR TESTING RAISING cx_static_check. - METHODS test_message_box FOR TESTING RAISING cx_static_check. - METHODS test_timer FOR TESTING RAISING cx_static_check. - METHODS test_landing_page FOR TESTING RAISING cx_static_check. - METHODS test_scroll_cursor FOR TESTING RAISING cx_static_check. - METHODS test_navigate FOR TESTING RAISING cx_static_check. - METHODS test_startup_path FOR TESTING RAISING cx_static_check. -ENDCLASS. - - -CLASS ltcl_unit_02_app_start IMPLEMENTATION. - METHOD test_index_html. - -* z2ui5_cl_http_handler=>client = VALUE #( t_header = VALUE #( ( name = '~path' value = 'dummy' ) ) ). - - DATA(lv_index_html) = z2ui5_cl_http_handler=>http_get( ). - - IF lv_index_html IS INITIAL. - cl_abap_unit_assert=>fail( 'HTTP GET - index html initial' ). - ENDIF. - ENDMETHOD. - - METHOD z2ui5_if_app~main. - IF check_initialized = abap_false. - check_initialized = abap_true. - product = 'tomato'. - quantity = '500'. - - ENDIF. - - CASE client->get( )-event. - WHEN 'BUTTON_POST'. - client->message_toast_display( |{ product } { quantity } - send to the server| ). - WHEN 'BACK'. - client->nav_app_leave( client->get_app( client->get( )-id_prev_app_stack ) ). - ENDCASE. - - IF sv_state = 'TEST_MESSAGE_BOX'. - client->message_box_display( text = 'test message box' ). - ENDIF. - - IF sv_state = 'TEST_MESSAGE_TOAST'. - client->message_toast_display( text = 'test message toast' ). - ENDIF. - - CASE sv_state. - - WHEN 'TEST_ONE_WAY'. - client->view_display( z2ui5_cl_xml_view=>factory( client )->shell( - )->page( title = 'abap2UI5 - First Example' - navbuttonpress = client->_event( 'BACK' ) - shownavbutton = abap_true - )->simple_form( title = 'Form Title' editable = abap_true - )->content( 'form' - )->title( 'Input' - )->label( 'quantity' - )->input( client->_bind( quantity ) - )->label( 'product' - )->input( value = product - enabled = abap_false - )->button( text = 'post' - press = client->_event( 'BUTTON_POST' ) - )->get_root( )->xml_get( ) ). - - WHEN 'TEST_POPUP'. - - client->popup_display( z2ui5_cl_xml_view=>factory( client - )->dialog( title = 'abap2UI5 - First Example' - )->simple_form( title = 'Form Title' editable = abap_true - )->content( 'form' - )->title( 'Input' - )->label( 'quantity' - )->input( client->_bind_edit( quantity ) - )->label( 'product' - )->input( value = product - enabled = abap_false - )->button( text = 'post' - press = client->_event( 'BUTTON_POST' ) - )->get_root( )->xml_get( ) ). - - WHEN 'TEST_TIMER'. - client->timer_set( event_finished = 'TIMER_FINISHED' - interval_ms = `500` ). - - client->view_display( z2ui5_cl_xml_view=>factory( client )->shell( - )->page( title = 'abap2UI5 - First Example' - navbuttonpress = client->_event( 'BACK' ) - shownavbutton = abap_true - )->simple_form( title = 'Form Title' editable = abap_true - )->content( 'form' - )->title( 'Input' - )->label( 'quantity' - )->input( client->_bind( quantity ) - )->label( 'product' - )->input( value = product - enabled = abap_false - )->button( text = 'post' - press = client->_event( 'BUTTON_POST' ) - )->get_root( )->xml_get( ) ). - - WHEN OTHERS. - client->view_display( z2ui5_cl_xml_view=>factory( client )->shell( - )->page( title = 'abap2UI5 - First Example' - navbuttonpress = client->_event( 'BACK' ) - shownavbutton = abap_true - )->simple_form( title = 'Form Title' editable = abap_true - )->content( 'form' - )->title( 'Input' - )->label( 'quantity' - )->input( client->_bind_edit( quantity ) - )->label( 'product' - )->input( value = product - enabled = abap_false - )->button( text = 'post' - press = client->_event( 'BUTTON_POST' ) - )->get_root( )->xml_get( ) ). - - ENDCASE. - - IF sv_state = 'TEST_SCROLL_CURSOR'. - - client->view_display( `test` ). - client->cursor_set( id = 'id_text2' cursorpos = '5' selectionstart = '5' selectionend = '10' ). - - client->scroll_position_set( VALUE #( v = '99999' - ( n = 'id_page' ) - ( n = 'id_text3' ) ) ). - - ENDIF. - - IF sv_state = 'TEST_NAVIGATE'. - DATA(lo_app) = NEW ltcl_unit_02_app_start( ). - sv_state = 'LEAVE_APP'. - client->nav_app_call( lo_app ). - RETURN. - ENDIF. - - IF sv_state = 'LEAVE_APP'. - CLEAR sv_state. - client->nav_app_leave( client->get_app( client->get( )-id_prev_app ) ). - ENDIF. - ENDMETHOD. - - METHOD test_xml_view. - - sv_state = ``. - DATA(lv_response) = z2ui5_cl_http_handler=>http_post( - body = `` - path_info = 'LTCL_UNIT_02_APP_START' ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - FIELD-SYMBOLS TYPE any. - UNASSIGN . - DATA(lv_assign) = `PARAMS->S_VIEW->XML->*`. - ASSIGN lo_data->(lv_assign) TO . - = shift_left( ). - IF (9) <> `fail( msg = 'xml view - intital view wrong' quit = 5 ). - ENDIF. - ENDMETHOD. - - METHOD test_id. - - sv_state = ``. - DATA(lv_response) = z2ui5_cl_http_handler=>http_post( - body = `` - path_info = 'LTCL_UNIT_02_APP_START' ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - FIELD-SYMBOLS TYPE any. - UNASSIGN . - DATA(lv_assign) = `ID->*`. - ASSIGN lo_data->(lv_assign) TO . - IF IS INITIAL. - cl_abap_unit_assert=>fail( msg = 'id - initial value is initial' quit = 5 ). - ENDIF. - ENDMETHOD. - - METHOD test_bind_one_way. - - sv_state = `TEST_ONE_WAY`. - DATA(lv_response) = z2ui5_cl_http_handler=>http_post( - body = `` - path_info = 'LTCL_UNIT_02_APP_START' ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - FIELD-SYMBOLS TYPE any. - UNASSIGN . - DATA(lv_assign) = `OVIEWMODEL->QUANTITY->*`. - ASSIGN lo_data->(lv_assign) TO . - IF <> `500`. - cl_abap_unit_assert=>fail( msg = 'data binding - initial set oUpdate wrong' quit = 5 ). - ENDIF. - ENDMETHOD. - - METHOD test_bind_two_way. - - sv_state = ``. - DATA(lv_response) = z2ui5_cl_http_handler=>http_post( - body = `` - path_info = 'LTCL_UNIT_02_APP_START' ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - FIELD-SYMBOLS TYPE any. - UNASSIGN . - DATA(lv_assign) = `OVIEWMODEL->OUPDATE->QUANTITY->*`. - ASSIGN lo_data->(lv_assign) TO . - IF <> `500`. - cl_abap_unit_assert=>fail( msg = 'data binding - initial set oUpdate wrong' quit = 5 ). - ENDIF. - ENDMETHOD. - - METHOD test_message_box. - - sv_state = `TEST_MESSAGE_BOX`. - DATA(lv_response) = z2ui5_cl_http_handler=>http_post( - body = `` - path_info = 'LTCL_UNIT_02_APP_START' ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - FIELD-SYMBOLS TYPE any. - - UNASSIGN . - DATA(lv_assign) = `PARAMS->S_MSG_BOX->TEXT->*`. - ASSIGN lo_data->(lv_assign) TO . - IF <> `test message box`. - cl_abap_unit_assert=>fail( msg = 'message box - text wrong' quit = 5 ). - ENDIF. - - UNASSIGN . - lv_assign = `PARAMS->S_MSG_BOX->TYPE->*`. - ASSIGN lo_data->(lv_assign) TO . - IF <> `information`. - cl_abap_unit_assert=>fail( msg = 'message box - type wrong' quit = 5 ). - ENDIF. - ENDMETHOD. - - METHOD test_message_toast. - - sv_state = `TEST_MESSAGE_TOAST`. - DATA(lv_response) = z2ui5_cl_http_handler=>http_post( - body = `` - path_info = 'LTCL_UNIT_02_APP_START' ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - FIELD-SYMBOLS TYPE any. - - UNASSIGN . - DATA(lv_assign) = `PARAMS->S_MSG_TOAST->TEXT->*`. - ASSIGN lo_data->(lv_assign) TO . - IF <> `test message toast`. - cl_abap_unit_assert=>fail( msg = 'message toast - text wrong' quit = 5 ). - ENDIF. - - ENDMETHOD. - - METHOD test_timer. - - sv_state = `TEST_TIMER`. - DATA(lv_response) = z2ui5_cl_http_handler=>http_post( - body = `` - path_info = 'LTCL_UNIT_02_APP_START' ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - FIELD-SYMBOLS TYPE any. - - UNASSIGN . - DATA(lv_assign) = `PARAMS->S_TIMER->EVENT_FINISHED->*`. - ASSIGN lo_data->(lv_assign) TO . - IF <> `TIMER_FINISHED`. - cl_abap_unit_assert=>fail( msg = 'timer - event wrong' quit = 5 ). - ENDIF. - - UNASSIGN . - lv_assign = `PARAMS->S_TIMER->INTERVAL_MS->*`. - ASSIGN lo_data->(lv_assign) TO . - IF <> `500`. - cl_abap_unit_assert=>fail( msg = 'timer - ms wrong' quit = 5 ). - ENDIF. - ENDMETHOD. - - METHOD test_xml_popup. - - sv_state = `TEST_POPUP`. - DATA(lv_response) = z2ui5_cl_http_handler=>http_post( - body = `` - path_info = 'LTCL_UNIT_02_APP_START' ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - FIELD-SYMBOLS TYPE any. - UNASSIGN . - DATA(lv_assign) = `PARAMS->S_POPUP->XML->*`. - ASSIGN lo_data->(lv_assign) TO . - = shift_left( ). - IF (9) <> `fail( msg = 'xml popup - intital popup wrong' quit = 5 ). - ENDIF. - ENDMETHOD. - - METHOD test_landing_page. - - DATA(lv_response) = z2ui5_cl_http_handler=>http_post( - body = `` - path_info = '' ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - FIELD-SYMBOLS TYPE any. - UNASSIGN . - DATA(lv_assign) = `PARAMS->S_VIEW->XML->*`. - ASSIGN lo_data->(lv_assign) TO . - = shift_left( ). - IF NS `Step 4`. - cl_abap_unit_assert=>fail( msg = 'landing page - not started when no app' quit = 5 ). - ENDIF. - ENDMETHOD. - - METHOD test_scroll_cursor. - - sv_state = `TEST_SCROLL_CURSOR`. - DATA(lv_response) = z2ui5_cl_http_handler=>http_post( - body = `` - path_info = 'LTCL_UNIT_02_APP_START' ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - - - - ENDMETHOD. - - METHOD test_startup_path. - - sv_state = `TEST_NAVIGATE`. - DATA(lv_response) = z2ui5_cl_http_handler=>http_post( - body = `` - path_info = 'LTCL_UNIT_02_APP_START' ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - - ENDMETHOD. - - METHOD test_navigate. - - sv_state = `TEST_NAVIGATE`. - DATA(lv_response) = z2ui5_cl_http_handler=>http_post( - body = `` - path_info = 'LTCL_UNIT_02_APP_START' ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - ENDMETHOD. -ENDCLASS. - - -CLASS ltcl_unit_03_app_ajax DEFINITION FINAL FOR TESTING - DURATION SHORT - RISK LEVEL HARMLESS. - - PUBLIC SECTION. - INTERFACES z2ui5_if_app. - - DATA product TYPE string. - DATA quantity TYPE string. - DATA check_initialized TYPE abap_bool. - - CLASS-DATA sv_state TYPE string. - - PRIVATE SECTION. - METHODS test_app_change_value FOR TESTING RAISING cx_static_check. - METHODS test_app_event FOR TESTING RAISING cx_static_check. - METHODS test_app_dump FOR TESTING RAISING cx_static_check. - -ENDCLASS. - - -CLASS ltcl_unit_03_app_ajax IMPLEMENTATION. - METHOD z2ui5_if_app~main. - IF check_initialized = abap_false. - check_initialized = abap_true. - product = 'tomato'. - quantity = '500'. - - ENDIF. - - CASE client->get( )-event. - WHEN 'BUTTON_POST'. - client->message_toast_display( |{ product } { quantity } - send to the server| ). - WHEN 'BACK'. - client->nav_app_leave( client->get_app( client->get( )-id_prev_app_stack ) ). - ENDCASE. - - IF sv_state = 'ERROR'. - z2ui5_lcl_utility=>raise( `exception test` ). - ENDIF. - - client->view_display( z2ui5_cl_xml_view=>factory( client )->shell( - )->page( title = 'abap2UI5 - First Example' - navbuttonpress = client->_event( 'BACK' ) - shownavbutton = abap_true - )->simple_form( title = 'Form Title' editable = abap_true - )->content( 'form' - )->title( 'Input' - )->label( 'quantity' - )->input( client->_bind( quantity ) - )->label( 'product' - )->input( value = product - enabled = abap_false - )->button( text = 'post' - press = client->_event( 'BUTTON_POST' ) - )->get_root( )->xml_get( ) ). - ENDMETHOD. - - METHOD test_app_change_value. - - DATA(lv_response) = z2ui5_cl_http_handler=>http_post( - body = `` - path_info = 'LTCL_UNIT_02_APP_START' ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - FIELD-SYMBOLS TYPE any. - - UNASSIGN . - DATA(lv_assign) = `ID->*`. - ASSIGN lo_data->(lv_assign) TO . - IF IS INITIAL. - cl_abap_unit_assert=>fail( msg = 'id - initial value is initial' quit = 5 ). - ENDIF. - DATA(lv_id) = CONV string( ). - - DATA(lv_request) = `{"oUpdate":{"QUANTITY":"600"},"ID": "` && lv_id && `" ,"ARGUMENTS":{"EVENT":"BUTTON_POST","METHOD":"UPDATE"}}`. -* z2ui5_cl_http_handler=>client = VALUE #( body = lv_request ). - lv_response = z2ui5_cl_http_handler=>http_post( - body = lv_request - ). - - CLEAR lo_data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - UNASSIGN . - lv_assign = `OVIEWMODEL->OUPDATE->QUANTITY->*`. - ASSIGN lo_data->(lv_assign) TO . - IF <> `600`. - cl_abap_unit_assert=>fail( msg = 'data binding - frontend updated value wrong after roundtrip' quit = 5 ). - ENDIF. - ENDMETHOD. - - METHOD test_app_event. - - DATA(lv_response) = z2ui5_cl_http_handler=>http_post( - body = `` - path_info = 'LTCL_UNIT_02_APP_START' ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - FIELD-SYMBOLS TYPE any. - - UNASSIGN . - DATA(lv_assign) = `ID->*`. - ASSIGN lo_data->(lv_assign) TO . - IF IS INITIAL. - cl_abap_unit_assert=>fail( msg = 'id - initial value is initial' quit = 5 ). - ENDIF. - DATA(lv_id) = CONV string( ). - - DATA(lv_request) = `{"oUpdate":{"QUANTITY":"700"},"ID": "` && lv_id && `" ,"ARGUMENTS": { "0" : {"EVENT":"BUTTON_POST","METHOD":"UPDATE"} } }`. -* z2ui5_cl_http_handler=>client = VALUE #( body = lv_request ). - lv_response = z2ui5_cl_http_handler=>http_post( - body = lv_request ). - - CLEAR lo_data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - UNASSIGN . - lv_assign = `PARAMS->S_MSG_TOAST->TEXT->*`. - ASSIGN lo_data->(lv_assign) TO . - IF <> `tomato 700 - send to the server`. - cl_abap_unit_assert=>fail( msg = 'message toast - text wrong' quit = 5 ). - ENDIF. - ENDMETHOD. - - METHOD test_app_dump. - -* sv_state = `ERROR`. +*CLASS ltcl_unit_01_json DEFINITION FINAL FOR TESTING +* DURATION SHORT +* RISK LEVEL HARMLESS. +* +* PRIVATE SECTION. +* METHODS test_json_attri FOR TESTING RAISING cx_static_check. +* METHODS test_json_object FOR TESTING RAISING cx_static_check. +* METHODS test_json_struc FOR TESTING RAISING cx_static_check. +* METHODS test_json_trans FOR TESTING RAISING cx_static_check. +* METHODS test_json_trans_gen FOR TESTING RAISING cx_static_check. +*ENDCLASS. +* +* +*CLASS ltcl_unit_01_utility DEFINITION FINAL FOR TESTING +* DURATION SHORT +* RISK LEVEL HARMLESS. +* +* PRIVATE SECTION. +* METHODS test_util_uuid_session FOR TESTING RAISING cx_static_check. +* METHODS test_util_04_attri_by_ref FOR TESTING RAISING cx_static_check. +* METHODS test_util_01_get_classdescr FOR TESTING RAISING cx_static_check. +* METHODS test_util_02_get_attri FOR TESTING RAISING cx_static_check. +*ENDCLASS. +* +* +*CLASS ltcl_unit_04_deep_data DEFINITION FINAL FOR TESTING +* DURATION SHORT +* RISK LEVEL HARMLESS. +* +* PUBLIC SECTION. +* INTERFACES z2ui5_if_app. +* +* DATA check_initialized TYPE abap_bool. +* +* TYPES: +* BEGIN OF ty_row, +* title TYPE string, +* value TYPE string, +* descr TYPE string, +* icon TYPE string, +* info TYPE string, +* selected TYPE abap_bool, +* checkbox TYPE abap_bool, +* END OF ty_row. +* +* CLASS-DATA t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY. +* +* CLASS-DATA sv_status TYPE string. +* +* PRIVATE SECTION. +* METHODS test_app_deep_data FOR TESTING RAISING cx_static_check. +* METHODS test_app_deep_data_change FOR TESTING RAISING cx_static_check. +*ENDCLASS. +* +* +*CLASS ltcl_unit_01_json IMPLEMENTATION. +* +* METHOD test_json_attri. +* +* DATA(lo_tree) = NEW z2ui5_lcl_utility_tree_json( ). +* lo_tree->add_attribute( n = `AAA` v = `BBB` ). +* +* DATA(lv_result) = lo_tree->stringify( ). +* IF `{"AAA":"BBB"}` <> lv_result. +* cl_abap_unit_assert=>fail( 'json tree - wrong stringify attributes' ). +* ENDIF. +* +* ENDMETHOD. +* +* METHOD test_json_object. +* +* DATA(lo_tree) = NEW z2ui5_lcl_utility_tree_json( ). +* lo_tree->add_attribute_object( `CCC` )->add_attribute( n = `AAA` v = `BBB` ). +* +* DATA(lv_result) = lo_tree->stringify( ). +* IF `{"CCC":{"AAA":"BBB"}}` <> lv_result. +* cl_abap_unit_assert=>fail( 'json tree - wrong stringify object attributes' ). +* ENDIF. +* +* ENDMETHOD. +* +* METHOD test_json_struc. +* +* DATA(lo_tree) = NEW z2ui5_lcl_utility_tree_json( ). +* +* TYPES: +* BEGIN OF ty_s_test, +* comp1 TYPE string, +* comp2 TYPE string, +* END OF ty_s_test. +* +* DATA(ls_test) = VALUE ty_S_test( comp1 = `AAA` comp2 = `BBB` ). +* +* lo_tree->add_attribute_object( `CCC` )->add_attribute_struc( ls_test ). +* +* DATA(lv_result) = lo_tree->stringify( ). +* IF `{"CCC":{"COMP1":"AAA","COMP2":"BBB"}}` <> lv_result. +* cl_abap_unit_assert=>fail( 'json tree - wrong stringify structure' ). +* ENDIF. +* +* ENDMETHOD. +* +* METHOD test_json_trans. +* +* TYPES: +* BEGIN OF ty_row, +* title TYPE string, +* value TYPE string, +* selected TYPE abap_bool, +* END OF ty_row. +* TYPES ty_t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY. +* +* DATA(lt_tab) = VALUE ty_t_tab( ( title = 'Test' value = 'this is a description' selected = abap_true ) +* ( title = 'Test2' value = 'this is a new descr' selected = abap_false ) ). +* +* DATA(lt_tab2) = VALUE ty_t_tab( ). +* +* DATA(lv_tab) = z2ui5_lcl_utility=>trans_any_2_json( lt_tab ). +* +* /ui2/cl_json=>deserialize( EXPORTING json = lv_tab +* CHANGING data = lt_tab2 ). +* +* IF lt_tab <> lt_tab2. +* cl_abap_unit_assert=>fail( msg = 'json serial - /ui2/cl_json wrong simple table' quit = 5 ). +* ENDIF. +* +* ENDMETHOD. +* +* METHOD test_json_trans_gen. +* +* TYPES: +* BEGIN OF ty_row, +* title TYPE string, +* value TYPE string, +* selected TYPE abap_bool, +* END OF ty_row. +* TYPES ty_t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY. +* +* DATA(lt_tab) = VALUE ty_t_tab( ( title = 'Test' value = 'this is a description' selected = abap_true ) +* ( title = 'Test2' value = 'this is a new descr' selected = abap_false ) ). +* +* DATA(lt_tab2) = VALUE ty_t_tab( ). +* +* DATA(lv_tab) = z2ui5_lcl_utility=>trans_any_2_json( lt_tab ). +* +* DATA lo_data TYPE REF TO data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_tab +* CHANGING data = lo_data ). +* +* z2ui5_lcl_utility=>trans_ref_tab_2_tab( EXPORTING ir_tab_from = lo_data +* IMPORTING t_result = lt_tab2 ). +* +* IF lt_tab <> lt_tab2. +* cl_abap_unit_assert=>fail( msg = 'json serial - /ui2/cl_json wrong generic table' quit = 5 ). +* ENDIF. +* +* ENDMETHOD. +*ENDCLASS. +* +* +*CLASS ltcl_unit_01_utility IMPLEMENTATION. +* +* METHOD test_util_04_attri_by_ref. +* +* DATA(lo_app) = NEW ltcl_unit_04_deep_data( ). +* +* DATA(lt_attri) = z2ui5_lcl_utility=>get_t_attri_by_ref( lo_app ). +* +* DATA(lt_attri_result) = VALUE z2ui5_lcl_utility=>ty_t_attri( +*( name = `Z2UI5_IF_APP~ID` type_kind = `g` type = `` bind_type = `` data_stringify = `` data_rtti = `` check_ref_data = '' ) +*( name = `CHECK_INITIALIZED` type_kind = `C` type = `` bind_type = `` data_stringify = `` data_rtti = `` check_ref_data = '' ) +*( name = `SV_STATUS` type_kind = `g` type = `` bind_type = `` data_stringify = `` data_rtti = `` check_ref_data = '' ) +*( name = `T_TAB` type_kind = `h` type = `` bind_type = `` data_stringify = `` data_rtti = `` check_ref_data = '' ) +* ). +* +* IF lt_attri_result <> lt_attri. +* cl_abap_unit_assert=>fail( msg = 'utility - create t_attri failed' quit = 5 ). +* ENDIF. +* +* ENDMETHOD. +* +* METHOD test_util_uuid_session. +* +* DATA(lv_one) = z2ui5_lcl_utility=>get_uuid_session( ). +* DATA(lv_two) = z2ui5_lcl_utility=>get_uuid_session( ). +* +* IF lv_one <> `1`. +* cl_abap_unit_assert=>fail( msg = 'utility - create session id' quit = 5 ). +* ENDIF. +* +* IF lv_two <> `2`. +* cl_abap_unit_assert=>fail( msg = 'utility - create session id' quit = 5 ). +* ENDIF. +* ENDMETHOD. +* +* METHOD test_util_02_get_attri. +* +* DATA(lo_app) = NEW ltcl_unit_04_deep_data( ). +* +* lo_app->sv_status = `ABC`. +* FIELD-SYMBOLS TYPE any. +* DATA(lv_assign) = `LO_APP->` && 'SV_STATUS'. +* ASSIGN (lv_assign) TO . +* +* IF <> `ABC`. +* cl_abap_unit_assert=>fail( msg = 'utility - assign of attribute from outside not working' quit = 5 ). +* ENDIF. +* +* ENDMETHOD. +* +* METHOD test_util_01_get_classdescr. +* +* DATA(lo_app) = NEW ltcl_unit_04_deep_data( ). +* +* DATA(lt_attri) = CAST cl_abap_classdescr( cl_abap_objectdescr=>describe_by_object_ref( lo_app ) )->attributes. +* +* DATA(lt_test) = VALUE abap_attrdescr_tab( +* decimals = '0' +* visibility = 'U' +* is_inherited = '' +* is_constant = '' +* is_virtual = '' +* is_read_only = '' +* alias_for = '' +* ( length = '8' name = 'Z2UI5_IF_APP~ID' type_kind = 'g' is_interface = 'X' is_class = '' ) +* ( length = '2' name = 'CHECK_INITIALIZED' type_kind = 'C' is_interface = '' is_class = '' ) +* ( length = '8' name = 'SV_STATUS' type_kind = 'g' is_interface = '' is_class = 'X' ) +* ( length = '8' name = 'T_TAB' type_kind = 'h' is_interface = '' is_class = 'X' ) ). +* +* IF lt_test <> lt_attri. +* cl_abap_unit_assert=>fail( msg = 'utility - get abap_attrdescr_tab table wrong' quit = 5 ). +* ENDIF. +* +* ENDMETHOD. +*ENDCLASS. +* +* +*CLASS ltcl_unit_02_app_start DEFINITION FINAL FOR TESTING +* DURATION SHORT +* RISK LEVEL HARMLESS. +* +* PUBLIC SECTION. +* INTERFACES z2ui5_if_app. +* +* DATA product TYPE string. +* DATA quantity TYPE string. +* DATA check_initialized TYPE abap_bool. +* +* CLASS-DATA sv_state TYPE string. +* +* PRIVATE SECTION. +* METHODS test_index_html FOR TESTING RAISING cx_static_check. +* METHODS test_xml_view FOR TESTING RAISING cx_static_check. +* METHODS test_id FOR TESTING RAISING cx_static_check. +* METHODS test_xml_popup FOR TESTING RAISING cx_static_check. +* METHODS test_bind_one_way FOR TESTING RAISING cx_static_check. +* METHODS test_bind_two_way FOR TESTING RAISING cx_static_check. +* METHODS test_message_toast FOR TESTING RAISING cx_static_check. +* METHODS test_message_box FOR TESTING RAISING cx_static_check. +* METHODS test_timer FOR TESTING RAISING cx_static_check. +* METHODS test_landing_page FOR TESTING RAISING cx_static_check. +* METHODS test_scroll_cursor FOR TESTING RAISING cx_static_check. +* METHODS test_navigate FOR TESTING RAISING cx_static_check. +* METHODS test_startup_path FOR TESTING RAISING cx_static_check. +*ENDCLASS. +* +* +*CLASS ltcl_unit_02_app_start IMPLEMENTATION. +* METHOD test_index_html. +* +** z2ui5_cl_http_handler=>client = VALUE #( t_header = VALUE #( ( name = '~path' value = 'dummy' ) ) ). +* +* DATA(lv_index_html) = z2ui5_cl_http_handler=>http_get( ). +* +* IF lv_index_html IS INITIAL. +* cl_abap_unit_assert=>fail( 'HTTP GET - index html initial' ). +* ENDIF. +* ENDMETHOD. +* +* METHOD z2ui5_if_app~main. +* IF check_initialized = abap_false. +* check_initialized = abap_true. +* product = 'tomato'. +* quantity = '500'. +* +* ENDIF. +* +* CASE client->get( )-event. +* WHEN 'BUTTON_POST'. +* client->message_toast_display( |{ product } { quantity } - send to the server| ). +* WHEN 'BACK'. +* client->nav_app_leave( client->get_app( client->get( )-id_prev_app_stack ) ). +* ENDCASE. +* +* IF sv_state = 'TEST_MESSAGE_BOX'. +* client->message_box_display( text = 'test message box' ). +* ENDIF. +* +* IF sv_state = 'TEST_MESSAGE_TOAST'. +* client->message_toast_display( text = 'test message toast' ). +* ENDIF. +* +* CASE sv_state. +* +* WHEN 'TEST_ONE_WAY'. +* client->view_display( z2ui5_cl_xml_view=>factory( client )->shell( +* )->page( title = 'abap2UI5 - First Example' +* navbuttonpress = client->_event( 'BACK' ) +* shownavbutton = abap_true +* )->simple_form( title = 'Form Title' editable = abap_true +* )->content( 'form' +* )->title( 'Input' +* )->label( 'quantity' +* )->input( client->_bind( quantity ) +* )->label( 'product' +* )->input( value = product +* enabled = abap_false +* )->button( text = 'post' +* press = client->_event( 'BUTTON_POST' ) +* )->get_root( )->xml_get( ) ). +* +* WHEN 'TEST_POPUP'. +* +* client->popup_display( z2ui5_cl_xml_view=>factory( client +* )->dialog( title = 'abap2UI5 - First Example' +* )->simple_form( title = 'Form Title' editable = abap_true +* )->content( 'form' +* )->title( 'Input' +* )->label( 'quantity' +* )->input( client->_bind_edit( quantity ) +* )->label( 'product' +* )->input( value = product +* enabled = abap_false +* )->button( text = 'post' +* press = client->_event( 'BUTTON_POST' ) +* )->get_root( )->xml_get( ) ). +* +* WHEN 'TEST_TIMER'. +* client->timer_set( event_finished = 'TIMER_FINISHED' +* interval_ms = `500` ). +* +* client->view_display( z2ui5_cl_xml_view=>factory( client )->shell( +* )->page( title = 'abap2UI5 - First Example' +* navbuttonpress = client->_event( 'BACK' ) +* shownavbutton = abap_true +* )->simple_form( title = 'Form Title' editable = abap_true +* )->content( 'form' +* )->title( 'Input' +* )->label( 'quantity' +* )->input( client->_bind( quantity ) +* )->label( 'product' +* )->input( value = product +* enabled = abap_false +* )->button( text = 'post' +* press = client->_event( 'BUTTON_POST' ) +* )->get_root( )->xml_get( ) ). +* +* WHEN OTHERS. +* client->view_display( z2ui5_cl_xml_view=>factory( client )->shell( +* )->page( title = 'abap2UI5 - First Example' +* navbuttonpress = client->_event( 'BACK' ) +* shownavbutton = abap_true +* )->simple_form( title = 'Form Title' editable = abap_true +* )->content( 'form' +* )->title( 'Input' +* )->label( 'quantity' +* )->input( client->_bind_edit( quantity ) +* )->label( 'product' +* )->input( value = product +* enabled = abap_false +* )->button( text = 'post' +* press = client->_event( 'BUTTON_POST' ) +* )->get_root( )->xml_get( ) ). +* +* ENDCASE. +* +* IF sv_state = 'TEST_SCROLL_CURSOR'. +* +* client->view_display( `test` ). +* client->cursor_set( id = 'id_text2' cursorpos = '5' selectionstart = '5' selectionend = '10' ). +* +* client->scroll_position_set( VALUE #( v = '99999' +* ( n = 'id_page' ) +* ( n = 'id_text3' ) ) ). +* +* ENDIF. +* +* IF sv_state = 'TEST_NAVIGATE'. +* DATA(lo_app) = NEW ltcl_unit_02_app_start( ). +* sv_state = 'LEAVE_APP'. +* client->nav_app_call( lo_app ). +* RETURN. +* ENDIF. +* +* IF sv_state = 'LEAVE_APP'. +* CLEAR sv_state. +* client->nav_app_leave( client->get_app( client->get( )-id_prev_app ) ). +* ENDIF. +* ENDMETHOD. +* +* METHOD test_xml_view. +* +* sv_state = ``. * DATA(lv_response) = z2ui5_cl_http_handler=>http_post( -* body = `` -* path_info = 'LTCL_UNIT_03_APP_AJAX' ). +* body = `` +* path_info = 'LTCL_UNIT_02_APP_START' ). * * DATA lo_data TYPE REF TO data. * /ui2/cl_json=>deserialize( EXPORTING json = lv_response @@ -792,171 +414,549 @@ CLASS ltcl_unit_03_app_ajax IMPLEMENTATION. * DATA(lv_assign) = `PARAMS->S_VIEW->XML->*`. * ASSIGN lo_data->(lv_assign) TO . * = shift_left( ). -* IF NS `MessagePage`. -* cl_abap_unit_assert=>fail( msg = 'system app error - not shown by exception' quit = 5 ). +* IF (9) <> `fail( msg = 'xml view - intital view wrong' quit = 5 ). * ENDIF. - ENDMETHOD. -ENDCLASS. - - -CLASS ltcl_unit_04_deep_data IMPLEMENTATION. - METHOD z2ui5_if_app~main. - IF check_initialized = abap_false. - check_initialized = abap_true. - - t_tab = VALUE #( title = 'Peter' - descr = 'this is a description' - icon = 'sap-icon://account' - ( info = 'completed' ) - ( info = 'incompleted' ) ). - - ENDIF. - - CASE sv_status. - - WHEN `CHANGE`. - client->view_display( z2ui5_cl_xml_view=>factory( client )->shell( - )->page( title = 'abap2UI5 - First Example' - navbuttonpress = client->_event( 'BACK' ) - shownavbutton = abap_true - )->list( - " TODO: check spelling: Ouput (typo) -> Output (ABAP cleaner) - headertext = 'List Ouput' - items = client->_bind_edit( t_tab ) - mode = `SingleSelectMaster` - selectionchange = client->_event( 'SELCHANGE' ) - )->standard_list_item( title = '{TITLE}' - description = '{DESCR}' - icon = '{ICON}' - info = '{INFO}' - press = client->_event( 'TEST' ) - type = `Navigation` - selected = `{SELECTED}` - )->get_root( )->xml_get( ) ). - - WHEN OTHERS. - client->view_display( z2ui5_cl_xml_view=>factory( client )->shell( - )->page( title = 'abap2UI5 - First Example' - navbuttonpress = client->_event( 'BACK' ) - shownavbutton = abap_true - )->list( - " TODO: check spelling: Ouput (typo) -> Output (ABAP cleaner) - headertext = 'List Ouput' - items = client->_bind( t_tab ) - mode = `SingleSelectMaster` - selectionchange = client->_event( 'SELCHANGE' ) - )->standard_list_item( title = '{TITLE}' - description = '{DESCR}' - icon = '{ICON}' - info = '{INFO}' - press = client->_event( 'TEST' ) - type = `Navigation` - selected = `{SELECTED}` - )->get_root( )->xml_get( ) ). - - ENDCASE. - ENDMETHOD. - - METHOD test_app_deep_data. - - DATA(lv_response) = z2ui5_cl_http_handler=>http_post( - body = `` - path_info = 'LTCL_UNIT_04_DEEP_DATA' ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - FIELD-SYMBOLS TYPE any. - - UNASSIGN . - FIELD-SYMBOLS TYPE STANDARD TABLE. - FIELD-SYMBOLS TYPE REF TO data. - DATA(lv_assign) = `OVIEWMODEL->T_TAB->*`. - ASSIGN lo_data->(lv_assign) TO . - ASSIGN [ 1 ] TO . - - DATA ls_tab_test TYPE ty_row. - ls_tab_test = VALUE #( title = 'Peter' info = 'completed' descr = 'this is a description' icon = 'sap-icon://account' ). - - lv_assign = `TITLE->*`. - ASSIGN ->(lv_assign) TO . - IF <> ls_tab_test-title. - cl_abap_unit_assert=>fail( msg = 'data binding - initial tab data wrong' quit = 5 ). - ENDIF. - - lv_assign = `INFO->*`. - ASSIGN ->(lv_assign) TO . - IF <> ls_tab_test-info. - cl_abap_unit_assert=>fail( msg = 'data binding - initial tab data wrong' quit = 5 ). - ENDIF. - - lv_assign = `DESCR->*`. - ASSIGN ->(lv_assign) TO . - IF <> ls_tab_test-descr. - cl_abap_unit_assert=>fail( msg = 'data binding - initial tab data wrong' quit = 5 ). - ENDIF. - ENDMETHOD. - - METHOD test_app_deep_data_change. - - sv_status = 'CHANGE'. - DATA(lv_response) = z2ui5_cl_http_handler=>http_post( - body = `` - path_info = 'LTCL_UNIT_04_DEEP_DATA' ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - - FIELD-SYMBOLS TYPE any. - - UNASSIGN . - FIELD-SYMBOLS TYPE STANDARD TABLE. - FIELD-SYMBOLS TYPE REF TO data. - DATA(lv_assign) = `OVIEWMODEL->OUPDATE->T_TAB->*`. - ASSIGN lo_data->(lv_assign) TO . - ASSIGN [ 1 ] TO . - - DATA ls_tab_test TYPE ty_row. - ls_tab_test = VALUE #( title = 'Peter' info = 'completed' descr = 'this is a description' icon = 'sap-icon://account' ). - - lv_assign = `TITLE->*`. - ASSIGN ->(lv_assign) TO . - IF <> ls_tab_test-title. - cl_abap_unit_assert=>fail( msg = 'data binding - initial tab data wrong' quit = 5 ). - ENDIF. - - lv_assign = `INFO->*`. - ASSIGN ->(lv_assign) TO . - IF <> ls_tab_test-info. - cl_abap_unit_assert=>fail( msg = 'data binding - initial tab data wrong' quit = 5 ). - ENDIF. - - lv_assign = `DESCR->*`. - ASSIGN ->(lv_assign) TO . - IF <> ls_tab_test-descr. - cl_abap_unit_assert=>fail( msg = 'data binding - initial tab data wrong' quit = 5 ). - ENDIF. - - UNASSIGN . - lv_assign = `ID->*`. - ASSIGN lo_data->(lv_assign) TO . - IF IS INITIAL. - cl_abap_unit_assert=>fail( msg = 'id - initial value is initial' quit = 5 ). - ENDIF. - DATA(lv_id) = CONV string( ). - - DATA(lv_tab) = z2ui5_lcl_utility=>trans_any_2_json( t_tab ). - - DATA(lv_request) = `{"oUpdate":{"QUANTITY":"600", "T_TAB":` && lv_tab && `},"oSystem":{"ID": "` && lv_id && `"` && `,"CHECK_DEBUG_ACTIVE":true},"oEvent":{"EVENT":"BUTTON_POST","METHOD":"UPDATE"}}`. - - lv_response = z2ui5_cl_http_handler=>http_post( - body = lv_request - ). - - CLEAR lo_data. - /ui2/cl_json=>deserialize( EXPORTING json = lv_response - CHANGING data = lo_data ). - ENDMETHOD. -ENDCLASS. +* ENDMETHOD. +* +* METHOD test_id. +* +* sv_state = ``. +* DATA(lv_response) = z2ui5_cl_http_handler=>http_post( +* body = `` +* path_info = 'LTCL_UNIT_02_APP_START' ). +* +* DATA lo_data TYPE REF TO data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* +* FIELD-SYMBOLS TYPE any. +* UNASSIGN . +* DATA(lv_assign) = `ID->*`. +* ASSIGN lo_data->(lv_assign) TO . +* IF IS INITIAL. +* cl_abap_unit_assert=>fail( msg = 'id - initial value is initial' quit = 5 ). +* ENDIF. +* ENDMETHOD. +* +* METHOD test_bind_one_way. +* +* sv_state = `TEST_ONE_WAY`. +* DATA(lv_response) = z2ui5_cl_http_handler=>http_post( +* body = `` +* path_info = 'LTCL_UNIT_02_APP_START' ). +* +* DATA lo_data TYPE REF TO data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* +* FIELD-SYMBOLS TYPE any. +* UNASSIGN . +* DATA(lv_assign) = `OVIEWMODEL->QUANTITY->*`. +* ASSIGN lo_data->(lv_assign) TO . +* IF <> `500`. +* cl_abap_unit_assert=>fail( msg = 'data binding - initial set oUpdate wrong' quit = 5 ). +* ENDIF. +* ENDMETHOD. +* +* METHOD test_bind_two_way. +* +* sv_state = ``. +* DATA(lv_response) = z2ui5_cl_http_handler=>http_post( +* body = `` +* path_info = 'LTCL_UNIT_02_APP_START' ). +* +* DATA lo_data TYPE REF TO data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* +* FIELD-SYMBOLS TYPE any. +* UNASSIGN . +* DATA(lv_assign) = `OVIEWMODEL->OUPDATE->QUANTITY->*`. +* ASSIGN lo_data->(lv_assign) TO . +* IF <> `500`. +* cl_abap_unit_assert=>fail( msg = 'data binding - initial set oUpdate wrong' quit = 5 ). +* ENDIF. +* ENDMETHOD. +* +* METHOD test_message_box. +* +* sv_state = `TEST_MESSAGE_BOX`. +* DATA(lv_response) = z2ui5_cl_http_handler=>http_post( +* body = `` +* path_info = 'LTCL_UNIT_02_APP_START' ). +* +* DATA lo_data TYPE REF TO data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* +* FIELD-SYMBOLS TYPE any. +* +* UNASSIGN . +* DATA(lv_assign) = `PARAMS->S_MSG_BOX->TEXT->*`. +* ASSIGN lo_data->(lv_assign) TO . +* IF <> `test message box`. +* cl_abap_unit_assert=>fail( msg = 'message box - text wrong' quit = 5 ). +* ENDIF. +* +* UNASSIGN . +* lv_assign = `PARAMS->S_MSG_BOX->TYPE->*`. +* ASSIGN lo_data->(lv_assign) TO . +* IF <> `information`. +* cl_abap_unit_assert=>fail( msg = 'message box - type wrong' quit = 5 ). +* ENDIF. +* ENDMETHOD. +* +* METHOD test_message_toast. +* +* sv_state = `TEST_MESSAGE_TOAST`. +* DATA(lv_response) = z2ui5_cl_http_handler=>http_post( +* body = `` +* path_info = 'LTCL_UNIT_02_APP_START' ). +* +* DATA lo_data TYPE REF TO data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* +* FIELD-SYMBOLS TYPE any. +* +* UNASSIGN . +* DATA(lv_assign) = `PARAMS->S_MSG_TOAST->TEXT->*`. +* ASSIGN lo_data->(lv_assign) TO . +* IF <> `test message toast`. +* cl_abap_unit_assert=>fail( msg = 'message toast - text wrong' quit = 5 ). +* ENDIF. +* +* ENDMETHOD. +* +* METHOD test_timer. +* +* sv_state = `TEST_TIMER`. +* DATA(lv_response) = z2ui5_cl_http_handler=>http_post( +* body = `` +* path_info = 'LTCL_UNIT_02_APP_START' ). +* +* DATA lo_data TYPE REF TO data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* +* FIELD-SYMBOLS TYPE any. +* +* UNASSIGN . +* DATA(lv_assign) = `PARAMS->S_TIMER->EVENT_FINISHED->*`. +* ASSIGN lo_data->(lv_assign) TO . +* IF <> `TIMER_FINISHED`. +* cl_abap_unit_assert=>fail( msg = 'timer - event wrong' quit = 5 ). +* ENDIF. +* +* UNASSIGN . +* lv_assign = `PARAMS->S_TIMER->INTERVAL_MS->*`. +* ASSIGN lo_data->(lv_assign) TO . +* IF <> `500`. +* cl_abap_unit_assert=>fail( msg = 'timer - ms wrong' quit = 5 ). +* ENDIF. +* ENDMETHOD. +* +* METHOD test_xml_popup. +* +* sv_state = `TEST_POPUP`. +* DATA(lv_response) = z2ui5_cl_http_handler=>http_post( +* body = `` +* path_info = 'LTCL_UNIT_02_APP_START' ). +* +* DATA lo_data TYPE REF TO data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* +* FIELD-SYMBOLS TYPE any. +* UNASSIGN . +* DATA(lv_assign) = `PARAMS->S_POPUP->XML->*`. +* ASSIGN lo_data->(lv_assign) TO . +* = shift_left( ). +* IF (9) <> `fail( msg = 'xml popup - intital popup wrong' quit = 5 ). +* ENDIF. +* ENDMETHOD. +* +* METHOD test_landing_page. +* +* DATA(lv_response) = z2ui5_cl_http_handler=>http_post( +* body = `` +* path_info = '' ). +* +* DATA lo_data TYPE REF TO data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* +* FIELD-SYMBOLS TYPE any. +* UNASSIGN . +* DATA(lv_assign) = `PARAMS->S_VIEW->XML->*`. +* ASSIGN lo_data->(lv_assign) TO . +* = shift_left( ). +* IF NS `Step 4`. +* cl_abap_unit_assert=>fail( msg = 'landing page - not started when no app' quit = 5 ). +* ENDIF. +* ENDMETHOD. +* +* METHOD test_scroll_cursor. +* +* sv_state = `TEST_SCROLL_CURSOR`. +* DATA(lv_response) = z2ui5_cl_http_handler=>http_post( +* body = `` +* path_info = 'LTCL_UNIT_02_APP_START' ). +* +* DATA lo_data TYPE REF TO data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* +* +* +* +* ENDMETHOD. +* +* METHOD test_startup_path. +* +* sv_state = `TEST_NAVIGATE`. +* DATA(lv_response) = z2ui5_cl_http_handler=>http_post( +* body = `` +* path_info = 'LTCL_UNIT_02_APP_START' ). +* +* DATA lo_data TYPE REF TO data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* +* +* ENDMETHOD. +* +* METHOD test_navigate. +* +* sv_state = `TEST_NAVIGATE`. +* DATA(lv_response) = z2ui5_cl_http_handler=>http_post( +* body = `` +* path_info = 'LTCL_UNIT_02_APP_START' ). +* +* DATA lo_data TYPE REF TO data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* +* ENDMETHOD. +*ENDCLASS. +* +* +*CLASS ltcl_unit_03_app_ajax DEFINITION FINAL FOR TESTING +* DURATION SHORT +* RISK LEVEL HARMLESS. +* +* PUBLIC SECTION. +* INTERFACES z2ui5_if_app. +* +* DATA product TYPE string. +* DATA quantity TYPE string. +* DATA check_initialized TYPE abap_bool. +* +* CLASS-DATA sv_state TYPE string. +* +* PRIVATE SECTION. +* METHODS test_app_change_value FOR TESTING RAISING cx_static_check. +* METHODS test_app_event FOR TESTING RAISING cx_static_check. +* METHODS test_app_dump FOR TESTING RAISING cx_static_check. +* +*ENDCLASS. +* +* +*CLASS ltcl_unit_03_app_ajax IMPLEMENTATION. +* METHOD z2ui5_if_app~main. +* IF check_initialized = abap_false. +* check_initialized = abap_true. +* product = 'tomato'. +* quantity = '500'. +* +* ENDIF. +* +* CASE client->get( )-event. +* WHEN 'BUTTON_POST'. +* client->message_toast_display( |{ product } { quantity } - send to the server| ). +* WHEN 'BACK'. +* client->nav_app_leave( client->get_app( client->get( )-id_prev_app_stack ) ). +* ENDCASE. +* +* IF sv_state = 'ERROR'. +* z2ui5_lcl_utility=>raise( `exception test` ). +* ENDIF. +* +* client->view_display( z2ui5_cl_xml_view=>factory( client )->shell( +* )->page( title = 'abap2UI5 - First Example' +* navbuttonpress = client->_event( 'BACK' ) +* shownavbutton = abap_true +* )->simple_form( title = 'Form Title' editable = abap_true +* )->content( 'form' +* )->title( 'Input' +* )->label( 'quantity' +* )->input( client->_bind( quantity ) +* )->label( 'product' +* )->input( value = product +* enabled = abap_false +* )->button( text = 'post' +* press = client->_event( 'BUTTON_POST' ) +* )->get_root( )->xml_get( ) ). +* ENDMETHOD. +* +* METHOD test_app_change_value. +* +* DATA(lv_response) = z2ui5_cl_http_handler=>http_post( +* body = `` +* path_info = 'LTCL_UNIT_02_APP_START' ). +* +* DATA lo_data TYPE REF TO data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* +* FIELD-SYMBOLS TYPE any. +* +* UNASSIGN . +* DATA(lv_assign) = `ID->*`. +* ASSIGN lo_data->(lv_assign) TO . +* IF IS INITIAL. +* cl_abap_unit_assert=>fail( msg = 'id - initial value is initial' quit = 5 ). +* ENDIF. +* DATA(lv_id) = CONV string( ). +* +* DATA(lv_request) = `{"oUpdate":{"QUANTITY":"600"},"ID": "` && lv_id && `" ,"ARGUMENTS":{"EVENT":"BUTTON_POST","METHOD":"UPDATE"}}`. +** z2ui5_cl_http_handler=>client = VALUE #( body = lv_request ). +* lv_response = z2ui5_cl_http_handler=>http_post( +* body = lv_request +* ). +* +* CLEAR lo_data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* +* UNASSIGN . +* lv_assign = `OVIEWMODEL->OUPDATE->QUANTITY->*`. +* ASSIGN lo_data->(lv_assign) TO . +* IF <> `600`. +* cl_abap_unit_assert=>fail( msg = 'data binding - frontend updated value wrong after roundtrip' quit = 5 ). +* ENDIF. +* ENDMETHOD. +* +* METHOD test_app_event. +* +* DATA(lv_response) = z2ui5_cl_http_handler=>http_post( +* body = `` +* path_info = 'LTCL_UNIT_02_APP_START' ). +* +* DATA lo_data TYPE REF TO data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* +* FIELD-SYMBOLS TYPE any. +* +* UNASSIGN . +* DATA(lv_assign) = `ID->*`. +* ASSIGN lo_data->(lv_assign) TO . +* IF IS INITIAL. +* cl_abap_unit_assert=>fail( msg = 'id - initial value is initial' quit = 5 ). +* ENDIF. +* DATA(lv_id) = CONV string( ). +* +* DATA(lv_request) = `{"oUpdate":{"QUANTITY":"700"},"ID": "` && lv_id && `" ,"ARGUMENTS": { "0" : {"EVENT":"BUTTON_POST","METHOD":"UPDATE"} } }`. +** z2ui5_cl_http_handler=>client = VALUE #( body = lv_request ). +* lv_response = z2ui5_cl_http_handler=>http_post( +* body = lv_request ). +* +* CLEAR lo_data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* +* UNASSIGN . +* lv_assign = `PARAMS->S_MSG_TOAST->TEXT->*`. +* ASSIGN lo_data->(lv_assign) TO . +* IF <> `tomato 700 - send to the server`. +* cl_abap_unit_assert=>fail( msg = 'message toast - text wrong' quit = 5 ). +* ENDIF. +* ENDMETHOD. +* +* METHOD test_app_dump. +* +** sv_state = `ERROR`. +** DATA(lv_response) = z2ui5_cl_http_handler=>http_post( +** body = `` +** path_info = 'LTCL_UNIT_03_APP_AJAX' ). +** +** DATA lo_data TYPE REF TO data. +** /ui2/cl_json=>deserialize( EXPORTING json = lv_response +** CHANGING data = lo_data ). +** +** FIELD-SYMBOLS TYPE any. +** UNASSIGN . +** DATA(lv_assign) = `PARAMS->S_VIEW->XML->*`. +** ASSIGN lo_data->(lv_assign) TO . +** = shift_left( ). +** IF NS `MessagePage`. +** cl_abap_unit_assert=>fail( msg = 'system app error - not shown by exception' quit = 5 ). +** ENDIF. +* ENDMETHOD. +*ENDCLASS. +* +* +*CLASS ltcl_unit_04_deep_data IMPLEMENTATION. +* METHOD z2ui5_if_app~main. +* IF check_initialized = abap_false. +* check_initialized = abap_true. +* +* t_tab = VALUE #( title = 'Peter' +* descr = 'this is a description' +* icon = 'sap-icon://account' +* ( info = 'completed' ) +* ( info = 'incompleted' ) ). +* +* ENDIF. +* +* CASE sv_status. +* +* WHEN `CHANGE`. +* client->view_display( z2ui5_cl_xml_view=>factory( client )->shell( +* )->page( title = 'abap2UI5 - First Example' +* navbuttonpress = client->_event( 'BACK' ) +* shownavbutton = abap_true +* )->list( +* " TODO: check spelling: Ouput (typo) -> Output (ABAP cleaner) +* headertext = 'List Ouput' +* items = client->_bind_edit( t_tab ) +* mode = `SingleSelectMaster` +* selectionchange = client->_event( 'SELCHANGE' ) +* )->standard_list_item( title = '{TITLE}' +* description = '{DESCR}' +* icon = '{ICON}' +* info = '{INFO}' +* press = client->_event( 'TEST' ) +* type = `Navigation` +* selected = `{SELECTED}` +* )->get_root( )->xml_get( ) ). +* +* WHEN OTHERS. +* client->view_display( z2ui5_cl_xml_view=>factory( client )->shell( +* )->page( title = 'abap2UI5 - First Example' +* navbuttonpress = client->_event( 'BACK' ) +* shownavbutton = abap_true +* )->list( +* " TODO: check spelling: Ouput (typo) -> Output (ABAP cleaner) +* headertext = 'List Ouput' +* items = client->_bind( t_tab ) +* mode = `SingleSelectMaster` +* selectionchange = client->_event( 'SELCHANGE' ) +* )->standard_list_item( title = '{TITLE}' +* description = '{DESCR}' +* icon = '{ICON}' +* info = '{INFO}' +* press = client->_event( 'TEST' ) +* type = `Navigation` +* selected = `{SELECTED}` +* )->get_root( )->xml_get( ) ). +* +* ENDCASE. +* ENDMETHOD. +* +* METHOD test_app_deep_data. +* +* DATA(lv_response) = z2ui5_cl_http_handler=>http_post( +* body = `` +* path_info = 'LTCL_UNIT_04_DEEP_DATA' ). +* +* DATA lo_data TYPE REF TO data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* +* FIELD-SYMBOLS TYPE any. +* +* UNASSIGN . +* FIELD-SYMBOLS TYPE STANDARD TABLE. +* FIELD-SYMBOLS TYPE REF TO data. +* DATA(lv_assign) = `OVIEWMODEL->T_TAB->*`. +* ASSIGN lo_data->(lv_assign) TO . +* ASSIGN [ 1 ] TO . +* +* DATA ls_tab_test TYPE ty_row. +* ls_tab_test = VALUE #( title = 'Peter' info = 'completed' descr = 'this is a description' icon = 'sap-icon://account' ). +* +* lv_assign = `TITLE->*`. +* ASSIGN ->(lv_assign) TO . +* IF <> ls_tab_test-title. +* cl_abap_unit_assert=>fail( msg = 'data binding - initial tab data wrong' quit = 5 ). +* ENDIF. +* +* lv_assign = `INFO->*`. +* ASSIGN ->(lv_assign) TO . +* IF <> ls_tab_test-info. +* cl_abap_unit_assert=>fail( msg = 'data binding - initial tab data wrong' quit = 5 ). +* ENDIF. +* +* lv_assign = `DESCR->*`. +* ASSIGN ->(lv_assign) TO . +* IF <> ls_tab_test-descr. +* cl_abap_unit_assert=>fail( msg = 'data binding - initial tab data wrong' quit = 5 ). +* ENDIF. +* ENDMETHOD. +* +* METHOD test_app_deep_data_change. +* +* sv_status = 'CHANGE'. +* DATA(lv_response) = z2ui5_cl_http_handler=>http_post( +* body = `` +* path_info = 'LTCL_UNIT_04_DEEP_DATA' ). +* +* DATA lo_data TYPE REF TO data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* +* FIELD-SYMBOLS TYPE any. +* +* UNASSIGN . +* FIELD-SYMBOLS TYPE STANDARD TABLE. +* FIELD-SYMBOLS TYPE REF TO data. +* DATA(lv_assign) = `OVIEWMODEL->OUPDATE->T_TAB->*`. +* ASSIGN lo_data->(lv_assign) TO . +* ASSIGN [ 1 ] TO . +* +* DATA ls_tab_test TYPE ty_row. +* ls_tab_test = VALUE #( title = 'Peter' info = 'completed' descr = 'this is a description' icon = 'sap-icon://account' ). +* +* lv_assign = `TITLE->*`. +* ASSIGN ->(lv_assign) TO . +* IF <> ls_tab_test-title. +* cl_abap_unit_assert=>fail( msg = 'data binding - initial tab data wrong' quit = 5 ). +* ENDIF. +* +* lv_assign = `INFO->*`. +* ASSIGN ->(lv_assign) TO . +* IF <> ls_tab_test-info. +* cl_abap_unit_assert=>fail( msg = 'data binding - initial tab data wrong' quit = 5 ). +* ENDIF. +* +* lv_assign = `DESCR->*`. +* ASSIGN ->(lv_assign) TO . +* IF <> ls_tab_test-descr. +* cl_abap_unit_assert=>fail( msg = 'data binding - initial tab data wrong' quit = 5 ). +* ENDIF. +* +* UNASSIGN . +* lv_assign = `ID->*`. +* ASSIGN lo_data->(lv_assign) TO . +* IF IS INITIAL. +* cl_abap_unit_assert=>fail( msg = 'id - initial value is initial' quit = 5 ). +* ENDIF. +* DATA(lv_id) = CONV string( ). +* +* DATA(lv_tab) = z2ui5_lcl_utility=>trans_any_2_json( t_tab ). +* +* DATA(lv_request) = `{"oUpdate":{"QUANTITY":"600", "T_TAB":` && lv_tab && `},"oSystem":{"ID": "` && lv_id && `"` && `,"CHECK_DEBUG_ACTIVE":true},"oEvent":{"EVENT":"BUTTON_POST","METHOD":"UPDATE"}}`. +* +* lv_response = z2ui5_cl_http_handler=>http_post( +* body = lv_request +* ). +* +* CLEAR lo_data. +* /ui2/cl_json=>deserialize( EXPORTING json = lv_response +* CHANGING data = lo_data ). +* ENDMETHOD. +*ENDCLASS. diff --git a/src/z2ui5_cl_xml_view.clas.abap b/src/z2ui5_cl_xml_view.clas.abap index aa90d804..27bfe97b 100644 --- a/src/z2ui5_cl_xml_view.clas.abap +++ b/src/z2ui5_cl_xml_view.clas.abap @@ -26,6 +26,17 @@ CLASS z2ui5_cl_xml_view DEFINITION RETURNING VALUE(result) TYPE string. + METHODS hlp_get_url_param + IMPORTING + !val TYPE string + RETURNING + VALUE(result) TYPE string. + + METHODS hlp_set_url_param + IMPORTING + !n TYPE clike + !v TYPE clike. + METHODS hlp_replace_controller_name IMPORTING !xml TYPE string @@ -579,6 +590,7 @@ CLASS z2ui5_cl_xml_view DEFINITION !title TYPE clike OPTIONAL !navbuttonpress TYPE clike OPTIONAL !shownavbutton TYPE clike OPTIONAL + !showHeader TYPE clike OPTIONAL !id TYPE clike OPTIONAL !class TYPE clike OPTIONAL !ns TYPE clike OPTIONAL @@ -1068,39 +1080,39 @@ CLASS z2ui5_cl_xml_view DEFINITION VALUE(result) TYPE REF TO z2ui5_cl_xml_view . METHODS ui_row_action_item IMPORTING - !icon TYPE clike OPTIONAL - !text TYPE clike OPTIONAL - !type TYPE clike OPTIONAL - !press TYPE clike OPTIONAL + !icon TYPE clike OPTIONAL + !text TYPE clike OPTIONAL + !type TYPE clike OPTIONAL + !press TYPE clike OPTIONAL RETURNING VALUE(result) TYPE REF TO z2ui5_cl_xml_view . METHODS radio_button IMPORTING - !activeHandling TYPE clike OPTIONAL - !editable TYPE clike OPTIONAL - !enabled TYPE clike OPTIONAL - !groupName TYPE clike OPTIONAL - !selected TYPE clike OPTIONAL - !text TYPE clike OPTIONAL - !textAlign TYPE clike OPTIONAL - !textDirection TYPE clike OPTIONAL - !useEntireWidth TYPE clike OPTIONAL - !valueState TYPE clike OPTIONAL - !width TYPE clike OPTIONAL + !activeHandling TYPE clike OPTIONAL + !editable TYPE clike OPTIONAL + !enabled TYPE clike OPTIONAL + !groupName TYPE clike OPTIONAL + !selected TYPE clike OPTIONAL + !text TYPE clike OPTIONAL + !textAlign TYPE clike OPTIONAL + !textDirection TYPE clike OPTIONAL + !useEntireWidth TYPE clike OPTIONAL + !valueState TYPE clike OPTIONAL + !width TYPE clike OPTIONAL RETURNING - VALUE(result) TYPE REF TO z2ui5_cl_xml_view . + VALUE(result) TYPE REF TO z2ui5_cl_xml_view . METHODS radio_button_group IMPORTING - !id TYPE clike OPTIONAL - !columns TYPE clike OPTIONAL - !editable TYPE clike OPTIONAL - !enabled TYPE clike OPTIONAL - !selectedIndex TYPE clike OPTIONAL - !textDirection TYPE clike OPTIONAL - !valueState TYPE clike OPTIONAL - !width TYPE clike OPTIONAL + !id TYPE clike OPTIONAL + !columns TYPE clike OPTIONAL + !editable TYPE clike OPTIONAL + !enabled TYPE clike OPTIONAL + !selectedIndex TYPE clike OPTIONAL + !textDirection TYPE clike OPTIONAL + !valueState TYPE clike OPTIONAL + !width TYPE clike OPTIONAL RETURNING - VALUE(result) TYPE REF TO z2ui5_cl_xml_view . + VALUE(result) TYPE REF TO z2ui5_cl_xml_view . PROTECTED SECTION. DATA mv_name TYPE string. @@ -1119,7 +1131,7 @@ ENDCLASS. -CLASS Z2UI5_CL_XML_VIEW IMPLEMENTATION. +CLASS z2ui5_cl_xml_view IMPLEMENTATION. METHOD actions. @@ -1745,10 +1757,11 @@ CLASS Z2UI5_CL_XML_VIEW IMPLEMENTATION. METHOD hlp_get_source_code_url. + DATA(ls_draft) = mo_root->mi_client->get( )-s_draft. DATA(ls_config) = mo_root->mi_client->get( )-s_config. result = ls_config-origin && - `/sap/bc/adt/oo/classes/` && lcl_utility=>get_classname_by_ref( ls_config-app ) && + `/sap/bc/adt/oo/classes/` && lcl_utility=>get_classname_by_ref( ls_draft-app ) && `/source/main`. ENDMETHOD. @@ -2149,6 +2162,7 @@ CLASS Z2UI5_CL_XML_VIEW IMPLEMENTATION. t_prop = VALUE #( ( n = `title` v = title ) ( n = `showNavButton` v = lcl_utility=>get_json_boolean( shownavbutton ) ) ( n = `navButtonPress` v = navbuttonpress ) + ( n = `showHeader` v = lcl_utility=>get_json_boolean( showHeader ) ) ( n = `class` v = class ) ( n = `id` v = id ) ) ). ENDMETHOD. @@ -2201,33 +2215,33 @@ CLASS Z2UI5_CL_XML_VIEW IMPLEMENTATION. METHOD radio_button. - result = _generic( name = `RadioButton` - t_prop = VALUE #( ( n = `activeHandling` v = lcl_utility=>get_json_boolean( activeHandling ) ) - ( n = `editable` v = lcl_utility=>get_json_boolean( editable ) ) - ( n = `enabled` v = lcl_utility=>get_json_boolean( enabled ) ) - ( n = `selected` v = lcl_utility=>get_json_boolean( selected ) ) - ( n = `useEntireWidth` v = lcl_utility=>get_json_boolean( useEntireWidth ) ) - ( n = `text` v = text ) - ( n = `textDirection` v = textDirection ) - ( n = `textAlign` v = textAlign ) - ( n = `groupName` v = groupName ) - ( n = `valueState` v = valueState ) - ( n = `width` v = width ) - ) ). + result = _generic( name = `RadioButton` + t_prop = VALUE #( ( n = `activeHandling` v = lcl_utility=>get_json_boolean( activeHandling ) ) + ( n = `editable` v = lcl_utility=>get_json_boolean( editable ) ) + ( n = `enabled` v = lcl_utility=>get_json_boolean( enabled ) ) + ( n = `selected` v = lcl_utility=>get_json_boolean( selected ) ) + ( n = `useEntireWidth` v = lcl_utility=>get_json_boolean( useEntireWidth ) ) + ( n = `text` v = text ) + ( n = `textDirection` v = textDirection ) + ( n = `textAlign` v = textAlign ) + ( n = `groupName` v = groupName ) + ( n = `valueState` v = valueState ) + ( n = `width` v = width ) + ) ). ENDMETHOD. METHOD radio_button_group. - result = _generic( name = `RadioButtonGroup` - t_prop = VALUE #( ( n = `id` v = id ) - ( n = `columns` v = columns ) - ( n = `editable` v = lcl_utility=>get_json_boolean( editable ) ) - ( n = `enabled` v = lcl_utility=>get_json_boolean( enabled ) ) - ( n = `selectedIndex` v = selectedIndex ) - ( n = `textDirection` v = textDirection ) - ( n = `valueState` v = valueState ) - ( n = `width` v = width ) - ) ). + result = _generic( name = `RadioButtonGroup` + t_prop = VALUE #( ( n = `id` v = id ) + ( n = `columns` v = columns ) + ( n = `editable` v = lcl_utility=>get_json_boolean( editable ) ) + ( n = `enabled` v = lcl_utility=>get_json_boolean( enabled ) ) + ( n = `selectedIndex` v = selectedIndex ) + ( n = `textDirection` v = textDirection ) + ( n = `valueState` v = valueState ) + ( n = `width` v = width ) + ) ). ENDMETHOD. @@ -2745,4 +2759,64 @@ CLASS Z2UI5_CL_XML_VIEW IMPLEMENTATION. result = result2. ENDMETHOD. + + METHOD hlp_get_url_param. + + DATA(lt_params) = VALUE z2ui5_if_client=>ty_t_name_value( ). + DATA(lv_search) = mi_client->get( )-s_config-search. + + lv_search = lcl_utility=>get_trim_lower( lv_search ). + SHIFT lv_search LEFT DELETING LEADING `?`. + + SPLIT lv_search AT `&` INTO TABLE DATA(lt_param). + + LOOP AT lt_param REFERENCE INTO DATA(lr_param). + + SPLIT lr_param->* AT `=` INTO DATA(lv_name) DATA(lv_value). + + INSERT VALUE #( n = lv_name v = lv_value ) INTO TABLE lt_params. + ENDLOOP. + + DATA(lv_val) = lcl_utility=>get_trim_lower( val ). + result = VALUE #( lt_params[ n = lv_val ]-v OPTIONAL ). + + ENDMETHOD. + + METHOD hlp_set_url_param. + + DATA(lt_params) = VALUE z2ui5_if_client=>ty_t_name_value( ). + DATA(lv_search) = mi_client->get( )-s_config-search. + + lv_search = lcl_utility=>get_trim_lower( lv_search ). + SHIFT lv_search LEFT DELETING LEADING `?`. + + SPLIT lv_search AT `&` INTO TABLE DATA(lt_param). + + LOOP AT lt_param REFERENCE INTO DATA(lr_param). + + SPLIT lr_param->* AT `=` INTO DATA(lv_name) DATA(lv_value). + + INSERT VALUE #( n = lv_name v = lv_value ) INTO TABLE lt_params. + ENDLOOP. + + DATA(lv_n) = lcl_utility=>get_trim_lower( n ). + + LOOP AT lt_params REFERENCE INTO DATA(lr_params) + WHERE n = lv_n. + lr_params->v = lcl_utility=>get_trim_lower( v ). + ENDLOOP. + IF sy-subrc <> 0. + INSERT VALUE #( n = lv_n v = lcl_utility=>get_trim_lower( v ) ) INTO TABLE lt_params. + ENDIF. + + DATA(lv_result) = `?` && lt_params[ 1 ]-n && `=` && lt_params[ 1 ]-v. + + LOOP AT lt_params REFERENCE INTO lr_params FROM 2. + lv_result = lv_result && `&` && lr_params->n && `=` && lr_params->v. + ENDLOOP. + + mi_client->url_param_set( lv_result ). + + ENDMETHOD. + ENDCLASS. diff --git a/src/z2ui5_cl_xml_view.clas.locals_imp.abap b/src/z2ui5_cl_xml_view.clas.locals_imp.abap index cc62003e..21ffe172 100644 --- a/src/z2ui5_cl_xml_view.clas.locals_imp.abap +++ b/src/z2ui5_cl_xml_view.clas.locals_imp.abap @@ -20,6 +20,10 @@ CLASS lcl_utility DEFINITION INHERITING FROM cx_no_check. iv_replace TYPE clike DEFAULT '' RETURNING VALUE(result) TYPE string. + CLASS-METHODS get_trim_lower + IMPORTING val TYPE any + RETURNING VALUE(result) TYPE string. + ENDCLASS. @@ -56,4 +60,12 @@ CLASS lcl_utility IMPLEMENTATION. CATCH cx_root. ENDTRY. ENDMETHOD. + + METHOD get_trim_lower. + + result = CONV #( val ). + result = to_lower( shift_left( shift_right( result ) ) ). + + ENDMETHOD. + ENDCLASS. diff --git a/src/z2ui5_if_client.intf.abap b/src/z2ui5_if_client.intf.abap index 8188934b..11eea3f6 100644 --- a/src/z2ui5_if_client.intf.abap +++ b/src/z2ui5_if_client.intf.abap @@ -8,18 +8,6 @@ INTERFACE z2ui5_if_client location_reload TYPE string VALUE `LOCATION_RELOAD`, END OF cs_event. - TYPES: - BEGIN OF ty_s_config, - controller_name TYPE string, - version TYPE string, - pathname TYPE string, - origin TYPE string, - search TYPE string, - path_info TYPE string, - body TYPE string, - app TYPE REF TO z2ui5_if_app, - END OF ty_S_config. - TYPES: BEGIN OF ty_s_name_value, n TYPE string, @@ -27,23 +15,42 @@ INTERFACE z2ui5_if_client END OF ty_s_name_value. TYPES ty_t_name_value TYPE STANDARD TABLE OF ty_s_name_value WITH EMPTY KEY. + TYPES: + BEGIN OF ty_s_config, + controller_name TYPE string, + version TYPE string, + origin TYPE string, + pathname TYPE string, + search TYPE string, + body TYPE string, + END OF ty_S_config. + + TYPES: + BEGIN OF ty_s_draft, + id TYPE string, + id_prev TYPE string, + id_prev_app TYPE string, + id_prev_app_stack TYPE string, + app TYPE REF TO z2ui5_if_app, + END OF ty_S_draft. + + TYPES: + BEGIN OF ty_s_cursor, + id TYPE string, + cursorpos TYPE string, + selectionstart TYPE string, + selectionend TYPE string, + END OF ty_s_cursor. + TYPES: BEGIN OF ty_s_get, event TYPE string, t_event_arg TYPE string_table, t_scroll_pos TYPE ty_t_name_value, - id TYPE string, - id_prev TYPE string, - id_prev_app TYPE string, - id_prev_app_stack TYPE string, check_launchpad_active TYPE abap_bool, check_on_navigated TYPE abap_bool, - BEGIN OF s_cursor, - id TYPE string, - cursorpos TYPE string, - selectionstart TYPE string, - selectionend TYPE string, - END OF s_cursor, + s_draft TYPE ty_S_draft, + s_cursor TYPE ty_S_cursor, s_config TYPE ty_S_config, END OF ty_s_get. @@ -117,6 +124,10 @@ INTERFACE z2ui5_if_client text TYPE clike type TYPE clike DEFAULT 'information'. + METHODS url_param_set + IMPORTING + val type clike. + METHODS timer_set IMPORTING interval_ms TYPE clike