Skip to main content

HTML Forms

abapGitAbout 2 minui

This doc covers the HTML form component in abapGit UI. See also the UI - HTML pages.

General

There is a helper class to render HTML forms - zcl_abapgit_html_form. To see an example - open the online repo creation dialog (code: class zcl_abapgit_gui_page_addonline). Typical usage:

  • create the form (preferably in constructor - it is descriptive)
  • add fields one by one
  • for complex fields (radio) - add options right after the field
  • on render - pass zcl_abapgit_string_map instance of values and, optionally, a map of validation results (see below)
  • fields can be required (iv_required = abap_true)
  • fields can have tooltips (iv_hint = 'help for the field')
  • text fields may have placeholders (iv_placeholder = '...')
  • text fields may be uppercased (iv_upper_case = abap_bool - for normalization - see below)
  • text fields may have side-actions - button next to them - passing current form state to abap for additional logic and re-render
  • a form may have one or more commands at the bottom. Main ones (iv_is_main = abap_true) - will be highlighted

DATA lo_form TYPE REF TO zcl_abapgit_html_form.

lo_form = zcl_abapgit_html_form=>create( iv_form_id = 'add-repo-online-form' ).
lo_form->text(
    iv_name        = c_id-package
    iv_side_action = c_event-choose_package
    iv_required    = abap_true
    iv_label       = 'Package'
    iv_hint        = 'SAP package for the code (should be a dedicated one)'
    iv_placeholder = 'Z... / $...' ).
lo_form->radio(
    iv_name        = c_id-folder_logic
    iv_default_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
    iv_label       = 'Folder logic'
    iv_hint        = 'Define how package folders are named in the repo' ).
lo_form->option(
    iv_label       = 'Prefix'
    iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-prefix ).
lo_form->option(
    iv_label       = 'Full'
    iv_value       = zif_abapgit_dot_abapgit=>c_folder_logic-full ).
lo_form->checkbox(
    iv_name        = c_id-ignore_subpackages
    iv_label       = 'Ignore subpackages'
    iv_hint        = 'Syncronize root package only' ).

lo_form->command(
    iv_label       = 'Clone online repo'
    iv_is_main     = abap_true
    iv_action      = c_event-add_online_repo ).

ro_html->add( lo_form->render(
    iv_form_class     = 'dialog w600px m-em5-sides margin-v1'
    io_values         = mo_form_data
    io_validation_log = mo_validation_log ) ).

Values Normalization

The class has validate_normalize_form_data method as a default validator/normalizer. It accepts string_map with field key-values. And they run through them doing the following:

  • fields, missing in the form definition will raise an exception
  • text fields, marked with upper_case during definition, are converted to uppercase
  • checkbox fields, convert on value (HTML default), to abap_true
" lo_field_map:
" 'name'        = 'xxx'
" 'package'     = '$mypack'  <-- with 'iv_upper_case = true' during definition
" 'my_checkbox' = 'on'

lo_field_map = lo_form->validate_normalize_form_data( lo_field_map ).

" 'name'        = 'xxx'
" 'package'     = '$MYPACK'
" 'my_checkbox' = 'X'

Values and Validation

The class is designed so that its instance is more a declaration of the form, that can be created once and then rendered each time with different values. On render you pass a CSS class of the form, values, and optionally validation results.

Values is an instance of zcl_abapgit_string_map - key-value map, where the key must be the same as the field name (thus it's recommended to define names as constants). E.g.

lo_form->text(
    iv_name        = c_id-package " <<<<< NAME
    iv_label       = 'Package' ).
...
DATA mo_form_data TYPE REF TO zcl_abapgit_string_map.
CREATE OBJECT mo_form_data.
mo_form_data->set(
    iv_key = c_id-package
    iv_val = 'XYZ' ).             " <<<<< VALUE
...
lo_form->render(
    iv_form_class = 'dialog w600px m-em5-sides margin-v1'
    io_values     = mo_form_data ).

If a validation log is passed, then it's checked for a non-empty value of the field name, and renders it as the error message.

lo_form->text(
    iv_name        = c_id-package " <<<<< NAME
    iv_label       = 'Package' ).
...
DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map.
CREATE OBJECT mo_validation_log.
mo_form_data->set(
    iv_key = c_id-package          " <<<<< SAME NAME
    iv_val = 'OMG! It crushed!' ). " <<<<< ERROR MESSAGE
...
lo_form->render(
    iv_form_class     = 'dialog w600px m-em5-sides margin-v1'
    io_values         = mo_form_data
    io_validation_log = mo_validation_log ) ). " <<< ERRORS HERE