Merge pull request #467 from sbcgua/master

External files for css and js
This commit is contained in:
Lars Hvam 2016-11-27 12:36:45 +01:00 committed by GitHub
commit 1cf4018f13
20 changed files with 1531 additions and 1191 deletions

View File

@ -69,6 +69,7 @@ INCLUDE zabapgit_background.
INCLUDE zabapgit_transport.
INCLUDE zabapgit_services. " All services here
INCLUDE zabapgit_gui_asset_manager.
INCLUDE zabapgit_gui_pages. " All GUI pages here
INCLUDE zabapgit_gui_pages_userexit IF FOUND.
INCLUDE zabapgit_gui_router.

View File

@ -0,0 +1,584 @@
/*
* ABAPGIT COMMON CSS
*/
/* GLOBALS */
body {
font-family: Arial,Helvetica,sans-serif;
font-size: 12pt;
background: #E8E8E8;
}
a, a:visited {
color: #4078c0;
text-decoration: none;
}
a:hover, a:active {
cursor: pointer;
text-decoration: underline;
}
img { border: 0px; vertical-align: middle; }
table { border-collapse: collapse; }
pre { display: inline; }
form input, textarea, select {
border: 1px solid #DDD;
padding: 3px 6px;
}
form input:focus, textarea:focus {
border: 1px solid #8cadd9;
}
/* MODIFIERS */
.grey { color: lightgrey !important; }
.emphasis { font-weight: bold !important; }
.attention { color: red !important; }
.crossout { text-decoration: line-through !important; }
.right { text-align:right; }
.paddings { padding: 0.5em 0.5em; }
.pad-sides { padding: 0 0.3em; }
.pad4px { padding: 4px; }
/* STRUCTURE DIVS, HEADER & FOOTER */
td.headpad { padding-top: 11px; }
td.logo { width: 164px; }
div#header {
padding: 0.5em 0.5em;
border-bottom: 3px double lightgrey;
}
div#toc {
padding: 0.5em 1em;
background-color: #f2f2f2;
}
div#toc div.toc_grid {
margin: -0.3em 0em;
}
div#toc div.toc_grid a {
color: #ccc;
}
div#toc:hover div.toc_grid a {
color: #4078c0;
}
div#toc div.toc_row {
margin: 0.3em 0em;
}
div#footer {
padding: 0.5em 1em;
border-top: 3px double lightgrey;
text-align: center;
}
div.dummydiv {
background-color: #f2f2f2;
padding: 0.5em 1em;
text-align: center;
}
span.version {
display: block;
color: grey;
margin-top: 0.3em;
}
span.page_title {
font-weight: normal;
font-size: 18pt;
color: #bbb;
padding-left: 0.4em;
}
/* MENU */
div.menu { display: inline; }
div.menu .menu_end { border-right: 0px !important; }
div.menu a {
padding-left: 0.5em;
padding-right: 0.5em;
border-right: 1px solid lightgrey;
font-size: 12pt;
}
div.menu_vertical { display: inline; }
div.menu_vertical a {
display: block;
font-size: 12pt;
}
/*DROP DOWN*/
.dropdown {
position: relative;
display: inline;
}
.dropdown_angle {
position: absolute !important;
right: -4px;
top: -1px;
}
.dropbtn_angle {
width: 0;
height: 0;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-bottom: 7px solid #4078c0;
transform: rotate(45deg);
-ms-transform: rotate(45deg);
}
.dropdown_content {
display: none;
z-index: 1;
position: absolute;
right: -12px;
top: 1em;
padding: 6px 10px 10px 10px;
white-space: nowrap;
}
.dropdown div.minizone {
display: none;
z-index: 1;
position: absolute;
padding: 0px;
width: 16px;
height: 16px;
bottom: 0px;
left: -16px;
}
.dropdown_angle .dropdown_content {
top: -1px;
}
.dropdown:hover .dropdown_content { display: block; }
.dropdown:hover .minizone { display: block; }
.dropdown_content a {
padding: 0.2em;
background-color: #f9f9f9;
text-decoration: none;
display: block;
border: none !important;
}
.dropdown_content div.box {
border-bottom: 1px solid #C0C0C0;
border-right: 1px solid #C0C0C0;
background-color: #f9f9f9;
padding: 2px;
}
.dropdown_content td { text-align: left; padding: 2px; }
.dropdown_content td a { padding: 0em 0.2em; }
.dropdown_content td.icon { padding: 0 3px 0 6px; }
.dropdown_content a:hover { background-color: #f1f1f1 }
.dropdown:hover .dropbtn { color: #79a0d2; }
/* REPOSITORY */
div.repo {
margin-top: 3px;
background-color: #f2f2f2;
padding: 0.5em 1em 0.5em 1em;
}
.repo_name span.name {
font-weight: bold;
color: #333;
font-size: 14pt;
}
.repo_name span.url {
color: #ccc;
font-size: 12pt;
margin-left: 0.5em;
}
.repo_name img {
vertical-align: baseline;
margin: 0 5px 0 5px;
}
.repo_attr {
color: grey;
font-size: 12pt;
}
.repo_attr span {
margin-left: 0.2em;
margin-right: 0.5em;
}
.repo_attr span.bg_marker {
border: 1px solid #d2d2d2;
border-radius: 3px;
background: #d8d8d8;
color: #fff;
font-size: 8pt;
padding: 4px 2px 3px 2px;
}
.repo_attr span.branch {
padding: 2px 4px;
border: 1px solid #d9d9d9;
border-radius: 4px;
background-color: #e2e2e2;
}
.repo_attr span.branch_head {
border-color: #d8dff3;
background-color: #eceff9;
}
.repo_attr span.branch_branch {
border-color: #e7d9b1;
background-color: #f8f0d8;
}
/* MISC AND REFACTOR */
.hidden-submit {
border: 0 none;
height: 0;
width: 0;
padding: 0;
margin: 0;
overflow: hidden;
}
#debug-output {
text-align: right;
padding-right: 0.5em;
color: #ccc;
font-style: italic;
font-size: small;
}
/* REPOSITORY TABLE*/
div.repo_container {
position: relative;
}
.repo_tab {
border: 1px solid #DDD;
border-radius: 3px;
background: #fff;
margin-top: 0.5em;
}
.repo_tab td {
border-top: 1px solid #eee;
vertical-align: middle;
color: #333;
padding-top: 2px;
padding-bottom: 2px;
}
.repo_tab td.icon {
width: 32px;
text-align: center;
}
.repo_tab td.type {
width: 3em;
}
.repo_tab td.object {
padding-left: 0.5em;
}
.repo_tab td.files {
padding-left: 0.5em;
}
.repo_tab td.cmd {
text-align: right;
padding-left: 0.5em;
padding-right: 0.7em;
}
.repo_tab tr.unsupported { color: lightgrey; }
.repo_tab tr.modified { background: #fbf7e9; }
.repo_tab tr:first-child td { border-top: 0px; }
.repo_tab td.current_dir { color: #ccc; }
.repo_tab td.cmd span.state-block {
margin-left: 1em;
font-family: Consolas, Lucida Console, Courier, monospace;
font-size: x-small;
vertical-align: 13%;
display: inline-block;
text-align: center;
}
.repo_tab td.cmd span.state-block span {
display: inline-block;
padding: 0px 2px;
border: 1px solid #000;
}
.repo_tab td.cmd span.state-block span.added {
background-color: #69ad74;
border-color: #579e64;
color: white;
}
.repo_tab td.cmd span.state-block span.changed {
background-color: #e0c150;
border-color: #d4af25;
color: white;
}
.repo_tab td.cmd span.state-block span.mixed {
background-color: #e0c150;
border-color: #579e64;
color: #69ad74;
}
.repo_tab td.cmd span.state-block span.deleted {
background-color: #c76861;
border-color: #b8605a;
color: white;
}
.repo_tab td.cmd span.state-block span.none {
background-color: #e8e8e8;
border-color: #dbdbdb;
color: #c8c8c8;
}
/* STAGE */
.stage_tab {
border: 1px solid #DDD;
background: #fff;
margin-top: 0.2em;
}
.stage_tab td {
border-top: 1px solid #eee;
color: #333;
vertical-align: middle;
padding: 2px 0.5em;
}
.stage_tab th {
color: #BBB;
font-size: 10pt;
text-align: left;
font-weight: normal;
background-color: #edf2f9;
padding: 4px 0.5em;
}
.stage_tab td.status {
width: 2em;
text-align: center;
}
.stage_tab tbody tr:first-child td { padding-top: 0.5em; }
.stage_tab tbody tr:last-child td { padding-bottom: 0.5em; }
.stage_tab td.cmd a { padding: 0px 4px; }
/* STAGE */
.stage_tab td.method {
color: #ccc;
}
.stage_tab tr.firstrow td { border-top: 0px; }
.stage_tab tr.title td {
color: #BBB;
font-size: 10pt;
background-color: #edf2f9;
padding: 4px 0.5em;
text-align: center;
}
/* COMMIT */
div.form_div {
margin: 0.5em 0em;
background-color: #F8F8F8;
padding: 1em 1em;
}
div.form_div td.field_name {
color: #BBB;
padding-right: 1em;
}
/* SETTINGS STYLES */
div.settings_container {
padding: 0.5em;
font-size: 10pt;
color: #444;
background-color: #f2f2f2;
}
/* DIFF */
div.diff {
background-color: #f2f2f2;
padding: 0.7em
}
div.diff_head {
padding-bottom: 0.7em;
}
span.diff_name {
padding-left: 0.5em;
color: grey;
}
span.diff_name strong {
color: #333;
}
span.diff_banner {
border-style: solid;
border-width: 1px;
border-radius: 3px;
padding-left: 0.3em;
padding-right: 0.3em;
}
.diff_ins {
border-color: #7bea7b;
background-color: #d3f8d3;
}
.diff_del {
border-color: #ff667d;
background-color: #ffccd4;
}
.diff_upd {
border-color: #dada00;
background-color: #ffffcc;
}
div.diff_content {
background: #fff;
border-top: 1px solid #DDD;
border-bottom: 1px solid #DDD;
}
div.diff_head span.state-block {
margin-left: 0.5em;
font-family: Consolas, Lucida Console, Courier, monospace;
display: inline-block;
text-align: center;
}
div.diff_head span.state-block span {
display: inline-block;
padding: 0px 4px;
border: 1px solid #000;
}
div.diff_head span.state-block span.added {
background-color: #69ad74;
border-color: #579e64;
color: white;
}
div.diff_head span.state-block span.changed {
background-color: #e0c150;
border-color: #d4af25;
color: white;
}
div.diff_head span.state-block span.mixed {
background-color: #e0c150;
border-color: #579e64;
color: #69ad74;
}
div.diff_head span.state-block span.deleted {
background-color: #c76861;
border-color: #b8605a;
color: white;
}
div.diff_head span.state-block span.none {
background-color: #e8e8e8;
border-color: #dbdbdb;
color: #c8c8c8;
}
/* DIFF TABLE */
table.diff_tab {
font-family: Consolas, Courier, monospace;
font-size: 10pt;
}
table.diff_tab td,th {
color: #444;
padding-left: 0.5em;
padding-right: 0.5em;
}
table.diff_tab th {
text-align: left;
font-weight: normal;
padding-top: 3px;
padding-bottom: 3px;
}
table.diff_tab thead.header th {
color: #EEE;
background-color: #BBB;
text-align: left;
font-weight: bold;
padding-left: 0.5em;
font-size: 9pt;
}
table.diff_tab thead.nav_line {
background-color: #edf2f9;
}
table.diff_tab thead.nav_line th {
color: #bbb;
}
table.diff_tab td.num, th.num {
text-align: right;
color: #ccc;
border-left: 1px solid #eee;
border-right: 1px solid #eee;
}
table.diff_tab code {
font-family: inherit;
white-space: pre;
}
table.diff_tab tbody tr:first-child td { padding-top: 0.5em; }
table.diff_tab tbody tr:last-child td { padding-bottom: 0.5em; }
/* DEBUG INFO STYLES */
div.debug_container {
padding: 0.5em;
font-size: 10pt;
color: #444;
font-family: Consolas, Courier, monospace;
}
div.debug_container p {
margin: 0px;
}
/* DB ENTRIES */
div.db_list {
background-color: #f2f2f2;
padding: 0.5em;
}
table.db_tab pre {
display: inline-block;
overflow: hidden;
word-wrap:break-word;
white-space: pre-wrap;
margin: 0px;
width: 30em;
}
table.db_tab tr.firstrow td { padding-top: 0.5em; }
table.db_tab th {
text-align: left;
color: #888;
padding: 0.5em;
border-bottom: 1px #ddd solid;
}
table.db_tab td {
color: #333;
padding: 0.5em;
vertical-align: top;
}
table.db_tab td.data {
color: #888;
font-style: italic;
}
/* DB ENTRY DISPLAY */
div.db_entry {
background-color: #f2f2f2;
padding: 0.5em;
}
div.db_entry pre {
display: block;
overflow: hidden;
word-wrap:break-word;
white-space: pre-wrap;
background-color: #eaeaea;
padding: 0.5em;
margin: 0.5em 0em;
width: 50em;
}
div.db_entry table.toolbar {
width: 50em;
}
table.tag {
display: inline-block;
border: 1px #b3c1cc solid;
background-color: #eee;
border-radius: 3px;
margin-right: 0.5em;
}
table.tag td { padding: 0.2em 0.5em; }
table.tag td.label { background-color: #b3c1cc; }
/* DB ENTRY DISPLAY */
div.db_entry textarea { margin: 0.5em 0em; }
table.tag {
display: inline-block;
border: 1px #b3c1cc solid;
background-color: #eee;
border-radius: 3px;
margin-right: 0.5em;
}
table.tag td { padding: 0.2em 0.5em; }
table.tag td.label { background-color: #b3c1cc; }

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_W3MI" serializer_version="v2.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<NAME>ZABAPGIT_CSS_COMMON</NAME>
<TEXT>AbapGit common styles</TEXT>
<PARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZABAPGIT_CSS_COMMON</OBJID>
<NAME>fileextension</NAME>
<VALUE>.css</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZABAPGIT_CSS_COMMON</OBJID>
<NAME>filename</NAME>
<VALUE>common.css</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZABAPGIT_CSS_COMMON</OBJID>
<NAME>filesize</NAME>
<VALUE>12136</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZABAPGIT_CSS_COMMON</OBJID>
<NAME>mimetype</NAME>
<VALUE>text/css</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZABAPGIT_CSS_COMMON</OBJID>
<NAME>version</NAME>
<VALUE/>
</WWWPARAMS>
</PARAMS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -55,7 +55,8 @@ TYPES: BEGIN OF ty_metadata,
TYPES: BEGIN OF ty_web_asset,
url TYPE w3url,
content TYPE string,
base64 TYPE string,
content TYPE xstring,
END OF ty_web_asset.
TYPES tt_web_assets TYPE STANDARD TABLE OF ty_web_asset WITH DEFAULT KEY.

View File

@ -29,8 +29,8 @@ CLASS lcl_gui DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app.
DATA: mi_cur_page TYPE REF TO lif_gui_page,
mt_stack TYPE STANDARD TABLE OF ty_page_stack,
mt_assets TYPE tt_w3urls,
mo_router TYPE REF TO lcl_gui_router,
mo_asset_man TYPE REF TO lcl_gui_asset_manager,
mo_html_viewer TYPE REF TO cl_gui_html_viewer.
METHODS constructor
@ -39,12 +39,16 @@ CLASS lcl_gui DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app.
METHODS startup
RAISING lcx_exception.
METHODS cache_image
IMPORTING iv_url TYPE w3url
iv_base64 TYPE string.
METHODS cache_html
IMPORTING iv_html TYPE string
IMPORTING iv_text TYPE string
RETURNING VALUE(rv_url) TYPE w3url.
METHODS cache_asset
IMPORTING iv_text TYPE string OPTIONAL
iv_xdata TYPE xstring OPTIONAL
iv_url TYPE w3url OPTIONAL
iv_type TYPE c
iv_subtype TYPE c
RETURNING VALUE(rv_url) TYPE w3url.
METHODS render
@ -182,9 +186,7 @@ CLASS lcl_gui IMPLEMENTATION.
METHOD call_page.
DATA: lt_assets TYPE tt_web_assets,
ls_stack TYPE ty_page_stack.
FIELD-SYMBOLS <ls_asset> LIKE LINE OF lt_assets.
DATA: ls_stack TYPE ty_page_stack.
IF iv_replacing = abap_false AND NOT mi_cur_page IS INITIAL.
ls_stack-page = mi_cur_page.
@ -192,16 +194,6 @@ CLASS lcl_gui IMPLEMENTATION.
APPEND ls_stack TO mt_stack.
ENDIF.
lt_assets = ii_page->get_assets( ).
IF lines( lt_assets ) > 0.
LOOP AT lt_assets ASSIGNING <ls_asset>.
READ TABLE mt_assets TRANSPORTING NO FIELDS WITH KEY table_line = <ls_asset>-url.
CHECK sy-subrc IS NOT INITIAL.
APPEND <ls_asset>-url TO mt_assets.
cache_image( iv_url = <ls_asset>-url iv_base64 = <ls_asset>-content ).
ENDLOOP.
ENDIF.
mi_cur_page = ii_page.
render( ).
@ -216,20 +208,43 @@ CLASS lcl_gui IMPLEMENTATION.
METHOD startup.
DATA: lt_events TYPE cntl_simple_events,
ls_event LIKE LINE OF lt_events.
ls_event LIKE LINE OF lt_events,
lt_assets TYPE tt_web_assets.
FIELD-SYMBOLS <ls_asset> LIKE LINE OF lt_assets.
CREATE OBJECT mo_router.
CREATE OBJECT mo_asset_man.
CREATE OBJECT mo_html_viewer
EXPORTING
query_table_disabled = abap_true
parent = cl_gui_container=>screen0.
CLEAR ls_event.
cache_asset( iv_xdata = mo_asset_man->get_asset( 'css_common' )
iv_url = 'css/common.css'
iv_type = 'text'
iv_subtype = 'css' ).
cache_asset( iv_xdata = mo_asset_man->get_asset( 'js_common' )
iv_url = 'js/common.js'
iv_type = 'text'
iv_subtype = 'javascript' ).
lt_assets = mo_asset_man->get_images( ).
IF lines( lt_assets ) > 0.
LOOP AT lt_assets ASSIGNING <ls_asset>.
cache_asset( iv_xdata = <ls_asset>-content
iv_url = <ls_asset>-url
iv_type = 'image'
iv_subtype = 'png' ).
ENDLOOP.
ENDIF.
ls_event-eventid = mo_html_viewer->m_id_sapevent.
ls_event-appl_event = abap_true.
APPEND ls_event TO lt_events.
mo_html_viewer->set_registered_events( lt_events ).
mo_html_viewer->set_registered_events( lt_events ).
SET HANDLER me->on_event FOR mo_html_viewer.
ENDMETHOD. "startup
@ -246,57 +261,59 @@ CLASS lcl_gui IMPLEMENTATION.
METHOD cache_html.
DATA: lt_data TYPE TABLE OF text200.
CALL FUNCTION 'SCMS_STRING_TO_FTEXT'
EXPORTING
text = iv_html
TABLES
ftext_tab = lt_data.
mo_html_viewer->load_data(
IMPORTING
assigned_url = rv_url
CHANGING
data_table = lt_data ).
rv_url = cache_asset( iv_text = iv_text
iv_type = 'text'
iv_subtype = 'html' ).
ENDMETHOD. "cache_html
METHOD cache_image.
METHOD cache_asset.
DATA lv_xtmp TYPE xstring.
DATA lv_size TYPE int4.
DATA lt_xdata TYPE TABLE OF w3_mime. " RAW255
DATA: lv_xstr TYPE xstring,
lt_xdata TYPE TABLE OF w3_mime, " RAW255
lv_size TYPE int4.
CALL FUNCTION 'SSFC_BASE64_DECODE'
ASSERT iv_text IS SUPPLIED OR iv_xdata IS SUPPLIED.
IF iv_text IS SUPPLIED. " String input
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
b64data = iv_base64
text = iv_text
IMPORTING
bindata = lv_xtmp
buffer = lv_xstr
EXCEPTIONS
OTHERS = 1.
ASSERT sy-subrc = 0.
ASSERT sy-subrc = 0. " Image data error
ELSE. " Raw input
lv_xstr = iv_xdata.
ENDIF.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = lv_xtmp
buffer = lv_xstr
IMPORTING
output_length = lv_size
TABLES
binary_tab = lt_xdata.
mo_html_viewer->load_data(
EXPORTING type = 'image'
subtype = 'png'
EXPORTING
type = iv_type
subtype = iv_subtype
size = lv_size
url = iv_url
CHANGING data_table = lt_xdata
EXCEPTIONS OTHERS = 1 ) ##NO_TEXT.
IMPORTING
assigned_url = rv_url
CHANGING
data_table = lt_xdata
EXCEPTIONS
OTHERS = 1 ) ##NO_TEXT.
ASSERT sy-subrc = 0. " Image data error
ENDMETHOD. "cache_image
ENDMETHOD. " cache_asset.
METHOD get_current_page_name.
IF mi_cur_page IS BOUND.

View File

@ -0,0 +1,414 @@
*&---------------------------------------------------------------------*
*& Include ZABAPGIT_GUI_ASSET_MANAGER
*&---------------------------------------------------------------------*
CLASS lcl_gui_asset_manager DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_gui.
PUBLIC SECTION.
METHODS get_asset
IMPORTING iv_asset_name TYPE string
RETURNING VALUE(rv_data) TYPE xstring
RAISING lcx_exception.
METHODS get_images
RETURNING VALUE(rt_images) TYPE tt_web_assets.
PRIVATE SECTION.
METHODS get_inline_asset
IMPORTING iv_asset_name TYPE string
RETURNING VALUE(rv_data) TYPE xstring
RAISING lcx_exception.
METHODS get_mime_asset
IMPORTING iv_asset_name TYPE c
RETURNING VALUE(rv_data) TYPE xstring
RAISING lcx_exception.
METHODS get_inline_images
RETURNING VALUE(rt_images) TYPE tt_web_assets.
ENDCLASS. "lcl_gui_asset_manager
CLASS lcl_gui_asset_manager IMPLEMENTATION.
METHOD get_asset.
DATA: lv_asset_name TYPE string,
lv_mime_name TYPE wwwdatatab-objid.
lv_asset_name = to_upper( iv_asset_name ).
CASE lv_asset_name.
WHEN 'CSS_COMMON'.
lv_mime_name = 'ZABAPGIT_CSS_COMMON'.
WHEN 'JS_COMMON'.
lv_mime_name = 'ZABAPGIT_JS_COMMON'.
WHEN OTHERS.
lcx_exception=>raise( |Improper resource name: { iv_asset_name }| ).
ENDCASE.
rv_data = get_mime_asset( lv_mime_name ).
IF rv_data IS INITIAL. " Fallback to inline asset
rv_data = get_inline_asset( lv_asset_name ).
ENDIF.
IF rv_data IS INITIAL.
lcx_exception=>raise( |Failed to get GUI resource: { iv_asset_name }| ).
ENDIF.
ENDMETHOD. " get_asset.
METHOD get_mime_asset.
DATA: ls_key TYPE wwwdatatab,
lv_size_c TYPE wwwparams-value,
lv_size TYPE i,
lt_w3mime TYPE STANDARD TABLE OF w3mime.
ls_key-relid = 'MI'.
ls_key-objid = iv_asset_name.
" Get exact file size
CALL FUNCTION 'WWWPARAMS_READ'
EXPORTING
relid = ls_key-relid
objid = ls_key-objid
name = 'filesize'
IMPORTING
value = lv_size_c
EXCEPTIONS
entry_not_exists = 1.
IF sy-subrc IS NOT INITIAL.
RETURN.
ENDIF.
lv_size = lv_size_c.
" Get binary data
CALL FUNCTION 'WWWDATA_IMPORT'
EXPORTING
key = ls_key
TABLES
mime = lt_w3mime
EXCEPTIONS
wrong_object_type = 1
import_error = 2.
IF sy-subrc IS NOT INITIAL.
RETURN.
ENDIF.
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = lv_size
IMPORTING
buffer = rv_data
TABLES
binary_tab = lt_w3mime
EXCEPTIONS
failed = 1.
IF sy-subrc IS NOT INITIAL.
RETURN.
ENDIF.
ENDMETHOD. " get_mime_asset.
METHOD get_images.
FIELD-SYMBOLS <image> LIKE LINE OF rt_images.
rt_images = get_inline_images( ).
" Convert to xstring
LOOP AT rt_images ASSIGNING <image>.
CALL FUNCTION 'SSFC_BASE64_DECODE'
EXPORTING
b64data = <image>-base64
IMPORTING
bindata = <image>-content
EXCEPTIONS
OTHERS = 1.
ASSERT sy-subrc = 0. " Image data error
ENDLOOP.
ENDMETHOD. " get_images.
DEFINE _inline.
APPEND &1 TO lt_data.
END-OF-DEFINITION.
METHOD get_inline_asset.
DATA: lt_data TYPE ty_string_tt,
lv_str TYPE string.
CASE iv_asset_name.
WHEN 'CSS_COMMON'.
" @@abapmerge include zabapgit_css_common.w3mi.data.css > _inline '$$'.
WHEN 'JS_COMMON'.
" @@abapmerge include zabapgit_js_common.w3mi.data.js > _inline '$$'.
WHEN OTHERS.
lcx_exception=>raise( |No inline resource: { iv_asset_name }| ).
ENDCASE.
CONCATENATE LINES OF lt_data INTO lv_str SEPARATED BY gc_newline.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = lv_str
IMPORTING
buffer = rv_data
EXCEPTIONS
OTHERS = 1.
ASSERT sy-subrc = 0.
ENDMETHOD. " get_inline_asset.
METHOD get_inline_images.
DATA ls_image TYPE ty_web_asset.
* see https://github.com/larshp/abapGit/issues/201 for source SVG
ls_image-url = 'img/logo' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAAKMAAAAoCAYAAACSG0qbAAAABHNCSVQICAgIfAhkiAAA'
&& 'AAlwSFlzAAAEJQAABCUBprHeCQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9y'
&& 'Z5vuPBoAAA8VSURBVHic7Zx7cJzVeYef31nJAtvYko1JjM3FYHlXimwZkLWyLEMcwIGQ'
&& 'cEkDJWmTltLStGkoDCkzwBAuCemUlksDNCkhJTTTljJpZhIuBQxxAWPvyuYiW7UkG8Il'
&& 'UByIsS1sLEu75+0fu5JXu9/etAJz0TOzM/rOec85765+37m+3yczY8w0NU3qrwv9npfa'
&& 'Hfx02pPPd469sgk+7misYnyjpWXy5IOG7kd8ZjjNjEtr13TdOm7eTfCxwo2lUJAQASRu'
&& '2dnRfMn4uDbBx42yxZhPiMNMCHKCsVK2GGuqqqoQUwrZTAhygrFQshjfaGmZ/M7yxQtm'
&& 'xGL9/qDqzwLxQvYTgpygXEoS4/DQ7LE1O05atLBu1YZdE4KcYLwpupoOmCO+5Z2dXPfE'
&& 'xk07Tm2ZroGhBwX1wAygKqiOiVX2Rw9Jam/gyH0wuGGzvTEudRYSY4HFyogghxN2n7Sw'
&& 'IendvcCioLoOtCCXNeqohOf0oDwPq9f3Wt/77dOHlWhYzUj/BRybTnrGEnZO5wv2m0rq'
&& 'DezJoOiqeZbzegzpk6TVPPWJTT39y5svMogF1ZcesjlQgkwYp4F+EJQXwv4E+MiLUZJa'
&& 'F7AIcRq4hWZ2mMRhQD/oZcErXv7FScaja3rt/wpU9E/sFyLACQq57wB/XIl/gWIstn2T'
&& 'xpHVre7ZW71p8sFDeQscSEHKu3pTBadNH2Lq61VT57iwNazLgaNSqYaUaWXLDZCJIbBo'
&& 'g3tK2A2xHns0oMrm3CRrqdTPnAVMiUIEmLlz2XGLMxNmH7YrifFcoUIHalHj8f8p6UfA'
&& 'O+932weStno1zghps6Q7GBFiUYRxopkeaZ2vIwLyfxtQ4vV8lbWHNScacf+T/vwqn90o'
&& 'MZYhRADJ+bv725vmj6Q8tHWffPKUD6IgO/tsfawneRHYd97Pdg8kSyJaZiGtBY4pYPYO'
&& 'kH84C0Cyv8tKSiK7OZ99EpYAJ2V8AhkRY5lCHGaxhaq+BLCzY/EXd5y0aOG0td1vf1AF'
&& 'CWCw7/1u80DQEtahQvcB03MyjQfM7Hwnmxfv9dPivX5SssqOwuzPSqk71mN3ymw5ZtdK'
&& 'dmVIdly8xx7JZ29yy0qptwrGLMRRCA6T1w93nLTo5Lq13Zv625tOMRd6DLF4v0lWmQO8'
&& 'qPko45y7TWaHZyUnwa6M99mN2fYbuu1V4K5oxF1B4Z4UgFifrQHWFLNbvkh1QheV5DNN'
&& 'TZMqFWIGs5zX48M95PTqGa3TZ4erzbvj8/WUErf0L2++uNyGJLn2Js1oDeuYlkbNbmlR'
&& 'deXup2hq0qS2es2VlHMDFaOlRdXL5uuwlnodG23QTEljCkbJV3d7WHOK+dXWqHqZnZeb'
&& 'Y1fGe3OFOArRU5GTGbSHNWdwUL8Epo1qIQ9V/bXu3HES4jCznNfjb7e1zZ8Ri/UD1MLz'
&& 'u05s/huMx4IKGNy4+8Tj/2Pqk8++Vaji86TQqxEuNNM5rWGtSCaokSDkgd0QjbidoPvN'
&& '+5s7t9jz5TgdbdBMvLsG2cop6FgLUdUaZk804jYKuyrWa6vzlT2+XrOqQnxd6KwQOj5R'
&& 'hULpL9Yaxkcj7g3QT6zK397ZbdtGtbtAZ+B0U3adkt0c67E7OyI6fFDuSpktC6HGpJjU'
&& 'GmZ3NOI2mdnVnX32eHZZ7903hGXfBG8mp3J7sd/B0DPCTgUmBf9O7lmMybk56or3Jn8f'
&& 'oLVB7Q5dZ9Iy4OBsw2jYbUUk96fwQrzHf955iBZzsDA+aL9k1owZ20fNzaY/tfFXwK48'
&& 'ldQkSZ5YqJXmZk15JaJfmOmfgdOAmgCzWrCvyum5aIO+Uor3AIbOx7QV2TeBMPu3vKYA'
&& 'Sw091hbWt4PKRhu0oDqkmND1wAnk3vkOmAN2lRLa2hrWMVm5Tek2R3286YzWiK4eQltk'
&& '9g1gMfsFMhVYKunR1obQddk+SXZqwLe8acMGe7fYb9HZk7wm3utrBmpsqiXsyClHMHK6'
&& '0hLWoRjHBfmLbP9K3bPYjFPIFWLaQeZnlZ8H4JyFflrMwcK4wG63v3/ycZnXOzqalxE0'
&& 'mU7x9rvvVv93oVZqBtzNGGeU7Jbp9pZGzS7ReiVQVyDfmXRda4PaA9p5mBLmWGmmSron'
&& 'M0FytUGGgjPTAi8UIeVk9u1og5YOJ0QbNBOjIac+Y22JPgLQ1WV7Ol+w36xebYnhtGpj'
&& 'FjBYTj3l4KY9/dx6My4d74pN/Ki/Y9HpSG5HR/Nyh/1DHtO9OM6dvWFDwbtWslOykt6U'
&& 's5VWZbOFnQtsyMqvc56Ty3T7NeBhLGAfDZDpe5nX6V5uXpbZ43K2NGQ2V9glwLas/I62'
&& 'hfrE8EWsJ3mFsGYs+OQqze+A1cBLgbmma4f/9AmOJGBe5vKVLYN1W6wnOWSHmdkVhexM'
&& 'PG6yC0x2AbmjoQ3njdh4uwrSw1Htmq5bd3Y0I3FLpQ5n0GTSQ7s6Fva70RPYTPbi+Pz0'
&& 'J7ryboRC+m5PnRfsJjVEAfp5bLNflTb52dKIBj36RWY5ZyX2WCLukvbX67ZYHFLHZtGw'
&& '+1fD/jDL8qQljWpav9m6Uw3wKYzXgUNJTxsk+0Fssw0L6x+j4dCx6eF/BEtwDBkbx7Fe'
&& '29gWCa0yrC2rvXXO26WZfrWG3V2kji8zWbm0QUev67GX5ZgZ8A0H121hXIIZNrxou9oW'
&& '6m4b4m/z2aTP+fsAohF3PaNHROvssZ8ElRs5DnyPBAkovxDFF4oJESDeY9tJD4Ur5umg'
&& 'PSFm1Uy23Zk2SaM7e43p5Y4uxUMzu2f4H56+tuZmff2gfTqHrGEy5DkW6Abo7LH7gfsB'
&& '2uo1LQGzBmoYFSwg57vNcjqqo4F1JXh2S7Zfx83TZZNqdD6MXkQkU369jONgcmfxe83M'
&& 'B7XQEdEhg1B0HzDk2ZHpy3vBqLPpMQhyi/f2AIA3WyPZG6KkeVpKiE925awEi7H6JRsA'
&& 'cqJDfIi9oayfW8ZB5dY/TFeX7YlGQg+RmgJkcnSQfWyr9QP92enmGcgeNCvx67mXbGdb'
&& 'xD1hjI5AklJ+ydgTUGz6iiZNXd09+gYGGIRlQgXn6wDesZYSRFsJOYES5QjSw7fqnu7q'
&& 'Bqh7uqu7f3nzdw3uKFJszEIcpqVRs12SRuAYiTrJ1YXMzSGgS6iQnHmWyQWe70pySz/F'
&& 'MZagMWnMlaiTuTqTTih7s7IIHm1T1ncVI37l3BAAA4McAYF7iAvG17uxExi1U6Igd9XN'
&& 'Dj+UmZA8qPrf3MDQbeSPIN8Ldub0JzeWLcT2I3Swn8JFhr4VQnMze5uKnv0ugOHfUXa3'
&& 'ZhySedkR0eGDuMtbw/rTZCI1pA9PF0yWf4e3MnJ7YKXm0pOr6H03QRIIZeYnUj1njhid'
&& '8aaRscKX/VGWSRLsCjnK2rcdC3njGUsQ5PSdv92yqJaMk5WBoRMpJsSnNgZufBdCkmsN'
&& '60FgRbllK8PNzOlttT/qpz2sOUnpeWGHvq9ewcyc28/7XQCru213NOL+l6wgZ0kXAjnD'
&& 'cazP7gXuTdu41rCyxbgr3mt/P16+F6LgUVXtmq5bC237yNsNu5YtPBZgx4kLFznZ1XlM'
&& 'BzB/1liECBAN801yhfiq0HflbKXz1ojZ4qCylSBsbm6q/93wX0n0Q1Ir6UzWYXaZyZaF'
&& 'qqxeZn813n4ZlhPWJWXMo00P5OTDF5c0qmm8fRlPip6bFhHk6Ti3ddfy5i3OXBemJQE2'
&& 'A5g/c/qaTasC8krC0KdzE+3qWG/y6thmW7Vui/UkQ7w51vqDaGnRZFInPdlshNQ2C8oJ'
&& 'h0oqaefF++zmzh5bu7bbXrBxjp88bp5qgZzNdyfWD/9t+B+TO4GW8/p+R0SHcGBxLWEF'
&& 'jiQlHeIXEaRIPZAVRMVCTDcQCUh8LfOyaqjgCcr+YpY7NRFa2VY/egsqtNtdw8ie5gjJ'
&& 'oUTqicjofOYA2f/YgcR03s5MMBF4wlIa7rMr5mnUyru6xl0LZAeFvDG3l83DF5199muk'
&& 'oJO1FUMoviSi8Nh9Kg+Ru7qvUvCqPO+cMZsxbPsM4HXW9KcrEyKApTa7s9BVSyLaF3Ik'
&& 'SbLSQros18RyInkkV2u5q+6zLaS+aCT0oJl/QVI78IWcsvDos1vtLYCE551QKNuCKW63'
&& '+157g36cMOYI9yWhC3K+j4KDEHKxC9+t0altDaFHwL/kvVZIBJw761/uM5/MTJlU7S/Z'
&& 'N6hTBNlhZA0OPReNuGdM6nL4jR4G5ZnRusAtKmVHwg1Slcxe11nODZJKh1fJ6kwM3dQa'
&& 'VgOw3omjkGuL9/o/L/vFTzs7mi8pQZBpIT4f9PxE2bRFQncY9pdjKDoExDH7ebzPbgFo'
&& 'bQjdng48KBfvzZau77ORN61FI66PsW2N7ARiZnZTZ589BtAWCV1v5J1zF+JNVdui2CbL'
&& 'OcJsq1ejD2lVgCDL4e14r58J0N6k+cmEu0HYIssdrbxgnaGeeG9yJEg32hC6GbOix81y'
&& 'trTsWLtiixpgQNLZ4yVEgCT++xSP0H7C0N1ZadVAh6SR3kRm2WfJO0H/XqTuQcn+IlOI'
&& 'AFjRVaZhus3g2az0WuA0wcIi5QP3DDNIIPtakBABYltts7AO4OEi9eTFYGCksSRzwM4L'
&& 'ECKAM1gG9tVR5UP+RkqZN5s7a0yBnwUEOSDp7GlPPp83BH0srO+1PmQrDIIen9wOdnln'
&& 'n31G5n9ZtDLL6ck2x3uTf6DUee8rASX6vNnyWI/dmZ0R77O7LNXLBkWy9CE7Pd6XvNih'
&& 'QkEQeZHZl9PBFtsDstebtyWFwv0B4r32UrzXn+6xDtBdwIslNL0N+JnMvravxiraFO/s'
&& 'tm0y+xzQlcfkddCNCe/vGfP7GQH6lzdfbHAjqSCBHZK+PN5CzESSlixgnhMLzXAeXp+3'
&& 'hWfuM0sWL10abQv1CdtHixzvmtiYPhcvSFOTJk1NEPEQkWdPUry4oc96y2o3YJiWs5Wx'
&& 'zbYq83THHHu9Y1N2kG45tDRqdsgzxxuznKPOGbsTsN2M7d6zfXhePJ5Ici1h6mUcAcw0'
&& '8Zo5fp35NoqKxAjwTrRhZmLSpPY9ySmPzV27dm+lTn9cKSTGA+XT+03Jq+l8HBLv2Q7c'
&& 'X9K+ygQTFGDcHhaaoGJyouDNV7JH+eGj4mF6gspoC+tzJt1ObsT4MDsF2zxs886+Ml5v'
&& '/PogUvEwPUGFiE+SX4gAtQa1gkhV7onQR4oJMR5oxC6stDeghd7Dh6E+CPw/HL4vVO2f'
&& 'cpUAAAAASUVORK5CYII='.
APPEND ls_image TO rt_images.
* http://fa2png.io/r/octicons/
* colour: #808080
* size: 16
* https://www.base64-image.de/ can be used to convert images to base64
ls_image-url = 'img/sync' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA6ElEQVQYGY3BIWuUAQAG'
&& '4Pc7N72xsbGBYNE8tYpVZKDZX2CcYLEZ9yQxOQSz3D/YmkUsVovRQ2SYNJnlkFfH7VZu'
&& 'wefJgrGHXnjrpQeu5B93smCwr6qqqp54433mDI5Ucds1u577o+p35hyoqe2cMThWVatJ'
&& '7KiZrZxz18SJqqtJPFXPssRgw0oSH9WNXMCQU76qzSxx2cxxTlk3yhKb6mcSQy7kvjpM'
&& 'Ylt98tpjN3POyFTdSuKSqppayxkjE/Uhc36p+m7PhhXr7vmmfhhnzpHPJqqqquqdcRY8'
&& 'spq47sAXMyde2c3/+wvX7Y18BexhBwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/toc' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAFVBMVEUAAACAgICAgICA'
&& 'gICAgICAgICAgIAO39T0AAAABnRSTlMABBCRlMXJzV0oAAAAN0lEQVQIW2NgwABuaWlB'
&& 'YWlpDgwJDAxiAgxACshgYwAz0tLY2NISSBWBMYAmg4ADyBZhARCJAQBBchGypGCbQgAA'
&& 'AABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/repo_online' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAApVBMVEUAAABQbJxQbJxQ'
&& 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ'
&& 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ'
&& 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ'
&& 'bJz+TJ01AAAANnRSTlMAAQIDBAcJCgwSFBocHygqMTM1NkRHSU1QUWFiZGlweHuDiImL'
&& 'lZiio6a5vsfT3uTo6e3x9fsxY2JuAAAAgUlEQVQYGXXB6RaBUBSA0e+IEuIiMs9zhlDn'
&& '/R/NZWmt/LA3f1RcoaB50SydCbn20wjedkPu3sKSpMGH21PhLdZ0BATZ+cCXtxtDHGLV'
&& 'pgFW9QqJj2U0wvJvMF+5jiNGI3HK9dMQSouH6sRoFGoWd8l1dEDRWlWPQsFS98KPvvDH'
&& 'C3HLClrWc70ZAAAAAElFTkSuQmCC'.
APPEND ls_image TO rt_images.
ls_image-url = 'img/repo_offline' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAVFBMVEUAAACAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICuaWnmAAAAG3RSTlMAAgQFBgsQFxweIiMtN3yI'
&& 'nqOvt9Hp6/Hz9fktMNR/AAAAXElEQVQYV5WO2xJAMAxES1q3ugfF/v9/0qLyyL4k58xk'
&& 'J0p9D7N5oeqZgSwy7fDZnHNdEE1gWK116tksl7hPimGFFPWYl7MU0zksRCl8TStKg1AJ'
&& '0XNC8Zm4/c0BUVQHi0llOUYAAAAASUVORK5CYII='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/pkg' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA30lEQVQoU43OIUuDcRSF'
&& '8fvqhuB0mFwaKLbVBVdkX0GTFss+wYL2H4rJIIgyQQSzZcUPoGHZ9CKCmAwTMS8Y/ga3'
&& 'BWVjT7hwOQ+HEzEbMhU7jrTd69q2KhtFRU2nrvS927dm3pyqPXcuNRVD7sxiRIQlDSc+'
&& 'PGjZUFDWkYekLfdoV2XYua4rSZ61pZBkEUq2XPty41XuXJIiZGNhPDVZiFCYIMSor+Db'
&& '7RQhYnQnCsNvNmGgPFFYMQh1PU9aqrLxyGUNx/p66r9mUc2hFx3JhU9vDtQU4y9KGjaV'
&& '/gXT+AGZVIinhU2EAwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/branch' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAqFBMVEUAAACAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
&& 'gICAgID/OyosAAAAN3RSTlMAAQIDBAYICQ8TFRweJScoKSo3Oj1FRk1dYWJjZmhzdIaJ'
&& 'j5GVm6CwsrS5vsHDyszV19ne7/X583teZAAAAIFJREFUGFdVytkagVAYheFvFzJlnqc0'
&& 'EEoR+u//zhxI7dbZ9z4LMJ1op9DmjpntdXiBigHbLiAYqukBVr63+YGRSazgCY/iEooP'
&& 'xKZxr0EnSbo14B1Rg4msKzj150fJrQpERPLBv7mIfNxlq+zRbZsu0JYpGlcdwjY9Twfr'
&& 'nAbNsr6IKQxJI/U5CgAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/link' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAXVBMVEUAAACAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVwFMKAAAAHnRSTlMAAwQFBgcK'
&& 'FR4gIiMmP0JHSm+RmKDByM/R09rg+/0jN/q+AAAAX0lEQVQYV43Nxw6AIBAE0FGw916Z'
&& '//9MRQ0S4sG5bPZlCxqSCyBGXgFUJKUA4A8PUOKONzuQOxOZIjcLkrMvxGQg3skSCFYL'
&& 'Kl1Ds5LWz+33yyf4rQOSf6CjnV6rHeAA87gJtKzI8ocAAAAASUVORK5CYII='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/code' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAElBMVEUAAACAgICAgICA'
&& 'gICAgICAgIC07w1vAAAABXRSTlMABECUxcOwZQcAAAA1SURBVAhbY2AODQ0NEWBgYGVg'
&& 'YGByhNAMKgIMrKyhAQxMDhA+QwCCZgVqIIUP1Q+yJzTUAAAfUAq+Os55uAAAAABJRU5E'
&& 'rkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/bin' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAElBMVEUAAACAgICAgICA'
&& 'gICAgICAgIC07w1vAAAABXRSTlMABECUxcOwZQcAAABBSURBVAhbXcqxDYAwAMRAK8h9'
&& 'hmAARoANvuD3X4UCiojqZMlsbe8JAuN6ZZ9ozThRCVmsJe9H0HwdXf19W9v2eAA6Fws2'
&& 'RotPsQAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/obj' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAIVBMVEUAAACAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgIDcWqnoAAAACnRSTlMABD1AZI+RlcPFIaFe1gAA'
&& 'AEVJREFUCFtjYF+1atVKAQYGLgYGBuaJEJrBUgBCM0+A0AwLgLQIgyOIZmwCSgNptgAG'
&& '1gQQfzKDhgCSPFw9Kg2yZ9WqAgBWJBENLk6V3AAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/lock' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAOVBMVEUAAACIiIiIiIiI'
&& 'iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIjNaTNB'
&& 'AAAAEnRSTlMABgdBVXt8iYuRsNXZ3uDi6Pmu6tfUAAAASUlEQVQYV63KSxJAQBAE0TQ0'
&& 'Znym1f0PayE0QdjJ5asCgGTu1hClqjppvaRXB60swBeA2QNUAIq+ICvKx367nqAn/P8Y'
&& 't2jg3Q5rgASaF3KNRwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/dir' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAASFBMVEUAAABmksxmksxm'
&& 'ksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxm'
&& 'ksxmksxmksxmksxMwQo8AAAAF3RSTlMABhIYIy1fZmhpe3+IiYuMkZvD7e/x93sipD4A'
&& 'AAA+SURBVBhXY2BABzwiokAgzAYXEGdiBAIWIYQAPzcQCApzgwEXM4M4KuBDFxAYKAEx'
&& 'VAFeBlYOTiTAzoThewD5hBAcnWM4gwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/burger' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAHlBMVEUAAABtktltktlt'
&& 'ktltktltktltktltktltktltktk7ccVDAAAACXRSTlMAFDBLY2SFoPGv/DFMAAAAJ0lE'
&& 'QVQIW2NggIHKmWAwmaETwpjGoBoKBo4MmIAkxXApuGK4dgwAAJa5IzLs+gRBAAAAAElF'
&& 'TkSuQmCC'.
APPEND ls_image TO rt_images.
ls_image-url = 'img/star' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAilBMVEUAAABejclejcle'
&& 'jclejclejclejclejclejclejclejclejclejclejclejclejclejclejclejclejcle'
&& 'jclejclejclejclejclejclejclejclejclejclejclejclejclejclejclejclejcle'
&& 'jclejclejclejclejclejclejclejclejcn2yvsVAAAALXRSTlMAAQIFBwkKCw0QERUY'
&& 'HB4jLzEzNjg7PVdYYmRvd3mDm52eub7R0+Tr8fX3+/16wo8zAAAAcElEQVQYGW3BBxKC'
&& 'MABFwYcQETv2hg1UVP79ryeTZBxw3MWL+JGltBgVtGRSSoORVOAE8Xi5zVU7rWfDCOaV'
&& 'Gu59mLz0dTPUBg95eYjVK2VdOzjBW9YZL5FT4i2k5+YoKcY5VPsQkoumOLsu1mjFHx8o'
&& 'ahA3YV7OfwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ls_image-url = 'img/star-grey' ##NO_TEXT.
ls_image-base64 =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAilBMVEUAAADQ0NDQ0NDQ'
&& '0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ'
&& '0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ'
&& '0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NC2QdifAAAALXRSTlMAAQIFBwkKCw0QERUY'
&& 'HB4jLzEzNjg7PVdYYmRvd3mDm52eub7R0+Tr8fX3+/16wo8zAAAAcElEQVQYGW3BBxKC'
&& 'MABFwYcQETv2hg1UVP79ryeTZBxw3MWL+JGltBgVtGRSSoORVOAE8Xi5zVU7rWfDCOaV'
&& 'Gu59mLz0dTPUBg95eYjVK2VdOzjBW9YZL5FT4i2k5+YoKcY5VPsQkoumOLsu1mjFHx8o'
&& 'ahA3YV7OfwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_images.
ENDMETHOD. " get_inline_images.
ENDCLASS. "lcl_gui_asset_manager

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PROGDIR>
<NAME>ZABAPGIT_GUI_ASSET_MANAGER</NAME>
<STATE>A</STATE>
<SQLX/>
<EDTX/>
<VARCL>X</VARCL>
<DBAPL/>
<DBNA/>
<CLAS/>
<TYPE/>
<OCCURS/>
<SUBC>I</SUBC>
<APPL/>
<SECU/>
<CNAM/>
<CDAT>0000-00-00</CDAT>
<UNAM/>
<UDAT>0000-00-00</UDAT>
<VERN/>
<LEVL/>
<RSTAT/>
<RMAND/>
<RLOAD>E</RLOAD>
<FIXPT/>
<SSET/>
<SDATE>0000-00-00</SDATE>
<STIME/>
<IDATE>0000-00-00</IDATE>
<ITIME/>
<LDBNAME/>
<UCCHECK>X</UCCHECK>
</PROGDIR>
<TPOOL>
<item>
<ID>R</ID>
<KEY/>
<ENTRY>Include ZABAPGIT_GUI_ASSET_MANAGER</ENTRY>
<LENGTH>34</LENGTH>
<SPLIT/>
</item>
</TPOOL>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,208 @@
/**********************************************************
* ABAPGIT JS function library
**********************************************************/
/**********************************************************
* Polyfills
**********************************************************/
// Bind polyfill (for IE7), taken from https://developer.mozilla.org/
if (!Function.prototype.bind) {
Function.prototype.bind = function(oThis) {
if (typeof this !== "function") {
throw new TypeError("Function.prototype.bind - subject is not callable");
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function() {},
fBound = function() {
return fToBind.apply(this instanceof fNOP
? this
: oThis,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
if (this.prototype) {
fNOP.prototype = this.prototype;
}
fBound.prototype = new fNOP();
return fBound;
};
}
/**********************************************************
* Common functions
**********************************************************/
// Output text to the debug div
function debugOutput(text, dstID) {
var stdout = document.getElementById(dstID || "debug-output");
var wrapped = "<p>" + text + "</p>";
stdout.innerHTML = stdout.innerHTML + wrapped;
}
// Create hidden form and submit with sapevent
function submitSapeventForm(params, action) {
var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", "sapevent:" + action);
for(var key in params) {
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", key);
hiddenField.setAttribute("value", params[key]);
form.appendChild(hiddenField);
}
document.body.appendChild(form);
form.submit();
}
// Set focus to a control
function setInitialFocus(id) {
document.getElementById(id).focus();
}
// Submit an existing form
function submitFormById(id) {
document.getElementById(id).submit();
}
/**********************************************************
* STAGE PAGE Logic
**********************************************************/
// Stage helper constructor
function StageHelper(params) {
this.pageSeed = params.seed;
this.tabId = params.stageTabId;
this.formAction = params.formAction;
this.commitNodeId = params.commitNodeId;
this.commitAllNodeId = params.commitAllNodeId;
this.choiseCount = 0;
this.setHook();
}
// Hook global click listener on table, load/unload actions
StageHelper.prototype.setHook = function() {
var stageTab = document.getElementById(this.tabId);
if (stageTab.addEventListener) {
stageTab.addEventListener("click", this.onEvent.bind(this));
} else {
stageTab.attachEvent("onclick", this.onEvent.bind(this));
}
window.onbeforeunload = this.onPageUnload.bind(this);
window.onload = this.onPageLoad.bind(this);
}
// Store table state on leaving the page
StageHelper.prototype.onPageUnload = function() {
var data = this.collectData();
window.sessionStorage.setItem(this.pageSeed, JSON.stringify(data));
}
// Re-store table state on entering the page
StageHelper.prototype.onPageLoad = function() {
var data = JSON.parse(window.sessionStorage.getItem(this.pageSeed));
var stage = document.getElementById(this.tabId);
for (var i = stage.rows.length - 1; i >= 0; i--) {
var tr = stage.rows[i];
if (tr.parentNode.tagName == "THEAD") continue;
var context = tr.parentNode.className;
var cmd = data[tr.cells[1].innerText];
if (!cmd) continue;
this.formatTR(tr, cmd, context);
this.choiseCount += (this.countChoiceImpact(cmd) > 0) ? 1 : 0;
}
this.updateMenu();
}
// Event handler, change status
StageHelper.prototype.onEvent = function (event) {
if (!event.target) {
if (event.srcElement) { event.target = event.srcElement; }
else { return; }
}
if (event.target.tagName != "A") return;
var td = event.target.parentNode;
if (!td || td.tagName != "TD" || td.className != "cmd") return;
var cmd = event.target.innerText;
var tr = td.parentNode;
var context = tr.parentNode.className;
switch (cmd) {
case "add": cmd = "A"; break;
case "remove": cmd = "R"; break;
case "ignore": cmd = "I"; break;
case "reset": cmd = "?"; break;
}
this.formatTR(tr, cmd, context);
this.choiseCount += this.countChoiceImpact(cmd);
this.updateMenu();
}
// Update action counter -> affects menu update after
StageHelper.prototype.countChoiceImpact = function (cmd) {
if ("ARI".indexOf(cmd) > -1) { return 1; }
else if ("?".indexOf(cmd) > -1) { return -1; }
else { alert("Unknown command"); }
}
// Re-format table line
StageHelper.prototype.formatTR = function (tr, cmd, context) {
var cmdReset = "<a>reset</a>";
var cmdLocal = "<a>add</a>";
var cmdRemote = "<a>ignore</a><a>remove</a>";
tr.cells[0].innerText = cmd;
if (cmd == "?") {
tr.cells[0].style.color = "#CCC"; //grey
tr.cells[2].innerHTML = (context == "local") ? cmdLocal : cmdRemote;
} else {
tr.cells[0].style.color = "";
tr.cells[2].innerHTML = cmdReset;
}
}
// Update menu items visibility
StageHelper.prototype.updateMenu = function () {
if (this.choiseCount > 0) {
document.getElementById(this.commitNodeId).style.display = "inline";
document.getElementById(this.commitAllNodeId).style.display = "none";
} else {
document.getElementById(this.commitNodeId).style.display = "none";
document.getElementById(this.commitAllNodeId).style.display = "inline";
}
}
// Submin stage state to the server
StageHelper.prototype.submit = function () {
var data = this.collectData();
submitSapeventForm(data, this.formAction);
}
// Extract data from the table
StageHelper.prototype.collectData = function () {
var stage = document.getElementById(this.tabId);
var data = {};
for (var i = 0; i < stage.rows.length; i++) {
var row = stage.rows[i];
if (row.parentNode.tagName == "THEAD") continue;
data[row.cells[1].innerText] = row.cells[0].innerText;
}
return data;
}

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_W3MI" serializer_version="v2.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<NAME>ZABAPGIT_JS_COMMON</NAME>
<TEXT>Abapgit common JS library</TEXT>
<PARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZABAPGIT_JS_COMMON</OBJID>
<NAME>fileextension</NAME>
<VALUE>.js</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZABAPGIT_JS_COMMON</OBJID>
<NAME>filename</NAME>
<VALUE>common.js</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZABAPGIT_JS_COMMON</OBJID>
<NAME>filesize</NAME>
<VALUE>6500</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZABAPGIT_JS_COMMON</OBJID>
<NAME>mimetype</NAME>
<VALUE>text/javascript</VALUE>
</WWWPARAMS>
<WWWPARAMS>
<RELID>MI</RELID>
<OBJID>ZABAPGIT_JS_COMMON</OBJID>
<NAME>version</NAME>
<VALUE/>
</WWWPARAMS>
</PARAMS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -34,7 +34,16 @@ CLASS lcl_object_w3super DEFINITION INHERITING FROM lcl_objects_super ABSTRACT.
RAISING lcx_exception.
METHODS patch_size
IMPORTING iv_size TYPE i
IMPORTING iv_size TYPE i OPTIONAL " Overwrite if given
EXPORTING ev_size TYPE i " Return size as integer
CHANGING ct_params TYPE ty_wwwparams_tt " Param table to patch
RAISING lcx_exception.
METHODS patch_filename
CHANGING ct_params TYPE ty_wwwparams_tt
RAISING lcx_exception.
METHODS clear_version
CHANGING ct_params TYPE ty_wwwparams_tt
RAISING lcx_exception.
@ -97,7 +106,6 @@ CLASS lcl_object_w3super IMPLEMENTATION.
DATA lt_w3html TYPE STANDARD TABLE OF w3html.
DATA lt_w3params TYPE STANDARD TABLE OF wwwparams.
DATA lv_xstring TYPE xstring.
DATA ls_wwwparam LIKE LINE OF lt_w3params.
DATA lv_size TYPE int4.
SELECT SINGLE * INTO CORRESPONDING FIELDS OF ms_key
@ -137,12 +145,15 @@ CLASS lcl_object_w3super IMPLEMENTATION.
lcx_exception=>raise( 'Cannot read W3xx data' ).
ENDIF.
READ TABLE lt_w3params INTO ls_wwwparam WITH KEY name = 'filesize' ##NO_TEXT.
IF sy-subrc IS NOT INITIAL.
lcx_exception=>raise( 'Cannot read W3xx filesize' ).
ENDIF.
" Condense size string + get size to local integer
patch_size( IMPORTING ev_size = lv_size
CHANGING ct_params = lt_w3params ).
lv_size = ls_wwwparam-value.
" Remove file path (for security concerns)
patch_filename( CHANGING ct_params = lt_w3params ).
" Clear version
clear_version( CHANGING ct_params = lt_w3params ).
CASE ms_key-relid.
WHEN 'MI'.
@ -214,10 +225,8 @@ CLASS lcl_object_w3super IMPLEMENTATION.
iv_ext = get_ext( lt_w3params ) ).
WHEN OTHERS.
lcx_exception=>raise( 'W3xx: Unknown serializer version' ).
ENDCASE.
CASE ms_key-relid.
WHEN 'MI'.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
@ -382,11 +391,45 @@ CLASS lcl_object_w3super IMPLEMENTATION.
lcx_exception=>raise( |W3xx: Cannot find file size for { ms_key-objid }| ).
ENDIF.
IF iv_size IS NOT INITIAL.
<param>-value = iv_size.
SHIFT <param>-value LEFT DELETING LEADING space.
ENDIF.
CONDENSE <param>-value.
ev_size = <param>-value.
ENDMETHOD. " patch_size.
METHOD patch_filename.
FIELD-SYMBOLS <param> LIKE LINE OF ct_params.
READ TABLE ct_params ASSIGNING <param> WITH KEY name = 'filename'.
IF sy-subrc > 0.
lcx_exception=>raise( |W3xx: Cannot find file name for { ms_key-objid }| ).
ENDIF.
" Remove path
<param>-value = lcl_path=>get_filename_from_syspath( |{ <param>-value }| ).
ENDMETHOD. " patch_filename.
METHOD clear_version.
FIELD-SYMBOLS <param> LIKE LINE OF ct_params.
READ TABLE ct_params ASSIGNING <param> WITH KEY name = 'version'.
IF sy-subrc > 0.
lcx_exception=>raise( |W3xx: Cannot find version for { ms_key-objid }| ).
ENDIF.
" Clear version
CLEAR <param>-value.
ENDMETHOD. " clear_version.
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.

View File

@ -20,9 +20,6 @@ INTERFACE lif_gui_page.
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
RAISING lcx_exception.
METHODS get_assets
RETURNING VALUE(rt_assets) TYPE tt_web_assets.
ENDINTERFACE.
CLASS lcl_gui_page_super DEFINITION ABSTRACT.
@ -72,9 +69,6 @@ CLASS lcl_gui_page_super DEFINITION ABSTRACT.
IMPORTING iv_url TYPE string
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
PRIVATE SECTION.
METHODS styles RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
ENDCLASS.
CLASS lcl_gui_page_super IMPLEMENTATION.
@ -227,15 +221,9 @@ CLASS lcl_gui_page_super IMPLEMENTATION.
ro_html->add( '<html>' ). "#EC NOTEXT
ro_html->add( '<head>' ). "#EC NOTEXT
ro_html->add( '<title>abapGit</title>' ). "#EC NOTEXT
ro_html->add( styles( ) ).
IF io_include_style IS BOUND.
ro_html->add( '<style type="text/css">' ). "#EC NOTEXT
ro_html->add( io_include_style ).
ro_html->add( '</style>' ). "#EC NOTEXT
ENDIF.
ro_html->add( '<link rel="stylesheet" type="text/css" href="css/common.css">' ).
ro_html->add( '<meta http-equiv="content-type" content="text/html; charset=utf-8">' ). "#EC NOTEXT
ro_html->add( '<script type="text/javascript" src="js/common.js"></script>' ). "#EC NOTEXT
ro_html->add( '</head>' ). "#EC NOTEXT
ro_html->add( '<body>' ). "#EC NOTEXT
@ -277,39 +265,14 @@ CLASS lcl_gui_page_super IMPLEMENTATION.
ro_html->add( '<img src="img/logo" >' ). "#EC NOTEXT
ro_html->add( '<table width="100%"><tr><td width="40%"></td><td>' ). "#EC NOTEXT
ro_html->add( |<span class="version">{ gc_abap_version }</span>| ). "#EC NOTEXT
ro_html->add( '</td><td id="stdout" width="40%"></td></tr></table>' ). "#EC NOTEXT
ro_html->add( '</td><td id="debug-output" width="40%"></td></tr></table>' ). "#EC NOTEXT
ro_html->add( '</div>' ). "#EC NOTEXT
ro_html->add( '</body>' ). "#EC NOTEXT
" Common JS routines
_add '<script type="text/javascript">' . "#EC NOTEXT
_add 'function debugOutput(text, dstID) {'. "#EC NOTEXT
_add ' var stdout = document.getElementById(dstID || "stdout");'. "#EC NOTEXT
_add ' var wrapped = "<p>" + text + "</p>";'. "#EC NOTEXT
_add ' stdout.innerHTML = stdout.innerHTML + wrapped;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add 'function submitForm(params, action) {'. "#EC NOTEXT
_add ' var form = document.createElement("form"); '. "#EC NOTEXT
_add ' form.setAttribute("method", "post"); '. "#EC NOTEXT
_add ' form.setAttribute("action", "sapevent:" + action); '. "#EC NOTEXT
_add ' for(var key in params) {'. "#EC NOTEXT
_add ' var hiddenField = document.createElement("input"); '. "#EC NOTEXT
_add ' hiddenField.setAttribute("type", "hidden"); '. "#EC NOTEXT
_add ' hiddenField.setAttribute("name", key); '. "#EC NOTEXT
_add ' hiddenField.setAttribute("value", params[key]); '. "#EC NOTEXT
_add ' form.appendChild(hiddenField); '. "#EC NOTEXT
_add ' }'. "#EC NOTEXT
_add ' document.body.appendChild(form); '. "#EC NOTEXT
_add ' form.submit(); '. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add '</script>'. "#EC NOTEXT
IF io_include_script IS BOUND.
ro_html->add( '<script type="text/javascript">' ).
ro_html->add( io_include_script ).
ro_html->add( 'debugOutput("js: OK");' ).
ro_html->add( '</script>' ).
ENDIF.
@ -338,348 +301,6 @@ CLASS lcl_gui_page_super IMPLEMENTATION.
ENDMETHOD.
METHOD styles.
CREATE OBJECT ro_html.
_add '<style type="text/css">'.
" Global styles
_add '/* GLOBALS */'.
_add 'body {'.
_add ' font-family: Arial,Helvetica,sans-serif;'.
_add ' font-size: 12pt;'.
_add ' background: #E8E8E8;'.
_add '}'.
_add 'a, a:visited {'.
_add ' color: #4078c0;'.
_add ' text-decoration: none;'.
_add '}'.
_add 'a:hover, a:active {'.
_add ' cursor: pointer;'.
_add ' text-decoration: underline;'.
_add '}'.
_add 'img { border: 0px; vertical-align: middle; }'.
_add 'table { border-collapse: collapse; }'.
_add 'pre { display: inline; }'.
_add 'form input, textarea, select {'.
_add ' border: 1px solid #DDD;'.
_add ' padding: 3px 6px;'.
_add '}'.
_add 'form input:focus, textarea:focus {'.
_add ' border: 1px solid #8cadd9;'.
_add '}'.
" Modifiers
_add '/* MODIFIERS */'.
_add '.grey { color: lightgrey !important; }'.
_add '.emphasis { font-weight: bold !important; }'.
_add '.attention { color: red !important; }'.
_add '.crossout { text-decoration: line-through !important; }'.
_add '.right { text-align:right; }'.
_add '.paddings { padding: 0.5em 0.5em; }'.
_add '.pad-sides { padding: 0 0.3em; }'.
_add '.pad4px { padding: 4px; }'.
" Structure div styles: header, footer, toc
_add '/* STRUCTURE DIVS, HEADER & FOOTER */'.
_add 'td.headpad { padding-top: 11px; }'.
_add 'td.logo { width: 164px; }'.
_add 'div#header {'.
_add ' padding: 0.5em 0.5em;'.
_add ' border-bottom: 3px double lightgrey;'.
_add '}'.
_add 'div#toc {'.
_add ' padding: 0.5em 1em;'.
_add ' background-color: #f2f2f2;'.
_add '}'.
_add 'div#toc div.toc_grid {'.
_add ' margin: -0.3em 0em;'.
_add '}'.
_add 'div#toc div.toc_grid a {'.
_add ' color: #ccc;'.
_add '}'.
_add 'div#toc:hover div.toc_grid a {'.
_add ' color: #4078c0;'.
_add '}'.
_add 'div#toc div.toc_row {'.
_add ' margin: 0.3em 0em;'.
_add '}'.
_add 'div#footer {'.
_add ' padding: 0.5em 1em;'.
_add ' border-top: 3px double lightgrey;'.
_add ' text-align: center;'.
_add '}'.
_add 'div.dummydiv {'.
_add ' background-color: #f2f2f2;'.
_add ' padding: 0.5em 1em;'.
_add ' text-align: center;'.
_add '}'.
_add 'span.version {'.
_add ' display: block;'.
_add ' color: grey;'.
_add ' margin-top: 0.3em;'.
_add '}'.
_add 'span.page_title {'.
_add ' font-weight: normal;'.
_add ' font-size: 18pt;'.
_add ' color: #bbb;'.
_add ' padding-left: 0.4em;'.
_add '}'.
" Menu styles
_add '/* MENU */'.
_add 'div.menu { display: inline; }'.
_add 'div.menu .menu_end { border-right: 0px !important; }'.
_add 'div.menu a {'.
_add ' padding-left: 0.5em;'.
_add ' padding-right: 0.5em;'.
_add ' border-right: 1px solid lightgrey;'.
_add ' font-size: 12pt;'.
_add '}'.
_add 'div.menu_vertical { display: inline; }'.
_add 'div.menu_vertical a {'.
_add ' display: block; '.
_add ' font-size: 12pt;'.
_add '}'.
" Dropdown styles :mechanics
_add '/*DROP DOWN*/'.
_add '.dropdown {'.
_add ' position: relative;'.
_add ' display: inline;'.
_add '}'.
_add '.dropdown_angle {'.
_add ' position: absolute !important;'.
_add ' right: -4px;'.
_add ' top: -1px;'.
_add '}'.
_add '.dropbtn_angle {'.
_add ' width: 0;'.
_add ' height: 0;'.
_add ' border-left: 7px solid transparent;'.
_add ' border-right: 7px solid transparent;'.
_add ' border-bottom: 7px 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: -12px;'.
_add ' top: 1em;'.
_add ' padding: 6px 10px 10px 10px;'.
_add ' white-space: nowrap;'.
_add '}'.
_add '.dropdown div.minizone {'.
_add ' display: none;'.
_add ' z-index: 1;'.
_add ' position: absolute;'.
_add ' padding: 0px;'.
_add ' width: 16px;'.
_add ' height: 16px;'.
_add ' bottom: 0px;'.
_add ' left: -16px;'.
_add '}'.
_add '.dropdown_angle .dropdown_content {'.
_add ' top: -1px;'.
_add '}'.
_add '.dropdown:hover .dropdown_content { display: block; }'.
_add '.dropdown:hover .minizone { display: block; }'.
" Dropdown styles :styling
_add '.dropdown_content a {'.
_add ' padding: 0.2em;'.
_add ' background-color: #f9f9f9;'.
_add ' text-decoration: none;'.
_add ' display: block;'.
_add ' border: none !important;'.
_add '}'.
_add '.dropdown_content div.box {'.
_add ' border-bottom: 1px solid #C0C0C0;'.
_add ' border-right: 1px solid #C0C0C0;'.
_add ' background-color: #f9f9f9;'.
_add ' padding: 2px;'.
_add '}'.
_add '.dropdown_content td { text-align: left; padding: 2px; }'. " TODO refactor
_add '.dropdown_content td a { padding: 0em 0.2em; }'. " TODO refactor
_add '.dropdown_content td.icon { padding: 0 3px 0 6px; }'. " TODO refactor
_add '.dropdown_content a:hover { background-color: #f1f1f1 }'.
_add '.dropdown:hover .dropbtn { color: #79a0d2; }'.
" REPOSITORY
_add '/* REPOSITORY */'.
_add 'div.repo {'.
_add ' margin-top: 3px;'.
_add ' background-color: #f2f2f2;'.
_add ' padding: 0.5em 1em 0.5em 1em;'.
_add '}'.
_add '.repo_name span.name {'.
_add ' font-weight: bold;'.
_add ' color: #333;'.
_add ' font-size: 14pt;'.
_add '}'.
_add '.repo_name span.url {'.
_add ' color: #ccc;'.
_add ' font-size: 12pt;'.
_add ' margin-left: 0.5em;'.
_add '}'.
_add '.repo_name img {'.
_add ' vertical-align: baseline;'.
_add ' margin: 0 5px 0 5px;'.
_add '}'.
_add '.repo_attr {'.
_add ' color: grey;'.
_add ' font-size: 12pt;'.
_add '}'.
_add '.repo_attr span {'.
_add ' margin-left: 0.2em;'.
_add ' margin-right: 0.5em;'.
_add '}'.
_add '.repo_attr span.bg_marker {'.
_add ' border: 1px solid #d2d2d2;'.
_add ' border-radius: 3px;'.
_add ' background: #d8d8d8;'.
_add ' color: #fff;'.
_add ' font-size: 8pt;'.
_add ' padding: 4px 2px 3px 2px;'.
_add '}'.
" Branch tag design
_add '.repo_attr span.branch {'.
_add ' padding: 2px 4px;'.
_add ' border: 1px solid #d9d9d9;'.
_add ' border-radius: 4px;'.
_add ' background-color: #e2e2e2;'.
_add '}'.
_add '.repo_attr span.branch_head {'.
_add ' border-color: #d8dff3;'.
_add ' background-color: #eceff9;'.
_add '}'.
_add '.repo_attr span.branch_branch {'.
_add ' border-color: #e7d9b1;'.
_add ' background-color: #f8f0d8;'.
_add '}'.
" Other and outdated (?) styles
_add '/* MISC AND REFACTOR */'.
_add '.hidden-submit {'.
_add ' border: 0 none;'.
_add ' height: 0;'.
_add ' width: 0;'.
_add ' padding: 0;'.
_add ' margin: 0;'.
_add ' overflow: hidden;'.
_add '}'.
_add '#stdout {'.
_add ' text-align: right;'.
_add ' padding-right: 0.5em;'.
_add ' color: #ccc;'.
_add ' font-style: italic;'.
_add ' font-size: small;'.
_add '}'.
_add '</style>'.
ENDMETHOD. "common styles
METHOD lif_gui_page~get_assets. " Common images here
DATA ls_image TYPE ty_web_asset.
* see https://github.com/larshp/abapGit/issues/201 for source SVG
ls_image-url = 'img/logo' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAAKMAAAAoCAYAAACSG0qbAAAABHNCSVQICAgIfAhkiAAA'
&& 'AAlwSFlzAAAEJQAABCUBprHeCQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9y'
&& 'Z5vuPBoAAA8VSURBVHic7Zx7cJzVeYef31nJAtvYko1JjM3FYHlXimwZkLWyLEMcwIGQ'
&& 'cEkDJWmTltLStGkoDCkzwBAuCemUlksDNCkhJTTTljJpZhIuBQxxAWPvyuYiW7UkG8Il'
&& 'UByIsS1sLEu75+0fu5JXu9/etAJz0TOzM/rOec85765+37m+3yczY8w0NU3qrwv9npfa'
&& 'Hfx02pPPd469sgk+7misYnyjpWXy5IOG7kd8ZjjNjEtr13TdOm7eTfCxwo2lUJAQASRu'
&& '2dnRfMn4uDbBx42yxZhPiMNMCHKCsVK2GGuqqqoQUwrZTAhygrFQshjfaGmZ/M7yxQtm'
&& 'xGL9/qDqzwLxQvYTgpygXEoS4/DQ7LE1O05atLBu1YZdE4KcYLwpupoOmCO+5Z2dXPfE'
&& 'xk07Tm2ZroGhBwX1wAygKqiOiVX2Rw9Jam/gyH0wuGGzvTEudRYSY4HFyogghxN2n7Sw'
&& 'IendvcCioLoOtCCXNeqohOf0oDwPq9f3Wt/77dOHlWhYzUj/BRybTnrGEnZO5wv2m0rq'
&& 'DezJoOiqeZbzegzpk6TVPPWJTT39y5svMogF1ZcesjlQgkwYp4F+EJQXwv4E+MiLUZJa'
&& 'F7AIcRq4hWZ2mMRhQD/oZcErXv7FScaja3rt/wpU9E/sFyLACQq57wB/XIl/gWIstn2T'
&& 'xpHVre7ZW71p8sFDeQscSEHKu3pTBadNH2Lq61VT57iwNazLgaNSqYaUaWXLDZCJIbBo'
&& 'g3tK2A2xHns0oMrm3CRrqdTPnAVMiUIEmLlz2XGLMxNmH7YrifFcoUIHalHj8f8p6UfA'
&& 'O+932weStno1zghps6Q7GBFiUYRxopkeaZ2vIwLyfxtQ4vV8lbWHNScacf+T/vwqn90o'
&& 'MZYhRADJ+bv725vmj6Q8tHWffPKUD6IgO/tsfawneRHYd97Pdg8kSyJaZiGtBY4pYPYO'
&& 'kH84C0Cyv8tKSiK7OZ99EpYAJ2V8AhkRY5lCHGaxhaq+BLCzY/EXd5y0aOG0td1vf1AF'
&& 'CWCw7/1u80DQEtahQvcB03MyjQfM7Hwnmxfv9dPivX5SssqOwuzPSqk71mN3ymw5ZtdK'
&& 'dmVIdly8xx7JZ29yy0qptwrGLMRRCA6T1w93nLTo5Lq13Zv625tOMRd6DLF4v0lWmQO8'
&& 'qPko45y7TWaHZyUnwa6M99mN2fYbuu1V4K5oxF1B4Z4UgFifrQHWFLNbvkh1QheV5DNN'
&& 'TZMqFWIGs5zX48M95PTqGa3TZ4erzbvj8/WUErf0L2++uNyGJLn2Js1oDeuYlkbNbmlR'
&& 'deXup2hq0qS2es2VlHMDFaOlRdXL5uuwlnodG23QTEljCkbJV3d7WHOK+dXWqHqZnZeb'
&& 'Y1fGe3OFOArRU5GTGbSHNWdwUL8Epo1qIQ9V/bXu3HES4jCznNfjb7e1zZ8Ri/UD1MLz'
&& 'u05s/huMx4IKGNy4+8Tj/2Pqk8++Vaji86TQqxEuNNM5rWGtSCaokSDkgd0QjbidoPvN'
&& '+5s7t9jz5TgdbdBMvLsG2cop6FgLUdUaZk804jYKuyrWa6vzlT2+XrOqQnxd6KwQOj5R'
&& 'hULpL9Yaxkcj7g3QT6zK397ZbdtGtbtAZ+B0U3adkt0c67E7OyI6fFDuSpktC6HGpJjU'
&& 'GmZ3NOI2mdnVnX32eHZZ7903hGXfBG8mp3J7sd/B0DPCTgUmBf9O7lmMybk56or3Jn8f'
&& 'oLVB7Q5dZ9Iy4OBsw2jYbUUk96fwQrzHf955iBZzsDA+aL9k1owZ20fNzaY/tfFXwK48'
&& 'ldQkSZ5YqJXmZk15JaJfmOmfgdOAmgCzWrCvyum5aIO+Uor3AIbOx7QV2TeBMPu3vKYA'
&& 'Sw091hbWt4PKRhu0oDqkmND1wAnk3vkOmAN2lRLa2hrWMVm5Tek2R3286YzWiK4eQltk'
&& '9g1gMfsFMhVYKunR1obQddk+SXZqwLe8acMGe7fYb9HZk7wm3utrBmpsqiXsyClHMHK6'
&& '0hLWoRjHBfmLbP9K3bPYjFPIFWLaQeZnlZ8H4JyFflrMwcK4wG63v3/ycZnXOzqalxE0'
&& 'mU7x9rvvVv93oVZqBtzNGGeU7Jbp9pZGzS7ReiVQVyDfmXRda4PaA9p5mBLmWGmmSron'
&& 'M0FytUGGgjPTAi8UIeVk9u1og5YOJ0QbNBOjIac+Y22JPgLQ1WV7Ol+w36xebYnhtGpj'
&& 'FjBYTj3l4KY9/dx6My4d74pN/Ki/Y9HpSG5HR/Nyh/1DHtO9OM6dvWFDwbtWslOykt6U'
&& 's5VWZbOFnQtsyMqvc56Ty3T7NeBhLGAfDZDpe5nX6V5uXpbZ43K2NGQ2V9glwLas/I62'
&& 'hfrE8EWsJ3mFsGYs+OQqze+A1cBLgbmma4f/9AmOJGBe5vKVLYN1W6wnOWSHmdkVhexM'
&& 'PG6yC0x2AbmjoQ3njdh4uwrSw1Htmq5bd3Y0I3FLpQ5n0GTSQ7s6Fva70RPYTPbi+Pz0'
&& 'J7ryboRC+m5PnRfsJjVEAfp5bLNflTb52dKIBj36RWY5ZyX2WCLukvbX67ZYHFLHZtGw'
&& '+1fD/jDL8qQljWpav9m6Uw3wKYzXgUNJTxsk+0Fssw0L6x+j4dCx6eF/BEtwDBkbx7Fe'
&& '29gWCa0yrC2rvXXO26WZfrWG3V2kji8zWbm0QUev67GX5ZgZ8A0H121hXIIZNrxou9oW'
&& '6m4b4m/z2aTP+fsAohF3PaNHROvssZ8ElRs5DnyPBAkovxDFF4oJESDeY9tJD4Ur5umg'
&& 'PSFm1Uy23Zk2SaM7e43p5Y4uxUMzu2f4H56+tuZmff2gfTqHrGEy5DkW6Abo7LH7gfsB'
&& '2uo1LQGzBmoYFSwg57vNcjqqo4F1JXh2S7Zfx83TZZNqdD6MXkQkU369jONgcmfxe83M'
&& 'B7XQEdEhg1B0HzDk2ZHpy3vBqLPpMQhyi/f2AIA3WyPZG6KkeVpKiE925awEi7H6JRsA'
&& 'cqJDfIi9oayfW8ZB5dY/TFeX7YlGQg+RmgJkcnSQfWyr9QP92enmGcgeNCvx67mXbGdb'
&& 'xD1hjI5AklJ+ydgTUGz6iiZNXd09+gYGGIRlQgXn6wDesZYSRFsJOYES5QjSw7fqnu7q'
&& 'Bqh7uqu7f3nzdw3uKFJszEIcpqVRs12SRuAYiTrJ1YXMzSGgS6iQnHmWyQWe70pySz/F'
&& 'MZagMWnMlaiTuTqTTih7s7IIHm1T1ncVI37l3BAAA4McAYF7iAvG17uxExi1U6Igd9XN'
&& 'Dj+UmZA8qPrf3MDQbeSPIN8Ldub0JzeWLcT2I3Swn8JFhr4VQnMze5uKnv0ugOHfUXa3'
&& 'ZhySedkR0eGDuMtbw/rTZCI1pA9PF0yWf4e3MnJ7YKXm0pOr6H03QRIIZeYnUj1njhid'
&& '8aaRscKX/VGWSRLsCjnK2rcdC3njGUsQ5PSdv92yqJaMk5WBoRMpJsSnNgZufBdCkmsN'
&& '60FgRbllK8PNzOlttT/qpz2sOUnpeWGHvq9ewcyc28/7XQCru213NOL+l6wgZ0kXAjnD'
&& 'cazP7gXuTdu41rCyxbgr3mt/P16+F6LgUVXtmq5bC237yNsNu5YtPBZgx4kLFznZ1XlM'
&& 'BzB/1liECBAN801yhfiq0HflbKXz1ojZ4qCylSBsbm6q/93wX0n0Q1Ir6UzWYXaZyZaF'
&& 'qqxeZn813n4ZlhPWJWXMo00P5OTDF5c0qmm8fRlPip6bFhHk6Ti3ddfy5i3OXBemJQE2'
&& 'A5g/c/qaTasC8krC0KdzE+3qWG/y6thmW7Vui/UkQ7w51vqDaGnRZFInPdlshNQ2C8oJ'
&& 'h0oqaefF++zmzh5bu7bbXrBxjp88bp5qgZzNdyfWD/9t+B+TO4GW8/p+R0SHcGBxLWEF'
&& 'jiQlHeIXEaRIPZAVRMVCTDcQCUh8LfOyaqjgCcr+YpY7NRFa2VY/egsqtNtdw8ie5gjJ'
&& 'oUTqicjofOYA2f/YgcR03s5MMBF4wlIa7rMr5mnUyru6xl0LZAeFvDG3l83DF5199muk'
&& 'oJO1FUMoviSi8Nh9Kg+Ru7qvUvCqPO+cMZsxbPsM4HXW9KcrEyKApTa7s9BVSyLaF3Ik'
&& 'SbLSQros18RyInkkV2u5q+6zLaS+aCT0oJl/QVI78IWcsvDos1vtLYCE551QKNuCKW63'
&& '+157g36cMOYI9yWhC3K+j4KDEHKxC9+t0altDaFHwL/kvVZIBJw761/uM5/MTJlU7S/Z'
&& 'N6hTBNlhZA0OPReNuGdM6nL4jR4G5ZnRusAtKmVHwg1Slcxe11nODZJKh1fJ6kwM3dQa'
&& 'VgOw3omjkGuL9/o/L/vFTzs7mi8pQZBpIT4f9PxE2bRFQncY9pdjKDoExDH7ebzPbgFo'
&& 'bQjdng48KBfvzZau77ORN61FI66PsW2N7ARiZnZTZ589BtAWCV1v5J1zF+JNVdui2CbL'
&& 'OcJsq1ejD2lVgCDL4e14r58J0N6k+cmEu0HYIssdrbxgnaGeeG9yJEg32hC6GbOix81y'
&& 'trTsWLtiixpgQNLZ4yVEgCT++xSP0H7C0N1ZadVAh6SR3kRm2WfJO0H/XqTuQcn+IlOI'
&& 'AFjRVaZhus3g2az0WuA0wcIi5QP3DDNIIPtakBABYltts7AO4OEi9eTFYGCksSRzwM4L'
&& 'ECKAM1gG9tVR5UP+RkqZN5s7a0yBnwUEOSDp7GlPPp83BH0srO+1PmQrDIIen9wOdnln'
&& 'n31G5n9ZtDLL6ck2x3uTf6DUee8rASX6vNnyWI/dmZ0R77O7LNXLBkWy9CE7Pd6XvNih'
&& 'QkEQeZHZl9PBFtsDstebtyWFwv0B4r32UrzXn+6xDtBdwIslNL0N+JnMvravxiraFO/s'
&& 'tm0y+xzQlcfkddCNCe/vGfP7GQH6lzdfbHAjqSCBHZK+PN5CzESSlixgnhMLzXAeXp+3'
&& 'hWfuM0sWL10abQv1CdtHixzvmtiYPhcvSFOTJk1NEPEQkWdPUry4oc96y2o3YJiWs5Wx'
&& 'zbYq83THHHu9Y1N2kG45tDRqdsgzxxuznKPOGbsTsN2M7d6zfXhePJ5Ici1h6mUcAcw0'
&& '8Zo5fp35NoqKxAjwTrRhZmLSpPY9ySmPzV27dm+lTn9cKSTGA+XT+03Jq+l8HBLv2Q7c'
&& 'X9K+ygQTFGDcHhaaoGJyouDNV7JH+eGj4mF6gspoC+tzJt1ObsT4MDsF2zxs886+Ml5v'
&& '/PogUvEwPUGFiE+SX4gAtQa1gkhV7onQR4oJMR5oxC6stDeghd7Dh6E+CPw/HL4vVO2f'
&& 'cpUAAAAASUVORK5CYII='.
APPEND ls_image TO rt_assets.
ENDMETHOD. "lif_gui_page~get_assets
METHOD lif_gui_page~on_event.
ev_state = gc_event_state-not_handled.
ENDMETHOD. "lif_gui_page~on_event

View File

@ -32,8 +32,6 @@ CLASS lcl_gui_page_commit DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
render_form
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
RAISING lcx_exception,
styles
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper,
scripts
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
@ -74,7 +72,7 @@ CLASS lcl_gui_page_commit IMPLEMENTATION.
CREATE OBJECT ro_html.
ro_html->add( header( io_include_style = styles( ) ) ).
ro_html->add( header( ) ).
ro_html->add( title( 'COMMIT' ) ).
ro_html->add( '<div class="repo">' ).
@ -200,7 +198,7 @@ CLASS lcl_gui_page_commit IMPLEMENTATION.
CREATE OBJECT ro_html.
CREATE OBJECT lo_toolbar.
lo_toolbar->add( iv_act = 'submitCommit();'
lo_toolbar->add( iv_act = 'submitFormById(''commit_form'');'
iv_txt = 'Commit'
iv_typ = gc_action_type-onclick
iv_opt = gc_html_opt-emphas ) ##NO_TEXT.
@ -215,58 +213,10 @@ CLASS lcl_gui_page_commit IMPLEMENTATION.
ENDMETHOD. "render_menu
METHOD styles.
CREATE OBJECT ro_html.
_add '/* STAGE */'.
_add '.stage_tab {'.
_add ' border: 1px solid #DDD;'.
_add ' background: #fff;'.
_add ' margin-top: 0.2em;'.
_add '}'.
_add '.stage_tab td {'.
_add ' border-top: 1px solid #eee;'.
_add ' color: #333;'.
_add ' vertical-align: middle;'.
_add ' padding: 2px 0.5em;'.
_add '}'.
_add '.stage_tab td.method {'.
_add ' color: #ccc;'.
_add '}'.
_add '.stage_tab tr.firstrow td { border-top: 0px; } '.
_add '.stage_tab tr.title td {'.
_add ' color: #BBB;'.
_add ' font-size: 10pt;'.
_add ' background-color: #edf2f9;'.
_add ' padding: 4px 0.5em;'.
_add ' text-align: center;'.
_add '}'.
_add '/* COMMIT */'.
_add 'div.form_div {'.
_add ' margin: 0.5em 0em;'.
_add ' background-color: #F8F8F8;'.
_add ' padding: 1em 1em;'.
_add '}'.
_add 'div.form_div td.field_name {'.
_add ' color: #BBB;'.
_add ' padding-right: 1em;'.
_add '}'.
ENDMETHOD. "styles
METHOD scripts.
CREATE OBJECT ro_html.
_add 'function setInitialFocus() {'.
_add ' document.getElementById("commit_msg").focus();'.
_add '}'.
_add 'function submitCommit() {'.
_add ' document.getElementById("commit_form").submit();'.
_add '}'.
_add 'setInitialFocus();'.
_add 'setInitialFocus("commit_msg");'.
ENDMETHOD. "scripts

View File

@ -13,9 +13,6 @@ CLASS lcl_gui_page_db_display DEFINITION FINAL INHERITING FROM lcl_gui_page_supe
PRIVATE SECTION.
DATA: ms_key TYPE lcl_persistence_db=>ty_content.
METHODS styles
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
ENDCLASS.
CLASS lcl_gui_page_db_display IMPLEMENTATION.
@ -47,7 +44,7 @@ CLASS lcl_gui_page_db_display IMPLEMENTATION.
format = cl_abap_format=>e_html_attr ).
CREATE OBJECT ro_html.
ro_html->add( header( io_include_style = styles( ) ) ).
ro_html->add( header( ) ).
ro_html->add( title( 'CONFIG DISPLAY' ) ).
ro_html->add( '<div class="db_entry">' ).
@ -69,43 +66,6 @@ CLASS lcl_gui_page_db_display IMPLEMENTATION.
ENDMETHOD.
METHOD styles.
CREATE OBJECT ro_html.
_add '/* DB ENTRY DISPLAY */'.
_add 'div.db_entry {'.
_add ' background-color: #f2f2f2;'.
_add ' padding: 0.5em;'.
_add '}'.
_add 'div.db_entry pre {'.
_add ' display: block;'.
_add ' overflow: hidden;'.
_add ' word-wrap:break-word;'.
_add ' white-space: pre-wrap;'.
_add ' background-color: #eaeaea;'.
_add ' padding: 0.5em;'.
_add ' margin: 0.5em 0em;'.
_add ' width: 50em;'.
_add '}'.
_add 'div.db_entry table.toolbar {'.
_add ' width: 50em;'.
_add '}'.
_add 'table.tag {'.
_add ' display: inline-block;'.
_add ' border: 1px #b3c1cc solid;'.
_add ' background-color: #eee;'.
_add ' border-radius: 3px;'.
_add ' margin-right: 0.5em; '.
_add '}'.
_add 'table.tag td { padding: 0.2em 0.5em; }'.
_add 'table.tag td.label { background-color: #b3c1cc; }'.
ENDMETHOD. "styles
ENDCLASS.
CLASS lcl_gui_page_db_edit DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
@ -119,12 +79,6 @@ CLASS lcl_gui_page_db_edit DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
PRIVATE SECTION.
DATA: ms_key TYPE lcl_persistence_db=>ty_content.
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.
CLASS lcl_gui_page_db_edit IMPLEMENTATION.
@ -158,7 +112,7 @@ CLASS lcl_gui_page_db_edit IMPLEMENTATION.
CREATE OBJECT ro_html.
CREATE OBJECT lo_toolbar.
ro_html->add( header( io_include_style = styles( ) ) ).
ro_html->add( header( ) ).
ro_html->add( title( 'CONFIG EDIT' ) ).
ro_html->add( '<div class="db_entry">' ).
@ -178,7 +132,7 @@ CLASS lcl_gui_page_db_edit IMPLEMENTATION.
ro_html->add( '</form>' ).
" Menu
lo_toolbar->add( iv_act = 'submitDBForm();'
lo_toolbar->add( iv_act = 'submitFormById(''db_form'');'
iv_txt = 'Save'
iv_typ = gc_action_type-onclick
iv_opt = gc_html_opt-emphas ) ##NO_TEXT.
@ -189,42 +143,10 @@ CLASS lcl_gui_page_db_edit IMPLEMENTATION.
ro_html->add( '</div>' ). "db_entry
ro_html->add( footer( io_include_script = scripts( ) ) ).
ro_html->add( footer( ) ).
ENDMETHOD.
METHOD styles.
CREATE OBJECT ro_html.
_add '/* DB ENTRY DISPLAY */'.
_add 'div.db_entry {'.
_add ' background-color: #f2f2f2;'.
_add ' padding: 0.5em;'.
_add '}'.
_add 'div.db_entry textarea { margin: 0.5em 0em; }'.
_add 'table.tag {'.
_add ' display: inline-block;'.
_add ' border: 1px #b3c1cc solid;'.
_add ' background-color: #eee;'.
_add ' border-radius: 3px;'.
_add ' margin-right: 0.5em; '.
_add '}'.
_add 'table.tag td { padding: 0.2em 0.5em; }'.
_add 'table.tag td.label { background-color: #b3c1cc; }'.
ENDMETHOD. "styles
METHOD scripts.
CREATE OBJECT ro_html.
_add 'function submitDBForm() {'.
_add ' document.getElementById("db_form").submit();'.
_add '}'.
ENDMETHOD. "scripts
ENDCLASS.
CLASS lcl_gui_page_db DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
@ -233,8 +155,6 @@ CLASS lcl_gui_page_db DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
METHODS lif_gui_page~render REDEFINITION.
PRIVATE SECTION.
METHODS styles
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS explain_content
IMPORTING is_data TYPE lcl_persistence_db=>ty_content
RETURNING VALUE(rv_text) TYPE string
@ -259,7 +179,7 @@ CLASS lcl_gui_page_db IMPLEMENTATION.
CREATE OBJECT ro_html.
ro_html->add( header( io_include_style = styles( ) ) ).
ro_html->add( header( ) ).
ro_html->add( title( 'DATABASE PERSISTENCY' ) ).
ro_html->add( '<div class="db_list">' ).
@ -350,40 +270,4 @@ CLASS lcl_gui_page_db IMPLEMENTATION.
ENDCASE.
ENDMETHOD. "explain_content
METHOD styles.
CREATE OBJECT ro_html.
_add '/* DB ENTRIES */'.
_add 'div.db_list {'.
_add ' background-color: #f2f2f2;'.
_add ' padding: 0.5em;'.
_add '}'.
_add 'table.db_tab pre {'.
_add ' display: inline-block;'.
_add ' overflow: hidden;'.
_add ' word-wrap:break-word;'.
_add ' white-space: pre-wrap;'.
_add ' margin: 0px;'.
_add ' width: 30em;'.
_add '}'.
_add 'table.db_tab tr.firstrow td { padding-top: 0.5em; }'.
_add 'table.db_tab th {'.
_add ' text-align: left;'.
_add ' color: #888;'.
_add ' padding: 0.5em;'.
_add ' border-bottom: 1px #ddd solid;'.
_add '}'.
_add 'table.db_tab td {'.
_add ' color: #333;'.
_add ' padding: 0.5em;'.
_add ' vertical-align: top;'.
_add '}'.
_add 'table.db_tab td.data {'.
_add ' color: #888;'.
_add ' font-style: italic;'.
_add '}'.
ENDMETHOD. "styles
ENDCLASS.

View File

@ -6,8 +6,6 @@ CLASS lcl_gui_page_debuginfo DEFINITION FINAL INHERITING FROM lcl_gui_page_super
PUBLIC SECTION.
METHODS lif_gui_page~render REDEFINITION.
METHODS styles
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS scripts
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
@ -25,7 +23,7 @@ CLASS lcl_gui_page_debuginfo IMPLEMENTATION.
CREATE OBJECT ro_html.
ro_html->add( header( io_include_style = styles( ) ) ).
ro_html->add( header( ) ).
ro_html->add( title( 'DEBUG INFO' ) ).
ro_html->add( '<div id="debug_info" class="debug_container">' ).
@ -89,23 +87,6 @@ CLASS lcl_gui_page_debuginfo IMPLEMENTATION.
ENDMETHOD. " render_supported_object_types
METHOD styles.
CREATE OBJECT ro_html.
_add '/* DEBUG INFO STYLES */'.
_add 'div.debug_container {'.
_add ' padding: 0.5em;'.
_add ' font-size: 10pt;'.
_add ' color: #444;'.
_add ' font-family: Consolas, Courier, monospace;'.
_add '}'.
_add 'div.debug_container p {'.
_add ' margin: 0px;'.
_add '}'.
ENDMETHOD.
METHOD scripts.
CREATE OBJECT ro_html.

View File

@ -33,7 +33,6 @@ CLASS lcl_gui_page_diff DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
PRIVATE SECTION.
DATA: mt_diff_files TYPE tt_file_diff.
METHODS styles 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.
@ -175,133 +174,6 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
ENDMETHOD. "append_diff
METHOD styles.
CREATE OBJECT ro_html.
_add '/* DIFF */'. "#EC NOTEXT
_add 'div.diff {'. "#EC NOTEXT
_add ' background-color: #f2f2f2;'. "#EC NOTEXT
_add ' padding: 0.7em '. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add 'div.diff_head {'. "#EC NOTEXT
_add ' padding-bottom: 0.7em;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add 'span.diff_name {'. "#EC NOTEXT
_add ' padding-left: 0.5em;'. "#EC NOTEXT
_add ' color: grey;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add 'span.diff_name strong {'. "#EC NOTEXT
_add ' color: #333;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add 'span.diff_banner {'. "#EC NOTEXT
_add ' border-style: solid;'. "#EC NOTEXT
_add ' border-width: 1px;'. "#EC NOTEXT
_add ' border-radius: 3px;'. "#EC NOTEXT
_add ' padding-left: 0.3em;'. "#EC NOTEXT
_add ' padding-right: 0.3em;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add '.diff_ins {'. "#EC NOTEXT
_add ' border-color: #7bea7b;'. "#EC NOTEXT
_add ' background-color: #d3f8d3;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add '.diff_del {'. "#EC NOTEXT
_add ' border-color: #ff667d;'. "#EC NOTEXT
_add ' background-color: #ffccd4;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add '.diff_upd {'. "#EC NOTEXT
_add ' border-color: #dada00;'. "#EC NOTEXT
_add ' background-color: #ffffcc;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add 'div.diff_content {'. "#EC NOTEXT
_add ' background: #fff;'. "#EC NOTEXT
_add ' border-top: 1px solid #DDD;'. "#EC NOTEXT
_add ' border-bottom: 1px solid #DDD;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add 'div.diff_head span.state-block {'.
_add ' margin-left: 0.5em;'.
_add ' font-family: Consolas, Lucida Console, Courier, monospace;'.
_add ' display: inline-block;'.
_add ' text-align: center;'.
_add '}'.
_add 'div.diff_head span.state-block span {'.
_add ' display: inline-block;'.
_add ' padding: 0px 4px;'.
_add ' border: 1px solid #000;'.
_add '}'.
_add 'div.diff_head span.state-block span.added {'.
_add ' background-color: #69ad74; '.
_add ' border-color: #579e64;'.
_add ' color: white;'.
_add '}'.
_add 'div.diff_head span.state-block span.changed {'.
_add ' background-color: #e0c150;'.
_add ' border-color: #d4af25;'.
_add ' color: white;'.
_add '}'.
_add 'div.diff_head span.state-block span.mixed {'.
_add ' background-color: #e0c150;'.
_add ' border-color: #579e64;'.
_add ' color: #69ad74;'.
_add '}'.
_add 'div.diff_head span.state-block span.deleted {'.
_add ' background-color: #c76861;'.
_add ' border-color: #b8605a;'.
_add ' color: white;'.
_add '}'.
_add 'div.diff_head span.state-block span.none {'.
_add ' background-color: #e8e8e8;'.
_add ' border-color: #dbdbdb;'.
_add ' color: #c8c8c8;'.
_add '}'.
" Table part
_add '/* DIFF TABLE */'. "#EC NOTEXT
_add 'table.diff_tab {'. "#EC NOTEXT
_add ' font-family: Consolas, Courier, monospace;'. "#EC NOTEXT
_add ' font-size: 10pt;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add 'table.diff_tab td,th {'. "#EC NOTEXT
_add ' color: #444;'. "#EC NOTEXT
_add ' padding-left: 0.5em;'. "#EC NOTEXT
_add ' padding-right: 0.5em;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add 'table.diff_tab th {'. "#EC NOTEXT
_add ' text-align: left;'. "#EC NOTEXT
_add ' font-weight: normal;'. "#EC NOTEXT
_add ' padding-top: 3px;'. "#EC NOTEXT
_add ' padding-bottom: 3px;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add 'table.diff_tab thead.header th {'. "#EC NOTEXT
_add ' color: #EEE;'. "#EC NOTEXT
_add ' background-color: #BBB;'. "#EC NOTEXT
_add ' text-align: left;'. "#EC NOTEXT
_add ' font-weight: bold;'. "#EC NOTEXT
_add ' padding-left: 0.5em;'. "#EC NOTEXT
_add ' font-size: 9pt;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add 'table.diff_tab thead.nav_line {'. "#EC NOTEXT
_add ' background-color: #edf2f9;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add 'table.diff_tab thead.nav_line th {'. "#EC NOTEXT
_add ' color: #bbb;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add 'table.diff_tab td.num, th.num {'. "#EC NOTEXT
_add ' text-align: right;'. "#EC NOTEXT
_add ' color: #ccc;'. "#EC NOTEXT
_add ' border-left: 1px solid #eee;'. "#EC NOTEXT
_add ' border-right: 1px solid #eee;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add 'table.diff_tab code {'. "#EC NOTEXT
_add ' font-family: inherit;'. "#EC NOTEXT
_add ' white-space: pre;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add 'table.diff_tab tbody tr:first-child td { padding-top: 0.5em; }'.
_add 'table.diff_tab tbody tr:last-child td { padding-bottom: 0.5em; }'.
ENDMETHOD.
METHOD render_diff_head.
DATA: lo_html TYPE REF TO lcl_html_helper,
ls_stats TYPE lcl_diff=>ty_count.
@ -467,7 +339,7 @@ CLASS lcl_gui_page_diff IMPLEMENTATION.
CREATE OBJECT ro_html.
ro_html->add( header( io_include_style = styles( ) ) ).
ro_html->add( header( ) ).
ro_html->add( title( 'DIFF' ) ).
LOOP AT mt_diff_files INTO ls_diff_file.

View File

@ -9,8 +9,7 @@ CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
constructor
RAISING lcx_exception,
lif_gui_page~render REDEFINITION,
lif_gui_page~on_event REDEFINITION,
lif_gui_page~get_assets REDEFINITION.
lif_gui_page~on_event REDEFINITION.
PRIVATE SECTION.
CONSTANTS: BEGIN OF c_actions,
@ -24,8 +23,6 @@ CLASS lcl_gui_page_main DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
METHODS:
test_changed_by
RAISING lcx_exception,
styles
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper,
retrieve_active_repo
RAISING lcx_exception,
render_toc
@ -125,7 +122,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
CREATE OBJECT ro_html.
ro_html->add( header( io_include_style = styles( ) ) ).
ro_html->add( header( ) ).
ro_html->add( title( iv_title = 'HOME'
io_menu = build_main_menu( ) ) ).
@ -338,255 +335,4 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
ENDMETHOD. "render_repo
**********************************************************************
* ASSETS, STYLES, SCRIPTS
**********************************************************************
METHOD styles.
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;'.
_add ' background: #fff;'.
_add ' margin-top: 0.5em;'.
_add '}'.
_add '.repo_tab td {'.
_add ' border-top: 1px solid #eee;'.
_add ' vertical-align: middle;'.
_add ' color: #333;'.
_add ' padding-top: 2px;'.
_add ' padding-bottom: 2px;'.
_add '}'.
_add '.repo_tab td.icon {'.
_add ' width: 32px;'.
_add ' text-align: center;'.
_add '}'.
_add '.repo_tab td.type {'.
_add ' width: 3em;'.
_add '}'.
_add '.repo_tab td.object {'.
_add ' padding-left: 0.5em;'.
_add '}'.
_add '.repo_tab td.files {'.
_add ' padding-left: 0.5em;'.
_add '}'.
_add '.repo_tab td.cmd {'.
_add ' text-align: right;'.
_add ' padding-left: 0.5em;'.
_add ' padding-right: 0.7em;'.
_add '}'.
_add '.repo_tab tr.unsupported { color: lightgrey; }'.
_add '.repo_tab tr.modified { background: #fbf7e9; }'.
_add '.repo_tab tr:first-child td { border-top: 0px; }'.
_add '.repo_tab td.current_dir { color: #ccc; }'.
" States
_add '.repo_tab td.cmd span.state-block {'.
_add ' margin-left: 1em;'.
_add ' font-family: Consolas, Lucida Console, Courier, monospace;'.
_add ' font-size: x-small;'.
_add ' vertical-align: 13%;'.
_add ' display: inline-block;'.
_add ' text-align: center;'.
_add '}'.
_add '.repo_tab td.cmd span.state-block span {'.
_add ' display: inline-block;'.
_add ' padding: 0px 2px;'.
_add ' border: 1px solid #000;'.
_add '}'.
_add '.repo_tab td.cmd span.state-block span.added {'.
_add ' background-color: #69ad74; '.
_add ' border-color: #579e64;'.
_add ' color: white;'.
_add '}'.
_add '.repo_tab td.cmd span.state-block span.changed {'.
_add ' background-color: #e0c150;'.
_add ' border-color: #d4af25;'.
_add ' color: white;'.
_add '}'.
_add '.repo_tab td.cmd span.state-block span.mixed {'.
_add ' background-color: #e0c150;'.
_add ' border-color: #579e64;'.
_add ' color: #69ad74;'.
_add '}'.
_add '.repo_tab td.cmd span.state-block span.deleted {'.
_add ' background-color: #c76861;'.
_add ' border-color: #b8605a;'.
_add ' color: white;'.
_add '}'.
_add '.repo_tab td.cmd span.state-block span.none {'.
_add ' background-color: #e8e8e8;'.
_add ' border-color: #dbdbdb;'.
_add ' color: #c8c8c8;'.
_add '}'.
ENDMETHOD. "styles
METHOD lif_gui_page~get_assets.
* http://fa2png.io/r/octicons/
* colour: #808080
* size: 16
* https://www.base64-image.de/ can be used to convert images to base64
DATA ls_image TYPE ty_web_asset.
rt_assets = super->lif_gui_page~get_assets( ).
ls_image-url = 'img/sync' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA6ElEQVQYGY3BIWuUAQAG'
&& '4Pc7N72xsbGBYNE8tYpVZKDZX2CcYLEZ9yQxOQSz3D/YmkUsVovRQ2SYNJnlkFfH7VZu'
&& 'wefJgrGHXnjrpQeu5B93smCwr6qqqp54433mDI5Ucds1u577o+p35hyoqe2cMThWVatJ'
&& '7KiZrZxz18SJqqtJPFXPssRgw0oSH9WNXMCQU76qzSxx2cxxTlk3yhKb6mcSQy7kvjpM'
&& 'Ylt98tpjN3POyFTdSuKSqppayxkjE/Uhc36p+m7PhhXr7vmmfhhnzpHPJqqqquqdcRY8'
&& 'spq47sAXMyde2c3/+wvX7Y18BexhBwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_assets.
ls_image-url = 'img/toc' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAFVBMVEUAAACAgICAgICA'
&& 'gICAgICAgICAgIAO39T0AAAABnRSTlMABBCRlMXJzV0oAAAAN0lEQVQIW2NgwABuaWlB'
&& 'YWlpDgwJDAxiAgxACshgYwAz0tLY2NISSBWBMYAmg4ADyBZhARCJAQBBchGypGCbQgAA'
&& 'AABJRU5ErkJggg=='.
APPEND ls_image TO rt_assets.
ls_image-url = 'img/repo_online' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAApVBMVEUAAABQbJxQbJxQ'
&& 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ'
&& 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ'
&& 'bJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQbJxQ'
&& 'bJz+TJ01AAAANnRSTlMAAQIDBAcJCgwSFBocHygqMTM1NkRHSU1QUWFiZGlweHuDiImL'
&& 'lZiio6a5vsfT3uTo6e3x9fsxY2JuAAAAgUlEQVQYGXXB6RaBUBSA0e+IEuIiMs9zhlDn'
&& '/R/NZWmt/LA3f1RcoaB50SydCbn20wjedkPu3sKSpMGH21PhLdZ0BATZ+cCXtxtDHGLV'
&& 'pgFW9QqJj2U0wvJvMF+5jiNGI3HK9dMQSouH6sRoFGoWd8l1dEDRWlWPQsFS98KPvvDH'
&& 'C3HLClrWc70ZAAAAAElFTkSuQmCC'.
APPEND ls_image TO rt_assets.
ls_image-url = 'img/repo_offline' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAVFBMVEUAAACAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICuaWnmAAAAG3RSTlMAAgQFBgsQFxweIiMtN3yI'
&& 'nqOvt9Hp6/Hz9fktMNR/AAAAXElEQVQYV5WO2xJAMAxES1q3ugfF/v9/0qLyyL4k58xk'
&& 'J0p9D7N5oeqZgSwy7fDZnHNdEE1gWK116tksl7hPimGFFPWYl7MU0zksRCl8TStKg1AJ'
&& '0XNC8Zm4/c0BUVQHi0llOUYAAAAASUVORK5CYII='.
APPEND ls_image TO rt_assets.
ls_image-url = 'img/pkg' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA30lEQVQoU43OIUuDcRSF'
&& '8fvqhuB0mFwaKLbVBVdkX0GTFss+wYL2H4rJIIgyQQSzZcUPoGHZ9CKCmAwTMS8Y/ga3'
&& 'BWVjT7hwOQ+HEzEbMhU7jrTd69q2KhtFRU2nrvS927dm3pyqPXcuNRVD7sxiRIQlDSc+'
&& 'PGjZUFDWkYekLfdoV2XYua4rSZ61pZBkEUq2XPty41XuXJIiZGNhPDVZiFCYIMSor+Db'
&& '7RQhYnQnCsNvNmGgPFFYMQh1PU9aqrLxyGUNx/p66r9mUc2hFx3JhU9vDtQU4y9KGjaV'
&& '/gXT+AGZVIinhU2EAwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_assets.
ls_image-url = 'img/branch' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAqFBMVEUAAACAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
&& 'gICAgID/OyosAAAAN3RSTlMAAQIDBAYICQ8TFRweJScoKSo3Oj1FRk1dYWJjZmhzdIaJ'
&& 'j5GVm6CwsrS5vsHDyszV19ne7/X583teZAAAAIFJREFUGFdVytkagVAYheFvFzJlnqc0'
&& 'EEoR+u//zhxI7dbZ9z4LMJ1op9DmjpntdXiBigHbLiAYqukBVr63+YGRSazgCY/iEooP'
&& 'xKZxr0EnSbo14B1Rg4msKzj150fJrQpERPLBv7mIfNxlq+zRbZsu0JYpGlcdwjY9Twfr'
&& 'nAbNsr6IKQxJI/U5CgAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_assets.
ls_image-url = 'img/link' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAXVBMVEUAAACAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVwFMKAAAAHnRSTlMAAwQFBgcK'
&& 'FR4gIiMmP0JHSm+RmKDByM/R09rg+/0jN/q+AAAAX0lEQVQYV43Nxw6AIBAE0FGw916Z'
&& '//9MRQ0S4sG5bPZlCxqSCyBGXgFUJKUA4A8PUOKONzuQOxOZIjcLkrMvxGQg3skSCFYL'
&& 'Kl1Ds5LWz+33yyf4rQOSf6CjnV6rHeAA87gJtKzI8ocAAAAASUVORK5CYII='.
APPEND ls_image TO rt_assets.
ls_image-url = 'img/code' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAElBMVEUAAACAgICAgICA'
&& 'gICAgICAgIC07w1vAAAABXRSTlMABECUxcOwZQcAAAA1SURBVAhbY2AODQ0NEWBgYGVg'
&& 'YGByhNAMKgIMrKyhAQxMDhA+QwCCZgVqIIUP1Q+yJzTUAAAfUAq+Os55uAAAAABJRU5E'
&& 'rkJggg=='.
APPEND ls_image TO rt_assets.
ls_image-url = 'img/bin' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAElBMVEUAAACAgICAgICA'
&& 'gICAgICAgIC07w1vAAAABXRSTlMABECUxcOwZQcAAABBSURBVAhbXcqxDYAwAMRAK8h9'
&& 'hmAARoANvuD3X4UCiojqZMlsbe8JAuN6ZZ9ozThRCVmsJe9H0HwdXf19W9v2eAA6Fws2'
&& 'RotPsQAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_assets.
ls_image-url = 'img/obj' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAIVBMVEUAAACAgICAgICA'
&& 'gICAgICAgICAgICAgICAgICAgICAgIDcWqnoAAAACnRSTlMABD1AZI+RlcPFIaFe1gAA'
&& 'AEVJREFUCFtjYF+1atVKAQYGLgYGBuaJEJrBUgBCM0+A0AwLgLQIgyOIZmwCSgNptgAG'
&& '1gQQfzKDhgCSPFw9Kg2yZ9WqAgBWJBENLk6V3AAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_assets.
ls_image-url = 'img/lock' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAOVBMVEUAAACIiIiIiIiI'
&& 'iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIjNaTNB'
&& 'AAAAEnRSTlMABgdBVXt8iYuRsNXZ3uDi6Pmu6tfUAAAASUlEQVQYV63KSxJAQBAE0TQ0'
&& 'Znym1f0PayE0QdjJ5asCgGTu1hClqjppvaRXB60swBeA2QNUAIq+ICvKx367nqAn/P8Y'
&& 't2jg3Q5rgASaF3KNRwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_assets.
ls_image-url = 'img/dir' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAASFBMVEUAAABmksxmksxm'
&& 'ksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxmksxm'
&& 'ksxmksxmksxmksxMwQo8AAAAF3RSTlMABhIYIy1fZmhpe3+IiYuMkZvD7e/x93sipD4A'
&& 'AAA+SURBVBhXY2BABzwiokAgzAYXEGdiBAIWIYQAPzcQCApzgwEXM4M4KuBDFxAYKAEx'
&& 'VAFeBlYOTiTAzoThewD5hBAcnWM4gwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_assets.
ls_image-url = 'img/burger' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAHlBMVEUAAABtktltktlt'
&& 'ktltktltktltktltktltktltktk7ccVDAAAACXRSTlMAFDBLY2SFoPGv/DFMAAAAJ0lE'
&& 'QVQIW2NggIHKmWAwmaETwpjGoBoKBo4MmIAkxXApuGK4dgwAAJa5IzLs+gRBAAAAAElF'
&& 'TkSuQmCC'.
APPEND ls_image TO rt_assets.
ls_image-url = 'img/star' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAilBMVEUAAABejclejcle'
&& 'jclejclejclejclejclejclejclejclejclejclejclejclejclejclejclejclejcle'
&& 'jclejclejclejclejclejclejclejclejclejclejclejclejclejclejclejclejcle'
&& 'jclejclejclejclejclejclejclejclejcn2yvsVAAAALXRSTlMAAQIFBwkKCw0QERUY'
&& 'HB4jLzEzNjg7PVdYYmRvd3mDm52eub7R0+Tr8fX3+/16wo8zAAAAcElEQVQYGW3BBxKC'
&& 'MABFwYcQETv2hg1UVP79ryeTZBxw3MWL+JGltBgVtGRSSoORVOAE8Xi5zVU7rWfDCOaV'
&& 'Gu59mLz0dTPUBg95eYjVK2VdOzjBW9YZL5FT4i2k5+YoKcY5VPsQkoumOLsu1mjFHx8o'
&& 'ahA3YV7OfwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_assets.
ls_image-url = 'img/star-grey' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAilBMVEUAAADQ0NDQ0NDQ'
&& '0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ'
&& '0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ'
&& '0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NC2QdifAAAALXRSTlMAAQIFBwkKCw0QERUY'
&& 'HB4jLzEzNjg7PVdYYmRvd3mDm52eub7R0+Tr8fX3+/16wo8zAAAAcElEQVQYGW3BBxKC'
&& 'MABFwYcQETv2hg1UVP79ryeTZBxw3MWL+JGltBgVtGRSSoORVOAE8Xi5zVU7rWfDCOaV'
&& 'Gu59mLz0dTPUBg95eYjVK2VdOzjBW9YZL5FT4i2k5+YoKcY5VPsQkoumOLsu1mjFHx8o'
&& 'ahA3YV7OfwAAAABJRU5ErkJggg=='.
APPEND ls_image TO rt_assets.
ENDMETHOD. "get_assets
ENDCLASS.

View File

@ -11,8 +11,6 @@ CLASS lcl_gui_page_settings DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
save_settings TYPE string VALUE 'save_settings',
END OF c_action.
PRIVATE SECTION.
METHODS styles
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS render_proxy
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS render_development_internals
@ -46,7 +44,7 @@ CLASS lcl_gui_page_settings IMPLEMENTATION.
read_settings( ).
ro_html->add( header( io_include_style = styles( ) ) ).
ro_html->add( header( ) ).
ro_html->add( title( 'Settings' ) ).
ro_html->add( render_form_begin( ) ).
@ -56,18 +54,6 @@ CLASS lcl_gui_page_settings IMPLEMENTATION.
ro_html->add( render_form_end( ) ).
ENDMETHOD.
METHOD styles.
CREATE OBJECT ro_html.
_add '/* settings STYLES */'.
_add 'div.settings_container {'.
_add ' padding: 0.5em;'.
_add ' font-size: 10pt;'.
_add ' color: #444;'.
_add ' background-color: #f2f2f2;'.
_add '}'.
ENDMETHOD.
METHOD render_proxy.
CREATE OBJECT ro_html.
ro_html->add( |<h2>Proxy</h2>| ).

View File

@ -32,8 +32,6 @@ CLASS lcl_gui_page_stage DEFINITION FINAL INHERITING FROM lcl_gui_page_super.
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper,
render_menu
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper,
styles
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper,
scripts
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
@ -217,7 +215,7 @@ CLASS lcl_gui_page_stage IMPLEMENTATION.
CREATE OBJECT ro_html.
ro_html->add( header( io_include_style = styles( ) ) ).
ro_html->add( header( ) ).
ro_html->add( title( 'STAGE' ) ).
ro_html->add( '<div class="repo">' ).
@ -235,7 +233,7 @@ CLASS lcl_gui_page_stage IMPLEMENTATION.
CREATE OBJECT ro_html.
ro_html->add( '<div class="paddings">' ).
ro_html->add_anchor( iv_act = |commit('{ c_action-stage_commit }');|
ro_html->add_anchor( iv_act = 'gHelper.submit();'
iv_typ = gc_action_type-onclick
iv_id = 'act_commit'
iv_style = 'display: none'
@ -248,152 +246,18 @@ CLASS lcl_gui_page_stage IMPLEMENTATION.
ENDMETHOD. "render_menu
METHOD styles.
CREATE OBJECT ro_html.
_add '/* STAGE */'.
_add '.stage_tab {'.
_add ' border: 1px solid #DDD;'.
_add ' background: #fff;'.
_add ' margin-top: 0.2em;'.
_add '}'.
_add '.stage_tab td {'.
_add ' border-top: 1px solid #eee;'.
_add ' color: #333;'.
_add ' vertical-align: middle;'.
_add ' padding: 2px 0.5em;'.
_add '}'.
_add '.stage_tab th {'.
_add ' color: #BBB;'.
_add ' font-size: 10pt;'.
_add ' text-align: left;'.
_add ' font-weight: normal;'.
_add ' background-color: #edf2f9;'.
_add ' padding: 4px 0.5em;'.
_add '}'.
_add '.stage_tab td.status {'.
_add ' width: 2em;'.
_add ' text-align: center;'.
_add '}'.
_add '.stage_tab tbody tr:first-child td { padding-top: 0.5em; }'.
_add '.stage_tab tbody tr:last-child td { padding-bottom: 0.5em; }'.
_add '.stage_tab td.cmd a { padding: 0px 4px; }'.
ENDMETHOD. "styles
METHOD scripts.
CREATE OBJECT ro_html.
" Globals & initialization
ro_html->add( |var gPageID = "stage{ mv_ts }";| ).
_add 'var gChoiceCount = 0;'.
_add 'setHook();'.
" Hook global click listener on table, global action counter
_add 'function setHook() {'.
_add ' var stageTab = document.getElementById("stage_tab");'.
_add ' if (stageTab.addEventListener) {'.
_add ' stageTab.addEventListener("click", onEvent);'.
_add ' } else {'.
_add ' stageTab.attachEvent("onclick", onEvent);'. " <IE9 crutch
_add ' }'.
_add ' window.onbeforeunload = onPageUnload;'.
_add ' window.onload = onPageLoad;'.
_add '}'.
" Store table state on leaving the page
_add 'function onPageUnload() {'.
_add ' var data = collectData();'.
_add ' window.sessionStorage.setItem(gPageID, JSON.stringify(data));'.
_add '}'.
" Re-store table state on entering the page
_add 'function onPageLoad() {'.
_add ' var data = JSON.parse(window.sessionStorage.getItem(gPageID));'.
_add ' var stage = document.getElementById("stage_tab");'.
_add ' for (var i = stage.rows.length - 1; i >= 0; i--) {'.
_add ' var tr = stage.rows[i];'.
_add ' if (tr.parentNode.tagName == "THEAD") continue;'.
_add ' var context = tr.parentNode.className;'.
_add ' var cmd = data[tr.cells[1].innerText];'.
_add ' if (!cmd) continue;'.
_add ' formatTR(tr, cmd, context);'.
_add ' if (countChoiceImpact(cmd) > 0) gChoiceCount++;'.
_add ' }'.
_add ' updateMenu();'.
_add '}'.
" Event handler, change status
_add 'function onEvent(event) {'.
_add ' if (!event.target) {'. " <IE9 crutch
_add ' if (event.srcElement) event.target = event.srcElement;'.
_add ' else return;'.
_add ' }'.
_add ' if (event.target.tagName != "A") return;'.
_add ' var td = event.target.parentNode;'.
_add ' if (!td || td.tagName != "TD" || td.className != "cmd") return;'.
_add ' var cmd = event.target.innerText;'.
_add ' var tr = td.parentNode;'.
_add ' var context = tr.parentNode.className;'.
_add ' switch (cmd) {'.
_add ' case "add": cmd = "A"; break;'.
_add ' case "remove": cmd = "R"; break;'.
_add ' case "ignore": cmd = "I"; break;'.
_add ' case "reset": cmd = "?"; break;'.
_add ' }'.
_add ' formatTR(tr, cmd, context);'.
_add ' gChoiceCount += countChoiceImpact(cmd);'.
_add ' updateMenu();'.
_add '}'.
" Update action counter -> affects menu update after
_add 'function countChoiceImpact(cmd) {'.
_add ' if ("ARI".indexOf(cmd) > -1) return 1;'.
_add ' else if ("?".indexOf(cmd) > -1) return -1;'.
_add ' else alert("Unknown command");'.
_add '}'.
" Re-format table line
_add 'function formatTR(tr, cmd, context) {'.
_add ' var cmdReset = "<a>reset</a>"; '.
_add ' var cmdLocal = "<a>add</a>"; '.
_add ' var cmdRemote = "<a>ignore</a><a>remove</a>";'.
_add ' tr.cells[0].innerText = cmd;'.
_add ' tr.cells[0].style.color = (cmd == "?")?"#CCC":"";'.
_add ' tr.cells[2].innerHTML = (cmd != "?")?cmdReset'.
_add ' :(context == "local")?cmdLocal:cmdRemote;'.
_add '}'.
" Update menu items visibility
_add 'function updateMenu() {'.
_add ' if (gChoiceCount > 0) {'.
_add ' document.getElementById("act_commit").style.display = "inline";'.
_add ' document.getElementById("act_commit_all").style.display = "none";'.
_add ' } else {'.
_add ' document.getElementById("act_commit").style.display = "none";'.
_add ' document.getElementById("act_commit_all").style.display = "inline";'.
_add ' }'.
_add '}'.
" Commit change to the server
_add 'function commit(action) {'.
_add ' var data = collectData();'.
_add ' submitForm(data, action);'.
_add '}'.
" Extract data from the table
_add 'function collectData() {'.
_add ' var stage = document.getElementById("stage_tab");'.
_add ' var data = {};'.
_add ' for (var i = stage.rows.length - 1; i >= 0; i--) {'.
_add ' var row = stage.rows[i];'.
_add ' if (row.parentNode.tagName == "THEAD") continue;'.
_add ' data[row.cells[1].innerText] = row.cells[0].innerText;'.
_add ' }'.
_add ' return data; '.
_add '}'.
ro_html->add( 'var gStageParams = {' ).
ro_html->add( | seed: "stage{ mv_ts }",| ).
ro_html->add( ' stageTabId: "stage_tab",' ).
ro_html->add( ' formAction: "stage_commit",' ).
ro_html->add( ' commitNodeId: "act_commit",' ).
ro_html->add( ' commitAllNodeId: "act_commit_all"' ).
ro_html->add( '}' ).
ro_html->add( 'var gHelper = new StageHelper(gStageParams);' ).
ENDMETHOD. "scripts

View File

@ -1676,6 +1676,7 @@ CLASS ltcl_path DEFINITION
METHODS split_file_location FOR TESTING.
METHODS is_subdir FOR TESTING.
METHODS change_dir FOR TESTING.
METHODS get_filename_from_syspath FOR TESTING.
ENDCLASS. "ltcl_path
@ -1794,6 +1795,30 @@ CLASS ltcl_path IMPLEMENTATION.
ENDMETHOD.
METHOD get_filename_from_syspath.
DATA lv_filename TYPE string.
lv_filename = lcl_path=>get_filename_from_syspath( 'file.txt' ).
assert_equals( act = lv_filename exp = 'file.txt' ).
lv_filename = lcl_path=>get_filename_from_syspath( 'c:\dir\file.txt' ).
assert_equals( act = lv_filename exp = 'file.txt' ).
lv_filename = lcl_path=>get_filename_from_syspath( 'c:\file.txt' ).
assert_equals( act = lv_filename exp = 'file.txt' ).
lv_filename = lcl_path=>get_filename_from_syspath( '/dir/file.txt' ).
assert_equals( act = lv_filename exp = 'file.txt' ).
lv_filename = lcl_path=>get_filename_from_syspath( '/file.txt' ).
assert_equals( act = lv_filename exp = 'file.txt' ).
lv_filename = lcl_path=>get_filename_from_syspath( '\\server$\file.txt' ).
assert_equals( act = lv_filename exp = 'file.txt' ).
ENDMETHOD. " get_filename_from_syspath.
ENDCLASS. "ltcl_path
CLASS ltcl_file_status DEFINITION

View File

@ -360,6 +360,10 @@ CLASS lcl_path DEFINITION FINAL.
iv_cd TYPE string
RETURNING VALUE(rv_path) TYPE string.
CLASS-METHODS get_filename_from_syspath
IMPORTING iv_path TYPE string
RETURNING VALUE(rv_filename) TYPE string.
ENDCLASS. "lcl_path
CLASS lcl_path IMPLEMENTATION.
@ -434,6 +438,15 @@ CLASS lcl_path IMPLEMENTATION.
ENDMETHOD. "change_dir
METHOD get_filename_from_syspath.
" filename | c:\filename | /dir/filename | \\server\filename
FIND FIRST OCCURRENCE OF REGEX '^(?:/(?:.+/)*|(?:\w:|\\)\\(?:.+\\)*)?([^\\/]+)$'
IN iv_path
SUBMATCHES rv_filename.
ENDMETHOD. " get_filename_from_syspath.
ENDCLASS. "lcl_path
*----------------------------------------------------------------------*