abapGit/src/ui/zcl_abapgit_gui_page_data.clas.abap
thorsten-wolf-neptune e58138e4f9
Fixed "Add via Transport" short keys (#5736)
* fixed "Add via Transport" short keys

* replace trobj_name with TYPE C LENTH 120

* Pretty Printer (VALUE uppercase)

* add skip

* add skip

* removed pretty printer comments

* running

* Replace with dtel

Works should SAP change the max key length

* Replace dtel 

For abaplint

Co-authored-by: Lars Hvam <larshp@hotmail.com>
Co-authored-by: Marc Bernard <59966492+mbtools@users.noreply.github.com>
2022-09-05 12:24:56 -04:00

353 lines
9.2 KiB
ABAP

CLASS zcl_abapgit_gui_page_data DEFINITION
PUBLIC
INHERITING FROM zcl_abapgit_gui_page
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
METHODS constructor
IMPORTING
!iv_key TYPE zif_abapgit_persistence=>ty_repo-key
RAISING
zcx_abapgit_exception .
METHODS zif_abapgit_gui_event_handler~on_event
REDEFINITION .
PROTECTED SECTION.
CONSTANTS:
BEGIN OF c_event,
add TYPE string VALUE 'add',
update TYPE string VALUE 'update',
remove TYPE string VALUE 'remove',
add_via_transport TYPE string VALUE 'add_via_transport',
END OF c_event .
CONSTANTS:
BEGIN OF c_id,
table TYPE string VALUE 'table',
where TYPE string VALUE 'where',
END OF c_id .
DATA mi_config TYPE REF TO zif_abapgit_data_config .
METHODS render_content
REDEFINITION .
PRIVATE SECTION.
DATA mo_repo TYPE REF TO zcl_abapgit_repo .
CLASS-METHODS concatenated_key_to_where
IMPORTING
!iv_table TYPE tabname
!iv_tabkey TYPE clike
RETURNING
VALUE(rv_where) TYPE string .
METHODS add_via_transport
RAISING
zcx_abapgit_exception .
METHODS build_menu
RETURNING
VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
METHODS build_where
IMPORTING
!io_map TYPE REF TO zcl_abapgit_string_map
RETURNING
VALUE(rt_where) TYPE string_table .
METHODS render_add
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html
RAISING
zcx_abapgit_exception .
METHODS render_existing
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html
RAISING
zcx_abapgit_exception .
METHODS event_add
IMPORTING
!ii_event TYPE REF TO zif_abapgit_gui_event
RAISING
zcx_abapgit_exception .
METHODS event_remove
IMPORTING
!ii_event TYPE REF TO zif_abapgit_gui_event
RAISING
zcx_abapgit_exception .
METHODS event_update
IMPORTING
!ii_event TYPE REF TO zif_abapgit_gui_event
RAISING
zcx_abapgit_exception .
ENDCLASS.
CLASS ZCL_ABAPGIT_GUI_PAGE_DATA IMPLEMENTATION.
METHOD add_via_transport.
DATA lt_trkorr TYPE trwbo_request_headers.
DATA ls_trkorr LIKE LINE OF lt_trkorr.
DATA ls_request TYPE trwbo_request.
DATA ls_key LIKE LINE OF ls_request-keys.
DATA lv_where TYPE string.
DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
lt_trkorr = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_transports( ).
IF lines( lt_trkorr ) <> 1.
RETURN.
ENDIF.
READ TABLE lt_trkorr INDEX 1 INTO ls_trkorr.
ASSERT sy-subrc = 0.
ls_request = zcl_abapgit_transport=>read( ls_trkorr ).
IF lines( ls_request-keys ) = 0.
zcx_abapgit_exception=>raise( |No keys found, select task| ).
ENDIF.
LOOP AT ls_request-keys INTO ls_key WHERE object = 'TABU'.
ASSERT ls_key-objname IS NOT INITIAL.
ASSERT ls_key-tabkey IS NOT INITIAL.
CLEAR ls_config.
ls_config-type = zif_abapgit_data_config=>c_data_type-tabu.
ls_config-name = to_upper( ls_key-objname ).
lv_where = concatenated_key_to_where(
iv_table = ls_key-objname
iv_tabkey = ls_key-tabkey ).
APPEND lv_where TO ls_config-where.
mi_config->add_config( ls_config ).
ENDLOOP.
ENDMETHOD.
METHOD build_menu.
CREATE OBJECT ro_menu.
ro_menu->add( iv_txt = 'Add via transport'
iv_act = c_event-add_via_transport ).
ENDMETHOD.
METHOD build_where.
DATA lv_where LIKE LINE OF rt_where.
SPLIT io_map->get( c_id-where ) AT |\n| INTO TABLE rt_where.
DELETE rt_where WHERE table_line IS INITIAL.
LOOP AT rt_where INTO lv_where.
IF strlen( lv_where ) <= 2.
DELETE rt_where INDEX sy-tabix.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD concatenated_key_to_where.
DATA lo_structdescr TYPE REF TO cl_abap_structdescr.
DATA lt_fields TYPE ddfields.
DATA ls_field LIKE LINE OF lt_fields.
DATA lv_key TYPE c LENGTH 900.
lv_key = iv_tabkey.
lo_structdescr ?= cl_abap_typedescr=>describe_by_name( iv_table ).
lt_fields = lo_structdescr->get_ddic_field_list( ).
LOOP AT lt_fields INTO ls_field WHERE keyflag = abap_true.
IF ls_field-position = '0001' AND ls_field-datatype = 'CLNT'.
lv_key = lv_key+ls_field-leng.
CONTINUE.
ENDIF.
IF lv_key = |*|.
EXIT. " current loop
ENDIF.
IF NOT rv_where IS INITIAL.
rv_where = |{ rv_where } AND |.
ENDIF.
rv_where = |{ rv_where }{ to_lower( ls_field-fieldname ) } = '{ lv_key(ls_field-leng) }'|.
lv_key = lv_key+ls_field-leng.
ENDLOOP.
ENDMETHOD.
METHOD constructor.
super->constructor( ).
ms_control-page_title = 'Data'.
ms_control-page_menu = build_menu( ).
mo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
mi_config = mo_repo->get_data_config( ).
ENDMETHOD.
METHOD event_add.
DATA lo_map TYPE REF TO zcl_abapgit_string_map.
DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
lo_map = ii_event->form_data( ).
ls_config-type = zif_abapgit_data_config=>c_data_type-tabu.
ls_config-name = to_upper( lo_map->get( c_id-table ) ).
ls_config-where = build_where( lo_map ).
mi_config->add_config( ls_config ).
ENDMETHOD.
METHOD event_remove.
DATA lo_map TYPE REF TO zcl_abapgit_string_map.
DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
lo_map = ii_event->form_data( ).
ls_config-type = zif_abapgit_data_config=>c_data_type-tabu.
ls_config-name = to_upper( lo_map->get( c_id-table ) ).
mi_config->remove_config( ls_config ).
ENDMETHOD.
METHOD event_update.
DATA lo_map TYPE REF TO zcl_abapgit_string_map.
DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
lo_map = ii_event->form_data( ).
ls_config-type = zif_abapgit_data_config=>c_data_type-tabu.
ls_config-name = to_upper( lo_map->get( c_id-table ) ).
ls_config-where = build_where( lo_map ).
mi_config->update_config( ls_config ).
ENDMETHOD.
METHOD render_add.
DATA lo_form TYPE REF TO zcl_abapgit_html_form.
DATA lo_form_data TYPE REF TO zcl_abapgit_string_map.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
CREATE OBJECT lo_form_data.
lo_form = zcl_abapgit_html_form=>create( ).
lo_form->text(
iv_label = 'Table'
iv_name = c_id-table
iv_required = abap_true ).
lo_form->textarea(
iv_label = 'Where'
iv_placeholder = 'Conditions separated by newline'
iv_name = c_id-where ).
lo_form->command(
iv_label = 'Add'
iv_cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main
iv_action = c_event-add ).
ri_html->add( lo_form->render( lo_form_data ) ).
ENDMETHOD.
METHOD render_content.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
ri_html->add( '<div class="repo">' ).
ri_html->add( render_existing( ) ).
ri_html->add( render_add( ) ).
ri_html->add( '</div>' ).
ENDMETHOD.
METHOD render_existing.
DATA lo_form TYPE REF TO zcl_abapgit_html_form.
DATA lo_form_data TYPE REF TO zcl_abapgit_string_map.
DATA lt_configs TYPE zif_abapgit_data_config=>ty_config_tt.
DATA ls_config LIKE LINE OF lt_configs.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
CREATE OBJECT lo_form_data.
lt_configs = mi_config->get_configs( ).
LOOP AT lt_configs INTO ls_config.
lo_form = zcl_abapgit_html_form=>create( ).
CREATE OBJECT lo_form_data.
lo_form_data->set(
iv_key = c_id-table
iv_val = |{ ls_config-name }| ).
lo_form->text(
iv_label = 'Table'
iv_name = c_id-table
iv_readonly = abap_true ).
lo_form_data->set(
iv_key = c_id-where
iv_val = concat_lines_of( table = ls_config-where sep = |\n| ) ).
lo_form->textarea(
iv_label = 'Where'
iv_placeholder = 'Conditions separated by newline'
iv_name = c_id-where ).
lo_form->command(
iv_label = 'Update'
iv_cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main
iv_action = c_event-update ).
lo_form->command(
iv_label = 'Remove'
iv_action = c_event-remove ).
ri_html->add( lo_form->render( lo_form_data ) ).
ENDLOOP.
ENDMETHOD.
METHOD zif_abapgit_gui_event_handler~on_event.
CASE ii_event->mv_action.
WHEN c_event-add.
event_add( ii_event ).
mo_repo->refresh( ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
WHEN c_event-update.
event_update( ii_event ).
mo_repo->refresh( ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
WHEN c_event-remove.
event_remove( ii_event ).
mo_repo->refresh( ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
WHEN c_event-add_via_transport.
add_via_transport( ).
mo_repo->refresh( ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
ENDCASE.
ENDMETHOD.
ENDCLASS.