payload with ajson (#837)

* ajson

* ajson logic

* update abaplint fixes
This commit is contained in:
oblomov 2024-02-02 14:56:39 +01:00 committed by GitHub
parent 144a95e987
commit 463fbf561f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 3373 additions and 3159 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -414,7 +414,7 @@ ENDCLASS.
CLASS Z2UI5_CL_UTIL_FUNC IMPLEMENTATION.
CLASS z2ui5_cl_util_func IMPLEMENTATION.
METHOD app_get_url.
@ -857,7 +857,7 @@ CLASS Z2UI5_CL_UTIL_FUNC IMPLEMENTATION.
result = result && cl_abap_char_utilities=>cr_lf.
data lr_row type ref to data.
DATA lr_row TYPE REF TO data.
LOOP AT <tab> REFERENCE INTO lr_row.
DATA(lv_index) = 1.
@ -1244,6 +1244,10 @@ CLASS Z2UI5_CL_UTIL_FUNC IMPLEMENTATION.
METHOD trans_json_2_any.
* IF z2ui5_cl_fw_controller=>cv_check_ajson = abap_true.
* ASSERT 1 = 0.
* ENDIF.
/ui2/cl_json=>deserialize(
EXPORTING
json = CONV string( val )
@ -1256,6 +1260,10 @@ CLASS Z2UI5_CL_UTIL_FUNC IMPLEMENTATION.
METHOD trans_json_by_any.
* IF z2ui5_cl_fw_controller=>cv_check_ajson = abap_true.
* ASSERT 1 = 0.
* ENDIF.
CASE compress_mode.
WHEN z2ui5_if_client=>cs_compress_mode-full.
@ -1440,14 +1448,14 @@ CLASS Z2UI5_CL_UTIL_FUNC IMPLEMENTATION.
" support for ISO8601 => https://en.wikipedia.org/wiki/ISO_8601
REPLACE FIRST OCCURRENCE OF REGEX `^(\d{4})-(\d{2})-(\d{2})` IN <ls_data_ui5> WITH `$1$2$3`
REPLACEMENT LENGTH match. "#EC NOTEXT
REPLACEMENT LENGTH match. "#EC NOTEXT
<comp> = <ls_data_ui5>.
WHEN `\TYPE=T`.
" support for ISO8601 => https://en.wikipedia.org/wiki/ISO_8601
REPLACE FIRST OCCURRENCE OF REGEX `^(\d{2}):(\d{2}):(\d{2})` IN <ls_data_ui5> WITH `$1$2$3`
REPLACEMENT LENGTH match. "#EC NOTEXT
REPLACEMENT LENGTH match. "#EC NOTEXT
<comp> = <ls_data_ui5>.
WHEN OTHERS.

View File

@ -29,7 +29,9 @@ CLASS z2ui5_cl_fw_binding DEFINITION
viewname TYPE string,
pretty_name TYPE abap_bool,
compress TYPE string,
compress_custom TYPE string,
depth TYPE i,
ajson_local TYPE REF TO z2ui5_if_ajson,
END OF ty_s_attri.
TYPES ty_t_attri TYPE SORTED TABLE OF ty_s_attri WITH UNIQUE KEY name.
@ -43,6 +45,7 @@ CLASS z2ui5_cl_fw_binding DEFINITION
view TYPE clike OPTIONAL
pretty_name TYPE clike OPTIONAL
compress TYPE clike OPTIONAL
compress_custom TYPE clike OPTIONAL
RETURNING
VALUE(r_result) TYPE REF TO z2ui5_cl_fw_binding.
@ -58,6 +61,7 @@ CLASS z2ui5_cl_fw_binding DEFINITION
DATA mv_view TYPE string.
DATA mv_pretty_name TYPE string.
DATA mv_compress TYPE string.
DATA mv_compress_custom TYPE string.
CLASS-METHODS update_attri
IMPORTING
@ -147,7 +151,6 @@ CLASS z2ui5_cl_fw_binding IMPLEMENTATION.
RETURN.
ENDIF.
GET REFERENCE OF <attri> INTO lr_ref.
IF mr_data <> lr_ref.
@ -174,31 +177,74 @@ CLASS z2ui5_cl_fw_binding IMPLEMENTATION.
bind->bind_type = mv_type.
bind->pretty_name = mv_pretty_name.
bind->compress = mv_compress.
bind->name_front = name_front_create( bind->name ).
bind->viewname = mv_view.
bind->compress_custom = mv_compress_custom.
result = COND #( WHEN mv_type = cs_bind_type-two_way THEN `/` && cv_model_edit_name && `/` ELSE `/` ) && bind->name_front.
IF strlen( result ) > 30.
bind->name_front = z2ui5_cl_util_func=>uuid_get_c22( ).
IF z2ui5_cl_fw_controller=>cv_check_ajson = abap_false.
bind->name_front = name_front_create( bind->name ).
result = COND #( WHEN mv_type = cs_bind_type-two_way THEN `/` && cv_model_edit_name && `/` ELSE `/` ) && bind->name_front.
IF strlen( result ) > 30.
bind->name_front = z2ui5_cl_util_func=>uuid_get_c22( ).
result = COND #( WHEN mv_type = cs_bind_type-two_way THEN `/` && cv_model_edit_name && `/` ELSE `/` ) && bind->name_front.
ENDIF.
ELSE.
bind->name_front = replace( val = bind->name sub = `-` with = `/` ).
bind->name_front = replace( val = bind->name_front sub = `>` with = `` ).
result = `/` && COND #( WHEN mv_type = cs_bind_type-two_way THEN cv_model_edit_name && `/` ) && bind->name_front.
ENDIF.
ENDMETHOD.
METHOD bind_local.
TRY.
FIELD-SYMBOLS <any> TYPE any.
ASSIGN mr_data->* TO <any>.
DATA(lv_id) = z2ui5_cl_util_func=>uuid_get_c22( ).
FIELD-SYMBOLS <any> TYPE any.
ASSIGN mr_data->* TO <any>.
DATA(lv_id) = to_upper( z2ui5_cl_util_func=>uuid_get_c22( ) ).
INSERT VALUE #( name = lv_id
data_stringify = z2ui5_cl_util_func=>trans_json_by_any( any = mr_data
compress_mode = me->mv_compress )
bind_type = cs_bind_type-one_time )
INTO TABLE mt_attri.
result = |/{ lv_id }|.
IF z2ui5_cl_fw_controller=>cv_check_ajson = abap_false.
INSERT VALUE #( name = lv_id
data_stringify = z2ui5_cl_util_func=>trans_json_by_any( any = mr_data
compress_mode = me->mv_compress )
bind_type = cs_bind_type-one_time )
INTO TABLE mt_attri.
ELSE.
"(1) set pretty mode
CASE mv_pretty_name.
WHEN z2ui5_if_client=>cs_pretty_mode-none.
DATA(ajson) = CAST z2ui5_if_ajson( z2ui5_cl_ajson=>create_empty( ii_custom_mapping = z2ui5_cl_ajson_mapping=>create_upper_case( ) ) ).
WHEN z2ui5_if_client=>cs_pretty_mode-camel_case.
ajson = z2ui5_cl_ajson=>create_empty( ii_custom_mapping = z2ui5_cl_ajson_mapping=>create_camel_case( iv_first_json_upper = abap_false ) ).
WHEN OTHERS.
ASSERT `` = `ERROR_UNKNOWN_PRETTY_MODE`.
ENDCASE.
INSERT VALUE #( name_front = lv_id
name = lv_id
ajson_local = ajson->set( iv_path = `/` iv_val = <any> )
bind_type = cs_bind_type-one_time
pretty_name = mv_pretty_name
compress = mv_compress
)
INTO TABLE mt_attri.
ENDIF.
result = |/{ lv_id }|.
CATCH cx_root INTO DATA(x).
ASSERT x IS NOT BOUND.
ENDTRY.
ENDMETHOD.
@ -275,6 +321,7 @@ CLASS z2ui5_cl_fw_binding IMPLEMENTATION.
r_result->mv_view = view.
r_result->mv_pretty_name = pretty_name.
r_result->mv_compress = compress.
r_result->mv_compress_custom = to_upper( compress_custom ).
IF z2ui5_cl_util_func=>rtti_check_type_kind_dref( data ).

