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' ) ) ##TYPE.
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.