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 <larshp@hotmail.com>
This commit is contained in:
Marc Bernard 2021-01-02 09:12:09 -05:00 committed by GitHub
parent 4f95be22ad
commit 6623679e67
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 1178 additions and 731 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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
IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false.
mo_form_data->set(
iv_key = c_id-run_critical_tests
iv_val = |{ mo_settings->get_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 = |{ mo_settings->get_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
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 ).
IF mo_form_util->is_empty( mo_form_data ) = abap_true.
read_settings( ).
ENDIF.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.

View File

@ -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 ).
IF mo_form_util->is_empty( mo_form_data ) = abap_true.
read_settings( ).
ENDIF.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.

View File

@ -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 <ls_last>.
ASSERT sy-subrc = 0.
ASSERT <ls_last>-type = c_field_type-table.
ASSERT <ls_last>-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 <ls_field> LIKE LINE OF mt_fields.
rv_empty = abap_true.
LOOP AT mt_fields ASSIGNING <ls_field> WHERE type <> c_field_type-field_group.
lv_value = condense(
val = io_form_data->get( <ls_field>-name )
del = ` ` ).
IF <ls_field>-type = c_field_type-number.
rv_empty = boolc( lv_value IS INITIAL OR lv_value = '0' ).
ELSEIF <ls_field>-type = c_field_type-table.
lv_rows = io_form_data->get( |{ <ls_field>-name }-{ c_rows }| ).
DO lv_rows TIMES.
lv_row = sy-index.
DO lines( <ls_field>-subitems ) TIMES.
lv_value = io_form_data->get( |{ <ls_field>-name }-{ lv_row }-{ sy-index }| ).
rv_empty = boolc( lv_value IS INITIAL ).
IF rv_empty <> abap_true.
RETURN.
ENDIF.
ENDDO.
ENDDO.
ELSEIF <ls_field>-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 <ls_field> LIKE LINE OF mt_fields.
CREATE OBJECT ro_form_data.
LOOP AT mt_fields ASSIGNING <ls_field> WHERE type <> c_field_type-field_group.
CLEAR lv_value.
lv_value = io_form_data->get( <ls_field>-name ).
IF <ls_field>-type = c_field_type-checkbox.
ro_form_data->set(
iv_key = <ls_field>-name
iv_val = boolc( lv_value = 'on' ) ).
ELSEIF <ls_field>-type = c_field_type-text AND <ls_field>-upper_case = abap_true.
ro_form_data->set(
iv_key = <ls_field>-name
iv_val = to_upper( lv_value ) ).
ELSEIF <ls_field>-type = c_field_type-number.
" Numeric value is checked in validation
ro_form_data->set(
iv_key = <ls_field>-name
iv_val = condense( val = lv_value del = ` ` ) ).
ELSEIF <ls_field>-type = c_field_type-table.
lv_rows = io_form_data->get( |{ <ls_field>-name }-{ c_rows }| ).
DO lv_rows TIMES.
lv_row = sy-index.
DO lines( <ls_field>-subitems ) TIMES.
lv_value = io_form_data->get( |{ <ls_field>-name }-{ lv_row }-{ sy-index }| ).
ro_form_data->set(
iv_key = |{ <ls_field>-name }-{ lv_row }-{ sy-index }|
iv_val = lv_value ).
ENDDO.
ENDDO.
ro_form_data->set(
iv_key = |{ <ls_field>-name }-{ c_rows }|
iv_val = |{ lv_rows }| ).
ELSEIF <ls_field>-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 = <ls_field>-name
iv_val = lv_value ).
ELSE.
ro_form_data->set(
iv_key = <ls_field>-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 <ls_last>.
ASSERT sy-subrc = 0.
ASSERT <ls_last>-type = c_field_type-radio. " Or dropdown - TODO in future
ASSERT <ls_last>-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( |<form method="post"{ ls_form_id }>| ).
" Add hidden button that triggers main command when pressing enter
LOOP AT mt_commands ASSIGNING <ls_cmd> WHERE is_main = abap_true.
LOOP AT mt_commands ASSIGNING <ls_cmd> WHERE cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main.
ri_html->add( |<button type="submit" formaction="sapevent:{ <ls_cmd>-action
}" class="hidden-submit" aria-hidden="true" tabindex="-1"></button>| ).
EXIT.
@ -542,12 +357,12 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION.
LOOP AT mt_fields ASSIGNING <ls_field>.
AT FIRST.
IF <ls_field>-type <> c_field_type-field_group.
IF <ls_field>-type <> zif_abapgit_html_form=>c_field_type-field_group.
ri_html->add( |<ul>| ).
ENDIF.
ENDAT.
IF <ls_field>-type = c_field_type-field_group.
IF <ls_field>-type = zif_abapgit_html_form=>c_field_type-field_group.
IF lv_cur_group IS NOT INITIAL AND lv_cur_group <> <ls_field>-name.
ri_html->add( |</ul>| ).
ri_html->add( |</fieldset>| ).
@ -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( |<button type="submit" name="action" value="{
is_cmd-action }" class="action-commands">{ is_cmd-label }</button>| ).
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( |<input type="submit" value="{
is_cmd-label }"{ lv_main_submit } formaction="sapevent:{ is_cmd-action }">| ).
is_cmd-label }" formaction="sapevent:{ is_cmd-action }">| ).
WHEN zif_abapgit_html_form=>c_cmd_type-input_main.
ii_html->add( |<input type="submit" value="{
is_cmd-label }" class="main" formaction="sapevent:{ is_cmd-action }">| ).
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( |<li{ lv_item_class }>| ).
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( |</tr>| ).
ii_html->add( |</thead>| ).
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( |<tbody>| ).
DO lv_rows TIMES.
@ -871,7 +684,7 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION.
ii_html->add( |</table>| ).
" 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( |<input type="number" name="{ lv_value }" id="{
lv_value }" value="{ lv_rows }" style="display:none">| ).
@ -893,7 +706,7 @@ CLASS zcl_abapgit_html_form IMPLEMENTATION.
ii_html->add( '<div class="input-container">' ). " 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 <ls_field> LIKE LINE OF mt_fields.
CREATE OBJECT ro_validation_log.
LOOP AT mt_fields ASSIGNING <ls_field>.
lv_value = io_form_data->get( <ls_field>-name ).
IF <ls_field>-required IS NOT INITIAL AND lv_value IS INITIAL.
ro_validation_log->set(
iv_key = <ls_field>-name
iv_val = |{ <ls_field>-label } cannot be empty| ).
ENDIF.
CASE <ls_field>-type.
WHEN c_field_type-text.
IF <ls_field>-min <> cl_abap_math=>min_int4 AND strlen( lv_value ) < <ls_field>-min.
ro_validation_log->set(
iv_key = <ls_field>-name
iv_val = |{ <ls_field>-label } must not be shorter than { <ls_field>-min } characters| ).
ENDIF.
IF <ls_field>-max <> cl_abap_math=>max_int4 AND strlen( lv_value ) > <ls_field>-max.
ro_validation_log->set(
iv_key = <ls_field>-name
iv_val = |{ <ls_field>-label } must not be longer than { <ls_field>-max } characters| ).
ENDIF.
WHEN c_field_type-number.
TRY.
lv_number = lv_value.
CATCH cx_root.
ro_validation_log->set(
iv_key = <ls_field>-name
iv_val = |{ <ls_field>-label } is not numeric| ).
CONTINUE.
ENDTRY.
IF <ls_field>-min <> cl_abap_math=>min_int4 AND lv_number < <ls_field>-min.
ro_validation_log->set(
iv_key = <ls_field>-name
iv_val = |{ <ls_field>-label } must not be lower than { <ls_field>-min }| ).
ENDIF.
IF <ls_field>-max <> cl_abap_math=>max_int4 AND lv_number > <ls_field>-max.
ro_validation_log->set(
iv_key = <ls_field>-name
iv_val = |{ <ls_field>-label } must not be higher than { <ls_field>-max }| ).
ENDIF.
ENDCASE.
ENDLOOP.
ENDMETHOD.
ENDCLASS.