View File

@ -334,7 +334,9 @@ CLASS z2ui5_cl_fw_client IMPLEMENTATION.
type = z2ui5_cl_fw_binding=>cs_bind_type-one_way
data = val
pretty_name = pretty_mode
compress = compress_mode ).
compress = compress_mode
compress_custom = compress_custom
).
result = lo_binder->main( ).
mo_handler->ms_db-t_attri = lo_binder->mt_attri.
@ -407,7 +409,8 @@ CLASS z2ui5_cl_fw_client IMPLEMENTATION.
data = val
view = view
pretty_name = pretty_mode
compress = compress_mode ).
compress = compress_mode
compress_custom = compress_custom ).
result = lo_binder->main( ).
mo_handler->ms_db-t_attri = lo_binder->mt_attri.
@ -429,7 +432,8 @@ CLASS z2ui5_cl_fw_client IMPLEMENTATION.
type = z2ui5_cl_fw_binding=>cs_bind_type-one_time
data = val
pretty_name = pretty_mode
compress = compress_mode ).
compress = compress_mode
compress_custom = compress_custom ).
result = lo_binder->main( ).
mo_handler->ms_db-t_attri = lo_binder->mt_attri.

View File

@ -4,8 +4,7 @@ CLASS z2ui5_cl_fw_controller DEFINITION
CREATE PUBLIC.
PUBLIC SECTION.
CONSTANTS cv_check_ajson TYPE abap_bool VALUE abap_false.
class-data cv_check_ajson TYPE abap_bool VALUE abap_true.
TYPES:
BEGIN OF ty_s_next2,
@ -146,63 +145,21 @@ ENDCLASS.
CLASS z2ui5_cl_fw_controller IMPLEMENTATION.
CLASS Z2UI5_CL_FW_CONTROLLER IMPLEMENTATION.
METHOD main.
TRY.
DATA(lo_handler) = request_begin( body ).
CATCH cx_root INTO DATA(x).
lo_handler = app_system_factory( x ).
ENDTRY.
METHOD app_call_factory.
DO.
TRY.
result = app_next_factory( ms_next-o_app_call ).
result->ms_db-id_prev_app_stack = ms_db-id.
ROLLBACK WORK.
CAST z2ui5_if_app( lo_handler->ms_db-app )->main( NEW z2ui5_cl_fw_client( lo_handler ) ).
ROLLBACK WORK.
CLEAR ms_next.
IF check_no_db_save = abap_false.
z2ui5_cl_fw_db=>create( id = ms_db-id
db = ms_db ).
ENDIF.
IF lo_handler->ms_next-o_app_leave IS NOT INITIAL.
lo_handler = lo_handler->app_leave_factory( ).
CONTINUE.
ENDIF.
IF lo_handler->ms_next-o_app_call IS NOT INITIAL.
lo_handler = lo_handler->app_call_factory( ).
CONTINUE.
ENDIF.
result = lo_handler->request_end( ).
CATCH cx_root INTO x.
lo_handler = app_system_factory( x ).
CONTINUE.
ENDTRY.
EXIT.
ENDDO.
ENDMETHOD.
METHOD app_next_factory.
app->id_draft = COND #( WHEN app->id_draft IS INITIAL THEN z2ui5_cl_util_func=>uuid_get_c32( ) ELSE app->id_draft ).
r_result = NEW #( ).
r_result->ms_db-app = app.
r_result->ms_db-id = app->id_draft.
r_result->ms_db-id_prev = ms_db-id.
r_result->ms_db-id_prev_app = ms_db-id.
r_result->ms_actual-check_launchpad_active = ms_actual-check_launchpad_active.
r_result->ms_actual-check_on_navigated = abap_true.
r_result->ms_next-s_set = ms_next-s_set.
TRY.
DATA(ls_db_next) = z2ui5_cl_fw_db=>load_app( app->id_draft ).
r_result->ms_db-t_attri = ls_db_next-t_attri.
CATCH cx_root.
ENDTRY.
CLEAR result->ms_db-t_attri.
ENDMETHOD.
@ -249,6 +206,199 @@ CLASS z2ui5_cl_fw_controller IMPLEMENTATION.
ENDMETHOD.
METHOD app_client_begin_factory.
result = NEW #( ).
result->ms_db = z2ui5_cl_fw_db=>load_app( id_prev ).
result->ms_db-id = z2ui5_cl_util_func=>uuid_get_c32( ).
result->ms_db-id_prev = id_prev.
TRY.
result->ms_actual-viewname = so_body->get_attribute( `VIEWNAME` )->get_val( ).
CATCH cx_root.
ENDTRY.
ENDMETHOD.
METHOD app_client_begin_model.
IF cv_check_ajson = abap_false.
TRY.
DATA(lo_model) = z2ui5_cl_fw_model=>factory(
viewname = ms_actual-viewname
app = ms_db-app
attri = ms_db-t_attri ).
lo_model->main_set_backend(
so_body->get_attribute( ss_config-view_model_edit_name )->mr_actual ).
CATCH cx_root.
ENDTRY.
ELSE.
z2ui5_cl_fw_model_ajson=>front_to_back(
viewname = ms_actual-viewname
app = ms_db-app
t_attri = ms_db-t_attri
json_string = ss_config-body
).
ENDIF.
ENDMETHOD.
METHOD app_client_end_db.
z2ui5_cl_fw_db=>create( id = ms_db-id
db = ms_db ).
ENDMETHOD.
METHOD app_client_end_model.
IF cv_check_ajson = abap_false.
DATA(lo_binder) = z2ui5_cl_fw_model=>factory(
viewname = ms_actual-viewname
app = ms_db-app
attri = ms_db-t_attri ).
rv_viewmodel = lo_binder->main_set_frontend( ).
ELSE.
rv_viewmodel = z2ui5_cl_fw_model_ajson=>back_to_front(
app = ms_db-app
t_attri = ms_db-t_attri
).
ENDIF.
ENDMETHOD.
METHOD app_client_end_response.
DATA(lo_resp) = z2ui5_cl_util_tree_json=>factory( ).
lo_resp->add_attribute( n = `OVIEWMODEL`
v = iv_viewmodel
apos_active = abap_false ).
lo_resp->add_attribute( n = `PARAMS`
v = z2ui5_cl_util_func=>trans_json_by_any( ms_next-s_set )
apos_active = abap_false ).
lo_resp->add_attribute( n = `ID`
v = ms_db-id ).
r_result = lo_resp->mo_root->stringify( ).
ENDMETHOD.
METHOD app_leave_factory.
result = app_next_factory( ms_next-o_app_leave ).
TRY.
DATA(ls_draft) = z2ui5_cl_fw_db=>read( id = result->ms_db-id
check_load_app = abap_false ).
result->ms_db-id_prev_app_stack = ls_draft-id_prev_app_stack.
CATCH cx_root.
result->ms_db-id_prev_app_stack = ms_db-id_prev_app_stack.
ENDTRY.
CLEAR ms_next.
IF check_no_db_save = abap_false.
z2ui5_cl_fw_db=>create( id = ms_db-id
db = ms_db ).
ENDIF.
ENDMETHOD.
METHOD app_next_factory.
app->id_draft = COND #( WHEN app->id_draft IS INITIAL THEN z2ui5_cl_util_func=>uuid_get_c32( ) ELSE app->id_draft ).
r_result = NEW #( ).
r_result->ms_db-app = app.
r_result->ms_db-id = app->id_draft.
r_result->ms_db-id_prev = ms_db-id.
r_result->ms_db-id_prev_app = ms_db-id.
r_result->ms_actual-check_launchpad_active = ms_actual-check_launchpad_active.
r_result->ms_actual-check_on_navigated = abap_true.
r_result->ms_next-s_set = ms_next-s_set.
TRY.
DATA(ls_db_next) = z2ui5_cl_fw_db=>load_app( app->id_draft ).
r_result->ms_db-t_attri = ls_db_next-t_attri.
CATCH cx_root.
ENDTRY.
ENDMETHOD.
METHOD app_start_factory.
TRY.
DATA(lv_classname) = to_upper( so_body->get_attribute( `APP_START` )->get_val( ) ).
lv_classname = z2ui5_cl_util_func=>c_trim( lv_classname ).
CATCH cx_root.
ENDTRY.
IF lv_classname IS INITIAL.
lv_classname = z2ui5_cl_util_func=>url_param_get( val = `app_start`
url = ss_config-search ).
ENDIF.
IF lv_classname IS INITIAL.
result = app_system_factory( ).
RETURN.
ENDIF.
TRY.
result = NEW #( ).
result->ms_db-id = z2ui5_cl_util_func=>uuid_get_c32( ).
lv_classname = z2ui5_cl_util_func=>c_trim_upper( lv_classname ).
CREATE OBJECT result->ms_db-app TYPE (lv_classname).
result->ms_db-app->id_draft = result->ms_db-id.
CATCH cx_root.
result = app_system_factory( error_text = `App with name ` && lv_classname && ` not found...` ).
ENDTRY.
ENDMETHOD.
METHOD app_system_factory.
result = NEW #( ).
result->ms_db-id = z2ui5_cl_util_func=>uuid_get_c32( ).
IF ix IS NOT BOUND AND error_text IS NOT INITIAL.
ix = NEW z2ui5_cx_util_error( val = error_text ).
ENDIF.
IF ix IS BOUND.
result->ms_next-o_app_call = z2ui5_cl_fw_app_error=>factory( ix ).
result = result->app_call_factory( abap_true ).
RETURN.
ENDIF.
result->ms_db-app = z2ui5_cl_fw_app_startup=>factory( ).
result->ms_db-app->id_draft = result->ms_db-id.
ENDMETHOD.
METHOD body_read_location.
FIELD-SYMBOLS <struc> TYPE any.
@ -313,6 +463,44 @@ CLASS z2ui5_cl_fw_controller IMPLEMENTATION.
ENDMETHOD.
METHOD main.
TRY.
DATA(lo_handler) = request_begin( body ).
CATCH cx_root INTO DATA(x).
lo_handler = app_system_factory( x ).
ENDTRY.
DO.
TRY.
ROLLBACK WORK.
CAST z2ui5_if_app( lo_handler->ms_db-app )->main( NEW z2ui5_cl_fw_client( lo_handler ) ).
ROLLBACK WORK.
IF lo_handler->ms_next-o_app_leave IS NOT INITIAL.
lo_handler = lo_handler->app_leave_factory( ).
CONTINUE.
ENDIF.
IF lo_handler->ms_next-o_app_call IS NOT INITIAL.
lo_handler = lo_handler->app_call_factory( ).
CONTINUE.
ENDIF.
result = lo_handler->request_end( ).
CATCH cx_root INTO x.
lo_handler = app_system_factory( x ).
CONTINUE.
ENDTRY.
EXIT.
ENDDO.
ENDMETHOD.
METHOD request_begin.
ss_config-body = body.
@ -349,141 +537,6 @@ CLASS z2ui5_cl_fw_controller IMPLEMENTATION.
ENDMETHOD.
METHOD app_call_factory.
result = app_next_factory( ms_next-o_app_call ).
result->ms_db-id_prev_app_stack = ms_db-id.
CLEAR ms_next.
IF check_no_db_save = abap_false.
z2ui5_cl_fw_db=>create( id = ms_db-id
db = ms_db ).
ENDIF.
CLEAR result->ms_db-t_attri.
ENDMETHOD.
METHOD app_client_begin_factory.
result = NEW #( ).
result->ms_db = z2ui5_cl_fw_db=>load_app( id_prev ).
result->ms_db-id = z2ui5_cl_util_func=>uuid_get_c32( ).
result->ms_db-id_prev = id_prev.
TRY.
result->ms_actual-viewname = so_body->get_attribute( `VIEWNAME` )->get_val( ).
CATCH cx_root.
ENDTRY.
ENDMETHOD.
METHOD app_leave_factory.
result = app_next_factory( ms_next-o_app_leave ).
TRY.
DATA(ls_draft) = z2ui5_cl_fw_db=>read( id = result->ms_db-id
check_load_app = abap_false ).
result->ms_db-id_prev_app_stack = ls_draft-id_prev_app_stack.
CATCH cx_root.
result->ms_db-id_prev_app_stack = ms_db-id_prev_app_stack.
ENDTRY.
CLEAR ms_next.
IF check_no_db_save = abap_false.
z2ui5_cl_fw_db=>create( id = ms_db-id
db = ms_db ).
ENDIF.
ENDMETHOD.
METHOD app_start_factory.
TRY.
DATA(lv_classname) = to_upper( so_body->get_attribute( `APP_START` )->get_val( ) ).
lv_classname = z2ui5_cl_util_func=>c_trim( lv_classname ).
CATCH cx_root.
ENDTRY.
IF lv_classname IS INITIAL.
lv_classname = z2ui5_cl_util_func=>url_param_get( val = `app_start`
url = ss_config-search ).
ENDIF.
IF lv_classname IS INITIAL.
result = app_system_factory( ).
RETURN.
ENDIF.
TRY.
result = NEW #( ).
result->ms_db-id = z2ui5_cl_util_func=>uuid_get_c32( ).
lv_classname = z2ui5_cl_util_func=>c_trim_upper( lv_classname ).
CREATE OBJECT result->ms_db-app TYPE (lv_classname).
result->ms_db-app->id_draft = result->ms_db-id.
CATCH cx_root.
result = app_system_factory( error_text = `App with name ` && lv_classname && ` not found...` ).
ENDTRY.
ENDMETHOD.
METHOD app_system_factory.
result = NEW #( ).
result->ms_db-id = z2ui5_cl_util_func=>uuid_get_c32( ).
IF ix IS NOT BOUND AND error_text IS NOT INITIAL.
ix = NEW z2ui5_cx_util_error( val = error_text ).
ENDIF.
IF ix IS BOUND.
result->ms_next-o_app_call = z2ui5_cl_fw_app_error=>factory( ix ).
result = result->app_call_factory( abap_true ).
RETURN.
ENDIF.
result->ms_db-app = z2ui5_cl_fw_app_startup=>factory( ).
result->ms_db-app->id_draft = result->ms_db-id.
ENDMETHOD.
METHOD app_client_begin_model.
IF cv_check_ajson = abap_false.
TRY.
DATA(lo_model) = z2ui5_cl_fw_model=>factory(
viewname = ms_actual-viewname
app = ms_db-app
attri = ms_db-t_attri ).
lo_model->main_set_backend(
so_body->get_attribute( ss_config-view_model_edit_name )->mr_actual ).
CATCH cx_root.
ENDTRY.
ELSE.
z2ui5_cl_fw_model_ajson=>front_to_back(
viewname = ms_actual-viewname
app = ms_db-app
t_attri = ms_db-t_attri
json_string = ss_config-body
).
ENDIF.
ENDMETHOD.
METHOD _get_id.
TRY.
@ -492,56 +545,4 @@ CLASS z2ui5_cl_fw_controller IMPLEMENTATION.
ENDTRY.
ENDMETHOD.
METHOD app_client_end_model.
IF cv_check_ajson = abap_false.
DATA(lo_binder) = z2ui5_cl_fw_model=>factory(
viewname = ms_actual-viewname
app = ms_db-app
attri = ms_db-t_attri ).
rv_viewmodel = lo_binder->main_set_frontend( ).
ELSE.
rv_viewmodel = z2ui5_cl_fw_model_ajson=>back_to_front(
app = ms_db-app
t_attri = ms_db-t_attri
).
ENDIF.
ENDMETHOD.
METHOD app_client_end_response.
DATA(lo_resp) = z2ui5_cl_util_tree_json=>factory( ).
lo_resp->add_attribute( n = `OVIEWMODEL`
v = iv_viewmodel
apos_active = abap_false ).
lo_resp->add_attribute( n = `PARAMS`
v = z2ui5_cl_util_func=>trans_json_by_any( ms_next-s_set )
apos_active = abap_false ).
lo_resp->add_attribute( n = `ID`
v = ms_db-id ).
r_result = lo_resp->mo_root->stringify( ).
ENDMETHOD.
METHOD app_client_end_db.
z2ui5_cl_fw_db=>create( id = ms_db-id
db = ms_db ).
ENDMETHOD.
ENDCLASS.

