Refactoring of DB pages, and new UI features (#6134)

This commit is contained in:
Alexander Tsybulsky 2023-03-14 19:04:30 +02:00 committed by GitHub
parent 328f50f9fe
commit abf5bd268b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
36 changed files with 1447 additions and 742 deletions

View File

@ -71,6 +71,12 @@ CLASS zcl_abapgit_persistence_db DEFINITION
!iv_data TYPE zif_abapgit_persistence=>ty_content-data_str
RAISING
zcx_abapgit_exception .
CLASS-METHODS validate_entry_type
IMPORTING
!iv_type TYPE zif_abapgit_persistence=>ty_type
RAISING
zcx_abapgit_exception .
PROTECTED SECTION.
PRIVATE SECTION.
@ -91,13 +97,14 @@ ENDCLASS.
CLASS zcl_abapgit_persistence_db IMPLEMENTATION.
CLASS ZCL_ABAPGIT_PERSISTENCE_DB IMPLEMENTATION.
METHOD add.
DATA ls_table TYPE zif_abapgit_persistence=>ty_content.
validate_entry_type( iv_type ).
ls_table-type = iv_type.
ls_table-value = iv_value.
ls_table-data_str = iv_data.
@ -261,4 +268,19 @@ CLASS zcl_abapgit_persistence_db IMPLEMENTATION.
iv_ignore_errors = abap_false ).
ENDMETHOD.
METHOD validate_entry_type.
IF NOT (
iv_type = c_type_repo OR
iv_type = c_type_repo_csum OR
iv_type = c_type_user OR
iv_type = c_type_settings OR
iv_type = c_type_background OR
iv_type = c_type_packages ).
zcx_abapgit_exception=>raise( |Invalid DB entry type [{ iv_type }]| ).
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@ -109,7 +109,7 @@ ENDCLASS.
CLASS zcl_abapgit_gui IMPLEMENTATION.
CLASS ZCL_ABAPGIT_GUI IMPLEMENTATION.
METHOD back.
@ -506,4 +506,19 @@ CLASS zcl_abapgit_gui IMPLEMENTATION.
ASSERT ii_event_handler IS BOUND.
INSERT ii_event_handler INTO mt_event_handlers INDEX 1.
ENDMETHOD.
METHOD zif_abapgit_gui_services~register_page_asset.
" Maybe forbid registering cachable existing assets, maybe this is the right place (see also asset_man commments)
mi_asset_man->register_asset(
iv_url = iv_url
iv_type = iv_type
iv_mime_name = iv_mime_name
iv_inline = iv_inline
" This registering will happen after initialization so all cachable already cached
iv_cachable = abap_false ).
ENDMETHOD.
ENDCLASS.

View File

@ -4,26 +4,19 @@ CLASS zcl_abapgit_gui_asset_manager DEFINITION PUBLIC FINAL CREATE PUBLIC .
INTERFACES zif_abapgit_gui_asset_manager.
ALIASES:
register_asset FOR zif_abapgit_gui_asset_manager~register_asset.
PROTECTED SECTION.
PRIVATE SECTION.
TYPES:
BEGIN OF ty_asset_entry.
INCLUDE TYPE zif_abapgit_gui_asset_manager~ty_web_asset.
TYPES: mime_name TYPE wwwdatatab-objid,
END OF ty_asset_entry ,
ty_asset_register TYPE STANDARD TABLE OF ty_asset_entry WITH KEY url.
METHODS register_asset
IMPORTING
!iv_url TYPE string
!iv_type TYPE string
!iv_cachable TYPE abap_bool DEFAULT abap_true
!iv_mime_name TYPE wwwdatatab-objid OPTIONAL
!iv_base64 TYPE string OPTIONAL
!iv_inline TYPE string OPTIONAL
RAISING
zcx_abapgit_exception.
PROTECTED SECTION.
PRIVATE SECTION.
END OF ty_asset_entry.
TYPES:
ty_asset_register TYPE STANDARD TABLE OF ty_asset_entry WITH KEY url.
DATA mt_asset_register TYPE ty_asset_register.
@ -47,7 +40,7 @@ ENDCLASS.
CLASS zcl_abapgit_gui_asset_manager IMPLEMENTATION.
CLASS ZCL_ABAPGIT_GUI_ASSET_MANAGER IMPLEMENTATION.
METHOD get_mime_asset.
@ -114,25 +107,6 @@ CLASS zcl_abapgit_gui_asset_manager IMPLEMENTATION.
ENDMETHOD.
METHOD register_asset.
DATA ls_asset LIKE LINE OF mt_asset_register.
SPLIT iv_type AT '/' INTO ls_asset-type ls_asset-subtype.
ls_asset-url = iv_url.
ls_asset-mime_name = iv_mime_name.
ls_asset-is_cacheable = iv_cachable.
IF iv_base64 IS NOT INITIAL.
ls_asset-content = zcl_abapgit_convert=>base64_to_xstring( iv_base64 ).
ELSEIF iv_inline IS NOT INITIAL.
ls_asset-content = zcl_abapgit_convert=>string_to_xstring( iv_inline ).
ENDIF.
APPEND ls_asset TO mt_asset_register.
ENDMETHOD.
METHOD zif_abapgit_gui_asset_manager~get_all_assets.
FIELD-SYMBOLS <ls_a> LIKE LINE OF mt_asset_register.
@ -173,4 +147,25 @@ CLASS zcl_abapgit_gui_asset_manager IMPLEMENTATION.
rv_asset = zcl_abapgit_convert=>xstring_to_string_utf8( ls_asset-content ).
ENDMETHOD.
METHOD zif_abapgit_gui_asset_manager~register_asset.
DATA ls_asset LIKE LINE OF mt_asset_register.
SPLIT iv_type AT '/' INTO ls_asset-type ls_asset-subtype.
ls_asset-url = iv_url.
ls_asset-mime_name = iv_mime_name.
ls_asset-is_cacheable = iv_cachable.
IF iv_base64 IS NOT INITIAL.
ls_asset-content = zcl_abapgit_convert=>base64_to_xstring( iv_base64 ).
ELSEIF iv_inline IS NOT INITIAL.
ls_asset-content = zcl_abapgit_convert=>string_to_xstring( iv_inline ).
ENDIF.
DELETE mt_asset_register WHERE url = iv_url.
" TODO: Maybe forbid averwriting cachable assets as they were probably already cached ... agrueable
APPEND ls_asset TO mt_asset_register.
ENDMETHOD.
ENDCLASS.

View File

@ -10,6 +10,7 @@ CLASS ltcl_abapgit_gui_asset_manager DEFINITION
METHODS get_mime_asset FOR TESTING RAISING zcx_abapgit_exception.
METHODS get_base64_asset FOR TESTING RAISING zcx_abapgit_exception.
METHODS get_all FOR TESTING RAISING zcx_abapgit_exception.
METHODS register_and_overwrite FOR TESTING RAISING zcx_abapgit_exception.
ENDCLASS.
CLASS ltcl_abapgit_gui_asset_manager IMPLEMENTATION.
@ -124,7 +125,7 @@ CLASS ltcl_abapgit_gui_asset_manager IMPLEMENTATION.
iv_base64 = 'QEE=' ).
lo_assetman->register_asset(
iv_url = 'css/common.css'
iv_url = 'css/common2.css'
iv_type = 'text/css'
iv_inline = 'ABC' ).
@ -134,4 +135,29 @@ CLASS ltcl_abapgit_gui_asset_manager IMPLEMENTATION.
ENDMETHOD.
METHOD register_and_overwrite.
DATA lo_assetman TYPE REF TO zcl_abapgit_gui_asset_manager.
CREATE OBJECT lo_assetman.
lo_assetman->register_asset(
iv_url = 'css/common.css'
iv_type = 'text/css'
iv_inline = 'XYZ' ).
lo_assetman->register_asset(
iv_url = 'css/common.css'
iv_type = 'text/css'
iv_inline = 'ABC' ).
cl_abap_unit_assert=>assert_equals(
act = lines( lo_assetman->zif_abapgit_gui_asset_manager~get_all_assets( ) )
exp = 1 ).
cl_abap_unit_assert=>assert_equals(
act = lo_assetman->zif_abapgit_gui_asset_manager~get_text_asset( 'css/common.css' )
exp = 'ABC' ).
ENDMETHOD.
ENDCLASS.

View File

@ -31,6 +31,8 @@ CLASS ltcl_gui_mock IMPLEMENTATION.
ENDMETHOD.
METHOD zif_abapgit_gui_services~get_log.
ENDMETHOD.
METHOD zif_abapgit_gui_services~register_page_asset.
ENDMETHOD.
METHOD get_asset.
rs_asset = ms_last_cache_signature.

View File

@ -465,6 +465,7 @@ CLASS zcl_abapgit_html IMPLEMENTATION.
METHOD zif_abapgit_html~td.
zif_abapgit_html~wrap(
iv_format_single_line = iv_format_single_line
iv_tag = 'td'
iv_content = iv_content
ii_content = ii_content
@ -477,6 +478,7 @@ CLASS zcl_abapgit_html IMPLEMENTATION.
METHOD zif_abapgit_html~th.
zif_abapgit_html~wrap(
iv_format_single_line = iv_format_single_line
iv_tag = 'th'
iv_content = iv_content
ii_content = ii_content
@ -516,14 +518,18 @@ CLASS zcl_abapgit_html IMPLEMENTATION.
CLEAR lv_close_tag.
ENDIF.
zif_abapgit_html~add( lv_open_tag ).
IF ii_content IS BOUND.
zif_abapgit_html~add( ii_content ).
ELSEIF iv_content IS NOT INITIAL.
zif_abapgit_html~add( iv_content ).
ENDIF.
IF lv_close_tag IS NOT INITIAL.
zif_abapgit_html~add( `</` && iv_tag && `>` ).
IF iv_format_single_line = abap_true AND iv_content IS NOT INITIAL.
zif_abapgit_html~add( lv_open_tag && iv_content && lv_close_tag ).
ELSE.
zif_abapgit_html~add( lv_open_tag ).
IF ii_content IS BOUND.
zif_abapgit_html~add( ii_content ).
ELSEIF iv_content IS NOT INITIAL.
zif_abapgit_html~add( iv_content ).
ENDIF.
IF lv_close_tag IS NOT INITIAL.
zif_abapgit_html~add( lv_close_tag ).
ENDIF.
ENDIF.
ri_self = me.

View File

@ -125,9 +125,13 @@ CLASS ltcl_html IMPLEMENTATION.
METHOD td.
mo_html->td( 'Hello' ).
mo_html->td(
iv_format_single_line = abap_false
iv_content = 'Hello' ).
cl_abap_unit_assert=>assert_equals(
act = mo_html->render( )
exp =
'<td>Hello</td>' && cl_abap_char_utilities=>newline &&
'<td>' && cl_abap_char_utilities=>newline &&
' Hello' && cl_abap_char_utilities=>newline &&
'</td>' ).
@ -137,9 +141,13 @@ CLASS ltcl_html IMPLEMENTATION.
METHOD th.
mo_html->th( 'Hello' ).
mo_html->th(
iv_format_single_line = abap_false
iv_content = 'Hello' ).
cl_abap_unit_assert=>assert_equals(
act = mo_html->render( )
exp =
'<th>Hello</th>' && cl_abap_char_utilities=>newline &&
'<th>' && cl_abap_char_utilities=>newline &&
' Hello' && cl_abap_char_utilities=>newline &&
'</th>' ).
@ -173,6 +181,10 @@ CLASS ltcl_html IMPLEMENTATION.
iv_hint = 'hint'
iv_id = 'id'
iv_content = 'Hello' ).
mo_html->wrap(
iv_tag = 'td'
iv_content = 'Hello'
iv_format_single_line = abap_true ).
cl_abap_unit_assert=>assert_equals(
act = mo_html->render( )
@ -183,7 +195,8 @@ CLASS ltcl_html IMPLEMENTATION.
'</td>' && cl_abap_char_utilities=>newline &&
'<td id="id" class="class" title="hint">' && cl_abap_char_utilities=>newline &&
' Hello' && cl_abap_char_utilities=>newline &&
'</td>' ).
'</td>' && cl_abap_char_utilities=>newline &&
'<td>Hello</td>' ).
ENDMETHOD.

