anchor.diff:               body     TYPE string,
              END OF ty_fields.
   
  -    METHODS:
  -      render_files
  -        RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
  -        RAISING   lcx_exception,
  -      push
  +    METHODS push
           IMPORTING it_postdata TYPE cnht_post_data_tab
  -        RAISING   lcx_exception,
  -      update_userdata
  +        RAISING   lcx_exception.
  +
  +    METHODS update_userdata
           IMPORTING is_fields TYPE ty_fields
  -        RAISING   lcx_exception,
  -      parse
  +        RAISING   lcx_exception.
  +
  +    METHODS parse
           IMPORTING it_postdata      TYPE cnht_post_data_tab
           RETURNING VALUE(rs_fields) TYPE ty_fields.
   
  +    METHODS render_menu
  +      RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
  +
  +    METHODS render_stage
  +        RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
  +        RAISING   lcx_exception.
  +
  +    METHODS render_form
  +        RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
  +        RAISING   lcx_exception.
  +
       METHODS styles
  +      RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
  +
  +    METHODS scripts
         RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
   
   ENDCLASS.
  
positive.code: 
    ENDMETHOD.
  
    METHOD render_files.
  
      DATA: lt_stage TYPE lcl_stage=>ty_stage_tt.
  
      FIELD-SYMBOLS: <ls_stage> LIKE LINE OF lt_stage.
  
  
      CREATE OBJECT ro_html.
  
      lt_stage = mo_stage->get_all( ).
  
      ro_html->add( '<table>' ).
      LOOP AT lt_stage ASSIGNING <ls_stage>.
        ro_html->add( '<tr>' ).
        ro_html->add( '<td>' ).
        ro_html->add( <ls_stage>-file-path && <ls_stage>-file-filename ).
        ro_html->add( '</td>' ).
        ro_html->add( '<td>' ).
        ro_html->add( lcl_stage=>method_description( <ls_stage>-method ) ).
        ro_html->add( '</td>' ).
        ro_html->add( '</tr>' ).
      ENDLOOP.
      ro_html->add( '</table>' ).
      ro_html->add( '<br>' ).
  
    ENDMETHOD.
  
    METHOD lif_gui_page~on_event.
  
      CASE iv_action.
        WHEN 'post'.
          push( it_postdata ).
          "lcl_app=>repo_srv( )->free_stage( ??? ).
          rv_state = gc_event_state-go_back_to_bookmark.
        WHEN 'cancel'.
          rv_state = gc_event_state-go_back.
      ENDCASE.
  
    ENDMETHOD.
  
    METHOD lif_gui_page~render.
  
      DATA: lo_user  TYPE REF TO lcl_persistence_user,
            lv_user  TYPE string,
            lv_email TYPE string.
  
  
      CREATE OBJECT ro_html.
  
      lo_user = lcl_app=>user( ).
      lv_user = lo_user->get_username( ).
      lv_email = lo_user->get_email( ).
  
  * see https://git-scm.com/book/ch5-2.html
  * commit messages should be max 50 characters
  * body should wrap at 72 characters
  
      ro_html->add( header( io_include_style = styles( ) ) ).
      ro_html->add( title( iv_page_title = 'COMMIT' ) ).
  
  
      ro_html->add( '<div class="repo">' ).
  
      ro_html->add( lcl_gui_page_main=>render_repo_top( mo_repo ) ).
  
      " UNDER CONSTRUCTION
      ro_html->add( render_files( ) ).
  
  *    ro_html->add( '<a href="sapevent:cancel">Cancel</a>' ).
  
      ro_html->add( '<form method="post" action="sapevent:post">' ).
      ro_html->add( '<table>' ).
      ro_html->add( '<tr>' ).
      ro_html->add( '<td>username</td>' ).
      ro_html->add( '<td>' ).
      ro_html->add( '<input name="username" type="text" value="' && lv_user && '">' ).
      ro_html->add( '</td>' ).
      ro_html->add( '</tr>' ).
      ro_html->add( '<tr>' ).
      ro_html->add( '<td>email</td>' ).
      ro_html->add( '<td>' ).
      ro_html->add( '<input name="email" type="text" value="' && lv_email && '">' ).
      ro_html->add( '</td>' ).
      ro_html->add( '</tr>' ).
      ro_html->add( '<tr>' ).
      ro_html->add( '<td>comment</td>' ).
      ro_html->add( '<td>' ).
      ro_html->add( '<input name="comment" type="text" id="cmt" maxlength="50" size="50">' ).
      ro_html->add( '</td>' ).
      ro_html->add( '</tr>' ).
      ro_html->add( '<tr>' ).
      ro_html->add( '<td colspan="2">' ).
      ro_html->add( 'body <br>' ) ##NO_TEXT.
      ro_html->add( '<textarea name="body" rows="10" cols="72"></textarea>' ).
      ro_html->add( '</td>' ).
      ro_html->add( '</tr>' ).
      ro_html->add( '<tr>' ).
      ro_html->add( '<td colspan="2" align="right">' ).
      ro_html->add( '<input type="submit" value="Push">' ).
      ro_html->add( '</td>' ).
      ro_html->add( '</tr>' ).
      ro_html->add( '</table>' ).
      ro_html->add( '</form>' ).
      ro_html->add( '<script>' ).
      ro_html->add( 'document.getElementById("cmt").focus();' ).
      ro_html->add( '</script>' ).
      ro_html->add( '</div>' ).
  
      ro_html->add( footer( ) ).
  
    ENDMETHOD.
  
    METHOD styles.
      CREATE OBJECT ro_html.
  
negative.code: 
    METHOD lif_gui_page~render.
  
      DATA: lv_data    TYPE lcl_persistence_db=>ty_content-data_str,
            lo_toolbar TYPE REF TO lcl_html_toolbar.
  
      TRY.
          lv_data = lcl_app=>db( )->read(
  