View File

@ -51,8 +51,8 @@ CLASS Z2UI5_CL_FW_INDEX_HTML IMPLEMENTATION.
IF lt_config IS INITIAL.
lt_config = VALUE #(
* ( n = `src` v = `https://sdk.openui5.org/nightly/2/resources/sap-ui-core.js` )
( n = `src` v = `https://sdk.openui5.org/resources/sap-ui-cachebuster/sap-ui-core.js` )
* ( n = `src` v = `https://ui5.sap.com/1.120.0/resources/sap-ui-core.js` )
* ( n = `src` v = `https://sdk.openui5.org/resources/sap-ui-cachebuster/sap-ui-core.js` )
( n = `src` v = `https://ui5.sap.com/1.120.0/resources/sap-ui-core.js` )
( n = `data-sap-ui-theme` v = `sap_horizon` )
( n = `data-sap-ui-async` v = `true` )
( n = `data-sap-ui-bindingSyntax` v = `complex` )
@ -177,7 +177,6 @@ CLASS Z2UI5_CL_FW_INDEX_HTML IMPLEMENTATION.
` const oFragment = await Fragment.load({` && |\n| &&
` definition: xml,` && |\n| &&
` controller: sap.z2ui5.oControllerPopup,` && |\n| &&
` id: "popupId"` && |\n| &&
` });` && |\n| &&
` let oview_model = new JSONModel(sap.z2ui5.oResponse.OVIEWMODEL);` && |\n| &&
` oview_model.setSizeLimit(sap.z2ui5.JSON_MODEL_LIMIT);` && |\n| &&
@ -194,7 +193,6 @@ CLASS Z2UI5_CL_FW_INDEX_HTML IMPLEMENTATION.
` const oFragment = await Fragment.load({` && |\n| &&
` definition: xml,` && |\n| &&
` controller: sap.z2ui5.oControllerPopover,` && |\n| &&
` id: "popoverId"` && |\n| &&
` });` && |\n| &&
` let oview_model = new JSONModel(sap.z2ui5.oResponse.OVIEWMODEL);` && |\n| &&
` oview_model.setSizeLimit(sap.z2ui5.JSON_MODEL_LIMIT);` && |\n| &&
@ -354,11 +352,6 @@ CLASS Z2UI5_CL_FW_INDEX_HTML IMPLEMENTATION.
` navConTo = sap.z2ui5.oViewNest2.byId(args[2]);` && |\n| &&
` navCon.to(navConTo);` && |\n| &&
` break;` && |\n| &&
` case 'POPUP_NAV_CONTAINER_TO':` && |\n| &&
` navCon = Fragment.byId("popupId",args[1]);` && |\n| &&
` navConTo = Fragment.byId("popupId",args[2]);` && |\n| &&
` navCon.to(navConTo);` && |\n| &&
` break;` && |\n| &&
` }` && |\n| &&
` },` && |\n| &&
` onEvent(...args) {` && |\n| &&