View File

@ -35,4 +35,15 @@ INTERFACE zif_abapgit_gui_asset_manager
RAISING
zcx_abapgit_exception.
METHODS register_asset
IMPORTING
!iv_url TYPE string
!iv_type TYPE string
!iv_cachable TYPE abap_bool DEFAULT abap_true
!iv_mime_name TYPE wwwdatatab-objid OPTIONAL
!iv_base64 TYPE string OPTIONAL
!iv_inline TYPE string OPTIONAL
RAISING
zcx_abapgit_exception.
ENDINTERFACE.

View File

@ -13,6 +13,18 @@ INTERFACE zif_abapgit_gui_services
VALUE(rv_url) TYPE string
RAISING
zcx_abapgit_exception .
METHODS register_page_asset
IMPORTING
!iv_url TYPE string
!iv_type TYPE string
!iv_mime_name TYPE wwwdatatab-objid OPTIONAL
!iv_inline TYPE string OPTIONAL
" Notes:
" - page_asset is supposed to be not cachable
" - add mime64 if needed (supposedly won't be needed)
RAISING
zcx_abapgit_exception.
METHODS register_event_handler
IMPORTING
!ii_event_handler TYPE REF TO zif_abapgit_gui_event_handler .

View File

@ -96,6 +96,7 @@ INTERFACE zif_abapgit_html PUBLIC.
!iv_id TYPE string OPTIONAL
!iv_class TYPE string OPTIONAL
!iv_hint TYPE string OPTIONAL
!iv_format_single_line TYPE abap_bool DEFAULT abap_false
RETURNING
VALUE(ri_self) TYPE REF TO zif_abapgit_html.
@ -106,6 +107,7 @@ INTERFACE zif_abapgit_html PUBLIC.
!iv_id TYPE string OPTIONAL
!iv_class TYPE string OPTIONAL
!iv_hint TYPE string OPTIONAL
!iv_format_single_line TYPE abap_bool DEFAULT abap_true
PREFERRED PARAMETER iv_content
RETURNING
VALUE(ri_self) TYPE REF TO zif_abapgit_html.
@ -117,6 +119,7 @@ INTERFACE zif_abapgit_html PUBLIC.
!iv_id TYPE string OPTIONAL
!iv_class TYPE string OPTIONAL
!iv_hint TYPE string OPTIONAL
!iv_format_single_line TYPE abap_bool DEFAULT abap_true
PREFERRED PARAMETER iv_content
RETURNING
VALUE(ri_self) TYPE REF TO zif_abapgit_html.

View File

