mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-01 12:20:51 +08:00
html event abstraction, phase 3 - query (#3903)
* event->query * page db refactoring * linter fix * linter fix * address repo via key= param * linter * mv_getdata WIP * mv_getdata - finish * cleanup action utils * linter fix * another linter fix * docs for event->query
This commit is contained in:
parent
1f3abfd8ec
commit
e95b6f7806
|
@ -98,7 +98,15 @@ Currently 2 collections are supported out of the box - scripts and hidden_forms
|
|||
|
||||
## Router and event handlers
|
||||
|
||||
To process sapevents in abap the component (page) must implement `ZIF_ABAPGIT_GUI_EVENT_HANDLER=>on_event`. It has the same importing params as `sapevent` handler of `cl_gui_html_viewer`, please refer SAP official documentation for param meaning and detail. For the exporting params see below.
|
||||
To process sapevents in abap the component (page) must implement `ZIF_ABAPGIT_GUI_EVENT_HANDLER=>on_event`. It imports `ii_event` instance which represents `sapevent` handler of `cl_gui_html_viewer`. In particular:
|
||||
- `ii_event->mv_action` - sapevent code (part of url before `?`)
|
||||
- `ii_event->mv_getdata` - raw url query (part of url after `?`)
|
||||
- `ii_event->mt_postdata` - raw post data (if present)
|
||||
- `ii_event->mi_gui_services` - instance of GUI services for easier access
|
||||
- `ii_event->query()` - returns parsed url query (`k1=v1&k2=v2...`) in form of `string_map`. Param names are upper cased (by default). Params that are not uniform are not parsed (`k1=v1&k2` - will result in `k1` only). Params can be addressed in 2 typical ways:
|
||||
- `ii_event->query( )->get( 'XXX' )`
|
||||
- or `ii_event->query( )->to_abap( changing cs_container = ls_struc_with_fields )`
|
||||
- query string_map is immutable (attempt to `set` will raise an exception)
|
||||
|
||||
Events can be processed on 2 levels - in page/component **or** in the router. On new event:
|
||||
- the GUI goes through event handlers stack - list of components that registered themselves as event handlers during rendering via `gui_services`
|
||||
|
@ -108,7 +116,7 @@ Events can be processed on 2 levels - in page/component **or** in the router. On
|
|||
|
||||
Router (`ZCL_ABAPGIT_GUI_ROUTER`) is the class which handle global abapGit commands like opening specific pages and actions like repo installation/deletion.
|
||||
|
||||
In order to indicate the result of event handling an `on_event` implementation must return `ev_state` (element of `zcl_abapgit_gui=>c_event_state`) and, optionally, `ei_page`:
|
||||
In order to indicate the result of event handling an `on_event` implementation must return `rs_handled-state` (element of `zcl_abapgit_gui=>c_event_state`) and, optionally, `rs_handled-page`:
|
||||
|
||||
- `not_handled` (same as `initial`) - event was not handled, process by next handler (e.g. the router)
|
||||
- `re_render` - just re-render the current page (probably internal state of the page object was changed so the visualization should too)
|
||||
|
|
|
@ -5,17 +5,27 @@ CLASS zcl_abapgit_gui_event DEFINITION
|
|||
|
||||
PUBLIC SECTION.
|
||||
|
||||
INTERFACES zif_abapgit_gui_event.
|
||||
INTERFACES zif_abapgit_gui_event .
|
||||
|
||||
METHODS constructor
|
||||
IMPORTING
|
||||
ii_gui_services TYPE REF TO zif_abapgit_gui_services
|
||||
iv_action TYPE clike
|
||||
iv_getdata TYPE clike OPTIONAL
|
||||
it_postdata TYPE cnht_post_data_tab OPTIONAL.
|
||||
|
||||
!ii_gui_services TYPE REF TO zif_abapgit_gui_services OPTIONAL
|
||||
!iv_action TYPE clike
|
||||
!iv_getdata TYPE clike OPTIONAL
|
||||
!it_postdata TYPE cnht_post_data_tab OPTIONAL .
|
||||
PROTECTED SECTION.
|
||||
PRIVATE SECTION.
|
||||
DATA mo_query TYPE REF TO zcl_abapgit_string_map.
|
||||
DATA mo_query_upper_cased TYPE REF TO zcl_abapgit_string_map.
|
||||
|
||||
METHODS fields_to_map
|
||||
IMPORTING
|
||||
it_fields TYPE tihttpnvp
|
||||
RETURNING
|
||||
VALUE(ro_string_map) TYPE REF TO zcl_abapgit_string_map
|
||||
RAISING
|
||||
zcx_abapgit_exception.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
|
@ -31,4 +41,39 @@ CLASS ZCL_ABAPGIT_GUI_EVENT IMPLEMENTATION.
|
|||
zif_abapgit_gui_event~mt_postdata = it_postdata.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD fields_to_map.
|
||||
FIELD-SYMBOLS <ls_field> LIKE LINE OF it_fields.
|
||||
|
||||
CREATE OBJECT ro_string_map.
|
||||
LOOP AT it_fields ASSIGNING <ls_field>.
|
||||
ro_string_map->set(
|
||||
iv_key = <ls_field>-name
|
||||
iv_val = <ls_field>-value ).
|
||||
ENDLOOP.
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD zif_abapgit_gui_event~query.
|
||||
|
||||
DATA lt_fields TYPE tihttpnvp.
|
||||
|
||||
IF iv_upper_cased = abap_true.
|
||||
IF mo_query_upper_cased IS NOT BOUND.
|
||||
mo_query_upper_cased = fields_to_map(
|
||||
zcl_abapgit_html_action_utils=>parse_fields_upper_case_name( zif_abapgit_gui_event~mv_getdata ) ).
|
||||
mo_query_upper_cased->freeze( ).
|
||||
ENDIF.
|
||||
ro_string_map = mo_query_upper_cased.
|
||||
ELSE.
|
||||
IF mo_query IS NOT BOUND.
|
||||
mo_query = fields_to_map(
|
||||
zcl_abapgit_html_action_utils=>parse_fields( zif_abapgit_gui_event~mv_getdata ) ).
|
||||
mo_query->freeze( ).
|
||||
ENDIF.
|
||||
ro_string_map = mo_query.
|
||||
ENDIF.
|
||||
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
|
|
71
src/ui/core/zcl_abapgit_gui_event.clas.testclasses.abap
Normal file
71
src/ui/core/zcl_abapgit_gui_event.clas.testclasses.abap
Normal file
|
@ -0,0 +1,71 @@
|
|||
CLASS ltcl_event DEFINITION
|
||||
FOR TESTING
|
||||
RISK LEVEL HARMLESS
|
||||
DURATION SHORT
|
||||
FINAL.
|
||||
|
||||
PRIVATE SECTION.
|
||||
|
||||
METHODS query FOR TESTING RAISING zcx_abapgit_exception.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
CLASS ltcl_event IMPLEMENTATION.
|
||||
|
||||
METHOD query.
|
||||
|
||||
DATA li_cut TYPE REF TO zif_abapgit_gui_event.
|
||||
DATA lo_map TYPE REF TO zcl_abapgit_string_map.
|
||||
DATA lo_x TYPE REF TO zcx_abapgit_exception.
|
||||
|
||||
CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event
|
||||
EXPORTING
|
||||
iv_action = 'XXX'
|
||||
iv_getdata = 'not_a_param'.
|
||||
|
||||
lo_map = li_cut->query( ).
|
||||
cl_abap_unit_assert=>assert_equals(
|
||||
act = lo_map->size( )
|
||||
exp = 0 ).
|
||||
|
||||
CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event
|
||||
EXPORTING
|
||||
iv_action = 'XXX'
|
||||
iv_getdata = 'a=b&b=c'.
|
||||
|
||||
lo_map = li_cut->query( ).
|
||||
cl_abap_unit_assert=>assert_equals(
|
||||
act = lo_map->size( )
|
||||
exp = 2 ).
|
||||
cl_abap_unit_assert=>assert_equals(
|
||||
act = lo_map->get( 'a' )
|
||||
exp = 'b' ).
|
||||
cl_abap_unit_assert=>assert_equals(
|
||||
act = lo_map->get( 'b' )
|
||||
exp = 'c' ).
|
||||
|
||||
lo_map = li_cut->query( iv_upper_cased = abap_true ).
|
||||
cl_abap_unit_assert=>assert_equals(
|
||||
act = lo_map->size( )
|
||||
exp = 2 ).
|
||||
cl_abap_unit_assert=>assert_equals(
|
||||
act = lo_map->get( 'A' )
|
||||
exp = 'b' ).
|
||||
cl_abap_unit_assert=>assert_equals(
|
||||
act = lo_map->get( 'B' )
|
||||
exp = 'c' ).
|
||||
|
||||
TRY.
|
||||
lo_map->set(
|
||||
iv_key = 'x'
|
||||
iv_val = 'y' ).
|
||||
cl_abap_unit_assert=>fail( ).
|
||||
CATCH zcx_abapgit_exception INTO lo_x.
|
||||
cl_abap_unit_assert=>assert_char_cp(
|
||||
act = lo_x->get_text( )
|
||||
exp = '*immutable*' ).
|
||||
ENDTRY.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
|
@ -10,6 +10,7 @@
|
|||
<CLSCCINCL>X</CLSCCINCL>
|
||||
<FIXPT>X</FIXPT>
|
||||
<UNICODE>X</UNICODE>
|
||||
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
|
||||
</VSEOCLASS>
|
||||
</asx:values>
|
||||
</asx:abap>
|
||||
|
|
|
@ -6,4 +6,12 @@ INTERFACE zif_abapgit_gui_event
|
|||
DATA mt_postdata TYPE cnht_post_data_tab READ-ONLY.
|
||||
DATA mi_gui_services TYPE REF TO zif_abapgit_gui_services READ-ONLY.
|
||||
|
||||
METHODS query
|
||||
IMPORTING
|
||||
iv_upper_cased TYPE abap_bool DEFAULT abap_true
|
||||
RETURNING
|
||||
VALUE(ro_string_map) TYPE REF TO zcl_abapgit_string_map
|
||||
RAISING
|
||||
zcx_abapgit_exception.
|
||||
|
||||
ENDINTERFACE.
|
||||
|
|
|
@ -196,7 +196,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DB IMPLEMENTATION.
|
|||
|
||||
CASE ii_event->mv_action.
|
||||
WHEN c_action-delete.
|
||||
ls_db = zcl_abapgit_html_action_utils=>dbkey_decode( ii_event->mv_getdata ).
|
||||
ii_event->query( )->to_abap( CHANGING cs_container = ls_db ).
|
||||
delete( ls_db ).
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
|
||||
WHEN OTHERS.
|
||||
|
|
|
@ -2003,7 +2003,7 @@ function createRepoCatalogEnumerator(catalog, action) {
|
|||
return function() {
|
||||
return catalog.map(function(i) {
|
||||
return {
|
||||
action: action + "?" + i.key,
|
||||
action: action + "?key=" + i.key,
|
||||
iconClass: i.isOffline
|
||||
? "icon icon-plug darkgrey"
|
||||
: "icon icon-cloud-upload-alt blue",
|
||||
|
|
|
@ -62,16 +62,6 @@ CLASS zcl_abapgit_gui_chunk_lib DEFINITION
|
|||
!ix_error TYPE REF TO zcx_abapgit_exception
|
||||
RETURNING
|
||||
VALUE(ri_html) TYPE REF TO zif_abapgit_html .
|
||||
CLASS-METHODS parse_change_order_by
|
||||
IMPORTING
|
||||
!iv_query_str TYPE clike
|
||||
RETURNING
|
||||
VALUE(rv_order_by) TYPE string .
|
||||
CLASS-METHODS parse_direction
|
||||
IMPORTING
|
||||
!iv_query_str TYPE clike
|
||||
RETURNING
|
||||
VALUE(rv_order_descending) TYPE abap_bool .
|
||||
CLASS-METHODS render_order_by_header_cells
|
||||
IMPORTING
|
||||
!it_col_spec TYPE zif_abapgit_definitions=>tty_col_spec
|
||||
|
@ -248,30 +238,6 @@ CLASS ZCL_ABAPGIT_GUI_CHUNK_LIB IMPLEMENTATION.
|
|||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD parse_change_order_by.
|
||||
|
||||
FIND FIRST OCCURRENCE OF REGEX `orderBy=(.*)`
|
||||
IN iv_query_str
|
||||
SUBMATCHES rv_order_by.
|
||||
|
||||
rv_order_by = condense( rv_order_by ).
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD parse_direction.
|
||||
|
||||
DATA: lv_direction TYPE string.
|
||||
|
||||
FIND FIRST OCCURRENCE OF REGEX `direction=(.*)`
|
||||
IN iv_query_str
|
||||
SUBMATCHES lv_direction.
|
||||
|
||||
rv_order_descending = boolc( condense( lv_direction ) = 'DESCENDING' ).
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD render_branch_span.
|
||||
|
||||
DATA: lv_text TYPE string,
|
||||
|
@ -290,7 +256,7 @@ CLASS ZCL_ABAPGIT_GUI_CHUNK_LIB IMPLEMENTATION.
|
|||
ri_html->add_icon( iv_name = 'code-branch/grey70'
|
||||
iv_hint = 'Current branch' ).
|
||||
IF iv_interactive = abap_true.
|
||||
ri_html->add_a( iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_switch }?{ io_repo->get_key( ) }|
|
||||
ri_html->add_a( iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_switch }?key={ io_repo->get_key( ) }|
|
||||
iv_txt = lv_text ).
|
||||
ELSE.
|
||||
ri_html->add( lv_text ).
|
||||
|
@ -709,7 +675,7 @@ CLASS ZCL_ABAPGIT_GUI_CHUNK_LIB IMPLEMENTATION.
|
|||
lo_repo_online ?= io_repo.
|
||||
|
||||
ri_html->add_a( iv_txt = lo_repo_online->get_url( )
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-url }?|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-url }?url=|
|
||||
&& |{ lo_repo_online->get_url( ) }|
|
||||
iv_class = |url| ).
|
||||
|
||||
|
@ -749,7 +715,7 @@ CLASS ZCL_ABAPGIT_GUI_CHUNK_LIB IMPLEMENTATION.
|
|||
ELSE.
|
||||
lv_icon = 'star/grey'.
|
||||
ENDIF.
|
||||
ri_html->add_a( iv_act = |{ zif_abapgit_definitions=>c_action-repo_toggle_fav }?{ io_repo->get_key( ) }|
|
||||
ri_html->add_a( iv_act = |{ zif_abapgit_definitions=>c_action-repo_toggle_fav }?key={ io_repo->get_key( ) }|
|
||||
iv_txt = ri_html->icon( iv_name = lv_icon
|
||||
iv_class = 'pad-sides'
|
||||
iv_hint = 'Click to toggle favorite' ) ).
|
||||
|
@ -820,7 +786,7 @@ CLASS ZCL_ABAPGIT_GUI_CHUNK_LIB IMPLEMENTATION.
|
|||
lv_display_url = io_repo_online->get_commit_display_url( lv_commit_hash ).
|
||||
|
||||
ii_html->add_a( iv_txt = |{ lv_icon_commit }{ lv_commit_short_hash }|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-url }?{ lv_display_url }|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-url }?url={ lv_display_url }|
|
||||
iv_class = |url| ).
|
||||
CATCH zcx_abapgit_exception.
|
||||
ii_html->add( |<span class="url">{ lv_icon_commit }{ lv_commit_short_hash }</span>| ).
|
||||
|
|
|
@ -307,9 +307,12 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_BKG IMPLEMENTATION.
|
|||
|
||||
METHOD zif_abapgit_gui_event_handler~on_event.
|
||||
|
||||
DATA ls_fields TYPE zcl_abapgit_persist_background=>ty_background.
|
||||
|
||||
CASE ii_event->mv_action.
|
||||
WHEN zif_abapgit_definitions=>c_action-bg_update.
|
||||
update( decode( ii_event->mv_getdata ) ).
|
||||
ls_fields = decode( ii_event->mv_getdata ).
|
||||
update( ls_fields ).
|
||||
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 ).
|
||||
|
|
|
@ -31,11 +31,6 @@ CLASS zcl_abapgit_gui_page_main DEFINITION
|
|||
METHODS build_main_menu
|
||||
RETURNING VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar.
|
||||
|
||||
METHODS get_patch_page
|
||||
IMPORTING iv_getdata TYPE clike
|
||||
RETURNING VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
|
||||
RAISING zcx_abapgit_exception.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
|
@ -73,26 +68,6 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION.
|
|||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD get_patch_page.
|
||||
|
||||
DATA lv_key TYPE zif_abapgit_persistence=>ty_value.
|
||||
|
||||
FIND FIRST OCCURRENCE OF '=' IN iv_getdata.
|
||||
IF sy-subrc <> 0. " Not found ? -> just repo key in params
|
||||
lv_key = iv_getdata.
|
||||
ELSE.
|
||||
zcl_abapgit_html_action_utils=>stage_decode(
|
||||
EXPORTING iv_getdata = iv_getdata
|
||||
IMPORTING ev_key = lv_key ).
|
||||
ENDIF.
|
||||
|
||||
CREATE OBJECT ri_page TYPE zcl_abapgit_gui_page_patch
|
||||
EXPORTING
|
||||
iv_key = lv_key.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD render_content.
|
||||
|
||||
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
|
||||
|
@ -119,7 +94,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION.
|
|||
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
|
||||
WHEN c_actions-select.
|
||||
|
||||
lv_key = ii_event->mv_getdata.
|
||||
lv_key = ii_event->query( iv_upper_cased = abap_true )->get( 'KEY' ).
|
||||
zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lv_key ).
|
||||
|
||||
TRY.
|
||||
|
@ -135,12 +110,13 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION.
|
|||
|
||||
WHEN zif_abapgit_definitions=>c_action-change_order_by.
|
||||
|
||||
mo_repo_overview->set_order_by( zcl_abapgit_gui_chunk_lib=>parse_change_order_by( ii_event->mv_getdata ) ).
|
||||
mo_repo_overview->set_order_by( ii_event->query( )->get( 'ORDERBY' ) ).
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
|
||||
|
||||
WHEN zif_abapgit_definitions=>c_action-direction.
|
||||
|
||||
mo_repo_overview->set_order_direction( zcl_abapgit_gui_chunk_lib=>parse_direction( ii_event->mv_getdata ) ).
|
||||
mo_repo_overview->set_order_direction(
|
||||
boolc( ii_event->query( )->get( 'DIRECTION' ) = 'DESCENDING' ) ).
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
|
||||
|
||||
WHEN c_actions-apply_filter.
|
||||
|
@ -150,12 +126,15 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION.
|
|||
|
||||
WHEN zif_abapgit_definitions=>c_action-go_patch.
|
||||
|
||||
rs_handled-page = get_patch_page( ii_event->mv_getdata ).
|
||||
lv_key = ii_event->query( )->get( 'KEY' ).
|
||||
CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_patch
|
||||
EXPORTING
|
||||
iv_key = lv_key.
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
|
||||
|
||||
WHEN zif_abapgit_definitions=>c_action-repo_settings.
|
||||
|
||||
lv_key = ii_event->mv_getdata.
|
||||
lv_key = ii_event->query( iv_upper_cased = abap_true )->get( 'KEY' ).
|
||||
CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_repo_sett
|
||||
EXPORTING
|
||||
io_repo = zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
|
||||
|
|
|
@ -383,7 +383,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION.
|
|||
IF iv_transport IS NOT INITIAL.
|
||||
lv_transport_html = ri_html->a(
|
||||
iv_txt = lv_transport_string
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-jump_transport }?{ iv_transport }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-jump_transport }?transport={ iv_transport }| ).
|
||||
ENDIF.
|
||||
ri_html->add( |<td class="type">{ is_item-obj_type }</td>| ).
|
||||
ri_html->add( |<td class="name">{ lv_filename }</td>| ).
|
||||
|
|
|
@ -251,59 +251,61 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_VIEW_REPO IMPLEMENTATION.
|
|||
|
||||
IF iv_rstate IS NOT INITIAL OR iv_lstate IS NOT INITIAL. " In case of asyncronicities
|
||||
ro_advanced_dropdown->add( iv_txt = 'Reset Local (Force Pull)'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_reset }?{ mv_key }|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_reset }?key={ mv_key }|
|
||||
iv_opt = iv_wp_opt ).
|
||||
ENDIF.
|
||||
|
||||
IF mo_repo->is_offline( ) = abap_false. " Online ?
|
||||
ro_advanced_dropdown->add( iv_txt = 'Background Mode'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-go_background }?{ mv_key }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-go_background }?key={ mv_key }| ).
|
||||
ro_advanced_dropdown->add( iv_txt = 'Change Remote'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_remote_change }?{ mv_key }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_remote_change }?key={ mv_key }| ).
|
||||
ro_advanced_dropdown->add( iv_txt = 'Make Off-line'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_remote_detach }?{ mv_key }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_remote_detach }?key={ mv_key }| ).
|
||||
ro_advanced_dropdown->add( iv_txt = 'Force Stage'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-go_stage }?{ mv_key }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-go_stage }?key={ mv_key }| ).
|
||||
|
||||
CLEAR lv_crossout.
|
||||
IF zcl_abapgit_auth=>is_allowed( zif_abapgit_auth=>gc_authorization-transport_to_branch ) = abap_false.
|
||||
lv_crossout = zif_abapgit_html=>c_html_opt-crossout.
|
||||
ENDIF.
|
||||
ro_advanced_dropdown->add( iv_txt = 'Transport to Branch'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_transport_to_branch }?{ mv_key }|
|
||||
ro_advanced_dropdown->add(
|
||||
iv_txt = 'Transport to Branch'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_transport_to_branch }?key={ mv_key }|
|
||||
iv_opt = lv_crossout ).
|
||||
|
||||
ELSE.
|
||||
ro_advanced_dropdown->add( iv_txt = 'Make On-line'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_remote_attach }?{ mv_key }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_remote_attach }?key={ mv_key }| ).
|
||||
ENDIF.
|
||||
|
||||
IF mv_are_changes_recorded_in_tr = abap_true.
|
||||
ro_advanced_dropdown->add(
|
||||
iv_txt = 'Add all objects to transport request'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_add_all_obj_to_trans_req }?{ mv_key }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_add_all_obj_to_trans_req }?key={ mv_key }| ).
|
||||
ENDIF.
|
||||
|
||||
ro_advanced_dropdown->add( iv_txt = 'Syntax Check'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_syntax_check }?{ mv_key }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_syntax_check }?key={ mv_key }| ).
|
||||
ro_advanced_dropdown->add( iv_txt = 'Run Code Inspector'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_code_inspector }?{ mv_key }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_code_inspector }?key={ mv_key }| ).
|
||||
|
||||
CLEAR lv_crossout.
|
||||
IF zcl_abapgit_auth=>is_allowed( zif_abapgit_auth=>gc_authorization-update_local_checksum ) = abap_false.
|
||||
lv_crossout = zif_abapgit_html=>c_html_opt-crossout.
|
||||
ENDIF.
|
||||
ro_advanced_dropdown->add( iv_txt = 'Update Local Checksums'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_refresh_checksums }?{ mv_key }|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_refresh_checksums }?key={ mv_key }|
|
||||
iv_opt = lv_crossout ).
|
||||
|
||||
IF mo_repo->get_dot_abapgit( )->get_master_language( ) <> sy-langu.
|
||||
ro_advanced_dropdown->add( iv_txt = 'Open in Master Language'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_open_in_master_lang }?{ mv_key }| ).
|
||||
ro_advanced_dropdown->add(
|
||||
iv_txt = 'Open in Master Language'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_open_in_master_lang }?key={ mv_key }| ).
|
||||
ENDIF.
|
||||
|
||||
ro_advanced_dropdown->add( iv_txt = 'Remove'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_remove }?{ mv_key }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_remove }?key={ mv_key }| ).
|
||||
|
||||
CLEAR lv_crossout.
|
||||
IF mo_repo->get_local_settings( )-write_protected = abap_true
|
||||
|
@ -311,7 +313,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_VIEW_REPO IMPLEMENTATION.
|
|||
lv_crossout = zif_abapgit_html=>c_html_opt-crossout.
|
||||
ENDIF.
|
||||
ro_advanced_dropdown->add( iv_txt = 'Uninstall'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_purge }?{ mv_key }|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_purge }?key={ mv_key }|
|
||||
iv_opt = lv_crossout ).
|
||||
|
||||
ENDMETHOD.
|
||||
|
@ -328,14 +330,14 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_VIEW_REPO IMPLEMENTATION.
|
|||
ENDIF.
|
||||
|
||||
ro_branch_dropdown->add( iv_txt = 'Overview'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-go_branch_overview }?{ mv_key }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-go_branch_overview }?key={ mv_key }| ).
|
||||
ro_branch_dropdown->add( iv_txt = 'Switch'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_switch }?{ mv_key }|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_switch }?key={ mv_key }|
|
||||
iv_opt = iv_wp_opt ).
|
||||
ro_branch_dropdown->add( iv_txt = 'Create'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_create }?{ mv_key }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_create }?key={ mv_key }| ).
|
||||
ro_branch_dropdown->add( iv_txt = 'Delete'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_delete }?{ mv_key }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_delete }?key={ mv_key }| ).
|
||||
|
||||
lo_repo_online ?= mo_repo. " TODO refactor this disaster
|
||||
IF lo_repo_online->get_switched_origin( ) IS NOT INITIAL.
|
||||
|
@ -447,12 +449,12 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_VIEW_REPO IMPLEMENTATION.
|
|||
IF mo_repo->is_offline( ) = abap_false.
|
||||
IF iv_rstate IS NOT INITIAL. " Something new at remote
|
||||
ro_toolbar->add( iv_txt = 'Pull'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_pull }?{ mv_key }|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_pull }?key={ mv_key }|
|
||||
iv_opt = iv_pull_opt ).
|
||||
ENDIF.
|
||||
IF iv_lstate IS NOT INITIAL. " Something new at local
|
||||
ro_toolbar->add( iv_txt = 'Stage'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-go_stage }?{ mv_key }|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-go_stage }?key={ mv_key }|
|
||||
iv_opt = zif_abapgit_html=>c_html_opt-strong ).
|
||||
ENDIF.
|
||||
IF iv_rstate IS NOT INITIAL OR iv_lstate IS NOT INITIAL. " Any changes
|
||||
|
@ -463,7 +465,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_VIEW_REPO IMPLEMENTATION.
|
|||
li_log = mo_repo->get_log( ).
|
||||
IF li_log IS BOUND AND li_log->count( ) > 0.
|
||||
ro_toolbar->add( iv_txt = 'Log'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_log }?{ mv_key }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_log }?key={ mv_key }| ).
|
||||
ENDIF.
|
||||
ro_toolbar->add( iv_txt = 'Branch'
|
||||
io_sub = io_tb_branch ).
|
||||
|
@ -472,22 +474,22 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_VIEW_REPO IMPLEMENTATION.
|
|||
ELSE.
|
||||
IF mo_repo->has_remote_source( ) = abap_true AND iv_rstate IS NOT INITIAL.
|
||||
ro_toolbar->add( iv_txt = 'Pull <sup>zip</sup>'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_pull }?{ mv_key }|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_pull }?key={ mv_key }|
|
||||
iv_opt = zif_abapgit_html=>c_html_opt-strong ).
|
||||
ro_toolbar->add( iv_txt = 'Diff'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-go_diff }?key={ mv_key }|
|
||||
iv_opt = zif_abapgit_html=>c_html_opt-strong ).
|
||||
ENDIF.
|
||||
ro_toolbar->add( iv_txt = 'Import <sup>zip</sup>'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-zip_import }?{ mv_key }|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-zip_import }?key={ mv_key }|
|
||||
iv_opt = zif_abapgit_html=>c_html_opt-strong ).
|
||||
ro_toolbar->add( iv_txt = 'Export <sup>zip</sup>'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-zip_export }?{ mv_key }|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-zip_export }?key={ mv_key }|
|
||||
iv_opt = zif_abapgit_html=>c_html_opt-strong ).
|
||||
li_log = mo_repo->get_log( ).
|
||||
IF li_log IS BOUND AND li_log->count( ) > 0.
|
||||
ro_toolbar->add( iv_txt = 'Log'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_log }?{ mv_key }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_log }?key={ mv_key }| ).
|
||||
ENDIF.
|
||||
ENDIF.
|
||||
|
||||
|
@ -498,11 +500,11 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_VIEW_REPO IMPLEMENTATION.
|
|||
io_sub = build_view_menu( ) ).
|
||||
|
||||
ro_toolbar->add( iv_txt = 'Refresh'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_refresh }?{ mv_key }|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_refresh }?key={ mv_key }|
|
||||
iv_opt = zif_abapgit_html=>c_html_opt-strong ).
|
||||
|
||||
ro_toolbar->add( iv_txt = zcl_abapgit_html=>icon( iv_name = 'cog' )
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_settings }?{ mv_key }|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_settings }?key={ mv_key }|
|
||||
iv_title = `Repository Settings` ).
|
||||
|
||||
|
||||
|
@ -536,14 +538,14 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_VIEW_REPO IMPLEMENTATION.
|
|||
ENDIF.
|
||||
|
||||
ro_tag_dropdown->add( iv_txt = 'Overview'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-go_tag_overview }?{ mv_key }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-go_tag_overview }?key={ mv_key }| ).
|
||||
ro_tag_dropdown->add( iv_txt = 'Switch'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_tag_switch }?{ mv_key }|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_tag_switch }?key={ mv_key }|
|
||||
iv_opt = iv_wp_opt ).
|
||||
ro_tag_dropdown->add( iv_txt = 'Create'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_tag_create }?{ mv_key }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_tag_create }?key={ mv_key }| ).
|
||||
ro_tag_dropdown->add( iv_txt = 'Delete'
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_tag_delete }?{ mv_key }| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_tag_delete }?key={ mv_key }| ).
|
||||
|
||||
|
||||
ENDMETHOD.
|
||||
|
@ -1036,7 +1038,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_VIEW_REPO IMPLEMENTATION.
|
|||
lv_icon_html = li_html->a(
|
||||
iv_txt = li_html->icon( iv_name = 'briefcase/darkgrey'
|
||||
iv_hint = lv_transport_string )
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-jump_transport }?| && lv_transport ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-jump_transport }?transport={ lv_transport }| ).
|
||||
|
||||
rv_html = |<td class="icon">| &&
|
||||
|{ lv_icon_html }| &&
|
||||
|
@ -1166,7 +1168,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_VIEW_REPO IMPLEMENTATION.
|
|||
WHEN zif_abapgit_definitions=>c_action-go_repo. " Switch to another repo
|
||||
CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_view_repo
|
||||
EXPORTING
|
||||
iv_key = |{ ii_event->mv_getdata }|.
|
||||
iv_key = |{ ii_event->query( iv_upper_cased = abap_true )->get( 'KEY' ) }|.
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing.
|
||||
|
||||
WHEN c_actions-toggle_hide_files. " Toggle file diplay
|
||||
|
@ -1174,8 +1176,9 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_VIEW_REPO IMPLEMENTATION.
|
|||
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
|
||||
|
||||
WHEN c_actions-change_dir. " Change dir
|
||||
lv_path = zcl_abapgit_html_action_utils=>dir_decode( ii_event->mv_getdata ).
|
||||
mv_cur_dir = zcl_abapgit_path=>change_dir( iv_cur_dir = mv_cur_dir
|
||||
lv_path = ii_event->query( )->get( 'PATH' ).
|
||||
mv_cur_dir = zcl_abapgit_path=>change_dir(
|
||||
iv_cur_dir = mv_cur_dir
|
||||
iv_cd = lv_path ).
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
|
||||
|
||||
|
@ -1197,11 +1200,11 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_VIEW_REPO IMPLEMENTATION.
|
|||
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
|
||||
|
||||
WHEN zif_abapgit_definitions=>c_action-change_order_by.
|
||||
mv_order_by = zcl_abapgit_gui_chunk_lib=>parse_change_order_by( ii_event->mv_getdata ).
|
||||
mv_order_by = ii_event->query( )->get( 'ORDERBY' ).
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
|
||||
|
||||
WHEN zif_abapgit_definitions=>c_action-direction.
|
||||
mv_order_descending = zcl_abapgit_gui_chunk_lib=>parse_direction( ii_event->mv_getdata ).
|
||||
mv_order_descending = boolc( ii_event->query( )->get( 'DIRECTION' ) = 'DESCENDING' ).
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
|
||||
|
||||
WHEN zif_abapgit_definitions=>c_action-repo_open_in_master_lang.
|
||||
|
|
|
@ -115,7 +115,7 @@ ENDCLASS.
|
|||
|
||||
|
||||
|
||||
CLASS zcl_abapgit_gui_repo_over IMPLEMENTATION.
|
||||
CLASS ZCL_ABAPGIT_GUI_REPO_OVER IMPLEMENTATION.
|
||||
|
||||
|
||||
METHOD apply_filter.
|
||||
|
@ -334,7 +334,7 @@ CLASS zcl_abapgit_gui_repo_over IMPLEMENTATION.
|
|||
|
||||
ii_html->add( |<tr class="repo { lv_favorite_class }">| ).
|
||||
ii_html->add( |<td class="wmin">| ).
|
||||
ii_html->add_a( iv_act = |{ zif_abapgit_definitions=>c_action-repo_toggle_fav }?{ <ls_overview>-key }|
|
||||
ii_html->add_a( iv_act = |{ zif_abapgit_definitions=>c_action-repo_toggle_fav }?key={ <ls_overview>-key }|
|
||||
iv_txt = ii_html->icon( iv_name = lv_favorite_icon
|
||||
iv_class = 'pad-sides'
|
||||
iv_hint = 'Click to toggle favorite' ) ).
|
||||
|
@ -342,11 +342,11 @@ CLASS zcl_abapgit_gui_repo_over IMPLEMENTATION.
|
|||
ii_html->add( |<td class="wmin">{ ii_html->icon( lv_type_icon ) }</td>| ).
|
||||
|
||||
ii_html->add( |<td>{ ii_html->a( iv_txt = <ls_overview>-name
|
||||
iv_act = |{ c_action-select }?{ <ls_overview>-key }| ) }</td>| ).
|
||||
iv_act = |{ c_action-select }?key={ <ls_overview>-key }| ) }</td>| ).
|
||||
|
||||
IF <ls_overview>-type = abap_false.
|
||||
ii_html->add( |<td>{ ii_html->a( iv_txt = <ls_overview>-url
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-url }?|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-url }?url=|
|
||||
&& |{ <ls_overview>-url }| ) }</td>| ).
|
||||
ELSE.
|
||||
ii_html->add( |<td></td>| ).
|
||||
|
@ -371,7 +371,7 @@ CLASS zcl_abapgit_gui_repo_over IMPLEMENTATION.
|
|||
|
||||
ii_html->add( |<td>{ ii_html->a(
|
||||
iv_txt = lv_branch_html
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_switch }?{ <ls_overview>-key }| ) }</td>| ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-git_branch_switch }?key={ <ls_overview>-key }| ) }</td>| ).
|
||||
ENDIF.
|
||||
|
||||
ii_html->add( |<td class="ro-detail">{ <ls_overview>-deserialized_by }</td>| ).
|
||||
|
@ -384,39 +384,39 @@ CLASS zcl_abapgit_gui_repo_over IMPLEMENTATION.
|
|||
|
||||
lv_check_link = ii_html->a(
|
||||
iv_txt = |Check|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_code_inspector }?{ <ls_overview>-key } | ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_code_inspector }?key={ <ls_overview>-key } | ).
|
||||
|
||||
ii_html->add( lv_check_link && lc_separator ).
|
||||
|
||||
IF <ls_overview>-type = abap_false. " online repo
|
||||
lv_stage_link = ii_html->a(
|
||||
iv_txt = |Stage|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-go_stage }?{ <ls_overview>-key } | ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-go_stage }?key={ <ls_overview>-key } | ).
|
||||
|
||||
ii_html->add( lv_stage_link && lc_separator ).
|
||||
|
||||
lv_patch_link = ii_html->a(
|
||||
iv_txt = |Patch|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-go_patch }?{ <ls_overview>-key } | ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-go_patch }?key={ <ls_overview>-key } | ).
|
||||
|
||||
ii_html->add( lv_patch_link && lc_separator ).
|
||||
ELSE. " offline repo
|
||||
lv_zip_import_link = ii_html->a(
|
||||
iv_txt = |Import|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-zip_import }?{ <ls_overview>-key } | ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-zip_import }?key={ <ls_overview>-key } | ).
|
||||
|
||||
ii_html->add( lv_zip_import_link && lc_separator ).
|
||||
|
||||
lv_zip_export_link = ii_html->a(
|
||||
iv_txt = |Export|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-zip_export }?{ <ls_overview>-key } | ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-zip_export }?key={ <ls_overview>-key } | ).
|
||||
|
||||
ii_html->add( lv_zip_export_link && lc_separator ).
|
||||
ENDIF.
|
||||
|
||||
lv_settings_link = ii_html->a(
|
||||
iv_txt = |Settings|
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_settings }?{ <ls_overview>-key } | ).
|
||||
iv_act = |{ zif_abapgit_definitions=>c_action-repo_settings }?key={ <ls_overview>-key } | ).
|
||||
|
||||
ii_html->add( lv_settings_link ).
|
||||
|
||||
|
@ -425,7 +425,7 @@ CLASS zcl_abapgit_gui_repo_over IMPLEMENTATION.
|
|||
ii_html->add( |<td class='ro-go'><span>{
|
||||
ii_html->a(
|
||||
iv_txt = `›`
|
||||
iv_act = |{ c_action-select }?{ <ls_overview>-key }| ) }</span></td>| ).
|
||||
iv_act = |{ c_action-select }?key={ <ls_overview>-key }| ) }</span></td>| ).
|
||||
|
||||
ii_html->add( |</tr>| ).
|
||||
|
||||
|
|
|
@ -81,21 +81,21 @@ CLASS zcl_abapgit_gui_router DEFINITION
|
|||
zcx_abapgit_exception.
|
||||
METHODS get_page_diff
|
||||
IMPORTING
|
||||
!iv_getdata TYPE clike
|
||||
!ii_event TYPE REF TO zif_abapgit_gui_event
|
||||
RETURNING
|
||||
VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
METHODS get_page_branch_overview
|
||||
IMPORTING
|
||||
!iv_getdata TYPE clike
|
||||
!iv_key TYPE zif_abapgit_persistence=>ty_repo-key
|
||||
RETURNING
|
||||
VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
METHODS get_page_stage
|
||||
IMPORTING
|
||||
!iv_getdata TYPE clike
|
||||
!ii_event TYPE REF TO zif_abapgit_gui_event
|
||||
RETURNING
|
||||
VALUE(ri_page) TYPE REF TO zif_abapgit_gui_renderable
|
||||
RAISING
|
||||
|
@ -110,7 +110,7 @@ CLASS zcl_abapgit_gui_router DEFINITION
|
|||
|
||||
CLASS-METHODS jump_display_transport
|
||||
IMPORTING
|
||||
!iv_getdata TYPE clike
|
||||
!iv_transport TYPE trkorr
|
||||
RAISING
|
||||
zcx_abapgit_exception.
|
||||
|
||||
|
@ -168,19 +168,23 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
|
|||
|
||||
METHOD db_actions.
|
||||
|
||||
DATA ls_db_key TYPE zif_abapgit_persistence=>ty_content.
|
||||
|
||||
CASE ii_event->mv_action.
|
||||
WHEN zif_abapgit_definitions=>c_action-db_edit.
|
||||
ii_event->query( )->to_abap( CHANGING cs_container = ls_db_key ).
|
||||
CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_db_edit
|
||||
EXPORTING
|
||||
is_key = zcl_abapgit_html_action_utils=>dbkey_decode( ii_event->mv_getdata ).
|
||||
is_key = ls_db_key.
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
|
||||
IF ii_event->mi_gui_services->get_current_page_name( ) = 'ZCL_ABAPGIT_GUI_PAGE_DB_DIS'. " TODO refactor
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing.
|
||||
ENDIF.
|
||||
WHEN zif_abapgit_definitions=>c_action-db_display.
|
||||
ii_event->query( )->to_abap( CHANGING cs_container = ls_db_key ).
|
||||
CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_db_dis
|
||||
EXPORTING
|
||||
is_key = zcl_abapgit_html_action_utils=>dbkey_decode( ii_event->mv_getdata ).
|
||||
is_key = ls_db_key.
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
|
||||
ENDCASE.
|
||||
|
||||
|
@ -220,7 +224,7 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
|
|||
lt_repo_list TYPE zif_abapgit_definitions=>ty_repo_ref_tt.
|
||||
|
||||
|
||||
lv_key = ii_event->mv_getdata. " TODO refactor
|
||||
lv_key = ii_event->query( )->get( 'KEY' ).
|
||||
|
||||
CASE ii_event->mv_action.
|
||||
WHEN zcl_abapgit_gui=>c_action-go_home.
|
||||
|
@ -255,17 +259,17 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
|
|||
rs_handled-page = get_page_background( lv_key ).
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
|
||||
WHEN zif_abapgit_definitions=>c_action-go_diff. " Go Diff page
|
||||
rs_handled-page = get_page_diff( ii_event->mv_getdata ).
|
||||
rs_handled-page = get_page_diff( ii_event ).
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_w_bookmark.
|
||||
WHEN zif_abapgit_definitions=>c_action-go_stage. " Go Staging page
|
||||
rs_handled-page = get_page_stage( ii_event->mv_getdata ).
|
||||
rs_handled-page = get_page_stage( ii_event ).
|
||||
IF ii_event->mi_gui_services->get_current_page_name( ) = 'ZCL_ABAPGIT_GUI_PAGE_DIFF'. " TODO refactor
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
|
||||
ELSE.
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_w_bookmark.
|
||||
ENDIF.
|
||||
WHEN zif_abapgit_definitions=>c_action-go_branch_overview. " Go repo branch overview
|
||||
rs_handled-page = get_page_branch_overview( ii_event->mv_getdata ).
|
||||
rs_handled-page = get_page_branch_overview( lv_key ).
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
|
||||
WHEN zif_abapgit_definitions=>c_action-go_tutorial. " Go to tutorial
|
||||
rs_handled-page = zcl_abapgit_gui_page_tutorial=>create( ).
|
||||
|
@ -297,13 +301,10 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
|
|||
METHOD get_page_branch_overview.
|
||||
|
||||
DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online,
|
||||
lo_page TYPE REF TO zcl_abapgit_gui_page_boverview,
|
||||
lv_key TYPE zif_abapgit_persistence=>ty_repo-key.
|
||||
lo_page TYPE REF TO zcl_abapgit_gui_page_boverview.
|
||||
|
||||
|
||||
lv_key = iv_getdata.
|
||||
|
||||
lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
|
||||
lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ).
|
||||
|
||||
CREATE OBJECT lo_page
|
||||
EXPORTING
|
||||
|
@ -321,14 +322,11 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
|
|||
lo_page TYPE REF TO zcl_abapgit_gui_page_diff,
|
||||
lv_key TYPE zif_abapgit_persistence=>ty_repo-key.
|
||||
|
||||
|
||||
zcl_abapgit_html_action_utils=>file_obj_decode(
|
||||
EXPORTING
|
||||
iv_string = iv_getdata
|
||||
IMPORTING
|
||||
ev_key = lv_key
|
||||
eg_file = ls_file
|
||||
eg_object = ls_object ).
|
||||
lv_key = ii_event->query( )->get( 'KEY' ).
|
||||
ls_file-path = ii_event->query( )->get( 'PATH' ).
|
||||
ls_file-filename = ii_event->query( )->get( 'FILENAME' ). " unescape ?
|
||||
ls_object-obj_type = ii_event->query( )->get( 'OBJ_TYPE' ).
|
||||
ls_object-obj_name = ii_event->query( )->get( 'OBJ_NAME' ). " unescape ?
|
||||
|
||||
CREATE OBJECT lo_page
|
||||
EXPORTING
|
||||
|
@ -349,16 +347,8 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
|
|||
lo_stage_page TYPE REF TO zcl_abapgit_gui_page_stage,
|
||||
lo_code_inspector_page TYPE REF TO zcl_abapgit_gui_page_code_insp.
|
||||
|
||||
FIND FIRST OCCURRENCE OF '=' IN iv_getdata.
|
||||
IF sy-subrc <> 0. " Not found ? -> just repo key in params
|
||||
lv_key = iv_getdata.
|
||||
ELSE.
|
||||
zcl_abapgit_html_action_utils=>stage_decode(
|
||||
EXPORTING iv_getdata = iv_getdata
|
||||
IMPORTING ev_key = lv_key
|
||||
ev_seed = lv_seed ).
|
||||
ENDIF.
|
||||
|
||||
lv_key = ii_event->query( )->get( 'KEY' ).
|
||||
lv_seed = ii_event->query( )->get( 'SEED' ).
|
||||
lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ).
|
||||
|
||||
IF lo_repo->get_local_settings( )-code_inspector_check_variant IS NOT INITIAL.
|
||||
|
@ -388,10 +378,9 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
|
|||
|
||||
METHOD git_services.
|
||||
|
||||
DATA: lv_key TYPE zif_abapgit_persistence=>ty_repo-key.
|
||||
DATA lv_key TYPE zif_abapgit_persistence=>ty_repo-key.
|
||||
|
||||
|
||||
lv_key = ii_event->mv_getdata. " TODO refactor
|
||||
lv_key = ii_event->query( )->get( 'KEY' ).
|
||||
|
||||
CASE ii_event->mv_action.
|
||||
WHEN zif_abapgit_definitions=>c_action-git_pull. " GIT Pull
|
||||
|
@ -431,19 +420,17 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
|
|||
|
||||
METHOD jump_display_transport.
|
||||
|
||||
DATA: lv_transport TYPE trkorr,
|
||||
DATA:
|
||||
lv_transport_adt_uri TYPE string,
|
||||
lv_adt_link TYPE string,
|
||||
lv_adt_jump_enabled TYPE abap_bool.
|
||||
|
||||
lv_transport = iv_getdata.
|
||||
|
||||
lv_adt_jump_enabled = zcl_abapgit_persist_settings=>get_instance( )->read( )->get_adt_jump_enabled( ).
|
||||
IF lv_adt_jump_enabled = abap_true.
|
||||
TRY.
|
||||
CALL METHOD ('CL_CTS_ADT_TM_URI_BUILDER')=>('CREATE_ADT_URI')
|
||||
EXPORTING
|
||||
trnumber = lv_transport
|
||||
trnumber = iv_transport
|
||||
RECEIVING
|
||||
result = lv_transport_adt_uri.
|
||||
lv_adt_link = |adt://{ sy-sysid }{ lv_transport_adt_uri }|.
|
||||
|
@ -456,12 +443,12 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
|
|||
CATCH cx_root.
|
||||
CALL FUNCTION 'TR_DISPLAY_REQUEST'
|
||||
EXPORTING
|
||||
i_trkorr = lv_transport.
|
||||
i_trkorr = iv_transport.
|
||||
ENDTRY.
|
||||
ELSE.
|
||||
CALL FUNCTION 'TR_DISPLAY_REQUEST'
|
||||
EXPORTING
|
||||
i_trkorr = lv_transport.
|
||||
i_trkorr = iv_transport.
|
||||
ENDIF.
|
||||
|
||||
ENDMETHOD.
|
||||
|
@ -486,10 +473,10 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
|
|||
|
||||
METHOD remote_origin_manipulations.
|
||||
|
||||
DATA: lv_key TYPE zif_abapgit_persistence=>ty_repo-key.
|
||||
DATA lv_key TYPE zif_abapgit_persistence=>ty_repo-key.
|
||||
|
||||
|
||||
lv_key = ii_event->mv_getdata. " TODO refactor
|
||||
lv_key = ii_event->query( )->get( 'KEY' ).
|
||||
|
||||
CASE ii_event->mv_action.
|
||||
WHEN zif_abapgit_definitions=>c_action-repo_remote_attach. " Remote attach
|
||||
|
@ -508,12 +495,11 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
|
|||
|
||||
METHOD repository_services.
|
||||
|
||||
DATA: lv_url TYPE string,
|
||||
DATA:
|
||||
lv_key TYPE zif_abapgit_persistence=>ty_repo-key,
|
||||
li_log TYPE REF TO zif_abapgit_log.
|
||||
|
||||
lv_key = ii_event->mv_getdata. " TODO refactor
|
||||
lv_url = ii_event->mv_getdata. " TODO refactor
|
||||
lv_key = ii_event->query( )->get( 'KEY' ).
|
||||
|
||||
CASE ii_event->mv_action.
|
||||
WHEN zif_abapgit_definitions=>c_action-repo_newoffline. " New offline repo
|
||||
|
@ -576,19 +562,17 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
|
|||
|
||||
CASE ii_event->mv_action.
|
||||
WHEN zif_abapgit_definitions=>c_action-jump. " Open object editor
|
||||
zcl_abapgit_html_action_utils=>jump_decode(
|
||||
EXPORTING iv_string = ii_event->mv_getdata
|
||||
IMPORTING ev_obj_type = ls_item-obj_type
|
||||
ev_obj_name = ls_item-obj_name ).
|
||||
ls_item-obj_type = ii_event->query( )->get( 'TYPE' ).
|
||||
ls_item-obj_name = ii_event->query( )->get( 'NAME' ).
|
||||
zcl_abapgit_objects=>jump( ls_item ).
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
|
||||
|
||||
WHEN zif_abapgit_definitions=>c_action-jump_transport.
|
||||
jump_display_transport( ii_event->mv_getdata ).
|
||||
jump_display_transport( |{ ii_event->query( )->get( 'TRANSPORT' ) }| ).
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
|
||||
|
||||
WHEN zif_abapgit_definitions=>c_action-url.
|
||||
call_browser( ii_event->mv_getdata ).
|
||||
call_browser( ii_event->query( )->get( 'URL' ) ).
|
||||
rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
|
||||
|
||||
ENDCASE.
|
||||
|
@ -647,7 +631,7 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION.
|
|||
repo_view TYPE string VALUE 'ZCL_ABAPGIT_GUI_PAGE_VIEW_REPO',
|
||||
END OF lc_page.
|
||||
|
||||
lv_key = ii_event->mv_getdata. " TODO refactor
|
||||
lv_key = ii_event->query( )->get( 'KEY' ).
|
||||
|
||||
CASE ii_event->mv_action.
|
||||
WHEN zif_abapgit_definitions=>c_action-zip_import. " Import repo from ZIP
|
||||
|
|
|
@ -39,26 +39,12 @@ CLASS zcl_abapgit_html_action_utils DEFINITION
|
|||
!iv_obj_name TYPE tadir-obj_name
|
||||
RETURNING
|
||||
VALUE(rv_string) TYPE string .
|
||||
CLASS-METHODS jump_decode
|
||||
IMPORTING
|
||||
!iv_string TYPE clike
|
||||
EXPORTING
|
||||
!ev_obj_type TYPE tadir-object
|
||||
!ev_obj_name TYPE tadir-obj_name
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
CLASS-METHODS dir_encode
|
||||
IMPORTING
|
||||
!iv_path TYPE string
|
||||
RETURNING
|
||||
VALUE(rv_string) TYPE string .
|
||||
CLASS-METHODS dir_decode
|
||||
IMPORTING
|
||||
!iv_string TYPE clike
|
||||
RETURNING
|
||||
VALUE(rv_path) TYPE string
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
|
||||
CLASS-METHODS file_encode
|
||||
IMPORTING
|
||||
!iv_key TYPE zif_abapgit_persistence=>ty_repo-key
|
||||
|
@ -71,33 +57,13 @@ CLASS zcl_abapgit_html_action_utils DEFINITION
|
|||
!ig_object TYPE any
|
||||
RETURNING
|
||||
VALUE(rv_string) TYPE string .
|
||||
CLASS-METHODS file_obj_decode
|
||||
IMPORTING
|
||||
!iv_string TYPE clike
|
||||
EXPORTING
|
||||
!ev_key TYPE zif_abapgit_persistence=>ty_repo-key
|
||||
!eg_file TYPE any "assuming ty_file
|
||||
!eg_object TYPE any "assuming ty_item
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
|
||||
CLASS-METHODS dbkey_encode
|
||||
IMPORTING
|
||||
!is_key TYPE zif_abapgit_persistence=>ty_content
|
||||
RETURNING
|
||||
VALUE(rv_string) TYPE string .
|
||||
CLASS-METHODS dbkey_decode
|
||||
IMPORTING
|
||||
!iv_string TYPE clike
|
||||
RETURNING
|
||||
VALUE(rs_key) TYPE zif_abapgit_persistence=>ty_content .
|
||||
CLASS-METHODS stage_decode
|
||||
IMPORTING
|
||||
!iv_getdata TYPE clike
|
||||
EXPORTING
|
||||
!ev_key TYPE zif_abapgit_persistence=>ty_repo-key
|
||||
!ev_seed TYPE string
|
||||
RAISING
|
||||
zcx_abapgit_exception .
|
||||
|
||||
PROTECTED SECTION.
|
||||
PRIVATE SECTION.
|
||||
|
||||
|
@ -146,20 +112,6 @@ CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION.
|
|||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD dbkey_decode.
|
||||
|
||||
DATA: lt_fields TYPE tihttpnvp.
|
||||
|
||||
lt_fields = parse_fields_upper_case_name( cl_http_utility=>unescape_url( |{ iv_string }| ) ).
|
||||
|
||||
get_field( EXPORTING iv_name = 'TYPE'
|
||||
it_field = lt_fields CHANGING cg_field = rs_key-type ).
|
||||
get_field( EXPORTING iv_name = 'VALUE'
|
||||
it_field = lt_fields CHANGING cg_field = rs_key-value ).
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD dbkey_encode.
|
||||
|
||||
DATA: lt_fields TYPE tihttpnvp.
|
||||
|
@ -174,17 +126,6 @@ CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION.
|
|||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD dir_decode.
|
||||
|
||||
DATA: lt_fields TYPE tihttpnvp.
|
||||
|
||||
lt_fields = parse_fields( iv_string ).
|
||||
get_field( EXPORTING iv_name = 'PATH'
|
||||
it_field = lt_fields CHANGING cg_field = rv_path ).
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD dir_encode.
|
||||
|
||||
DATA: lt_fields TYPE tihttpnvp.
|
||||
|
@ -223,39 +164,6 @@ CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION.
|
|||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD file_obj_decode.
|
||||
|
||||
DATA: lt_fields TYPE tihttpnvp.
|
||||
|
||||
ASSERT eg_file IS SUPPLIED OR eg_object IS SUPPLIED OR ev_key IS SUPPLIED.
|
||||
|
||||
CLEAR: ev_key, eg_file, eg_object.
|
||||
lt_fields = parse_fields_upper_case_name( iv_string ).
|
||||
|
||||
get_field( EXPORTING iv_name = 'KEY'
|
||||
it_field = lt_fields CHANGING cg_field = ev_key ).
|
||||
|
||||
IF eg_file IS SUPPLIED.
|
||||
get_field( EXPORTING iv_name = 'PATH'
|
||||
it_field = lt_fields CHANGING cg_field = eg_file ).
|
||||
get_field( EXPORTING iv_name = 'FILENAME'
|
||||
it_field = lt_fields
|
||||
iv_decode = abap_true
|
||||
CHANGING cg_field = eg_file ).
|
||||
ENDIF.
|
||||
|
||||
IF eg_object IS SUPPLIED.
|
||||
get_field( EXPORTING iv_name = 'OBJ_TYPE'
|
||||
it_field = lt_fields CHANGING cg_field = eg_object ).
|
||||
get_field( EXPORTING iv_name = 'OBJ_NAME'
|
||||
it_field = lt_fields
|
||||
iv_decode = abap_true
|
||||
CHANGING cg_field = eg_object ).
|
||||
ENDIF.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD get_field.
|
||||
|
||||
DATA: lv_value TYPE string.
|
||||
|
@ -289,20 +197,6 @@ CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION.
|
|||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD jump_decode.
|
||||
|
||||
DATA: lt_fields TYPE tihttpnvp.
|
||||
|
||||
lt_fields = parse_fields( iv_string ).
|
||||
|
||||
get_field( EXPORTING iv_name = 'TYPE'
|
||||
it_field = lt_fields CHANGING cg_field = ev_obj_type ).
|
||||
get_field( EXPORTING iv_name = 'NAME'
|
||||
it_field = lt_fields CHANGING cg_field = ev_obj_name ).
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD jump_encode.
|
||||
|
||||
DATA: lt_fields TYPE tihttpnvp.
|
||||
|
@ -348,16 +242,16 @@ CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION.
|
|||
LOOP AT lt_substrings ASSIGNING <lv_substring>.
|
||||
|
||||
CLEAR ls_field.
|
||||
<lv_substring> = unescape( <lv_substring> ).
|
||||
" On attempt to change unescaping -> run unit tests to check !
|
||||
|
||||
ls_field-name = substring_before(
|
||||
val = <lv_substring>
|
||||
sub = '=' ).
|
||||
ls_field-name = unescape( ls_field-name ).
|
||||
|
||||
ls_field-value = substring_after(
|
||||
val = <lv_substring>
|
||||
sub = '=' ).
|
||||
ls_field-value = unescape( ls_field-value ).
|
||||
|
||||
IF ls_field IS INITIAL. " Not a field with proper structure
|
||||
CONTINUE.
|
||||
|
@ -392,22 +286,6 @@ CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION.
|
|||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD stage_decode.
|
||||
|
||||
DATA: lt_fields TYPE tihttpnvp.
|
||||
|
||||
lt_fields = parse_fields_upper_case_name( iv_getdata ).
|
||||
|
||||
get_field( EXPORTING iv_name = 'KEY'
|
||||
it_field = lt_fields CHANGING cg_field = ev_key ).
|
||||
get_field( EXPORTING iv_name = 'SEED'
|
||||
it_field = lt_fields CHANGING cg_field = ev_seed ).
|
||||
|
||||
ASSERT NOT ev_key IS INITIAL.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
|
||||
METHOD translate_postdata.
|
||||
|
||||
DATA: lt_post_data TYPE cnht_post_data_tab,
|
||||
|
|
|
@ -142,13 +142,15 @@ CLASS ltcl_html_action_utils IMPLEMENTATION.
|
|||
ENDMETHOD.
|
||||
|
||||
METHOD parse_fields_unescape.
|
||||
* file status = '?', used in staging page
|
||||
|
||||
" file status = '?', used in staging page
|
||||
_given_string_is( '/SRC/ZFOOBAR.PROG.ABAP=%3F' ).
|
||||
|
||||
_when_fields_are_parsed( ).
|
||||
_then_field_count_should_be( 1 ).
|
||||
|
||||
_then_fields_should_be( iv_index = 1
|
||||
_then_fields_should_be(
|
||||
iv_index = 1
|
||||
iv_name = '/SRC/ZFOOBAR.PROG.ABAP'
|
||||
iv_value = '?' ).
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user