View File

@ -24,10 +24,97 @@ CLASS z2ui5_cl_fw_model_ajson DEFINITION
ENDCLASS.
CLASS z2ui5_cl_fw_model_ajson IMPLEMENTATION.
METHOD back_to_front.
TRY.
DATA(ajson_result) = CAST z2ui5_if_ajson( z2ui5_cl_ajson=>create_empty( ) ).
LOOP AT t_attri REFERENCE INTO DATA(lr_attri) WHERE bind_type <> ``.
"(1) set pretty mode
CASE lr_attri->pretty_name.
WHEN z2ui5_if_client=>cs_pretty_mode-none.
DATA(ajson) = CAST z2ui5_if_ajson( z2ui5_cl_ajson=>create_empty( ii_custom_mapping = z2ui5_cl_ajson_mapping=>create_upper_case( ) ) ).
WHEN z2ui5_if_client=>cs_pretty_mode-camel_case.
ajson = z2ui5_cl_ajson=>create_empty( ii_custom_mapping = z2ui5_cl_ajson_mapping=>create_camel_case( iv_first_json_upper = abap_false ) ).
WHEN OTHERS.
ASSERT `` = `ERROR_UNKNOWN_PRETTY_MODE`.
ENDCASE.
"(2) read attribute of end-user app
IF lr_attri->bind_type = z2ui5_cl_fw_binding=>cs_bind_type-one_way
OR lr_attri->bind_type = z2ui5_cl_fw_binding=>cs_bind_type-two_way.
DATA(lv_name_back) = `APP->` && lr_attri->name.
FIELD-SYMBOLS <attribute> TYPE any.
ASSIGN (lv_name_back) TO <attribute>.
ASSERT sy-subrc = 0.
ENDIF.
"(3) write into json
CASE lr_attri->bind_type.
WHEN z2ui5_cl_fw_binding=>cs_bind_type-one_time.
DATA(lv_path) = lr_attri->name_front.
ajson->set( iv_ignore_empty = abap_false iv_path = `/` iv_val = lr_attri->ajson_local ).
WHEN z2ui5_cl_fw_binding=>cs_bind_type-one_way.
lv_path = lr_attri->name_front.
ajson->set( iv_ignore_empty = abap_false iv_path = `/` iv_val = <attribute> ).
WHEN z2ui5_cl_fw_binding=>cs_bind_type-two_way.
lv_path = z2ui5_cl_fw_binding=>cv_model_edit_name && `/` && lr_attri->name_front.
ajson->set( iv_ignore_empty = abap_false iv_path = `/` iv_val = <attribute> ).
WHEN OTHERS.
ASSERT `` = `ERROR_UNKNOWN_BIND_MODE`.
ENDCASE.
"(4) set compress mode
"todo performance - add and filter in a single loop
IF lr_attri->compress_custom IS NOT INITIAL.
DATA li_filter TYPE REF TO z2ui5_if_ajson_filter.
CREATE OBJECT li_filter TYPE (lr_attri->compress_custom).
ajson = ajson->filter( li_filter ).
ELSEIF lr_attri->compress = z2ui5_if_client=>cs_compress_mode-full.
"obsolete - is this still needed? use compress_custom instead
ASSERT `` = `OBSOLET_COMPRESS_MODE_USE_CUSTOM_INSTEAD`.
ELSEIF lr_attri->compress = z2ui5_if_client=>cs_compress_mode-standard.
ajson = ajson->filter( z2ui5_cl_ajson_filter_lib=>create_empty_filter( ) ).
ELSE.
ASSERT `` = `ERROR_UNKNOW_COMPRESS_MODE`.
ENDIF.
"(5) write into result
"todo performance - write directly into result
ajson_result->set( iv_path = `/` && lv_path iv_val = ajson ).
ENDLOOP.
result = ajson_result->stringify( ).
CATCH cx_root INTO DATA(x).
ASSERT x IS NOT BOUND.
ENDTRY.
ENDMETHOD.
METHOD front_to_back.
TRY.
DATA(ajson) = z2ui5_cl_ajson=>parse( json_string )->slice( `/EDIT` ).
LOOP AT t_attri REFERENCE INTO DATA(lr_attri)
@ -42,6 +129,19 @@ CLASS z2ui5_cl_fw_model_ajson IMPLEMENTATION.
DATA(ajson_val) = ajson->slice( `/` && lr_attri->name_front ).
TRY.
CASE lr_attri->pretty_name.
WHEN z2ui5_if_client=>cs_pretty_mode-none.
WHEN z2ui5_if_client=>cs_pretty_mode-camel_case.
ajson_val = ajson_val->map( z2ui5_cl_ajson_mapping=>create_to_snake_case( ) ).
WHEN OTHERS.
ASSERT `` = `ToDo -> UNKNOWN_PRETTY_MODE`.
ENDCASE.
ajson_val->to_abap(
IMPORTING
ev_container = <backend> ).
@ -51,40 +151,8 @@ CLASS z2ui5_cl_fw_model_ajson IMPLEMENTATION.
ENDTRY.
ENDLOOP.
CATCH cx_root.
ENDTRY.
ENDMETHOD.
METHOD back_to_front.
TRY.
DATA(ajson) = z2ui5_cl_ajson=>create_empty( ).
LOOP AT t_attri REFERENCE INTO DATA(lr_attri) WHERE bind_type <> ``.
IF lr_attri->bind_type = z2ui5_cl_fw_binding=>cs_bind_type-one_time.
ajson->set( iv_path = `/` iv_val = z2ui5_cl_ajson=>parse( lr_attri->data_stringify ) ).
CONTINUE.
ENDIF.
DATA(lv_name_back) = `APP->` && lr_attri->name.
FIELD-SYMBOLS <attribute> TYPE any.
ASSIGN (lv_name_back) TO <attribute>.
ASSERT 1 = 0.
CASE lr_attri->bind_type.
WHEN z2ui5_cl_fw_binding=>cs_bind_type-one_way.
ajson->set( iv_path = `/` iv_val = <attribute> ).
WHEN OTHERS.
ajson->set( iv_path = `/` && z2ui5_cl_fw_binding=>cv_model_edit_name iv_val = <attribute> ).
ENDCASE.
ENDLOOP.
result = ajson->stringify( ).
CATCH cx_root.
CATCH cx_root INTO DATA(x).
ASSERT x IS NOT BOUND.
ENDTRY.
ENDMETHOD.