@ -0,0 +1,203 @@
CLASS zcl_abapgit_html_table DEFINITION
PUBLIC
INHERITING FROM zcl_abapgit_gui_component
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
CLASS-METHODS create
IMPORTING
!ii_renderer TYPE REF TO zif_abapgit_html_table
RETURNING
VALUE(ro_instance) TYPE REF TO zcl_abapgit_html_table .
" probably th css_class
" maybe auto class for td
METHODS define_column
IMPORTING
!iv_column_id TYPE string
!iv_column_title TYPE string OPTIONAL
!iv_from_field TYPE abap_compname OPTIONAL
RETURNING
VALUE(ro_self) TYPE REF TO zcl_abapgit_html_table .
" Maybe also data_provider
" Record Limit
METHODS render
IMPORTING
!iv_id TYPE csequence OPTIONAL
!iv_css_class TYPE csequence OPTIONAL
!it_data TYPE ANY TABLE
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html
RAISING
zcx_abapgit_exception .
PROTECTED SECTION.
PRIVATE SECTION.
TYPES:
BEGIN OF ty_column,
column_id TYPE string,
column_title TYPE string,
from_field TYPE abap_compname,
END OF ty_column,
ty_columns TYPE STANDARD TABLE OF ty_column WITH KEY column_id.
DATA mi_renderer TYPE REF TO zif_abapgit_html_table.
DATA mt_columns TYPE ty_columns.
DATA mi_html TYPE REF TO zif_abapgit_html.
METHODS render_thead
RAISING
zcx_abapgit_exception .
METHODS render_tbody
IMPORTING
it_data TYPE ANY TABLE
RAISING
zcx_abapgit_exception .
METHODS render_row
IMPORTING
iv_row_index TYPE i
is_row TYPE any
RAISING
zcx_abapgit_exception .
ENDCLASS.
CLASS ZCL_ABAPGIT_HTML_TABLE IMPLEMENTATION.
METHOD create.
ASSERT ii_renderer IS BOUND.
CREATE OBJECT ro_instance.
ro_instance->mi_renderer = ii_renderer.
ENDMETHOD.
METHOD define_column.
FIELD-SYMBOLS <ls_c> LIKE LINE OF mt_columns.
ASSERT iv_column_id IS NOT INITIAL.
ro_self = me.
APPEND INITIAL LINE TO mt_columns ASSIGNING <ls_c>.
<ls_c>-column_id = iv_column_id.
<ls_c>-column_title = iv_column_title.
<ls_c>-from_field = to_upper( iv_from_field ).
ENDMETHOD.
METHOD render.
DATA lv_attrs TYPE string.
IF iv_id IS NOT INITIAL.
lv_attrs = lv_attrs && | id="{ iv_id }"|.
ENDIF.
IF iv_css_class IS NOT INITIAL.
lv_attrs = lv_attrs && | class="{ iv_css_class }"|.
ENDIF.
CREATE OBJECT mi_html TYPE zcl_abapgit_html.
ri_html = mi_html.
mi_html->add( |<table{ lv_attrs }>| ).
render_thead( ).
render_tbody( it_data ).
mi_html->add( '</table>' ).
ENDMETHOD.
METHOD render_row.
DATA ls_render TYPE zif_abapgit_html_table=>ty_cell_render.
DATA lv_dummy TYPE string.
FIELD-SYMBOLS <ls_col> LIKE LINE OF mt_columns.
FIELD-SYMBOLS <lv_val> TYPE any.
LOOP AT mt_columns ASSIGNING <ls_col>.
IF <ls_col>-from_field IS NOT INITIAL AND <ls_col>-from_field <> '-'.
ASSIGN COMPONENT <ls_col>-from_field OF STRUCTURE is_row TO <lv_val>.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( |html_table: cannot assign field [{ <ls_col>-from_field }]| ).
ENDIF.
ELSEIF <ls_col>-from_field <> '-'.
<ls_col>-from_field = to_upper( <ls_col>-column_id ). " Try column_id
ASSIGN COMPONENT <ls_col>-from_field OF STRUCTURE is_row TO <lv_val>.
IF sy-subrc <> 0.
<ls_col>-from_field = '-'. " Don't try assignments anymore
ASSIGN lv_dummy TO <lv_val>.
ENDIF.
ELSE.
ASSIGN lv_dummy TO <lv_val>.
ENDIF.
ls_render = mi_renderer->render_cell(
iv_row_index = iv_row_index
is_row = is_row
iv_column_id = <ls_col>-column_id
iv_value = <lv_val> ).
mi_html->td(
iv_content = ls_render-content
ii_content = ls_render-html
iv_class = ls_render-css_class ).
ENDLOOP.
ENDMETHOD.
METHOD render_tbody.
DATA ls_row_attrs TYPE zif_abapgit_html_table=>ty_row_attrs.
DATA lv_row_attrs TYPE string.
DATA lv_index TYPE i.
FIELD-SYMBOLS <ls_i> TYPE any.
mi_html->add( '<tbody>' ).
LOOP AT it_data ASSIGNING <ls_i>.
lv_index = sy-tabix.
ls_row_attrs = mi_renderer->get_row_attrs(
iv_row_index = lv_index
is_row = <ls_i> ).
CLEAR lv_row_attrs.
IF ls_row_attrs-css_class IS NOT INITIAL.
lv_row_attrs = lv_row_attrs && | class="{ ls_row_attrs-css_class }"|.
ENDIF.
mi_html->add( |<tr{ lv_row_attrs }>| ).
render_row(
iv_row_index = lv_index
is_row = <ls_i> ).
mi_html->add( '</tr>' ).
ENDLOOP.
mi_html->add( '</tbody>' ).
ENDMETHOD.
METHOD render_thead.
FIELD-SYMBOLS <ls_col> LIKE LINE OF mt_columns.
mi_html->add( '<thead>' ).
mi_html->add( '<tr>' ).
LOOP AT mt_columns ASSIGNING <ls_col>.
mi_html->th( iv_content = <ls_col>-column_title ).
ENDLOOP.
mi_html->add( '</tr>' ).
mi_html->add( '</thead>' ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,102 @@
CLASS ltcl_test_simple_table DEFINITION FINAL
FOR TESTING
RISK LEVEL HARMLESS
DURATION SHORT.
PUBLIC SECTION.
INTERFACES zif_abapgit_html_table.
TYPES:
BEGIN OF ty_simple_data,
col1 TYPE string,
col2 TYPE i,
col3 TYPE i,
col4 TYPE REF TO data,
END OF ty_simple_data.
METHODS simple_render FOR TESTING RAISING zcx_abapgit_exception.
ENDCLASS.
CLASS ltcl_test_simple_table IMPLEMENTATION.
METHOD zif_abapgit_html_table~get_row_attrs.
rs_attrs-css_class = |r{ iv_row_index }|.
ENDMETHOD.
METHOD zif_abapgit_html_table~render_cell.
rs_render-css_class = 'cell'.
IF iv_column_id = 'colX'.
IF iv_row_index = 2.
rs_render-html = zcl_abapgit_html=>create( )->add( 'XHTML' ).
ELSE.
rs_render-content = 'X'.
ENDIF.
ELSE.
rs_render-content = |{ iv_value }|.
ENDIF.
ENDMETHOD.
METHOD simple_render.
DATA lo_tab TYPE REF TO zcl_abapgit_html_table.
DATA lt_dummy_data TYPE TABLE OF ty_simple_data.
DATA lv_html_act TYPE string.
DATA li_html_exp TYPE REF TO zif_abapgit_html.
FIELD-SYMBOLS <ls_i> LIKE LINE OF lt_dummy_data.
lo_tab = zcl_abapgit_html_table=>create( ii_renderer = me
)->define_column(
iv_column_id = 'col1'
iv_column_title = 'Col 1'
)->define_column(
iv_column_id = 'col2'
iv_column_title = 'Col 2'
iv_from_field = 'col3'
)->define_column( 'colX' ).
APPEND INITIAL LINE TO lt_dummy_data ASSIGNING <ls_i>.
<ls_i>-col1 = 'Hello'.
<ls_i>-col2 = 1.
<ls_i>-col3 = 10.
APPEND INITIAL LINE TO lt_dummy_data ASSIGNING <ls_i>.
<ls_i>-col1 = 'World'.
<ls_i>-col2 = 2.
<ls_i>-col3 = 20.
lv_html_act = lo_tab->render(
iv_id = 'tabid'
iv_css_class = 'tabclass'
it_data = lt_dummy_data )->render( ).
CREATE OBJECT li_html_exp TYPE zcl_abapgit_html.
li_html_exp->add(
'<table id="tabid" class="tabclass">' )->add(
'<thead>' )->add(
'<tr>' )->add(
'<th>Col 1</th>' )->add(
'<th>Col 2</th>' )->add(
'<th></th>' )->add(
'</tr>' )->add(
'</thead>' )->add(
'<tbody>' )->add(
'<tr class="r1">' )->add(
'<td class="cell">Hello</td>' )->add(
'<td class="cell">10</td>' )->add(
'<td class="cell">X</td>' )->add(
'</tr>' )->add(
'<tr class="r2">' )->add(
'<td class="cell">World</td>' )->add(
'<td class="cell">20</td>' )->add(
'<td class="cell">' )->add(
'XHTML' )->add(
'</td>' )->add(
'</tr>' )->add(
'</tbody>' )->add(
'</table>' ).
cl_abap_unit_assert=>assert_equals(
act = lv_html_act
exp = li_html_exp->render( ) ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,17 @@
<?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_HTML_TABLE</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - GUI HTML Table</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -4,6 +4,11 @@ CLASS zcl_abapgit_html_toolbar DEFINITION
PUBLIC SECTION.
CLASS-METHODS create
IMPORTING
!iv_id TYPE string OPTIONAL
RETURNING
VALUE(ro_instance) TYPE REF TO zcl_abapgit_html_toolbar.
METHODS constructor
IMPORTING
!iv_id TYPE string OPTIONAL .
@ -115,6 +120,12 @@ CLASS zcl_abapgit_html_toolbar IMPLEMENTATION.
mv_id = iv_id.
ENDMETHOD.
METHOD create.
CREATE OBJECT ro_instance
EXPORTING
iv_id = iv_id.
ENDMETHOD.
METHOD count_items.
rv_count = lines( mt_items ).

View File

@ -0,0 +1,8 @@
INTERFACE zif_abapgit_gui_page_title
PUBLIC .
METHODS get_page_title
RETURNING
VALUE(rv_title) TYPE string.
ENDINTERFACE.

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_INTF" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOINTERF>
<CLSNAME>ZIF_ABAPGIT_GUI_PAGE_TITLE</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - GUI Page Title Provider</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<UNICODE>X</UNICODE>
</VSEOINTERF>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,36 @@
INTERFACE zif_abapgit_html_table
PUBLIC .
TYPES:
BEGIN OF ty_row_attrs,
css_class TYPE string,
END OF ty_row_attrs.
TYPES:
BEGIN OF ty_cell_render,
css_class TYPE string,
content TYPE string,
html TYPE REF TO zif_abapgit_html,
END OF ty_cell_render.
METHODS get_row_attrs
IMPORTING
iv_row_index TYPE i
is_row TYPE any
RETURNING
VALUE(rs_attrs) TYPE ty_row_attrs
RAISING
zcx_abapgit_exception.
METHODS render_cell
IMPORTING
iv_row_index TYPE i
is_row TYPE any
iv_column_id TYPE string
iv_value TYPE any
RETURNING
VALUE(rs_render) TYPE ty_cell_render
RAISING
zcx_abapgit_exception.
ENDINTERFACE.

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_INTF" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOINTERF>
<CLSNAME>ZIF_ABAPGIT_HTML_TABLE</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - GUI HTML Table Interface</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<UNICODE>X</UNICODE>
</VSEOINTERF>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,40 @@
/*
* PAGE DB CSS
*/
/* LAYOUT */
.db-list {
padding: 0.5em;
overflow-x: auto;
}
.db-list table { table-layout: fixed; }
.db-list table pre {
display: inline-block;
overflow: hidden;
word-wrap:break-word;
white-space: pre-wrap;
margin: 0px;
width: 30em;
}
.db-list table th {
text-align: left;
padding: 0.5em;
}
.db-list table thead tr { border-bottom: 1px solid; }
.db-list table td {
padding: 4px 0.5em;
vertical-align: middle;
word-break: break-all;
}
.db-list table td.data { font-style: italic; }
/* COLORS */
.db-list { background-color: var(--theme-table-background-color); }
.db-list table td { color: var(--theme-primary-font-color); }
.db-list table td.data { color: var(--theme-greyscale-dark); }
.db-list table tbody tr:hover td { background-color: rgba(0, 0, 0, 0.075); }
.db-list table tbody tr:active td { background-color: #f4f4f4; } /* Needed? */
.db-list table th { color: var(--theme-link-color); }
.db-list table thead tr { border-color: var(--theme-table-border-color); }

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_W3MI" serializer_version="v2.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<NAME>ZABAPGIT_CSS_PAGE_DB</NAME>
<TEXT>abapGit - DB Overview Page Stylesheet</TEXT>
<PARAMS>
<WWWPARAMS>
<NAME>fileextension</NAME>
<VALUE>.css</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<NAME>filename</NAME>
<VALUE>page_db.css</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<NAME>mimetype</NAME>
<VALUE>text/css</VALUE>
</WWWPARAMS>
</PARAMS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,61 @@
/*
* PAGE DB ENTRY CSS
*/
/* LAYOUT */
.db-entry {
padding: 0.5em;
}
.db-entry pre {
display: block;
font-size: 10pt;
overflow: hidden;
word-wrap:break-word;
white-space: pre-wrap;
border: 1px solid;
border-radius: 3px;
padding: 0.5em;
margin: 0.5em 0em;
width: 98%;
}
.db-entry textarea {
margin: 0.5em 0em;
width: 98%;
}
.db-entry .toolbar {
padding-left: 0.5em;
padding-right: 0.5em;
}
.db-entry dl.entry-tag div {
display: inline-block;
border: 1px solid;
border-radius: 3px;
margin-right: 0.5em;
}
.db-entry dl.entry-tag div:last-child {
margin-right: 0px;
}
.db-entry dt, .db-entry dd {
display: inline-block;
margin-left: 0px;
padding: 2px 5px;
}
.db-entry dt::after { content: ":" }
/* COLORS */
.db-entry {
background-color: var(--theme-container-background-color);
}
.db-entry pre, .db-entry textarea {
background-color: var(--theme-table-background-color);
border-color: var(--theme-container-border-color);
}
.db-entry dl.entry-tag div {
border-color: hsl(206, 20%, 75%);
background-color: hsl(206, 20%, 90%);
}
.db-entry dt {
background-color: hsl(206, 20%, 75%);
}

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_W3MI" serializer_version="v2.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<NAME>ZABAPGIT_CSS_PAGE_DB_ENTRY</NAME>
<TEXT>abapGit - DB Entry Page Stylesheet</TEXT>
<PARAMS>
<WWWPARAMS>
<NAME>fileextension</NAME>
<VALUE>.css</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<NAME>filename</NAME>
<VALUE>page_db_entry.css</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<NAME>mimetype</NAME>
<VALUE>text/css</VALUE>
</WWWPARAMS>
</PARAMS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -21,15 +21,18 @@ CLASS zcl_abapgit_gui_page DEFINITION PUBLIC ABSTRACT
TYPES:
BEGIN OF ty_control,
page_layout TYPE string,
page_title TYPE string,
page_menu TYPE REF TO zcl_abapgit_html_toolbar,
page_menu_provider TYPE REF TO zif_abapgit_gui_menu_provider,
page_layout TYPE string,
page_title TYPE string,
page_menu TYPE REF TO zcl_abapgit_html_toolbar,
page_menu_provider TYPE REF TO zif_abapgit_gui_menu_provider,
page_title_provider TYPE REF TO zif_abapgit_gui_page_title,
extra_css_url TYPE string,
extra_js_url TYPE string,
END OF ty_control .
DATA ms_control TYPE ty_control .
METHODS render_content
METHODS render_content " TODO refactor, render child directly
ABSTRACT
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html
@ -52,6 +55,12 @@ CLASS zcl_abapgit_gui_page DEFINITION PUBLIC ABSTRACT
METHODS html_head
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html .
METHODS header_stylesheet_links
IMPORTING
ii_html TYPE REF TO zif_abapgit_html .
METHODS header_script_links
IMPORTING
ii_html TYPE REF TO zif_abapgit_html .
METHODS title
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html
@ -144,6 +153,39 @@ CLASS ZCL_ABAPGIT_GUI_PAGE IMPLEMENTATION.
ENDMETHOD.
METHOD header_script_links.
ii_html->add( '<script src="js/common.js"></script>' ).
IF ms_control-extra_js_url IS NOT INITIAL.
ii_html->add( |<script src="{ ms_control-extra_js_url }"></script>| ).
ENDIF.
ENDMETHOD.
METHOD header_stylesheet_links.
ii_html->add( '<link rel="stylesheet" type="text/css" href="css/common.css">' ).
ii_html->add( '<link rel="stylesheet" type="text/css" href="css/ag-icons.css">' ).
" Themes
ii_html->add( '<link rel="stylesheet" type="text/css" href="css/theme-default.css">' ). " Theme basis
CASE mo_settings->get_ui_theme( ).
WHEN zcl_abapgit_settings=>c_ui_theme-dark.
ii_html->add( '<link rel="stylesheet" type="text/css" href="css/theme-dark.css">' ).
WHEN zcl_abapgit_settings=>c_ui_theme-belize.
ii_html->add( '<link rel="stylesheet" type="text/css" href="css/theme-belize-blue.css">' ).
ENDCASE.
" Page stylesheets
IF ms_control-extra_css_url IS NOT INITIAL.
ii_html->add( |<link rel="stylesheet" type="text/css" href="{ ms_control-extra_css_url }">| ).
ENDIF.
ENDMETHOD.
METHOD html_head.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
@ -154,19 +196,9 @@ CLASS ZCL_ABAPGIT_GUI_PAGE IMPLEMENTATION.
ri_html->add( '<meta http-equiv="X-UA-Compatible" content="IE=11,10,9,8" />' ).
ri_html->add( '<title>abapGit</title>' ).
ri_html->add( '<link rel="stylesheet" type="text/css" href="css/common.css">' ).
ri_html->add( '<link rel="stylesheet" type="text/css" href="css/ag-icons.css">' ).
" Themes
ri_html->add( '<link rel="stylesheet" type="text/css" href="css/theme-default.css">' ). " Theme basis
CASE mo_settings->get_ui_theme( ).
WHEN zcl_abapgit_settings=>c_ui_theme-dark.
ri_html->add( '<link rel="stylesheet" type="text/css" href="css/theme-dark.css">' ).
WHEN zcl_abapgit_settings=>c_ui_theme-belize.
ri_html->add( '<link rel="stylesheet" type="text/css" href="css/theme-belize-blue.css">' ).
ENDCASE.
ri_html->add( '<script src="js/common.js"></script>' ).
header_stylesheet_links( ri_html ).
header_script_links( ri_html ).
CASE mo_settings->get_icon_scaling( ). " Enforce icon scaling
WHEN mo_settings->c_icon_scaling-large.
@ -276,24 +308,32 @@ CLASS ZCL_ABAPGIT_GUI_PAGE IMPLEMENTATION.
METHOD title.
DATA lo_page_menu LIKE ms_control-page_menu.
DATA lv_page_title TYPE string.
lo_page_menu = ms_control-page_menu.
IF lo_page_menu IS NOT BOUND AND ms_control-page_menu_provider IS BOUND.
lo_page_menu = ms_control-page_menu_provider->get_menu( ).
ENDIF.
lv_page_title = ms_control-page_title.
IF ms_control-page_title_provider IS BOUND.
lv_page_title = ms_control-page_title_provider->get_page_title( ).
ENDIF.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
ri_html->add( '<div id="header">' ).
ri_html->add( '<div class="logo">' ).
ri_html->add_a( iv_act = zif_abapgit_definitions=>c_action-abapgit_home
iv_txt = ri_html->icon( 'git-alt' ) ).
ri_html->add_a( iv_act = zif_abapgit_definitions=>c_action-abapgit_home
iv_txt = ri_html->icon( 'abapgit' ) ).
ri_html->add_a(
iv_act = zif_abapgit_definitions=>c_action-abapgit_home
iv_txt = ri_html->icon( 'git-alt' ) ).
ri_html->add_a(
iv_act = zif_abapgit_definitions=>c_action-abapgit_home
iv_txt = ri_html->icon( 'abapgit' ) ).
ri_html->add( '</div>' ).
ri_html->add( |<div class="page-title"><span class="spacer">&#x25BA;</span>{ ms_control-page_title }</div>| ).
ri_html->add( |<div class="page-title"><span class="spacer">&#x25BA;</span>{ lv_page_title }</div>| ).
IF lo_page_menu IS BOUND.
ri_html->add( '<div class="float-right">' ).

View File

@ -1,20 +1,27 @@
CLASS zcl_abapgit_gui_page_db DEFINITION
PUBLIC
INHERITING FROM zcl_abapgit_gui_page
INHERITING FROM zcl_abapgit_gui_component
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES zif_abapgit_gui_event_handler.
INTERFACES zif_abapgit_gui_renderable.
INTERFACES zif_abapgit_gui_menu_provider.
INTERFACES zif_abapgit_html_table.
CLASS-METHODS create
RETURNING
VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
RAISING
zcx_abapgit_exception.
METHODS constructor
RAISING zcx_abapgit_exception.
RAISING
zcx_abapgit_exception.
METHODS zif_abapgit_gui_event_handler~on_event
REDEFINITION .
PROTECTED SECTION.
METHODS render_content
REDEFINITION .
PRIVATE SECTION.
CONSTANTS:
@ -24,19 +31,40 @@ CLASS zcl_abapgit_gui_page_db DEFINITION
restore TYPE string VALUE 'restore',
END OF c_action.
CONSTANTS c_css_url TYPE string VALUE 'css/page_db.css'.
TYPES:
BEGIN OF ty_explanation,
value TYPE string,
extra TYPE string,
END OF ty_explanation.
DATA mt_methods TYPE zcl_abapgit_background=>ty_methods.
CLASS-METHODS backup
METHODS register_stylesheet
RAISING
zcx_abapgit_exception.
CLASS-METHODS delete
METHODS render_table
IMPORTING
it_db_entries TYPE zif_abapgit_persistence=>ty_contents
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html
RAISING
zcx_abapgit_exception.
CLASS-METHODS do_backup_db
RAISING
zcx_abapgit_exception.
CLASS-METHODS do_delete_entry
IMPORTING
!is_key TYPE zif_abapgit_persistence=>ty_content
RAISING
zcx_abapgit_exception.
CLASS-METHODS restore
CLASS-METHODS do_restore_db
RAISING
zcx_abapgit_exception.
METHODS explain_content
IMPORTING
!is_data TYPE zif_abapgit_persistence=>ty_content
@ -44,41 +72,56 @@ CLASS zcl_abapgit_gui_page_db DEFINITION
VALUE(rv_text) TYPE string
RAISING
zcx_abapgit_exception.
METHODS build_menu
RETURNING
VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar.
METHODS explain_content_repo
IMPORTING
!is_data TYPE zif_abapgit_persistence=>ty_content
EXPORTING
!ev_value TYPE string
!ev_extra TYPE string
RETURNING
VALUE(rs_expl) TYPE ty_explanation
RAISING
zcx_abapgit_exception.
METHODS explain_content_repo_cs
IMPORTING
!is_data TYPE zif_abapgit_persistence=>ty_content
EXPORTING
!ev_value TYPE string
!ev_extra TYPE string
RETURNING
VALUE(rs_expl) TYPE ty_explanation
RAISING
zcx_abapgit_exception.
METHODS explain_content_background
IMPORTING
!is_data TYPE zif_abapgit_persistence=>ty_content
EXPORTING
!ev_value TYPE string
!ev_extra TYPE string
RETURNING
VALUE(rs_expl) TYPE ty_explanation
RAISING
zcx_abapgit_exception.
ENDCLASS.
CLASS zcl_abapgit_gui_page_db IMPLEMENTATION.
CLASS ZCL_ABAPGIT_GUI_PAGE_DB IMPLEMENTATION.
METHOD backup.
METHOD constructor.
super->constructor( ).
register_stylesheet( ).
ENDMETHOD.
METHOD create.
DATA lo_component TYPE REF TO zcl_abapgit_gui_page_db.
CREATE OBJECT lo_component.
ri_page = zcl_abapgit_gui_page_hoc=>create(
iv_page_title = 'Database Utility'
iv_extra_css_url = c_css_url
ii_page_menu_provider = lo_component
ii_child_component = lo_component ).
ENDMETHOD.
METHOD do_backup_db.
DATA:
lt_data TYPE zif_abapgit_persistence=>ty_contents,
@ -97,8 +140,9 @@ CLASS zcl_abapgit_gui_page_db IMPLEMENTATION.
LOOP AT lt_data ASSIGNING <ls_data>.
CONCATENATE <ls_data>-type '_' <ls_data>-value '.xml' INTO lv_filename.
lo_zip->add( name = lv_filename
content = zcl_abapgit_convert=>string_to_xstring_utf8( <ls_data>-data_str ) ).
lo_zip->add(
name = lv_filename
content = zcl_abapgit_convert=>string_to_xstring_utf8( <ls_data>-data_str ) ).
ENDLOOP.
lv_zip = lo_zip->save( ).
@ -121,29 +165,9 @@ CLASS zcl_abapgit_gui_page_db IMPLEMENTATION.
ENDMETHOD.
METHOD build_menu.
METHOD do_delete_entry.
CREATE OBJECT ro_menu.
ro_menu->add( iv_txt = 'Backup'
iv_act = c_action-backup ).
ro_menu->add( iv_txt = 'Restore'
iv_act = c_action-restore ).
ENDMETHOD.
METHOD constructor.
super->constructor( ).
ms_control-page_title = 'Database Utility'.
ms_control-page_menu = build_menu( ).
ENDMETHOD.
METHOD delete.
DATA: lv_answer TYPE c LENGTH 1.
DATA lv_answer TYPE c LENGTH 1.
ASSERT is_key-type IS NOT INITIAL.
@ -174,6 +198,9 @@ CLASS zcl_abapgit_gui_page_db IMPLEMENTATION.
" Initialize repo list
zcl_abapgit_repo_srv=>get_instance( )->init( ).
" TODO: think how to remove this code,
" maybe implement subscription in persistence_db,
" so that repo_srv receive a notification on add/delete
ENDIF.
COMMIT WORK.
@ -181,234 +208,7 @@ CLASS zcl_abapgit_gui_page_db IMPLEMENTATION.
ENDMETHOD.
METHOD explain_content.
DATA:
lv_descr TYPE string,
lv_value TYPE string,
lv_extra TYPE string.
CASE is_data-type.
WHEN zcl_abapgit_persistence_db=>c_type_repo.
lv_descr = 'Repo Settings'.
explain_content_repo(
EXPORTING
is_data = is_data
IMPORTING
ev_value = lv_value
ev_extra = lv_extra ).
WHEN zcl_abapgit_persistence_db=>c_type_background.
lv_descr = 'Background Settings'.
explain_content_background(
EXPORTING
is_data = is_data
IMPORTING
ev_value = lv_value
ev_extra = lv_extra ).
WHEN zcl_abapgit_persistence_db=>c_type_user.
lv_descr = 'Personal Settings'.
lv_value = zcl_abapgit_user_record=>get_instance( is_data-value )->get_name( ).
WHEN zcl_abapgit_persistence_db=>c_type_settings.
lv_descr = 'Global Settings'.
WHEN zcl_abapgit_persistence_db=>c_type_packages.
lv_descr = 'Local Package Details'.
WHEN zcl_abapgit_persistence_db=>c_type_repo_csum.
lv_descr = 'Repo Checksums'.
explain_content_repo_cs(
EXPORTING
is_data = is_data
IMPORTING
ev_value = lv_value
ev_extra = lv_extra ).
WHEN OTHERS.
IF strlen( is_data-data_str ) >= 250.
lv_value = is_data-data_str(250).
ELSE.
lv_value = is_data-data_str.
ENDIF.
lv_value = escape(
val = lv_value
format = cl_abap_format=>e_html_attr ).
lv_value = |<pre>{ lv_value }</pre>|.
ENDCASE.
IF lv_value IS NOT INITIAL.
lv_descr = |{ lv_descr }: |.
ENDIF.
IF lv_extra IS NOT INITIAL.
lv_extra = | ({ lv_extra })|.
ENDIF.
rv_text = |{ lv_descr }<strong>{ lv_value }</strong>{ lv_extra }|.
IF strlen( rv_text ) >= 250.
rv_text = rv_text(250) && '...'.
ENDIF.
ENDMETHOD.
METHOD explain_content_background.
DATA:
ls_result TYPE match_result,
ls_match TYPE submatch_result,
lv_class TYPE string,
ls_method LIKE LINE OF mt_methods.
ev_value = |{ zcl_abapgit_repo_srv=>get_instance( )->get( is_data-value )->get_name( ) }|.
FIND FIRST OCCURRENCE OF REGEX '<METHOD>(.*)</METHOD>'
IN is_data-data_str IGNORING CASE RESULTS ls_result.
READ TABLE ls_result-submatches INTO ls_match INDEX 1.
IF sy-subrc = 0.
lv_class = is_data-data_str+ls_match-offset(ls_match-length).
ENDIF.
IF mt_methods IS INITIAL.
mt_methods = zcl_abapgit_background=>list_methods( ).
ENDIF.
READ TABLE mt_methods INTO ls_method WITH TABLE KEY class = lv_class.
IF sy-subrc = 0.
ev_extra = ls_method-description.
ELSE.
ev_extra = lv_class.
ENDIF.
ENDMETHOD.
METHOD explain_content_repo.
DATA:
ls_result TYPE match_result,
ls_match TYPE submatch_result,
lv_cnt TYPE i.
FIND FIRST OCCURRENCE OF REGEX '<OFFLINE/>'
IN is_data-data_str IGNORING CASE MATCH COUNT lv_cnt.
IF lv_cnt > 0.
ev_extra = 'Online'.
ELSE.
ev_extra = 'Offline'.
ENDIF.
FIND FIRST OCCURRENCE OF REGEX '<DISPLAY_NAME>(.*)</DISPLAY_NAME>'
IN is_data-data_str IGNORING CASE RESULTS ls_result.
READ TABLE ls_result-submatches INTO ls_match INDEX 1.
IF sy-subrc = 0.
ev_value = is_data-data_str+ls_match-offset(ls_match-length).
ENDIF.
IF ev_value IS INITIAL.
FIND FIRST OCCURRENCE OF REGEX '<URL>(.*)</URL>'
IN is_data-data_str IGNORING CASE RESULTS ls_result.
READ TABLE ls_result-submatches INTO ls_match INDEX 1.
IF sy-subrc = 0.
ev_value = is_data-data_str+ls_match-offset(ls_match-length).
IF lv_cnt > 0.
ev_value = zcl_abapgit_url=>name( ev_value ).
ENDIF.
ENDIF.
ENDIF.
ENDMETHOD.
METHOD explain_content_repo_cs.
DATA:
lt_lines TYPE string_table.
IF strlen( is_data-data_str ) > 0.
SPLIT is_data-data_str AT cl_abap_char_utilities=>newline INTO TABLE lt_lines.
ev_extra = |{ lines( lt_lines ) } lines|.
READ TABLE lt_lines INDEX 1 INTO ev_value.
IF sy-subrc = 0.
REPLACE '#repo_name#' IN ev_value WITH ''.
ev_value = escape(
val = ev_value
format = cl_abap_format=>e_html_attr ).
ENDIF.
ENDIF.
ENDMETHOD.
METHOD render_content.
DATA: lt_data TYPE zif_abapgit_persistence=>ty_contents,
lv_action TYPE string,
lv_trclass TYPE string,
lo_toolbar TYPE REF TO zcl_abapgit_html_toolbar.
FIELD-SYMBOLS: <ls_data> LIKE LINE OF lt_data.
lt_data = zcl_abapgit_persistence_db=>get_instance( )->list( ).
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
ri_html->add( '<div class="db_list">' ).
ri_html->add( '<table class="db_tab">' ).
" Header
ri_html->add( '<thead>' ).
ri_html->add( '<tr>' ).
ri_html->add( '<th>Type</th>' ).
ri_html->add( '<th>Key</th>' ).
ri_html->add( '<th>Data</th>' ).
ri_html->add( '<th></th>' ).
ri_html->add( '</tr>' ).
ri_html->add( '</thead>' ).
ri_html->add( '<tbody>' ).
" Lines
LOOP AT lt_data ASSIGNING <ls_data>.
CLEAR lv_trclass.
IF sy-tabix = 1.
lv_trclass = ' class="firstrow"'.
ENDIF.
lv_action = zcl_abapgit_html_action_utils=>dbkey_encode( <ls_data> ).
CREATE OBJECT lo_toolbar.
lo_toolbar->add( iv_txt = 'Display'
iv_act = |{ zif_abapgit_definitions=>c_action-db_display }?{ lv_action }| ).
lo_toolbar->add( iv_txt = 'Edit'
iv_act = |{ zif_abapgit_definitions=>c_action-db_edit }?{ lv_action }| ).
lo_toolbar->add( iv_txt = 'Delete'
iv_act = |{ c_action-delete }?{ lv_action }| ).
ri_html->add( |<tr{ lv_trclass }>| ).
ri_html->add( |<td>{ <ls_data>-type }</td>| ).
ri_html->add( |<td>{ <ls_data>-value }</td>| ).
ri_html->add( |<td class="data">{ explain_content( <ls_data> ) }</td>| ).
ri_html->add( '<td>' ).
ri_html->add( lo_toolbar->render( ) ).
ri_html->add( '</td>' ).
ri_html->add( '</tr>' ).
ENDLOOP.
ri_html->add( '</tbody>' ).
ri_html->add( '</table>' ).
ri_html->add( '</div>' ).
ENDMETHOD.
METHOD restore.
METHOD do_restore_db.
DATA:
lv_answer TYPE c LENGTH 1,
@ -453,13 +253,11 @@ CLASS zcl_abapgit_gui_page_db IMPLEMENTATION.
SPLIT lv_filename AT '_' INTO ls_data-type ls_data-value.
" Validate DB key
IF ls_data-type <> zcl_abapgit_persistence_db=>c_type_repo AND
ls_data-type <> zcl_abapgit_persistence_db=>c_type_user AND
ls_data-type <> zcl_abapgit_persistence_db=>c_type_settings AND
ls_data-type <> zcl_abapgit_persistence_db=>c_type_background AND
ls_data-type <> zcl_abapgit_persistence_db=>c_type_packages.
zcx_abapgit_exception=>raise( |Invalid DB key. This is not an abapGit Backup| ).
ENDIF.
TRY.
zcl_abapgit_persistence_db=>validate_entry_type( ls_data-type ).
CATCH zcx_abapgit_exception.
zcx_abapgit_exception=>raise( |Invalid DB entry type. This is not an abapGit Backup| ).
ENDTRY.
lo_zip->get(
EXPORTING
@ -515,6 +313,187 @@ CLASS zcl_abapgit_gui_page_db IMPLEMENTATION.
ENDMETHOD.
METHOD explain_content.
DATA lv_descr TYPE string.
DATA ls_explanation TYPE ty_explanation.
CASE is_data-type.
WHEN zcl_abapgit_persistence_db=>c_type_repo.
lv_descr = 'Repo Settings'.
ls_explanation = explain_content_repo( is_data ).
WHEN zcl_abapgit_persistence_db=>c_type_background.
lv_descr = 'Background Settings'.
ls_explanation = explain_content_background( is_data ).
WHEN zcl_abapgit_persistence_db=>c_type_user.
lv_descr = 'Personal Settings'.
ls_explanation-value = zcl_abapgit_user_record=>get_instance( is_data-value )->get_name( ).
WHEN zcl_abapgit_persistence_db=>c_type_settings.
lv_descr = 'Global Settings'.
WHEN zcl_abapgit_persistence_db=>c_type_packages.
lv_descr = 'Local Package Details'.
WHEN zcl_abapgit_persistence_db=>c_type_repo_csum.
lv_descr = 'Repo Checksums'.
ls_explanation = explain_content_repo_cs( is_data ).
WHEN OTHERS.
IF strlen( is_data-data_str ) >= 250.
ls_explanation-value = is_data-data_str(250).
ELSE.
ls_explanation-value = is_data-data_str.
ENDIF.
ls_explanation-value = escape(
val = ls_explanation-value
format = cl_abap_format=>e_html_attr ).
ls_explanation-value = |<pre>{ ls_explanation-value }</pre>|.
ENDCASE.
IF ls_explanation-value IS NOT INITIAL.
lv_descr = |{ lv_descr }: |.
ENDIF.
IF ls_explanation-extra IS NOT INITIAL.
ls_explanation-extra = | ({ ls_explanation-extra })|.
ENDIF.
rv_text = |{ lv_descr }<strong>{ ls_explanation-value }</strong>{ ls_explanation-extra }|.
IF strlen( rv_text ) >= 250.
rv_text = rv_text(250) && '...'.
ENDIF.
ENDMETHOD.
METHOD explain_content_background.
DATA:
ls_result TYPE match_result,
ls_match TYPE submatch_result,
lv_class TYPE string,
ls_method LIKE LINE OF mt_methods.
rs_expl-value = |{ zcl_abapgit_repo_srv=>get_instance( )->get( is_data-value )->get_name( ) }|.
FIND FIRST OCCURRENCE OF REGEX '<METHOD>(.*)</METHOD>'
IN is_data-data_str IGNORING CASE RESULTS ls_result.
READ TABLE ls_result-submatches INTO ls_match INDEX 1.
IF sy-subrc = 0.
lv_class = is_data-data_str+ls_match-offset(ls_match-length).
ENDIF.
IF mt_methods IS INITIAL.
mt_methods = zcl_abapgit_background=>list_methods( ).
ENDIF.
READ TABLE mt_methods INTO ls_method WITH TABLE KEY class = lv_class.
IF sy-subrc = 0.
rs_expl-extra = ls_method-description.
ELSE.
rs_expl-extra = lv_class.
ENDIF.
ENDMETHOD.
METHOD explain_content_repo.
DATA:
ls_result TYPE match_result,
ls_match TYPE submatch_result,
lv_cnt TYPE i.
FIND FIRST OCCURRENCE OF REGEX '<OFFLINE/>'
IN is_data-data_str IGNORING CASE MATCH COUNT lv_cnt.
IF lv_cnt > 0.
rs_expl-extra = 'Online'.
ELSE.
rs_expl-extra = 'Offline'.
ENDIF.
FIND FIRST OCCURRENCE OF REGEX '<DISPLAY_NAME>(.*)</DISPLAY_NAME>'
IN is_data-data_str IGNORING CASE RESULTS ls_result.
READ TABLE ls_result-submatches INTO ls_match INDEX 1.
IF sy-subrc = 0.
rs_expl-value = is_data-data_str+ls_match-offset(ls_match-length).
ENDIF.
IF rs_expl-value IS INITIAL.
FIND FIRST OCCURRENCE OF REGEX '<URL>(.*)</URL>'
IN is_data-data_str IGNORING CASE RESULTS ls_result.
READ TABLE ls_result-submatches INTO ls_match INDEX 1.
IF sy-subrc = 0.
rs_expl-value = is_data-data_str+ls_match-offset(ls_match-length).
IF lv_cnt > 0.
rs_expl-value = zcl_abapgit_url=>name( rs_expl-value ).
ENDIF.
ENDIF.
ENDIF.
ENDMETHOD.
METHOD explain_content_repo_cs.
DATA lt_lines TYPE string_table.
IF strlen( is_data-data_str ) > 0.
SPLIT is_data-data_str AT cl_abap_char_utilities=>newline INTO TABLE lt_lines.
rs_expl-extra = |{ lines( lt_lines ) } lines|.
READ TABLE lt_lines INDEX 1 INTO rs_expl-value.
IF sy-subrc = 0.
REPLACE '#repo_name#' IN rs_expl-value WITH ''.
rs_expl-value = escape(
val = rs_expl-value
format = cl_abap_format=>e_html_attr ).
ENDIF.
ENDIF.
ENDMETHOD.
METHOD register_stylesheet.
DATA lo_buf TYPE REF TO zcl_abapgit_string_buffer.
CREATE OBJECT lo_buf.
" @@abapmerge include zabapgit_css_page_db.w3mi.data.css > lo_buf->add( '$$' ).
gui_services( )->register_page_asset(
iv_url = c_css_url
iv_type = 'text/css'
iv_mime_name = 'ZABAPGIT_CSS_PAGE_DB'
iv_inline = lo_buf->join_w_newline_and_flush( ) ).
ENDMETHOD.
METHOD render_table.
ri_html = zcl_abapgit_html_table=>create( ii_renderer = me
)->define_column(
iv_column_id = 'type'
iv_column_title = 'Type'
)->define_column(
iv_column_id = 'value'
iv_column_title = 'Key'
)->define_column(
iv_column_id = 'expl'
iv_column_title = 'Data'
)->define_column( 'cmd'
)->render( it_db_entries ).
ENDMETHOD.
METHOD zif_abapgit_gui_event_handler~on_event.
DATA ls_db TYPE zif_abapgit_persistence=>ty_content.
@ -524,16 +503,79 @@ CLASS zcl_abapgit_gui_page_db IMPLEMENTATION.
CASE ii_event->mv_action.
WHEN c_action-delete.
lo_query->to_abap( CHANGING cs_container = ls_db ).
delete( ls_db ).
do_delete_entry( ls_db ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
WHEN c_action-backup.
backup( ).
do_backup_db( ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
WHEN c_action-restore.
restore( ).
do_restore_db( ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
WHEN OTHERS.
rs_handled = super->zif_abapgit_gui_event_handler~on_event( ii_event ).
ENDCASE.
ENDMETHOD.
METHOD zif_abapgit_gui_menu_provider~get_menu.
CREATE OBJECT ro_toolbar.
ro_toolbar->add(
iv_txt = 'Backup'
iv_act = c_action-backup ).
ro_toolbar->add(
iv_txt = 'Restore'
iv_act = c_action-restore ).
ENDMETHOD.
METHOD zif_abapgit_gui_renderable~render.
DATA lt_db_entries TYPE zif_abapgit_persistence=>ty_contents.
register_handlers( ).
lt_db_entries = zcl_abapgit_persistence_db=>get_instance( )->list( ).
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
ri_html->add( '<div class="db-list">' ).
ri_html->add( render_table( lt_db_entries ) ).
ri_html->add( '</div>' ).
ENDMETHOD.
METHOD zif_abapgit_html_table~get_row_attrs.
ENDMETHOD.
METHOD zif_abapgit_html_table~render_cell.
DATA lv_action TYPE string.
DATA lo_toolbar TYPE REF TO zcl_abapgit_html_toolbar.
CASE iv_column_id.
WHEN 'type' OR 'value'.
rs_render-content = |{ iv_value }|.
WHEN 'expl'.
rs_render-content = explain_content( is_row ).
rs_render-css_class = 'data'.
WHEN 'cmd'.
lv_action = zcl_abapgit_html_action_utils=>dbkey_encode( is_row ).
lo_toolbar = zcl_abapgit_html_toolbar=>create(
)->add(
iv_txt = 'Display'
iv_act = |{ zif_abapgit_definitions=>c_action-db_display }?{ lv_action }|
)->add(
iv_txt = 'Edit'
iv_act = |{ zif_abapgit_definitions=>c_action-db_edit }?{ lv_action }|
)->add(
iv_txt = 'Delete'
iv_act = |{ c_action-delete }?{ lv_action }| ).
rs_render-html = lo_toolbar->render( ).
ENDCASE.
ENDMETHOD.

View File

@ -1,84 +0,0 @@
CLASS zcl_abapgit_gui_page_db_dis DEFINITION
PUBLIC
FINAL
CREATE PUBLIC INHERITING FROM zcl_abapgit_gui_page.
PUBLIC SECTION.
METHODS: constructor
IMPORTING is_key TYPE zif_abapgit_persistence=>ty_content
RAISING zcx_abapgit_exception.
CLASS-METHODS: render_record_banner
IMPORTING is_key TYPE zif_abapgit_persistence=>ty_content
RETURNING VALUE(rv_html) TYPE string.
PROTECTED SECTION.
METHODS render_content REDEFINITION.
PRIVATE SECTION.
DATA: ms_key TYPE zif_abapgit_persistence=>ty_content.
ENDCLASS.
CLASS zcl_abapgit_gui_page_db_dis IMPLEMENTATION.
METHOD constructor.
super->constructor( ).
ms_key = is_key.
ms_control-page_title = 'Config Display'.
ENDMETHOD.
METHOD render_content.
DATA:
lo_highlighter TYPE REF TO zcl_abapgit_syntax_highlighter,
lo_toolbar TYPE REF TO zcl_abapgit_html_toolbar,
lv_data TYPE zif_abapgit_persistence=>ty_content-data_str,
ls_action TYPE zif_abapgit_persistence=>ty_content,
lv_action TYPE string.
TRY.
lv_data = zcl_abapgit_persistence_db=>get_instance( )->read(
iv_type = ms_key-type
iv_value = ms_key-value ).
CATCH zcx_abapgit_not_found ##NO_HANDLER.
ENDTRY.
" Create syntax highlighter
lo_highlighter = zcl_abapgit_syntax_factory=>create( '*.xml' ).
ls_action-type = ms_key-type.
ls_action-value = ms_key-value.
lv_action = zcl_abapgit_html_action_utils=>dbkey_encode( ls_action ).
lv_data = lo_highlighter->process_line( zcl_abapgit_xml_pretty=>print( lv_data ) ).
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
CREATE OBJECT lo_toolbar.
lo_toolbar->add( iv_act = |{ zif_abapgit_definitions=>c_action-db_edit }?{ lv_action }|
iv_txt = 'Edit' ).
ri_html->add( '<div class="db_entry">' ).
ri_html->add( '<table class="toolbar"><tr><td>' ).
ri_html->add( render_record_banner( ms_key ) ).
ri_html->add( '</td><td>' ).
ri_html->add( lo_toolbar->render( iv_right = abap_true ) ).
ri_html->add( '</td></tr></table>' ).
ri_html->add( |<pre class="syntax-hl">{ lv_data }</pre>| ).
ri_html->add( '</div>' ).
ENDMETHOD.
METHOD render_record_banner.
rv_html = |<table class="tag"><tr><td class="label">Type:</td>|
&& | <td>{ is_key-type }</td></tr></table>\n|
&& |<table class="tag"><tr><td class="label">Key:</td>|
&& | <td>{ is_key-value }</td></tr></table>|.
ENDMETHOD.
ENDCLASS.

View File

@ -1,146 +0,0 @@
CLASS zcl_abapgit_gui_page_db_edit DEFINITION
PUBLIC
INHERITING FROM zcl_abapgit_gui_page
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
METHODS constructor
IMPORTING
is_key TYPE zif_abapgit_persistence=>ty_content
RAISING zcx_abapgit_exception.
METHODS zif_abapgit_gui_event_handler~on_event
REDEFINITION .
PROTECTED SECTION.
CLASS-METHODS dbcontent_decode
IMPORTING
!ii_event TYPE REF TO zif_abapgit_gui_event
RETURNING
VALUE(rs_content) TYPE zif_abapgit_persistence=>ty_content
RAISING
zcx_abapgit_exception .
METHODS render_content
REDEFINITION .
PRIVATE SECTION.
CONSTANTS:
BEGIN OF c_action,
update TYPE string VALUE 'update',
END OF c_action .
DATA ms_key TYPE zif_abapgit_persistence=>ty_content .
CLASS-METHODS update
IMPORTING
!is_content TYPE zif_abapgit_persistence=>ty_content
RAISING
zcx_abapgit_exception .
ENDCLASS.
CLASS ZCL_ABAPGIT_GUI_PAGE_DB_EDIT IMPLEMENTATION.
METHOD constructor.
super->constructor( ).
ms_key = is_key.
ms_control-page_title = 'Config Edit'.
ENDMETHOD.
METHOD dbcontent_decode.
DATA lo_map TYPE REF TO zcl_abapgit_string_map.
lo_map = ii_event->form_data( ).
rs_content-type = lo_map->get( 'TYPE' ).
rs_content-value = lo_map->get( 'VALUE' ).
rs_content-data_str = lo_map->get( 'XMLDATA' ).
IF rs_content-data_str(1) <> '<' AND rs_content-data_str+1(1) = '<'. " Hmmm ???
rs_content-data_str = rs_content-data_str+1.
ENDIF.
ENDMETHOD.
METHOD render_content.
DATA: lv_data TYPE zif_abapgit_persistence=>ty_content-data_str,
lo_toolbar TYPE REF TO zcl_abapgit_html_toolbar.
TRY.
lv_data = zcl_abapgit_persistence_db=>get_instance( )->read(
iv_type = ms_key-type
iv_value = ms_key-value ).
CATCH zcx_abapgit_not_found ##NO_HANDLER.
ENDTRY.
zcl_abapgit_persistence_db=>get_instance( )->lock(
iv_type = ms_key-type
iv_value = ms_key-value ).
lv_data = escape( val = zcl_abapgit_xml_pretty=>print( lv_data )
format = cl_abap_format=>e_html_attr ).
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
CREATE OBJECT lo_toolbar.
lo_toolbar->add( iv_act = 'submitFormById(''db_form'');'
iv_txt = 'Save'
iv_typ = zif_abapgit_html=>c_action_type-onclick
iv_opt = zif_abapgit_html=>c_html_opt-strong ).
ri_html->add( '<div class="db_entry">' ).
" Banners & Toolbar
ri_html->add( '<table class="toolbar"><tr><td>' ).
ri_html->add( zcl_abapgit_gui_page_db_dis=>render_record_banner( ms_key ) ).
ri_html->add( '</td><td>' ).
ri_html->add( lo_toolbar->render( iv_right = abap_true ) ).
ri_html->add( '</td></tr></table>' ).
" Form
ri_html->add( |<form id="db_form" method="post" action="sapevent:{ c_action-update }">| ).
ri_html->add( |<input type="hidden" name="type" value="{ ms_key-type }">| ).
ri_html->add( |<input type="hidden" name="value" value="{ ms_key-value }">| ).
ri_html->add( |<textarea rows="20" cols="100" name="xmldata">{ lv_data }</textarea>| ).
ri_html->add( '</form>' ).
ri_html->add( '</div>' ). "db_entry
ENDMETHOD.
METHOD update.
ASSERT is_content-type IS NOT INITIAL.
zcl_abapgit_persistence_db=>get_instance( )->update(
iv_type = is_content-type
iv_value = is_content-value
iv_data = is_content-data_str ).
COMMIT WORK.
ENDMETHOD.
METHOD zif_abapgit_gui_event_handler~on_event.
DATA: ls_db TYPE zif_abapgit_persistence=>ty_content.
CASE ii_event->mv_action.
WHEN c_action-update.
ls_db = dbcontent_decode( ii_event ).
update( ls_db ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
WHEN OTHERS.
rs_handled = super->zif_abapgit_gui_event_handler~on_event( ii_event ).
ENDCASE.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,301 @@
CLASS zcl_abapgit_gui_page_db_entry DEFINITION
PUBLIC
INHERITING FROM zcl_abapgit_gui_component
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES zif_abapgit_gui_event_handler .
INTERFACES zif_abapgit_gui_renderable .
INTERFACES zif_abapgit_gui_page_title .
CLASS-METHODS create
IMPORTING
!is_key TYPE zif_abapgit_persistence=>ty_content
!iv_edit_mode TYPE abap_bool DEFAULT abap_false
RETURNING
VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
RAISING
zcx_abapgit_exception .
METHODS constructor
IMPORTING
!is_key TYPE zif_abapgit_persistence=>ty_content
!iv_edit_mode TYPE abap_bool DEFAULT abap_false
RAISING
zcx_abapgit_exception .
PROTECTED SECTION.
PRIVATE SECTION.
CONSTANTS:
BEGIN OF c_action,
update TYPE string VALUE 'update',
switch_mode TYPE string VALUE 'switch_mode',
END OF c_action .
CONSTANTS c_edit_form_id TYPE string VALUE `db_form`.
CONSTANTS c_css_url TYPE string VALUE 'css/page_db_entry.css'.
DATA ms_key TYPE zif_abapgit_persistence=>ty_content.
DATA mv_edit_mode TYPE abap_bool.
METHODS register_stylesheet
RAISING
zcx_abapgit_exception.
METHODS render_view
IMPORTING
iv_raw_db_value TYPE zif_abapgit_persistence=>ty_content-data_str
ii_html TYPE REF TO zif_abapgit_html
RAISING
zcx_abapgit_exception.
METHODS render_edit
IMPORTING
iv_raw_db_value TYPE zif_abapgit_persistence=>ty_content-data_str
ii_html TYPE REF TO zif_abapgit_html
RAISING
zcx_abapgit_exception.
METHODS render_header
IMPORTING
ii_html TYPE REF TO zif_abapgit_html
io_toolbar TYPE REF TO zcl_abapgit_html_toolbar.
METHODS build_toolbar
RETURNING
VALUE(ro_toolbar) TYPE REF TO zcl_abapgit_html_toolbar.
CLASS-METHODS render_entry_tag
IMPORTING
is_key TYPE zif_abapgit_persistence=>ty_content
RETURNING
VALUE(rv_html) TYPE string.
CLASS-METHODS dbcontent_decode
IMPORTING
io_form_data TYPE REF TO zcl_abapgit_string_map
RETURNING
VALUE(rs_content) TYPE zif_abapgit_persistence=>ty_content
RAISING
zcx_abapgit_exception .
CLASS-METHODS do_update
IMPORTING
is_content TYPE zif_abapgit_persistence=>ty_content
RAISING
zcx_abapgit_exception .
ENDCLASS.
CLASS ZCL_ABAPGIT_GUI_PAGE_DB_ENTRY IMPLEMENTATION.
METHOD build_toolbar.
CREATE OBJECT ro_toolbar.
IF mv_edit_mode = abap_true.
ro_toolbar->add(
iv_act = |submitFormById('{ c_edit_form_id }');|
iv_txt = 'Save'
iv_typ = zif_abapgit_html=>c_action_type-onclick
iv_opt = zif_abapgit_html=>c_html_opt-strong ).
ELSE.
ro_toolbar->add(
iv_act = |{ c_action-switch_mode }|
iv_txt = 'Edit' ).
ENDIF.
ENDMETHOD.
METHOD constructor.
super->constructor( ).
register_stylesheet( ).
mv_edit_mode = iv_edit_mode.
ms_key = is_key.
ENDMETHOD.
METHOD create.
DATA lo_component TYPE REF TO zcl_abapgit_gui_page_db_entry.
CREATE OBJECT lo_component
EXPORTING
iv_edit_mode = iv_edit_mode
is_key = is_key.
ri_page = zcl_abapgit_gui_page_hoc=>create(
iv_extra_css_url = c_css_url
ii_page_title_provider = lo_component
ii_child_component = lo_component ).
ENDMETHOD.
METHOD dbcontent_decode.
rs_content-type = io_form_data->get( 'TYPE' ).
rs_content-value = io_form_data->get( 'VALUE' ).
rs_content-data_str = io_form_data->get( 'XMLDATA' ).
IF rs_content-data_str(1) <> '<' AND rs_content-data_str+1(1) = '<'. " Hmmm ???
rs_content-data_str = rs_content-data_str+1.
ENDIF.
ENDMETHOD.
METHOD do_update.
ASSERT is_content-type IS NOT INITIAL.
zcl_abapgit_persistence_db=>get_instance( )->update(
iv_type = is_content-type
iv_value = is_content-value
iv_data = is_content-data_str ).
COMMIT WORK.
ENDMETHOD.
METHOD register_stylesheet.
DATA lo_buf TYPE REF TO zcl_abapgit_string_buffer.
CREATE OBJECT lo_buf.
" @@abapmerge include zabapgit_css_page_db_entry.w3mi.data.css > lo_buf->add( '$$' ).
gui_services( )->register_page_asset(
iv_url = c_css_url
iv_type = 'text/css'
iv_mime_name = 'ZABAPGIT_CSS_PAGE_DB_ENTRY'
iv_inline = lo_buf->join_w_newline_and_flush( ) ).
ENDMETHOD.
METHOD render_edit.
DATA lv_formatted TYPE string.
lv_formatted = escape(
val = zcl_abapgit_xml_pretty=>print( iv_raw_db_value )
format = cl_abap_format=>e_html_attr ).
" Form
ii_html->add( |<form id="{ c_edit_form_id }" method="post" action="sapevent:{ c_action-update }">| ).
ii_html->add( |<input type="hidden" name="type" value="{ ms_key-type }">| ).
ii_html->add( |<input type="hidden" name="value" value="{ ms_key-value }">| ).
ii_html->add( |<textarea rows="20" cols="100" name="xmldata">{ lv_formatted }</textarea>| ).
ii_html->add( '</form>' ).
ENDMETHOD.
METHOD render_entry_tag.
rv_html =
|<dl class="entry-tag">| &&
|<div><dt>Type</dt><dd>{ is_key-type }</dd></div>| &&
|<div><dt>Key</dt><dd>{ is_key-value }</dd></div>| &&
|</dl>|.
ENDMETHOD.
METHOD render_header.
ii_html->add( '<div class="toolbar">' ).
ii_html->add( io_toolbar->render( iv_right = abap_true ) ).
ii_html->add( render_entry_tag( ms_key ) ).
ii_html->add( '</div>' ).
ENDMETHOD.
METHOD render_view.
DATA lo_highlighter TYPE REF TO zcl_abapgit_syntax_highlighter.
DATA lv_formatted TYPE string.
" Create syntax highlighter
lo_highlighter = zcl_abapgit_syntax_factory=>create( '*.xml' ).
lv_formatted = lo_highlighter->process_line( zcl_abapgit_xml_pretty=>print( iv_raw_db_value ) ).
ii_html->add( |<pre class="syntax-hl">{ lv_formatted }</pre>| ).
ENDMETHOD.
METHOD zif_abapgit_gui_event_handler~on_event.
CASE ii_event->mv_action.
WHEN c_action-switch_mode.
mv_edit_mode = boolc( mv_edit_mode = abap_false ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
WHEN c_action-update.
do_update( dbcontent_decode( ii_event->form_data( ) ) ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
ENDCASE.
ENDMETHOD.
METHOD zif_abapgit_gui_page_title~get_page_title.
IF mv_edit_mode = abap_true.
rv_title = 'Config Edit'.
ELSE.
rv_title = 'Config Display'.
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_gui_renderable~render.
DATA lv_raw_db_value TYPE zif_abapgit_persistence=>ty_content-data_str.
register_handlers( ).
TRY.
lv_raw_db_value = zcl_abapgit_persistence_db=>get_instance( )->read(
iv_type = ms_key-type
iv_value = ms_key-value ).
CATCH zcx_abapgit_not_found ##NO_HANDLER.
ENDTRY.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
ri_html->add( '<div class="db-entry">' ).
render_header(
ii_html = ri_html
io_toolbar = build_toolbar( ) ).
IF mv_edit_mode = abap_true.
zcl_abapgit_persistence_db=>get_instance( )->lock(
iv_type = ms_key-type
iv_value = ms_key-value ).
render_edit(
iv_raw_db_value = lv_raw_db_value
ii_html = ri_html ).
ELSE.
render_view(
iv_raw_db_value = lv_raw_db_value
ii_html = ri_html ).
ENDIF.
ri_html->add( '</div>' ).
ENDMETHOD.
ENDCLASS.

View File

@ -3,7 +3,7 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_GUI_PAGE_DB_DIS</CLSNAME>
<CLSNAME>ZCL_ABAPGIT_GUI_PAGE_DB_ENTRY</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - GUI Database Display</DESCRIPT>
<STATE>1</STATE>

View File

@ -9,9 +9,12 @@ CLASS zcl_abapgit_gui_page_hoc DEFINITION
CLASS-METHODS create
IMPORTING
!ii_child_component TYPE REF TO zif_abapgit_gui_renderable
!iv_page_title TYPE string
!iv_page_title TYPE string OPTIONAL
!io_page_menu TYPE REF TO zcl_abapgit_html_toolbar OPTIONAL
!ii_page_menu_provider TYPE REF TO zif_abapgit_gui_menu_provider OPTIONAL
!ii_page_title_provider TYPE REF TO zif_abapgit_gui_page_title OPTIONAL
!iv_extra_css_url TYPE string OPTIONAL
!iv_extra_js_url TYPE string OPTIONAL
RETURNING
VALUE(ri_page_wrap) TYPE REF TO zif_abapgit_gui_renderable
RAISING
@ -36,10 +39,13 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_HOC IMPLEMENTATION.
DATA lo_page TYPE REF TO zcl_abapgit_gui_page_hoc.
CREATE OBJECT lo_page.
lo_page->ms_control-page_title = iv_page_title.
lo_page->ms_control-page_menu = io_page_menu.
lo_page->ms_control-page_menu_provider = ii_page_menu_provider.
lo_page->mi_child = ii_child_component.
lo_page->ms_control-page_title = iv_page_title.
lo_page->ms_control-page_menu = io_page_menu.
lo_page->ms_control-page_menu_provider = ii_page_menu_provider.
lo_page->ms_control-page_title_provider = ii_page_title_provider.
lo_page->ms_control-extra_css_url = iv_extra_css_url.
lo_page->ms_control-extra_js_url = iv_extra_js_url.
lo_page->mi_child = ii_child_component.
ri_page_wrap = lo_page.

View File

@ -112,11 +112,6 @@ CLASS zcl_abapgit_gui_router DEFINITION
!ii_event TYPE REF TO zif_abapgit_gui_event
RETURNING
VALUE(rv_state) TYPE i .
METHODS get_state_db_edit
IMPORTING
ii_event TYPE REF TO zif_abapgit_gui_event
RETURNING
VALUE(rv_state) TYPE i .
METHODS main_page
RETURNING VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
RAISING zcx_abapgit_exception.
@ -124,7 +119,7 @@ ENDCLASS.
CLASS zcl_abapgit_gui_router IMPLEMENTATION.
CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
METHOD abapgit_services_actions.
@ -153,15 +148,13 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION.
CASE ii_event->mv_action.
WHEN zif_abapgit_definitions=>c_action-db_edit.
lo_query->to_abap( CHANGING cs_container = ls_db_key ).
CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_db_edit
EXPORTING
is_key = ls_db_key.
rs_handled-state = get_state_db_edit( ii_event ).
rs_handled-page = zcl_abapgit_gui_page_db_entry=>create(
is_key = ls_db_key
iv_edit_mode = abap_true ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
WHEN zif_abapgit_definitions=>c_action-db_display.
lo_query->to_abap( CHANGING cs_container = ls_db_key ).
CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_db_dis
EXPORTING
is_key = ls_db_key.
rs_handled-page = zcl_abapgit_gui_page_db_entry=>create( ls_db_key ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
ENDCASE.
@ -216,7 +209,7 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION.
rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
ENDIF.
WHEN zif_abapgit_definitions=>c_action-go_db. " Go DB util page
CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_db.
rs_handled-page = zcl_abapgit_gui_page_db=>create( ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
WHEN zif_abapgit_definitions=>c_action-go_debuginfo. " Go debug info
rs_handled-page = zcl_abapgit_gui_page_debuginfo=>create( ).
@ -397,18 +390,6 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION.
ENDMETHOD.
METHOD get_state_db_edit.
" In display mode, replace the page
IF ii_event->mv_current_page_name = 'ZCL_ABAPGIT_GUI_PAGE_DB_DIS'.
rv_state = zcl_abapgit_gui=>c_event_state-new_page_replacing.
ELSE.
rv_state = zcl_abapgit_gui=>c_event_state-new_page.
ENDIF.
ENDMETHOD.
METHOD get_state_diff.
" Bookmark current page before jumping to diff page

View File

@ -614,46 +614,7 @@ div.debug_container p {
margin: 0px;
}
/* DB ENTRIES */
div.db_list {
padding: 0.5em;
overflow-x: auto;
}
table.db_tab {
table-layout: fixed;
}
table.db_tab pre {
display: inline-block;
overflow: hidden;
word-wrap:break-word;
white-space: pre-wrap;
margin: 0px;
width: 30em;
}
table.db_tab tr.firstrow td { padding-top: 0.5em; }
table.db_tab th {
text-align: left;
padding: 0.5em;
}
table.db_tab thead tr {
border-bottom: 1px solid;
}
table.db_tab tfoot tr {
border-top: 1px solid;
}
table.db_tab td {
padding: 4px 8px;
vertical-align: middle;
word-break: break-all;
}
table.db_tab th.package {
width: 45ch;
}
table.db_tab td.data {
font-style: italic;
}
/* *** */
li.action_link.enabled{
visibility: visible;
@ -667,41 +628,6 @@ li.action_link:not(enabled){
display: none;
}
/* DB ENTRY DISPLAY */
div.db_entry {
padding: 0.5em;
}
div.db_entry pre {
display: block;
font-size: 10pt;
overflow: hidden;
word-wrap:break-word;
white-space: pre-wrap;
border: 1px solid;
border-radius: 3px;
padding: 0.5em;
margin: 0.5em 0em;
width: 98%;
}
div.db_entry textarea {
margin: 0.5em 0em;
width: 98%;
}
div.db_entry table.toolbar {
width: 100%;
}
table.tag {
display: inline-block;
border: 1px solid;
border-radius: 3px;
margin-right: 0.5em;
}
table.tag td { padding: 0.2em 0.5em; }
/* TUTORIAL */
div.tutorial {

View File

@ -344,44 +344,6 @@ div.debug_container {
.repo-overview tbody tr:hover td { background-color: hsla(214, 50%, 50%, 0.05); }
.repo-overview tbody tr.selected { background-color: hsla(214, 50%, 75%, 0.33); }
/* DB ENTRIES */
div.db_list { background-color: #fff; }
table.db_tab td { color: #333; }
table.db_tab td.data { color: #888; }
table.db_tab tbody tr:hover td {
background-image: linear-gradient(rgba(0, 0, 0, 0.075), rgba(0, 0, 0, 0.075));
}
table.db_tab tbody tr:active td {
background-color: #f4f4f4;
}
table.db_tab th {
color: var(--theme-link-color);
}
table.db_tab thead tr,
table.db_tab tfoot tr {
border-color: #ddd;
}
table.db_tab a.remote_repo {
color: var(--theme-primary-font-color-reduced);
}
table.db_tab a.remote_repo:hover { color: var(--theme-link-color); }
/* DB ENTRY DISPLAY */
div.db_entry {
background-color: var(--theme-container-background-color);
}
div.db_entry pre {
background-color: #fcfcfc;
border-color: #eaeaea;
}
table.tag {
border-color: #b3c1cc;
background-color: #eee;
}
table.tag td.label { background-color: #b3c1cc; }
/* TUTORIAL */
div.tutorial { background-color: var(--theme-container-background-color); }

View File

@ -48,12 +48,12 @@ ENDCLASS.
CLASS zcl_abapgit_ui_factory IMPLEMENTATION.
CLASS ZCL_ABAPGIT_UI_FACTORY IMPLEMENTATION.
METHOD get_asset_manager.
DATA lo_buf TYPE REF TO lcl_string_buffer.
DATA lo_buf TYPE REF TO zcl_abapgit_string_buffer.
DATA lo_asset_man TYPE REF TO zcl_abapgit_gui_asset_manager.
CREATE OBJECT lo_buf.

View File

@ -22,5 +22,7 @@ CLASS lcl_gui_services_dummy IMPLEMENTATION.
ENDMETHOD.
METHOD zif_abapgit_gui_services~get_log.
ENDMETHOD.
METHOD zif_abapgit_gui_services~register_page_asset.
ENDMETHOD.
ENDCLASS.

View File

@ -1,6 +1,9 @@
CLASS lcl_string_buffer DEFINITION FINAL.
CLASS zcl_abapgit_string_buffer DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
DATA mt_buffer TYPE string_table READ-ONLY.
METHODS add
IMPORTING
iv_str TYPE string.
@ -10,19 +13,32 @@ CLASS lcl_string_buffer DEFINITION FINAL.
METHODS join_w_newline_and_flush
RETURNING
VALUE(rv_str) TYPE string.
PROTECTED SECTION.
PRIVATE SECTION.
DATA mt_buffer TYPE string_table.
ENDCLASS.
CLASS lcl_string_buffer IMPLEMENTATION.
CLASS ZCL_ABAPGIT_STRING_BUFFER IMPLEMENTATION.
METHOD add.
APPEND iv_str TO mt_buffer.
ENDMETHOD.
METHOD join_and_flush.
rv_str = concat_lines_of( table = mt_buffer ).
CLEAR mt_buffer.
ENDMETHOD.
METHOD join_w_newline_and_flush.
rv_str = concat_lines_of( table = mt_buffer
sep = cl_abap_char_utilities=>newline ).
rv_str = concat_lines_of(
table = mt_buffer
sep = cl_abap_char_utilities=>newline ).
CLEAR mt_buffer.
ENDMETHOD.
ENDCLASS.

View File

@ -3,9 +3,9 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_GUI_PAGE_DB_EDIT</CLSNAME>
<CLSNAME>ZCL_ABAPGIT_STRING_BUFFER</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - GUI Database Edit</DESCRIPT>
<DESCRIPT>abapGit - String Buffer</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>