diff --git a/package.json b/package.json index e2b23cb96..975da84ff 100644 --- a/package.json +++ b/package.json @@ -25,10 +25,10 @@ ] }, "devDependencies": { - "@abaplint/cli": "^2.91.32", - "@abaplint/database-sqlite": "^2.1.29", - "@abaplint/runtime": "^2.1.38", - "@abaplint/transpiler-cli": "^2.1.38", + "@abaplint/cli": "^2.92.0", + "@abaplint/database-sqlite": "^2.1.40", + "@abaplint/runtime": "^2.1.40", + "@abaplint/transpiler-cli": "^2.1.40", "abapmerge": "^0.14.7", "c8": "^7.12.0", "eslint": "^8.22.0" diff --git a/src/cts/zcl_abapgit_transport.clas.abap b/src/cts/zcl_abapgit_transport.clas.abap index 64b8a9955..c5c1ed21f 100644 --- a/src/cts/zcl_abapgit_transport.clas.abap +++ b/src/cts/zcl_abapgit_transport.clas.abap @@ -3,7 +3,7 @@ CLASS zcl_abapgit_transport DEFINITION CREATE PUBLIC . PUBLIC SECTION. - +* todo, add interfaces for this class, consider merging zcl_abapgit_transport_mass into this class? CLASS-METHODS zip IMPORTING !iv_show_log_popup TYPE abap_bool DEFAULT abap_true @@ -13,6 +13,7 @@ CLASS zcl_abapgit_transport DEFINITION VALUE(rv_xstr) TYPE xstring RAISING zcx_abapgit_exception . + CLASS-METHODS to_tadir IMPORTING it_transport_headers TYPE trwbo_request_headers @@ -20,11 +21,21 @@ CLASS zcl_abapgit_transport DEFINITION VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt RAISING zcx_abapgit_exception . + CLASS-METHODS add_all_objects_to_trans_req IMPORTING iv_key TYPE zif_abapgit_persistence=>ty_value RAISING zcx_abapgit_exception . + + CLASS-METHODS read + IMPORTING + !is_trkorr TYPE trwbo_request_header OPTIONAL + RETURNING + VALUE(rs_request) TYPE trwbo_request + RAISING + zcx_abapgit_exception . + PROTECTED SECTION. CLASS-METHODS read_requests @@ -223,6 +234,31 @@ CLASS ZCL_ABAPGIT_TRANSPORT IMPLEMENTATION. ENDMETHOD. + METHOD read. + + rs_request-h-trkorr = is_trkorr-trkorr. + + CALL FUNCTION 'TRINT_READ_REQUEST' + EXPORTING + iv_read_e070 = abap_true + iv_read_e07t = abap_true + iv_read_e070c = abap_true + iv_read_e070m = abap_true + iv_read_objs_keys = abap_true + iv_read_objs = abap_true + iv_read_attributes = abap_true + CHANGING + cs_request = rs_request + EXCEPTIONS + error_occured = 1 + OTHERS = 2. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + + ENDMETHOD. + + METHOD read_requests. DATA lt_requests LIKE rt_requests. FIELD-SYMBOLS LIKE LINE OF it_trkorr. diff --git a/src/data/zcl_abapgit_data_config.clas.abap b/src/data/zcl_abapgit_data_config.clas.abap index 973186ebd..1b243c30f 100644 --- a/src/data/zcl_abapgit_data_config.clas.abap +++ b/src/data/zcl_abapgit_data_config.clas.abap @@ -45,13 +45,25 @@ CLASS ZCL_ABAPGIT_DATA_CONFIG IMPLEMENTATION. METHOD zif_abapgit_data_config~add_config. + DATA lv_where TYPE string. + + FIELD-SYMBOLS LIKE LINE OF mt_config. + ASSERT is_config-type IS NOT INITIAL. ASSERT is_config-name IS NOT INITIAL. ASSERT is_config-name = to_upper( is_config-name ). INSERT is_config INTO TABLE mt_config. IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'Already in table' ). +* append to existing + READ TABLE mt_config ASSIGNING WITH KEY type = is_config-type name = is_config-name. + ASSERT sy-subrc = 0. + LOOP AT is_config-where INTO lv_where. + READ TABLE -where TRANSPORTING NO FIELDS WITH KEY table_line = lv_where. + IF sy-subrc <> 0. + INSERT lv_where INTO TABLE -where. + ENDIF. + ENDLOOP. ENDIF. ENDMETHOD. diff --git a/src/data/zcl_abapgit_data_config.clas.testclasses.abap b/src/data/zcl_abapgit_data_config.clas.testclasses.abap index ef356e564..f31085463 100644 --- a/src/data/zcl_abapgit_data_config.clas.testclasses.abap +++ b/src/data/zcl_abapgit_data_config.clas.testclasses.abap @@ -5,6 +5,7 @@ CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL. DATA ms_config TYPE zif_abapgit_data_config=>ty_config. METHODS setup. + METHODS double_add_config FOR TESTING RAISING cx_static_check. METHODS to_json FOR TESTING RAISING cx_static_check. METHODS from_json IMPORTING it_files TYPE zif_abapgit_definitions=>ty_files_tt @@ -31,6 +32,29 @@ CLASS ltcl_test IMPLEMENTATION. ENDMETHOD. + METHOD double_add_config. + + DATA li_config TYPE REF TO zif_abapgit_data_config. + DATA ls_config TYPE zif_abapgit_data_config=>ty_config. + + CREATE OBJECT li_config TYPE zcl_abapgit_data_config. + + ls_config-name = 'HELLO'. + ls_config-type = zif_abapgit_data_config=>c_data_type-tabu. + APPEND 'foo' TO ls_config-where. + + li_config->add_config( ls_config ). + + CLEAR ls_config-where. + APPEND 'bar' TO ls_config-where. + li_config->add_config( ls_config ). + + cl_abap_unit_assert=>assert_equals( + act = lines( li_config->get_configs( ) ) + exp = 1 ). + + ENDMETHOD. + METHOD to_json. DATA li_config TYPE REF TO zif_abapgit_data_config. diff --git a/src/ui/zcl_abapgit_gui_page_data.clas.abap b/src/ui/zcl_abapgit_gui_page_data.clas.abap index b91754c6a..4092e7eac 100644 --- a/src/ui/zcl_abapgit_gui_page_data.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_data.clas.abap @@ -18,9 +18,10 @@ CLASS zcl_abapgit_gui_page_data DEFINITION CONSTANTS: BEGIN OF c_event, - add TYPE string VALUE 'add', - update TYPE string VALUE 'update', - remove TYPE string VALUE 'remove', + 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: @@ -37,6 +38,18 @@ CLASS zcl_abapgit_gui_page_data DEFINITION 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 @@ -74,6 +87,57 @@ 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. @@ -91,11 +155,42 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DATA IMPLEMENTATION. 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 string. + + 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( ). @@ -179,9 +274,10 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DATA IMPLEMENTATION. METHOD render_content. CREATE OBJECT ri_html TYPE zcl_abapgit_html. - - ri_html->add( render_add( ) ). + ri_html->add( '
' ). ri_html->add( render_existing( ) ). + ri_html->add( render_add( ) ). + ri_html->add( '
' ). ENDMETHOD. @@ -236,12 +332,19 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DATA IMPLEMENTATION. 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. diff --git a/src/ui/zcl_abapgit_gui_page_data.clas.testclasses.abap b/src/ui/zcl_abapgit_gui_page_data.clas.testclasses.abap new file mode 100644 index 000000000..b2955fb91 --- /dev/null +++ b/src/ui/zcl_abapgit_gui_page_data.clas.testclasses.abap @@ -0,0 +1,27 @@ +CLASS ltcl_test DEFINITION DEFERRED. +CLASS zcl_abapgit_gui_page_data DEFINITION LOCAL FRIENDS ltcl_test. + +CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL. + + PRIVATE SECTION. + METHODS concatenated_key_to_where FOR TESTING RAISING cx_static_check. +ENDCLASS. + + +CLASS ltcl_test IMPLEMENTATION. + + METHOD concatenated_key_to_where. + + DATA lv_where TYPE string. + + lv_where = zcl_abapgit_gui_page_data=>concatenated_key_to_where( + iv_table = 'T100' + iv_tabkey = 'EABC55555555555555555001' ). + + cl_abap_unit_assert=>assert_equals( + act = lv_where + exp = |sprsl = 'E' AND arbgb = 'ABC55555555555555555' AND msgnr = '001'| ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/ui/zcl_abapgit_gui_page_data.clas.xml b/src/ui/zcl_abapgit_gui_page_data.clas.xml index 76072f3ad..a56fe6444 100644 --- a/src/ui/zcl_abapgit_gui_page_data.clas.xml +++ b/src/ui/zcl_abapgit_gui_page_data.clas.xml @@ -10,6 +10,7 @@ X X X + X