View File

@ -4,6 +4,9 @@ CLASS z2ui5_cl_cc_chartjs DEFINITION
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES z2ui5_if_ajson_filter.
" Data
TYPES:
BEGIN OF ty_x_y_r_data,
@ -428,8 +431,8 @@ CLASS z2ui5_cl_cc_chartjs DEFINITION
stack_weight TYPE i,
stack TYPE string,
position TYPE string,
ticks TYPE ty_ticks,
border TYPE ty_border,
ticks TYPE ty_ticks,
border TYPE ty_border,
grid TYPE ty_grid,
offset TYPE abap_bool,
axis TYPE string,
@ -542,8 +545,8 @@ CLASS z2ui5_cl_cc_chartjs DEFINITION
TYPES:
BEGIN OF ty_options,
scales TYPE ty_scales,
responsive TYPE abap_bool,
scales TYPE ty_scales,
responsive TYPE abap_bool,
plugins TYPE ty_plugins,
hover TYPE ty_hover,
interaction TYPE ty_interaction,
@ -551,14 +554,13 @@ CLASS z2ui5_cl_cc_chartjs DEFINITION
layout TYPE ty_layout,
elements TYPE ty_elements,
index_axis TYPE string,
events TYPE string_table,
events TYPE string_table,
END OF ty_options .
"ChartJS Configuration
TYPES:
BEGIN OF ty_chart ##NEEDED,
type TYPE string,
* plugins TYPE string_table,
data TYPE ty_data,
options TYPE ty_options,
END OF ty_chart.
@ -609,8 +611,41 @@ ENDCLASS.
CLASS Z2UI5_CL_CC_CHARTJS IMPLEMENTATION.
CLASS z2ui5_cl_cc_chartjs IMPLEMENTATION.
METHOD z2ui5_if_ajson_filter~keep_node.
rv_keep = abap_true.
CASE iv_visit.
WHEN z2ui5_if_ajson_filter=>visit_type-value.
CASE is_node-type.
WHEN z2ui5_if_ajson_types=>node_type-boolean.
IF is_node-value = `false`.
rv_keep = abap_false.
ENDIF.
WHEN z2ui5_if_ajson_types=>node_type-number.
IF is_node-value = `0`.
rv_keep = abap_false.
ENDIF.
WHEN z2ui5_if_ajson_types=>node_type-string.
IF is_node-value = ``.
rv_keep = abap_false.
ENDIF.
ENDCASE.
WHEN z2ui5_if_ajson_filter=>visit_type-close.
IF is_node-children = 0.
rv_keep = abap_false.
ENDIF.
ENDCASE.
ENDMETHOD.
METHOD get_chartjs_local.
result = ``.

