From 96f805d50a065403d033189a466d11c4dbcfdfd2 Mon Sep 17 00:00:00 2001 From: sbcgua Date: Sat, 26 Nov 2016 19:53:52 +0200 Subject: [PATCH 1/6] W3xx remove path from filename #374 --- src/zabapgit_object_w3xx.prog.abap | 22 ++++++++++++++++++++++ src/zabapgit_unit_test.prog.abap | 25 +++++++++++++++++++++++++ src/zabapgit_util.prog.abap | 13 +++++++++++++ 3 files changed, 60 insertions(+) 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_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 *----------------------------------------------------------------------* From a108cda84575cb4571d943b92603fa4515b8f909 Mon Sep 17 00:00:00 2001 From: sbcgua Date: Sat, 26 Nov 2016 19:54:57 +0200 Subject: [PATCH 2/6] Assets manager, first working code #374 --- src/zabapgit.prog.abap | 1 + src/zabapgit_css_common.w3mi.data.css | 584 +++++++++++++++++++++++ src/zabapgit_css_common.w3mi.xml | 41 ++ src/zabapgit_gui.prog.abap | 103 ++-- src/zabapgit_gui_asset_manager.prog.abap | 140 ++++++ src/zabapgit_gui_asset_manager.prog.xml | 48 ++ src/zabapgit_page.prog.abap | 13 +- 7 files changed, 894 insertions(+), 36 deletions(-) create mode 100644 src/zabapgit_css_common.w3mi.data.css create mode 100644 src/zabapgit_css_common.w3mi.xml create mode 100644 src/zabapgit_gui_asset_manager.prog.abap create mode 100644 src/zabapgit_gui_asset_manager.prog.xml 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..949111af7 --- /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; +} + +#stdout { + 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..acb0bd0d7 --- /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 + styles.css + + + MI + ZABAPGIT_CSS_COMMON + filesize + 12130 + + + MI + ZABAPGIT_CSS_COMMON + mimetype + text/css + + + MI + ZABAPGIT_CSS_COMMON + version + 00001 + + + + + diff --git a/src/zabapgit_gui.prog.abap b/src/zabapgit_gui.prog.abap index dc15db32e..9a3290585 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..20f42129e --- /dev/null +++ b/src/zabapgit_gui_asset_manager.prog.abap @@ -0,0 +1,140 @@ +*&---------------------------------------------------------------------* +*& 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. + + METHOD get_inline_asset. + + DATA: lt_data TYPE ty_string_tt, + lv_str TYPE string. + + CASE iv_asset_name. + WHEN 'CSS_COMMON'. + " @@abapmerge include src/zabapgit_css_common.data.css > APPEND '$$' TO lt_data. + WHEN 'JS_COMMON'. + + 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_page.prog.abap b/src/zabapgit_page.prog.abap index 0eaaff4db..53771ca31 100644 --- a/src/zabapgit_page.prog.abap +++ b/src/zabapgit_page.prog.abap @@ -227,13 +227,14 @@ 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( ) ). + ro_html->add( '' ). +* ro_html->add( styles( ) ). - IF io_include_style IS BOUND. - ro_html->add( '' ). "#EC NOTEXT - ENDIF. +* IF io_include_style IS BOUND. +* ro_html->add( '' ). "#EC NOTEXT +* ENDIF. ro_html->add( '' ). "#EC NOTEXT ro_html->add( '' ). "#EC NOTEXT From e452f2a8e3f60b715237d248c98d48b4a72e802a Mon Sep 17 00:00:00 2001 From: sbcgua Date: Sun, 27 Nov 2016 00:02:13 +0200 Subject: [PATCH 3/6] remove inline styles #374 --- src/zabapgit_page.prog.abap | 263 --------------------------- src/zabapgit_page_commit.prog.abap | 45 +---- src/zabapgit_page_db.prog.abap | 109 +---------- src/zabapgit_page_debug.prog.abap | 21 +-- src/zabapgit_page_diff.prog.abap | 130 +------------ src/zabapgit_page_main.prog.abap | 91 +-------- src/zabapgit_page_settings.prog.abap | 16 +- src/zabapgit_page_stage.prog.abap | 38 +--- 8 files changed, 9 insertions(+), 704 deletions(-) diff --git a/src/zabapgit_page.prog.abap b/src/zabapgit_page.prog.abap index 53771ca31..1a9e85861 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. @@ -228,14 +225,6 @@ CLASS lcl_gui_page_super IMPLEMENTATION. ro_html->add( '' ). "#EC NOTEXT ro_html->add( 'abapGit' ). "#EC NOTEXT ro_html->add( '' ). -* ro_html->add( styles( ) ). - -* IF io_include_style IS BOUND. -* ro_html->add( '' ). "#EC NOTEXT -* ENDIF. - ro_html->add( '' ). "#EC NOTEXT ro_html->add( '' ). "#EC NOTEXT ro_html->add( '' ). "#EC NOTEXT @@ -339,258 +328,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..db6f789a8 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( '
' ). @@ -215,47 +213,6 @@ 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. diff --git a/src/zabapgit_page_db.prog.abap b/src/zabapgit_page_db.prog.abap index 8aff9e1be..b4a158417 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,9 +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. @@ -158,7 +115,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( '
' ). @@ -193,28 +150,6 @@ CLASS lcl_gui_page_db_edit 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 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. @@ -233,8 +168,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 +192,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 +283,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..08080efd6 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( '
' ). @@ -248,40 +246,6 @@ 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. From d84e1b1500e84d992245781921663c2cd5b50d3a Mon Sep 17 00:00:00 2001 From: sbcgua Date: Sun, 27 Nov 2016 00:29:46 +0200 Subject: [PATCH 4/6] common js asset #374 --- src/zabapgit_gui.prog.abap | 8 +- src/zabapgit_gui_asset_manager.prog.abap | 2 +- src/zabapgit_js_common.w3mi.data.js | 165 +++++++++++++++++++++++ src/zabapgit_js_common.w3mi.xml | 41 ++++++ src/zabapgit_page.prog.abap | 27 +--- src/zabapgit_page_commit.prog.abap | 11 +- src/zabapgit_page_db.prog.abap | 17 +-- src/zabapgit_page_stage.prog.abap | 104 -------------- 8 files changed, 216 insertions(+), 159 deletions(-) create mode 100644 src/zabapgit_js_common.w3mi.data.js create mode 100644 src/zabapgit_js_common.w3mi.xml diff --git a/src/zabapgit_gui.prog.abap b/src/zabapgit_gui.prog.abap index 9a3290585..27a0ddd61 100644 --- a/src/zabapgit_gui.prog.abap +++ b/src/zabapgit_gui.prog.abap @@ -240,10 +240,10 @@ CLASS lcl_gui IMPLEMENTATION. 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' ). + 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. diff --git a/src/zabapgit_gui_asset_manager.prog.abap b/src/zabapgit_gui_asset_manager.prog.abap index 20f42129e..8a8495c9c 100644 --- a/src/zabapgit_gui_asset_manager.prog.abap +++ b/src/zabapgit_gui_asset_manager.prog.abap @@ -119,7 +119,7 @@ CLASS lcl_gui_asset_manager IMPLEMENTATION. WHEN 'CSS_COMMON'. " @@abapmerge include src/zabapgit_css_common.data.css > APPEND '$$' TO lt_data. WHEN 'JS_COMMON'. - + " @@abapmerge include src/zabapgit_js_common.data.css > APPEND '$$' TO lt_data. WHEN OTHERS. lcx_exception=>raise( |No inline resource: { iv_asset_name }| ). ENDCASE. diff --git a/src/zabapgit_js_common.w3mi.data.js b/src/zabapgit_js_common.w3mi.data.js new file mode 100644 index 000000000..4e8029873 --- /dev/null +++ b/src/zabapgit_js_common.w3mi.data.js @@ -0,0 +1,165 @@ +// +// ABAPGIT JS function library +// + +// Output text to the debug div +function debugOutput(text, dstID) { + var stdout = document.getElementById(dstID || "stdout"); + var wrapped = "

