Dialogs: HTML forms for repo settings (#4384)

* Dialogs: HTML forms for repo settings

This moves the repo settings to HTML forms. The settings are split into three pages:
- Repository settings (ie abapgit.xml)
- Local settings
- Infos

* Lint

* Infos > Stats

* Infos > Stats

* Infos > Stats

Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
Marc Bernard 2021-01-08 07:09:37 -05:00 committed by GitHub
parent 9f91e4f3ad
commit 2e476eb7b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 1225 additions and 11 deletions

View File

@ -109,6 +109,12 @@ CLASS zcl_abapgit_gui_chunk_lib DEFINITION
!iv_act TYPE string !iv_act TYPE string
RETURNING RETURNING
VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar . VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
CLASS-METHODS settings_repo_toolbar
IMPORTING
!iv_key TYPE zif_abapgit_persistence=>ty_repo-key
!iv_act TYPE string
RETURNING
VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
CLASS-METHODS render_branch_name CLASS-METHODS render_branch_name
IMPORTING IMPORTING
!iv_branch TYPE string OPTIONAL !iv_branch TYPE string OPTIONAL
@ -993,6 +999,26 @@ CLASS zcl_abapgit_gui_chunk_lib IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD settings_repo_toolbar.
CREATE OBJECT ro_menu EXPORTING iv_id = 'toolbar-repo-settings'.
ro_menu->add(
iv_txt = 'Repository'
iv_act = |{ zif_abapgit_definitions=>c_action-repo_settings }?key={ iv_key }|
iv_cur = boolc( iv_act = zif_abapgit_definitions=>c_action-repo_settings )
)->add(
iv_txt = 'Local'
iv_act = |{ zif_abapgit_definitions=>c_action-repo_local_settings }?key={ iv_key }|
iv_cur = boolc( iv_act = zif_abapgit_definitions=>c_action-repo_local_settings )
)->add(
iv_txt = 'Stats'
iv_act = |{ zif_abapgit_definitions=>c_action-repo_infos }?key={ iv_key }|
iv_cur = boolc( iv_act = zif_abapgit_definitions=>c_action-repo_infos ) ).
ENDMETHOD.
METHOD settings_toolbar. METHOD settings_toolbar.
CREATE OBJECT ro_menu EXPORTING iv_id = 'toolbar-settings'. CREATE OBJECT ro_menu EXPORTING iv_id = 'toolbar-settings'.

View File

@ -0,0 +1,449 @@
CLASS zcl_abapgit_gui_page_sett_info 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.
TYPES:
BEGIN OF ty_stats,
measure TYPE string,
local TYPE i,
remote TYPE i,
END OF ty_stats.
CONSTANTS:
BEGIN OF c_id,
info TYPE string VALUE 'info',
created_by TYPE string VALUE 'created_by',
created_at TYPE string VALUE 'created_at',
deserialized_by TYPE string VALUE 'deserialized_by',
deserialized_at TYPE string VALUE 'deserialized_at',
stats TYPE string VALUE 'stats',
stats_table TYPE string VALUE 'stats_table',
END OF c_id.
CONSTANTS:
BEGIN OF c_event,
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_repo TYPE REF TO zcl_abapgit_repo.
DATA mt_stats TYPE STANDARD TABLE OF ty_stats WITH KEY measure.
DATA ms_dot TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit.
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_stats
RAISING
zcx_abapgit_exception.
METHODS format_user
IMPORTING
!iv_username TYPE xubname
RETURNING
VALUE(rv_user) TYPE string.
METHODS format_timestamp
IMPORTING
!iv_timestamp TYPE timestampl
RETURNING
VALUE(rv_timestamp) TYPE string.
METHODS format_size
IMPORTING
!iv_size TYPE i
RETURNING
VALUE(rv_size) TYPE string.
ENDCLASS.
CLASS zcl_abapgit_gui_page_sett_info IMPLEMENTATION.
METHOD constructor.
super->constructor( ).
CREATE OBJECT mo_form_data.
mo_repo = io_repo.
mo_form = get_form_schema( ).
ENDMETHOD.
METHOD create.
DATA lo_component TYPE REF TO zcl_abapgit_gui_page_sett_info.
CREATE OBJECT lo_component
EXPORTING
io_repo = io_repo.
ri_page = zcl_abapgit_gui_page_hoc=>create(
iv_page_title = 'Repository Stats'
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_infos )
ii_child_component = lo_component ).
ENDMETHOD.
METHOD format_size.
DATA:
lv_size TYPE p LENGTH 16 DECIMALS 2,
lv_unit TYPE string.
IF iv_size > 1024 * 1024 * 1024.
lv_size = iv_size / 1024 / 1024 / 1024.
lv_unit = 'GB'.
ELSEIF iv_size > 1024 * 1024.
lv_size = iv_size / 1024 / 1024.
lv_unit = 'MB'.
ELSEIF iv_size > 1024.
lv_size = iv_size / 1024.
lv_unit = 'KB'.
ELSE.
lv_size = iv_size.
lv_unit = 'Bytes'.
ENDIF.
rv_size = |{ lv_size } { lv_unit }|.
ENDMETHOD.
METHOD format_timestamp.
IF iv_timestamp IS INITIAL.
rv_timestamp = 'n/a'.
RETURN.
ENDIF.
CALL FUNCTION 'CONVERSION_EXIT_TIMES_OUTPUT'
EXPORTING
input = iv_timestamp
IMPORTING
output = rv_timestamp.
ENDMETHOD.
METHOD format_user.
DATA:
ls_user_address TYPE addr3_val,
lv_title TYPE string.
IF iv_username IS INITIAL.
rv_user = 'n/a'.
RETURN.
ENDIF.
IF iv_username <> zcl_abapgit_objects_super=>c_user_unknown.
CALL FUNCTION 'SUSR_USER_ADDRESS_READ'
EXPORTING
user_name = iv_username
IMPORTING
user_address = ls_user_address
EXCEPTIONS
user_address_not_found = 1
OTHERS = 2.
IF sy-subrc = 0.
lv_title = ls_user_address-name_text.
ENDIF.
ENDIF.
rv_user = iv_username.
IF lv_title IS NOT INITIAL.
rv_user = |{ rv_user } ({ lv_title })|.
ENDIF.
ENDMETHOD.
METHOD get_form_schema.
ro_form = zcl_abapgit_html_form=>create(
iv_form_id = 'repo-infos-form'
iv_help_page = 'https://docs.abapgit.org/guide-repo-infos.html' ).
ro_form->start_group(
iv_name = c_id-info
iv_label = 'Stats'
)->text(
iv_name = c_id-created_by
iv_label = 'Created By'
iv_readonly = abap_true
)->text(
iv_name = c_id-created_at
iv_label = 'Created At'
iv_readonly = abap_true
)->text(
iv_name = c_id-deserialized_by
iv_label = 'Last Deserialized By'
iv_readonly = abap_true
)->text(
iv_name = c_id-deserialized_at
iv_label = 'Last Deserialized At'
iv_readonly = abap_true
)->table(
iv_name = c_id-stats_table
iv_label = 'Statistics'
)->column(
iv_label = 'Measure'
iv_width = '50%'
iv_readonly = abap_true
)->column(
iv_label = 'Local'
iv_width = '25%'
iv_readonly = abap_true
)->column(
iv_label = 'Remote'
iv_width = '25%'
iv_readonly = abap_true
)->command(
iv_label = 'Back'
iv_action = c_event-go_back ).
ENDMETHOD.
METHOD read_settings.
DATA:
ls_repo TYPE zif_abapgit_persistence=>ty_repo,
ls_stats TYPE ty_stats,
lv_row TYPE i,
lv_int TYPE i,
lv_val TYPE string.
" Get infos from DB
TRY.
ls_repo = zcl_abapgit_persist_factory=>get_repo( )->read( mo_repo->get_key( ) ).
CATCH zcx_abapgit_not_found.
zcx_abapgit_exception=>raise( |Repo not found, key { mo_repo->get_key( ) }| ).
ENDTRY.
read_stats( ).
" Infos
mo_form_data->set(
iv_key = c_id-created_by
iv_val = format_user( ls_repo-created_by ) ).
mo_form_data->set(
iv_key = c_id-created_at
iv_val = format_timestamp( ls_repo-created_at ) ).
mo_form_data->set(
iv_key = c_id-deserialized_by
iv_val = format_user( ls_repo-deserialized_by ) ).
mo_form_data->set(
iv_key = c_id-deserialized_at
iv_val = format_timestamp( ls_repo-deserialized_at ) ).
LOOP AT mt_stats INTO ls_stats.
lv_row = sy-tabix.
DO 3 TIMES.
CASE sy-index.
WHEN 1.
lv_val = ls_stats-measure.
WHEN 2.
lv_val = ls_stats-local.
WHEN 3.
lv_val = ls_stats-remote.
ENDCASE.
IF ls_stats-measure CS 'Size' AND sy-index BETWEEN 2 AND 3.
lv_int = lv_val.
lv_val = format_size( lv_int ).
ENDIF.
mo_form_data->set(
iv_key = |{ c_id-stats_table }-{ lv_row }-{ sy-index }|
iv_val = lv_val ).
ENDDO.
ENDLOOP.
mo_form_data->set(
iv_key = |{ c_id-stats_table }-{ zif_abapgit_html_form=>c_rows }|
iv_val = |{ lv_row }| ).
ENDMETHOD.
METHOD read_stats.
DATA:
lt_local TYPE zif_abapgit_definitions=>ty_files_item_tt,
lt_remote TYPE zif_abapgit_definitions=>ty_files_tt,
ls_item TYPE zif_abapgit_definitions=>ty_item,
lt_local_items TYPE STANDARD TABLE OF zif_abapgit_definitions=>ty_item WITH DEFAULT KEY,
lt_remote_items TYPE STANDARD TABLE OF zif_abapgit_definitions=>ty_item WITH DEFAULT KEY,
lt_results TYPE zif_abapgit_definitions=>ty_results_tt,
lv_ignored TYPE abap_bool,
lv_state TYPE c LENGTH 1,
ls_stats TYPE ty_stats.
FIELD-SYMBOLS:
<ls_local> LIKE LINE OF lt_local,
<ls_remote> LIKE LINE OF lt_remote,
<ls_result> LIKE LINE OF lt_results.
CLEAR mt_stats.
lt_local = mo_repo->get_files_local( ).
ls_stats-measure = 'Number of Files'.
ls_stats-local = lines( lt_local ).
IF mo_repo->has_remote_source( ) = abap_true.
lt_remote = mo_repo->get_files_remote( ).
ls_stats-remote = lines( lt_remote ).
ENDIF.
APPEND ls_stats TO mt_stats.
IF lt_remote IS NOT INITIAL.
ls_stats-measure = 'Number of Ignored Files'.
ls_stats-local = ls_stats-remote - ls_stats-local. " should be >= 0
ls_stats-remote = 0.
APPEND ls_stats TO mt_stats.
ENDIF.
lt_results = zcl_abapgit_file_status=>status( mo_repo ).
DO 3 TIMES.
CLEAR ls_stats.
CASE sy-index.
WHEN 1.
ls_stats-measure = 'Number of Modified Files'.
lv_state = zif_abapgit_definitions=>c_state-modified.
WHEN 2.
ls_stats-measure = 'Number of Added Files'.
lv_state = zif_abapgit_definitions=>c_state-added.
WHEN 3.
ls_stats-measure = 'Number of Deleted Files'.
lv_state = zif_abapgit_definitions=>c_state-deleted.
ENDCASE.
LOOP AT lt_results ASSIGNING <ls_result>.
IF <ls_result>-lstate = lv_state.
ls_stats-local = ls_stats-local + 1.
ENDIF.
IF <ls_result>-rstate = lv_state.
ls_stats-remote = ls_stats-remote + 1.
ENDIF.
ENDLOOP.
APPEND ls_stats TO mt_stats.
ENDDO.
CLEAR ls_stats.
ls_stats-measure = 'Size of Files'.
LOOP AT lt_local ASSIGNING <ls_local>.
ls_stats-local = ls_stats-local + xstrlen( <ls_local>-file-data ).
COLLECT <ls_local>-item INTO lt_local_items.
ENDLOOP.
IF mo_repo->has_remote_source( ) = abap_true.
LOOP AT lt_remote ASSIGNING <ls_remote>.
ls_stats-remote = ls_stats-remote + xstrlen( <ls_remote>-data ).
lv_ignored = mo_repo->get_dot_abapgit( )->is_ignored(
iv_filename = <ls_remote>-filename
iv_path = <ls_remote>-path ).
IF <ls_remote>-filename IS NOT INITIAL AND lv_ignored = abap_false.
TRY.
zcl_abapgit_file_status=>identify_object(
EXPORTING
iv_filename = <ls_remote>-filename
iv_path = <ls_remote>-path
iv_devclass = mo_repo->get_package( )
io_dot = mo_repo->get_dot_abapgit( )
IMPORTING
es_item = ls_item ).
COLLECT ls_item INTO lt_remote_items.
CATCH zcx_abapgit_exception ##NO_HANDLER.
ENDTRY.
ENDIF.
ENDLOOP.
ENDIF.
APPEND ls_stats TO mt_stats.
CLEAR ls_stats.
ls_stats-measure = 'Number of Objects'.
DELETE lt_local_items WHERE obj_type IS INITIAL OR obj_name IS INITIAL.
ls_stats-local = lines( lt_local_items ).
DELETE lt_remote_items WHERE obj_type IS INITIAL OR obj_name IS INITIAL.
ls_stats-remote = lines( lt_remote_items ).
APPEND ls_stats TO mt_stats.
ENDMETHOD.
METHOD zif_abapgit_gui_event_handler~on_event.
IF ii_event->mv_action = c_event-go_back.
rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back_to_bookmark.
ENDIF.
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( `</div>` ).
ri_html->add( mo_form->render( mo_form_data ) ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,16 @@
<?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_GUI_PAGE_SETT_INFO</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - Repository Infos</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,292 @@
CLASS zcl_abapgit_gui_page_sett_locl 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,
local TYPE string VALUE 'local',
display_name TYPE string VALUE 'display_name',
ignore_subpackages TYPE string VALUE 'ignore_subpackages',
write_protected TYPE string VALUE 'write_protected',
only_local_objects TYPE string VALUE 'only_local_objects',
serialize_master_lang_only TYPE string VALUE 'serialize_master_lang_only',
checks TYPE string VALUE 'checks',
code_inspector_check_variant TYPE string VALUE 'code_inspector_check_variant',
block_commit TYPE string VALUE 'block_commit',
END OF c_id .
CONSTANTS:
BEGIN OF c_event,
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_repo TYPE REF TO zcl_abapgit_repo .
DATA ms_settings TYPE zif_abapgit_persistence=>ty_repo-local_settings .
METHODS validate_form
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 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 save_settings
RAISING
zcx_abapgit_exception .
ENDCLASS.
CLASS zcl_abapgit_gui_page_sett_locl IMPLEMENTATION.
METHOD constructor.
super->constructor( ).
CREATE OBJECT mo_validation_log.
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_locl.
CREATE OBJECT lo_component
EXPORTING
io_repo = io_repo.
ri_page = zcl_abapgit_gui_page_hoc=>create(
iv_page_title = 'Local Settings & Checks'
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_local_settings )
ii_child_component = lo_component ).
ENDMETHOD.
METHOD get_form_schema.
ro_form = zcl_abapgit_html_form=>create(
iv_form_id = 'repo-local-settings-form'
iv_help_page = 'https://docs.abapgit.org/guide-repo-local.html' ).
ro_form->start_group(
iv_name = c_id-local
iv_label = 'Local Settings'
iv_hint = 'Settings valid for this system only'
)->text(
iv_name = c_id-display_name
iv_label = 'Display Name'
iv_hint = 'Name to show instead of original repo name (optional)'
)->checkbox(
iv_name = c_id-write_protected
iv_label = 'Write Protected'
iv_hint = 'Lock repository against changes from remote (pull)'
)->checkbox(
iv_name = c_id-ignore_subpackages
iv_label = 'Ignore Subpackages'
iv_hint = 'Syncronize root package only'
)->checkbox(
iv_name = c_id-only_local_objects
iv_label = 'Only Local Objects'
iv_hint = 'Ignore objects imported from other systems; serialize only objects created in this system'
)->checkbox(
iv_name = c_id-serialize_master_lang_only
iv_label = 'Only Serialize Main Language'
iv_hint = 'Ignore translations; serialize only main language of repository'
)->start_group(
iv_name = c_id-checks
iv_label = 'Local Checks'
iv_hint = 'Code Inspector check performed to run from menu and before commit'
)->text(
iv_name = c_id-code_inspector_check_variant
iv_label = 'Code Inspector Check Variant'
iv_hint = 'Global check variant for Code Inspector or ABAP Test Cockpit'
)->checkbox(
iv_name = c_id-block_commit
iv_label = 'Block Commit If Code Inspection Has Errors'
iv_hint = 'Prevent staging if errors of priority 1 or 2 were found during check'
)->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 = 'Back'
iv_action = c_event-go_back ).
ENDMETHOD.
METHOD read_settings.
" Get settings from DB
ms_settings = mo_repo->get_local_settings( ).
" Local Settings
mo_form_data->set(
iv_key = c_id-display_name
iv_val = ms_settings-display_name ).
mo_form_data->set(
iv_key = c_id-ignore_subpackages
iv_val = boolc( ms_settings-ignore_subpackages = abap_true ) ).
mo_form_data->set(
iv_key = c_id-serialize_master_lang_only
iv_val = boolc( ms_settings-serialize_master_lang_only = abap_true ) ).
mo_form_data->set(
iv_key = c_id-write_protected
iv_val = boolc( ms_settings-write_protected = abap_true ) ).
mo_form_data->set(
iv_key = c_id-only_local_objects
iv_val = boolc( ms_settings-only_local_objects = abap_true ) ).
mo_form_data->set(
iv_key = c_id-code_inspector_check_variant
iv_val = |{ ms_settings-code_inspector_check_variant }| ).
mo_form_data->set(
iv_key = c_id-block_commit
iv_val = boolc( ms_settings-block_commit = abap_true ) ).
" Set for is_dirty check
mo_form_util->set_data( mo_form_data ).
ENDMETHOD.
METHOD save_settings.
ms_settings-display_name = mo_form_data->get( c_id-display_name ).
ms_settings-ignore_subpackages = mo_form_data->get( c_id-ignore_subpackages ).
ms_settings-serialize_master_lang_only = mo_form_data->get( c_id-serialize_master_lang_only ).
ms_settings-write_protected = mo_form_data->get( c_id-write_protected ).
ms_settings-only_local_objects = mo_form_data->get( c_id-only_local_objects ).
ms_settings-code_inspector_check_variant = mo_form_data->get( c_id-code_inspector_check_variant ).
ms_settings-block_commit = mo_form_data->get( c_id-block_commit ).
mo_repo->set_local_settings( ms_settings ).
COMMIT WORK AND WAIT.
MESSAGE 'Settings succesfully saved' TYPE 'S'.
read_settings( ).
ENDMETHOD.
METHOD validate_form.
DATA:
lx_error TYPE REF TO zcx_abapgit_exception,
lv_check_variant TYPE sci_chkv.
ro_validation_log = mo_form_util->validate( io_form_data ).
lv_check_variant = to_upper( io_form_data->get( c_id-code_inspector_check_variant ) ).
IF lv_check_variant IS NOT INITIAL.
TRY.
zcl_abapgit_code_inspector=>validate_check_variant( lv_check_variant ).
CATCH zcx_abapgit_exception INTO lx_error.
ro_validation_log->set(
iv_key = c_id-code_inspector_check_variant
iv_val = lx_error->get_text( ) ).
ENDTRY.
ENDIF.
IF io_form_data->get( c_id-block_commit ) = abap_true AND lv_check_variant IS INITIAL.
ro_validation_log->set(
iv_key = c_id-block_commit
iv_val = |If block commit is active, a check variant has to be maintained| ).
ENDIF.
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.
" Validate form entries before saving
mo_validation_log = validate_form( mo_form_data ).
IF mo_validation_log->is_empty( ) = abap_true.
save_settings( ).
ENDIF.
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 ).
IF mo_form_util->is_empty( mo_form_data ) = abap_true.
read_settings( ).
ENDIF.
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( `</div>` ).
ri_html->add( mo_form->render(
io_values = mo_form_data
io_validation_log = mo_validation_log ) ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,16 @@
<?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_GUI_PAGE_SETT_LOCL</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - Local Settings for Repository</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,395 @@
CLASS zcl_abapgit_gui_page_sett_repo 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,
dot TYPE string VALUE 'dot',
master_language TYPE string VALUE 'master_language',
starting_folder TYPE string VALUE 'starting_folder',
folder_logic TYPE string VALUE 'folder_logic',
ignore TYPE string VALUE 'ignore',
requirements TYPE string VALUE 'requirements',
END OF c_id .
CONSTANTS:
BEGIN OF c_event,
go_back TYPE string VALUE 'go_back',
save TYPE string VALUE 'save',
END OF c_event .
CONSTANTS c_empty_rows TYPE i VALUE 2 ##NO_TEXT.
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_repo TYPE REF TO zcl_abapgit_repo .
DATA mv_requirements_count TYPE i .
METHODS validate_form
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 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 save_settings
RAISING
zcx_abapgit_exception .
ENDCLASS.
CLASS zcl_abapgit_gui_page_sett_repo IMPLEMENTATION.
METHOD constructor.
super->constructor( ).
CREATE OBJECT mo_validation_log.
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_repo.
CREATE OBJECT lo_component
EXPORTING
io_repo = io_repo.
ri_page = zcl_abapgit_gui_page_hoc=>create(
iv_page_title = 'Repository Settings'
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_settings )
ii_child_component = lo_component ).
ENDMETHOD.
METHOD get_form_schema.
ro_form = zcl_abapgit_html_form=>create(
iv_form_id = 'repo-settings-form'
iv_help_page = 'https://docs.abapgit.org/ref-dot-abapgit.html' ).
ro_form->start_group(
iv_name = c_id-dot
iv_label = 'Repository Settings (.abapgit.xml)'
iv_hint = 'Settings stored in root folder in .abapgit.xml file'
)->text(
iv_name = c_id-master_language
iv_label = 'Main Language'
iv_hint = 'Main language of repository (cannot be changed)'
iv_readonly = abap_true
)->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 repository'
)->option(
iv_label = 'Prefix'
iv_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix
)->option(
iv_label = 'Full'
iv_value = zif_abapgit_dot_abapgit=>c_folder_logic-full
)->text(
iv_name = c_id-starting_folder
iv_label = 'Starting Folder'
iv_hint = 'Root folder that defines where serialization starts'
)->textarea(
iv_name = c_id-ignore
iv_label = 'Ignore Files'
iv_hint = 'List of files in starting folder that shall not be serialized'
)->table(
iv_name = c_id-requirements
iv_label = 'Requirements'
iv_hint = 'List of software components with minimum release and patch'
)->column(
iv_label = 'Software Component'
iv_width = '40%'
)->column(
iv_label = 'Minimum Release'
iv_width = '30%'
)->column(
iv_label = 'Minimum Patch'
iv_width = '30%'
)->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 = 'Back'
iv_action = c_event-go_back ).
ENDMETHOD.
METHOD read_settings.
DATA:
ls_dot TYPE zif_abapgit_dot_abapgit=>ty_dot_abapgit,
lv_language TYPE t002t-sptxt,
lv_ignore TYPE string,
ls_requirements LIKE LINE OF ls_dot-requirements,
lv_row TYPE i,
lv_val TYPE string.
FIELD-SYMBOLS:
<lv_ignore> TYPE string.
" Get settings from DB
ls_dot = mo_repo->get_dot_abapgit( )->get_data( ).
" Repository Settings
SELECT SINGLE sptxt INTO lv_language FROM t002t
WHERE spras = sy-langu AND sprsl = ls_dot-master_language.
IF sy-subrc <> 0.
lv_language = 'Unknown language; Check your .abapgit.xml file'.
ENDIF.
mo_form_data->set(
iv_key = c_id-master_language
iv_val = |{ ls_dot-master_language } ({ lv_language })| ).
mo_form_data->set(
iv_key = c_id-folder_logic
iv_val = ls_dot-folder_logic ).
mo_form_data->set(
iv_key = c_id-starting_folder
iv_val = ls_dot-starting_folder ).
LOOP AT ls_dot-ignore ASSIGNING <lv_ignore>.
lv_ignore = lv_ignore && <lv_ignore> && zif_abapgit_definitions=>c_newline.
ENDLOOP.
IF sy-subrc <> 0.
lv_ignore = zif_abapgit_definitions=>c_newline.
ENDIF.
mo_form_data->set(
iv_key = c_id-ignore
iv_val = lv_ignore ).
LOOP AT ls_dot-requirements INTO ls_requirements.
lv_row = sy-tabix.
DO 3 TIMES.
CASE sy-index.
WHEN 1.
lv_val = ls_requirements-component.
WHEN 2.
lv_val = ls_requirements-min_release.
WHEN 3.
lv_val = ls_requirements-min_patch.
ENDCASE.
mo_form_data->set(
iv_key = |{ c_id-requirements }-{ lv_row }-{ sy-index }|
iv_val = lv_val ).
ENDDO.
ENDLOOP.
DO c_empty_rows TIMES.
lv_row = sy-index.
DO 3 TIMES.
mo_form_data->set(
iv_key = |{ c_id-requirements }-{ lv_row }-{ sy-index }|
iv_val = '' ).
ENDDO.
ENDDO.
mv_requirements_count = lv_row.
mo_form_data->set(
iv_key = |{ c_id-requirements }-{ zif_abapgit_html_form=>c_rows }|
iv_val = |{ mv_requirements_count }| ).
" Set for is_dirty check
mo_form_util->set_data( mo_form_data ).
ENDMETHOD.
METHOD save_settings.
DATA:
lo_dot TYPE REF TO zcl_abapgit_dot_abapgit,
lv_ignore TYPE string,
lt_ignore TYPE STANDARD TABLE OF string WITH DEFAULT KEY,
lv_rows TYPE i,
ls_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement,
lt_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt.
lo_dot = mo_repo->get_dot_abapgit( ).
lo_dot->set_folder_logic( mo_form_data->get( c_id-folder_logic ) ).
lo_dot->set_starting_folder( mo_form_data->get( c_id-starting_folder ) ).
" Remove all ignores
lt_ignore = lo_dot->get_data( )-ignore.
LOOP AT lt_ignore INTO lv_ignore.
lo_dot->remove_ignore( iv_path = ''
iv_filename = lv_ignore ).
ENDLOOP.
" Add newly entered ignores
lt_ignore = zcl_abapgit_convert=>split_string( mo_form_data->get( c_id-ignore ) ).
LOOP AT lt_ignore INTO lv_ignore WHERE table_line IS NOT INITIAL.
lo_dot->add_ignore( iv_path = ''
iv_filename = lv_ignore ).
ENDLOOP.
" Requirements
DO mv_requirements_count TIMES.
ls_requirements-component = to_upper( mo_form_data->get( |{ c_id-requirements }-{ sy-index }-1| ) ).
ls_requirements-min_release = mo_form_data->get( |{ c_id-requirements }-{ sy-index }-2| ).
ls_requirements-min_patch = mo_form_data->get( |{ c_id-requirements }-{ sy-index }-3| ).
APPEND ls_requirements TO lt_requirements.
ENDDO.
SORT lt_requirements BY component min_release min_patch.
DELETE lt_requirements WHERE component IS INITIAL.
DELETE ADJACENT DUPLICATES FROM lt_requirements COMPARING ALL FIELDS.
lo_dot->set_requirements( lt_requirements ).
mo_repo->set_dot_abapgit( lo_dot ).
mo_repo->refresh( ).
COMMIT WORK AND WAIT.
MESSAGE 'Settings succesfully saved' TYPE 'S'.
read_settings( ).
ENDMETHOD.
METHOD validate_form.
DATA:
lv_folder TYPE string,
lv_len TYPE i,
lv_component TYPE zif_abapgit_dot_abapgit=>ty_requirement-component,
lv_min_release TYPE zif_abapgit_dot_abapgit=>ty_requirement-min_release,
lv_min_patch TYPE zif_abapgit_dot_abapgit=>ty_requirement-min_patch.
ro_validation_log = mo_form_util->validate( io_form_data ).
lv_folder = io_form_data->get( c_id-starting_folder ).
lv_len = strlen( lv_folder ) - 1.
IF lv_len > 0 AND lv_folder(1) <> '/'.
ro_validation_log->set(
iv_key = c_id-starting_folder
iv_val = |The folder must begin with /| ).
ELSEIF lv_len > 0 AND lv_folder+lv_len(1) <> '/'.
ro_validation_log->set(
iv_key = c_id-starting_folder
iv_val = |The folder must end with /| ).
ELSEIF lv_folder CA '\'.
ro_validation_log->set(
iv_key = c_id-starting_folder
iv_val = |Use / instead of \\| ).
ENDIF.
DO mv_requirements_count TIMES.
lv_component = mo_form_data->get( |{ c_id-requirements }-{ sy-index }-1| ).
lv_min_release = mo_form_data->get( |{ c_id-requirements }-{ sy-index }-2| ).
lv_min_patch = mo_form_data->get( |{ c_id-requirements }-{ sy-index }-3| ).
IF lv_component IS INITIAL AND ( lv_min_release IS NOT INITIAL OR lv_min_patch IS NOT INITIAL ).
ro_validation_log->set(
iv_key = c_id-requirements
iv_val = |If you enter a release or patch, you must also enter a software component| ).
ELSEIF lv_component IS NOT INITIAL AND lv_min_release IS INITIAL.
ro_validation_log->set(
iv_key = c_id-requirements
iv_val = |If you enter a software component, you must also enter a minumum release| ).
ENDIF.
ENDDO.
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.
" Validate all form entries
mo_validation_log = validate_form( mo_form_data ).
IF mo_validation_log->is_empty( ) = abap_true.
save_settings( ).
ENDIF.
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 ).
IF mo_form_util->is_empty( mo_form_data ) = abap_true.
read_settings( ).
ENDIF.
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( `</div>` ).
ri_html->add( mo_form->render(
io_values = mo_form_data
io_validation_log = mo_validation_log ) ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,16 @@
<?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_GUI_PAGE_SETT_REPO</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - Repository Settings</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -141,7 +141,7 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION. CLASS zcl_abapgit_gui_router IMPLEMENTATION.
METHOD abapgit_services_actions. METHOD abapgit_services_actions.
@ -377,6 +377,7 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
CREATE OBJECT lo_code_inspector_page CREATE OBJECT lo_code_inspector_page
EXPORTING EXPORTING
io_repo = lo_repo. io_repo = lo_repo.
ri_page = lo_code_inspector_page. ri_page = lo_code_inspector_page.
ELSEIF lo_repo->get_selected_branch( ) CP zif_abapgit_definitions=>c_git_branch-tags. ELSEIF lo_repo->get_selected_branch( ) CP zif_abapgit_definitions=>c_git_branch-tags.
lv_show_create_branch_popup = abap_true. lv_show_create_branch_popup = abap_true.
@ -406,7 +407,6 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
IF lv_show_create_branch_popup = abap_true. IF lv_show_create_branch_popup = abap_true.
lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm( lv_answer = zcl_abapgit_ui_factory=>get_popups( )->popup_to_confirm(
iv_titlebar = lv_question_title iv_titlebar = lv_question_title
iv_text_question = lv_question_text iv_text_question = lv_question_text
@ -416,7 +416,7 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
iv_icon_button_2 = 'ICON_CANCEL' iv_icon_button_2 = 'ICON_CANCEL'
iv_default_button = '2' iv_default_button = '2'
iv_display_cancel_button = abap_false ). iv_display_cancel_button = abap_false ).
IF lv_answer = 1. IF lv_answer = '1'.
TRY. TRY.
zcl_abapgit_services_git=>create_branch( iv_key = lo_repo->get_key( ) ). zcl_abapgit_services_git=>create_branch( iv_key = lo_repo->get_key( ) ).
CATCH zcx_abapgit_cancel. CATCH zcx_abapgit_cancel.
@ -431,7 +431,6 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
ri_page = lo_page_repo. ri_page = lo_page_repo.
ENDIF. ENDIF.
ENDMETHOD. ENDMETHOD.
@ -655,11 +654,14 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
zcl_abapgit_services_repo=>transport_to_branch( lv_key ). zcl_abapgit_services_repo=>transport_to_branch( lv_key ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
WHEN zif_abapgit_definitions=>c_action-repo_settings. " Repo settings WHEN zif_abapgit_definitions=>c_action-repo_settings. " Repo settings
CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_repo_sett rs_handled-page = zcl_abapgit_gui_page_sett_repo=>create( lo_repo ).
EXPORTING rs_handled-state = get_state_settings( ii_event ).
io_repo = zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ). WHEN zif_abapgit_definitions=>c_action-repo_local_settings. " Local repo settings
rs_handled-page = zcl_abapgit_gui_page_sett_locl=>create( lo_repo ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page. rs_handled-state = get_state_settings( ii_event ).
WHEN zif_abapgit_definitions=>c_action-repo_infos. " Repo infos
rs_handled-page = zcl_abapgit_gui_page_sett_info=>create( lo_repo ).
rs_handled-state = get_state_settings( ii_event ).
WHEN zif_abapgit_definitions=>c_action-repo_log. " Repo log WHEN zif_abapgit_definitions=>c_action-repo_log. " Repo log
li_log = lo_repo->get_log( ). li_log = lo_repo->get_log( ).
zcl_abapgit_log_viewer=>show_log( li_log ). zcl_abapgit_log_viewer=>show_log( li_log ).

View File

@ -420,6 +420,8 @@ INTERFACE zif_abapgit_definitions
repo_refresh TYPE string VALUE 'repo_refresh', repo_refresh TYPE string VALUE 'repo_refresh',
repo_remove TYPE string VALUE 'repo_remove', repo_remove TYPE string VALUE 'repo_remove',
repo_settings TYPE string VALUE 'repo_settings', repo_settings TYPE string VALUE 'repo_settings',
repo_local_settings TYPE string VALUE 'repo_local_settings',
repo_infos TYPE string VALUE 'repo_infos',
repo_purge TYPE string VALUE 'repo_purge', repo_purge TYPE string VALUE 'repo_purge',
repo_newonline TYPE string VALUE 'repo_newonline', repo_newonline TYPE string VALUE 'repo_newonline',
repo_newoffline TYPE string VALUE 'repo_newoffline', repo_newoffline TYPE string VALUE 'repo_newoffline',