View File

@ -6,9 +6,10 @@ CLASS z2ui5_cl_fw_http_handler DEFINITION
CLASS-METHODS http_post
IMPORTING
body TYPE string
body TYPE string
check_old_json TYPE abap_bool DEFAULT abap_true
RETURNING
VALUE(result) TYPE string.
VALUE(result) TYPE string.
CLASS-METHODS http_get
IMPORTING
@ -44,6 +45,8 @@ CLASS z2ui5_cl_fw_http_handler IMPLEMENTATION.
METHOD http_post.
z2ui5_cl_fw_controller=>cv_check_ajson = xsdbool( check_old_json = abap_false ).
result = z2ui5_cl_fw_controller=>main( body ).
ENDMETHOD.

View File

@ -176,15 +176,16 @@ INTERFACE z2ui5_if_client
METHODS _bind
IMPORTING
val TYPE data
path TYPE abap_bool DEFAULT abap_false
pretty_mode TYPE clike DEFAULT cs_pretty_mode-none
compress_mode TYPE clike DEFAULT cs_compress_mode-standard
tab TYPE STANDARD TABLE OPTIONAL
tab_index TYPE i OPTIONAL
struc TYPE data OPTIONAL
val TYPE data
path TYPE abap_bool DEFAULT abap_false
pretty_mode TYPE clike DEFAULT cs_pretty_mode-none
compress_mode TYPE clike DEFAULT cs_compress_mode-standard
compress_custom TYPE clike OPTIONAL
tab TYPE STANDARD TABLE OPTIONAL
tab_index TYPE i OPTIONAL
struc TYPE data OPTIONAL
RETURNING
VALUE(result) TYPE string.
VALUE(result) TYPE string.
METHODS _bind_edit
IMPORTING
@ -193,6 +194,7 @@ INTERFACE z2ui5_if_client
view TYPE string DEFAULT cs_view-main
pretty_mode TYPE clike DEFAULT cs_pretty_mode-none
compress_mode TYPE clike DEFAULT cs_compress_mode-standard
compress_custom TYPE clike OPTIONAL
tab TYPE STANDARD TABLE OPTIONAL
tab_index TYPE i OPTIONAL
struc TYPE data OPTIONAL
@ -201,10 +203,11 @@ INTERFACE z2ui5_if_client
METHODS _bind_local
IMPORTING
val TYPE data
path TYPE abap_bool DEFAULT abap_false
pretty_mode TYPE clike DEFAULT cs_pretty_mode-none
compress_mode TYPE clike DEFAULT cs_compress_mode-standard
val TYPE data
path TYPE abap_bool DEFAULT abap_false
pretty_mode TYPE clike DEFAULT cs_pretty_mode-none
compress_custom TYPE clike OPTIONAL
compress_mode TYPE clike DEFAULT cs_compress_mode-standard
RETURNING
VALUE(result) TYPE string.