" + text + "

"; + stdout.innerHTML = stdout.innerHTML + wrapped; +} + +// Submit form data with sapevent +function submitForm(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(); +} + +function setInitialFocus(id) { + document.getElementById(id).focus(); +} + +function submitFormById(id) { + document.getElementById(id).submit(); +} + + +// STAGE +// Hook global click listener on table, global action counter +function setHook() { + var stageTab = document.getElementById("stage_tab"); + + if (stageTab.addEventListener) { + stageTab.addEventListener("click", onEvent); + } else { + stageTab.attachEvent("onclick", onEvent); + } + + window.onbeforeunload = onPageUnload; + window.onload = onPageLoad; +} + +// Store table state on leaving the page +function onPageUnload() { + var data = collectData(); + window.sessionStorage.setItem(gPageID, JSON.stringify(data)); +} + +// Re-store table state on entering the page +function onPageLoad() { + var data = JSON.parse(window.sessionStorage.getItem(gPageID)); + var stage = document.getElementById("stage_tab"); + + 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; + + formatTR(tr, cmd, context); + if (countChoiceImpact(cmd) > 0) { + gChoiceCount++; + } + } + + updateMenu(); +} + +// Event handler, change status +function onEvent(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; + } + + formatTR(tr, cmd, context); + gChoiceCount += countChoiceImpact(cmd); + + updateMenu(); +} + +// Update action counter -> affects menu update after +function countChoiceImpact(cmd) { + if ("ARI".indexOf(cmd) > -1) { + return 1; + } else if ("?".indexOf(cmd) > -1) { + return -1; + } else { + alert("Unknown command"); + } +} + +// Re-format table line +function formatTR(tr, cmd, context) { + var cmdReset = "reset"; + var cmdLocal = "add"; + var cmdRemote = "ignoreremove"; + + tr.cells[0].innerText = cmd; + tr.cells[0].style.color = (cmd == "?") ? "#CCC" : ""; + tr.cells[2].innerHTML = (cmd != "?") ? cmdReset + :(context == "local") ? cmdLocal : cmdRemote; +} + +// Update menu items visibility +function updateMenu() { + if (gChoiceCount > 0) { + document.getElementById("act_commit").style.display = "inline"; + document.getElementById("act_commit_all").style.display = "none"; + } else { + document.getElementById("act_commit").style.display = "none"; + document.getElementById("act_commit_all").style.display = "inline"; + } +} + +// Commit change to the server +function commit(action) { + var data = collectData(); + submitForm(data, action); +} + +// Extract data from the table +function collectData() { + var stage = document.getElementById("stage_tab"); + var data = {}; + + for (var i = stage.rows.length - 1; i >= 0; 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..6021761a6 --- /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 + script.js + + + MI + ZABAPGIT_JS_COMMON + filesize + 4416 + + + MI + ZABAPGIT_JS_COMMON + mimetype + text/javascript + + + MI + ZABAPGIT_JS_COMMON + version + 00001 + + + + + diff --git a/src/zabapgit_page.prog.abap b/src/zabapgit_page.prog.abap index 1a9e85861..ee635d64d 100644 --- a/src/zabapgit_page.prog.abap +++ b/src/zabapgit_page.prog.abap @@ -226,6 +226,7 @@ CLASS lcl_gui_page_super IMPLEMENTATION. ro_html->add( 'abapGit' ). "#EC NOTEXT ro_html->add( '' ). ro_html->add( '' ). "#EC NOTEXT + ro_html->add( '' ). "#EC NOTEXT ro_html->add( '' ). "#EC NOTEXT ro_html->add( '' ). "#EC NOTEXT @@ -271,32 +272,6 @@ CLASS lcl_gui_page_super IMPLEMENTATION. 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. diff --git a/src/zabapgit_page_stage.prog.abap b/src/zabapgit_page_stage.prog.abap index dbefa4cf0..bd254fdaa 100644 --- a/src/zabapgit_page_stage.prog.abap +++ b/src/zabapgit_page_stage.prog.abap @@ -233,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' @@ -250,10 +250,14 @@ CLASS lcl_gui_page_stage IMPLEMENTATION. CREATE OBJECT ro_html. - " Globals & initialization - ro_html->add( |var gPageID = "stage{ mv_ts }";| ). - _add 'var gChoiceCount = 0;'. - _add 'setHook();'. + 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 From 61e01e294966a62fa8f351ba82bdf31928a51b93 Mon Sep 17 00:00:00 2001 From: sbcgua Date: Sun, 27 Nov 2016 11:41:29 +0200 Subject: [PATCH 6/6] abapmerge fix #374 --- src/zabapgit_gui_asset_manager.prog.abap | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/zabapgit_gui_asset_manager.prog.abap b/src/zabapgit_gui_asset_manager.prog.abap index 8a8495c9c..1ecfb54ef 100644 --- a/src/zabapgit_gui_asset_manager.prog.abap +++ b/src/zabapgit_gui_asset_manager.prog.abap @@ -110,6 +110,10 @@ CLASS lcl_gui_asset_manager IMPLEMENTATION. 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, @@ -117,9 +121,9 @@ CLASS lcl_gui_asset_manager IMPLEMENTATION. CASE iv_asset_name. WHEN 'CSS_COMMON'. - " @@abapmerge include src/zabapgit_css_common.data.css > APPEND '$$' TO lt_data. + " @@abapmerge include zabapgit_css_common.w3mi.data.css > _inline '$$'. WHEN 'JS_COMMON'. - " @@abapmerge include src/zabapgit_js_common.data.css > APPEND '$$' TO lt_data. + " @@abapmerge include zabapgit_js_common.w3mi.data.js > _inline '$$'. WHEN OTHERS. lcx_exception=>raise( |No inline resource: { iv_asset_name }| ). ENDCASE.