View File

@ -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.

View File

@ -5,12 +5,11 @@
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_HTML_FORM</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapgit - HTML form component</DESCRIPT>
<DESCRIPT>abapGit - HTML Form Component</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>

View File

@ -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 <ls_field> LIKE LINE OF lt_fields.
rv_empty = abap_true.
lt_fields = mo_form->get_fields( ).
LOOP AT lt_fields ASSIGNING <ls_field> WHERE type <> zif_abapgit_html_form=>c_field_type-field_group.
lv_value = condense(
val = io_form_data->get( <ls_field>-name )
del = ` ` ).
IF <ls_field>-type = zif_abapgit_html_form=>c_field_type-number.
rv_empty = boolc( lv_value IS INITIAL OR lv_value = '0' ).
ELSEIF <ls_field>-type = zif_abapgit_html_form=>c_field_type-table.
lv_rows = io_form_data->get( |{ <ls_field>-name }-{ zif_abapgit_html_form=>c_rows }| ).
DO lv_rows TIMES.
lv_row = sy-index.
DO lines( <ls_field>-subitems ) TIMES.
lv_value = io_form_data->get( |{ <ls_field>-name }-{ lv_row }-{ sy-index }| ).
rv_empty = boolc( lv_value IS INITIAL ).
IF rv_empty <> abap_true.
RETURN.
ENDIF.
ENDDO.
ENDDO.
ELSEIF <ls_field>-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 <ls_field> 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 <ls_field> WHERE type <> zif_abapgit_html_form=>c_field_type-field_group.
CLEAR lv_value.
lv_value = io_form_data->get( <ls_field>-name ).
IF <ls_field>-type = zif_abapgit_html_form=>c_field_type-checkbox.
ro_form_data->set(
iv_key = <ls_field>-name
iv_val = boolc( lv_value = 'on' ) ).
ELSEIF <ls_field>-type = zif_abapgit_html_form=>c_field_type-text AND <ls_field>-upper_case = abap_true.
ro_form_data->set(
iv_key = <ls_field>-name
iv_val = to_upper( lv_value ) ).
ELSEIF <ls_field>-type = zif_abapgit_html_form=>c_field_type-number.
" Numeric value is checked in validation
ro_form_data->set(
iv_key = <ls_field>-name
iv_val = condense( val = lv_value del = ` ` ) ).
ELSEIF <ls_field>-type = zif_abapgit_html_form=>c_field_type-table.
lv_rows = io_form_data->get( |{ <ls_field>-name }-{ zif_abapgit_html_form=>c_rows }| ).
DO lv_rows TIMES.
lv_row = sy-index.
DO lines( <ls_field>-subitems ) TIMES.
lv_value = io_form_data->get( |{ <ls_field>-name }-{ lv_row }-{ sy-index }| ).
ro_form_data->set(
iv_key = |{ <ls_field>-name }-{ lv_row }-{ sy-index }|
iv_val = lv_value ).
ENDDO.
ENDDO.
ro_form_data->set(
iv_key = |{ <ls_field>-name }-{ zif_abapgit_html_form=>c_rows }|
iv_val = |{ lv_rows }| ).
ELSEIF <ls_field>-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 = <ls_field>-name
iv_val = lv_value ).
ELSE.
ro_form_data->set(
iv_key = <ls_field>-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 <ls_field> LIKE LINE OF lt_fields.
CREATE OBJECT ro_validation_log.
lt_fields = mo_form->get_fields( ).
LOOP AT lt_fields ASSIGNING <ls_field>.
lv_value = io_form_data->get( <ls_field>-name ).
IF <ls_field>-required IS NOT INITIAL AND lv_value IS INITIAL.
ro_validation_log->set(
iv_key = <ls_field>-name
iv_val = |{ <ls_field>-label } cannot be empty| ).
ENDIF.
CASE <ls_field>-type.
WHEN zif_abapgit_html_form=>c_field_type-text.
IF <ls_field>-min <> cl_abap_math=>min_int4 AND strlen( lv_value ) < <ls_field>-min.
ro_validation_log->set(
iv_key = <ls_field>-name
iv_val = |{ <ls_field>-label } must not be shorter than { <ls_field>-min } characters| ).
ENDIF.
IF <ls_field>-max <> cl_abap_math=>max_int4 AND strlen( lv_value ) > <ls_field>-max.
ro_validation_log->set(
iv_key = <ls_field>-name
iv_val = |{ <ls_field>-label } must not be longer than { <ls_field>-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 = <ls_field>-name
iv_val = |{ <ls_field>-label } is not numeric| ).
CONTINUE.
ENDTRY.
IF <ls_field>-min <> cl_abap_math=>min_int4 AND lv_number < <ls_field>-min.
ro_validation_log->set(
iv_key = <ls_field>-name
iv_val = |{ <ls_field>-label } must not be lower than { <ls_field>-min }| ).
ENDIF.
IF <ls_field>-max <> cl_abap_math=>max_int4 AND lv_number > <ls_field>-max.
ro_validation_log->set(
iv_key = <ls_field>-name
iv_val = |{ <ls_field>-label } must not be higher than { <ls_field>-max }| ).
ENDIF.
ENDCASE.
ENDLOOP.
ENDMETHOD.
ENDCLASS.

View File

@ -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.

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_HTML_FORM_UTILS</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapgit - HTML form component</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -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.

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_INTF" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOINTERF>
<CLSNAME>ZIF_ABAPGIT_HTML_FORM</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - HTML Form</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<UNICODE>X</UNICODE>
</VSEOINTERF>
</asx:values>
</asx:abap>
</abapGit>