abapGit/src/ui/zcl_abapgit_gui_page_sett_bckg.clas.abap
2021-05-01 09:51:05 +02:00

352 lines
9.2 KiB
ABAP

CLASS zcl_abapgit_gui_page_sett_bckg DEFINITION
PUBLIC
INHERITING FROM zcl_abapgit_gui_component
FINAL
CREATE PRIVATE .
PUBLIC SECTION.
INTERFACES zif_abapgit_gui_event_handler .
INTERFACES zif_abapgit_gui_renderable .
CLASS-METHODS create
IMPORTING
!io_repo TYPE REF TO zcl_abapgit_repo
RETURNING
VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
RAISING
zcx_abapgit_exception .
METHODS constructor
IMPORTING
!io_repo TYPE REF TO zcl_abapgit_repo
RAISING
zcx_abapgit_exception .
PROTECTED SECTION.
PRIVATE SECTION.
CONSTANTS:
BEGIN OF c_id,
mode_selection TYPE string VALUE 'mode_selection',
method TYPE string VALUE 'method',
authentication TYPE string VALUE 'authentication',
username TYPE string VALUE 'username',
password TYPE string VALUE 'password',
mode_settings TYPE string VALUE 'mode_settings',
settings TYPE string VALUE 'settings',
END OF c_id .
CONSTANTS:
BEGIN OF c_event,
go_back TYPE string VALUE 'go_back',
run_now TYPE string VALUE 'run_now',
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_repo TYPE REF TO zcl_abapgit_repo .
DATA mv_settings_count TYPE i .
METHODS get_form_schema
RETURNING
VALUE(ro_form) TYPE REF TO zcl_abapgit_html_form
RAISING
zcx_abapgit_exception .
METHODS read_settings
RAISING
zcx_abapgit_exception .
METHODS read_persist
RETURNING
VALUE(rs_persist) TYPE zcl_abapgit_persist_background=>ty_background
RAISING
zcx_abapgit_exception .
METHODS save_settings
RAISING
zcx_abapgit_exception .
ENDCLASS.
CLASS zcl_abapgit_gui_page_sett_bckg IMPLEMENTATION.
METHOD constructor.
super->constructor( ).
CREATE OBJECT mo_form_data.
mo_repo = io_repo.
mo_form = get_form_schema( ).
mo_form_util = zcl_abapgit_html_form_utils=>create( mo_form ).
read_settings( ).
ENDMETHOD.
METHOD create.
DATA lo_component TYPE REF TO zcl_abapgit_gui_page_sett_bckg.
CREATE OBJECT lo_component
EXPORTING
io_repo = io_repo.
ri_page = zcl_abapgit_gui_page_hoc=>create(
iv_page_title = 'Background Mode'
io_page_menu = zcl_abapgit_gui_chunk_lib=>settings_repo_toolbar(
iv_key = io_repo->get_key( )
iv_act = zif_abapgit_definitions=>c_action-repo_background )
ii_child_component = lo_component ).
ENDMETHOD.
METHOD get_form_schema.
DATA:
lt_methods TYPE zcl_abapgit_background=>ty_methods,
ls_method LIKE LINE OF lt_methods,
lv_hint TYPE string.
lt_methods = zcl_abapgit_background=>list_methods( ).
ro_form = zcl_abapgit_html_form=>create(
iv_form_id = 'repo-background-form'
iv_help_page = 'https://docs.abapgit.org/other-background-mode.html' ).
ro_form->start_group(
iv_name = c_id-mode_selection
iv_label = 'Mode'
)->radio(
iv_name = c_id-method
iv_default_value = ''
iv_label = 'Selection'
iv_hint = 'Define the action that will be executed in background mode'
)->option(
iv_label = 'Do Nothing'
iv_value = '' ).
LOOP AT lt_methods INTO ls_method.
ro_form->option(
iv_label = ls_method-description
iv_value = ls_method-class ).
ENDLOOP.
ro_form->table(
iv_name = c_id-settings
iv_hint = 'Settings required for selected background action'
iv_label = 'Additional Settings'
)->column(
iv_label = 'Key'
iv_width = '50%'
iv_readonly = abap_true
)->column(
iv_label = 'Value'
iv_width = '50%' ).
lv_hint = 'Password will be saved in clear text!'.
ro_form->start_group(
iv_name = c_id-authentication
iv_label = 'HTTP Authentication (Optional)'
iv_hint = lv_hint
)->text(
iv_name = c_id-username
iv_label = 'Username'
iv_hint = lv_hint
)->text(
iv_name = c_id-password
iv_label = 'Password'
iv_hint = lv_hint
iv_placeholder = lv_hint ).
ro_form->command(
iv_label = 'Save Settings'
iv_cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main
iv_action = c_event-save
)->command(
iv_label = 'Run Background Logic'
iv_action = zif_abapgit_definitions=>c_action-go_background_run
)->command(
iv_label = 'Back'
iv_action = c_event-go_back ).
ENDMETHOD.
METHOD read_persist.
DATA lo_per TYPE REF TO zcl_abapgit_persist_background.
CREATE OBJECT lo_per.
TRY.
rs_persist = lo_per->get_by_key( mo_repo->get_key( ) ).
CATCH zcx_abapgit_not_found.
CLEAR rs_persist.
ENDTRY.
ENDMETHOD.
METHOD read_settings.
DATA:
ls_per TYPE zcl_abapgit_persist_background=>ty_background,
lv_row TYPE i,
lv_val TYPE string,
lt_settings LIKE ls_per-settings,
ls_settings LIKE LINE OF ls_per-settings.
ls_per = read_persist( ).
" Mode Selection
mo_form_data->set(
iv_key = c_id-method
iv_val = ls_per-method ).
" Mode Settings
IF ls_per-method IS NOT INITIAL.
lt_settings = ls_per-settings.
" skip invalid values, from old background logic
IF ls_per-method <> 'push' AND ls_per-method <> 'pull' AND ls_per-method <> 'nothing'.
CALL METHOD (ls_per-method)=>zif_abapgit_background~get_settings
CHANGING
ct_settings = lt_settings.
ENDIF.
LOOP AT lt_settings INTO ls_settings.
lv_row = lv_row + 1.
DO 3 TIMES.
CASE sy-index.
WHEN 1.
lv_val = ls_settings-key.
WHEN 2.
lv_val = ls_settings-value.
ENDCASE.
mo_form_data->set(
iv_key = |{ c_id-settings }-{ lv_row }-{ sy-index }|
iv_val = lv_val ).
ENDDO.
ENDLOOP.
ENDIF.
mv_settings_count = lv_row.
mo_form_data->set(
iv_key = |{ c_id-settings }-{ zif_abapgit_html_form=>c_rows }|
iv_val = |{ mv_settings_count }| ).
" Authentication
mo_form_data->set(
iv_key = c_id-username
iv_val = ls_per-username ).
mo_form_data->set(
iv_key = c_id-password
iv_val = ls_per-password ).
" Set for is_dirty check
mo_form_util->set_data( mo_form_data ).
ENDMETHOD.
METHOD save_settings.
DATA:
lo_persistence TYPE REF TO zcl_abapgit_persist_background,
ls_per TYPE zcl_abapgit_persist_background=>ty_background,
lt_settings LIKE ls_per-settings.
FIELD-SYMBOLS:
<ls_settings> LIKE LINE OF ls_per-settings.
ls_per-key = mo_repo->get_key( ).
" Mode Selection
ls_per-method = mo_form_data->get( c_id-method ).
" Mode Settings
IF ls_per-method IS NOT INITIAL.
lt_settings = ls_per-settings.
" skip invalid values, from old background logic
IF ls_per-method <> 'push' AND ls_per-method <> 'pull' AND ls_per-method <> 'nothing'.
CALL METHOD (ls_per-method)=>zif_abapgit_background~get_settings
CHANGING
ct_settings = lt_settings.
ENDIF.
LOOP AT lt_settings ASSIGNING <ls_settings>.
<ls_settings>-value = mo_form_data->get( |{ c_id-settings }-{ sy-tabix }-2| ).
ENDLOOP.
ls_per-settings = lt_settings.
ENDIF.
" Authentication
ls_per-username = mo_form_data->get( c_id-username ).
ls_per-password = mo_form_data->get( c_id-password ).
CREATE OBJECT lo_persistence.
IF ls_per-method IS INITIAL.
lo_persistence->delete( ls_per-key ).
ELSE.
lo_persistence->modify( ls_per ).
ENDIF.
COMMIT WORK AND WAIT.
MESSAGE 'Settings succesfully saved' TYPE 'S'.
read_settings( ).
ENDMETHOD.
METHOD zif_abapgit_gui_event_handler~on_event.
mo_form_data = mo_form_util->normalize( ii_event->form_data( ) ).
CASE ii_event->mv_action.
WHEN c_event-go_back.
rs_handled-state = mo_form_util->exit( mo_form_data ).
WHEN c_event-save.
save_settings( ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
ENDCASE.
ENDMETHOD.
METHOD zif_abapgit_gui_renderable~render.
gui_services( )->register_event_handler( me ).
read_settings( ).
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
ri_html->add( `<div class="repo">` ).
ri_html->add( zcl_abapgit_gui_chunk_lib=>render_repo_top(
io_repo = mo_repo
iv_show_commit = abap_false
iv_interactive_branch = abap_true ) ).
ri_html->add( mo_form->render(
iv_form_class = 'w800px'
io_values = mo_form_data ) ).
ri_html->add( `</div>` ).
ENDMETHOD.
ENDCLASS.