From a95afceb035e3e332a2d9949f8b938867aebde0e Mon Sep 17 00:00:00 2001 From: sbcgua Date: Tue, 20 Sep 2016 17:58:35 +0300 Subject: [PATCH] UI: Main page, hide file list, adjust diff #347 --- src/zabapgit_definitions.prog.abap | 9 +- src/zabapgit_file_status.prog.abap | 6 +- src/zabapgit_gui_pages.prog.abap | 10 +- src/zabapgit_gui_router.prog.abap | 38 +-- src/zabapgit_html.prog.abap | 27 +- src/zabapgit_html_action_utils.prog.abap | 304 +++++++++++------------ src/zabapgit_page.prog.abap | 15 +- src/zabapgit_page_commit.prog.abap | 16 +- src/zabapgit_page_diff.prog.abap | 156 ++++++++++-- src/zabapgit_page_main.prog.abap | 97 +++++--- src/zabapgit_page_stage.prog.abap | 4 +- src/zabapgit_persistence.prog.abap | 24 ++ src/zabapgit_unit_test.prog.abap | 61 ++++- src/zabapgit_util.prog.abap | 10 +- 14 files changed, 505 insertions(+), 272 deletions(-) diff --git a/src/zabapgit_definitions.prog.abap b/src/zabapgit_definitions.prog.abap index a524783d6..3fd1dc3ca 100644 --- a/src/zabapgit_definitions.prog.abap +++ b/src/zabapgit_definitions.prog.abap @@ -53,7 +53,7 @@ TYPES: BEGIN OF ty_repo_file, path TYPE string, filename TYPE string, is_changed TYPE abap_bool, - remote_only TYPE abap_bool, + new TYPE char1, END OF ty_repo_file. TYPES tt_repo_files TYPE STANDARD TABLE OF ty_repo_file WITH DEFAULT KEY. @@ -95,12 +95,17 @@ TYPES: BEGIN OF ty_result, filename TYPE string, package TYPE devclass, path TYPE string, - remote_only TYPE abap_bool, + new TYPE char1, END OF ty_result. TYPES: ty_results_tt TYPE STANDARD TABLE OF ty_result WITH DEFAULT KEY. TYPES: ty_sval_tt TYPE STANDARD TABLE OF sval WITH DEFAULT KEY. +CONSTANTS: BEGIN OF gc_new, + local TYPE char1 VALUE 'L', + remote TYPE char1 VALUE 'R', + END OF gc_new. + CONSTANTS: BEGIN OF gc_chmod, file TYPE ty_chmod VALUE '100644', executable TYPE ty_chmod VALUE '100755', diff --git a/src/zabapgit_file_status.prog.abap b/src/zabapgit_file_status.prog.abap index 7f9813727..8ade9c97a 100644 --- a/src/zabapgit_file_status.prog.abap +++ b/src/zabapgit_file_status.prog.abap @@ -104,8 +104,8 @@ CLASS lcl_file_status IMPLEMENTATION. IF lt_files[] IS INITIAL. * item does not exist locally - ls_result-filename = -filename. - ls_result-remote_only = abap_true. + ls_result-filename = -filename. + ls_result-new = gc_new-remote. APPEND ls_result TO rt_results. CONTINUE. " current loop ENDIF. @@ -162,6 +162,7 @@ CLASS lcl_file_status IMPLEMENTATION. ls_result-match = abap_true. ls_result-obj_type = -object. ls_result-obj_name = -obj_name. + ls_result-new = gc_new-local. APPEND ls_result TO rt_results. ENDIF. @@ -171,6 +172,7 @@ CLASS lcl_file_status IMPLEMENTATION. AND path IS INITIAL. * new file added locally to existing object -path = io_repo->get_dot_abapgit( )->get_starting_folder( ) && -path. + -new = gc_new-local. ENDLOOP. ENDLOOP. diff --git a/src/zabapgit_gui_pages.prog.abap b/src/zabapgit_gui_pages.prog.abap index 2ca2f2a09..10e9fcacb 100644 --- a/src/zabapgit_gui_pages.prog.abap +++ b/src/zabapgit_gui_pages.prog.abap @@ -8,10 +8,10 @@ INCLUDE zabapgit_html_action_utils. INCLUDE zabapgit_page. INCLUDE zabapgit_page_commit. INCLUDE zabapgit_page_merge. -INCLUDE zabapgit_page_branch_overview. -INCLUDE zabapgit_page_stage. -INCLUDE zabapgit_page_db. -INCLUDE zabapgit_page_main. INCLUDE zabapgit_page_background. +INCLUDE zabapgit_page_branch_overview. +INCLUDE zabapgit_page_db. INCLUDE zabapgit_page_diff. -INCLUDE zabapgit_page_explore. \ No newline at end of file +INCLUDE zabapgit_page_explore. +INCLUDE zabapgit_page_main. +INCLUDE zabapgit_page_stage. \ No newline at end of file diff --git a/src/zabapgit_gui_router.prog.abap b/src/zabapgit_gui_router.prog.abap index afe135e9b..cdc8f6d1e 100644 --- a/src/zabapgit_gui_router.prog.abap +++ b/src/zabapgit_gui_router.prog.abap @@ -238,42 +238,22 @@ CLASS lcl_gui_router IMPLEMENTATION. METHOD get_page_diff. - DATA: lt_remote TYPE ty_files_tt, - lt_local TYPE ty_files_item_tt, + DATA: ls_file TYPE ty_file, + ls_object TYPE ty_item, lo_page TYPE REF TO lcl_gui_page_diff, - lo_repo TYPE REF TO lcl_repo_online, - ls_file TYPE ty_repo_file, lv_key TYPE lcl_persistence_repo=>ty_repo-key. - FIELD-SYMBOLS: LIKE LINE OF lt_remote, - LIKE LINE OF lt_local. - lcl_html_action_utils=>file_decode( EXPORTING iv_string = iv_getdata - IMPORTING ev_key = lv_key - eg_file = ls_file ). - - lo_repo ?= lcl_app=>repo_srv( )->get( lv_key ). - lt_remote = lo_repo->get_files_remote( ). - lt_local = lo_repo->get_files_local( ). - - READ TABLE lt_remote ASSIGNING - WITH KEY filename = ls_file-filename - path = ls_file-path. - IF sy-subrc <> 0. - lcx_exception=>raise( 'file not found remotely' ). - ENDIF. - - READ TABLE lt_local ASSIGNING - WITH KEY file-filename = ls_file-filename - file-path = ls_file-path. - IF sy-subrc <> 0. - lcx_exception=>raise( 'file not found locally' ). - ENDIF. + lcl_html_action_utils=>file_obj_decode( EXPORTING iv_string = iv_getdata + IMPORTING ev_key = lv_key + eg_file = ls_file + eg_object = ls_object ). CREATE OBJECT lo_page EXPORTING - is_local = -file - is_remote = . + iv_key = lv_key + is_file = ls_file + is_object = ls_object. ri_page = lo_page. diff --git a/src/zabapgit_html.prog.abap b/src/zabapgit_html.prog.abap index d684f4949..c7fd74289 100644 --- a/src/zabapgit_html.prog.abap +++ b/src/zabapgit_html.prog.abap @@ -194,6 +194,7 @@ CLASS lcl_html_toolbar DEFINITION FINAL. iv_no_separator TYPE abap_bool OPTIONAL iv_vertical TYPE abap_bool OPTIONAL iv_sort TYPE abap_bool OPTIONAL + iv_as_angle TYPE abap_bool OPTIONAL RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. @@ -237,32 +238,40 @@ CLASS lcl_html_toolbar IMPLEMENTATION. METHOD render. - DATA: lv_class TYPE string, - lv_last TYPE abap_bool. + DATA: lv_class TYPE string, + lv_is_drop TYPE abap_bool, + lv_last TYPE abap_bool. FIELD-SYMBOLS LIKE LINE OF mt_items. CREATE OBJECT ro_html. + lv_is_drop = boolc( iv_as_droplist_with_label IS NOT INITIAL OR iv_as_angle IS NOT INITIAL ). - IF iv_as_droplist_with_label IS INITIAL. + IF lv_is_drop = abap_false. " Normal menu IF iv_vertical = abap_true. lv_class = 'menu_vertical' ##NO_TEXT. ELSE. lv_class = 'menu' ##NO_TEXT. ENDIF. + ELSEIF iv_as_angle IS NOT INITIAL. + lv_class = 'dropdown dropdown_angle' ##NO_TEXT. ELSE. lv_class = 'dropdown' ##NO_TEXT. ENDIF. ro_html->add( |
| ). - IF iv_as_droplist_with_label IS NOT INITIAL. - lv_class = 'dropbtn'. - IF iv_no_separator = abap_true. - lv_class = lv_class && ' menu_end' ##NO_TEXT. + IF lv_is_drop = abap_true. " Dropdown + IF iv_as_angle = abap_true. + ro_html->add( '
' ). + ELSE. + lv_class = 'dropbtn'. + IF iv_no_separator = abap_true. + lv_class = lv_class && ' menu_end' ##NO_TEXT. + ENDIF. + ro_html->add( |{ iv_as_droplist_with_label }| ). ENDIF. - ro_html->add( |{ iv_as_droplist_with_label }| ). ro_html->add( '' ). ENDIF. diff --git a/src/zabapgit_html_action_utils.prog.abap b/src/zabapgit_html_action_utils.prog.abap index 5bf88b67e..0e79640a0 100644 --- a/src/zabapgit_html_action_utils.prog.abap +++ b/src/zabapgit_html_action_utils.prog.abap @@ -8,13 +8,18 @@ CLASS lcl_html_action_utils DEFINITION FINAL. PUBLIC SECTION. - TYPES: BEGIN OF ty_commit_fields, "TODO refactor ! Move to normal place - repo_key TYPE lcl_persistence_repo=>ty_repo-key, - username TYPE string, - email TYPE string, - comment TYPE string, - body TYPE string, - END OF ty_commit_fields. + CLASS-METHODS field_keys_to_upper + CHANGING ct_fields TYPE tihttpnvp. + + CLASS-METHODS add_field + IMPORTING name TYPE string + iv TYPE any + CHANGING ct TYPE tihttpnvp. + + CLASS-METHODS get_field + IMPORTING name TYPE string + it TYPE tihttpnvp + CHANGING cv TYPE any. CLASS-METHODS jump_encode IMPORTING iv_obj_type TYPE tadir-object @@ -29,13 +34,19 @@ CLASS lcl_html_action_utils DEFINITION FINAL. CLASS-METHODS file_encode IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key - ig_file TYPE any "ty_repo_file + ig_file TYPE any "assuming ty_file RETURNING VALUE(rv_string) TYPE string. - CLASS-METHODS file_decode + CLASS-METHODS obj_encode + IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key + ig_object TYPE any "assuming ty_item + RETURNING VALUE(rv_string) TYPE string. + + CLASS-METHODS file_obj_decode IMPORTING iv_string TYPE clike EXPORTING ev_key TYPE lcl_persistence_repo=>ty_repo-key - eg_file TYPE any "ty_repo_file + eg_file TYPE any "assuming ty_file + eg_object TYPE any "assuming ty_item RAISING lcx_exception. CLASS-METHODS dbkey_encode @@ -52,7 +63,7 @@ CLASS lcl_html_action_utils DEFINITION FINAL. CLASS-METHODS parse_commit_request IMPORTING it_postdata TYPE cnht_post_data_tab - RETURNING VALUE(rs_fields) TYPE ty_commit_fields. + EXPORTING es_fields TYPE any. CLASS-METHODS repo_key_encode IMPORTING iv_key TYPE lcl_persistence_repo=>ty_repo-key @@ -62,8 +73,6 @@ CLASS lcl_html_action_utils DEFINITION FINAL. IMPORTING iv_getdata TYPE clike RETURNING VALUE(rs_fields) TYPE lcl_persistence_background=>ty_background. - CLASS-METHODS field_keys_to_upper - CHANGING ct_fields TYPE tihttpnvp. ENDCLASS. "lcl_html_action_utils DEFINITION @@ -72,19 +81,70 @@ ENDCLASS. "lcl_html_action_utils DEFINITION *----------------------------------------------------------------------* CLASS lcl_html_action_utils IMPLEMENTATION. + METHOD field_keys_to_upper. + + FIELD-SYMBOLS LIKE LINE OF ct_fields. + + LOOP AT ct_fields ASSIGNING . + -name = to_upper( -name ). + ENDLOOP. + + ENDMETHOD. "field_keys_to_upper + + METHOD add_field. + + DATA ls_field LIKE LINE OF ct. + + FIELD-SYMBOLS TYPE any. + + ls_field-name = name. + + CASE cl_abap_typedescr=>describe_by_data( iv )->kind. + WHEN cl_abap_typedescr=>kind_elem. + ls_field-value = iv. + WHEN cl_abap_typedescr=>kind_struct. + ASSIGN COMPONENT name OF STRUCTURE iv TO . + ASSERT IS ASSIGNED. + ls_field-value = . + WHEN OTHERS. + ASSERT 2 = 1. + ENDCASE. + + APPEND ls_field TO ct. + + ENDMETHOD. "add_field + + METHOD get_field. + + FIELD-SYMBOLS LIKE LINE OF it. + FIELD-SYMBOLS TYPE any. + + + READ TABLE it ASSIGNING WITH KEY name = name. + IF sy-subrc IS NOT INITIAL. + RETURN. + ENDIF. + + CASE cl_abap_typedescr=>describe_by_data( cv )->kind. + WHEN cl_abap_typedescr=>kind_elem. + cv = -value. + WHEN cl_abap_typedescr=>kind_struct. + ASSIGN COMPONENT name OF STRUCTURE cv TO . + ASSERT IS ASSIGNED. + = -value. + WHEN OTHERS. + ASSERT 2 = 1. + ENDCASE. + + ENDMETHOD. "get_field + METHOD jump_encode. - DATA: lt_fields TYPE tihttpnvp, - ls_field LIKE LINE OF lt_fields. + DATA: lt_fields TYPE tihttpnvp. - ls_field-name = 'TYPE'. - ls_field-value = iv_obj_type. - APPEND ls_field TO lt_fields. - - ls_field-name = 'NAME'. - ls_field-value = iv_obj_name. - APPEND ls_field TO lt_fields. + add_field( EXPORTING name = 'TYPE' iv = iv_obj_type CHANGING ct = lt_fields ). + add_field( EXPORTING name = 'NAME' iv = iv_obj_name CHANGING ct = lt_fields ). rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). @@ -92,103 +152,71 @@ CLASS lcl_html_action_utils IMPLEMENTATION. METHOD jump_decode. - DATA: lt_fields TYPE tihttpnvp, - lv_string TYPE string. - - FIELD-SYMBOLS: LIKE LINE OF lt_fields. + DATA: lt_fields TYPE tihttpnvp. - lv_string = iv_string. " type conversion - lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ). + lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_string }| ). - READ TABLE lt_fields ASSIGNING WITH KEY name = 'TYPE'. - IF sy-subrc = 0. - ev_obj_type = -value. - ELSE. - CLEAR ev_obj_type. - ENDIF. - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'NAME'. - IF sy-subrc = 0. - ev_obj_name = -value. - ELSE. - CLEAR ev_obj_name. - ENDIF. + get_field( EXPORTING name = 'TYPE' it = lt_fields CHANGING cv = ev_obj_type ). + get_field( EXPORTING name = 'NAME' it = lt_fields CHANGING cv = ev_obj_name ). ENDMETHOD. "jump_decode METHOD file_encode. - DATA: lt_fields TYPE tihttpnvp, - ls_field LIKE LINE OF lt_fields. + DATA: lt_fields TYPE tihttpnvp. - FIELD-SYMBOLS TYPE string. - ls_field-name = 'KEY'. - ls_field-value = iv_key. - APPEND ls_field TO lt_fields. - - ls_field-name = 'PATH'. - ASSIGN COMPONENT ls_field-name OF STRUCTURE ig_file TO . - ASSERT IS ASSIGNED. - ls_field-value = . - APPEND ls_field TO lt_fields. - - ls_field-name = 'FILENAME'. - ASSIGN COMPONENT ls_field-name OF STRUCTURE ig_file TO . - ASSERT IS ASSIGNED. - ls_field-value = . - APPEND ls_field TO lt_fields. + add_field( EXPORTING name = 'KEY' iv = iv_key CHANGING ct = lt_fields ). + add_field( EXPORTING name = 'PATH' iv = ig_file CHANGING ct = lt_fields ). + add_field( EXPORTING name = 'FILENAME' iv = ig_file CHANGING ct = lt_fields ). rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). ENDMETHOD. "file_encode - METHOD file_decode. + METHOD obj_encode. - DATA: lt_fields TYPE tihttpnvp, - lv_string TYPE string. + DATA: lt_fields TYPE tihttpnvp. - FIELD-SYMBOLS: LIKE LINE OF lt_fields, - TYPE string. - CLEAR: ev_key, eg_file. - lv_string = iv_string. " type conversion - lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ). + add_field( EXPORTING name = 'KEY' iv = iv_key CHANGING ct = lt_fields ). + add_field( EXPORTING name = 'OBJ_TYPE' iv = ig_object CHANGING ct = lt_fields ). + add_field( EXPORTING name = 'OBJ_NAME' iv = ig_object CHANGING ct = lt_fields ). - READ TABLE lt_fields ASSIGNING WITH KEY name = 'KEY'. - IF sy-subrc = 0. - ev_key = -value. + rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). + + ENDMETHOD. "obj_encode + + METHOD file_obj_decode. + + DATA: lt_fields TYPE tihttpnvp. + + ASSERT eg_file IS SUPPLIED OR eg_object IS SUPPLIED. + + CLEAR: ev_key, eg_file, eg_object. + lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_string }| ). + + get_field( EXPORTING name = 'KEY' it = lt_fields CHANGING cv = ev_key ). + + IF eg_file IS SUPPLIED. + get_field( EXPORTING name = 'PATH' it = lt_fields CHANGING cv = eg_file ). + get_field( EXPORTING name = 'FILENAME' it = lt_fields CHANGING cv = eg_file ). ENDIF. - READ TABLE lt_fields ASSIGNING WITH KEY name = 'PATH'. - IF sy-subrc = 0. - ASSIGN COMPONENT 'PATH' OF STRUCTURE eg_file TO . - ASSERT IS ASSIGNED. - = -value. - ENDIF. - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'FILENAME'. - IF sy-subrc = 0. - ASSIGN COMPONENT 'FILENAME' OF STRUCTURE eg_file TO . - ASSERT IS ASSIGNED. - = -value. + IF eg_object IS SUPPLIED. + get_field( EXPORTING name = 'OBJ_TYPE' it = lt_fields CHANGING cv = eg_object ). + get_field( EXPORTING name = 'OBJ_NAME' it = lt_fields CHANGING cv = eg_object ). ENDIF. ENDMETHOD. "file_decode METHOD dbkey_encode. - DATA: lt_fields TYPE tihttpnvp, - ls_field LIKE LINE OF lt_fields. + DATA: lt_fields TYPE tihttpnvp. - ls_field-name = 'TYPE'. - ls_field-value = is_key-type. - APPEND ls_field TO lt_fields. - - ls_field-name = 'VALUE'. - ls_field-value = is_key-value. - APPEND ls_field TO lt_fields. + add_field( EXPORTING name = 'TYPE' iv = is_key-type CHANGING ct = lt_fields ). + add_field( EXPORTING name = 'VALUE' iv = is_key-value CHANGING ct = lt_fields ). rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). @@ -196,24 +224,13 @@ CLASS lcl_html_action_utils IMPLEMENTATION. METHOD dbkey_decode. - DATA: lt_fields TYPE tihttpnvp, - lv_string TYPE string. + DATA: lt_fields TYPE tihttpnvp. - FIELD-SYMBOLS: LIKE LINE OF lt_fields. - - lv_string = iv_string. " type conversion - lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ). + lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_string }| ). field_keys_to_upper( CHANGING ct_fields = lt_fields ). - READ TABLE lt_fields ASSIGNING WITH KEY name = 'TYPE'. - IF sy-subrc = 0. - rs_key-type = -value. - ENDIF. - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'VALUE'. - IF sy-subrc = 0. - rs_key-value = -value. - ENDIF. + get_field( EXPORTING name = 'TYPE' it = lt_fields CHANGING cv = rs_key-type ). + get_field( EXPORTING name = 'VALUE' it = lt_fields CHANGING cv = rs_key-value ). ENDMETHOD. "dbkey_decode @@ -230,9 +247,11 @@ CLASS lcl_html_action_utils IMPLEMENTATION. lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ). field_keys_to_upper( CHANGING ct_fields = lt_fields ). - READ TABLE lt_fields ASSIGNING WITH KEY name = 'XMLDATA' ##NO_TEXT. - IF sy-subrc = 0 AND -value(1) <> '<'. - rs_content-data_str = -value+1. " hmm + get_field( EXPORTING name = 'XMLDATA' it = lt_fields CHANGING cv = rs_content-data_str ). + IF rs_content-data_str(1) <> '<' AND rs_content-data_str+1(1) = '<'. " Hmmm ??? + rs_content-data_str = rs_content-data_str+1. + ELSE. + CLEAR rs_content-data_str. ENDIF. ENDMETHOD. "dbcontent_decode @@ -244,35 +263,26 @@ CLASS lcl_html_action_utils IMPLEMENTATION. DATA: lv_string TYPE string, lt_fields TYPE tihttpnvp. - FIELD-SYMBOLS: LIKE LINE OF lt_fields. + FIELD-SYMBOLS TYPE string. + CLEAR es_fields. CONCATENATE LINES OF it_postdata INTO lv_string. - REPLACE ALL OCCURRENCES OF gc_newline IN lv_string WITH lc_replace. - lt_fields = cl_http_utility=>if_http_utility~string_to_fields( lv_string ). + field_keys_to_upper( CHANGING ct_fields = lt_fields ). - READ TABLE lt_fields ASSIGNING WITH KEY name = 'key' ##NO_TEXT. - ASSERT sy-subrc = 0. - rs_fields-repo_key = -value. + get_field( EXPORTING name = 'REPO_KEY' it = lt_fields CHANGING cv = es_fields ). + get_field( EXPORTING name = 'USERNAME' it = lt_fields CHANGING cv = es_fields ). + get_field( EXPORTING name = 'EMAIL' it = lt_fields CHANGING cv = es_fields ). + get_field( EXPORTING name = 'COMMENT' it = lt_fields CHANGING cv = es_fields ). + get_field( EXPORTING name = 'BODY' it = lt_fields CHANGING cv = es_fields ). - READ TABLE lt_fields ASSIGNING WITH KEY name = 'username' ##NO_TEXT. - ASSERT sy-subrc = 0. - rs_fields-username = -value. + ASSIGN COMPONENT 'BODY' OF STRUCTURE es_fields TO . + ASSERT IS ASSIGNED. + REPLACE ALL OCCURRENCES OF lc_replace IN WITH gc_newline. - READ TABLE lt_fields ASSIGNING WITH KEY name = 'email' ##NO_TEXT. - ASSERT sy-subrc = 0. - rs_fields-email = -value. - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'comment' ##NO_TEXT. - ASSERT sy-subrc = 0. - rs_fields-comment = -value. - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'body' ##NO_TEXT. - ASSERT sy-subrc = 0. - rs_fields-body = -value. - REPLACE ALL OCCURRENCES OF lc_replace IN rs_fields-body WITH gc_newline. + ASSERT es_fields IS NOT INITIAL. ENDMETHOD. "parse_commit_request @@ -281,46 +291,26 @@ CLASS lcl_html_action_utils IMPLEMENTATION. DATA: lt_fields TYPE tihttpnvp, ls_field LIKE LINE OF lt_fields. - ls_field-name = 'KEY'. - ls_field-value = iv_key. - APPEND ls_field TO lt_fields. + add_field( EXPORTING name = 'KEY' iv = iv_key CHANGING ct = lt_fields ). rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ). ENDMETHOD. "repo_key_encode - METHOD field_keys_to_upper. - - FIELD-SYMBOLS LIKE LINE OF ct_fields. - - LOOP AT ct_fields ASSIGNING . - -name = to_upper( -name ). - ENDLOOP. - - ENDMETHOD. "field_keys_to_upper - METHOD decode_bg_update. - DEFINE _field. " TODO refactor and use globally in html actions - READ TABLE lt_fields ASSIGNING WITH KEY name = &1 ##NO_TEXT. - IF sy-subrc = 0. - rs_fields-&2 = -value. - ENDIF. - END-OF-DEFINITION. - DATA: lt_fields TYPE tihttpnvp. - FIELD-SYMBOLS: LIKE LINE OF lt_fields. lt_fields = cl_http_utility=>if_http_utility~string_to_fields( |{ iv_getdata }| ). field_keys_to_upper( CHANGING ct_fields = lt_fields ). - _field 'METHOD' method. - _field 'USERNAME' username. - _field 'PASSWORD' password. - _field 'AMETHOD' amethod. - _field 'ANAME' aname. - _field 'AMAIL' amail. + get_field( EXPORTING name = 'METHOD' it = lt_fields CHANGING cv = rs_fields ). + get_field( EXPORTING name = 'USERNAME' it = lt_fields CHANGING cv = rs_fields ). + get_field( EXPORTING name = 'PASSWORD' it = lt_fields CHANGING cv = rs_fields ). + get_field( EXPORTING name = 'AMETHOD' it = lt_fields CHANGING cv = rs_fields ). + get_field( EXPORTING name = 'ANAME' it = lt_fields CHANGING cv = rs_fields ). + get_field( EXPORTING name = 'AMAIL' it = lt_fields CHANGING cv = rs_fields ). ASSERT NOT rs_fields IS INITIAL. diff --git a/src/zabapgit_page.prog.abap b/src/zabapgit_page.prog.abap index 1a5fd4ec2..3df229647 100644 --- a/src/zabapgit_page.prog.abap +++ b/src/zabapgit_page.prog.abap @@ -341,12 +341,25 @@ CLASS lcl_gui_page_super IMPLEMENTATION. _add ' position: relative;'. _add ' display: inline;'. _add '}'. + _add '.dropdown_angle {'. + _add ' position: absolute !important;'. + _add ' right: -2px;'. + _add '}'. + _add '.dropbtn_angle {'. + _add ' width: 0;'. + _add ' height: 0;'. + _add ' border-left: 5px solid transparent;'. + _add ' border-right: 5px solid transparent;'. + _add ' border-bottom: 5px solid #4078c0;'. + _add ' transform: rotate(45deg);'. + _add ' -ms-transform: rotate(45deg);'. + _add '}'. _add '.dropdown_content {'. _add ' display: none;'. _add ' z-index: 1;'. _add ' position: absolute;'. _add ' right: 0;'. - _add ' top: 1.1em; /*IE7 woraround*/'. +* _add ' top: 1.1em; /*IE7 woraround*/'. _add ' background-color: #f9f9f9;'. _add ' white-space: nowrap;'. * _add ' min-width: 10em;'. diff --git a/src/zabapgit_page_commit.prog.abap b/src/zabapgit_page_commit.prog.abap index 1e04d19ee..9f8eb033c 100644 --- a/src/zabapgit_page_commit.prog.abap +++ b/src/zabapgit_page_commit.prog.abap @@ -5,6 +5,15 @@ CLASS lcl_gui_page_commit DEFINITION FINAL INHERITING FROM lcl_gui_page_super. PUBLIC SECTION. + + TYPES: BEGIN OF ty_commit_fields, + repo_key TYPE lcl_persistence_repo=>ty_repo-key, + username TYPE string, + email TYPE string, + comment TYPE string, + body TYPE string, + END OF ty_commit_fields. + METHODS: constructor IMPORTING io_repo TYPE REF TO lcl_repo_online @@ -104,7 +113,7 @@ CLASS lcl_gui_page_commit IMPLEMENTATION. ro_html->add( '
' ). ro_html->add( '
' ). - ro_html->add( || ). + ro_html->add( || ). ro_html->add( '' ). ro_html->add( '' ). @@ -245,12 +254,13 @@ CLASS lcl_gui_page_commit IMPLEMENTATION. METHOD commit_push. - DATA: ls_fields TYPE lcl_html_action_utils=>ty_commit_fields, + DATA: ls_fields TYPE ty_commit_fields, ls_comment TYPE ty_comment, lo_user TYPE REF TO lcl_persistence_user. - ls_fields = lcl_html_action_utils=>parse_commit_request( it_postdata ). + lcl_html_action_utils=>parse_commit_request( EXPORTING it_postdata = it_postdata + IMPORTING es_fields = ls_fields ). lo_user = lcl_app=>user( ). lo_user->set_repo_username( iv_url = mo_repo->get_url( ) iv_username = ls_fields-username ). diff --git a/src/zabapgit_page_diff.prog.abap b/src/zabapgit_page_diff.prog.abap index 5d050fec9..1709886dc 100644 --- a/src/zabapgit_page_diff.prog.abap +++ b/src/zabapgit_page_diff.prog.abap @@ -5,38 +5,133 @@ CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page_super. PUBLIC SECTION. + + TYPES: begin of ty_file_diff, + filename TYPE string, + o_diff TYPE REF TO lcl_diff, + end of ty_file_diff, + tt_file_diff TYPE STANDARD TABLE OF ty_file_diff. + METHODS: constructor IMPORTING - is_local TYPE ty_file - is_remote TYPE ty_file. + iv_key TYPE lcl_persistence_repo=>ty_repo-key + is_file TYPE ty_file OPTIONAL + is_object TYPE ty_item OPTIONAL + RAISING lcx_exception. METHODS lif_gui_page~render REDEFINITION. PRIVATE SECTION. - DATA: mv_filename TYPE string, - mo_diff TYPE REF TO lcl_diff. + DATA: mt_diff_files TYPE tt_file_diff. METHODS styles RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. - METHODS render_head RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. - METHODS render_diff RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. - METHODS render_lines RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + METHODS render_diff + IMPORTING is_diff TYPE ty_file_diff + RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + METHODS render_head + IMPORTING is_diff TYPE ty_file_diff + RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + METHODS render_lines + IMPORTING is_diff TYPE ty_file_diff + RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + METHODS append_diff + IMPORTING it_remote TYPE ty_files_tt + it_local TYPE ty_files_item_tt + iv_path TYPE string + iv_filename TYPE string + RAISING lcx_exception. ENDCLASS. "lcl_gui_page_diff CLASS lcl_gui_page_diff IMPLEMENTATION. METHOD constructor. + + DATA: lt_remote TYPE ty_files_tt, + lt_local TYPE ty_files_item_tt, + lt_results TYPE ty_results_tt, + lo_repo TYPE REF TO lcl_repo_online. + + FIELD-SYMBOLS: LIKE LINE OF lt_results. + super->constructor( ). - mv_filename = is_local-filename. + ASSERT is_file IS SUPPLIED OR is_object IS SUPPLIED. + ASSERT is_file IS INITIAL OR is_object IS INITIAL. " just one passed - CREATE OBJECT mo_diff - EXPORTING - iv_local = is_local-data - iv_remote = is_remote-data. + lo_repo ?= lcl_app=>repo_srv( )->get( iv_key ). + lt_remote = lo_repo->get_files_remote( ). + lt_local = lo_repo->get_files_local( ). + + IF is_file IS NOT INITIAL. + + append_diff( it_remote = lt_remote + it_local = lt_local + iv_path = is_file-path + iv_filename = is_file-filename ). + + ELSE. " is_object is supplied + + lt_results = lo_repo->status( ). + + LOOP AT lt_results ASSIGNING + WHERE obj_type = is_object-obj_type + AND obj_name = is_object-obj_name + AND match IS INITIAL. + + append_diff( it_remote = lt_remote + it_local = lt_local + iv_path = -path + iv_filename = -filename ). + + ENDLOOP. + + ENDIF. + + IF lines( mt_diff_files ) = 0. + lcx_exception=>raise( 'PAGE_DIFF ERROR: No diff files found' ). + ENDIF. ENDMETHOD. + METHOD append_diff. + + DATA: + ls_r_dummy LIKE LINE OF it_remote ##NEEDED, + ls_l_dummy LIKE LINE OF it_local ##NEEDED, + ls_diff_file LIKE LINE OF mt_diff_files. + + FIELD-SYMBOLS: LIKE LINE OF it_remote, + LIKE LINE OF it_local. + + READ TABLE it_remote ASSIGNING + WITH KEY filename = iv_filename + path = iv_path. + IF sy-subrc <> 0. + ASSIGN ls_r_dummy TO . + ENDIF. + + READ TABLE it_local ASSIGNING + WITH KEY file-filename = iv_filename + file-path = iv_path. + IF sy-subrc <> 0. + ASSIGN ls_l_dummy TO . + ENDIF. + + IF IS INITIAL AND IS INITIAL. + lcx_exception=>raise( |DIFF: file not found { iv_filename }| ). + ENDIF. + + CREATE OBJECT ls_diff_file-o_diff + EXPORTING + iv_local = -file-data + iv_remote = -data. + + ls_diff_file-filename = iv_filename. + APPEND ls_diff_file TO mt_diff_files. + + ENDMETHOD. "append_diff + METHOD styles. DATA lo_html TYPE REF TO lcl_html_helper. CREATE OBJECT lo_html. @@ -47,7 +142,6 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. lo_html->add( ' padding: 0.7em ' ). "#EC NOTEXT lo_html->add( '}' ). "#EC NOTEXT lo_html->add( 'div.diff_head {' ). "#EC NOTEXT - lo_html->add( ' border-bottom: 1px solid #DDD;' ). "#EC NOTEXT lo_html->add( ' padding-bottom: 0.7em;' ). "#EC NOTEXT lo_html->add( '}' ). "#EC NOTEXT lo_html->add( 'span.diff_name {' ). "#EC NOTEXT @@ -78,6 +172,8 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. lo_html->add( '}' ). "#EC NOTEXT lo_html->add( 'div.diff_content {' ). "#EC NOTEXT lo_html->add( ' background: #fff;' ). "#EC NOTEXT + lo_html->add( ' border-top: 1px solid #DDD;' ). "#EC NOTEXT + lo_html->add( ' border-bottom: 1px solid #DDD;' ). "#EC NOTEXT lo_html->add( '}' ). "#EC NOTEXT " Table part @@ -86,16 +182,18 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. lo_html->add( ' font-family: Consolas, Courier, monospace;' ). "#EC NOTEXT lo_html->add( '}' ). "#EC NOTEXT lo_html->add( 'table.diff_tab th {' ). "#EC NOTEXT - lo_html->add( ' color: grey;' ). "#EC NOTEXT + lo_html->add( ' color: #EEE;' ). "#EC NOTEXT + lo_html->add( ' background-color: #BBB;' ). "#EC NOTEXT lo_html->add( ' text-align: left;' ). "#EC NOTEXT - lo_html->add( ' font-weight: normal;' ). "#EC NOTEXT - lo_html->add( ' padding: 0.5em;' ). "#EC NOTEXT + lo_html->add( ' font-weight: bold;' ). "#EC NOTEXT + lo_html->add( ' padding-left: 0.5em;' ). "#EC NOTEXT + lo_html->add( ' font-size: 9pt;' ). "#EC NOTEXT lo_html->add( '}' ). "#EC NOTEXT lo_html->add( 'table.diff_tab td {' ). "#EC NOTEXT lo_html->add( ' color: #444;' ). "#EC NOTEXT lo_html->add( ' padding-left: 0.5em;' ). "#EC NOTEXT lo_html->add( ' padding-right: 0.5em;' ). "#EC NOTEXT - lo_html->add( ' font-size: 12pt;' ). "#EC NOTEXT + lo_html->add( ' font-size: 10pt;' ). "#EC NOTEXT lo_html->add( '}' ). "#EC NOTEXT lo_html->add( 'table.diff_tab td.num, th.num {' ). "#EC NOTEXT lo_html->add( ' text-align: right;' ). "#EC NOTEXT @@ -127,14 +225,14 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. CREATE OBJECT lo_html. - ls_stats = mo_diff->stats( ). + ls_stats = is_diff-o_diff->stats( ). lo_html->add( '
' ). "#EC NOTEXT lo_html->add( |+ { ls_stats-insert }| ). lo_html->add( |- { ls_stats-delete }| ). lo_html->add( |~ { ls_stats-update }| ). lo_html->add( '' ). "#EC NOTEXT - lo_html->add( |{ mv_filename }| ). + lo_html->add( |{ is_diff-filename }| ). lo_html->add( '' ). "#EC NOTEXT lo_html->add( '
' ). "#EC NOTEXT @@ -146,18 +244,18 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. CREATE OBJECT ro_html. ro_html->add( '
' ). "#EC NOTEXT - ro_html->add( render_head( ) ). + ro_html->add( render_head( is_diff ) ). " Content ro_html->add( '
' ). "#EC NOTEXT ro_html->add( '
' ). "#EC NOTEXT ro_html->add( '' ). "#EC NOTEXT ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT ro_html->add( '' ). "#EC NOTEXT - ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT ro_html->add( '' ). "#EC NOTEXT - ro_html->add( render_lines( ) ). + ro_html->add( render_lines( is_diff ) ). ro_html->add( '
@LOCALLOCAL@REMOTEREMOTE
' ). "#EC NOTEXT ro_html->add( '
' ). "#EC NOTEXT @@ -179,7 +277,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. CREATE OBJECT ro_html. - lt_diffs = mo_diff->get( ). + lt_diffs = is_diff-o_diff->get( ). LOOP AT lt_diffs ASSIGNING . IF -short = abap_false. @@ -189,7 +287,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. IF lv_insert_nav = abap_true. " Insert separator line with navigation IF -beacon > 0. - READ TABLE mo_diff->mt_beacons INTO lv_beacon INDEX -beacon. + READ TABLE is_diff-o_diff->mt_beacons INTO lv_beacon INDEX -beacon. ELSE. lv_beacon = '---'. ENDIF. @@ -228,11 +326,17 @@ CLASS lcl_gui_page_diff IMPLEMENTATION. METHOD lif_gui_page~render. + DATA ls_diff_file LIKE LINE OF mt_diff_files. + CREATE OBJECT ro_html. ro_html->add( header( io_include_style = styles( ) ) ). ro_html->add( title( 'DIFF' ) ). - ro_html->add( render_diff( ) ). + + LOOP AT mt_diff_files INTO ls_diff_file. + ro_html->add( render_diff( ls_diff_file ) ). + ENDLOOP. + ro_html->add( footer( ) ). ENDMETHOD. diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap index 88bb76655..73ec0fbfc 100644 --- a/src/zabapgit_page_main.prog.abap +++ b/src/zabapgit_page_main.prog.abap @@ -14,7 +14,8 @@ CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super. PRIVATE SECTION. CONSTANTS: BEGIN OF c_actions, - show TYPE string VALUE 'show' ##NO_TEXT, + show TYPE string VALUE 'show' ##NO_TEXT, + toggle_hide_files TYPE string VALUE 'toggle_hide_files' ##NO_TEXT, END OF c_actions. CONSTANTS: c_default_sortkey TYPE i VALUE 9999. @@ -25,10 +26,12 @@ CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super. is_first TYPE abap_bool, files TYPE tt_repo_files, sortkey TYPE i, + changes TYPE i, END OF ty_repo_item. TYPES tt_repo_items TYPE STANDARD TABLE OF ty_repo_item WITH DEFAULT KEY. - DATA: mv_show TYPE lcl_persistence_db=>ty_value. + DATA: mv_show TYPE lcl_persistence_db=>ty_value, + mv_hide_files TYPE abap_bool. METHODS: retrieve_active_repo @@ -157,6 +160,9 @@ CLASS lcl_gui_page_main IMPLEMENTATION. CREATE OBJECT ro_html. _add '/* REPOSITORY TABLE*/'. + _add 'div.repo_container {'. + _add ' position: relative;'. + _add '}'. _add '.repo_tab {'. _add ' border: 1px solid #DDD;'. _add ' border-radius: 3px;'. @@ -301,12 +307,13 @@ CLASS lcl_gui_page_main IMPLEMENTATION. METHOD render_repo. DATA: lt_repo_items TYPE tt_repo_items, + lo_tab_menu TYPE REF TO lcl_html_toolbar, lx_error TYPE REF TO lcx_exception, lo_log TYPE REF TO lcl_log. FIELD-SYMBOLS LIKE LINE OF lt_repo_items. - + CREATE OBJECT lo_tab_menu. CREATE OBJECT ro_html. ro_html->add( |
| ). @@ -317,17 +324,26 @@ CLASS lcl_gui_page_main IMPLEMENTATION. IMPORTING et_repo_items = lt_repo_items eo_log = lo_log ). -* extract_repo_content must be called before rendering the menu -* so that lo_log is filled with errors from the serialization + " extract_repo_content must be called before rendering the menu + " so that lo_log is filled with errors from the serialization ro_html->add( render_repo_menu( io_repo ) ). - IF io_repo->is_offline( ) = abap_false. + IF io_repo->is_offline( ) = abap_false and lo_log->count( ) > 0. ro_html->add( '
' ). -* shows eg. list of unsupported objects - ro_html->add( lo_log->to_html( ) ). + ro_html->add( lo_log->to_html( ) ). " shows eg. list of unsupported objects ro_html->add( '
' ). ENDIF. + ro_html->add( '
' ). + IF io_repo->is_offline( ) = abap_false. + IF mv_hide_files = abap_true. + lo_tab_menu->add( iv_txt = 'Show files' iv_act = c_actions-toggle_hide_files ). + ELSE. + lo_tab_menu->add( iv_txt = 'Hide files' iv_act = c_actions-toggle_hide_files ). + ENDIF. + ro_html->add( lo_tab_menu->render( iv_as_angle = abap_true ) ). + ENDIF. + ro_html->add( '' ). IF lines( lt_repo_items ) = 0. ro_html->add( '
' @@ -339,6 +355,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ENDLOOP. ENDIF. ro_html->add( '
' ). + ro_html->add( '
' ). CATCH lcx_exception INTO lx_error. ro_html->add( render_repo_menu( io_repo ) ). @@ -384,17 +401,19 @@ CLASS lcl_gui_page_main IMPLEMENTATION. -obj_type = -obj_type. -obj_name = -obj_name. -sortkey = c_default_sortkey. " Default sort key + -changes = 0. ENDAT. IF -filename IS NOT INITIAL. ls_file-path = -path. ls_file-filename = -filename. ls_file-is_changed = boolc( NOT -match = abap_true ). - ls_file-remote_only = -remote_only. + ls_file-new = -new. APPEND ls_file TO -files. - IF ls_file-is_changed = abap_true. + IF ls_file-is_changed = abap_true OR ls_file-new IS NOT INITIAL. -sortkey = 2. " Changed files + -changes = -changes + 1. ENDIF. ENDIF. @@ -444,7 +463,8 @@ CLASS lcl_gui_page_main IMPLEMENTATION. ro_html->add( || ). IF is_item-obj_name IS INITIAL. - ro_html->add( '' ). + ro_html->add( '' + && 'non-code and meta files' ). ELSE. CASE is_item-obj_type. "TODO ?? WHEN 'PROG' OR 'CLAS' OR 'FUGR'. @@ -467,29 +487,42 @@ CLASS lcl_gui_page_main IMPLEMENTATION. IF io_repo->is_offline( ) = abap_false. " Files for online repos only ro_html->add( '' ). - LOOP AT is_item-files INTO ls_file. - ro_html->add( |{ ls_file-path && ls_file-filename }| ). - ENDLOOP. + IF mv_hide_files = abap_false OR is_item-obj_type IS INITIAL. + LOOP AT is_item-files INTO ls_file. + ro_html->add( |{ ls_file-path && ls_file-filename }| ). + ENDLOOP. + ENDIF. ro_html->add( '' ). ro_html->add( '' ). IF lines( is_item-files ) = 0. - ro_html->add( 'Only Local' ). - ELSE. - LOOP AT is_item-files INTO ls_file. - IF ls_file-remote_only = abap_true. - ro_html->add( 'Only Remote' ). - ELSEIF ls_file-is_changed = abap_true. - lv_difflink = lcl_html_action_utils=>file_encode( - iv_key = io_repo->get_key( ) - ig_file = ls_file ). - ro_html->add_anchor( - iv_txt = 'diff' - iv_act = |{ gc_action-go_diff }?{ lv_difflink }| ). - ELSE. - ro_html->add( | | ). - ENDIF. - ENDLOOP. + ro_html->add( 'new @local' ). + ELSEIF is_item-changes > 0. + IF mv_hide_files = abap_true AND is_item-obj_name IS NOT INITIAL. + lv_difflink = lcl_html_action_utils=>obj_encode( + iv_key = io_repo->get_key( ) + ig_object = is_item ). + ro_html->add_anchor( + iv_txt = |diff ({ is_item-changes })| + iv_act = |{ gc_action-go_diff }?{ lv_difflink }| ). + ELSE. + LOOP AT is_item-files INTO ls_file. + IF ls_file-new = gc_new-remote. + ro_html->add( 'new @remote' ). + ELSEIF ls_file-new = gc_new-local. + ro_html->add( 'new @local' ). + ELSEIF ls_file-is_changed = abap_true. + lv_difflink = lcl_html_action_utils=>file_encode( + iv_key = io_repo->get_key( ) + ig_file = ls_file ). + ro_html->add_anchor( + iv_txt = 'diff' + iv_act = |{ gc_action-go_diff }?{ lv_difflink }| ). + ELSE. + ro_html->add( | | ). + ENDIF. + ENDLOOP. + ENDIF. ENDIF. ro_html->add( '' ). @@ -632,6 +665,9 @@ CLASS lcl_gui_page_main IMPLEMENTATION. WHEN c_actions-show. " Change displayed repo lcl_app=>user( )->set_repo_show( lv_key ). ev_state = gc_event_state-re_render. + WHEN c_actions-toggle_hide_files. " Toggle file diplay + lcl_app=>user( )->toggle_hide_files( ). + ev_state = gc_event_state-re_render. ENDCASE. ENDMETHOD. @@ -643,6 +679,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. lo_repo LIKE LINE OF lt_repos. retrieve_active_repo( ). " Get and validate key of user default repo + mv_hide_files = lcl_app=>user( )->get_hide_files( ). CREATE OBJECT ro_html. diff --git a/src/zabapgit_page_stage.prog.abap b/src/zabapgit_page_stage.prog.abap index 56e34cd45..39a53ecf4 100644 --- a/src/zabapgit_page_stage.prog.abap +++ b/src/zabapgit_page_stage.prog.abap @@ -56,8 +56,8 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. IF iv_action <> 'stage_all'. - lcl_html_action_utils=>file_decode( EXPORTING iv_string = iv_getdata - IMPORTING eg_file = ls_file ). + lcl_html_action_utils=>file_obj_decode( EXPORTING iv_string = iv_getdata + IMPORTING eg_file = ls_file ). ENDIF. CASE iv_action. diff --git a/src/zabapgit_persistence.prog.abap b/src/zabapgit_persistence.prog.abap index 85dda76d7..fe8f5a88a 100644 --- a/src/zabapgit_persistence.prog.abap +++ b/src/zabapgit_persistence.prog.abap @@ -377,6 +377,13 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. RETURNING VALUE(rv_email) TYPE string RAISING lcx_exception. + METHODS toggle_hide_files + RAISING lcx_exception. + + METHODS get_hide_files + RETURNING VALUE(rv_hide) TYPE abap_bool + RAISING lcx_exception. + PRIVATE SECTION. CONSTANTS c_type_user TYPE lcl_persistence_db=>ty_type VALUE 'USER'. @@ -399,6 +406,7 @@ CLASS lcl_persistence_user DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app. email TYPE string, repo_show TYPE lcl_persistence_repo=>ty_repo-key, repo_config TYPE ty_repo_config_tt, + hide_files TYPE abap_bool, END OF ty_user. METHODS constructor @@ -606,6 +614,22 @@ CLASS lcl_persistence_user IMPLEMENTATION. ENDMETHOD. "get_repo_email + METHOD toggle_hide_files. + + DATA ls_user TYPE ty_user. + + ls_user = read( ). + ls_user-hide_files = boolc( ls_user-hide_files = abap_false ). + update( ls_user ). + + ENDMETHOD. "toggle_hide_files + + METHOD get_hide_files. + + rv_hide = read( )-hide_files. + + ENDMETHOD. "get_hide_files + ENDCLASS. CLASS lcl_persistence_db IMPLEMENTATION. diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap index 10fda7d4e..df226946d 100644 --- a/src/zabapgit_unit_test.prog.abap +++ b/src/zabapgit_unit_test.prog.abap @@ -1558,4 +1558,63 @@ CLASS ltcl_login_manager IMPLEMENTATION. ENDMETHOD. -ENDCLASS. \ No newline at end of file +ENDCLASS. + +CLASS ltcl_html_action_utils DEFINITION + FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL + INHERITING FROM CL_AUNIT_ASSERT. + + PUBLIC SECTION. + + METHODS add_field FOR TESTING. + METHODS get_field FOR TESTING. + +ENDCLASS. "ltcl_html_action_utils + +CLASS ltcl_html_action_utils IMPLEMENTATION. + + METHOD add_field. + + DATA: lt_fields TYPE tihttpnvp, + lt_answer TYPE tihttpnvp, + ls_field LIKE LINE OF lt_fields. + + ls_field-name = 'NAME'. + ls_field-value = 'TEST'. + APPEND ls_field TO lt_answer. + + ls_field-name = 'VALUE'. + ls_field-value = 'TEST'. + APPEND ls_field TO lt_answer. + + lcl_html_action_utils=>add_field( EXPORTING name = 'NAME' iv = 'TEST' + CHANGING ct = lt_fields ). + lcl_html_action_utils=>add_field( EXPORTING name = 'VALUE' iv = ls_field + CHANGING ct = lt_fields ). + + assert_equals( act = lt_fields exp = lt_answer ). + + ENDMETHOD. "add_field + + METHOD get_field. + + DATA: lt_fields TYPE tihttpnvp, + ls_answer LIKE LINE OF lt_fields, + ls_field LIKE LINE OF lt_fields. + + ls_answer-name = 'NAME'. + ls_answer-value = 'TEST'. + APPEND ls_answer TO lt_fields. + + lcl_html_action_utils=>get_field( EXPORTING name = 'NAME' it = lt_fields + CHANGING cv = ls_field-value ). + lcl_html_action_utils=>get_field( EXPORTING name = 'NAME' it = lt_fields + CHANGING cv = ls_field ). + + ls_answer-name = 'TEST'. + ls_answer-value = 'TEST'. + assert_equals( act = ls_field exp = ls_answer ). " Both field are filled! + + ENDMETHOD. "get_field + +ENDCLASS. "ltcl_html_action_utils \ No newline at end of file diff --git a/src/zabapgit_util.prog.abap b/src/zabapgit_util.prog.abap index b81006c12..420da89b6 100644 --- a/src/zabapgit_util.prog.abap +++ b/src/zabapgit_util.prog.abap @@ -458,8 +458,8 @@ CLASS lcl_diff DEFINITION FINAL. RETURNING VALUE(rs_count) TYPE ty_count. PRIVATE SECTION. - DATA mt_diff TYPE ty_diffs_tt. - DATA ms_stats TYPE ty_count. + DATA mt_diff TYPE ty_diffs_tt. + DATA ms_stats TYPE ty_count. CLASS-METHODS: unpack @@ -537,7 +537,7 @@ CLASS lcl_diff IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF mt_diff. - IF lines( mt_diff ) < 200. + IF lines( mt_diff ) < 100. LOOP AT mt_diff ASSIGNING . -short = abap_true. ENDLOOP. @@ -546,7 +546,7 @@ CLASS lcl_diff IMPLEMENTATION. WHERE NOT result IS INITIAL AND short = abap_false. lv_index = sy-tabix. - DO 20 TIMES. " Backward + DO 10 TIMES. " Backward READ TABLE mt_diff INDEX ( lv_index - sy-index ) ASSIGNING . IF sy-subrc <> 0 OR -short = abap_true. " tab bound or prev marker EXIT. @@ -554,7 +554,7 @@ CLASS lcl_diff IMPLEMENTATION. -short = abap_true. ENDDO. - DO 20 TIMES. " Forward + DO 10 TIMES. " Forward READ TABLE mt_diff INDEX ( lv_index + sy-index - 1 ) ASSIGNING . IF sy-subrc <> 0. " tab bound reached EXIT.