From 1d1d046d398c141f9edb0746f2f01c59fb03d617 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sun, 3 Jan 2021 04:55:24 +0100 Subject: [PATCH] data: use ajson for serialization (#4363) * data: use ajson for serialization * config to_json * implement from_json * fix * move method build_table_itab to new class * start deserialize * update * scaffolding * add page * upd * fix warning * update * rename variable * upd * update * reorder --- src/data/zcl_abapgit_data_config.clas.abap | 69 +++++- ..._abapgit_data_config.clas.testclasses.abap | 80 +++++++ src/data/zcl_abapgit_data_config.clas.xml | 1 + .../zcl_abapgit_data_deserializer.clas.abap | 60 +++++ ...it_data_deserializer.clas.testclasses.abap | 32 +++ .../zcl_abapgit_data_deserializer.clas.xml | 3 +- src/data/zcl_abapgit_data_factory.clas.xml | 2 +- src/data/zcl_abapgit_data_injector.clas.xml | 2 +- .../zcl_abapgit_data_serializer.clas.abap | 55 ++--- src/data/zcl_abapgit_data_utils.clas.abap | 45 ++++ src/data/zcl_abapgit_data_utils.clas.xml | 16 ++ src/data/zif_abapgit_data_config.intf.abap | 6 +- .../zif_abapgit_data_deserializer.intf.abap | 21 +- src/ui/zcl_abapgit_gui_page_data.clas.abap | 225 ++++++++++++++++++ src/ui/zcl_abapgit_gui_page_data.clas.xml | 16 ++ .../zcl_abapgit_gui_page_repo_view.clas.abap | 51 ++-- 16 files changed, 616 insertions(+), 68 deletions(-) create mode 100644 src/data/zcl_abapgit_data_config.clas.testclasses.abap create mode 100644 src/data/zcl_abapgit_data_deserializer.clas.testclasses.abap create mode 100644 src/data/zcl_abapgit_data_utils.clas.abap create mode 100644 src/data/zcl_abapgit_data_utils.clas.xml create mode 100644 src/ui/zcl_abapgit_gui_page_data.clas.abap create mode 100644 src/ui/zcl_abapgit_gui_page_data.clas.xml diff --git a/src/data/zcl_abapgit_data_config.clas.abap b/src/data/zcl_abapgit_data_config.clas.abap index fab721525..e77f1793f 100644 --- a/src/data/zcl_abapgit_data_config.clas.abap +++ b/src/data/zcl_abapgit_data_config.clas.abap @@ -11,8 +11,17 @@ CLASS zcl_abapgit_data_config DEFINITION PROTECTED SECTION. PRIVATE SECTION. + CONSTANTS c_extension TYPE string VALUE '.config.json'. DATA mv_path TYPE string . DATA mt_config TYPE zif_abapgit_data_config=>ty_config_tt . + + METHODS dump + IMPORTING + !is_config TYPE zif_abapgit_data_config=>ty_config + RETURNING + VALUE(rv_json) TYPE string + RAISING + zcx_abapgit_exception . ENDCLASS. @@ -27,10 +36,31 @@ CLASS ZCL_ABAPGIT_DATA_CONFIG IMPLEMENTATION. ENDMETHOD. + METHOD dump. + + DATA lo_ajson TYPE REF TO zcl_abapgit_ajson. + DATA lv_string TYPE string. + DATA lx_ajson TYPE REF TO zcx_abapgit_ajson_error. + + + TRY. + lo_ajson = zcl_abapgit_ajson=>create_empty( ). + lo_ajson->zif_abapgit_ajson_writer~set( + iv_path = '/' + iv_val = is_config ). + rv_json = zcl_abapgit_convert=>string_to_xstring_utf8( lo_ajson->stringify( 2 ) ). + CATCH zcx_abapgit_ajson_error INTO lx_ajson. + zcx_abapgit_exception=>raise( lx_ajson->get_text( ) ). + ENDTRY. + + ENDMETHOD. + + METHOD zif_abapgit_data_config~add_config. ASSERT NOT is_config-type IS INITIAL. ASSERT NOT is_config-name IS INITIAL. + ASSERT is_config-name = to_upper( is_config-name ). INSERT is_config INTO TABLE mt_config. IF sy-subrc <> 0. @@ -41,8 +71,24 @@ CLASS ZCL_ABAPGIT_DATA_CONFIG IMPLEMENTATION. METHOD zif_abapgit_data_config~from_json. -* todo - ASSERT 0 = 1. + + DATA ls_file LIKE LINE OF it_files. + DATA ls_config TYPE zif_abapgit_data_config=>ty_config. + DATA lo_ajson TYPE REF TO zcl_abapgit_ajson. + DATA lx_ajson TYPE REF TO zcx_abapgit_ajson_error. + + CLEAR mt_config. + LOOP AT it_files INTO ls_file WHERE path = mv_path AND filename CP |*{ c_extension }|. + TRY. + lo_ajson = zcl_abapgit_ajson=>parse( zcl_abapgit_convert=>xstring_to_string_utf8( ls_file-data ) ). + lo_ajson->zif_abapgit_ajson_reader~to_abap( IMPORTING ev_container = ls_config ). + CATCH zcx_abapgit_ajson_error INTO lx_ajson. + zcx_abapgit_exception=>raise( lx_ajson->get_text( ) ). + ENDTRY. + + zif_abapgit_data_config~add_config( ls_config ). + ENDLOOP. + ENDMETHOD. @@ -60,7 +106,9 @@ CLASS ZCL_ABAPGIT_DATA_CONFIG IMPLEMENTATION. METHOD zif_abapgit_data_config~remove_config. -* todo, give exception if it does not exist + ASSERT NOT is_config-type IS INITIAL. + ASSERT NOT is_config-name IS INITIAL. + ASSERT is_config-name = to_upper( is_config-name ). DELETE mt_config WHERE name = is_config-name AND type = is_config-type. IF sy-subrc <> 0. @@ -80,8 +128,19 @@ CLASS ZCL_ABAPGIT_DATA_CONFIG IMPLEMENTATION. METHOD zif_abapgit_data_config~to_json. -* todo - ASSERT 0 = 1. + + DATA ls_config LIKE LINE OF mt_config. + DATA ls_file LIKE LINE OF rt_files. + + ls_file-path = mv_path. + + LOOP AT mt_config INTO ls_config. + ls_file-filename = to_lower( |{ ls_config-name }{ c_extension }| ). + ls_file-data = dump( ls_config ). + ls_file-sha1 = zcl_abapgit_hash=>sha1_blob( ls_file-data ). + APPEND ls_file TO rt_files. + ENDLOOP. + ENDMETHOD. diff --git a/src/data/zcl_abapgit_data_config.clas.testclasses.abap b/src/data/zcl_abapgit_data_config.clas.testclasses.abap new file mode 100644 index 000000000..ef356e564 --- /dev/null +++ b/src/data/zcl_abapgit_data_config.clas.testclasses.abap @@ -0,0 +1,80 @@ +CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL. + + PRIVATE SECTION. + DATA mv_json TYPE string. + DATA ms_config TYPE zif_abapgit_data_config=>ty_config. + + METHODS setup. + METHODS to_json FOR TESTING RAISING cx_static_check. + METHODS from_json + IMPORTING it_files TYPE zif_abapgit_definitions=>ty_files_tt + RAISING cx_static_check. + +ENDCLASS. + + +CLASS ltcl_test IMPLEMENTATION. + + METHOD setup. + + mv_json = |\{\n| && + | "name": "DUMMY",\n| && + | "type": "TABU",\n| && + | "where": [\n| && + | "DUMMY"\n| && + | ]\n| && + |\}|. + + ms_config-type = zif_abapgit_data_config=>c_data_type-tabu. + ms_config-name = 'DUMMY'. + APPEND 'DUMMY' TO ms_config-where. + + ENDMETHOD. + + METHOD to_json. + + DATA li_config TYPE REF TO zif_abapgit_data_config. + DATA lt_files TYPE zif_abapgit_definitions=>ty_files_tt. + DATA ls_file LIKE LINE OF lt_files. + DATA lv_json TYPE string. + + + CREATE OBJECT li_config TYPE zcl_abapgit_data_config. + li_config->add_config( ms_config ). + + lt_files = li_config->to_json( ). + + cl_abap_unit_assert=>assert_equals( + act = lines( lt_files ) + exp = 1 ). + + READ TABLE lt_files INDEX 1 INTO ls_file. + cl_abap_unit_assert=>assert_subrc( ). + + cl_abap_unit_assert=>assert_not_initial( ls_file-data ). + + lv_json = zcl_abapgit_convert=>xstring_to_string_utf8( ls_file-data ). + + cl_abap_unit_assert=>assert_equals( + act = lv_json + exp = mv_json ). + + from_json( lt_files ). + + ENDMETHOD. + + METHOD from_json. + + DATA li_config TYPE REF TO zif_abapgit_data_config. + + CREATE OBJECT li_config TYPE zcl_abapgit_data_config. + + li_config->from_json( it_files ). + + cl_abap_unit_assert=>assert_equals( + act = lines( li_config->get_configs( ) ) + exp = 1 ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/data/zcl_abapgit_data_config.clas.xml b/src/data/zcl_abapgit_data_config.clas.xml index 845ce09c4..2c37e7fb5 100644 --- a/src/data/zcl_abapgit_data_config.clas.xml +++ b/src/data/zcl_abapgit_data_config.clas.xml @@ -10,6 +10,7 @@ X X X + X diff --git a/src/data/zcl_abapgit_data_deserializer.clas.abap b/src/data/zcl_abapgit_data_deserializer.clas.abap index 54096542b..7b756f4eb 100644 --- a/src/data/zcl_abapgit_data_deserializer.clas.abap +++ b/src/data/zcl_abapgit_data_deserializer.clas.abap @@ -8,6 +8,13 @@ CLASS zcl_abapgit_data_deserializer DEFINITION INTERFACES zif_abapgit_data_deserializer . PROTECTED SECTION. PRIVATE SECTION. + + METHODS read_json + IMPORTING + !is_file TYPE zif_abapgit_definitions=>ty_file + !ir_data TYPE REF TO data + RAISING + zcx_abapgit_exception . ENDCLASS. @@ -15,8 +22,61 @@ ENDCLASS. CLASS ZCL_ABAPGIT_DATA_DESERIALIZER IMPLEMENTATION. + METHOD read_json. + + DATA lo_ajson TYPE REF TO zcl_abapgit_ajson. + DATA lx_ajson TYPE REF TO zcx_abapgit_ajson_error. + FIELD-SYMBOLS TYPE ANY TABLE. + + + ASSIGN ir_data->* TO . + + TRY. + lo_ajson = zcl_abapgit_ajson=>parse( zcl_abapgit_convert=>xstring_to_string_utf8( is_file-data ) ). + lo_ajson->zif_abapgit_ajson_reader~to_abap( IMPORTING ev_container = ). + CATCH zcx_abapgit_ajson_error INTO lx_ajson. + zcx_abapgit_exception=>raise( lx_ajson->get_text( ) ). + ENDTRY. + + ENDMETHOD. + + + METHOD zif_abapgit_data_deserializer~actualize. + +* todo, this method will update the database + + ENDMETHOD. + + METHOD zif_abapgit_data_deserializer~deserialize. + +* this method does not persist any changes to the database + + DATA lt_configs TYPE zif_abapgit_data_config=>ty_config_tt. + DATA ls_config LIKE LINE OF lt_configs. + DATA lr_data TYPE REF TO data. + DATA ls_file LIKE LINE OF it_files. + + + lt_configs = ii_config->get_configs( ). + + LOOP AT lt_configs INTO ls_config. + + lr_data = zcl_abapgit_data_utils=>build_table_itab( ls_config-name ). + + READ TABLE it_files INTO ls_file WITH KEY + path = ii_config->get_path( ) + filename = zcl_abapgit_data_utils=>build_filename( ls_config ). + IF sy-subrc = 0. + read_json( + ir_data = lr_data + is_file = ls_file ). + ENDIF. + * todo + + ENDLOOP. + ENDMETHOD. ENDCLASS. diff --git a/src/data/zcl_abapgit_data_deserializer.clas.testclasses.abap b/src/data/zcl_abapgit_data_deserializer.clas.testclasses.abap new file mode 100644 index 000000000..695d46a14 --- /dev/null +++ b/src/data/zcl_abapgit_data_deserializer.clas.testclasses.abap @@ -0,0 +1,32 @@ +CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL. + + PRIVATE SECTION. + METHODS test1 FOR TESTING RAISING cx_static_check. + +ENDCLASS. + + +CLASS ltcl_test IMPLEMENTATION. + + METHOD test1. + + DATA li_cut TYPE REF TO zif_abapgit_data_deserializer. + DATA li_config TYPE REF TO zif_abapgit_data_config. + DATA lt_files TYPE zif_abapgit_definitions=>ty_files_tt. + DATA ls_config TYPE zif_abapgit_data_config=>ty_config. + + CREATE OBJECT li_cut TYPE zcl_abapgit_data_deserializer. + CREATE OBJECT li_config TYPE zcl_abapgit_data_config. + + ls_config-type = zif_abapgit_data_config=>c_data_type-tabu. + ls_config-name = 'SFLIGHT'. + + li_config->add_config( ls_config ). + + li_cut->deserialize( + ii_config = li_config + it_files = lt_files ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/data/zcl_abapgit_data_deserializer.clas.xml b/src/data/zcl_abapgit_data_deserializer.clas.xml index 457196f85..2b0e2bf1a 100644 --- a/src/data/zcl_abapgit_data_deserializer.clas.xml +++ b/src/data/zcl_abapgit_data_deserializer.clas.xml @@ -5,11 +5,12 @@ ZCL_ABAPGIT_DATA_DESERIALIZER E - abapGit - Data deserializer + abapGit - Data Deserializer 1 X X X + X diff --git a/src/data/zcl_abapgit_data_factory.clas.xml b/src/data/zcl_abapgit_data_factory.clas.xml index 44ef2ade2..5fc175a79 100644 --- a/src/data/zcl_abapgit_data_factory.clas.xml +++ b/src/data/zcl_abapgit_data_factory.clas.xml @@ -5,7 +5,7 @@ ZCL_ABAPGIT_DATA_FACTORY E - abapGit - Data factory + abapGit - Data Factory 1 X X diff --git a/src/data/zcl_abapgit_data_injector.clas.xml b/src/data/zcl_abapgit_data_injector.clas.xml index fb600490f..4a26f50c6 100644 --- a/src/data/zcl_abapgit_data_injector.clas.xml +++ b/src/data/zcl_abapgit_data_injector.clas.xml @@ -5,7 +5,7 @@ ZCL_ABAPGIT_DATA_INJECTOR E - abapGit - Data injector + abapGit - Data Injector 1 X X diff --git a/src/data/zcl_abapgit_data_serializer.clas.abap b/src/data/zcl_abapgit_data_serializer.clas.abap index 0d68b1b82..f11d85a77 100644 --- a/src/data/zcl_abapgit_data_serializer.clas.abap +++ b/src/data/zcl_abapgit_data_serializer.clas.abap @@ -12,12 +12,9 @@ CLASS zcl_abapgit_data_serializer DEFINITION IMPORTING !ir_data TYPE REF TO data RETURNING - VALUE(rv_data) TYPE xstring . - METHODS build_table_itab - IMPORTING - !iv_name TYPE tadir-obj_name - RETURNING - VALUE(rr_data) TYPE REF TO data . + VALUE(rv_data) TYPE xstring + RAISING + zcx_abapgit_exception . METHODS read_database_table IMPORTING !iv_name TYPE tadir-obj_name @@ -32,41 +29,27 @@ ENDCLASS. CLASS ZCL_ABAPGIT_DATA_SERIALIZER IMPLEMENTATION. - METHOD build_table_itab. - - DATA lo_structure TYPE REF TO cl_abap_structdescr. - DATA lo_table TYPE REF TO cl_abap_tabledescr. - - lo_structure ?= cl_abap_structdescr=>describe_by_name( iv_name ). -* todo, also add unique key corresponding to the db table, so duplicates cannot be returned - lo_table = cl_abap_tabledescr=>create( lo_structure ). - CREATE DATA rr_data TYPE HANDLE lo_table. - - ENDMETHOD. - - METHOD dump_itab. -* quick and dirty, will be json instead - - DATA lt_data TYPE string_table. - DATA lv_str TYPE string. + DATA lo_ajson TYPE REF TO zcl_abapgit_ajson. + DATA lv_string TYPE string. + DATA lx_ajson TYPE REF TO zcx_abapgit_ajson_error. FIELD-SYMBOLS TYPE ANY TABLE. - FIELD-SYMBOLS TYPE any. ASSIGN ir_data->* TO . - LOOP AT ASSIGNING . - cl_abap_container_utilities=>fill_container_c( - EXPORTING - im_value = - IMPORTING - ex_container = lv_str ). - APPEND lv_str TO lt_data. - ENDLOOP. - rv_data = zcl_abapgit_convert=>string_to_xstring_utf8( concat_lines_of( table = lt_data - sep = |\n| ) ). + TRY. + lo_ajson = zcl_abapgit_ajson=>create_empty( ). + lo_ajson->zif_abapgit_ajson_writer~set( + iv_path = '/' + iv_val = ). + lv_string = lo_ajson->stringify( 2 ). + CATCH zcx_abapgit_ajson_error INTO lx_ajson. + zcx_abapgit_exception=>raise( lx_ajson->get_text( ) ). + ENDTRY. + + rv_data = zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ). ENDMETHOD. @@ -76,7 +59,7 @@ CLASS ZCL_ABAPGIT_DATA_SERIALIZER IMPLEMENTATION. DATA lv_where LIKE LINE OF it_where. FIELD-SYMBOLS: TYPE ANY TABLE. - rr_data = build_table_itab( iv_name ). + rr_data = zcl_abapgit_data_utils=>build_table_itab( iv_name ). ASSIGN rr_data->* TO . LOOP AT it_where INTO lv_where. @@ -108,7 +91,7 @@ CLASS ZCL_ABAPGIT_DATA_SERIALIZER IMPLEMENTATION. iv_name = ls_config-name it_where = ls_config-where ). - ls_file-filename = to_lower( |{ ls_config-name }.{ ls_config-type }.todo| ). + ls_file-filename = zcl_abapgit_data_utils=>build_filename( ls_config ). ls_file-data = dump_itab( lr_data ). ls_file-sha1 = zcl_abapgit_hash=>sha1_blob( ls_file-data ). APPEND ls_file TO rt_files. diff --git a/src/data/zcl_abapgit_data_utils.clas.abap b/src/data/zcl_abapgit_data_utils.clas.abap new file mode 100644 index 000000000..77defd8e3 --- /dev/null +++ b/src/data/zcl_abapgit_data_utils.clas.abap @@ -0,0 +1,45 @@ +CLASS zcl_abapgit_data_utils DEFINITION + PUBLIC + CREATE PUBLIC . + + PUBLIC SECTION. + CLASS-METHODS build_table_itab + IMPORTING + !iv_name TYPE tadir-obj_name + RETURNING + VALUE(rr_data) TYPE REF TO data . + + CLASS-METHODS build_filename + IMPORTING + is_config TYPE zif_abapgit_data_config=>ty_config + RETURNING + VALUE(rv_filename) TYPE string. + + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_DATA_UTILS IMPLEMENTATION. + + + METHOD build_filename. + + rv_filename = to_lower( |{ is_config-name }.{ is_config-type }.json| ). + + ENDMETHOD. + + + METHOD build_table_itab. + + DATA lo_structure TYPE REF TO cl_abap_structdescr. + DATA lo_table TYPE REF TO cl_abap_tabledescr. + + lo_structure ?= cl_abap_structdescr=>describe_by_name( iv_name ). +* todo, also add unique key corresponding to the db table, so duplicates cannot be returned + lo_table = cl_abap_tabledescr=>create( lo_structure ). + CREATE DATA rr_data TYPE HANDLE lo_table. + + ENDMETHOD. +ENDCLASS. diff --git a/src/data/zcl_abapgit_data_utils.clas.xml b/src/data/zcl_abapgit_data_utils.clas.xml new file mode 100644 index 000000000..46a8a851e --- /dev/null +++ b/src/data/zcl_abapgit_data_utils.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_DATA_UTILS + E + abapGit - Data Utils + 1 + X + X + X + + + + diff --git a/src/data/zif_abapgit_data_config.intf.abap b/src/data/zif_abapgit_data_config.intf.abap index fbc6d9f4c..0e09248a6 100644 --- a/src/data/zif_abapgit_data_config.intf.abap +++ b/src/data/zif_abapgit_data_config.intf.abap @@ -11,7 +11,7 @@ INTERFACE zif_abapgit_data_config where TYPE string_table, END OF ty_config . TYPES: - ty_config_tt TYPE SORTED TABLE OF ty_config WITH UNIQUE KEY type name. + ty_config_tt TYPE SORTED TABLE OF ty_config WITH UNIQUE KEY type name . CONSTANTS c_default_path TYPE string VALUE '/data/' ##NO_TEXT. CONSTANTS: @@ -37,7 +37,9 @@ INTERFACE zif_abapgit_data_config zcx_abapgit_exception . METHODS to_json RETURNING - VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_tt . + VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_tt + RAISING + zcx_abapgit_exception . METHODS add_config IMPORTING !is_config TYPE ty_config diff --git a/src/data/zif_abapgit_data_deserializer.intf.abap b/src/data/zif_abapgit_data_deserializer.intf.abap index 8ca8a949c..17de4579d 100644 --- a/src/data/zif_abapgit_data_deserializer.intf.abap +++ b/src/data/zif_abapgit_data_deserializer.intf.abap @@ -1,9 +1,26 @@ INTERFACE zif_abapgit_data_deserializer PUBLIC . + TYPES: BEGIN OF ty_result, + table TYPE tadir-obj_name, + deletes TYPE REF TO data, + updates TYPE REF TO data, + inserts TYPE REF TO data, + END OF ty_result. + METHODS deserialize IMPORTING - ii_config TYPE REF TO zif_abapgit_data_config - it_files TYPE zif_abapgit_definitions=>ty_files_tt. + !ii_config TYPE REF TO zif_abapgit_data_config + !it_files TYPE zif_abapgit_definitions=>ty_files_tt + RETURNING + VALUE(rs_result) TYPE ty_result + RAISING + zcx_abapgit_exception . + + METHODS actualize + IMPORTING + is_result TYPE ty_result + RAISING + zcx_abapgit_exception . ENDINTERFACE. diff --git a/src/ui/zcl_abapgit_gui_page_data.clas.abap b/src/ui/zcl_abapgit_gui_page_data.clas.abap new file mode 100644 index 000000000..4a1910c41 --- /dev/null +++ b/src/ui/zcl_abapgit_gui_page_data.clas.abap @@ -0,0 +1,225 @@ +CLASS zcl_abapgit_gui_page_data DEFINITION + PUBLIC + INHERITING FROM zcl_abapgit_gui_page + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS constructor + 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', + 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. + + METHODS render_add + RETURNING + VALUE(ri_html) TYPE REF TO zif_abapgit_html . + 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 constructor. + + super->constructor( ). + + ms_control-page_title = 'Data'. + + CREATE OBJECT mi_config TYPE zcl_abapgit_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 ) ). + SPLIT lo_map->get( c_id-where ) AT |\n| INTO TABLE ls_config-where. + + 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 ) ). + SPLIT lo_map->get( c_id-where ) AT |\n| INTO TABLE ls_config-where. + + 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( + iv_form_class = 'dialog w600px m-em5-sides margin-v1' + io_values = lo_form_data ) ). + + ENDMETHOD. + + + METHOD render_content. + + CREATE OBJECT ri_html TYPE zcl_abapgit_html. + + ri_html->add( render_add( ) ). + ri_html->add( render_existing( ) ). + + 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_cmd_type = zif_abapgit_html_form=>c_cmd_type-input_main + iv_action = c_event-remove ). + ri_html->add( lo_form->render( + iv_form_class = 'dialog w600px m-em5-sides margin-v1' + io_values = 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 ). + rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. + WHEN c_event-update. + event_update( ii_event ). + rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. + WHEN c_event-remove. + event_remove( ii_event ). + rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. + ENDCASE. + + ENDMETHOD. +ENDCLASS. diff --git a/src/ui/zcl_abapgit_gui_page_data.clas.xml b/src/ui/zcl_abapgit_gui_page_data.clas.xml new file mode 100644 index 000000000..76072f3ad --- /dev/null +++ b/src/ui/zcl_abapgit_gui_page_data.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_GUI_PAGE_DATA + E + GUI - Data + 1 + X + X + X + + + + diff --git a/src/ui/zcl_abapgit_gui_page_repo_view.clas.abap b/src/ui/zcl_abapgit_gui_page_repo_view.clas.abap index f1e7105a6..0d2b1f9b9 100644 --- a/src/ui/zcl_abapgit_gui_page_repo_view.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_repo_view.clas.abap @@ -19,6 +19,7 @@ CLASS zcl_abapgit_gui_page_repo_view DEFINITION display_more TYPE string VALUE 'display_more' ##NO_TEXT, repo_switch_origin_to_pr TYPE string VALUE 'repo_switch_origin_to_pr', repo_reset_origin TYPE string VALUE 'repo_reset_origin', + go_data TYPE string VALUE 'go_data', END OF c_actions . METHODS constructor @@ -192,7 +193,7 @@ ENDCLASS. -CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION. +CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_VIEW IMPLEMENTATION. METHOD apply_order_by. @@ -308,6 +309,10 @@ CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION. iv_act = |{ zif_abapgit_definitions=>c_action-repo_refresh_checksums }?key={ mv_key }| iv_opt = lv_crossout ). + ro_advanced_dropdown->add( iv_txt = 'Beta - Data' + iv_act = |{ c_actions-go_data }?key={ mv_key }| + iv_opt = lv_crossout ). + IF is_repo_lang_logon_lang( ) = abap_false AND get_abapgit_tcode( ) IS NOT INITIAL. ro_advanced_dropdown->add( iv_txt = 'Open in Main Language' @@ -637,6 +642,22 @@ CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION. ENDMETHOD. + METHOD get_abapgit_tcode. + CONSTANTS: lc_report_tcode_hex TYPE x VALUE '80'. + DATA: lt_tcodes TYPE STANDARD TABLE OF tcode. + + SELECT tcode + FROM tstc + INTO TABLE lt_tcodes + WHERE pgmna = sy-cprog + AND cinfo = lc_report_tcode_hex. + + IF lines( lt_tcodes ) = 1. + READ TABLE lt_tcodes INDEX 1 INTO rv_tcode. + ENDIF. + ENDMETHOD. + + METHOD get_item_class. DATA lt_class TYPE TABLE OF string. @@ -683,6 +704,11 @@ CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION. ENDMETHOD. + METHOD is_repo_lang_logon_lang. + rv_repo_lang_is_logon_lang = boolc( mo_repo->get_dot_abapgit( )->get_master_language( ) = sy-langu ). + ENDMETHOD. + + METHOD open_in_master_language. DATA: @@ -1196,6 +1222,10 @@ CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION. iv_key = |{ ii_event->query( )->get( 'KEY' ) }|. rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing. + WHEN c_actions-go_data. + CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_data. + rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing. + WHEN c_actions-toggle_hide_files. " Toggle file diplay mv_hide_files = zcl_abapgit_persistence_user=>get_instance( )->toggle_hide_files( ). rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. @@ -1318,23 +1348,4 @@ CLASS zcl_abapgit_gui_page_repo_view IMPLEMENTATION. INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions. ENDMETHOD. - - METHOD is_repo_lang_logon_lang. - rv_repo_lang_is_logon_lang = boolc( mo_repo->get_dot_abapgit( )->get_master_language( ) = sy-langu ). - ENDMETHOD. - - METHOD get_abapgit_tcode. - CONSTANTS: lc_report_tcode_hex TYPE x VALUE '80'. - DATA: lt_tcodes TYPE STANDARD TABLE OF tcode. - - SELECT tcode - FROM tstc - INTO TABLE lt_tcodes - WHERE pgmna = sy-cprog - AND cinfo = lc_report_tcode_hex. - - IF lines( lt_tcodes ) = 1. - READ TABLE lt_tcodes INDEX 1 INTO rv_tcode. - ENDIF. - ENDMETHOD. ENDCLASS.