From 6623679e678202b6684f0f7951bdf2add69047ac Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Sat, 2 Jan 2021 09:12:09 -0500 Subject: [PATCH] Dialogs: HTML forms - follow-up (#4329) * Dialogs: HTML forms - follow-up Follow-up to #4264: - Split `zcl_abapgit_html_form` class Processing form data has been moved to `zcl_abapgit_html_form_utils` - `iv_is_main` refactored to `iv_cmd_type` - In case of unsaved data, form exit will now prompt for confirmation (`zcl_abapgit_html_form_utils`) * dot space * lint * Remove const Co-authored-by: Lars Hvam --- .../zcl_abapgit_gui_page_addofflin.clas.abap | 14 +- .../zcl_abapgit_gui_page_addonline.clas.abap | 16 +- .../zcl_abapgit_gui_page_sett_glob.clas.abap | 65 +- .../zcl_abapgit_gui_page_sett_pers.clas.abap | 42 +- src/ui/zcl_abapgit_html_form.clas.abap | 391 +++-------- ...cl_abapgit_html_form.clas.testclasses.abap | 363 ---------- src/ui/zcl_abapgit_html_form.clas.xml | 3 +- src/ui/zcl_abapgit_html_form_utils.clas.abap | 284 ++++++++ ...pgit_html_form_utils.clas.testclasses.abap | 636 ++++++++++++++++++ src/ui/zcl_abapgit_html_form_utils.clas.xml | 17 + src/ui/zif_abapgit_html_form.intf.abap | 63 ++ src/ui/zif_abapgit_html_form.intf.xml | 15 + 12 files changed, 1178 insertions(+), 731 deletions(-) delete mode 100644 src/ui/zcl_abapgit_html_form.clas.testclasses.abap create mode 100644 src/ui/zcl_abapgit_html_form_utils.clas.abap create mode 100644 src/ui/zcl_abapgit_html_form_utils.clas.testclasses.abap create mode 100644 src/ui/zcl_abapgit_html_form_utils.clas.xml create mode 100644 src/ui/zif_abapgit_html_form.intf.abap create mode 100644 src/ui/zif_abapgit_html_form.intf.xml diff --git a/src/ui/zcl_abapgit_gui_page_addofflin.clas.abap b/src/ui/zcl_abapgit_gui_page_addofflin.clas.abap index 406d11396..50ca97a7d 100644 --- a/src/ui/zcl_abapgit_gui_page_addofflin.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_addofflin.clas.abap @@ -38,9 +38,10 @@ CLASS zcl_abapgit_gui_page_addofflin DEFINITION add_offline_repo TYPE string VALUE 'add-repo-offline', END OF c_event . - DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map . - DATA mo_form_data TYPE REF TO zcl_abapgit_string_map . DATA mo_form TYPE REF TO zcl_abapgit_html_form . + DATA mo_form_data TYPE REF TO zcl_abapgit_string_map . + DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils. + DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map . METHODS validate_form IMPORTING @@ -57,7 +58,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_ADDOFFLIN IMPLEMENTATION. +CLASS zcl_abapgit_gui_page_addofflin IMPLEMENTATION. METHOD constructor. @@ -65,6 +66,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_ADDOFFLIN IMPLEMENTATION. CREATE OBJECT mo_validation_log. CREATE OBJECT mo_form_data. mo_form = get_form_schema( ). + mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ). ENDMETHOD. @@ -117,7 +119,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_ADDOFFLIN IMPLEMENTATION. iv_hint = 'Ignore translations, serialize just main language' )->command( iv_label = 'Create Offline Repo' - iv_is_main = abap_true + iv_cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main iv_action = c_event-add_offline_repo )->command( iv_label = 'Create Package' @@ -133,7 +135,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_ADDOFFLIN IMPLEMENTATION. DATA lx_err TYPE REF TO zcx_abapgit_exception. - ro_validation_log = mo_form->validate_required_fields( io_form_data ). + ro_validation_log = mo_form_util->validate( io_form_data ). IF io_form_data->get( c_id-package ) IS NOT INITIAL. TRY. @@ -163,7 +165,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_ADDOFFLIN IMPLEMENTATION. DATA: ls_repo_params TYPE zif_abapgit_services_repo=>ty_repo_params, lo_new_offline_repo TYPE REF TO zcl_abapgit_repo_offline. - mo_form_data = mo_form->normalize_form_data( ii_event->form_data( ) ). + mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ). CASE ii_event->mv_action. WHEN c_event-go_back. diff --git a/src/ui/zcl_abapgit_gui_page_addonline.clas.abap b/src/ui/zcl_abapgit_gui_page_addonline.clas.abap index 040e7d6f7..a8d6dcd7b 100644 --- a/src/ui/zcl_abapgit_gui_page_addonline.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_addonline.clas.abap @@ -42,9 +42,10 @@ CLASS zcl_abapgit_gui_page_addonline DEFINITION add_online_repo TYPE string VALUE 'add-repo-online', END OF c_event. - DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map. - DATA mo_form_data TYPE REF TO zcl_abapgit_string_map. - DATA mo_form TYPE REF TO zcl_abapgit_html_form. + DATA mo_form TYPE REF TO zcl_abapgit_html_form . + DATA mo_form_data TYPE REF TO zcl_abapgit_string_map . + DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils. + DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map . METHODS validate_form IMPORTING @@ -61,7 +62,7 @@ ENDCLASS. -CLASS ZCL_ABAPGIT_GUI_PAGE_ADDONLINE IMPLEMENTATION. +CLASS zcl_abapgit_gui_page_addonline IMPLEMENTATION. METHOD constructor. @@ -69,6 +70,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_ADDONLINE IMPLEMENTATION. CREATE OBJECT mo_validation_log. CREATE OBJECT mo_form_data. mo_form = get_form_schema( ). + mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ). ENDMETHOD. @@ -136,7 +138,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_ADDONLINE IMPLEMENTATION. iv_hint = 'Ignore translations, serialize just main language' )->command( iv_label = 'Clone Online Repo' - iv_is_main = abap_true + iv_cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main iv_action = c_event-add_online_repo )->command( iv_label = 'Create Package' @@ -152,7 +154,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_ADDONLINE IMPLEMENTATION. DATA lx_err TYPE REF TO zcx_abapgit_exception. - ro_validation_log = mo_form->validate_required_fields( io_form_data ). + ro_validation_log = mo_form_util->validate( io_form_data ). IF io_form_data->get( c_id-url ) IS NOT INITIAL. TRY. @@ -193,7 +195,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_ADDONLINE IMPLEMENTATION. DATA: ls_repo_params TYPE zif_abapgit_services_repo=>ty_repo_params, lo_new_online_repo TYPE REF TO zcl_abapgit_repo_online. - mo_form_data = mo_form->normalize_form_data( ii_event->form_data( ) ). + mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ). CASE ii_event->mv_action. WHEN c_event-go_back. diff --git a/src/ui/zcl_abapgit_gui_page_sett_glob.clas.abap b/src/ui/zcl_abapgit_gui_page_sett_glob.clas.abap index ea0eef9d6..c277b9ccb 100644 --- a/src/ui/zcl_abapgit_gui_page_sett_glob.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_sett_glob.clas.abap @@ -17,6 +17,7 @@ CLASS zcl_abapgit_gui_page_sett_glob DEFINITION METHODS constructor RAISING zcx_abapgit_exception. + PROTECTED SECTION. PRIVATE SECTION. @@ -38,14 +39,17 @@ CLASS zcl_abapgit_gui_page_sett_glob DEFINITION END OF c_id. CONSTANTS: BEGIN OF c_event, - go_back TYPE string VALUE 'go-back', + go_back TYPE string VALUE 'go_back', proxy_bypass TYPE string VALUE 'proxy_bypass', save TYPE string VALUE 'save', END OF c_event. - DATA mo_settings TYPE REF TO zcl_abapgit_settings. - DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map. - DATA mo_form_data TYPE REF TO zcl_abapgit_string_map. + DATA mo_form TYPE REF TO zcl_abapgit_html_form. + DATA mo_form_data TYPE REF TO zcl_abapgit_string_map. + DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils. + DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map. + + DATA mo_settings TYPE REF TO zcl_abapgit_settings. METHODS validate_form IMPORTING @@ -82,6 +86,9 @@ CLASS zcl_abapgit_gui_page_sett_glob IMPLEMENTATION. CREATE OBJECT mo_validation_log. CREATE OBJECT mo_form_data. mo_form = get_form_schema( ). + mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ). + + read_settings( ). ENDMETHOD. @@ -103,8 +110,6 @@ CLASS zcl_abapgit_gui_page_sett_glob IMPLEMENTATION. METHOD get_form_schema. - CONSTANTS lc_abapgit_prog TYPE progname VALUE `ZABAPGIT`. - ro_form = zcl_abapgit_html_form=>create( iv_form_id = 'global-setting-form' iv_help_page = 'https://docs.abapgit.org/guide-settings-global.html' ). @@ -151,7 +156,7 @@ CLASS zcl_abapgit_gui_page_sett_glob IMPLEMENTATION. iv_hint = |At least { zcl_abapgit_settings=>c_commitmsg_body_size_dft } characters| iv_min = zcl_abapgit_settings=>c_commitmsg_body_size_dft ). - IF zcl_abapgit_services_abapgit=>is_installed( ) = abap_true AND sy-cprog = lc_abapgit_prog. + IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false. ro_form->start_group( iv_name = c_id-devint_settings iv_label = 'Development Internal Settings' @@ -165,7 +170,7 @@ CLASS zcl_abapgit_gui_page_sett_glob IMPLEMENTATION. ro_form->command( iv_label = 'Save Settings' - iv_is_main = abap_true + iv_cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main iv_action = c_event-save )->command( iv_label = 'Back' @@ -183,8 +188,11 @@ CLASS zcl_abapgit_gui_page_sett_glob IMPLEMENTATION. lt_proxy_bypass = mo_settings->get_proxy_bypass( ). LOOP AT lt_proxy_bypass INTO ls_proxy_bypass. - lv_val = lv_val && ls_proxy_bypass-low && zif_abapgit_definitions=>c_crlf. + lv_val = lv_val && ls_proxy_bypass-low && zif_abapgit_definitions=>c_newline. ENDLOOP. + IF sy-subrc <> 0. + lv_val = zif_abapgit_definitions=>c_newline. + ENDIF. mo_form_data->set( iv_key = c_id-proxy_bypass @@ -207,7 +215,7 @@ CLASS zcl_abapgit_gui_page_sett_glob IMPLEMENTATION. iv_val = mo_settings->get_proxy_port( ) ). mo_form_data->set( iv_key = c_id-proxy_auth - iv_val = mo_settings->get_proxy_authentication( ) ). + iv_val = boolc( mo_settings->get_proxy_authentication( ) = abap_true ) ). read_proxy_bypass( ). @@ -223,12 +231,17 @@ CLASS zcl_abapgit_gui_page_sett_glob IMPLEMENTATION. iv_val = |{ mo_settings->get_commitmsg_body_size( ) }| ). " Dev Internal - mo_form_data->set( - iv_key = c_id-run_critical_tests - iv_val = |{ mo_settings->get_run_critical_tests( ) }| ). - mo_form_data->set( - iv_key = c_id-experimental_features - iv_val = |{ mo_settings->get_experimental_features( ) }| ). + IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false. + mo_form_data->set( + iv_key = c_id-run_critical_tests + iv_val = boolc( mo_settings->get_run_critical_tests( ) = abap_true ) ). + mo_form_data->set( + iv_key = c_id-experimental_features + iv_val = boolc( mo_settings->get_experimental_features( ) = abap_true ) ). + ENDIF. + + " Set for is_dirty check + mo_form_util->set_data( mo_form_data ). ENDMETHOD. @@ -274,8 +287,10 @@ CLASS zcl_abapgit_gui_page_sett_glob IMPLEMENTATION. mo_settings->set_commitmsg_body_size( lv_value ). " Dev Internal - mo_settings->set_run_critical_tests( boolc( mo_form_data->get( c_id-run_critical_tests ) = abap_true ) ). - mo_settings->set_experimental_features( boolc( mo_form_data->get( c_id-experimental_features ) = abap_true ) ). + IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false. + mo_settings->set_run_critical_tests( boolc( mo_form_data->get( c_id-run_critical_tests ) = abap_true ) ). + mo_settings->set_experimental_features( boolc( mo_form_data->get( c_id-experimental_features ) = abap_true ) ). + ENDIF. " Store in DB lo_persistence = zcl_abapgit_persist_settings=>get_instance( ). @@ -285,12 +300,14 @@ CLASS zcl_abapgit_gui_page_sett_glob IMPLEMENTATION. MESSAGE 'Settings succesfully saved' TYPE 'S'. + read_settings( ). + ENDMETHOD. METHOD validate_form. - ro_validation_log = mo_form->validate_required_fields( io_form_data ). + ro_validation_log = mo_form_util->validate( io_form_data ). IF io_form_data->get( c_id-proxy_url ) IS NOT INITIAL AND io_form_data->get( c_id-proxy_port ) IS INITIAL OR io_form_data->get( c_id-proxy_url ) IS INITIAL AND io_form_data->get( c_id-proxy_port ) IS NOT INITIAL. @@ -311,14 +328,14 @@ CLASS zcl_abapgit_gui_page_sett_glob IMPLEMENTATION. METHOD zif_abapgit_gui_event_handler~on_event. - mo_form_data = mo_form->normalize_form_data( ii_event->form_data( ) ). + mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ). CASE ii_event->mv_action. WHEN c_event-go_back. - rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark. + rs_handled-state = mo_form_util->exit( mo_form_data ). WHEN c_event-save. - " Validate all form entries + " Validate form entries before saving mo_validation_log = validate_form( mo_form_data ). IF mo_validation_log->is_empty( ) = abap_true. @@ -336,7 +353,9 @@ CLASS zcl_abapgit_gui_page_sett_glob IMPLEMENTATION. gui_services( )->register_event_handler( me ). - read_settings( ). + IF mo_form_util->is_empty( mo_form_data ) = abap_true. + read_settings( ). + ENDIF. CREATE OBJECT ri_html TYPE zcl_abapgit_html. diff --git a/src/ui/zcl_abapgit_gui_page_sett_pers.clas.abap b/src/ui/zcl_abapgit_gui_page_sett_pers.clas.abap index 04bb30a82..0f2969297 100644 --- a/src/ui/zcl_abapgit_gui_page_sett_pers.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_sett_pers.clas.abap @@ -17,6 +17,7 @@ CLASS zcl_abapgit_gui_page_sett_pers DEFINITION METHODS constructor RAISING zcx_abapgit_exception. + PROTECTED SECTION. PRIVATE SECTION. @@ -38,18 +39,19 @@ CLASS zcl_abapgit_gui_page_sett_pers DEFINITION hide_sapgui_hint TYPE string VALUE 'hide_sapgui_hint', activate_wo_popup TYPE string VALUE 'activate_wo_popup', END OF c_id. - CONSTANTS: BEGIN OF c_event, - go_back TYPE string VALUE 'go-back', + go_back TYPE string VALUE 'go_back', save TYPE string VALUE 'save', END OF c_event. + DATA mo_form TYPE REF TO zcl_abapgit_html_form. + DATA mo_form_data TYPE REF TO zcl_abapgit_string_map. + DATA mo_form_util TYPE REF TO zcl_abapgit_html_form_utils. + DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map. + DATA mo_settings TYPE REF TO zcl_abapgit_settings. DATA ms_settings TYPE zif_abapgit_definitions=>ty_s_user_settings. - DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map. - DATA mo_form_data TYPE REF TO zcl_abapgit_string_map. - DATA mo_form TYPE REF TO zcl_abapgit_html_form. METHODS validate_form IMPORTING @@ -80,6 +82,9 @@ CLASS zcl_abapgit_gui_page_sett_pers IMPLEMENTATION. CREATE OBJECT mo_validation_log. CREATE OBJECT mo_form_data. mo_form = get_form_schema( ). + mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ). + + read_settings( ). ENDMETHOD. @@ -179,7 +184,7 @@ CLASS zcl_abapgit_gui_page_sett_pers IMPLEMENTATION. iv_hint = 'If disabled, abapGit will use only a single thread to serialize objects' )->command( iv_label = 'Save Settings' - iv_is_main = abap_true + iv_cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main iv_action = c_event-save )->command( iv_label = 'Back' @@ -217,13 +222,13 @@ CLASS zcl_abapgit_gui_page_sett_pers IMPLEMENTATION. " Interaction mo_form_data->set( iv_key = c_id-activate_wo_popup - iv_val = |{ ms_settings-activate_wo_popup }| ). + iv_val = boolc( ms_settings-activate_wo_popup = abap_true ) ). mo_form_data->set( iv_key = c_id-adt_jump_enabled - iv_val = |{ ms_settings-adt_jump_enabled }| ). + iv_val = boolc( ms_settings-adt_jump_enabled = abap_true ) ). mo_form_data->set( iv_key = c_id-link_hints_enabled - iv_val = |{ ms_settings-link_hints_enabled }| ). + iv_val = boolc( ms_settings-link_hints_enabled = abap_true ) ). mo_form_data->set( iv_key = c_id-link_hint_key iv_val = |{ ms_settings-link_hint_key }| ). @@ -231,7 +236,10 @@ CLASS zcl_abapgit_gui_page_sett_pers IMPLEMENTATION. " Resources mo_form_data->set( iv_key = c_id-parallel_proc_disabled - iv_val = |{ ms_settings-parallel_proc_disabled }| ). + iv_val = boolc( ms_settings-parallel_proc_disabled = abap_true ) ). + + " Set for is_dirty check + mo_form_util->set_data( mo_form_data ). ENDMETHOD. @@ -267,26 +275,28 @@ CLASS zcl_abapgit_gui_page_sett_pers IMPLEMENTATION. MESSAGE 'Settings succesfully saved' TYPE 'S'. + read_settings( ). + ENDMETHOD. METHOD validate_form. - ro_validation_log = mo_form->validate_required_fields( io_form_data ). + ro_validation_log = mo_form_util->validate( io_form_data ). ENDMETHOD. METHOD zif_abapgit_gui_event_handler~on_event. - mo_form_data = mo_form->normalize_form_data( ii_event->form_data( ) ). + mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ). CASE ii_event->mv_action. WHEN c_event-go_back. - rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark. + rs_handled-state = mo_form_util->exit( mo_form_data ). WHEN c_event-save. - " Validate all form entries + " Validate form entries before saving mo_validation_log = validate_form( mo_form_data ). IF mo_validation_log->is_empty( ) = abap_true. @@ -304,7 +314,9 @@ CLASS zcl_abapgit_gui_page_sett_pers IMPLEMENTATION. gui_services( )->register_event_handler( me ). - read_settings( ). + IF mo_form_util->is_empty( mo_form_data ) = abap_true. + read_settings( ). + ENDIF. CREATE OBJECT ri_html TYPE zcl_abapgit_html. diff --git a/src/ui/zcl_abapgit_html_form.clas.abap b/src/ui/zcl_abapgit_html_form.clas.abap index f9b09805f..e8ebe52a9 100644 --- a/src/ui/zcl_abapgit_html_form.clas.abap +++ b/src/ui/zcl_abapgit_html_form.clas.abap @@ -1,40 +1,32 @@ CLASS zcl_abapgit_html_form DEFINITION PUBLIC FINAL - CREATE PRIVATE. + CREATE PRIVATE . PUBLIC SECTION. - CONSTANTS c_rows TYPE string VALUE 'rows'. - - CONSTANTS: - BEGIN OF c_cmd_type, - input TYPE i VALUE 1, - link TYPE i VALUE 2, - button TYPE i VALUE 3, - END OF c_cmd_type. + INTERFACES zif_abapgit_html_form . CLASS-METHODS create IMPORTING !iv_form_id TYPE csequence OPTIONAL !iv_help_page TYPE csequence OPTIONAL RETURNING - VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form. + VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form . METHODS render IMPORTING !iv_form_class TYPE csequence !io_values TYPE REF TO zcl_abapgit_string_map !io_validation_log TYPE REF TO zcl_abapgit_string_map OPTIONAL RETURNING - VALUE(ri_html) TYPE REF TO zif_abapgit_html. + VALUE(ri_html) TYPE REF TO zif_abapgit_html . METHODS command IMPORTING !iv_label TYPE csequence !iv_action TYPE csequence - !iv_is_main TYPE abap_bool DEFAULT abap_false - !iv_cmd_type TYPE i DEFAULT 1 + !iv_cmd_type TYPE i DEFAULT zif_abapgit_html_form=>c_cmd_type-input RETURNING - VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form. + VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . METHODS text IMPORTING !iv_label TYPE csequence @@ -49,7 +41,7 @@ CLASS zcl_abapgit_html_form DEFINITION !iv_min TYPE i DEFAULT cl_abap_math=>min_int4 !iv_max TYPE i DEFAULT cl_abap_math=>max_int4 RETURNING - VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form. + VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . METHODS textarea IMPORTING !iv_label TYPE csequence @@ -59,7 +51,7 @@ CLASS zcl_abapgit_html_form DEFINITION !iv_readonly TYPE abap_bool DEFAULT abap_false !iv_placeholder TYPE csequence OPTIONAL RETURNING - VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form. + VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . METHODS number IMPORTING !iv_label TYPE csequence @@ -70,14 +62,14 @@ CLASS zcl_abapgit_html_form DEFINITION !iv_min TYPE i DEFAULT cl_abap_math=>min_int4 !iv_max TYPE i DEFAULT cl_abap_math=>max_int4 RETURNING - VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form. + VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . METHODS checkbox IMPORTING !iv_label TYPE csequence !iv_name TYPE csequence !iv_hint TYPE csequence OPTIONAL RETURNING - VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form. + VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . METHODS radio IMPORTING !iv_label TYPE csequence @@ -85,101 +77,45 @@ CLASS zcl_abapgit_html_form DEFINITION !iv_default_value TYPE csequence OPTIONAL !iv_hint TYPE csequence OPTIONAL RETURNING - VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form. + VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . METHODS option IMPORTING !iv_label TYPE csequence !iv_value TYPE csequence RETURNING - VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form. + VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . METHODS table IMPORTING !iv_label TYPE csequence !iv_name TYPE csequence !iv_hint TYPE csequence OPTIONAL RETURNING - VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form. + VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . METHODS column IMPORTING !iv_label TYPE csequence !iv_width TYPE csequence OPTIONAL !iv_readonly TYPE abap_bool DEFAULT abap_false RETURNING - VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form. + VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . METHODS start_group IMPORTING !iv_label TYPE csequence !iv_name TYPE csequence !iv_hint TYPE csequence OPTIONAL RETURNING - VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form. - METHODS normalize_form_data - IMPORTING - !io_form_data TYPE REF TO zcl_abapgit_string_map - RETURNING - VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map - RAISING - zcx_abapgit_exception. - METHODS validate_required_fields - IMPORTING - !io_form_data TYPE REF TO zcl_abapgit_string_map - RETURNING - VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map - RAISING - zcx_abapgit_exception. - METHODS is_empty - IMPORTING - !io_form_data TYPE REF TO zcl_abapgit_string_map - RETURNING - VALUE(rv_empty) TYPE abap_bool - RAISING - zcx_abapgit_exception. + VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . METHODS hidden IMPORTING !iv_name TYPE csequence RETURNING - VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form. - + VALUE(ro_self) TYPE REF TO zcl_abapgit_html_form . + METHODS get_fields + RETURNING + VALUE(rt_fields) TYPE zif_abapgit_html_form=>ty_fields . PROTECTED SECTION. PRIVATE SECTION. - TYPES: - BEGIN OF ty_subitem, - label TYPE string, - value TYPE string, - readonly TYPE abap_bool, - END OF ty_subitem. - TYPES: - ty_subitems TYPE STANDARD TABLE OF ty_subitem WITH DEFAULT KEY. - TYPES: - BEGIN OF ty_field, - type TYPE i, - name TYPE string, - label TYPE string, - hint TYPE string, - dblclick TYPE string, - placeholder TYPE string, - required TYPE string, - upper_case TYPE abap_bool, - item_class TYPE string, - error TYPE string, - default_value TYPE string, - side_action TYPE string, - subitems TYPE ty_subitems, - readonly TYPE abap_bool, - password TYPE abap_bool, - min TYPE i, - max TYPE i, -* onclick ??? - END OF ty_field. - TYPES: - BEGIN OF ty_command, - label TYPE string, - action TYPE string, - is_main TYPE abap_bool, - cmd_type TYPE i, -* onclick ??? - END OF ty_command. TYPES: BEGIN OF ty_attr, value TYPE string, @@ -188,68 +124,56 @@ CLASS zcl_abapgit_html_form DEFINITION readonly TYPE string, placeholder TYPE string, required TYPE string, - END OF ty_attr. + END OF ty_attr . - CONSTANTS: - BEGIN OF c_field_type, - text TYPE i VALUE 1, - radio TYPE i VALUE 2, - checkbox TYPE i VALUE 3, - field_group TYPE i VALUE 4, - number TYPE i VALUE 5, - textarea TYPE i VALUE 6, - table TYPE i VALUE 7, - hidden TYPE i VALUE 8, - END OF c_field_type. DATA: - mt_fields TYPE STANDARD TABLE OF ty_field - WITH UNIQUE SORTED KEY by_name COMPONENTS name. + mt_fields TYPE zif_abapgit_html_form=>ty_fields. DATA: - mt_commands TYPE STANDARD TABLE OF ty_command. - DATA mv_form_id TYPE string. - DATA mv_help_page TYPE string. + mt_commands TYPE STANDARD TABLE OF zif_abapgit_html_form=>ty_command . + DATA mv_form_id TYPE string . + DATA mv_help_page TYPE string . METHODS render_field IMPORTING !ii_html TYPE REF TO zif_abapgit_html !io_values TYPE REF TO zcl_abapgit_string_map !io_validation_log TYPE REF TO zcl_abapgit_string_map - !is_field TYPE ty_field. + !is_field TYPE zif_abapgit_html_form=>ty_field . METHODS render_field_text IMPORTING !ii_html TYPE REF TO zif_abapgit_html - !is_field TYPE ty_field - !is_attr TYPE ty_attr. + !is_field TYPE zif_abapgit_html_form=>ty_field + !is_attr TYPE ty_attr . METHODS render_field_textarea IMPORTING !ii_html TYPE REF TO zif_abapgit_html - !is_field TYPE ty_field - !is_attr TYPE ty_attr. + !is_field TYPE zif_abapgit_html_form=>ty_field + !is_attr TYPE ty_attr . METHODS render_field_checkbox IMPORTING !ii_html TYPE REF TO zif_abapgit_html - !is_field TYPE ty_field - !is_attr TYPE ty_attr. + !is_field TYPE zif_abapgit_html_form=>ty_field + !is_attr TYPE ty_attr . METHODS render_field_radio IMPORTING !ii_html TYPE REF TO zif_abapgit_html - !is_field TYPE ty_field - !is_attr TYPE ty_attr. + !is_field TYPE zif_abapgit_html_form=>ty_field + !is_attr TYPE ty_attr . METHODS render_field_table IMPORTING !ii_html TYPE REF TO zif_abapgit_html - !is_field TYPE ty_field + !is_field TYPE zif_abapgit_html_form=>ty_field !is_attr TYPE ty_attr - !io_values TYPE REF TO zcl_abapgit_string_map. + !io_values TYPE REF TO zcl_abapgit_string_map . METHODS render_command IMPORTING !ii_html TYPE REF TO zif_abapgit_html - !is_cmd TYPE ty_command. + !is_cmd TYPE zif_abapgit_html_form=>ty_command . METHODS render_field_hidden IMPORTING !ii_html TYPE REF TO zif_abapgit_html - !is_field TYPE ty_field - !is_attr TYPE ty_attr. + !is_field TYPE zif_abapgit_html_form=>ty_field + !is_attr TYPE ty_attr . ENDCLASS. @@ -261,7 +185,7 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. DATA ls_field LIKE LINE OF mt_fields. - ls_field-type = c_field_type-checkbox. + ls_field-type = zif_abapgit_html_form=>c_field_type-checkbox. ls_field-name = iv_name. ls_field-label = iv_label. ls_field-hint = iv_hint. @@ -284,7 +208,7 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. READ TABLE mt_fields INDEX lv_size ASSIGNING . ASSERT sy-subrc = 0. - ASSERT -type = c_field_type-table. + ASSERT -type = zif_abapgit_html_form=>c_field_type-table. ls_column-label = iv_label. ls_column-value = iv_width. @@ -301,11 +225,10 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. DATA ls_cmd LIKE LINE OF mt_commands. - ASSERT iv_cmd_type BETWEEN 1 AND 3. + ASSERT iv_cmd_type BETWEEN 1 AND 4. ls_cmd-label = iv_label. ls_cmd-action = iv_action. - ls_cmd-is_main = iv_is_main. ls_cmd-cmd_type = iv_cmd_type. APPEND ls_cmd TO mt_commands. @@ -331,135 +254,27 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. ENDMETHOD. + METHOD get_fields. + rt_fields = mt_fields. + ENDMETHOD. + + METHOD hidden. DATA ls_field LIKE LINE OF mt_fields. - ls_field-type = c_field_type-hidden. + ls_field-type = zif_abapgit_html_form=>c_field_type-hidden. ls_field-name = iv_name. APPEND ls_field TO mt_fields. ENDMETHOD. - METHOD is_empty. - - DATA: - lv_value TYPE string, - lv_rows TYPE i, - lv_row TYPE i. - - FIELD-SYMBOLS LIKE LINE OF mt_fields. - - rv_empty = abap_true. - LOOP AT mt_fields ASSIGNING WHERE type <> c_field_type-field_group. - lv_value = condense( - val = io_form_data->get( -name ) - del = ` ` ). - - IF -type = c_field_type-number. - rv_empty = boolc( lv_value IS INITIAL OR lv_value = '0' ). - ELSEIF -type = c_field_type-table. - lv_rows = io_form_data->get( |{ -name }-{ c_rows }| ). - DO lv_rows TIMES. - lv_row = sy-index. - DO lines( -subitems ) TIMES. - lv_value = io_form_data->get( |{ -name }-{ lv_row }-{ sy-index }| ). - rv_empty = boolc( lv_value IS INITIAL ). - IF rv_empty <> abap_true. - RETURN. - ENDIF. - ENDDO. - ENDDO. - ELSEIF -type = c_field_type-textarea. - REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_crlf IN lv_value WITH ''. - REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_newline IN lv_value WITH ''. - rv_empty = boolc( lv_value IS INITIAL ). - ELSE. - rv_empty = boolc( lv_value IS INITIAL ). - ENDIF. - - IF rv_empty <> abap_true. - RETURN. - ENDIF. - ENDLOOP. - - ENDMETHOD. - - - METHOD normalize_form_data. - - DATA: - lv_value TYPE string, - lv_rows TYPE i, - lv_row TYPE i, - lv_len TYPE i. - - FIELD-SYMBOLS LIKE LINE OF mt_fields. - - CREATE OBJECT ro_form_data. - - LOOP AT mt_fields ASSIGNING WHERE type <> c_field_type-field_group. - CLEAR lv_value. - lv_value = io_form_data->get( -name ). - - IF -type = c_field_type-checkbox. - ro_form_data->set( - iv_key = -name - iv_val = boolc( lv_value = 'on' ) ). - ELSEIF -type = c_field_type-text AND -upper_case = abap_true. - ro_form_data->set( - iv_key = -name - iv_val = to_upper( lv_value ) ). - ELSEIF -type = c_field_type-number. - " Numeric value is checked in validation - ro_form_data->set( - iv_key = -name - iv_val = condense( val = lv_value del = ` ` ) ). - ELSEIF -type = c_field_type-table. - lv_rows = io_form_data->get( |{ -name }-{ c_rows }| ). - DO lv_rows TIMES. - lv_row = sy-index. - DO lines( -subitems ) TIMES. - lv_value = io_form_data->get( |{ -name }-{ lv_row }-{ sy-index }| ). - ro_form_data->set( - iv_key = |{ -name }-{ lv_row }-{ sy-index }| - iv_val = lv_value ). - ENDDO. - ENDDO. - ro_form_data->set( - iv_key = |{ -name }-{ c_rows }| - iv_val = |{ lv_rows }| ). - ELSEIF -type = c_field_type-textarea. - REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_crlf IN lv_value - WITH zif_abapgit_definitions=>c_newline. - - " Remove last line if empty (ie 2x newline) - lv_len = strlen( lv_value ) - 2. - IF lv_len >= 0 AND lv_value+lv_len(1) = zif_abapgit_definitions=>c_newline. - lv_len = lv_len + 1. - lv_value = lv_value(lv_len). - ENDIF. - - ro_form_data->set( - iv_key = -name - iv_val = lv_value ). - ELSE. - ro_form_data->set( - iv_key = -name - iv_val = lv_value ). - ENDIF. - - ENDLOOP. - - ENDMETHOD. - - METHOD number. DATA ls_field LIKE LINE OF mt_fields. - ls_field-type = c_field_type-number. + ls_field-type = zif_abapgit_html_form=>c_field_type-number. ls_field-name = iv_name. ls_field-label = iv_label. ls_field-readonly = iv_readonly. @@ -486,7 +301,7 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. READ TABLE mt_fields INDEX lv_size ASSIGNING . ASSERT sy-subrc = 0. - ASSERT -type = c_field_type-radio. " Or dropdown - TODO in future + ASSERT -type = zif_abapgit_html_form=>c_field_type-radio. " Or dropdown - TODO in future ls_option-label = iv_label. ls_option-value = iv_value. @@ -502,7 +317,7 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. DATA ls_field LIKE LINE OF mt_fields. - ls_field-type = c_field_type-radio. + ls_field-type = zif_abapgit_html_form=>c_field_type-radio. ls_field-name = iv_name. ls_field-label = iv_label. ls_field-default_value = iv_default_value. @@ -534,7 +349,7 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. ri_html->add( |
| ). " Add hidden button that triggers main command when pressing enter - LOOP AT mt_commands ASSIGNING WHERE is_main = abap_true. + LOOP AT mt_commands ASSIGNING WHERE cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main. ri_html->add( || ). EXIT. @@ -542,12 +357,12 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. LOOP AT mt_fields ASSIGNING . AT FIRST. - IF -type <> c_field_type-field_group. + IF -type <> zif_abapgit_html_form=>c_field_type-field_group. ri_html->add( |
    | ). ENDIF. ENDAT. - IF -type = c_field_type-field_group. + IF -type = zif_abapgit_html_form=>c_field_type-field_group. IF lv_cur_group IS NOT INITIAL AND lv_cur_group <> -name. ri_html->add( |
| ). ri_html->add( || ). @@ -607,30 +422,28 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. METHOD render_command. - DATA lv_main_submit TYPE string. - CASE is_cmd-cmd_type. - WHEN c_cmd_type-link. + WHEN zif_abapgit_html_form=>c_cmd_type-link. ii_html->add_a( iv_txt = is_cmd-label iv_act = is_cmd-action iv_class = 'dialog-commands' ). - WHEN c_cmd_type-button. + WHEN zif_abapgit_html_form=>c_cmd_type-button. ii_html->add( || ). - WHEN c_cmd_type-input. + WHEN zif_abapgit_html_form=>c_cmd_type-input. - IF is_cmd-is_main = abap_true. - lv_main_submit = ' class="main"'. - ELSE. - CLEAR lv_main_submit. - ENDIF. ii_html->add( || ). + is_cmd-label }" formaction="sapevent:{ is_cmd-action }">| ). + + WHEN zif_abapgit_html_form=>c_cmd_type-input_main. + + ii_html->add( || ). WHEN OTHERS. ASSERT 0 = 1. @@ -685,7 +498,7 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. IF ls_attr-error IS NOT INITIAL. lv_item_class = condense( lv_item_class && ' error' ). ENDIF. - IF is_field-type = c_field_type-text AND is_field-max BETWEEN 1 AND 20. + IF is_field-type = zif_abapgit_html_form=>c_field_type-text AND is_field-max BETWEEN 1 AND 20. " Reduced width for short fields lv_item_class = lv_item_class && ' w40'. ENDIF. @@ -697,35 +510,35 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. ii_html->add( || ). CASE is_field-type. - WHEN c_field_type-text OR c_field_type-number. + WHEN zif_abapgit_html_form=>c_field_type-text OR zif_abapgit_html_form=>c_field_type-number. render_field_text( ii_html = ii_html is_field = is_field is_attr = ls_attr ). - WHEN c_field_type-textarea. + WHEN zif_abapgit_html_form=>c_field_type-textarea. render_field_textarea( ii_html = ii_html is_field = is_field is_attr = ls_attr ). - WHEN c_field_type-checkbox. + WHEN zif_abapgit_html_form=>c_field_type-checkbox. render_field_checkbox( ii_html = ii_html is_field = is_field is_attr = ls_attr ). - WHEN c_field_type-radio. + WHEN zif_abapgit_html_form=>c_field_type-radio. render_field_radio( ii_html = ii_html is_field = is_field is_attr = ls_attr ). - WHEN c_field_type-table. + WHEN zif_abapgit_html_form=>c_field_type-table. render_field_table( ii_html = ii_html @@ -733,7 +546,7 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. is_attr = ls_attr io_values = io_values ). - WHEN c_field_type-hidden. + WHEN zif_abapgit_html_form=>c_field_type-hidden. render_field_hidden( ii_html = ii_html @@ -847,7 +660,7 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. ii_html->add( || ). ii_html->add( || ). - lv_rows = io_values->get( |{ is_field-name }-{ c_rows }| ). + lv_rows = io_values->get( |{ is_field-name }-{ zif_abapgit_html_form=>c_rows }| ). ii_html->add( || ). DO lv_rows TIMES. @@ -871,7 +684,7 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. ii_html->add( || ). " Hidden field with number of rows to simplify getting values from form - lv_value = |{ is_field-name }-{ c_rows }|. + lv_value = |{ is_field-name }-{ zif_abapgit_html_form=>c_rows }|. ii_html->add( || ). @@ -893,7 +706,7 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. ii_html->add( '
' ). " Ugly :( ENDIF. - IF is_field-type = c_field_type-number. + IF is_field-type = zif_abapgit_html_form=>c_field_type-number. lv_type = 'number'. ELSEIF is_field-password = abap_true. lv_type = 'password'. @@ -941,7 +754,7 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. DATA ls_field LIKE LINE OF mt_fields. - ls_field-type = c_field_type-field_group. + ls_field-type = zif_abapgit_html_form=>c_field_type-field_group. ls_field-label = iv_label. ls_field-name = iv_name. ls_field-hint = iv_hint. @@ -957,7 +770,7 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. DATA ls_field LIKE LINE OF mt_fields. - ls_field-type = c_field_type-table. + ls_field-type = zif_abapgit_html_form=>c_field_type-table. ls_field-name = iv_name. ls_field-label = iv_label. ls_field-hint = iv_hint. @@ -973,7 +786,7 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. DATA ls_field LIKE LINE OF mt_fields. - ls_field-type = c_field_type-text. + ls_field-type = zif_abapgit_html_form=>c_field_type-text. ls_field-name = iv_name. ls_field-label = iv_label. ls_field-upper_case = iv_upper_case. @@ -1005,7 +818,7 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. DATA ls_field LIKE LINE OF mt_fields. - ls_field-type = c_field_type-textarea. + ls_field-type = zif_abapgit_html_form=>c_field_type-textarea. ls_field-name = iv_name. ls_field-label = iv_label. ls_field-readonly = iv_readonly. @@ -1018,56 +831,4 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION. ro_self = me. ENDMETHOD. - - - METHOD validate_required_fields. - - DATA lv_value TYPE string. - DATA lv_number TYPE i. - FIELD-SYMBOLS LIKE LINE OF mt_fields. - - CREATE OBJECT ro_validation_log. - - LOOP AT mt_fields ASSIGNING . - lv_value = io_form_data->get( -name ). - IF -required IS NOT INITIAL AND lv_value IS INITIAL. - ro_validation_log->set( - iv_key = -name - iv_val = |{ -label } cannot be empty| ). - ENDIF. - CASE -type. - WHEN c_field_type-text. - IF -min <> cl_abap_math=>min_int4 AND strlen( lv_value ) < -min. - ro_validation_log->set( - iv_key = -name - iv_val = |{ -label } must not be shorter than { -min } characters| ). - ENDIF. - IF -max <> cl_abap_math=>max_int4 AND strlen( lv_value ) > -max. - ro_validation_log->set( - iv_key = -name - iv_val = |{ -label } must not be longer than { -max } characters| ). - ENDIF. - WHEN c_field_type-number. - TRY. - lv_number = lv_value. - CATCH cx_root. - ro_validation_log->set( - iv_key = -name - iv_val = |{ -label } is not numeric| ). - CONTINUE. - ENDTRY. - IF -min <> cl_abap_math=>min_int4 AND lv_number < -min. - ro_validation_log->set( - iv_key = -name - iv_val = |{ -label } must not be lower than { -min }| ). - ENDIF. - IF -max <> cl_abap_math=>max_int4 AND lv_number > -max. - ro_validation_log->set( - iv_key = -name - iv_val = |{ -label } must not be higher than { -max }| ). - ENDIF. - ENDCASE. - ENDLOOP. - - ENDMETHOD. ENDCLASS. diff --git a/src/ui/zcl_abapgit_html_form.clas.testclasses.abap b/src/ui/zcl_abapgit_html_form.clas.testclasses.abap deleted file mode 100644 index 97330a044..000000000 --- a/src/ui/zcl_abapgit_html_form.clas.testclasses.abap +++ /dev/null @@ -1,363 +0,0 @@ -CLASS ltcl_test_form DEFINITION - FOR TESTING - RISK LEVEL HARMLESS - DURATION SHORT - FINAL. - - PRIVATE SECTION. - - METHODS validate FOR TESTING RAISING zcx_abapgit_exception. - METHODS normalize FOR TESTING RAISING zcx_abapgit_exception. - METHODS is_empty FOR TESTING RAISING zcx_abapgit_exception. - -ENDCLASS. - -CLASS ltcl_test_form IMPLEMENTATION. - - METHOD validate. - - DATA lo_cut TYPE REF TO zcl_abapgit_html_form. - DATA lo_form_data TYPE REF TO zcl_abapgit_string_map. - DATA lo_log TYPE REF TO zcl_abapgit_string_map. - - lo_cut = zcl_abapgit_html_form=>create( ). - lo_form_data = zcl_abapgit_string_map=>create( ). - - lo_cut->text( - iv_name = 'field1' - iv_required = abap_true - iv_label = 'Field name 1' - )->text( - iv_name = 'field2' - iv_label = 'Field name 2' ). - - lo_log = lo_cut->validate_required_fields( lo_form_data ). - cl_abap_unit_assert=>assert_equals( - act = lo_log->size( ) - exp = 1 ). - cl_abap_unit_assert=>assert_char_cp( - act = lo_log->get( 'field1' ) - exp = '*cannot be empty' ). - - lo_form_data->set( - iv_key = 'field1' - iv_val = '' ). - lo_log = lo_cut->validate_required_fields( lo_form_data ). - cl_abap_unit_assert=>assert_equals( - act = lo_log->size( ) - exp = 1 ). - cl_abap_unit_assert=>assert_char_cp( - act = lo_log->get( 'field1' ) - exp = '*cannot be empty' ). - - lo_form_data->set( - iv_key = 'field1' - iv_val = 'xyz' ). - lo_log = lo_cut->validate_required_fields( lo_form_data ). - cl_abap_unit_assert=>assert_equals( - act = lo_log->size( ) - exp = 0 ). - - " New form - lo_cut = zcl_abapgit_html_form=>create( ). - - lo_cut->text( - iv_name = 'field3' - iv_min = 3 - iv_max = 10 - iv_label = 'Field name 3' ). - - lo_form_data->set( - iv_key = 'field3' - iv_val = 'xy' ). - lo_log = lo_cut->validate_required_fields( lo_form_data ). - cl_abap_unit_assert=>assert_equals( - act = lo_log->size( ) - exp = 1 ). - cl_abap_unit_assert=>assert_char_cp( - act = lo_log->get( 'field3' ) - exp = '*must not be shorter*' ). - - lo_form_data->set( - iv_key = 'field3' - iv_val = '01234567890123' ). - lo_log = lo_cut->validate_required_fields( lo_form_data ). - cl_abap_unit_assert=>assert_equals( - act = lo_log->size( ) - exp = 1 ). - cl_abap_unit_assert=>assert_char_cp( - act = lo_log->get( 'field3' ) - exp = '*must not be longer*' ). - - lo_form_data->set( - iv_key = 'field3' - iv_val = 'xyz!' ). - lo_log = lo_cut->validate_required_fields( lo_form_data ). - cl_abap_unit_assert=>assert_equals( - act = lo_log->size( ) - exp = 0 ). - - " New form - lo_cut = zcl_abapgit_html_form=>create( ). - - lo_cut->number( - iv_name = 'field4' - iv_min = 100 - iv_max = 200 - iv_label = 'Field name 4' ). - - lo_form_data->set( - iv_key = 'field4' - iv_val = '123-456' ). - lo_log = lo_cut->validate_required_fields( lo_form_data ). - cl_abap_unit_assert=>assert_equals( - act = lo_log->size( ) - exp = 1 ). - cl_abap_unit_assert=>assert_char_cp( - act = lo_log->get( 'field4' ) - exp = '*is not numeric*' ). - - lo_form_data->set( - iv_key = 'field4' - iv_val = '50' ). - lo_log = lo_cut->validate_required_fields( lo_form_data ). - cl_abap_unit_assert=>assert_equals( - act = lo_log->size( ) - exp = 1 ). - cl_abap_unit_assert=>assert_char_cp( - act = lo_log->get( 'field4' ) - exp = '*must not be lower*' ). - - lo_form_data->set( - iv_key = 'field4' - iv_val = '250' ). - lo_log = lo_cut->validate_required_fields( lo_form_data ). - cl_abap_unit_assert=>assert_equals( - act = lo_log->size( ) - exp = 1 ). - cl_abap_unit_assert=>assert_char_cp( - act = lo_log->get( 'field4' ) - exp = '*must not be higher*' ). - - lo_form_data->set( - iv_key = 'field4' - iv_val = '150' ). - lo_log = lo_cut->validate_required_fields( lo_form_data ). - cl_abap_unit_assert=>assert_equals( - act = lo_log->size( ) - exp = 0 ). - - ENDMETHOD. - - METHOD normalize. - - DATA lo_cut TYPE REF TO zcl_abapgit_html_form. - DATA lo_form_data TYPE REF TO zcl_abapgit_string_map. - DATA lo_normalized_act TYPE REF TO zcl_abapgit_string_map. - DATA lo_normalized_exp TYPE REF TO zcl_abapgit_string_map. - - lo_cut = zcl_abapgit_html_form=>create( ). - lo_form_data = zcl_abapgit_string_map=>create( iv_case_insensitive = abap_true ). - lo_normalized_exp = zcl_abapgit_string_map=>create( ). - - lo_cut->text( - iv_name = 'field1' - iv_label = 'Field name 1' ). - lo_cut->text( - iv_name = 'field2' - iv_upper_case = abap_true - iv_label = 'Field name 2' ). - lo_cut->text( - iv_name = 'field3' - iv_label = 'Field name 3' ). - lo_cut->checkbox( - iv_name = 'chk1' - iv_label = 'Checkbox1' ). - lo_cut->checkbox( - iv_name = 'chk2' - iv_label = 'Checkbox2' ). - lo_cut->number( - iv_name = 'num1' - iv_label = 'Number 1' ). - lo_cut->table( - iv_name = 'tab1' - iv_label = 'Table 1' ). - lo_cut->column( iv_label = 'Column 1' ). - lo_cut->column( iv_label = 'Column 2' ). - lo_cut->number( - iv_name = |tab1-{ zcl_abapgit_html_form=>c_rows }| - iv_label = 'Number of Rows' ). " simulate hidden form field - - lo_form_data->set( - iv_key = 'field1' - iv_val = 'val1' ). - lo_form_data->set( - iv_key = 'field2' - iv_val = 'val2' ). - " Intentionally field3 is not specificed - lo_form_data->set( - iv_key = 'chk1' - iv_val = '' ). - lo_form_data->set( - iv_key = 'chk2' - iv_val = 'on' ). - lo_form_data->set( - iv_key = 'chk3' - iv_val = 'on' ). " Extra field - filtered by normalizing - - lo_form_data->set( - iv_key = 'num1' - iv_val = ' 1234' ). - - " Table with 2 rows, 2 columns - lo_form_data->set( - iv_key = |tab1-{ zcl_abapgit_html_form=>c_rows }| - iv_val = '2' ). - lo_form_data->set( - iv_key = |tab1-1-1| - iv_val = 'abc' ). - lo_form_data->set( - iv_key = |tab1-1-2| - iv_val = '123' ). - lo_form_data->set( - iv_key = |tab1-2-1| - iv_val = '' ). - lo_form_data->set( - iv_key = |tab1-2-2| - iv_val = '0' ). - - lo_normalized_exp->set( - iv_key = 'field1' - iv_val = 'val1' ). - lo_normalized_exp->set( - iv_key = 'field2' - iv_val = 'VAL2' ). - lo_normalized_exp->set( - iv_key = 'field3' - iv_val = '' ). " But it is present in normalized - lo_normalized_exp->set( - iv_key = 'chk1' - iv_val = ` ` ). " hmmm - lo_normalized_exp->set( - iv_key = 'chk2' - iv_val = 'X' ). - lo_normalized_exp->set( - iv_key = 'chk2' - iv_val = 'X' ). - - lo_normalized_exp->set( - iv_key = 'num1' - iv_val = '1234' ). - - lo_normalized_exp->set( - iv_key = |tab1-{ zcl_abapgit_html_form=>c_rows }| - iv_val = '2' ). - lo_normalized_exp->set( - iv_key = |tab1-1-1| - iv_val = 'abc' ). - lo_normalized_exp->set( - iv_key = |tab1-1-2| - iv_val = '123' ). - lo_normalized_exp->set( - iv_key = |tab1-2-1| - iv_val = '' ). - lo_normalized_exp->set( - iv_key = |tab1-2-2| - iv_val = '0' ). - - lo_normalized_act = lo_cut->normalize_form_data( lo_form_data ). - cl_abap_unit_assert=>assert_equals( - act = lo_normalized_act->mt_entries - exp = lo_normalized_exp->mt_entries ). - - ENDMETHOD. - - METHOD is_empty. - - DATA lo_cut TYPE REF TO zcl_abapgit_html_form. - DATA lo_form_data TYPE REF TO zcl_abapgit_string_map. - - lo_cut = zcl_abapgit_html_form=>create( ). - lo_form_data = zcl_abapgit_string_map=>create( ). - - lo_cut->text( - iv_name = 'field1' - iv_label = 'Field name 1' ). - lo_cut->checkbox( - iv_name = 'chk1' - iv_label = 'Checkbox1' ). - lo_cut->number( - iv_name = 'num1' - iv_label = 'Number 1' ). - lo_cut->table( - iv_name = 'tab1' - iv_label = 'Table 1' ). - lo_cut->column( iv_label = 'Column 1' ). - lo_cut->column( iv_label = 'Column 2' ). - lo_cut->number( - iv_name = |tab1-{ zcl_abapgit_html_form=>c_rows }| - iv_label = 'Number of Rows' ). " simulate hidden form field - - cl_abap_unit_assert=>assert_equals( - act = lo_cut->is_empty( lo_form_data ) - exp = abap_true ). - - lo_form_data->set( - iv_key = 'field1' - iv_val = 'val1' ). - - cl_abap_unit_assert=>assert_equals( - act = lo_cut->is_empty( lo_form_data ) - exp = abap_false ). - - lo_form_data = zcl_abapgit_string_map=>create( ). - lo_form_data->set( - iv_key = 'chk1' - iv_val = 'X' ). - - cl_abap_unit_assert=>assert_equals( - act = lo_cut->is_empty( lo_form_data ) - exp = abap_false ). - - lo_form_data = zcl_abapgit_string_map=>create( ). - lo_form_data->set( - iv_key = 'num1' - iv_val = '123' ). - - cl_abap_unit_assert=>assert_equals( - act = lo_cut->is_empty( lo_form_data ) - exp = abap_false ). - - lo_form_data = zcl_abapgit_string_map=>create( ). - lo_form_data->set( - iv_key = 'num1' - iv_val = '0' ). - - cl_abap_unit_assert=>assert_equals( - act = lo_cut->is_empty( lo_form_data ) - exp = abap_true ). - - lo_form_data = zcl_abapgit_string_map=>create( ). - lo_form_data->set( - iv_key = |tab1-{ zcl_abapgit_html_form=>c_rows }| - iv_val = '2' ). - lo_form_data->set( - iv_key = |tab1-1-1| - iv_val = '' ). - lo_form_data->set( - iv_key = |tab1-1-2| - iv_val = '' ). - lo_form_data->set( - iv_key = |tab1-2-1| - iv_val = '' ). - lo_form_data->set( - iv_key = |tab1-2-2| - iv_val = 'Hello' ). - - cl_abap_unit_assert=>assert_equals( - act = lo_cut->is_empty( lo_form_data ) - exp = abap_false ). - - ENDMETHOD. - -ENDCLASS. diff --git a/src/ui/zcl_abapgit_html_form.clas.xml b/src/ui/zcl_abapgit_html_form.clas.xml index 2d3568b2d..ea9149da7 100644 --- a/src/ui/zcl_abapgit_html_form.clas.xml +++ b/src/ui/zcl_abapgit_html_form.clas.xml @@ -5,12 +5,11 @@ ZCL_ABAPGIT_HTML_FORM E - abapgit - HTML form component + abapGit - HTML Form Component 1 X X X - X diff --git a/src/ui/zcl_abapgit_html_form_utils.clas.abap b/src/ui/zcl_abapgit_html_form_utils.clas.abap new file mode 100644 index 000000000..2ab1bdc7b --- /dev/null +++ b/src/ui/zcl_abapgit_html_form_utils.clas.abap @@ -0,0 +1,284 @@ +CLASS zcl_abapgit_html_form_utils DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS constructor + IMPORTING + !io_form TYPE REF TO zcl_abapgit_html_form . + CLASS-METHODS create + IMPORTING + !io_form TYPE REF TO zcl_abapgit_html_form + RETURNING + VALUE(ro_form_util) TYPE REF TO zcl_abapgit_html_form_utils . + METHODS normalize + IMPORTING + !io_form_data TYPE REF TO zcl_abapgit_string_map + RETURNING + VALUE(ro_form_data) TYPE REF TO zcl_abapgit_string_map + RAISING + zcx_abapgit_exception . + METHODS validate + IMPORTING + !io_form_data TYPE REF TO zcl_abapgit_string_map + RETURNING + VALUE(ro_validation_log) TYPE REF TO zcl_abapgit_string_map + RAISING + zcx_abapgit_exception . + METHODS is_empty + IMPORTING + !io_form_data TYPE REF TO zcl_abapgit_string_map + RETURNING + VALUE(rv_empty) TYPE abap_bool + RAISING + zcx_abapgit_exception . + METHODS set_data + IMPORTING + !io_form_data TYPE REF TO zcl_abapgit_string_map . + METHODS exit + IMPORTING + !io_form_data TYPE REF TO zcl_abapgit_string_map + RETURNING + VALUE(rv_state) TYPE i + RAISING + zcx_abapgit_exception . + PROTECTED SECTION. + PRIVATE SECTION. + + DATA mo_form TYPE REF TO zcl_abapgit_html_form . + DATA mo_form_data TYPE REF TO zcl_abapgit_string_map . + + METHODS is_dirty + IMPORTING + !io_form_data TYPE REF TO zcl_abapgit_string_map + RETURNING + VALUE(rv_dirty) TYPE abap_bool . +ENDCLASS. + + + +CLASS zcl_abapgit_html_form_utils IMPLEMENTATION. + + + METHOD constructor. + mo_form = io_form. + ENDMETHOD. + + + METHOD create. + CREATE OBJECT ro_form_util + EXPORTING + io_form = io_form. + ENDMETHOD. + + + METHOD exit. + + DATA lv_answer TYPE c LENGTH 1. + + IF is_dirty( io_form_data ) = abap_true. + lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm( + iv_titlebar = 'abapGit - Unsaved Changes' + iv_text_question = 'There are unsaved changes. Do you want to exit the form?' + iv_default_button = '2' ). + + IF lv_answer = '1'. + rv_state = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark. + ELSE. + rv_state = zcl_abapgit_gui=>c_event_state-no_more_act. + ENDIF. + ELSE. + rv_state = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark. + ENDIF. + + ENDMETHOD. + + + METHOD is_dirty. + rv_dirty = boolc( io_form_data->mt_entries <> mo_form_data->mt_entries ). + ENDMETHOD. + + + METHOD is_empty. + + DATA: + lt_fields TYPE zif_abapgit_html_form=>ty_fields, + lv_value TYPE string, + lv_rows TYPE i, + lv_row TYPE i. + + FIELD-SYMBOLS LIKE LINE OF lt_fields. + + rv_empty = abap_true. + lt_fields = mo_form->get_fields( ). + LOOP AT lt_fields ASSIGNING WHERE type <> zif_abapgit_html_form=>c_field_type-field_group. + lv_value = condense( + val = io_form_data->get( -name ) + del = ` ` ). + + IF -type = zif_abapgit_html_form=>c_field_type-number. + rv_empty = boolc( lv_value IS INITIAL OR lv_value = '0' ). + ELSEIF -type = zif_abapgit_html_form=>c_field_type-table. + lv_rows = io_form_data->get( |{ -name }-{ zif_abapgit_html_form=>c_rows }| ). + DO lv_rows TIMES. + lv_row = sy-index. + DO lines( -subitems ) TIMES. + lv_value = io_form_data->get( |{ -name }-{ lv_row }-{ sy-index }| ). + rv_empty = boolc( lv_value IS INITIAL ). + IF rv_empty <> abap_true. + RETURN. + ENDIF. + ENDDO. + ENDDO. + ELSEIF -type = zif_abapgit_html_form=>c_field_type-textarea. + REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_crlf IN lv_value WITH ''. + REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_newline IN lv_value WITH ''. + rv_empty = boolc( lv_value IS INITIAL ). + ELSE. + rv_empty = boolc( lv_value IS INITIAL ). + ENDIF. + + IF rv_empty <> abap_true. + RETURN. + ENDIF. + ENDLOOP. + + ENDMETHOD. + + + METHOD normalize. + + DATA: + lt_fields TYPE zif_abapgit_html_form=>ty_fields, + lv_value TYPE string, + lv_rows TYPE i, + lv_row TYPE i, + lv_len TYPE i. + + FIELD-SYMBOLS LIKE LINE OF lt_fields. + + CREATE OBJECT ro_form_data. + + IF io_form_data->is_empty( ) = abap_true. + RETURN. + ENDIF. + + lt_fields = mo_form->get_fields( ). + LOOP AT lt_fields ASSIGNING WHERE type <> zif_abapgit_html_form=>c_field_type-field_group. + CLEAR lv_value. + lv_value = io_form_data->get( -name ). + + IF -type = zif_abapgit_html_form=>c_field_type-checkbox. + ro_form_data->set( + iv_key = -name + iv_val = boolc( lv_value = 'on' ) ). + ELSEIF -type = zif_abapgit_html_form=>c_field_type-text AND -upper_case = abap_true. + ro_form_data->set( + iv_key = -name + iv_val = to_upper( lv_value ) ). + ELSEIF -type = zif_abapgit_html_form=>c_field_type-number. + " Numeric value is checked in validation + ro_form_data->set( + iv_key = -name + iv_val = condense( val = lv_value del = ` ` ) ). + ELSEIF -type = zif_abapgit_html_form=>c_field_type-table. + lv_rows = io_form_data->get( |{ -name }-{ zif_abapgit_html_form=>c_rows }| ). + DO lv_rows TIMES. + lv_row = sy-index. + DO lines( -subitems ) TIMES. + lv_value = io_form_data->get( |{ -name }-{ lv_row }-{ sy-index }| ). + ro_form_data->set( + iv_key = |{ -name }-{ lv_row }-{ sy-index }| + iv_val = lv_value ). + ENDDO. + ENDDO. + ro_form_data->set( + iv_key = |{ -name }-{ zif_abapgit_html_form=>c_rows }| + iv_val = |{ lv_rows }| ). + ELSEIF -type = zif_abapgit_html_form=>c_field_type-textarea. + REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_crlf IN lv_value + WITH zif_abapgit_definitions=>c_newline. + + " Remove last line if empty (ie 2x newline) + lv_len = strlen( lv_value ) - 2. + IF lv_len >= 0 AND lv_value+lv_len(1) = zif_abapgit_definitions=>c_newline. + lv_len = lv_len + 1. + lv_value = lv_value(lv_len). + ENDIF. + + ro_form_data->set( + iv_key = -name + iv_val = lv_value ). + ELSE. + ro_form_data->set( + iv_key = -name + iv_val = lv_value ). + ENDIF. + + ENDLOOP. + + ENDMETHOD. + + + METHOD set_data. + mo_form_data = io_form_data. + ENDMETHOD. + + + METHOD validate. + + DATA: + lt_fields TYPE zif_abapgit_html_form=>ty_fields, + lv_value TYPE string, + lv_number TYPE i. + + FIELD-SYMBOLS LIKE LINE OF lt_fields. + + CREATE OBJECT ro_validation_log. + + lt_fields = mo_form->get_fields( ). + LOOP AT lt_fields ASSIGNING . + lv_value = io_form_data->get( -name ). + IF -required IS NOT INITIAL AND lv_value IS INITIAL. + ro_validation_log->set( + iv_key = -name + iv_val = |{ -label } cannot be empty| ). + ENDIF. + CASE -type. + WHEN zif_abapgit_html_form=>c_field_type-text. + IF -min <> cl_abap_math=>min_int4 AND strlen( lv_value ) < -min. + ro_validation_log->set( + iv_key = -name + iv_val = |{ -label } must not be shorter than { -min } characters| ). + ENDIF. + IF -max <> cl_abap_math=>max_int4 AND strlen( lv_value ) > -max. + ro_validation_log->set( + iv_key = -name + iv_val = |{ -label } must not be longer than { -max } characters| ). + ENDIF. + WHEN zif_abapgit_html_form=>c_field_type-number. + TRY. + lv_number = lv_value. + CATCH cx_root. + ro_validation_log->set( + iv_key = -name + iv_val = |{ -label } is not numeric| ). + CONTINUE. + ENDTRY. + IF -min <> cl_abap_math=>min_int4 AND lv_number < -min. + ro_validation_log->set( + iv_key = -name + iv_val = |{ -label } must not be lower than { -min }| ). + ENDIF. + IF -max <> cl_abap_math=>max_int4 AND lv_number > -max. + ro_validation_log->set( + iv_key = -name + iv_val = |{ -label } must not be higher than { -max }| ). + ENDIF. + ENDCASE. + ENDLOOP. + + ENDMETHOD. +ENDCLASS. diff --git a/src/ui/zcl_abapgit_html_form_utils.clas.testclasses.abap b/src/ui/zcl_abapgit_html_form_utils.clas.testclasses.abap new file mode 100644 index 000000000..719fad737 --- /dev/null +++ b/src/ui/zcl_abapgit_html_form_utils.clas.testclasses.abap @@ -0,0 +1,636 @@ +CLASS ltcl_popups_mock DEFINITION FINAL FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PUBLIC SECTION. + TYPES: + ty_user_decision TYPE string. + + CONSTANTS: + BEGIN OF c_user_decision, + cancel TYPE ty_user_decision VALUE 'cancel', + confirm TYPE ty_user_decision VALUE 'confirm', + END OF c_user_decision. + + INTERFACES: + zif_abapgit_popups. + + METHODS: + was_confirm_popup_shown + RETURNING + VALUE(rv_popup_shown) TYPE abap_bool, + + set_user_decision + IMPORTING + iv_user_decision TYPE ty_user_decision. + + PRIVATE SECTION. + DATA: + BEGIN OF ms_called, + popup_to_confirm TYPE abap_bool, + END OF ms_called, + mv_user_decision TYPE ty_user_decision, + mv_package TYPE devclass. + +ENDCLASS. + +CLASS ltcl_popups_mock IMPLEMENTATION. + + METHOD zif_abapgit_popups~branch_list_popup. + ENDMETHOD. + + METHOD zif_abapgit_popups~branch_popup_callback. + ENDMETHOD. + + METHOD zif_abapgit_popups~choose_pr_popup. + ENDMETHOD. + + METHOD zif_abapgit_popups~create_branch_popup. + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_folder_logic. + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_object. + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_package_export. + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_perf_test_parameters. + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_proxy_bypass. + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_search_help. + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_to_confirm. + + ms_called-popup_to_confirm = abap_true. + + CASE mv_user_decision. + WHEN c_user_decision-cancel. + rv_answer = 'A'. + WHEN c_user_decision-confirm. + rv_answer = '1'. + WHEN OTHERS. + cl_abap_unit_assert=>fail( ). + ENDCASE. + + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_to_create_package. + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_to_create_transp_branch. + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_to_inform. + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_to_select_from_list. + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_to_select_transports. + ENDMETHOD. + + METHOD zif_abapgit_popups~popup_transport_request. + ENDMETHOD. + + METHOD zif_abapgit_popups~repo_popup. + ENDMETHOD. + + METHOD was_confirm_popup_shown. + rv_popup_shown = ms_called-popup_to_confirm. + ENDMETHOD. + + METHOD set_user_decision. + mv_user_decision = iv_user_decision. + ENDMETHOD. + +ENDCLASS. + +CLASS ltcl_test_form DEFINITION + FOR TESTING + RISK LEVEL HARMLESS + DURATION SHORT + FINAL. + + PRIVATE SECTION. + DATA: + mo_popups_mock TYPE REF TO ltcl_popups_mock. + + METHODS setup. + METHODS validate FOR TESTING RAISING zcx_abapgit_exception. + METHODS normalize FOR TESTING RAISING zcx_abapgit_exception. + METHODS is_empty FOR TESTING RAISING zcx_abapgit_exception. + METHODS exit_clean FOR TESTING RAISING zcx_abapgit_exception. + METHODS exit_dirty_confirm FOR TESTING RAISING zcx_abapgit_exception. + METHODS exit_dirty_cancel FOR TESTING RAISING zcx_abapgit_exception. + +ENDCLASS. + +CLASS ltcl_test_form IMPLEMENTATION. + + METHOD setup. + + CREATE OBJECT mo_popups_mock TYPE ltcl_popups_mock. + zcl_abapgit_ui_injector=>set_popups( mo_popups_mock ). + + ENDMETHOD. + + METHOD validate. + + DATA lo_cut TYPE REF TO zcl_abapgit_html_form_utils. + DATA lo_form TYPE REF TO zcl_abapgit_html_form. + DATA lo_form_data TYPE REF TO zcl_abapgit_string_map. + DATA lo_log TYPE REF TO zcl_abapgit_string_map. + + lo_form = zcl_abapgit_html_form=>create( ). + lo_form_data = zcl_abapgit_string_map=>create( ). + + lo_form->text( + iv_name = 'field1' + iv_required = abap_true + iv_label = 'Field name 1' + )->text( + iv_name = 'field2' + iv_label = 'Field name 2' ). + + lo_cut = zcl_abapgit_html_form_utils=>create( lo_form ). + + lo_log = lo_cut->validate( lo_form_data ). + + cl_abap_unit_assert=>assert_equals( + act = lo_log->size( ) + exp = 1 ). + cl_abap_unit_assert=>assert_char_cp( + act = lo_log->get( 'field1' ) + exp = '*cannot be empty' ). + + lo_form_data->set( + iv_key = 'field1' + iv_val = '' ). + + lo_log = lo_cut->validate( lo_form_data ). + + cl_abap_unit_assert=>assert_equals( + act = lo_log->size( ) + exp = 1 ). + cl_abap_unit_assert=>assert_char_cp( + act = lo_log->get( 'field1' ) + exp = '*cannot be empty' ). + + lo_form_data->set( + iv_key = 'field1' + iv_val = 'xyz' ). + + lo_log = lo_cut->validate( lo_form_data ). + + cl_abap_unit_assert=>assert_equals( + act = lo_log->size( ) + exp = 0 ). + + " New form + lo_form = zcl_abapgit_html_form=>create( ). + + lo_form->text( + iv_name = 'field3' + iv_min = 3 + iv_max = 10 + iv_label = 'Field name 3' ). + + lo_cut = zcl_abapgit_html_form_utils=>create( lo_form ). + + lo_form_data->set( + iv_key = 'field3' + iv_val = 'xy' ). + + lo_log = lo_cut->validate( lo_form_data ). + + cl_abap_unit_assert=>assert_equals( + act = lo_log->size( ) + exp = 1 ). + cl_abap_unit_assert=>assert_char_cp( + act = lo_log->get( 'field3' ) + exp = '*must not be shorter*' ). + + lo_form_data->set( + iv_key = 'field3' + iv_val = '01234567890123' ). + + lo_log = lo_cut->validate( lo_form_data ). + + cl_abap_unit_assert=>assert_equals( + act = lo_log->size( ) + exp = 1 ). + cl_abap_unit_assert=>assert_char_cp( + act = lo_log->get( 'field3' ) + exp = '*must not be longer*' ). + + lo_form_data->set( + iv_key = 'field3' + iv_val = 'xyz!' ). + + lo_log = lo_cut->validate( lo_form_data ). + + cl_abap_unit_assert=>assert_equals( + act = lo_log->size( ) + exp = 0 ). + + " New form + lo_form = zcl_abapgit_html_form=>create( ). + + lo_form->number( + iv_name = 'field4' + iv_min = 100 + iv_max = 200 + iv_label = 'Field name 4' ). + + lo_cut = zcl_abapgit_html_form_utils=>create( lo_form ). + + lo_form_data->set( + iv_key = 'field4' + iv_val = '123-456' ). + + lo_log = lo_cut->validate( lo_form_data ). + + cl_abap_unit_assert=>assert_equals( + act = lo_log->size( ) + exp = 1 ). + cl_abap_unit_assert=>assert_char_cp( + act = lo_log->get( 'field4' ) + exp = '*is not numeric*' ). + + lo_form_data->set( + iv_key = 'field4' + iv_val = '50' ). + + lo_log = lo_cut->validate( lo_form_data ). + + cl_abap_unit_assert=>assert_equals( + act = lo_log->size( ) + exp = 1 ). + cl_abap_unit_assert=>assert_char_cp( + act = lo_log->get( 'field4' ) + exp = '*must not be lower*' ). + + lo_form_data->set( + iv_key = 'field4' + iv_val = '250' ). + + lo_log = lo_cut->validate( lo_form_data ). + + cl_abap_unit_assert=>assert_equals( + act = lo_log->size( ) + exp = 1 ). + cl_abap_unit_assert=>assert_char_cp( + act = lo_log->get( 'field4' ) + exp = '*must not be higher*' ). + + lo_form_data->set( + iv_key = 'field4' + iv_val = '150' ). + + lo_log = lo_cut->validate( lo_form_data ). + + cl_abap_unit_assert=>assert_equals( + act = lo_log->size( ) + exp = 0 ). + + ENDMETHOD. + + METHOD normalize. + + DATA lo_cut TYPE REF TO zcl_abapgit_html_form_utils. + DATA lo_form TYPE REF TO zcl_abapgit_html_form. + DATA lo_form_data TYPE REF TO zcl_abapgit_string_map. + DATA lo_normalized_act TYPE REF TO zcl_abapgit_string_map. + DATA lo_normalized_exp TYPE REF TO zcl_abapgit_string_map. + + lo_form = zcl_abapgit_html_form=>create( ). + lo_form_data = zcl_abapgit_string_map=>create( iv_case_insensitive = abap_true ). + lo_normalized_exp = zcl_abapgit_string_map=>create( ). + + lo_form->text( + iv_name = 'field1' + iv_label = 'Field name 1' + )->text( + iv_name = 'field2' + iv_upper_case = abap_true + iv_label = 'Field name 2' + )->text( + iv_name = 'field3' + iv_label = 'Field name 3' + )->checkbox( + iv_name = 'chk1' + iv_label = 'Checkbox1' + )->checkbox( + iv_name = 'chk2' + iv_label = 'Checkbox2' + )->number( + iv_name = 'num1' + iv_label = 'Number 1' + )->table( + iv_name = 'tab1' + iv_label = 'Table 1' + )->column( 'Column 1' + )->column( 'Column 2' + )->number( + iv_name = |tab1-{ zif_abapgit_html_form=>c_rows }| + iv_label = 'Number of Rows' ). " simulate hidden form field + + lo_cut = zcl_abapgit_html_form_utils=>create( lo_form ). + + lo_form_data->set( + iv_key = 'field1' + iv_val = 'val1' ). + lo_form_data->set( + iv_key = 'field2' + iv_val = 'val2' ). + " Intentionally field3 is not specificed + lo_form_data->set( + iv_key = 'chk1' + iv_val = '' ). + lo_form_data->set( + iv_key = 'chk2' + iv_val = 'on' ). + lo_form_data->set( + iv_key = 'chk3' + iv_val = 'on' ). " Extra field - filtered by normalizing + + lo_form_data->set( + iv_key = 'num1' + iv_val = ' 1234' ). + + " Table with 2 rows, 2 columns + lo_form_data->set( + iv_key = |tab1-{ zif_abapgit_html_form=>c_rows }| + iv_val = '2' ). + lo_form_data->set( + iv_key = |tab1-1-1| + iv_val = 'abc' ). + lo_form_data->set( + iv_key = |tab1-1-2| + iv_val = '123' ). + lo_form_data->set( + iv_key = |tab1-2-1| + iv_val = '' ). + lo_form_data->set( + iv_key = |tab1-2-2| + iv_val = '0' ). + + lo_normalized_exp->set( + iv_key = 'field1' + iv_val = 'val1' ). + lo_normalized_exp->set( + iv_key = 'field2' + iv_val = 'VAL2' ). + lo_normalized_exp->set( + iv_key = 'field3' + iv_val = '' ). " But it is present in normalized + lo_normalized_exp->set( + iv_key = 'chk1' + iv_val = ` ` ). " hmmm + lo_normalized_exp->set( + iv_key = 'chk2' + iv_val = 'X' ). + lo_normalized_exp->set( + iv_key = 'chk2' + iv_val = 'X' ). + + lo_normalized_exp->set( + iv_key = 'num1' + iv_val = '1234' ). + + lo_normalized_exp->set( + iv_key = |tab1-{ zif_abapgit_html_form=>c_rows }| + iv_val = '2' ). + lo_normalized_exp->set( + iv_key = |tab1-1-1| + iv_val = 'abc' ). + lo_normalized_exp->set( + iv_key = |tab1-1-2| + iv_val = '123' ). + lo_normalized_exp->set( + iv_key = |tab1-2-1| + iv_val = '' ). + lo_normalized_exp->set( + iv_key = |tab1-2-2| + iv_val = '0' ). + + lo_normalized_act = lo_cut->normalize( lo_form_data ). + + cl_abap_unit_assert=>assert_equals( + act = lo_normalized_act->mt_entries + exp = lo_normalized_exp->mt_entries ). + + ENDMETHOD. + + METHOD is_empty. + + DATA lo_cut TYPE REF TO zcl_abapgit_html_form_utils. + DATA lo_form TYPE REF TO zcl_abapgit_html_form. + DATA lo_form_data TYPE REF TO zcl_abapgit_string_map. + + lo_form = zcl_abapgit_html_form=>create( ). + lo_form_data = zcl_abapgit_string_map=>create( ). + + lo_form->text( + iv_name = 'field1' + iv_label = 'Field name 1' + )->checkbox( + iv_name = 'chk1' + iv_label = 'Checkbox1' + )->number( + iv_name = 'num1' + iv_label = 'Number 1' + )->table( + iv_name = 'tab1' + iv_label = 'Table 1' + )->column( 'Column 1' + )->column( 'Column 2' + )->number( + iv_name = |tab1-{ zif_abapgit_html_form=>c_rows }| + iv_label = 'Number of Rows' ). " simulate hidden form field + + lo_cut = zcl_abapgit_html_form_utils=>create( lo_form ). + + cl_abap_unit_assert=>assert_equals( + act = lo_cut->is_empty( lo_form_data ) + exp = abap_true ). + + lo_form_data->set( + iv_key = 'field1' + iv_val = 'val1' ). + + cl_abap_unit_assert=>assert_equals( + act = lo_cut->is_empty( lo_form_data ) + exp = abap_false ). + + lo_form_data = zcl_abapgit_string_map=>create( ). + lo_form_data->set( + iv_key = 'chk1' + iv_val = 'X' ). + + cl_abap_unit_assert=>assert_equals( + act = lo_cut->is_empty( lo_form_data ) + exp = abap_false ). + + lo_form_data = zcl_abapgit_string_map=>create( ). + lo_form_data->set( + iv_key = 'num1' + iv_val = '123' ). + + cl_abap_unit_assert=>assert_equals( + act = lo_cut->is_empty( lo_form_data ) + exp = abap_false ). + + lo_form_data = zcl_abapgit_string_map=>create( ). + lo_form_data->set( + iv_key = 'num1' + iv_val = '0' ). + + cl_abap_unit_assert=>assert_equals( + act = lo_cut->is_empty( lo_form_data ) + exp = abap_true ). + + lo_form_data = zcl_abapgit_string_map=>create( ). + lo_form_data->set( + iv_key = |tab1-{ zif_abapgit_html_form=>c_rows }| + iv_val = '2' ). + lo_form_data->set( + iv_key = |tab1-1-1| + iv_val = '' ). + lo_form_data->set( + iv_key = |tab1-1-2| + iv_val = '' ). + lo_form_data->set( + iv_key = |tab1-2-1| + iv_val = '' ). + lo_form_data->set( + iv_key = |tab1-2-2| + iv_val = 'Hello' ). + + cl_abap_unit_assert=>assert_equals( + act = lo_cut->is_empty( lo_form_data ) + exp = abap_false ). + + ENDMETHOD. + + METHOD exit_clean. + + DATA lo_cut TYPE REF TO zcl_abapgit_html_form_utils. + DATA lo_form TYPE REF TO zcl_abapgit_html_form. + DATA lo_form_orig TYPE REF TO zcl_abapgit_string_map. + DATA lo_form_data TYPE REF TO zcl_abapgit_string_map. + + lo_form = zcl_abapgit_html_form=>create( ). + lo_form_orig = zcl_abapgit_string_map=>create( ). + lo_form_data = zcl_abapgit_string_map=>create( ). + + lo_form->text( + iv_name = 'field' + iv_label = 'Field name' ). + + lo_cut = zcl_abapgit_html_form_utils=>create( lo_form ). + + " Clean form (no changes) + lo_form_orig->set( + iv_key = 'field' + iv_val = 'val' ). + + lo_cut->set_data( lo_form_orig ). + + lo_form_data->set( + iv_key = 'field' + iv_val = 'val' ). + + cl_abap_unit_assert=>assert_equals( + act = lo_cut->exit( lo_form_data ) + exp = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark ). + + cl_abap_unit_assert=>assert_equals( + act = mo_popups_mock->was_confirm_popup_shown( ) + exp = abap_false ). + + ENDMETHOD. + + METHOD exit_dirty_confirm. + + DATA lo_cut TYPE REF TO zcl_abapgit_html_form_utils. + DATA lo_form TYPE REF TO zcl_abapgit_html_form. + DATA lo_form_orig TYPE REF TO zcl_abapgit_string_map. + DATA lo_form_data TYPE REF TO zcl_abapgit_string_map. + + lo_form = zcl_abapgit_html_form=>create( ). + lo_form_orig = zcl_abapgit_string_map=>create( ). + lo_form_data = zcl_abapgit_string_map=>create( ). + + lo_form->text( + iv_name = 'field' + iv_label = 'Field name' ). + + lo_cut = zcl_abapgit_html_form_utils=>create( lo_form ). + + " Dirty form (changed field value) + lo_form_orig = zcl_abapgit_string_map=>create( ). + + lo_cut->set_data( lo_form_orig ). + + lo_form_data->set( + iv_key = 'field' + iv_val = 'val' ). + + mo_popups_mock->set_user_decision( ltcl_popups_mock=>c_user_decision-confirm ). + + cl_abap_unit_assert=>assert_equals( + act = lo_cut->exit( lo_form_data ) + exp = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark ). + + cl_abap_unit_assert=>assert_equals( + act = mo_popups_mock->was_confirm_popup_shown( ) + exp = abap_true ). + + ENDMETHOD. + + METHOD exit_dirty_cancel. + + DATA lo_cut TYPE REF TO zcl_abapgit_html_form_utils. + DATA lo_form TYPE REF TO zcl_abapgit_html_form. + DATA lo_form_orig TYPE REF TO zcl_abapgit_string_map. + DATA lo_form_data TYPE REF TO zcl_abapgit_string_map. + + lo_form = zcl_abapgit_html_form=>create( ). + lo_form_orig = zcl_abapgit_string_map=>create( ). + lo_form_data = zcl_abapgit_string_map=>create( ). + + lo_form->text( + iv_name = 'field' + iv_label = 'Field name' ). + + lo_cut = zcl_abapgit_html_form_utils=>create( lo_form ). + + " Dirty form (changed field value) + lo_form_orig = zcl_abapgit_string_map=>create( ). + + lo_cut->set_data( lo_form_orig ). + + lo_form_data->set( + iv_key = 'field' + iv_val = 'val' ). + + mo_popups_mock->set_user_decision( ltcl_popups_mock=>c_user_decision-cancel ). + + cl_abap_unit_assert=>assert_equals( + act = lo_cut->exit( lo_form_data ) + exp = zcl_abapgit_gui=>c_event_state-no_more_act ). + + cl_abap_unit_assert=>assert_equals( + act = mo_popups_mock->was_confirm_popup_shown( ) + exp = abap_true ). + + ENDMETHOD. +ENDCLASS. diff --git a/src/ui/zcl_abapgit_html_form_utils.clas.xml b/src/ui/zcl_abapgit_html_form_utils.clas.xml new file mode 100644 index 000000000..032a095ca --- /dev/null +++ b/src/ui/zcl_abapgit_html_form_utils.clas.xml @@ -0,0 +1,17 @@ + + + + + + ZCL_ABAPGIT_HTML_FORM_UTILS + E + abapgit - HTML form component + 1 + X + X + X + X + + + + diff --git a/src/ui/zif_abapgit_html_form.intf.abap b/src/ui/zif_abapgit_html_form.intf.abap new file mode 100644 index 000000000..faf271ca6 --- /dev/null +++ b/src/ui/zif_abapgit_html_form.intf.abap @@ -0,0 +1,63 @@ +INTERFACE zif_abapgit_html_form + PUBLIC . + + TYPES: + BEGIN OF ty_subitem, + label TYPE string, + value TYPE string, + readonly TYPE abap_bool, + END OF ty_subitem . + TYPES: + ty_subitems TYPE STANDARD TABLE OF ty_subitem WITH DEFAULT KEY . + TYPES: + BEGIN OF ty_field, + type TYPE i, + name TYPE string, + label TYPE string, + hint TYPE string, + dblclick TYPE string, + placeholder TYPE string, + required TYPE string, + upper_case TYPE abap_bool, + item_class TYPE string, + error TYPE string, + default_value TYPE string, + side_action TYPE string, + subitems TYPE ty_subitems, + readonly TYPE abap_bool, + password TYPE abap_bool, + min TYPE i, + max TYPE i, + END OF ty_field . + TYPES: + ty_fields TYPE STANDARD TABLE OF ty_field + WITH DEFAULT KEY + WITH UNIQUE SORTED KEY by_name COMPONENTS name . + TYPES: + BEGIN OF ty_command, + label TYPE string, + action TYPE string, + cmd_type TYPE i, + END OF ty_command . + + CONSTANTS c_rows TYPE string VALUE 'rows'. + CONSTANTS: + BEGIN OF c_cmd_type, + input TYPE i VALUE 1, + input_main TYPE i VALUE 2, + link TYPE i VALUE 3, + button TYPE i VALUE 4, + END OF c_cmd_type . + CONSTANTS: + BEGIN OF c_field_type, + text TYPE i VALUE 1, + radio TYPE i VALUE 2, + checkbox TYPE i VALUE 3, + field_group TYPE i VALUE 4, + number TYPE i VALUE 5, + textarea TYPE i VALUE 6, + table TYPE i VALUE 7, + hidden TYPE i VALUE 8, + END OF c_field_type . + +ENDINTERFACE. diff --git a/src/ui/zif_abapgit_html_form.intf.xml b/src/ui/zif_abapgit_html_form.intf.xml new file mode 100644 index 000000000..18efc2a1e --- /dev/null +++ b/src/ui/zif_abapgit_html_form.intf.xml @@ -0,0 +1,15 @@ + + + + + + ZIF_ABAPGIT_HTML_FORM + E + abapGit - HTML Form + 2 + 1 + X + + + +