diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap
index 9c7ff8684..32538a1c0 100644
--- a/src/zabapgit.prog.abap
+++ b/src/zabapgit.prog.abap
@@ -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.
diff --git a/src/zabapgit_css_common.w3mi.data.css b/src/zabapgit_css_common.w3mi.data.css
new file mode 100644
index 000000000..7fdaf42f7
--- /dev/null
+++ b/src/zabapgit_css_common.w3mi.data.css
@@ -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; }
diff --git a/src/zabapgit_css_common.w3mi.xml b/src/zabapgit_css_common.w3mi.xml
new file mode 100644
index 000000000..8e398b1d3
--- /dev/null
+++ b/src/zabapgit_css_common.w3mi.xml
@@ -0,0 +1,41 @@
+
+
+
+
+ ZABAPGIT_CSS_COMMON
+ AbapGit common styles
+
+
+ MI
+ ZABAPGIT_CSS_COMMON
+ fileextension
+ .css
+
+
+ MI
+ ZABAPGIT_CSS_COMMON
+ filename
+ common.css
+
+
+ MI
+ ZABAPGIT_CSS_COMMON
+ filesize
+ 12136
+
+
+ MI
+ ZABAPGIT_CSS_COMMON
+ mimetype
+ text/css
+
+
+ MI
+ ZABAPGIT_CSS_COMMON
+ version
+ 00002
+
+
+
+
+
diff --git a/src/zabapgit_gui.prog.abap b/src/zabapgit_gui.prog.abap
index dc15db32e..27a0ddd61 100644
--- a/src/zabapgit_gui.prog.abap
+++ b/src/zabapgit_gui.prog.abap
@@ -31,6 +31,7 @@ CLASS lcl_gui DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app.
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
@@ -41,10 +42,19 @@ CLASS lcl_gui DEFINITION FINAL CREATE PRIVATE FRIENDS lcl_app.
METHODS cache_image
IMPORTING iv_url TYPE w3url
- iv_base64 TYPE string.
+ iv_base64 TYPE string
+ RETURNING VALUE(rv_url) TYPE w3url.
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
@@ -219,17 +229,27 @@ CLASS lcl_gui IMPLEMENTATION.
ls_event LIKE LINE OF lt_events.
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.
- ls_event-eventid = mo_html_viewer->m_id_sapevent.
+ 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' ).
+
+ 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 +266,80 @@ 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.
- DATA lv_xtmp TYPE xstring.
- DATA lv_size TYPE int4.
- DATA lt_xdata TYPE TABLE OF w3_mime. " RAW255
+ DATA lv_xstr TYPE xstring.
CALL FUNCTION 'SSFC_BASE64_DECODE'
EXPORTING
b64data = iv_base64
IMPORTING
- bindata = lv_xtmp
+ bindata = lv_xstr
EXCEPTIONS
OTHERS = 1.
ASSERT sy-subrc = 0. " Image data error
+ rv_url = cache_asset( iv_xdata = lv_xstr
+ iv_url = iv_url
+ iv_type = 'image'
+ iv_subtype = 'png' ).
+
+ ENDMETHOD. "cache_image
+
+ METHOD cache_asset.
+
+ DATA: lv_xstr TYPE xstring,
+ lt_xdata TYPE TABLE OF w3_mime, " RAW255
+ lv_size TYPE int4.
+
+ ASSERT iv_text IS SUPPLIED OR iv_xdata IS SUPPLIED.
+
+ IF iv_text IS SUPPLIED. " String input
+
+ CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
+ EXPORTING
+ text = iv_text
+ IMPORTING
+ buffer = lv_xstr
+ EXCEPTIONS
+ OTHERS = 1.
+ ASSERT sy-subrc = 0.
+
+ 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'
- size = lv_size
- url = iv_url
- CHANGING data_table = lt_xdata
- EXCEPTIONS OTHERS = 1 ) ##NO_TEXT.
+ EXPORTING
+ type = iv_type
+ subtype = iv_subtype
+ size = lv_size
+ url = iv_url
+ 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.
diff --git a/src/zabapgit_gui_asset_manager.prog.abap b/src/zabapgit_gui_asset_manager.prog.abap
new file mode 100644
index 000000000..1ecfb54ef
--- /dev/null
+++ b/src/zabapgit_gui_asset_manager.prog.abap
@@ -0,0 +1,144 @@
+*&---------------------------------------------------------------------*
+*& 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.
+
+ 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.
+
+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.
+
+ 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.
+
+ENDCLASS. "lcl_gui_asset_manager
\ No newline at end of file
diff --git a/src/zabapgit_gui_asset_manager.prog.xml b/src/zabapgit_gui_asset_manager.prog.xml
new file mode 100644
index 000000000..bcab6cac1
--- /dev/null
+++ b/src/zabapgit_gui_asset_manager.prog.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+ ZABAPGIT_GUI_ASSET_MANAGER
+ A
+
+
+ X
+
+
+
+
+
+ I
+
+
+
+ 0000-00-00
+
+ 0000-00-00
+
+
+
+
+ E
+
+
+ 0000-00-00
+
+ 0000-00-00
+
+
+ X
+
+
+ -
+ R
+
+ Include ZABAPGIT_GUI_ASSET_MANAGER
+ 34
+
+
+
+
+
+
diff --git a/src/zabapgit_js_common.w3mi.data.js b/src/zabapgit_js_common.w3mi.data.js
new file mode 100644
index 000000000..b8556c7e7
--- /dev/null
+++ b/src/zabapgit_js_common.w3mi.data.js
@@ -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 = "
" + text + "
";
+ 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 = "reset";
+ var cmdLocal = "add";
+ var cmdRemote = "ignoreremove";
+
+ 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;
+}
diff --git a/src/zabapgit_js_common.w3mi.xml b/src/zabapgit_js_common.w3mi.xml
new file mode 100644
index 000000000..7047c5f2f
--- /dev/null
+++ b/src/zabapgit_js_common.w3mi.xml
@@ -0,0 +1,41 @@
+
+
+
+
+ ZABAPGIT_JS_COMMON
+ Abapgit common JS library
+
+
+ MI
+ ZABAPGIT_JS_COMMON
+ fileextension
+ .js
+
+
+ MI
+ ZABAPGIT_JS_COMMON
+ filename
+ common.js
+
+
+ MI
+ ZABAPGIT_JS_COMMON
+ filesize
+ 6500
+
+
+ MI
+ ZABAPGIT_JS_COMMON
+ mimetype
+ text/javascript
+
+
+ MI
+ ZABAPGIT_JS_COMMON
+ version
+ 00004
+
+
+
+
+
diff --git a/src/zabapgit_object_w3xx.prog.abap b/src/zabapgit_object_w3xx.prog.abap
index 220515c02..d480c2259 100644
--- a/src/zabapgit_object_w3xx.prog.abap
+++ b/src/zabapgit_object_w3xx.prog.abap
@@ -38,6 +38,10 @@ CLASS lcl_object_w3super DEFINITION INHERITING FROM lcl_objects_super ABSTRACT.
CHANGING ct_params TYPE ty_wwwparams_tt
RAISING lcx_exception.
+ METHODS patch_filename
+ CHANGING ct_params TYPE ty_wwwparams_tt
+ RAISING lcx_exception.
+
ENDCLASS. "lcl_object_W3SUPER DEFINITION
*----------------------------------------------------------------------*
@@ -144,6 +148,9 @@ CLASS lcl_object_w3super IMPLEMENTATION.
lv_size = ls_wwwparam-value.
+ " Remove file path (for security concerns)
+ patch_filename( CHANGING ct_params = lt_w3params ).
+
CASE ms_key-relid.
WHEN 'MI'.
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
@@ -387,6 +394,21 @@ CLASS lcl_object_w3super IMPLEMENTATION.
ENDMETHOD. " patch_size.
+ METHOD patch_filename.
+
+ FIELD-SYMBOLS LIKE LINE OF ct_params.
+
+ READ TABLE ct_params ASSIGNING WITH KEY name = 'filename'.
+
+ IF sy-subrc > 0.
+ lcx_exception=>raise( |W3xx: Cannot find file name for { ms_key-objid }| ).
+ ENDIF.
+
+ " Remove path
+ -value = lcl_path=>get_filename_from_syspath( |{ -value }| ).
+
+ ENDMETHOD. " patch_filename.
+
METHOD lif_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
ENDMETHOD.
diff --git a/src/zabapgit_page.prog.abap b/src/zabapgit_page.prog.abap
index 0eaaff4db..39fe26ebf 100644
--- a/src/zabapgit_page.prog.abap
+++ b/src/zabapgit_page.prog.abap
@@ -72,9 +72,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 +224,9 @@ CLASS lcl_gui_page_super IMPLEMENTATION.
ro_html->add( '' ). "#EC NOTEXT
ro_html->add( '' ). "#EC NOTEXT
ro_html->add( 'abapGit' ). "#EC NOTEXT
- ro_html->add( styles( ) ).
-
- IF io_include_style IS BOUND.
- ro_html->add( '' ). "#EC NOTEXT
- ENDIF.
-
+ ro_html->add( '' ).
ro_html->add( '' ). "#EC NOTEXT
+ ro_html->add( '' ). "#EC NOTEXT
ro_html->add( '' ). "#EC NOTEXT
ro_html->add( '' ). "#EC NOTEXT
@@ -277,39 +268,14 @@ CLASS lcl_gui_page_super IMPLEMENTATION.
ro_html->add( '
' ). "#EC NOTEXT
ro_html->add( ' | ' ). "#EC NOTEXT
ro_html->add( |{ gc_abap_version }| ). "#EC NOTEXT
- ro_html->add( ' | |
' ). "#EC NOTEXT
+ ro_html->add( ' | ' ). "#EC NOTEXT
ro_html->add( '' ). "#EC NOTEXT
ro_html->add( '' ). "#EC NOTEXT
- " Common JS routines
- _add ''. "#EC NOTEXT
-
IF io_include_script IS BOUND.
ro_html->add( '' ).
ENDIF.
@@ -338,258 +304,6 @@ CLASS lcl_gui_page_super IMPLEMENTATION.
ENDMETHOD.
- METHOD styles.
-
- CREATE OBJECT ro_html.
-
- _add ''.
-
- ENDMETHOD. "common styles
-
METHOD lif_gui_page~get_assets. " Common images here
DATA ls_image TYPE ty_web_asset.
diff --git a/src/zabapgit_page_commit.prog.abap b/src/zabapgit_page_commit.prog.abap
index 0e4152674..434b154c1 100644
--- a/src/zabapgit_page_commit.prog.abap
+++ b/src/zabapgit_page_commit.prog.abap
@@ -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( '' ).
@@ -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
diff --git a/src/zabapgit_page_db.prog.abap b/src/zabapgit_page_db.prog.abap
index 8aff9e1be..6f8ccf02c 100644
--- a/src/zabapgit_page_db.prog.abap
+++ b/src/zabapgit_page_db.prog.abap
@@ -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( '
' ).
@@ -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( '
' ).
@@ -178,7 +132,7 @@ CLASS lcl_gui_page_db_edit IMPLEMENTATION.
ro_html->add( '' ).
" 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( '
' ). "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( '
' ).
@@ -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.
\ No newline at end of file
diff --git a/src/zabapgit_page_debug.prog.abap b/src/zabapgit_page_debug.prog.abap
index db2641f77..151ca4017 100644
--- a/src/zabapgit_page_debug.prog.abap
+++ b/src/zabapgit_page_debug.prog.abap
@@ -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( '
' ).
@@ -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.
diff --git a/src/zabapgit_page_diff.prog.abap b/src/zabapgit_page_diff.prog.abap
index 9c0a97d04..e026a1d8e 100644
--- a/src/zabapgit_page_diff.prog.abap
+++ b/src/zabapgit_page_diff.prog.abap
@@ -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.
diff --git a/src/zabapgit_page_main.prog.abap b/src/zabapgit_page_main.prog.abap
index ecbda3159..e272b5983 100644
--- a/src/zabapgit_page_main.prog.abap
+++ b/src/zabapgit_page_main.prog.abap
@@ -24,8 +24,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 +123,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( ) ) ).
@@ -342,93 +340,6 @@ CLASS lcl_gui_page_main IMPLEMENTATION.
* 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
diff --git a/src/zabapgit_page_settings.prog.abap b/src/zabapgit_page_settings.prog.abap
index 797f4fa56..a81637801 100644
--- a/src/zabapgit_page_settings.prog.abap
+++ b/src/zabapgit_page_settings.prog.abap
@@ -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( |
Proxy
| ).
diff --git a/src/zabapgit_page_stage.prog.abap b/src/zabapgit_page_stage.prog.abap
index eeb1debe2..bd254fdaa 100644
--- a/src/zabapgit_page_stage.prog.abap
+++ b/src/zabapgit_page_stage.prog.abap
@@ -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( '
' ).
@@ -235,7 +233,7 @@ CLASS lcl_gui_page_stage IMPLEMENTATION.
CREATE OBJECT ro_html.
ro_html->add( '
' ).
- 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);'. "
= 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) {'. " 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 = "reset"; '.
- _add ' var cmdLocal = "add"; '.
- _add ' var cmdRemote = "ignoreremove";'.
- _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
diff --git a/src/zabapgit_unit_test.prog.abap b/src/zabapgit_unit_test.prog.abap
index 2dabe4cd0..9ff966597 100644
--- a/src/zabapgit_unit_test.prog.abap
+++ b/src/zabapgit_unit_test.prog.abap
@@ -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
diff --git a/src/zabapgit_util.prog.abap b/src/zabapgit_util.prog.abap
index 98700dbbe..282848d42 100644
--- a/src/zabapgit_util.prog.abap
+++ b/src/zabapgit_util.prog.abap
@@ -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
*----------------------------------------------------------------------*