diff options
author | Felipe Figueroa <amenadiel@gmail.com> | 2021-03-16 09:56:55 +0300 |
---|---|---|
committer | Felipe Figueroa <amenadiel@gmail.com> | 2021-03-16 09:56:55 +0300 |
commit | 978c0359fc0d332f175b6c9af314886dfa77f340 (patch) | |
tree | 179c098505f4be2ac911744a380d174d8d5ec8d0 | |
parent | 4c18f3e766270c68a9ae0d7c49a2de76cbfca0e2 (diff) |
got new layout working
54 files changed, 1500 insertions, 1589 deletions
diff --git a/.configs/debug.kint.php b/.configs/debug.kint.php index 97394bd6..2decaa6b 100644 --- a/.configs/debug.kint.php +++ b/.configs/debug.kint.php @@ -15,38 +15,44 @@ define('KINT_SKIP_FACADE', true); Kint::$enabled_mode = true; RichRenderer::$folder = false; + if (!\function_exists('kdump')) { + function kdump(...$vars): void + { + $fp = fopen(sprintf('%s/temp/debug.output.log', dirname(__DIR__)), 'ab'); - if (!\function_exists('dump')) { - function dump(...$vars) - { - $fp = fopen(sprintf('%s/temp/debug.output.log', dirname(__DIR__)), 'ab'); - - CliRenderer::$cli_colors = true; - $return = Kint::$return; - $enabled_mode = Kint::$enabled_mode; - Kint::$return = true; - Kint::$enabled_mode = Kint::MODE_CLI; + CliRenderer::$cli_colors = true; + $return = Kint::$return; + $enabled_mode = Kint::$enabled_mode; + Kint::$return = true; + Kint::$enabled_mode = Kint::MODE_CLI; - $kintdump = Kint::dump(...$vars); - //dump($kintdump); - fwrite($fp, $kintdump); + $kintdump = Kint::dump(...$vars); + //dump($kintdump); + fwrite($fp, $kintdump); - Kint::$enabled_mode = $enabled_mode; - Kint::$return = $return; + Kint::$enabled_mode = $enabled_mode; + Kint::$return = $return; - fclose($fp); - } - } - - function ddd(...$v): void + fclose($fp); + }} + if (!\function_exists('ddd')) { + function ddd(...$vars): void { - Kint::dump(...$v); + kdump(...$vars); exit; + }} + if (!\function_exists('dump')) { + function dump(...$vars) + { + kdump(...$vars); + } } + Kint::$aliases[] = ['PHPPgAdmin\\Traits\\HelperTrait', 'staticTrace']; Kint::$aliases[] = ['PHPPgAdmin\\ContainerUtils', 'staticTrace']; Kint::$aliases[] = ['PHPPgAdmin\\Traits\\HelperTrait', 'prTrace']; Kint::$aliases[] = 'ddd'; Kint::$aliases[] = 'dump'; + Kint::$aliases[] = 'kdump'; diff --git a/.jsbeautifyrc b/.jsbeautifyrc deleted file mode 100644 index 3ff42934..00000000 --- a/.jsbeautifyrc +++ /dev/null @@ -1,56 +0,0 @@ -{ - // The plugin looks for a .jsbeautifyrc file in the same directory as the - // source file you're prettifying (or any directory above if it doesn't exist, - // or in your home folder if everything else fails) and uses those options - // along the default ones. - - // Details: https://github.com/victorporof/Sublime-HTMLPrettify#using-your-own-jsbeautifyrc-options - // Documentation: https://github.com/einars/js-beautify/ - - "html": { - "allowed_file_extensions": ["htm", "html", "xhtml", "shtml", "xml", "svg", "hbs", "twig"], - "brace_style": "collapse", - "end_with_newline": false, // End output with newline - "indent_char": " ", // Indentation character - "indent_handlebars": false, // e.g. {{#foo}}, {{/foo}} - "indent_inner_html": true, // Indent <head> and <body> sections - "indent_scripts": "keep", // [keep|separate|normal] - "indent_size": 4, // Indentation size - "max_preserve_newlines": 1, // Maximum number of line breaks to be preserved in one chunk (0 disables) - "preserve_newlines": true, // Whether existing line breaks before elements should be preserved (only works before elements, not inside tags or for text) - "unformatted": ["a", "span", "img", "code", "pre", "sub", "sup", "em", - "strong", "b", "i", "u", "strike", "big", "small", "pre", "h1", "h2", "h3", - "h4", "h5", "h6" - ], // List of tags that should not be reformatted - "wrap_line_length": 0 // Lines should wrap at next opportunity after this number of characters (0 disables) - }, - "css": { - "allowed_file_extensions": ["css", "scss", "sass", "less"], - "end_with_newline": false, // End output with newline - "indent_char": " ", // Indentation character - "indent_size": 4, // Indentation size - "newline_between_rules": true, // Add a new line after every css rule - "selector_separator": " ", - "selector_separator_newline": true, // Separate selectors with newline or not (e.g. "a,\nbr" or "a, br"), - "indent_with_tabs": true - }, - "js": { - "indent_size": 4, - "indent_char": " ", - "indent_level": 0, - "indent_with_tabs": true, - "preserve_newlines": true, - "max_preserve_newlines": 3, - "jslint_happy": true, - "space_after_anon_function": false, - "brace_style": "collapse", - "keep_array_indentation": false, - "keep_function_indentation": false, - "space_before_conditional": true, - "break_chained_methods": false, - "eval_code": false, - "unescape_strings": false, - "wrap_line_length": 180 - } - -} diff --git a/assets/js/footer_scripts.js b/assets/js/footer_scripts.js index e8b606ff..5002dc87 100644 --- a/assets/js/footer_scripts.js +++ b/assets/js/footer_scripts.js @@ -24,10 +24,36 @@ function redirectToIframesView() { $.ready .then(() => { + stateObj.dttArgs = { + pageLength: 100, + }; // Need to open popup from parent document stateObj.basePath = window.parent.location.origin + (stateObj.subfolder || ''); + if (stateObj.serverSide) { + let dttData = [...new URLSearchParams($('#sqlform').serialize())].reduce( + (accum, [key, value]) => { + accum[key] = value; + return accum; + }, + {} + ); + dttData.json = 'on'; + stateObj.dttArgs = { + ...stateObj.dttArgs, + columns: stateObj.dttFields, + processing: !!stateObj.serverSide, + serverSide: !!stateObj.serverSide, + ajax: !stateObj.serverSide + ? '' + : { + url: $('#sqlform').attr('action'), + method: 'POST', + data: dttData, + }, + }; + } let redirect_to = redirectToIframesView(); window.parent.document.title = window.document.title; @@ -76,9 +102,7 @@ $.ready jQuery('.select2').select2(); } if (jqFn.DataTable) { - $('.will_be_datatable').DataTable({ - pageLength: 100, - }); + stateObj.dataTable = $('.will_be_datatable').DataTable(stateObj.dttArgs); } if (hljsFn.highlightBlock) { diff --git a/assets/js/toplinks_behavior.js b/assets/js/toplinks_behavior.js index 58dbd149..596f23eb 100644 --- a/assets/js/toplinks_behavior.js +++ b/assets/js/toplinks_behavior.js @@ -24,6 +24,7 @@ function addBehaviorToTopLinks(amIDetailFrame) { ), ].forEach((element) => { element.addEventListener('click', (e) => { + window.name = 'detail'; window .open( `${element.getAttribute('rel')}`, @@ -37,7 +38,7 @@ function addBehaviorToTopLinks(amIDetailFrame) { toplink_logout.addEventListener('click', (e) => { e.preventDefault(); if (confirm(stateObj.strconfdropcred)) { - window.location.href = e.target.href; + window.location.href = e.target.getAttribute('rel'); } }); diff --git a/assets/templates/browser.twig b/assets/templates/browser.twig deleted file mode 100644 index b7b7dbe6..00000000 --- a/assets/templates/browser.twig +++ /dev/null @@ -1,23 +0,0 @@ -<!DOCTYPE html> -<html xml:lang="{{lang.applocale}}" lang="{{lang.applocale}}" dir="{{lang.applangdir}}"> - - <head data-headertemplate="{{headertemplate}}"> - {% include 'components/common_head.twig' %} - - <script src="{{subfolder}}/assets/vendor/jstree/jstree.min.js"></script> - <style type="text/css"> - .refreshTree { - position: absolute; - right: 0; - z-index: 1000; - } - </style> - </head> - - <body class="browser"> - {% include 'components/browser_body.twig' %} - <script src="{{subfolder}}/assets/js/jstree_events.js"></script> - - </body> - -</html> diff --git a/assets/templates/components/common_body.twig b/assets/templates/components/common_body.twig index 7738aecf..bfbfa370 100644 --- a/assets/templates/components/common_body.twig +++ b/assets/templates/components/common_body.twig @@ -1,6 +1,6 @@ <body data-controller="{{ controller_name }}" class="{{ bodyClass }}" {{ onload }}> <div class="flexbox_wrapper"> - {% if includeJsTree %} + {% if excludeJsTree==false %} <div id="masking_overlay"></div> <div id="browser_container"> @@ -16,4 +16,3 @@ {% endif %} <div id="detail" class="detail_container"> -
\ No newline at end of file diff --git a/assets/templates/components/common_head.twig b/assets/templates/components/common_head.twig index ace59995..89294061 100644 --- a/assets/templates/components/common_head.twig +++ b/assets/templates/components/common_head.twig @@ -31,6 +31,7 @@ {% for key, value in params %} '{{ key }}' : "{{ value }}", {% endfor %} +serverSide:!!'{{serverSide}}', dir: '{{ lang.applangdir }}', in_test: '{{ in_test }}', reload: '{{ reload }}', @@ -41,6 +42,7 @@ query_string:"{{ query_string }}", strconfdropcred:"{{ lang.strconfdropcred }}", origin: globalThis.location.origin, url:"{{ url }}", +dttFields: {{dttFields|json_encode|raw}}, href: globalThis.location.href, guessedSubfolder: ('' + globalThis.location.pathname).replace("/ {{ path }}", ''), pathname: globalThis.location.pathname diff --git a/assets/templates/components/tabs.twig b/assets/templates/components/tabs.twig index cc70c994..c5084fb3 100644 --- a/assets/templates/components/tabs.twig +++ b/assets/templates/components/tabs.twig @@ -18,4 +18,5 @@ </div> +<div class="max_height {{ controller_name }}"> <div class="clearfix"> </div> diff --git a/assets/templates/footer.twig b/assets/templates/footer.twig index ba134db4..bfac764c 100644 --- a/assets/templates/footer.twig +++ b/assets/templates/footer.twig @@ -1,5 +1,13 @@ -{{script_footer|raw}} +{{script_footer|raw}} +{% if codemirror == true %} +<script type="text/javascript"> +CodeMirror.modeURL = "{{subfolder}}/assets/vendor/codemirror/mode/%N/%N.js"; +</script> +<script src="{{subfolder}}/assets/js/codemirror/codemirror_footer.js" type="text/javascript"></script> +<!--<script src="{{subfolder}}/assets/js/footer_scripts.js" type="text/javascript"></script>--> +<script src="{{subfolder}}/assets/js/footer_sqledit.js" type="text/javascript"></script> +{% endif %} {% if print_bottom_link == true %} <a data-footertemplate="{{footer_template}}" href="#" class="bottom_link">{{lang.strgotoppage}}</a> {% endif %} @@ -26,4 +34,6 @@ console.log('Service Worker Registered'); console.warn(warn); }) } -</script></body></html> +</script> +</div> +</body></html> diff --git a/assets/templates/header.twig b/assets/templates/header.twig index f233670c..fd6bbb3a 100644 --- a/assets/templates/header.twig +++ b/assets/templates/header.twig @@ -8,13 +8,13 @@ <script src="{{ subfolder }}/assets/vendor/jquery-resizable.js"></script> <script src="{{ subfolder }}/assets/vendor/jstree/jstree.min.js"></script> <meta name="header_template" value="{{headertemplate}}"/> -{% if headertemplate == 'header_datatables.twig' %} +{% if headertemplate == 'header_datatables.twig' or datatables == true %} <link rel="stylesheet" href="{{subfolder}}/assets/vendor/datatables/datatables.min.css" type="text/css"/> <script src="{{subfolder}}/assets/vendor/datatables/datatables.min.js"></script> {% endif %} -{% if headertemplate == 'header_select2.twig' %} +{% if headertemplate == 'header_select2.twig' %} <link rel="stylesheet" href="{{subfolder}}/assets/vendor/select2/css/select2.css" type="text/css"/> <script src="{{subfolder}}/assets/vendor/select2/js/select2.full.min.js"></script> <script src="{{subfolder}}/assets/vendor/select2/js/i18n/{{lang.isolang}}.js"></script> @@ -24,7 +24,17 @@ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css" type="text/css"/> <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script> {% endif %} -<script defer src="{{subfolder}}/assets/js/jstree_events.js"></script> + +{% if codemirror==true %} + + <link href="{{subfolder}}/assets/vendor/codemirror/lib/codemirror.css" type="text/css" rel="stylesheet"/> + <script src="{{subfolder}}/assets/vendor/codemirror/lib/codemirror.js"></script> + <script src="{{subfolder}}/assets/vendor/codemirror/addon/mode/loadmode.js"></script> + <script src="{{subfolder}}/assets/vendor/codemirror/mode/meta.js"></script> + +{% endif %} +{#<script defer src="{{subfolder}}/assets/js/jstree_events.js"></script>#} </head> + </html> diff --git a/assets/themes/global.css b/assets/themes/global.css index 86f9c18e..e1fa56d6 100644 --- a/assets/themes/global.css +++ b/assets/themes/global.css @@ -12,6 +12,24 @@ html body { /** FK browsing **/ /** Syntax highlighting **/ } +html body .topbar_parent { + display: flex; + flex-direction: row; +} +html body .topbar_parent .logo { + width: 200px; + height: 100px; + flex: 250px 0; + background-position: 0; +} +html body .topbar_parent .trail_parent { + flex: 1 auto; + display: flex; + flex-direction: column; +} +html body .topbar_parent .trail_parent .topbar { + flex: 2 auto; +} html body.sql_edit #sqlform #queryedition { min-height: 80px; } @@ -35,20 +53,23 @@ html body.sql_edit #sqlform #queryedition #query { } html body #detail.detail_container, html body.detailbody { - padding-top: 90px; + flex: 1 auto; + padding-top: 0; margin-left: 10px !important; padding-bottom: 20px; } +html body #detail.detail_container .max_height:not(.SqlEditController), +html body.detailbody .max_height:not(.SqlEditController) { + max-height: calc(100vh - 91px); + max-width: calc(100vw - 275px); + overflow: auto; +} html body #detail.detail_container div.tabs, html body.detailbody div.tabs { display: flex; - /* margin-top: 58px; */ - /* width: 100%; */ flex: 2 1 1500px; flex-direction: row; - position: relative; right: 0; - top: 60px; } html body #detail.detail_container div.tabs .tab, html body.detailbody div.tabs .tab { @@ -66,10 +87,6 @@ html body #detail.detail_container > table.tabs tbody tr td, html body.detailbody > table.tabs tbody tr td { white-space: nowrap; } -html body #detail.detail_container table, -html body.detailbody table { - min-width: calc(100vw - 370px); -} html body #detail.detail_container table.searchpath html body #detail.detail_container table#data td, html body #detail.detail_container table.searchpath html body.detailbody table#data td, html body.detailbody table.searchpath html body #detail.detail_container table#data td, @@ -169,11 +186,8 @@ html body.detailbody table tr.data3 td.opbutton3 a { white-space: nowrap; color: #fff !important; } -html body #detail.detail_container { - padding-top: 0 !important; -} html body #detail.detail_container .clearfix { - height: 61px; + height: 20px; clear: both; display: block; width: 40px; @@ -182,12 +196,22 @@ html body #detail.detail_container table.tabs { position: relative; margin-right: -10px; } -html body #detail.detail_container .topbar { +html body #detail.detail_container .fixed-top { + display: flex; position: fixed; + top: 0; + left: 0; + right: 0; +} +html body #detail.detail_container .topbar { + z-index: 100; + width: 100%; + top: 0; + margin-left: -10px !important; } html body #detail.detail_container .topbar .toplink { - width: 180px; - margin-right: 150px; + width: 200px; + margin-right: 15px; } html body #detail.detail_container .topbar .toplink button, html body #detail.detail_container .topbar .toplink .toplink_popup { @@ -202,7 +226,10 @@ html body #detail.detail_container .topbar .toplink .toplink_popup { } html body #detail.detail_container .trail { height: 24px; - position: fixed; + z-index: 100; + width: 100%; + top: 27px; + margin-left: -10px !important; } html body #detail.detail_container .trail .trail_table { min-width: unset; @@ -253,57 +280,12 @@ html body.sql_edit table.tabs { html body.flexbox_body { height: 100%; margin: 0; - /* - - & > .detail_container { - height: 100%; - width: 100%; - margin: 0px; - padding: 0px; - text-align: left; - float: left; - flex: 1 1 1300px; - }*/ - /* - & > #browser_container { - height: 100%; - margin: 0px; - padding: 0px; - text-align: left; - float: left; - flex: 1 2 300px; - - & > .browser_container { - height: 100%; - margin: 0px; - padding: 0px; - text-align: left; - float: left; - width: 100%; - } - - &.ui-resizable { - width: 300px; - //flex: unset; - border-right: 8px solid #cfd8dc; - - .ui-resizable-handle.ui-resizable-e { - width: 8px; - right: -8px; - background: #84a0ad; - top: 45%; - height: 50px; - } - } - } - */ } html body.flexbox_body .flexbox_wrapper { height: 100%; margin: 0; display: flex; flex-direction: row; - border: 1px solid silver; overflow: hidden; /* avoid browser level touch actions */ xtouch-action: none; @@ -410,27 +392,6 @@ html body .arg_icon { padding-right: 5pt; padding-left: 5pt; } -html body .fixed-top { - display: flex; - position: fixed; - top: 0; - left: 0; - right: 0; -} -html body .topbar { - position: sticky; - z-index: 100; - width: 100%; - top: 0; - margin-left: -10px !important; -} -html body .trail { - position: sticky; - z-index: 100; - width: 100%; - top: 27px; - margin-left: -10px !important; -} html body #fkbg { display: none; position: fixed; diff --git a/assets/themes/global.less b/assets/themes/global.less index 51a42628..743755c3 100644 --- a/assets/themes/global.less +++ b/assets/themes/global.less @@ -3,656 +3,655 @@ **/ html { - height: 100%; - margin: 0; - - body { - &.sql_edit { - #sqlform { - #queryedition { - min-height: 80px; - - & > .CodeMirror { - min-height: 70px; - .CodeMirror-scroll { - .CodeMirror-sizer { - margin-left: 40px !important; - .cm-m-sql { - &.cm-keyword { - text-transform: uppercase; - } - } - } - .CodeMirror-gutters { - .CodeMirror-linenumbers { - min-width: 30px !important; - } - .CodeMirror-foldgutter { - width: 0.7em !important; - } - } - } - } - - #query { - min-height: 70px; - } - } - } - } - #detail.detail_container, - &.detailbody { - padding-top: 90px; //margin-bottom: -90px; - margin-left: 10px !important; - padding-bottom: 20px; - div.tabs { - display: flex; - /* margin-top: 58px; */ - /* width: 100%; */ - flex: 2 1 1500px; - flex-direction: row; - position: relative; - right: 0; - top: 60px; - .tab { - flex: 1 1 auto; - flex-direction: column; - } - } - & > table.tabs { - position: fixed; - top: 58px; - z-index: 50; - margin-left: -10px; - z-index: 50; - - tbody { - tr { - td { - white-space: nowrap; - } - } - } - } - table { - min-width: calc(100vw - 370px); - &.searchpath &#data { - td { - white-space: nowrap; - - &.opbutton1, - &.opbutton2, - &.opbutton3 { - border: 0 none; - padding-left: 1px; - padding-right: 1px; - - a { - margin-left: 2px; - margin-right: 2px; - } - } - } - } - - &.will_be_datatable { - td { - white-space: nowrap; - - &.opbutton1, - &.opbutton2, - &.opbutton3 { - border: 0 none; - padding-left: 1px; - padding-right: 1px; - - a { - margin-left: 2px; - margin-right: 2px; - } - } - - &.comment { - white-space: normal; - } - } - } - - tr.data1 td.opbutton1 a, - tr.data2 td.opbutton2 a, - tr.data3 td.opbutton3 a { - -webkit-background-clip: border-box; - -webkit-background-origin: padding-box; - -webkit-background-size: auto; - -webkit-user-select: none; - background-attachment: scroll; - background-clip: border-box; - background-color: rgb(66, 139, 202); - background-image: none; - background-origin: padding-box; - background-size: auto; - border: 1px solid #999; - border-radius: 1.5px; - cursor: pointer; - display: inline-block; - font-size: 11px; - font-weight: normal; - height: 15px; - line-height: 15px; - margin-bottom: 0px; - padding-bottom: 1px; - padding-left: 5px; - padding-right: 5px; - padding-top: 1px; - text-align: center; - text-decoration: none; - vertical-align: middle; - white-space: nowrap; - color: #fff !important; - } - } - } - #detail.detail_container { - padding-top: 0 !important; - .clearfix { - height: 61px; - clear: both; - display: block; - width: 40px; - } - table { - &.tabs { - position: relative; - margin-right: -10px; - } - } - .topbar { - position: fixed; - .toplink { - width: 180px; - margin-right: 150px; - button, - .toplink_popup { - font-size:1.05em; - border: 1px solid rgba(51, 102, 153,0.5); - border-radius: 4px; - float:left; - margin-right:3px; - font-weight: bold; - color:#336699; - cursor:pointer; - } - } - } - .trail { - height:24px; - position: fixed; - .trail_table { - min-width:unset; - } - .searchpath { - min-width:unset; -right:0; -position:fixed; -top:25px; - } - } - } - .navlink { - li { - a { - -webkit-background-clip: border-box; - -webkit-background-origin: padding-box; - -webkit-background-size: auto; - -webkit-user-select: none; - background-attachment: scroll; - background-clip: border-box; - background-color: rgb(66, 139, 202); - background-image: none; - background-origin: padding-box; - background-size: auto; - border: 1px solid #999; - border-radius: 1.5px; - cursor: pointer; - display: inline-block; - font-size: 12px; - font-weight: normal; - height: 15px; - line-height: 15px; - margin-bottom: 0px; - padding-bottom: 1px; - padding-left: 5px; - padding-right: 5px; - padding-top: 1px; - text-align: center; - text-decoration: none; - vertical-align: middle; - white-space: nowrap; - color: #fff !important; - } - } - } - - &.sql_edit { - //padding-top: 35px; - #flexbox_wrapper { - height: 100%; - margin-top: 25px; - } - - table.tabs { - top: 0; - } - } - - &.flexbox_body { - height: 100%; - margin: 0; - - .flexbox_wrapper { - height: 100%; - margin: 0; - - display: flex; - flex-direction: row; - border: 1px solid silver; - overflow: hidden; - - /* avoid browser level touch actions */ - xtouch-action: none; - - #browser_container { - flex: 0 0 auto; - /* only manually resize */ - //padding: 10px; - width: 250px; - min-height: 200px; - min-width: 150px; - white-space: nowrap; - // background: #838383; - color: white; - - .refreshTree { - position: absolute; - left: 200px; - z-index: 1000; - padding: 5px; - width: 40px; - } - } - - .splitter { - flex: 0 0 auto; - width: 8px; - - min-height: 200px; - cursor: col-resize; - } - - #detail_container { - flex: 1 1 auto; - /* resizable */ - padding: 10px; - width: 100%; - min-height: 200px; - min-width: 200px; - background: #eee; - } - } - /* - - & > .detail_container { - height: 100%; - width: 100%; - margin: 0px; - padding: 0px; - text-align: left; - float: left; - flex: 1 1 1300px; - }*/ - /* - & > #browser_container { - height: 100%; - margin: 0px; - padding: 0px; - text-align: left; - float: left; - flex: 1 2 300px; - - & > .browser_container { - height: 100%; - margin: 0px; - padding: 0px; - text-align: left; - float: left; - width: 100%; - } - - &.ui-resizable { - width: 300px; - //flex: unset; - border-right: 8px solid #cfd8dc; - - .ui-resizable-handle.ui-resizable-e { - width: 8px; - right: -8px; - background: #84a0ad; - top: 45%; - height: 50px; - } - } - } - */ - - &.rtl { - .flexbox_wrapper { - & > .detail_container { - float: right; - flex-grow: 1; - } - - & > #browser_container { - float: right; - - flex: 0 0 300px; - - &.ui-resizable { - flex: unset; - border-right: 0 none; - border-left: 8px solid #cfd8dc; - - .ui-resizable-handle.ui-resizable-w { - width: 8px; - left: -8px; - background: #84a0ad; - top: 45%; - height: 50px; - } - } - } - } - } - } - - /** Browser Tree using XLoadTree 2 **/ - &.browser { - height: 100%; - margin: 0px; - padding: 0px; - text-align: left; - - .refreshTree { - float: right; - text-align: right; - margin: 10px; - padding: 0 3px; - } - - .webfx-tree-row { - white-space: nowrap; - } - - .webfx-tree-children { - background-repeat: repeat-y; - background-position-y: 1px !important; - /* IE only */ - } - - .webfx-tree-row img { - vertical-align: middle; - } - - .webfx-tree-item-label { - margin-left: 0.5ex; - } - - .webfx-tree-icon { - margin-left: 1px; - } - - .webfx-tree-hide-root { - display: none; - } - } - - img { - border: none; - } - - p.message { - color: blue; - } - - p.comment { - font-style: italic; - } - - .left { - text-align: left; - } - - .pre { - white-space: pre; - } - - .arg_icon { - padding-right: 5pt; - padding-left: 5pt; - } - .fixed-top { - display: flex; - position: fixed; - top: 0; - left: 0; - right: 0; - } - .topbar { - position: sticky; - z-index: 100; - width: 100%; - top: 0; - margin-left: -10px !important; - } - - .trail { - position: sticky; - z-index: 100; - width: 100%; - top: 27px; - margin-left: -10px !important; - } - - /** auto-complete on insert **/ - #fkbg { - display: none; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 10; - } - - #fklist { - display: none; - position: absolute; - background: #fff; - border: 1px solid #000; - overflow: auto; - z-index: 15; - } - - #fklist table { - border-collapse: collapse; - border: 1px solid #aaa; - } - - #fklist th { - border: 1px solid #aaa; - } - - #fklist td, - #fklist th { - padding: 3px 10px; - border-right: 1px solid #aaa; - font-size: 12px; - } - - #fklist td a { - display: block; - color: #000; - } - - #fklist td a.fkval, - p.errmsg { - color: red; - } - - .ac_values { - width: 100%; - } - - /** bottom link back to top **/ - .bottom_link { - position: fixed; - bottom: 0; - right: 0; - margin: 0; - padding: 4px; - background: #eee; - border-top: 1px dotted #999; - border-left: 1px dotted #999; - font-size: smaller; - } - - /** FK browsing **/ - div#root { - position: absolute; - } - - div.fk { - margin-left: 20px; - } - - div#fkcontainer { - margin: 0; - position: relative; - width: 100%; - background: none; - border: 0px; - } - - div.fk_value { - display: inline-block; - } - - .highlight { - background-color: #ffff00; - } - - /** Syntax highlighting **/ - .comment { - color: #008080; - } - - .keyword { - color: #ff8000; - } - - .literal { - color: #808080; - } - - .bold { - font-weight: bold; - } - - .select2-container { - min-width: 250px; - } - - form.sqlform { - float: left; - width: 100%; - - .sqledit_bottom_inputs { - padding: 1%; - width: 98%; - float: left; - - p { - label { - float: left; - - #paginate { - position: relative; - top: 2px; - } - } - } - } - } - - .searchpath { - padding: 5px; - clear: both; - min-width:unset; - float:left; - } - - .CodeMirror { - border: 1px solid #aaa; - padding: 3px; - font-size: 1.1em; - line-height: 1.5em; - } - } + height: 100%; + margin: 0; + + body { + + .topbar_parent { + display: flex; + flex-direction: row; + + .logo { + width: 200px; + height: 100px; + flex: 250px 0; + background-position: 0; + } + + .trail_parent { + flex: 1 auto; + display: flex; + flex-direction: column; + + .topbar { + flex: 2 auto; + } + } + } + + &.sql_edit { + #sqlform { + #queryedition { + min-height: 80px; + + &>.CodeMirror { + min-height: 70px; + + .CodeMirror-scroll { + .CodeMirror-sizer { + margin-left: 40px !important; + + .cm-m-sql { + &.cm-keyword { + text-transform: uppercase; + } + } + } + + .CodeMirror-gutters { + .CodeMirror-linenumbers { + min-width: 30px !important; + } + + .CodeMirror-foldgutter { + width: 0.7em !important; + } + } + } + } + + #query { + min-height: 70px; + } + } + } + } + + #detail.detail_container, + &.detailbody { + flex: 1 auto; + + padding-top: 0; //margin-bottom: -90px; + margin-left: 10px !important; + padding-bottom: 20px; + + .max_height:not(.SqlEditController) { + max-height: calc(100vh - 91px); + max-width: calc(100vw - 275px); + overflow:auto; + } + + div.tabs { + display: flex; + flex: 2 1 1500px; + flex-direction: row; + + right: 0; + + .tab { + flex: 1 1 auto; + flex-direction: column; + } + } + + &>table.tabs { + position: fixed; + top: 58px; + z-index: 50; + margin-left: -10px; + z-index: 50; + + tbody { + tr { + td { + white-space: nowrap; + } + } + } + } + + table { + //min-width: calc(100vw - 370px); + + &.searchpath &#data { + td { + white-space: nowrap; + + &.opbutton1, + &.opbutton2, + &.opbutton3 { + border: 0 none; + padding-left: 1px; + padding-right: 1px; + + a { + margin-left: 2px; + margin-right: 2px; + } + } + } + } + + &.will_be_datatable { + td { + white-space: nowrap; + + &.opbutton1, + &.opbutton2, + &.opbutton3 { + border: 0 none; + padding-left: 1px; + padding-right: 1px; + + a { + margin-left: 2px; + margin-right: 2px; + } + } + + &.comment { + white-space: normal; + } + } + } + + tr.data1 td.opbutton1 a, + tr.data2 td.opbutton2 a, + tr.data3 td.opbutton3 a { + -webkit-background-clip: border-box; + -webkit-background-origin: padding-box; + -webkit-background-size: auto; + -webkit-user-select: none; + background-attachment: scroll; + background-clip: border-box; + background-color: rgb(66, 139, 202); + background-image: none; + background-origin: padding-box; + background-size: auto; + border: 1px solid #999; + border-radius: 1.5px; + cursor: pointer; + display: inline-block; + font-size: 11px; + font-weight: normal; + height: 15px; + line-height: 15px; + margin-bottom: 0px; + padding-bottom: 1px; + padding-left: 5px; + padding-right: 5px; + padding-top: 1px; + text-align: center; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + color: #fff !important; + } + } + } + + #detail.detail_container { + + .clearfix { + height: 20px; + clear: both; + display: block; + width: 40px; + } + + table { + &.tabs { + position: relative; + margin-right: -10px; + } + } + + .fixed-top { + display: flex; + position: fixed; + top: 0; + left: 0; + right: 0; + } + + + .topbar { + + z-index: 100; + width: 100%; + top: 0; + margin-left: -10px !important; + + .toplink { + width: 200px; + margin-right: 15px; + + button, + .toplink_popup { + font-size: 1.05em; + border: 1px solid rgba(51, 102, 153, 0.5); + border-radius: 4px; + float: left; + margin-right: 3px; + font-weight: bold; + color: #336699; + cursor: pointer; + } + } + } + + .trail { + height: 24px; + z-index: 100; + width: 100%; + top: 27px; + margin-left: -10px !important; + .trail_table { + min-width: unset; + } + + .searchpath { + min-width: unset; + right: 0; + position: fixed; + top: 25px; + } + } + } + + .navlink { + li { + a { + -webkit-background-clip: border-box; + -webkit-background-origin: padding-box; + -webkit-background-size: auto; + -webkit-user-select: none; + background-attachment: scroll; + background-clip: border-box; + background-color: rgb(66, 139, 202); + background-image: none; + background-origin: padding-box; + background-size: auto; + border: 1px solid #999; + border-radius: 1.5px; + cursor: pointer; + display: inline-block; + font-size: 12px; + font-weight: normal; + height: 15px; + line-height: 15px; + margin-bottom: 0px; + padding-bottom: 1px; + padding-left: 5px; + padding-right: 5px; + padding-top: 1px; + text-align: center; + text-decoration: none; + vertical-align: middle; + white-space: nowrap; + color: #fff !important; + } + } + } + + &.sql_edit { + + //padding-top: 35px; + #flexbox_wrapper { + height: 100%; + margin-top: 25px; + } + + table.tabs { + top: 0; + } + } + + &.flexbox_body { + height: 100%; + margin: 0; + + .flexbox_wrapper { + height: 100%; + margin: 0; + + display: flex; + flex-direction: row; + + overflow: hidden; + + /* avoid browser level touch actions */ + xtouch-action: none; + + #browser_container { + flex: 0 0 auto; + /* only manually resize */ + //padding: 10px; + width: 250px; + min-height: 200px; + min-width: 150px; + white-space: nowrap; + // background: #838383; + color: white; + + .refreshTree { + position: absolute; + left: 200px; + z-index: 1000; + padding: 5px; + width: 40px; + } + } + + .splitter { + flex: 0 0 auto; + width: 8px; + + min-height: 200px; + cursor: col-resize; + } + + #detail_container { + flex: 1 1 auto; + /* resizable */ + padding: 10px; + width: 100%; + min-height: 200px; + min-width: 200px; + background: #eee; + } + } + + + &.rtl { + .flexbox_wrapper { + &>.detail_container { + float: right; + flex-grow: 1; + } + + &>#browser_container { + float: right; + + flex: 0 0 300px; + + &.ui-resizable { + flex: unset; + border-right: 0 none; + border-left: 8px solid #cfd8dc; + + .ui-resizable-handle.ui-resizable-w { + width: 8px; + left: -8px; + background: #84a0ad; + top: 45%; + height: 50px; + } + } + } + } + } + } + + /** Browser Tree using XLoadTree 2 **/ + &.browser { + height: 100%; + margin: 0px; + padding: 0px; + text-align: left; + + .refreshTree { + float: right; + text-align: right; + margin: 10px; + padding: 0 3px; + } + + .webfx-tree-row { + white-space: nowrap; + } + + .webfx-tree-children { + background-repeat: repeat-y; + background-position-y: 1px !important; + /* IE only */ + } + + .webfx-tree-row img { + vertical-align: middle; + } + + .webfx-tree-item-label { + margin-left: 0.5ex; + } + + .webfx-tree-icon { + margin-left: 1px; + } + + .webfx-tree-hide-root { + display: none; + } + } + + img { + border: none; + } + + p.message { + color: blue; + } + + p.comment { + font-style: italic; + } + + .left { + text-align: left; + } + + .pre { + white-space: pre; + } + + .arg_icon { + padding-right: 5pt; + padding-left: 5pt; + } + + + /** auto-complete on insert **/ + #fkbg { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 10; + } + + #fklist { + display: none; + position: absolute; + background: #fff; + border: 1px solid #000; + overflow: auto; + z-index: 15; + } + + #fklist table { + border-collapse: collapse; + border: 1px solid #aaa; + } + + #fklist th { + border: 1px solid #aaa; + } + + #fklist td, + #fklist th { + padding: 3px 10px; + border-right: 1px solid #aaa; + font-size: 12px; + } + + #fklist td a { + display: block; + color: #000; + } + + #fklist td a.fkval, + p.errmsg { + color: red; + } + + .ac_values { + width: 100%; + } + + /** bottom link back to top **/ + .bottom_link { + position: fixed; + bottom: 0; + right: 0; + margin: 0; + padding: 4px; + background: #eee; + border-top: 1px dotted #999; + border-left: 1px dotted #999; + font-size: smaller; + } + + /** FK browsing **/ + div#root { + position: absolute; + } + + div.fk { + margin-left: 20px; + } + + div#fkcontainer { + margin: 0; + position: relative; + width: 100%; + background: none; + border: 0px; + } + + div.fk_value { + display: inline-block; + } + + .highlight { + background-color: #ffff00; + } + + /** Syntax highlighting **/ + .comment { + color: #008080; + } + + .keyword { + color: #ff8000; + } + + .literal { + color: #808080; + } + + .bold { + font-weight: bold; + } + + .select2-container { + min-width: 250px; + } + + form.sqlform { + float: left; + width: 100%; + + .sqledit_bottom_inputs { + padding: 1%; + width: 98%; + float: left; + + p { + label { + float: left; + + #paginate { + position: relative; + top: 2px; + } + } + } + } + } + + .searchpath { + padding: 5px; + clear: both; + min-width: unset; + float: left; + } + + .CodeMirror { + border: 1px solid #aaa; + padding: 3px; + font-size: 1.1em; + line-height: 1.5em; + } + } } @media print { - @page { - size: 215.9mm 279.4mm; - margin: 5mm 5mm 5mm 5mm; - orphans: 100; - widows: 0; - } - - html, - body { - height: 100%; - width: 100%; - } - - #browser_container { - display: none; - } - - body { - margin: 0; //zoom: 0.9; - background: white; - background-color: #ffffff; - - .flexbox_wrapper > .detail_container { - height: 100%; - width: 100%; - margin: 0px; - padding: 0px; - text-align: left; - float: left; - flex: 1 1; - border: 4px red; - } - - .topbar { - display: none; - } - - .trail { - display: none; - } - - h2 { - display: none; - } - } -} + @page { + size: 215.9mm 279.4mm; + margin: 5mm 5mm 5mm 5mm; + orphans: 100; + widows: 0; + } + + html, + body { + height: 100%; + width: 100%; + } + + #browser_container { + display: none; + } + + body { + margin: 0; //zoom: 0.9; + background: white; + background-color: #ffffff; + + .flexbox_wrapper>.detail_container { + height: 100%; + width: 100%; + margin: 0px; + padding: 0px; + text-align: left; + float: left; + flex: 1 1; + border: 4px red; + } + + .topbar { + display: none; + } + + .trail { + display: none; + } + + h2 { + display: none; + } + } +}
\ No newline at end of file diff --git a/src/classes/Connection.php b/src/classes/Connection.php index a27a1470..645169fa 100644 --- a/src/classes/Connection.php +++ b/src/classes/Connection.php @@ -109,7 +109,7 @@ class Connection return null; } $serverInfo = $this->conn->ServerInfo(); - dump($serverInfo); + // dump($serverInfo); $this->pgVersion = $serverInfo['version']; $description = \sprintf( 'PostgreSQL %s', diff --git a/src/classes/ContainerUtils.php b/src/classes/ContainerUtils.php index 2fb57b7a..300effc0 100644 --- a/src/classes/ContainerUtils.php +++ b/src/classes/ContainerUtils.php @@ -142,7 +142,7 @@ class ContainerUtils extends Container implements ContainerInterface self::$instance ->withConf(self::$envConfig); - + $handlers = new ContainerHandlers(self::$instance); $handlers->setExtra() @@ -168,15 +168,15 @@ class ContainerUtils extends Container implements ContainerInterface // if server_id isn't set, then you will be redirected to intro if (null === $container->request->getQueryParam('server')) { - $destinationurl = $this->subFolder. '/intro'; + $destinationurl = $this->subFolder . '/intro'; } else { // otherwise, you'll be redirected to the login page for that server; - $destinationurl = $this->subFolder. '/login' . ($query_string ? '?' . $query_string : ''); + $destinationurl = $this->subFolder . '/login' . ($query_string ? '?' . $query_string : ''); } - $destinationurl= (strpos($destinationurl,'/')===0)? $destinationurl:'/'.$destinationurl; - // ddd($destinationurl); - return $destinationurl; + $destinationurl = (strpos($destinationurl, '/') === 0) ? $destinationurl : '/' . $destinationurl; + // ddd($destinationurl); + return $destinationurl; } /** @@ -198,6 +198,38 @@ class ContainerUtils extends Container implements ContainerInterface } } + public function getActionUrl($subject, bool $debug = false) + { + $container = self::getContainerInstance(); + $_server_info = $container->misc->getServerInfo(); + $url = $container->misc->getLastTabURL($subject) ?? ['url' => 'alldb', 'urlvars' => ['subject' => 'server']]; + $url['urlvars'] = array_merge([], $url['urlvars'] ?? []); + + + if (isset($_server_info['username']) && \is_array($url)) { + + + + + + $this->addFlash($url, 'getLastTabURL for ' . $subject); + // Load query vars into superglobal arrays + + $urlvars = []; + + foreach ($url['urlvars'] as $key => $urlvar) { + //$this->prtrace($key, $urlvar); + $urlvars[$key] = Decorator::get_sanitized_value($urlvar, $_REQUEST); + } + $_REQUEST = \array_merge($_REQUEST, $urlvars); + $_GET = \array_merge($_GET, $urlvars); + $actionurl = Decorator::actionurl($url['url'], $_GET); + //kdump($actionurl); + return $actionurl; + } + //kdump($url); + return null; + } /** * Gets the destination with the last active tab selected for that controller * Usually used after going through a redirect route. @@ -206,7 +238,7 @@ class ContainerUtils extends Container implements ContainerInterface * * @return string The destination url with last tab set in the query string */ - public function getDestinationWithLastTab($subject,$urlvars=[]) + public function getDestinationWithLastTab($subject, $urlvars = []) { $container = self::getContainerInstance(); $_server_info = $container->misc->getServerInfo(); @@ -214,17 +246,17 @@ class ContainerUtils extends Container implements ContainerInterface //$this->prtrace('$_server_info', $_server_info); // If username isn't set in server_info, you should login $url = $container->misc->getLastTabURL($subject) ?? ['url' => 'alldb', 'urlvars' => ['subject' => 'server']]; - $url['urlvars']=array_merge($urlvars,$url['urlvars']??[]); + $url['urlvars'] = array_merge($urlvars, $url['urlvars'] ?? []); $destinationurl = $this->getRedirectUrl(); if (isset($_server_info['username']) && \is_array($url)) { - - - - - - $this->addFlash($url, 'getLastTabURL for ' . $subject); - // Load query vars into superglobal arrays - + + + + + + $this->addFlash($url, 'getLastTabURL for ' . $subject); + // Load query vars into superglobal arrays + $urlvars = []; foreach ($url['urlvars'] as $key => $urlvar) { @@ -233,12 +265,11 @@ class ContainerUtils extends Container implements ContainerInterface } $_REQUEST = \array_merge($_REQUEST, $urlvars); $_GET = \array_merge($_GET, $urlvars); - - $actionurl = Decorator::actionurl($url['url'], $_GET); - $destinationurl =str_replace($this->subFolder,'', $actionurl->value($_GET)); - + + $actionurl = Decorator::actionurl($url['url'], $_GET); + $destinationurl = str_replace($this->subFolder, '', $actionurl->value($_GET)); } - $destinationurl= (($container->subFolder==='' || strpos($destinationurl,$container->subFolder)===0)?'': $container->subFolder).$destinationurl; + $destinationurl = (($container->subFolder === '' || strpos($destinationurl, $container->subFolder) === 0) ? '' : $container->subFolder) . $destinationurl; return $destinationurl; } @@ -295,7 +326,7 @@ class ContainerUtils extends Container implements ContainerInterface $conf['plugins'] = []; $container->BASE_PATH = $conf['BASE_PATH']; - $container->subFolder = $conf['subfolder']??$conf['subFolder']; + $container->subFolder = $conf['subfolder'] ?? $conf['subFolder']; $container->debug = $conf['debugmode']; $container->THEME_PATH = $conf['theme_path']; $container->IN_TEST = $conf['IN_TEST']; diff --git a/src/controllers/AggregatesController.php b/src/controllers/AggregatesController.php index 20d63135..55f124b5 100644 --- a/src/controllers/AggregatesController.php +++ b/src/controllers/AggregatesController.php @@ -102,7 +102,7 @@ class AggregatesController extends BaseController 'title' => $this->lang['strname'], 'field' => Decorator::field('proname'), 'url' => \sprintf( - 'redirect.php?subject=aggregate&action=properties&%s&', + 'aggregates?subject=aggregate&action=properties&%s&', $this->misc->href ), 'vars' => ['aggrname' => 'proname', 'aggrtype' => 'proargtypes'], @@ -282,7 +282,7 @@ class AggregatesController extends BaseController $this->printTitle($this->lang['strcreateaggregate'], 'pg.aggregate.create'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/aggregates" method="post">' . \PHP_EOL; + echo '<form action="aggregates" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( ' <tr> @@ -425,7 +425,7 @@ class AggregatesController extends BaseController $this->printTitle($this->lang['stralter'], 'pg.aggregate.alter'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/aggregates" method="post">' . \PHP_EOL; + echo '<form action="aggregates" method="post">' . \PHP_EOL; $aggrdata = $this->data->getAggregate($_REQUEST['aggrname'], $_REQUEST['aggrtype']); if (0 < $aggrdata->RecordCount()) { @@ -505,7 +505,7 @@ class AggregatesController extends BaseController \htmlspecialchars($_REQUEST['aggrname']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/aggregates" method="post">' . \PHP_EOL; + echo '<form action="aggregates" method="post">' . \PHP_EOL; echo \sprintf( '<p><input type="checkbox" id="cascade" name="cascade" /> <label for="cascade">%s</label></p>', $this->lang['strcascade'] diff --git a/src/controllers/AlldbController.php b/src/controllers/AlldbController.php index 67dc3a8a..91a2ab14 100644 --- a/src/controllers/AlldbController.php +++ b/src/controllers/AlldbController.php @@ -270,7 +270,7 @@ class AlldbController extends BaseController $this->printTrail('database'); $this->printTitle($this->lang['stralter'], 'pg.database.alter'); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/alldb" method="post">' . \PHP_EOL; + echo '<form action="alldb" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( '<tr><th class="data left required">%s</th>', @@ -361,7 +361,7 @@ class AlldbController extends BaseController $this->printTrail('database'); $this->printTitle($this->lang['strdrop'], 'pg.database.drop'); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/alldb" method="post">' . \PHP_EOL; + echo '<form action="alldb" method="post">' . \PHP_EOL; //If multi drop if (isset($_REQUEST['ma'])) { foreach ($_REQUEST['ma'] as $v) { @@ -469,7 +469,7 @@ class AlldbController extends BaseController $tablespaces = $data->getTablespaces(); } - echo '<form action="' . \containerInstance()->subFolder . '/src/views/alldb" method="post">' . \PHP_EOL; + echo '<form action="alldb" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( ' <tr> diff --git a/src/controllers/BaseController.php b/src/controllers/BaseController.php index f37b8a55..919b555c 100644 --- a/src/controllers/BaseController.php +++ b/src/controllers/BaseController.php @@ -439,6 +439,7 @@ class BaseController } /** + * Retrieves a request parameter either from the body or query string * @param string $key * @param null|string $default */ diff --git a/src/controllers/ColpropertiesController.php b/src/controllers/ColpropertiesController.php index cf6241b7..ac4ba282 100644 --- a/src/controllers/ColpropertiesController.php +++ b/src/controllers/ColpropertiesController.php @@ -240,8 +240,8 @@ class ColpropertiesController extends BaseController $this->printTitle($this->lang['stralter'], 'pg.column.alter'); $this->printMsg($msg); - echo '<script src="' . \containerInstance()->subFolder . '/assets/js/tables.js" type="text/javascript"></script>'; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/colproperties" method="post">' . \PHP_EOL; + echo '<script src="assets/js/tables.js" type="text/javascript"></script>'; + echo '<form action="colproperties" method="post">' . \PHP_EOL; // Output table header echo '<table>' . \PHP_EOL; diff --git a/src/controllers/ConstraintsController.php b/src/controllers/ConstraintsController.php index 06b88cd8..d10e4b80 100644 --- a/src/controllers/ConstraintsController.php +++ b/src/controllers/ConstraintsController.php @@ -30,7 +30,7 @@ class ConstraintsController extends BaseController $this->printHeader( $this->lang['strtables'] . ' - ' . $_REQUEST['table'] . ' - ' . $this->lang['strconstraints'], - '<script src="' . \containerInstance()->subFolder . '/assets/js/indexes.js" type="text/javascript"></script>', + '<script src="assets/js/indexes.js" type="text/javascript"></script>', true, 'header_select2.twig' ); @@ -582,7 +582,7 @@ class ConstraintsController extends BaseController $this->printTitle($this->lang['straddcheck'], 'pg.constraint.check'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/constraints" method="post">' . \PHP_EOL; + echo '<form action="constraints" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( '<tr><th class="data">%s</th>', diff --git a/src/controllers/DatabaseController.php b/src/controllers/DatabaseController.php index db355e6b..a33b835d 100644 --- a/src/controllers/DatabaseController.php +++ b/src/controllers/DatabaseController.php @@ -43,7 +43,7 @@ class DatabaseController extends BaseController $scripts = ''; // normal flow if ('locks' === $this->action || 'processes' === $this->action) { - $scripts .= '<script src="' . \containerInstance()->subFolder . '/assets/js/database.js" type="text/javascript"></script>'; + $scripts .= '<script src="assets/js/database.js" type="text/javascript"></script>'; $refreshTime = $this->conf['ajax_refresh'] * 1500; @@ -80,7 +80,7 @@ class DatabaseController extends BaseController ); $scripts .= "errmsg: '" . \str_replace("'", "\\'", $this->lang['strconnectionfail']) . "'\n"; $scripts .= "};\n"; - $scripts .= '</script>' . \PHP_EOL; + $this->scripts = $scripts . '</script>' . \PHP_EOL; } $header_template = 'header.twig'; @@ -99,8 +99,8 @@ class DatabaseController extends BaseController break; case 'sql': $this->doSQL(); - $header_template = 'header_sqledit.twig'; - $footer_template = 'footer_sqledit.twig'; + $this->view->offsetSet('codemirror', true); + break; case 'variables': @@ -126,8 +126,8 @@ class DatabaseController extends BaseController default: if (false === $this->adminActions($this->action, 'database')) { - $header_template = 'header_sqledit.twig'; - $footer_template = 'footer_sqledit.twig'; + $this->view->offsetSet('codemirror', true); + $this->doSQL(); } @@ -135,7 +135,7 @@ class DatabaseController extends BaseController } $output = \ob_get_clean(); - $this->printHeader($this->headerTitle(), $scripts, true, $header_template); + $this->printHeader($this->headerTitle(), $this->scripts, true, $header_template); $this->printBody(); echo $output; @@ -213,7 +213,7 @@ class DatabaseController extends BaseController $this->printTabs('database', 'find'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/database" method="post">' . \PHP_EOL; + echo '<form action="database" method="post">' . \PHP_EOL; echo '<p><input name="term" value="', \htmlspecialchars($_REQUEST['term']), \sprintf( '" size="32" maxlength="%s" />', @@ -603,7 +603,7 @@ class DatabaseController extends BaseController '<p>%s</p>', $this->lang['strentersql'] ) . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/sql" method="post" enctype="multipart/form-data" id="sqlform">' . \PHP_EOL; + echo '<form action="sql" method="post" enctype="multipart/form-data" id="sqlform">' . \PHP_EOL; echo \sprintf( '<p>%s<br />', $this->lang['strsql'] diff --git a/src/controllers/DataexportController.php b/src/controllers/DataexportController.php index ceb643a4..5f18a25a 100644 --- a/src/controllers/DataexportController.php +++ b/src/controllers/DataexportController.php @@ -109,7 +109,7 @@ class DataexportController extends BaseController $this->printMsg($msg); } - echo '<form action="' . \containerInstance()->subFolder . '/src/views/dataexport" method="post">' . \PHP_EOL; + echo '<form action="dataexport" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( '<tr><th class="data">%s:</th><td><select name="d_format">', diff --git a/src/controllers/DisplayController.php b/src/controllers/DisplayController.php index 3338a8f2..670220cd 100644 --- a/src/controllers/DisplayController.php +++ b/src/controllers/DisplayController.php @@ -6,8 +6,10 @@ namespace PHPPgAdmin\Controller; +use ADOFieldObject; use ADORecordSet; use Exception; +use Kint\Kint; use PHPPgAdmin\ADOdbException; use PHPPgAdmin\Traits\InsertEditRowTrait; @@ -31,23 +33,24 @@ class DisplayController extends BaseController \set_time_limit(0); - $scripts = '<script src="' . \containerInstance()->subFolder . '/assets/js/display.js" type="text/javascript"></script>'; + $scripts = '<script src="assets/js/display.js" type="text/javascript"></script>'; $scripts .= '<script type="text/javascript">' . \PHP_EOL; $scripts .= "var Display = {\n"; $scripts .= "errmsg: '" . \str_replace("'", "\\'", $this->lang['strconnectionfail']) . "'\n"; $scripts .= "};\n"; - $scripts .= '</script>' . \PHP_EOL; + $this->scripts =$scripts. '</script>' . \PHP_EOL; $footer_template = 'footer.twig'; $header_template = 'header.twig'; - +$browseResult=[]; \ob_start(); switch ($this->action) { case 'editrow': - $header_template = 'header_sqledit.twig'; - $footer_template = 'footer_sqledit.twig'; + $this->view->offsetSet('codemirror',true); + + if (isset($_POST['save'])) { $this->doEditRow(); @@ -62,8 +65,9 @@ class DisplayController extends BaseController break; case 'delrow': - $header_template = 'header_sqledit.twig'; - $footer_template = 'footer_sqledit.twig'; + $this->view->offsetSet('codemirror',true); + + if (isset($_POST['yes'])) { $this->doDelRow(false); @@ -78,14 +82,21 @@ class DisplayController extends BaseController break; default: - $header_template = 'header_sqledit.twig'; - $footer_template = 'footer_sqledit.twig'; - $this->doBrowse(); + $this->view->offsetSet('datatables',true); + $this->view->offsetSet('codemirror',true); + + + $jsonResult=$this->doBrowse(); break; } $output = \ob_get_clean(); + $json=boolval($this->getRequestParam('json',null)); + //ddd($this->getAllParams()); +if($json) { + return responseInstance()->withJson( $jsonResult); + } $subject = $this->coalesceArr($_REQUEST, 'subject', 'table')['subject']; $object = null; @@ -103,8 +114,8 @@ class DisplayController extends BaseController } else { $title = $this->headerTitle('strqueryresults'); } - - $this->printHeader($title, $scripts, true, $header_template); +$this->view->offsetSet('serverSide',1); + $this->printHeader($title, $this->scripts, true, $header_template); $this->printBody(); @@ -161,25 +172,29 @@ class DisplayController extends BaseController $_REQUEST['return'] = 'selectrows'; } - //$object = $this->setIfIsset($object, $_REQUEST[$subject]); - - $this->printTrail($subject); + $json=boolval($this->getRequestParam('json',null)); + //$object = $this->setIfIsset($object, $_REQUEST[$subject]); + $trailsubject=$subject; + if($subject==='table' && !$this->getRequestParam($subject,null)) { + $trailsubject='database'; + } + $this->printTrail($trailsubject,!$json); $tabsPosition = 'browse'; - if ('database' === $subject) { + if ('database' === $trailsubject) { $tabsPosition = 'sql'; - } elseif ('column' === $subject) { + } elseif ('column' === $trailsubject) { $tabsPosition = 'colproperties'; } - - $this->printTabs($subject, $tabsPosition); - + + $this->printTabs($trailsubject, $tabsPosition, !$json); + [$query, $title, $type] = $this->getQueryTitleAndType($data, $object); - $this->printTitle($this->lang[$title]); + $this->printTitle($this->lang[$title],null, !$json); - $this->printMsg($msg); + $this->printMsg($msg, !$json); // If 'sortkey' is not set, default to '' $sortkey = $this->coalesceArr($_REQUEST, 'sortkey', '')['sortkey']; @@ -197,6 +212,9 @@ class DisplayController extends BaseController if (isset($search_path) && (0 !== $data->setSearchPath(\array_map('trim', \explode(',', $search_path))))) { return; } + + $paginate=$this->getRequestParam('paginate',null); + try { $max_pages = 0; @@ -212,6 +230,22 @@ class DisplayController extends BaseController $this->conf['max_rows'], $max_pages ); + + + if($json) { + $jsonResult=[]; + while (!$resultset->EOF) { + $jsonResult[]= $this->getJsonRowCells($resultset,isset($object)); + $resultset->MoveNext(); + } + + return [ + 'draw'=>1, + 'recordsTotal'=>$max_pages, + 'recordsFiltered'=>$max_pages, + 'data'=>$jsonResult]; + } + } catch (ADOdbException $e) { return $this->halt($e->getMessage()); } @@ -258,17 +292,25 @@ class DisplayController extends BaseController //die(htmlspecialchars($query)); - echo '<form method="post" id="sqlform" action="' . $_SERVER['REQUEST_URI'] . '">'; - echo $this->view->form; + $formHTML= '<form method="post" id="sqlform" action="' . $_SERVER['REQUEST_URI'] . '">'; + $formHTML.= $this->view->form; if ($object) { - echo '<input type="hidden" name="' . $subject . '" value="', \htmlspecialchars($object), '" />' . \PHP_EOL; + $formHTML.= '<input type="hidden" name="' . $subject . '" value="'. \htmlspecialchars($object). '" />' . \PHP_EOL; + } + $search_path = \htmlspecialchars($_REQUEST['search_path']??null); + $formHTML.= '<input type="hidden" name="search_path" id="search_path" size="45" value="' . $search_path . '" />'; + + if(isset($_REQUEST['paginate'])) { + $formHTML.= '<input type="hidden" name="paginate" value="on" />'; } - echo '<textarea width="90%" name="query" id="query" rows="5" cols="100" resizable="true">'; - echo \htmlspecialchars($query); - echo '</textarea><br><input type="submit"/>'; + // $formHTML.= '<input type="checkbox" name="json" />'; + $formHTML.= '<textarea width="90%" name="query" id="query" rows="5" cols="100" resizable="true">'; + $formHTML.= \htmlspecialchars($query); + $formHTML.= '</textarea><br><input type="submit"/>'; + $formHTML.= '</form>'; +echo $formHTML; - echo '</form>'; $this->printResultsTable($resultset, $page, $max_pages, $_gets, $object); // Navigation links @@ -318,171 +360,6 @@ class DisplayController extends BaseController return [$query, $title, $type]; } - /** - * @param array $_gets - * @param mixed $type - * @param mixed $page - * @param string $subject - * @param mixed $object - * @param mixed $resultset - * - * @return ((array|mixed|string)[][]|mixed)[][] - * - * @psalm-return array{back?: array{attr: array{href: array{url: mixed, urlvars: mixed}}, content: mixed}, edit?: array{attr: array{href: array{url: string, urlvars: array{server: mixed, database: mixed, action: string, paginate: string}}}, content: mixed}, collapse: array{attr: array{href: array{url: string, urlvars: array{strings: string, page: mixed}}}, content: mixed}, createview?: array{attr: array{href: array{url: string, urlvars: array{server: mixed, database: mixed, action: string, formDefinition: mixed}}}, content: mixed}, download?: array{attr: array{href: array{url: string, urlvars: array{server: mixed, database: mixed}}}, content: mixed}, insert?: array{attr: array{href: array{url: string, urlvars: array{server: mixed, database: mixed, action: string, table: mixed}}}, content: mixed}, refresh: array{attr: array{href: array{url: string, urlvars: array{strings: mixed, page: mixed}}}, content: mixed}} - */ - public function getBrowseNavLinks($type, array $_gets, $page, string $subject, $object, $resultset) - { - $fields = [ - 'server' => $_REQUEST['server'], - 'database' => $_REQUEST['database'], - ]; - - $this->setIfIsset($fields['schema'], $_REQUEST['schema'], null, false); - - $navlinks = []; - $strings = $_gets['strings']; - // Return - if (isset($_REQUEST['return'])) { - $urlvars = $this->misc->getSubjectParams($_REQUEST['return']); - - $navlinks['back'] = [ - 'attr' => [ - 'href' => [ - 'url' => $urlvars['url'], - 'urlvars' => $urlvars['params'], - ], - ], - 'content' => $this->lang['strback'], - ]; - } - - // Edit SQL link - if ('QUERY' === $type) { - $navlinks['edit'] = [ - 'attr' => [ - 'href' => [ - 'url' => 'database', - 'urlvars' => \array_merge( - $fields, - [ - 'action' => 'sql', - 'paginate' => 'on', - ] - ), - ], - ], - 'content' => $this->lang['streditsql'], - ]; - } - - $navlinks['collapse'] = [ - 'attr' => [ - 'href' => [ - 'url' => 'display', - 'urlvars' => \array_merge( - $_gets, - [ - 'strings' => 'expanded', - 'page' => $page, - ] - ), - ], - ], - 'content' => $this->lang['strexpand'], - ]; - // Expand/Collapse - if ('expanded' === $strings) { - $navlinks['collapse'] = [ - 'attr' => [ - 'href' => [ - 'url' => 'display', - 'urlvars' => \array_merge( - $_gets, - [ - 'strings' => 'collapsed', - 'page' => $page, - ] - ), - ], - ], - 'content' => $this->lang['strcollapse'], - ]; - } - - // Create view and download - if (isset($_REQUEST['query'], $resultset) && \is_object($resultset) && 0 < $resultset->RecordCount()) { - // Report views don't set a schema, so we need to disable create view in that case - if (isset($_REQUEST['schema'])) { - $navlinks['createview'] = [ - 'attr' => [ - 'href' => [ - 'url' => 'views', - 'urlvars' => \array_merge( - $fields, - [ - 'action' => 'create', - 'formDefinition' => $_REQUEST['query'], - ] - ), - ], - ], - 'content' => $this->lang['strcreateview'], - ]; - } - - $urlvars = []; - - $this->setIfIsset($urlvars['search_path'], $_REQUEST['search_path'], null, false); - - $navlinks['download'] = [ - 'attr' => [ - 'href' => [ - 'url' => 'dataexport', - 'urlvars' => \array_merge($fields, $urlvars), - ], - ], - 'content' => $this->lang['strdownload'], - ]; - } - - // Insert - if (isset($object) && (isset($subject) && 'table' === $subject)) { - $navlinks['insert'] = [ - 'attr' => [ - 'href' => [ - 'url' => 'tables', - 'urlvars' => \array_merge( - $fields, - [ - 'action' => 'confinsertrow', - 'table' => $object, - ] - ), - ], - ], - 'content' => $this->lang['strinsert'], - ]; - } - - // Refresh - $navlinks['refresh'] = [ - 'attr' => [ - 'href' => [ - 'url' => 'display', - 'urlvars' => \array_merge( - $_gets, - [ - 'strings' => $strings, - 'page' => $page, - ] - ), - ], - ], - 'content' => $this->lang['strrefresh'], - ]; - - return $navlinks; - } /** * @param array $_gets @@ -493,6 +370,7 @@ class DisplayController extends BaseController */ public function printResultsTable($resultset, $page, $max_pages, array $_gets, $object): void { + if (!\is_object($resultset) || 0 >= $resultset->RecordCount()) { echo \sprintf( '<p>%s</p>', @@ -509,7 +387,6 @@ class DisplayController extends BaseController $fkey_information = $this->getFKInfo(); // Show page navigation $paginator = $this->_printPages($page, $max_pages, $_gets); - echo $paginator; echo '<table id="data">' . \PHP_EOL; echo '<tr>'; @@ -576,18 +453,20 @@ class DisplayController extends BaseController if (!\is_object($resultset) || 0 >= $resultset->RecordCount()) { return; } - +$dttFields=[]; foreach (\array_keys($resultset->fields) as $index => $key) { if (($key === $data->id) && (!($withOid && $this->conf['show_oids']))) { continue; } $finfo = $resultset->FetchField($index); + $dttFields[]=["data"=>$finfo->name]; if (false === $args) { echo '<th class="data">', $this->misc->printVal($finfo->name), '</th>' . \PHP_EOL; continue; } + $args['page'] = $_REQUEST['page']; $args['sortkey'] = $index + 1; // Sort direction opposite to current direction, unless it's currently '' @@ -611,10 +490,37 @@ class DisplayController extends BaseController } echo '</a></th>' . \PHP_EOL; } - - \reset($resultset->fields); + $this->view->offsetSet('dttFields',$dttFields); + \reset($resultset->fields); } +private function FetchField(ADORecordSet $ADORecordSet,int $index):ADOFieldObject { + return $ADORecordSet->FetchField($index); +} + + /** + * Print table rows. + * + * @param ADORecordSet $resultset The resultset + * @param bool $withOid either to display OIDs or not + */ + public function getJsonRowCells(&$resultset, $withOid): array + { + $data = $this->misc->getDatabaseAccessor(); + $j = 0; + + $strings=$this->getRequestParam('string', 'collapsed'); +$result=[]; + foreach ($resultset->fields as $fieldname => $fieldvalue) { + /** @var \ADOFieldObject */ + $finfo =$this->FetchField( $resultset,$j++); + if (($fieldname === $data->id) && (!($withOid && $this->conf['show_oids']))) { + continue; + } + $result[$finfo->name ] =$fieldvalue; + } + return $result; + } /** * Print table rows. * @@ -627,24 +533,25 @@ class DisplayController extends BaseController $data = $this->misc->getDatabaseAccessor(); $j = 0; - $this->coalesceArr($_REQUEST, 'strings', 'collapsed'); + $strings=$this->getRequestParam('string', 'collapsed'); - foreach ($resultset->fields as $k => $v) { - $finfo = $resultset->FetchField($j++); + foreach ($resultset->fields as $fieldName => $fieldValue) { + /** @var \ADOFieldObject */ + $finfo =$this->FetchField( $resultset,$j++); - if (($k === $data->id) && (!($withOid && $this->conf['show_oids']))) { + if (($fieldName === $data->id) && (!($withOid && $this->conf['show_oids']))) { continue; } - $printvalOpts = ['null' => true, 'clip' => ('collapsed' === $_REQUEST['strings'])]; + $printvalOpts = ['null' => true, 'clip' => ('collapsed' === $strings)]; - if (null !== $v && '' === $v) { + if (null !== $fieldValue && '' === $fieldValue) { echo '<td> </td>'; } else { echo '<td style="white-space:nowrap;">'; - - $this->_printFKLinks($resultset, $fkey_information, $k, $v, $printvalOpts); - - $val = $this->misc->printVal($v, $finfo->type, $printvalOpts); + if ((null !== $fieldValue)&& isset($fkey_information['byfield'][$fieldName])) { + $this->_printFKLinks($resultset, $fkey_information, $fieldName, $fieldValue, $printvalOpts); + } + $val = $this->misc->printVal($fieldValue, $finfo->type, $printvalOpts); echo $val; echo '</td>'; @@ -672,7 +579,7 @@ class DisplayController extends BaseController $fksprops = $this->_getFKProps(); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/display" method="post" id="ac_form">' . \PHP_EOL; + echo '<form action="display" method="post" id="ac_form">' . \PHP_EOL; $elements = 0; $error = true; @@ -871,10 +778,174 @@ class DisplayController extends BaseController echo '</p>' . \PHP_EOL; echo '</form>' . \PHP_EOL; - echo '<script src="' . \containerInstance()->subFolder . '/assets/js/insert_or_edit_row.js" type="text/javascript"></script>'; + echo '<script src="assets/js/insert_or_edit_row.js" type="text/javascript"></script>'; } /** + * @param array $_gets + * @param mixed $type + * @param mixed $page + * @param string $subject + * @param mixed $object + * @param mixed $resultset + * + * @return ((array|mixed|string)[][]|mixed)[][] + * + * @psalm-return array{back?: array{attr: array{href: array{url: mixed, urlvars: mixed}}, content: mixed}, edit?: array{attr: array{href: array{url: string, urlvars: array{server: mixed, database: mixed, action: string, paginate: string}}}, content: mixed}, collapse: array{attr: array{href: array{url: string, urlvars: array{strings: string, page: mixed}}}, content: mixed}, createview?: array{attr: array{href: array{url: string, urlvars: array{server: mixed, database: mixed, action: string, formDefinition: mixed}}}, content: mixed}, download?: array{attr: array{href: array{url: string, urlvars: array{server: mixed, database: mixed}}}, content: mixed}, insert?: array{attr: array{href: array{url: string, urlvars: array{server: mixed, database: mixed, action: string, table: mixed}}}, content: mixed}, refresh: array{attr: array{href: array{url: string, urlvars: array{strings: mixed, page: mixed}}}, content: mixed}} + */ + public function getBrowseNavLinks($type, array $_gets, $page, string $subject, $object, $resultset) + { + $fields = [ + 'server' => $_REQUEST['server'], + 'database' => $_REQUEST['database'], + ]; + + $this->setIfIsset($fields['schema'], $_REQUEST['schema'], null, false); + + $navlinks = []; + $strings = $_gets['strings']; + // Return + if (isset($_REQUEST['return'])) { + $urlvars = $this->misc->getSubjectParams($_REQUEST['return']); + + $navlinks['back'] = [ + 'attr' => [ + 'href' => [ + 'url' => $urlvars['url'], + 'urlvars' => $urlvars['params'], + ], + ], + 'content' => $this->lang['strback'], + ]; + } + + // Edit SQL link + if ('QUERY' === $type) { + $navlinks['edit'] = [ + 'attr' => [ + 'href' => [ + 'url' => 'database', + 'urlvars' => \array_merge( + $fields, + [ + 'action' => 'sql', + 'paginate' => 'on', + ] + ), + ], + ], + 'content' => $this->lang['streditsql'], + ]; + } + $navlinks['collapse'] = [ + 'attr' => [ + 'href' => [ + 'url' => 'display', + 'urlvars' => \array_merge( + $_gets, + [ + 'strings' => 'expanded', + 'page' => $page, + ] + ), + ], + ], + 'content' => $this->lang['strexpand'], + ]; + // Expand/Collapse + if ('expanded' === $strings) { + $navlinks['collapse'] = [ + 'attr' => [ + 'href' => [ + 'url' => 'display', + 'urlvars' => \array_merge( + $_gets, + [ + 'strings' => 'collapsed', + 'page' => $page, + ] + ), + ], + ], + 'content' => $this->lang['strcollapse'], + ]; + } + + // Create view and download + if (isset($_REQUEST['query'], $resultset) && \is_object($resultset) && 0 < $resultset->RecordCount()) { + // Report views don't set a schema, so we need to disable create view in that case + if (isset($_REQUEST['schema'])) { + $navlinks['createview'] = [ + 'attr' => [ + 'href' => [ + 'url' => 'views', + 'urlvars' => \array_merge( + $fields, + [ + 'action' => 'create', + 'formDefinition' => $_REQUEST['query'], + ] + ), + ], + ], + 'content' => $this->lang['strcreateview'], + ]; + } + + $urlvars = []; + + $this->setIfIsset($urlvars['search_path'], $_REQUEST['search_path'], null, false); + + $navlinks['download'] = [ + 'attr' => [ + 'href' => [ + 'url' => 'dataexport', + 'urlvars' => \array_merge($fields, $urlvars), + ], + ], + 'content' => $this->lang['strdownload'], + ]; + } + + // Insert + if (isset($object) && (isset($subject) && 'table' === $subject)) { + $navlinks['insert'] = [ + 'attr' => [ + 'href' => [ + 'url' => 'tables', + 'urlvars' => \array_merge( + $fields, + [ + 'action' => 'confinsertrow', + 'table' => $object, + ] + ), + ], + ], + 'content' => $this->lang['strinsert'], + ]; + } + + // Refresh + $navlinks['refresh'] = [ + 'attr' => [ + 'href' => [ + 'url' => 'display', + 'urlvars' => \array_merge( + $_gets, + [ + 'strings' => $strings, + 'page' => $page, + ] + ), + ], + ], + 'content' => $this->lang['strrefresh'], + ]; + + return $navlinks; + } + /** * Performs actual edition of row. */ public function doEditRow() @@ -922,7 +993,7 @@ class DisplayController extends BaseController $resultset = $data->browseRow($_REQUEST['table'], $_REQUEST['key']); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/display" method="post">' . \PHP_EOL; + echo '<form action="display" method="post">' . \PHP_EOL; echo $this->view->form; if (1 === $resultset->RecordCount()) { @@ -1257,16 +1328,16 @@ class DisplayController extends BaseController * @param bool[] $printvalOpts * @param ADORecordSet $resultset * @param array $fkey_information - * @param mixed $k - * @param mixed $v + * @param mixed $fieldName + * @param mixed $fieldValue */ - private function _printFKLinks(ADORecordSet $resultset, array $fkey_information, $k, $v, array &$printvalOpts): void + private function _printFKLinks(ADORecordSet $resultset, array $fkey_information, $fieldName, $fieldValue, array &$printvalOpts): void { - if ((null === $v) || !isset($fkey_information['byfield'][$k])) { + if ((null === $fieldValue) || !isset($fkey_information['byfield'][$fieldName])) { return; } - foreach ($fkey_information['byfield'][$k] as $conid) { + foreach ($fkey_information['byfield'][$fieldName] as $conid) { $query_params = $fkey_information['byconstr'][$conid]['url_data']; foreach ($fkey_information['byconstr'][$conid]['fkeys'] as $p_field => $f_field) { diff --git a/src/controllers/DomainsController.php b/src/controllers/DomainsController.php index a09c0ff8..469789ac 100644 --- a/src/controllers/DomainsController.php +++ b/src/controllers/DomainsController.php @@ -289,7 +289,7 @@ class DomainsController extends BaseController } // Display domain info - echo '<form action="' . \containerInstance()->subFolder . '/src/views/domains" method="post">' . \PHP_EOL; + echo '<form action="domains" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( '<tr><th class="data left required" style="width: 70px">%s</th>', @@ -366,7 +366,7 @@ class DomainsController extends BaseController $this->printTitle($this->lang['straddcheck'], 'pg.constraint.check'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/domains" method="post">' . \PHP_EOL; + echo '<form action="domains" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( '<tr><th class="data">%s</th>', @@ -439,7 +439,7 @@ class DomainsController extends BaseController $this->misc->printVal($_REQUEST['constraint']), $this->misc->printVal($_REQUEST['domain']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/domains" method="post">' . \PHP_EOL; + echo '<form action="domains" method="post">' . \PHP_EOL; echo '<input type="hidden" name="action" value="drop_con" />' . \PHP_EOL; echo '<input type="hidden" name="domain" value="', \htmlspecialchars($_REQUEST['domain']), '" />' . \PHP_EOL; echo '<input type="hidden" name="constraint" value="', \htmlspecialchars($_REQUEST['constraint']), '" />' . \PHP_EOL; @@ -639,7 +639,7 @@ class DomainsController extends BaseController $this->lang['strconfdropdomain'], $this->misc->printVal($_REQUEST['domain']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/domains" method="post">' . \PHP_EOL; + echo '<form action="domains" method="post">' . \PHP_EOL; echo \sprintf( '<p><input type="checkbox" id="cascade" name="cascade" /><label for="cascade">%s</label></p>', $this->lang['strcascade'] @@ -695,7 +695,7 @@ class DomainsController extends BaseController $this->printTitle($this->lang['strcreatedomain'], 'pg.domain.create'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/domains" method="post">' . \PHP_EOL; + echo '<form action="domains" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( '<tr><th class="data left required" style="width: 70px">%s</th>', diff --git a/src/controllers/FulltextController.php b/src/controllers/FulltextController.php index 6e5974aa..758b0df5 100644 --- a/src/controllers/FulltextController.php +++ b/src/controllers/FulltextController.php @@ -322,7 +322,7 @@ class FulltextController extends BaseController $this->misc->printVal($_REQUEST['ftscfg']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/fulltext" method="post">' . \PHP_EOL; + echo '<form action="fulltext" method="post">' . \PHP_EOL; echo \sprintf( '<p><input type="checkbox" id="cascade" name="cascade" /> <label for="cascade">%s</label></p>', $this->lang['strcascade'] @@ -366,7 +366,7 @@ class FulltextController extends BaseController $this->misc->printVal($_REQUEST['ftsdict']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/fulltext" method="post">' . \PHP_EOL; + echo '<form action="fulltext" method="post">' . \PHP_EOL; echo \sprintf( '<p><input type="checkbox" id="cascade" name="cascade" /> <label for="cascade">%s</label></p>', $this->lang['strcascade'] @@ -427,7 +427,7 @@ class FulltextController extends BaseController $this->printTitle($this->lang['strftscreateconfig'], 'pg.ftscfg.create'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/fulltext" method="post">' . \PHP_EOL; + echo '<form action="fulltext" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; // conf name echo \sprintf( @@ -601,7 +601,7 @@ class FulltextController extends BaseController // Fetch all FTS parsers from the database $ftsparsers = $data->getFtsParsers(); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/fulltext" method="post">' . \PHP_EOL; + echo '<form action="fulltext" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo "\t<tr>" . \PHP_EOL; @@ -915,7 +915,7 @@ class FulltextController extends BaseController $this->printTitle($this->lang['strftscreatedict'], 'pg.ftsdict.create'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/fulltext" method="post">' . \PHP_EOL; + echo '<form action="fulltext" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( ' <tr> @@ -1105,7 +1105,7 @@ class FulltextController extends BaseController $this->coalesceArr($_POST, 'formName', $_REQUEST['ftsdict']); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/fulltext" method="post">' . \PHP_EOL; + echo '<form action="fulltext" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo "\t<tr>" . \PHP_EOL; @@ -1195,7 +1195,7 @@ class FulltextController extends BaseController $this->printTrail('ftscfg'); // TODO: proper breadcrumbs $this->printTitle($this->lang['strdrop'], 'pg.ftscfg.alter'); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/fulltext" method="post">' . \PHP_EOL; + echo '<form action="fulltext" method="post">' . \PHP_EOL; // Case of multiaction drop if (isset($_REQUEST['ma'])) { @@ -1272,7 +1272,7 @@ class FulltextController extends BaseController $this->coalesceArr($_POST, 'ftscfg', $_REQUEST['ftscfg']); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/fulltext" method="post">' . \PHP_EOL; + echo '<form action="fulltext" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo "\t<tr>" . \PHP_EOL; @@ -1396,7 +1396,7 @@ class FulltextController extends BaseController $mappings = $data->getFtsMappings($_POST['ftscfg']); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/fulltext" method="post">' . \PHP_EOL; + echo '<form action="fulltext" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo "\t<tr>" . \PHP_EOL; echo \sprintf( diff --git a/src/controllers/FunctionsController.php b/src/controllers/FunctionsController.php index 64abe050..fea69aa8 100644 --- a/src/controllers/FunctionsController.php +++ b/src/controllers/FunctionsController.php @@ -66,8 +66,8 @@ class FunctionsController extends BaseController break; case 'edit': - $header_template = 'header_sqledit.twig'; - $footer_template = 'footer_sqledit.twig'; + $this->view->offsetSet('codemirror',true); + $this->doEdit(); break; @@ -119,9 +119,7 @@ class FunctionsController extends BaseController 'title' => $this->lang['strfunction'], 'field' => Decorator::field('proproto'), 'url'=>containerInstance()->getDestinationWithLastTab('function'), - '/redirect/function?action=properties&%s&', - $this->misc->href - ), + 'vars' => ['function' => 'proproto', 'function_oid' => 'prooid'], ], 'returns' => [ @@ -339,7 +337,7 @@ class FunctionsController extends BaseController $args = $fndata->fields['proarguments']; } - echo '<form action="' . \containerInstance()->subFolder . '/src/views/functions" method="post">' . \PHP_EOL; + echo '<form action="functions" method="post">' . \PHP_EOL; echo '<table style="width: 95%">' . \PHP_EOL; echo '<tr>' . \PHP_EOL; echo \sprintf( @@ -803,7 +801,7 @@ class FunctionsController extends BaseController $this->printTabs('function', 'definition'); $this->printTitle($this->lang['strdrop'], 'pg.function.drop'); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/functions" method="post">' . \PHP_EOL; + echo '<form action="functions" method="post">' . \PHP_EOL; //If multi drop if (isset($_REQUEST['ma'])) { @@ -1128,7 +1126,7 @@ class FunctionsController extends BaseController //]]> </script> "; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/functions" method="post">' . \PHP_EOL; + echo '<form action="functions" method="post">' . \PHP_EOL; echo '<table><tbody id="args_table">' . \PHP_EOL; echo \sprintf( '<tr><th class="data required">%s</th>', @@ -1282,7 +1280,7 @@ class FunctionsController extends BaseController $szJS = ''; - echo '<script src="' . \containerInstance()->subFolder . '/assets/js/functions.js" type="text/javascript"></script>'; + echo '<script src="assets/js/functions.js" type="text/javascript"></script>'; echo '<script type="text/javascript">' . $this->_buildJSData() . '</script>'; if (!empty($_POST['formArgName'])) { diff --git a/src/controllers/GroupsController.php b/src/controllers/GroupsController.php index 9509117a..1a0a6966 100644 --- a/src/controllers/GroupsController.php +++ b/src/controllers/GroupsController.php @@ -187,7 +187,7 @@ class GroupsController extends BaseController $this->misc->printVal($_REQUEST['group']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/groups" method="post">' . \PHP_EOL; + echo '<form action="groups" method="post">' . \PHP_EOL; echo $this->view->form; echo '<input type="hidden" name="action" value="drop_member" />' . \PHP_EOL; echo '<input type="hidden" name="group" value="', \htmlspecialchars($_REQUEST['group']), '" />' . \PHP_EOL; @@ -261,7 +261,7 @@ class GroupsController extends BaseController } // Display form for adding a user to the group - echo '<form action="' . \containerInstance()->subFolder . '/src/views/groups" method="post">' . \PHP_EOL; + echo '<form action="groups" method="post">' . \PHP_EOL; echo '<select name="user">'; while (!$users->EOF) { @@ -317,7 +317,7 @@ class GroupsController extends BaseController $this->misc->printVal($_REQUEST['group']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/groups" method="post">' . \PHP_EOL; + echo '<form action="groups" method="post">' . \PHP_EOL; echo $this->view->form; echo '<input type="hidden" name="action" value="drop" />' . \PHP_EOL; echo '<input type="hidden" name="group" value="', \htmlspecialchars($_REQUEST['group']), '" />' . \PHP_EOL; diff --git a/src/controllers/HistoryController.php b/src/controllers/HistoryController.php index c614b160..3f66a288 100644 --- a/src/controllers/HistoryController.php +++ b/src/controllers/HistoryController.php @@ -64,6 +64,8 @@ class HistoryController extends BaseController // Set the name of the window $this->setWindowName('history'); + $this->view->offsetSet('excludeJsTree',true); + $this->view->offsetSet('inPopUp',true); return $this->printFooter(true, 'footer_sqledit.twig'); } @@ -77,7 +79,7 @@ class HistoryController extends BaseController // Bring to the front always echo '<body onload="window.focus();">' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/history" method="post">' . \PHP_EOL; + echo '<form action="history" method="post">' . \PHP_EOL; $this->printConnection('history'); echo '</form><br />'; @@ -213,7 +215,7 @@ class HistoryController extends BaseController ) . \PHP_EOL; echo '<pre>', \htmlentities($_SESSION['history'][$_REQUEST['server']][$_REQUEST['database']][$qid]['query'], \ENT_QUOTES, 'UTF-8'), '</pre>'; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/history" method="post">' . \PHP_EOL; + echo '<form action="history" method="post">' . \PHP_EOL; echo '<input type="hidden" name="action" value="delhistory" />' . \PHP_EOL; echo \sprintf( '<input type="hidden" name="queryid" value="%s" />', @@ -251,7 +253,7 @@ class HistoryController extends BaseController $this->lang['strconfclearhistory'] ) . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/history" method="post">' . \PHP_EOL; + echo '<form action="history" method="post">' . \PHP_EOL; echo '<input type="hidden" name="action" value="clearhistory" />' . \PHP_EOL; echo $this->view->form; echo \sprintf( diff --git a/src/controllers/IndexesController.php b/src/controllers/IndexesController.php index f8eb64b9..96d76522 100644 --- a/src/controllers/IndexesController.php +++ b/src/controllers/IndexesController.php @@ -29,7 +29,7 @@ class IndexesController extends BaseController if ('tree' === $this->action) { return $this->doTree(); } - $this->scripts = '<script src="' . \containerInstance()->subFolder . '/assets/js/indexes.js" type="text/javascript"></script>'; + $this->scripts = '<script src="assets/js/indexes.js" type="text/javascript"></script>'; $this->printHeader($this->headerTitle(), $this->scripts); $onloadInit = false; @@ -278,7 +278,7 @@ class IndexesController extends BaseController $this->misc->printVal($_REQUEST['index']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/indexes" method="post">' . \PHP_EOL; + echo '<form action="indexes" method="post">' . \PHP_EOL; echo '<p><input type="checkbox" id="analyze" name="analyze"', (isset($_REQUEST['analyze']) ? ' checked="checked"' : ''), ' />'; echo \sprintf( '<label for="analyze">%s</label></p>', @@ -550,7 +550,7 @@ class IndexesController extends BaseController $this->lang['strconfdropindex'], $this->misc->printVal($this->getRequestParam('index')) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/indexes" method="post">' . \PHP_EOL; + echo '<form action="indexes" method="post">' . \PHP_EOL; echo '<input type="hidden" name="action" value="drop_index" />' . \PHP_EOL; echo '<input type="hidden" name="table" value="', \htmlspecialchars($object), '" />' . \PHP_EOL; echo '<input type="hidden" name="index" value="', \htmlspecialchars($this->getRequestParam('index')), '" />' . \PHP_EOL; diff --git a/src/controllers/LoginController.php b/src/controllers/LoginController.php index 5a7c97a1..de9f8ec6 100644 --- a/src/controllers/LoginController.php +++ b/src/controllers/LoginController.php @@ -99,7 +99,7 @@ class LoginController extends BaseController $login_html .= $this->printMsg($msg, false); } - $login_html .= '<p class="clearfix"> </p><p><form id="login_form" method="post" name="login_form" action="' . \containerInstance()->subFolder . '/login?server=' . \htmlspecialchars($server_id) . '"></p>'; + $login_html .= '<p class="clearfix"> </p><p><form id="login_form" method="post" name="login_form" action="login?server=' . \htmlspecialchars($server_id) . '"></p>'; $md5_server = \md5($server_id); // Pass request vars through form (is this a security risk???) diff --git a/src/controllers/MaterializedviewpropertiesController.php b/src/controllers/MaterializedviewpropertiesController.php index 712a33c7..c0cb17eb 100644 --- a/src/controllers/MaterializedviewpropertiesController.php +++ b/src/controllers/MaterializedviewpropertiesController.php @@ -153,7 +153,7 @@ class MaterializedviewpropertiesController extends BaseController $_POST['formComment'] = $viewdata->fields['relcomment']; } - echo '<form action="' . \containerInstance()->subFolder . '/src/views/materializedviewproperties" method="post">' . \PHP_EOL; + echo '<form action="materializedviewproperties" method="post">' . \PHP_EOL; echo '<table style="width: 100%">' . \PHP_EOL; echo \sprintf( ' <tr> @@ -208,7 +208,7 @@ class MaterializedviewpropertiesController extends BaseController $this->printTitle($this->lang['stralter'], 'pg.column.alter'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/materializedviewproperties" method="post">' . \PHP_EOL; + echo '<form action="materializedviewproperties" method="post">' . \PHP_EOL; // Output matview header echo '<table>' . \PHP_EOL; @@ -324,7 +324,7 @@ class MaterializedviewpropertiesController extends BaseController $this->coalesceArr($_POST, 'comment', $matview->fields['relcomment']); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/materializedviewproperties" method="post">' . \PHP_EOL; + echo '<form action="materializedviewproperties" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( '<tr><th class="data left required">%s</th>', diff --git a/src/controllers/MaterializedviewsController.php b/src/controllers/MaterializedviewsController.php index 5930a557..8831d6d1 100644 --- a/src/controllers/MaterializedviewsController.php +++ b/src/controllers/MaterializedviewsController.php @@ -126,9 +126,7 @@ class MaterializedviewsController extends BaseController 'title' => 'M ' . $this->lang['strview'], 'field' => Decorator::field('relname'), 'url' => \containerInstance()->getDestinationWithLastTab('matview'), - '/redirect/matview?%s&', - $this->misc->href - ), + 'vars' => [$this->keystring => 'relname'], ], 'owner' => [ @@ -287,7 +285,7 @@ class MaterializedviewsController extends BaseController $this->printTrail('getTrail'); $this->printTitle($this->lang['strdrop'], 'pg.matview.drop'); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/materializedviews" method="post">' . \PHP_EOL; + echo '<form action="materializedviews" method="post">' . \PHP_EOL; //If multi drop if (isset($_REQUEST['ma'])) { diff --git a/src/controllers/OperatorsController.php b/src/controllers/OperatorsController.php index c3d33cba..5f3c0a63 100644 --- a/src/controllers/OperatorsController.php +++ b/src/controllers/OperatorsController.php @@ -306,7 +306,7 @@ class OperatorsController extends BaseController $this->misc->printVal($_REQUEST['operator']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/operators" method="post">' . \PHP_EOL; + echo '<form action="operators" method="post">' . \PHP_EOL; echo \sprintf( '<p><input type="checkbox" id="cascade" name="cascade" /> <label for="cascade">%s</label></p>', $this->lang['strcascade'] diff --git a/src/controllers/PrivilegesController.php b/src/controllers/PrivilegesController.php index 5413966c..76bc24b4 100644 --- a/src/controllers/PrivilegesController.php +++ b/src/controllers/PrivilegesController.php @@ -348,7 +348,7 @@ class PrivilegesController extends BaseController $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/privileges" method="post">' . \PHP_EOL; + echo '<form action="privileges" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( '<tr><th class="data left">%s</th>', diff --git a/src/controllers/RolesController.php b/src/controllers/RolesController.php index 8b3809a1..6d236e7e 100644 --- a/src/controllers/RolesController.php +++ b/src/controllers/RolesController.php @@ -118,9 +118,7 @@ class RolesController extends BaseController 'title' => $this->lang['strrole'], 'field' => Decorator::field('rolname'), 'url' => \containerInstance()->getDestinationWithLastTab('role'), - '/redirect/role?action=properties&%s&', - $this->misc->href - ), + 'vars' => ['rolename' => 'rolname'], ], 'group' => [ @@ -244,7 +242,7 @@ class RolesController extends BaseController $this->printTitle($this->lang['strcreaterole'], 'pg.role.create'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/roles" method="post">' . \PHP_EOL; + echo '<form action="roles" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( ' <tr> @@ -471,7 +469,7 @@ class RolesController extends BaseController $this->_adjustPostVars($roledata, $canRename); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/roles" method="post">' . \PHP_EOL; + echo '<form action="roles" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( ' <tr> @@ -687,7 +685,7 @@ class RolesController extends BaseController $this->misc->printVal($_REQUEST['rolename']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/roles" method="post">' . \PHP_EOL; + echo '<form action="roles" method="post">' . \PHP_EOL; echo '<p><input type="hidden" name="action" value="drop" />' . \PHP_EOL; echo '<input type="hidden" name="rolename" value="', \htmlspecialchars($_REQUEST['rolename']), '" />' . \PHP_EOL; echo $this->view->form; @@ -1000,7 +998,7 @@ class RolesController extends BaseController $this->coalesceArr($_POST, 'confirm', ''); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/roles" method="post">' . \PHP_EOL; + echo '<form action="roles" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( ' <tr> diff --git a/src/controllers/RulesController.php b/src/controllers/RulesController.php index 33b1ddf2..195663cf 100644 --- a/src/controllers/RulesController.php +++ b/src/controllers/RulesController.php @@ -173,7 +173,7 @@ class RulesController extends BaseController $this->printTitle($this->lang['strcreaterule'], 'pg.rule.create'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/rules" method="post">' . \PHP_EOL; + echo '<form action="rules" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( '<tr><th class="data left required">%s</th>', @@ -282,7 +282,7 @@ class RulesController extends BaseController $this->misc->printVal($_REQUEST[$_REQUEST['reltype']]) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/rules" method="post">' . \PHP_EOL; + echo '<form action="rules" method="post">' . \PHP_EOL; echo '<input type="hidden" name="action" value="drop" />' . \PHP_EOL; echo '<input type="hidden" name="subject" value="', \htmlspecialchars($_REQUEST['reltype']), '" />' . \PHP_EOL; echo '<input type="hidden" name="', \htmlspecialchars($_REQUEST['reltype']), diff --git a/src/controllers/SchemasController.php b/src/controllers/SchemasController.php index 6d62e897..58a9df75 100644 --- a/src/controllers/SchemasController.php +++ b/src/controllers/SchemasController.php @@ -116,11 +116,16 @@ class SchemasController extends BaseController 'owner' => [ 'title' => $this->lang['strowner'], 'field' => Decorator::field('nspowner'), - ], - 'schema_size' => [ + ]]; + if(boolval($this->conf['display_sizes']['schemas']??false)===true) { + + + $columns['schema_size'] = [ 'title' => $this->lang['strsize'], 'field' => Decorator::field('schema_size'), - ], + ]; + } + $columns=array_merge($columns,[ 'actions' => [ 'title' => $this->lang['stractions'], ], @@ -128,7 +133,7 @@ class SchemasController extends BaseController 'title' => $this->lang['strcomment'], 'field' => Decorator::field('nspcomment'), ], - ]; + ]); $actions = [ 'multiactions' => [ @@ -289,7 +294,7 @@ class SchemasController extends BaseController $this->printTitle($this->lang['strcreateschema'], 'pg.schema.create'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/schemas" method="post">' . \PHP_EOL; + echo '<form action="schemas" method="post">' . \PHP_EOL; echo '<table style="width: 100%">' . \PHP_EOL; echo \sprintf( ' <tr> @@ -314,8 +319,7 @@ class SchemasController extends BaseController echo \sprintf( ' <option value="%s"', $uname - ), - ($uname === $_POST['formAuth']) ? ' selected="selected"' : '', \sprintf( + ), ($uname === $_POST['formAuth']) ? ' selected="selected"' : '', \sprintf( '>%s</option>', $uname ) . \PHP_EOL; @@ -394,7 +398,7 @@ class SchemasController extends BaseController $this->coalesceArr($_POST, 'owner', $schema->fields['ownername']); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/schemas" method="post">' . \PHP_EOL; + echo '<form action="schemas" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo "\t<tr>" . \PHP_EOL; @@ -421,8 +425,7 @@ class SchemasController extends BaseController while (!$users->EOF) { $uname = $users->fields['usename']; - echo '<option value="', \htmlspecialchars($uname), '"', - ($uname === $_POST['owner']) ? ' selected="selected"' : '', '>', \htmlspecialchars($uname), '</option>' . \PHP_EOL; + echo '<option value="', \htmlspecialchars($uname), '"', ($uname === $_POST['owner']) ? ' selected="selected"' : '', '>', \htmlspecialchars($uname), '</option>' . \PHP_EOL; $users->MoveNext(); } echo '</select></td></tr>' . \PHP_EOL; @@ -498,7 +501,7 @@ class SchemasController extends BaseController $this->printTrail('schema'); $this->printTitle($this->lang['strdrop'], 'pg.schema.drop'); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/schemas" method="post">' . \PHP_EOL; + echo '<form action="schemas" method="post">' . \PHP_EOL; //If multi drop if (isset($_REQUEST['ma'])) { foreach ($_REQUEST['ma'] as $v) { diff --git a/src/controllers/SequencesController.php b/src/controllers/SequencesController.php index 1c114739..0bca0fab 100644 --- a/src/controllers/SequencesController.php +++ b/src/controllers/SequencesController.php @@ -438,7 +438,7 @@ class SequencesController extends BaseController $this->printTitle($this->lang['strdrop'], 'pg.sequence.drop'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/sequences" method="post">' . \PHP_EOL; + echo '<form action="sequences" method="post">' . \PHP_EOL; //If multi drop if (isset($_REQUEST['ma'])) { @@ -548,7 +548,7 @@ class SequencesController extends BaseController $this->printTitle($this->lang['strcreatesequence'], 'pg.sequence.create'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/sequences" method="post">' . \PHP_EOL; + echo '<form action="sequences" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( @@ -735,7 +735,7 @@ class SequencesController extends BaseController $sequence = $data->getSequence($_REQUEST['sequence']); if (\is_object($sequence) && 0 < $sequence->RecordCount()) { - echo '<form action="' . \containerInstance()->subFolder . '/src/views/sequences" method="post">' . \PHP_EOL; + echo '<form action="sequences" method="post">' . \PHP_EOL; echo '<table border="0">'; echo \sprintf( '<tr><th class="data left required">%s</th>', @@ -861,7 +861,7 @@ class SequencesController extends BaseController $_POST['formCycledValue'] = 'on'; } - echo '<form action="' . \containerInstance()->subFolder . '/src/views/sequences" method="post">' . \PHP_EOL; + echo '<form action="sequences" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( diff --git a/src/controllers/SqlController.php b/src/controllers/SqlController.php index 49750a26..b36adb04 100644 --- a/src/controllers/SqlController.php +++ b/src/controllers/SqlController.php @@ -7,6 +7,7 @@ namespace PHPPgAdmin\Controller; use ADORecordSet; +use Kint\Kint; use PHPPgAdmin\ADOdbException; /** @@ -56,7 +57,7 @@ class SqlController extends BaseController if (isset($_REQUEST['subject'])) { $this->subject = $_REQUEST['subject']; } - + // Check to see if pagination has been specified. In that case, send to display // script for pagination // if a file is given or the request is an explain, do not paginate @@ -64,33 +65,47 @@ class SqlController extends BaseController !(isset($_FILES['script']) && 0 < $_FILES['script']['size']) && (0 === \preg_match('/^\s*explain/i', $this->query))) { //if (!(isset($_FILES['script']) && $_FILES['script']['size'] > 0)) { - + $display_controller = new DisplayController($this->getContainer()); - + return $display_controller->render(); } + + $this->view->offsetSet('codemirror',true); - $this->printHeader($this->headerTitle(), null, true, 'header_sqledit.twig'); - $this->printBody(); - $this->printTrail('database'); - $this->printTitle($this->lang['strqueryresults']); - + + // Set the schema search path if (isset($_REQUEST['search_path'])) { if (0 !== $data->setSearchPath(\array_map('trim', \explode(',', $_REQUEST['search_path'])))) { + $this->printHeader($this->headerTitle(), null, true ); + $body=$this->printBody(false); + $trail=$this->printTrail('database',false); + $title=$this->printTitle($this->lang['strqueryresults'],null,false); + echo $body.$trail.$title; return $this->printFooter(); } } + // May as well try to time the query if (\function_exists('microtime')) { [$usec, $sec] = \explode(' ', \microtime()); $this->start_time = ((float) $usec + (float) $sec); - } - + $this->view->offsetSet('serverSide',1); + $header= $this->printHeader($this->headerTitle(), null, true ); + $body=$this->printBody(false); + $trail=$this->printTrail('database',false); + $title=$this->printTitle($this->lang['strqueryresults'],null,false); + echo $body.$trail.$title; + $rs = $this->doDefault(); - - $this->doFooter(true, 'footer_sqledit.twig', $rs); + + + } + echo $body.$trail.$title; + // echo $body.$trail.$title; + $this->doFooter(true, 'footer_sqledit.twig', $rs); } public function doDefault() @@ -98,10 +113,7 @@ class SqlController extends BaseController $_connection = $this->misc->getConnection(); try { - // Execute the query. If it's a script upload, special handling is necessary - if (isset($_FILES['script']) && 0 < $_FILES['script']['size']) { - return $this->execute_script(); - } + return $this->execute_query(); } catch (ADOdbException $e) { @@ -119,12 +131,13 @@ class SqlController extends BaseController $data = $this->misc->getDatabaseAccessor(); $_connection = $this->misc->getConnection(); $lang = $this->lang; + $json=[]; /** * This is a callback function to display the result of each separate query. * * @param ADORecordSet $rs The recordset returned by the script execetor */ - $sqlCallback = static function ($query, $rs, $lineno) use ($data, $misc, $lang, $_connection): void { + $sqlCallback = static function ($query, $rs, $lineno) use ($data, $misc, $lang, $_connection,&$json): void { // Check if $rs is false, if so then there was a fatal error if (false === $rs) { echo \htmlspecialchars($_FILES['script']['name']), ':', $lineno, ': ', \nl2br(\htmlspecialchars($_connection->getLastError())), '<br/>' . \PHP_EOL; @@ -136,8 +149,8 @@ class SqlController extends BaseController $num_fields = \pg_numfields($rs); echo "<p><table>\n<tr>"; - for ($k = 0; $k < $num_fields; ++$k) { - echo '<th class="data">', $misc->printVal(\pg_fieldname($rs, $k)), '</th>'; + for ($fieldIndex = 0; $fieldIndex < $num_fields; ++$fieldIndex) { + echo '<th class="data">', $misc->printVal(\pg_fieldname($rs, $fieldIndex)), '</th>'; } $i = 0; @@ -150,11 +163,12 @@ class SqlController extends BaseController $id ) . \PHP_EOL; - foreach ($row as $k => $v) { - echo '<td style="white-space:nowrap;">', $misc->printVal($v, \pg_fieldtype($rs, $k), ['null' => true]), '</td>'; + foreach ($row as $fieldIndex => $v) { + echo '<td style="white-space:nowrap;">', $misc->printVal($v, \pg_fieldtype($rs, $fieldIndex), ['null' => true]), '</td>'; } echo '</tr>' . \PHP_EOL; $row = \pg_fetch_row($rs); + ++$i; } @@ -186,8 +200,9 @@ class SqlController extends BaseController } } }; + $final= $data->executeScript('script', $sqlCallback); - return $data->executeScript('script', $sqlCallback); + return $final; } /** @@ -205,7 +220,7 @@ class SqlController extends BaseController * @var ADORecordSet */ $rs = $data->conn->Execute($this->query); - + echo '<form method="post" id="sqlform" action="' . $_SERVER['REQUEST_URI'] . '">'; echo '<textarea width="90%" name="query" id="query" rows="5" cols="100" resizable="true">'; @@ -213,7 +228,7 @@ class SqlController extends BaseController echo '</textarea><br>'; echo $this->view->setForm(); echo '<input type="submit"/></form>'; - +$json=[]; // $rs will only be an object if there is no error if (\is_object($rs)) { // Request was run, saving it in history @@ -227,28 +242,37 @@ class SqlController extends BaseController if (0 < $rs->RecordCount()) { echo "<table>\n<tr>"; - foreach ($rs->fields as $k => $v) { - $finfo = $rs->FetchField($k); + foreach ($rs->fields as $fieldName => $fieldValue) { + $finfo = $rs->FetchField($fieldName); echo '<th class="data">', $this->misc->printVal($finfo->name), '</th>'; } echo '</tr>' . \PHP_EOL; $i = 0; - +$res=''; while (!$rs->EOF) { $id = (0 === ($i % 2) ? '1' : '2'); - echo \sprintf( + $res.= \sprintf( '<tr class="data%s">', $id ) . \PHP_EOL; - foreach ($rs->fields as $k => $v) { - $finfo = $rs->FetchField($k); - echo '<td style="white-space:nowrap;">', $this->misc->printVal($v, $finfo->type, ['null' => true]), '</td>'; + $json[$i]=[]; + foreach ($rs->fields as $fieldName => $fieldValue) { + $finfo = $rs->FetchField($fieldName); + $parsedValue=$this->misc->printVal($fieldValue, $finfo->type, ['null' => true]); + + $json[$i][$fieldName]=$parsedValue; + $res.= '<td style="white-space:nowrap;">'; + $res.= $parsedValue; + $res.= '</td>'; } - echo '</tr>' . \PHP_EOL; + $res.= '</tr>' . \PHP_EOL; $rs->MoveNext(); ++$i; + } + + echo $res; echo '</table>' . \PHP_EOL; echo '<p>', $rs->RecordCount(), \sprintf( ' %s</p>', @@ -264,7 +288,7 @@ class SqlController extends BaseController // Otherwise nodata to print echo '<p>', $this->lang['strnodata'], '</p>' . \PHP_EOL; } - + return $rs; } } diff --git a/src/controllers/SqleditController.php b/src/controllers/SqleditController.php index 19811178..03c79ef6 100644 --- a/src/controllers/SqleditController.php +++ b/src/controllers/SqleditController.php @@ -45,6 +45,9 @@ class SqleditController extends BaseController $this->setWindowName('sqledit'); $this->scripts = '<script type="text/javascript">window.inPopUp=true;</script>'; + $this->view->offsetSet('excludeJsTree',true); + $this->view->offsetSet('inPopUp',true); + $this->view->offsetSet('codemirror',true); $header=$this->printHeader($title, $this->scripts, false, 'header_sqledit.twig'); echo $header; @@ -70,21 +73,21 @@ class SqleditController extends BaseController } $this->coalesceArr($_REQUEST, 'search_path', \implode(',', $data->getSearchPath())); - $search_path = \htmlspecialchars($_REQUEST['search_path']); $sqlquery = \htmlspecialchars($_SESSION['sqlquery']); - + $default_html = $this->printTabs('popup', 'sql', false); - - $default_html .= '<form action="' . \containerInstance()->subFolder . '/sql" method="post" enctype="multipart/form-data" class="sqlform" id="sqlform" target="parent">'; + + $default_html .= '<form action="' . \containerInstance()->subFolder . '/sql" method="post" enctype="multipart/form-data" class="sqlform" id="sqlform" target="opener">'; $default_html .= \PHP_EOL; $default_html .= $this->printConnection('sql', false); - + $default_html .= \PHP_EOL; - + $default_html .= ' <div class="searchpath">'; $default_html .= '<label>'; $default_html .= $this->view->printHelp($this->lang['strsearchpath'], 'pg.schema.search_path', false); - + + $search_path = \htmlspecialchars($_REQUEST['search_path']); $default_html .= ': <input type="text" name="search_path" id="search_path" size="45" value="' . $search_path . '" />'; $default_html .= '</label>' . \PHP_EOL; @@ -151,7 +154,7 @@ class SqleditController extends BaseController $default_html = $this->printTabs('popup', 'find', false); - $default_html .= '<form action="database" method="post" target="detail">' . \PHP_EOL; + $default_html .= '<form action="database" method="post" target="opener">' . \PHP_EOL; $default_html .= $this->printConnection('find', false); $default_html .= '<p><input class="focusme" name="term" id="term" value="' . \htmlspecialchars($_REQUEST['term']) . \sprintf( '" size="32" maxlength="%s" />', diff --git a/src/controllers/TablesController.php b/src/controllers/TablesController.php index fa4aef47..c3f31584 100644 --- a/src/controllers/TablesController.php +++ b/src/controllers/TablesController.php @@ -158,6 +158,10 @@ class TablesController extends BaseController $columns = $this->_getColumns(); + if(boolval($this->conf['display_sizes']['tables']??false)===false) { + unset($columns['table_size']); + } + $actions = $this->_getActions(); echo $this->printTable($tables, $columns, $actions, $this->table_place, $this->lang['strnotables']); @@ -322,7 +326,7 @@ class TablesController extends BaseController $this->printTitle($this->lang['strcreatetable'], 'pg.table.create'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/' . $this->script . '" method="post">'; + echo '<form action="' . $this->script . '" method="post">'; echo \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( @@ -334,8 +338,8 @@ class TablesController extends BaseController ' <td class="data"><input name="name" size="32" maxlength="%s" value="', $data->_maxNameLen ), - \htmlspecialchars($_REQUEST['name']), - "\" /></td>\n\t</tr>" . \PHP_EOL; + \htmlspecialchars($_REQUEST['name']), + "\" /></td>\n\t</tr>" . \PHP_EOL; echo \sprintf( ' <tr> <th class="data left required">%s</th>', @@ -345,8 +349,8 @@ class TablesController extends BaseController ' <td class="data"><input name="fields" size="5" maxlength="%s" value="', $data->_maxNameLen ), - \htmlspecialchars($_REQUEST['fields']), - "\" /></td>\n\t</tr>" . \PHP_EOL; + \htmlspecialchars($_REQUEST['fields']), + "\" /></td>\n\t</tr>" . \PHP_EOL; echo \sprintf( ' <tr> <th class="data left">%s</th>', @@ -363,21 +367,19 @@ class TablesController extends BaseController ) . \PHP_EOL; echo "\t\t<td class=\"data1\">\n\t\t\t<select name=\"spcname\">" . \PHP_EOL; // Always offer the default (empty) option - echo "\t\t\t\t<option value=\"\"", - ('' === $_REQUEST['spcname']) ? ' selected="selected"' : '', - '></option>' . \PHP_EOL; + echo "\t\t\t\t<option value=\"\"", ('' === $_REQUEST['spcname']) ? ' selected="selected"' : '', + '></option>' . \PHP_EOL; // Display all other tablespaces while (!$tablespaces->EOF) { $spcname = \htmlspecialchars($tablespaces->fields['spcname']); echo \sprintf( ' <option value="%s"', $spcname - ), - ($tablespaces->fields['spcname'] === $_REQUEST['spcname']) ? ' selected="selected"' : '', - \sprintf( - '>%s</option>', - $spcname - ) . \PHP_EOL; + ), ($tablespaces->fields['spcname'] === $_REQUEST['spcname']) ? ' selected="selected"' : '', + \sprintf( + '>%s</option>', + $spcname + ) . \PHP_EOL; $tablespaces->MoveNext(); } echo "\t\t\t</select>\n\t\t</td>\n\t</tr>" . \PHP_EOL; @@ -389,8 +391,8 @@ class TablesController extends BaseController $this->lang['strcomment'] ) . \PHP_EOL; echo "\t\t<td><textarea name=\"tblcomment\" rows=\"3\" cols=\"32\">", - \htmlspecialchars($_REQUEST['tblcomment']), - "</textarea></td>\n\t</tr>" . \PHP_EOL; + \htmlspecialchars($_REQUEST['tblcomment']), + "</textarea></td>\n\t</tr>" . \PHP_EOL; echo '</table>' . \PHP_EOL; echo '<p><input type="hidden" name="action" value="create" />' . \PHP_EOL; @@ -433,8 +435,8 @@ class TablesController extends BaseController $this->printTitle($this->lang['strcreatetable'], 'pg.table.create'); $this->printMsg($msg); - echo '<script src="' . \containerInstance()->subFolder . '/assets/js/tables.js" type="text/javascript"></script>'; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/tables" method="post">' . \PHP_EOL; + echo '<script src="assets/js/tables.js" type="text/javascript"></script>'; + echo '<form action="tables" method="post">' . \PHP_EOL; // Output table header echo '<table>' . \PHP_EOL; @@ -482,8 +484,8 @@ class TablesController extends BaseController $i, $data->_maxNameLen ), - \htmlspecialchars($_REQUEST['field'][$i]), - '" /></td>' . \PHP_EOL; + \htmlspecialchars($_REQUEST['field'][$i]), + '" /></td>' . \PHP_EOL; echo \sprintf( ' <td> <select name="type[%s]" class="select2" id="types%s" onchange="checkLengths(this.options[this.selectedIndex].value,%s);">', @@ -494,22 +496,20 @@ class TablesController extends BaseController // Output any "magic" types foreach ($data->extraTypes as $v) { $types_for_js[\mb_strtolower($v)] = 1; - echo "\t\t\t\t<option value=\"", \htmlspecialchars($v), '"', - (isset($_REQUEST['type'][$i]) && $_REQUEST['type'][$i] === $v) ? ' selected="selected"' : '', - '>', - $this->misc->printVal($v), - '</option>' . \PHP_EOL; + echo "\t\t\t\t<option value=\"", \htmlspecialchars($v), '"', (isset($_REQUEST['type'][$i]) && $_REQUEST['type'][$i] === $v) ? ' selected="selected"' : '', + '>', + $this->misc->printVal($v), + '</option>' . \PHP_EOL; } $types->moveFirst(); while (!$types->EOF) { $typname = $types->fields['typname']; $types_for_js[$typname] = 1; - echo "\t\t\t\t<option value=\"", \htmlspecialchars($typname), '"', - (isset($_REQUEST['type'][$i]) && $_REQUEST['type'][$i] === $typname) ? ' selected="selected"' : '', - '>', - $this->misc->printVal($typname), - '</option>' . \PHP_EOL; + echo "\t\t\t\t<option value=\"", \htmlspecialchars($typname), '"', (isset($_REQUEST['type'][$i]) && $_REQUEST['type'][$i] === $typname) ? ' selected="selected"' : '', + '>', + $this->misc->printVal($typname), + '</option>' . \PHP_EOL; $types->MoveNext(); } echo "\t\t\t</select>\n\t\t\n"; @@ -543,8 +543,8 @@ class TablesController extends BaseController $i, $i ), - \htmlspecialchars($_REQUEST['length'][$i]), - '" /></td>' . \PHP_EOL; + \htmlspecialchars($_REQUEST['length'][$i]), + '" /></td>' . \PHP_EOL; echo \sprintf( ' <td><input type="checkbox" name="notnull[%s]"', $i @@ -564,21 +564,21 @@ class TablesController extends BaseController ' <td><input name="default[%s]" size="20" value="', $i ), - \htmlspecialchars($_REQUEST['default'][$i]), - '" /></td>' . \PHP_EOL; + \htmlspecialchars($_REQUEST['default'][$i]), + '" /></td>' . \PHP_EOL; echo \sprintf( ' <td><input name="colcomment[%s]" size="40" value="', $i ), - \htmlspecialchars($_REQUEST['colcomment'][$i]), - \sprintf( - '" /> + \htmlspecialchars($_REQUEST['colcomment'][$i]), + \sprintf( + '" /> <script type="text/javascript">checkLengths(document.getElementById(\'types%s\').value,%s);</script> </td> </tr>', - $i, - $i - ) . \PHP_EOL; + $i, + $i + ) . \PHP_EOL; } echo '</table>' . \PHP_EOL; echo '<p><input type="hidden" name="action" value="create" />' . \PHP_EOL; @@ -735,7 +735,7 @@ class TablesController extends BaseController unset($tbltmp); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/tables" method="post">' . \PHP_EOL; + echo '<form action="tables" method="post">' . \PHP_EOL; echo \sprintf( '<table> <tr> @@ -783,28 +783,28 @@ class TablesController extends BaseController $this->lang['stroptions'] ); echo '<label for="withdefaults"><input type="checkbox" id="withdefaults" name="withdefaults"', - isset($_REQUEST['withdefaults']) ? ' checked="checked"' : '', - \sprintf( - '/>%s</label>', - $this->lang['strcreatelikewithdefaults'] - ); + isset($_REQUEST['withdefaults']) ? ' checked="checked"' : '', + \sprintf( + '/>%s</label>', + $this->lang['strcreatelikewithdefaults'] + ); if ($data->hasCreateTableLikeWithConstraints()) { echo '<br /><label for="withconstraints"><input type="checkbox" id="withconstraints" name="withconstraints"', - isset($_REQUEST['withconstraints']) ? ' checked="checked"' : '', - \sprintf( - '/>%s</label>', - $this->lang['strcreatelikewithconstraints'] - ); + isset($_REQUEST['withconstraints']) ? ' checked="checked"' : '', + \sprintf( + '/>%s</label>', + $this->lang['strcreatelikewithconstraints'] + ); } if ($data->hasCreateTableLikeWithIndexes()) { echo '<br /><label for="withindexes"><input type="checkbox" id="withindexes" name="withindexes"', - isset($_REQUEST['withindexes']) ? ' checked="checked"' : '', - \sprintf( - '/>%s</label>', - $this->lang['strcreatelikewithindexes'] - ); + isset($_REQUEST['withindexes']) ? ' checked="checked"' : '', + \sprintf( + '/>%s</label>', + $this->lang['strcreatelikewithindexes'] + ); } echo "</td>\n\t</tr>" . \PHP_EOL; echo '</table>'; @@ -877,7 +877,7 @@ class TablesController extends BaseController $attrs = $data->getTableAttributes($_REQUEST['table']); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/display" method="post" id="selectform">' . \PHP_EOL; + echo '<form action="display" method="post" id="selectform">' . \PHP_EOL; if (0 < $attrs->RecordCount()) { // JavaScript for select all feature @@ -931,8 +931,8 @@ class TablesController extends BaseController ) . \PHP_EOL; echo '<td style="white-space:nowrap;">'; echo '<input type="checkbox" name="show[', \htmlspecialchars($attrs->fields['attname']), ']"', - isset($_REQUEST['show'][$attrs->fields['attname']]) ? ' checked="checked"' : '', - ' /></td>'; + isset($_REQUEST['show'][$attrs->fields['attname']]) ? ' checked="checked"' : '', + ' /></td>'; echo '<td style="white-space:nowrap;">', $this->misc->printVal($attrs->fields['attname']), '</td>'; echo '<td style="white-space:nowrap;">', $this->misc->printVal($data->formatType($attrs->fields['type'], $attrs->fields['atttypmod'])), '</td>'; echo '<td style="white-space:nowrap;">'; @@ -943,9 +943,9 @@ class TablesController extends BaseController foreach (\array_keys($data->selectOps) as $v) { echo '<option value="', \htmlspecialchars($v), '"', ($_REQUEST['ops'][$attrs->fields['attname']] === $v) ? ' selected="selected"' : '', - '>', - \htmlspecialchars($v), - '</option>' . \PHP_EOL; + '>', + \htmlspecialchars($v), + '</option>' . \PHP_EOL; } echo "</select>\n</td>" . \PHP_EOL; echo '<td style="white-space:nowrap;">', $data->printField( @@ -1052,7 +1052,7 @@ class TablesController extends BaseController $this->coalesceArr($_REQUEST, 'nulls', []); $this->coalesceArr($_REQUEST, 'format', []); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/tables" method="post" id="ac_form">' . \PHP_EOL; + echo '<form action="tables" method="post" id="ac_form">' . \PHP_EOL; if (0 < $attrs->RecordCount()) { echo '<table>' . \PHP_EOL; @@ -1113,8 +1113,8 @@ class TablesController extends BaseController '<input type="hidden" name="types[%s]" value="', $attrs->fields['attnum'] ), - \htmlspecialchars($attrs->fields['type']), - '" /></td>'; + \htmlspecialchars($attrs->fields['type']), + '" /></td>'; echo '<td style="white-space:nowrap;">' . \PHP_EOL; echo \sprintf( @@ -1232,7 +1232,7 @@ class TablesController extends BaseController $this->lang['strcancel'], \PHP_EOL ); - echo '<script src="' . \containerInstance()->subFolder . '/assets/js/insert_or_edit_row.js" type="text/javascript"></script>'; + echo '<script src="assets/js/insert_or_edit_row.js" type="text/javascript"></script>'; } /** @@ -1289,7 +1289,7 @@ class TablesController extends BaseController $this->printTrail('schema'); $this->printTitle($this->lang['strempty'], 'pg.table.empty'); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/tables" method="post">' . \PHP_EOL; + echo '<form action="tables" method="post">' . \PHP_EOL; foreach ($_REQUEST['ma'] as $v) { $a = \unserialize(\htmlspecialchars_decode($v, \ENT_QUOTES)); @@ -1310,7 +1310,7 @@ class TablesController extends BaseController $this->misc->printVal($_REQUEST['table']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/tables" method="post">' . \PHP_EOL; + echo '<form action="tables" method="post">' . \PHP_EOL; echo \sprintf( '<input type="hidden" name="table" value="%s" />%s', @@ -1406,7 +1406,7 @@ class TablesController extends BaseController $this->printTrail('schema'); $this->printTitle($this->lang['strdrop'], 'pg.table.drop'); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/tables" method="post">' . \PHP_EOL; + echo '<form action="tables" method="post">' . \PHP_EOL; foreach ($_REQUEST['ma'] as $v) { $a = \unserialize(\htmlspecialchars_decode($v, \ENT_QUOTES)); @@ -1425,7 +1425,7 @@ class TablesController extends BaseController $this->misc->printVal($_REQUEST['table']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/tables" method="post">' . \PHP_EOL; + echo '<form action="tables" method="post">' . \PHP_EOL; echo \sprintf( '<input type="hidden" name="table" value="%s" />%s', \htmlspecialchars($_REQUEST['table']), @@ -1521,10 +1521,10 @@ class TablesController extends BaseController 'table' => [ 'title' => $this->lang['strtable'], 'field' => Decorator::field('relname'), - 'url' => \containerInstance()->getDestinationWithLastTab('table').'&', - // '/redirect/table?%s&', - //$this->misc->href - // ), + 'url' => \containerInstance()->getDestinationWithLastTab('table') . '&', + // '/redirect/table?%s&', + //$this->misc->href + // ), 'vars' => ['table' => 'relname'], ], 'owner' => [ diff --git a/src/controllers/TablespacesController.php b/src/controllers/TablespacesController.php index 12bfcae3..51ddf42f 100644 --- a/src/controllers/TablespacesController.php +++ b/src/controllers/TablespacesController.php @@ -190,7 +190,7 @@ class TablespacesController extends BaseController $this->coalesceArr($_POST, 'comment', ($data->hasSharedComments()) ? $tablespace->fields['spccomment'] : ''); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/tablespaces" method="post">' . \PHP_EOL; + echo '<form action="tablespaces" method="post">' . \PHP_EOL; echo $this->view->form; echo '<table>' . \PHP_EOL; echo \sprintf( @@ -291,7 +291,7 @@ class TablespacesController extends BaseController $this->misc->printVal($_REQUEST['tablespace']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/tablespaces" method="post">' . \PHP_EOL; + echo '<form action="tablespaces" method="post">' . \PHP_EOL; echo $this->view->form; echo '<input type="hidden" name="action" value="drop" />' . \PHP_EOL; echo '<input type="hidden" name="tablespace" value="', \htmlspecialchars($_REQUEST['tablespace']), '" />' . \PHP_EOL; @@ -341,7 +341,7 @@ class TablespacesController extends BaseController $this->printTitle($this->lang['strcreatetablespace'], 'pg.tablespace.create'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/tablespaces" method="post">' . \PHP_EOL; + echo '<form action="tablespaces" method="post">' . \PHP_EOL; echo $this->view->form; echo '<table>' . \PHP_EOL; echo \sprintf( diff --git a/src/controllers/TblpropertiesController.php b/src/controllers/TblpropertiesController.php index 2cef3bf7..81ba3b81 100644 --- a/src/controllers/TblpropertiesController.php +++ b/src/controllers/TblpropertiesController.php @@ -361,7 +361,7 @@ class TblpropertiesController extends BaseController $_POST['tablespace'] = $table->fields['tablespace']; } - echo '<form action="' . \containerInstance()->subFolder . '/src/views/tblproperties" method="post">' . \PHP_EOL; + echo '<form action="tblproperties" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( '<tr><th class="data left required">%s</th>', @@ -539,7 +539,7 @@ class TblpropertiesController extends BaseController $max_size = $misc->inisizeToBytes(\ini_get('upload_max_filesize')); if (\is_float($max_size) && 0 < $max_size) { - echo '<form action="' . \containerInstance()->subFolder . '/src/views/dataimport" method="post" enctype="multipart/form-data">' . \PHP_EOL; + echo '<form action="dataimport" method="post" enctype="multipart/form-data">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( ' <tr> @@ -637,8 +637,8 @@ class TblpropertiesController extends BaseController $this->printTitle($this->lang['straddcolumn'], 'pg.column.add'); $this->printMsg($msg); - echo '<script src="' . \containerInstance()->subFolder . '/assets/js/tables.js" type="text/javascript"></script>'; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/tblproperties" method="post">' . \PHP_EOL; + echo '<script src="assets/js/tables.js" type="text/javascript"></script>'; + echo '<form action="tblproperties" method="post">' . \PHP_EOL; // Output table header echo '<table>' . \PHP_EOL; @@ -818,7 +818,7 @@ class TblpropertiesController extends BaseController $misc->printVal($_REQUEST['table']) ) . '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/tblproperties" method="post">' . \PHP_EOL; + echo '<form action="tblproperties" method="post">' . \PHP_EOL; echo '<input type="hidden" name="action" value="drop" />' . \PHP_EOL; echo \sprintf( '<input type="hidden" name="table" value="%s" />%s', diff --git a/src/controllers/TreeController.php b/src/controllers/TreeController.php index 9786a3d7..94ec3210 100644 --- a/src/controllers/TreeController.php +++ b/src/controllers/TreeController.php @@ -87,18 +87,17 @@ class TreeController extends BaseController * * @psalm-return array<int|string, array<string, mixed>|bool|string> */ - public function printTree( &$_treedata, &$attrs, $section, $print = true) + public function printTree(&$_treedata, &$attrs, $section, $print = true) { $treedata = []; if (0 < $_treedata->RecordCount()) { while (!$_treedata->EOF) { - $treedata[] = $_treedata->fields; + $treedata[] = $_treedata->fields; $_treedata->MoveNext(); } - } - + $tree_params = [ 'treedata' => &$treedata, 'attrs' => &$attrs, @@ -147,15 +146,15 @@ class TreeController extends BaseController private function printTreeJSON(&$treedata, &$attrs, $print = true) { $parent = []; - + $subFolder = containerInstance()->subFolder; if (isset($attrs['is_root'])) { $parent = [ 'id' => 'root', 'children' => true, - 'icon' => \containerInstance()->subFolder . '/assets/images/themes/default/Servers.png', + 'icon' => $subFolder . '/assets/images/themes/default/Servers.png', 'state' => ['opened' => true], - 'a_attr' => ['href' =>'servers'], - 'url' => \containerInstance()->subFolder . ('/servers?action=tree'), + 'a_attr' => ['href' => 'servers'], + 'url' => $subFolder . ('/servers?action=tree'), 'text' => 'Servers', ]; } elseif (0 < \count($treedata)) { @@ -165,43 +164,44 @@ class TreeController extends BaseController if (!empty($attrs['openicon'])) { $icon = $this->view->icon(Decorator::get_sanitized_value($attrs['openIcon'], $rec)); } - $href=Decorator::get_sanitized_value($attrs['action'], $rec); + $href = Decorator::get_sanitized_value($attrs['action'], $rec); if ($href) { - $href = \str_replace('//', '/', $href); + $href = \str_replace('//', '/', $href); + $href = $subFolder . str_replace($subFolder, '', $href); } - + $tree = [ 'text' => Decorator::get_sanitized_value($attrs['text'], $rec), - 'id' => \sha1(Decorator::get_sanitized_value($attrs['action'], $rec)), + 'id' => \sha1($href), 'icon' => Decorator::get_sanitized_value($icon, $rec), 'iconaction' => Decorator::get_sanitized_value($attrs['iconAction'], $rec), 'openicon' => Decorator::get_sanitized_value($icon, $rec), 'tooltip' => Decorator::get_sanitized_value($attrs['toolTip'], $rec), 'a_attr' => ['href' => $href], + 'href' => $href, //'url'=>strtolower(), 'children' => false, ]; $url = Decorator::get_sanitized_value($attrs['branch'], $rec); - $urlparts=parse_url('https://dummy.domain'.$tree['a_attr']['href']); - $path_arr=explode('/',$urlparts['path']??''); - $tree['url']=containerInstance()->getDestinationWithLastTab(array_pop($path_arr)); + $urlparts = parse_url('https://dummy.domain' . $tree['a_attr']['href']); + $path_arr = explode('/', $urlparts['path'] ?? ''); + $tree['url'] = containerInstance()->getDestinationWithLastTab(array_pop($path_arr)); + + + $url = \str_replace('/src/views/', '/', $url); - - $url = \str_replace('/src/views/', '/', $url); - if ($url) { $tree['url'] = $url; $tree['children'] = true; } - //$tree['text'] = '<a href="' . $tree['id'] . '" target="detail">' . $tree['text'] . '</a>'; $parent[] = $tree; } - } else { + } else { $parent = ['children' => false]; } //ddd($parent); diff --git a/src/controllers/TriggersController.php b/src/controllers/TriggersController.php index 1d32f48d..cc84f700 100644 --- a/src/controllers/TriggersController.php +++ b/src/controllers/TriggersController.php @@ -282,7 +282,7 @@ class TriggersController extends BaseController if (0 < $triggerdata->RecordCount()) { $this->coalesceArr($_POST, 'name', $triggerdata->fields['tgname']); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/triggers" method="post">' . \PHP_EOL; + echo '<form action="triggers" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( '<tr><th class="data">%s</th>', @@ -340,7 +340,7 @@ class TriggersController extends BaseController $this->misc->printVal($_REQUEST['table']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/triggers" method="post">' . \PHP_EOL; + echo '<form action="triggers" method="post">' . \PHP_EOL; echo '<input type="hidden" name="action" value="drop" />' . \PHP_EOL; echo \sprintf( '<input type="hidden" name="table" value="%s" />%s', @@ -392,7 +392,7 @@ class TriggersController extends BaseController $this->misc->printVal($_REQUEST['table']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/triggers" method="post">' . \PHP_EOL; + echo '<form action="triggers" method="post">' . \PHP_EOL; echo '<input type="hidden" name="action" value="enable" />' . \PHP_EOL; echo \sprintf( '<input type="hidden" name="table" value="%s" />%s', @@ -440,7 +440,7 @@ class TriggersController extends BaseController $this->misc->printVal($_REQUEST['table']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/triggers" method="post">' . \PHP_EOL; + echo '<form action="triggers" method="post">' . \PHP_EOL; echo '<input type="hidden" name="action" value="disable" />' . \PHP_EOL; echo \sprintf( '<input type="hidden" name="table" value="%s" />%s', @@ -511,7 +511,7 @@ class TriggersController extends BaseController $sel3 = new XHtmlSelect('formFrequency'); $sel3->set_data($data->triggerFrequency); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/triggers" method="post">' . \PHP_EOL; + echo '<form action="triggers" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo '<tr>' . \PHP_EOL; echo \sprintf( diff --git a/src/controllers/TypesController.php b/src/controllers/TypesController.php index 3eecc349..c618cf09 100644 --- a/src/controllers/TypesController.php +++ b/src/controllers/TypesController.php @@ -379,7 +379,7 @@ class TypesController extends BaseController $this->misc->printVal($_REQUEST['type']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/types" method="post">' . \PHP_EOL; + echo '<form action="types" method="post">' . \PHP_EOL; echo \sprintf( '<p><input type="checkbox" id="cascade" name="cascade" /> <label for="cascade">%s</label></p>', $this->lang['strcascade'] @@ -431,7 +431,7 @@ class TypesController extends BaseController $this->printTitle($this->lang['strcreatecomptype'], 'pg.type.create'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/types" method="post">' . \PHP_EOL; + echo '<form action="types" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( ' <tr> @@ -502,7 +502,7 @@ class TypesController extends BaseController $this->printTitle($this->lang['strcreatecomptype'], 'pg.type.create'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/types" method="post">' . \PHP_EOL; + echo '<form action="types" method="post">' . \PHP_EOL; // Output table header echo '<table>' . \PHP_EOL; @@ -669,7 +669,7 @@ class TypesController extends BaseController $this->printTitle($this->lang['strcreateenumtype'], 'pg.type.create'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/types" method="post">' . \PHP_EOL; + echo '<form action="types" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( ' <tr> @@ -738,7 +738,7 @@ class TypesController extends BaseController $this->printTitle($this->lang['strcreateenumtype'], 'pg.type.create'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/types" method="post">' . \PHP_EOL; + echo '<form action="types" method="post">' . \PHP_EOL; // Output table header echo '<table>' . \PHP_EOL; @@ -858,7 +858,7 @@ class TypesController extends BaseController $this->printTitle($this->lang['strcreatetype'], 'pg.type.create'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/types" method="post">' . \PHP_EOL; + echo '<form action="types" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( '<tr><th class="data left required">%s</th>', diff --git a/src/controllers/UsersController.php b/src/controllers/UsersController.php index a03ca6d4..3db2c095 100644 --- a/src/controllers/UsersController.php +++ b/src/controllers/UsersController.php @@ -21,63 +21,71 @@ class UsersController extends BaseController public function render(): void { $this->printHeader(); - $this->printBody(); - + +$this->action=isset($_REQUEST['cancel'])?'cancel':$this->action; switch ($this->action) { + case 'cancel': + $this->printBody(); + $this->doDefault(); + break; + case 'changepassword': if (isset($_REQUEST['ok'])) { + $this->printBody(); $this->doChangePassword(false); } else { + $this->printBody(); $this->doAccount(); } break; case 'confchangepassword': + $this->printBody(); $this->doChangePassword(true); break; case 'account': + $this->printBody(); $this->doAccount(); break; case 'save_create': - if (isset($_REQUEST['cancel'])) { - $this->doDefault(); - } else { - $this->doSaveCreate(); - } + $this->printBody(); + $this->doSaveCreate(); + break; case 'create': + $this->printBody(); $this->doCreate(); break; case 'drop': - if (isset($_REQUEST['cancel'])) { - $this->doDefault(); - } else { - $this->doDrop(false); - } + $this->printBody(); + $this->doDrop(false); + break; case 'confirm_drop': + $this->printBody(); $this->doDrop(true); break; case 'save_edit': - if (isset($_REQUEST['cancel'])) { - $this->doDefault(); - } else { - $this->doSaveEdit(); - } + $this->printBody(); + $this->doSaveEdit(); + break; case 'edit': + $this->printBody(); $this->doEdit(); break; default: + $this->view->offsetSet('trail',$this->printTrail('server',false)); + $this->printBody(); $this->doDefault(); break; @@ -100,7 +108,7 @@ class UsersController extends BaseController return 'infinity' === $val ? $lang['strnever'] : \htmlspecialchars($val); }; - $this->printTrail('server'); + $this->printTabs('server', 'users'); $this->printMsg($msg); @@ -269,7 +277,7 @@ class UsersController extends BaseController $this->coalesceArr($_POST, 'confirm', ''); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/users" method="post">' . \PHP_EOL; + echo '<form action="' . \containerInstance()->subFolder . '/users" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( ' <tr> @@ -357,7 +365,7 @@ class UsersController extends BaseController $_POST['formPassword'] = ''; } - echo '<form action="' . \containerInstance()->subFolder . '/src/views/users" method="post">' . \PHP_EOL; + echo '<form action="' . \containerInstance()->subFolder . '/users" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( ' <tr> @@ -469,7 +477,7 @@ class UsersController extends BaseController $this->misc->printVal($_REQUEST['username']) ), '</p>' . \PHP_EOL; - echo '<form action="' . \containerInstance()->subFolder . '/src/views/users" method="post">' . \PHP_EOL; + echo '<form action="' . \containerInstance()->subFolder . '/users" method="post">' . \PHP_EOL; echo '<p><input type="hidden" name="action" value="drop" />' . \PHP_EOL; echo '<input type="hidden" name="username" value="', \htmlspecialchars($_REQUEST['username']), '" />' . \PHP_EOL; echo $this->view->form; @@ -515,7 +523,7 @@ class UsersController extends BaseController $this->printTitle($this->lang['strcreateuser'], 'pg.user.create'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/users" method="post">' . \PHP_EOL; + echo '<form action="' . \containerInstance()->subFolder . '/users" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( ' <tr> diff --git a/src/controllers/ViewpropertiesController.php b/src/controllers/ViewpropertiesController.php index d0a5f3eb..5b9afeb8 100644 --- a/src/controllers/ViewpropertiesController.php +++ b/src/controllers/ViewpropertiesController.php @@ -46,8 +46,8 @@ class ViewpropertiesController extends BaseController break; case 'edit': - $footer_template = 'header_sqledit.twig'; - $footer_template = 'footer_sqledit.twig'; + $this->view->offsetSet('codemirror',true); + $this->doEdit(); break; @@ -135,7 +135,9 @@ class ViewpropertiesController extends BaseController $this->printMsg($msg); $viewdata = $data->getView($_REQUEST[$this->subject]); - $this->printHeader($this->headerTitle(), null, true, 'header_sqledit.twig'); + $this->view->offsetSet('codemirror',true); + + $this->printHeader($this->headerTitle(), null, true ); if (0 < $viewdata->RecordCount()) { if (!isset($_POST['formDefinition'])) { @@ -216,7 +218,7 @@ class ViewpropertiesController extends BaseController $this->printTitle($this->lang['stralter'], 'pg.column.alter'); $this->printMsg($msg); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/viewproperties" method="post">' . \PHP_EOL; + echo '<form action="viewproperties" method="post">' . \PHP_EOL; // Output view header echo '<table>' . \PHP_EOL; @@ -332,7 +334,7 @@ class ViewpropertiesController extends BaseController $this->coalesceArr($_POST, 'comment', $view->fields['relcomment']); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/viewproperties" method="post">' . \PHP_EOL; + echo '<form action="viewproperties" method="post">' . \PHP_EOL; echo '<table>' . \PHP_EOL; echo \sprintf( '<tr><th class="data left required">%s</th>', diff --git a/src/controllers/ViewsController.php b/src/controllers/ViewsController.php index 3872e19f..1f8f5305 100644 --- a/src/controllers/ViewsController.php +++ b/src/controllers/ViewsController.php @@ -126,9 +126,7 @@ class ViewsController extends BaseController 'title' => $this->lang['strview'], 'field' => Decorator::field('relname'), 'url' => \containerInstance()->getDestinationWithLastTab('view'), - '/redirect/view?%s&', - $this->misc->href - ), + 'vars' => [$this->keystring => 'relname'], ], 'owner' => [ @@ -287,7 +285,7 @@ class ViewsController extends BaseController $this->printTrail('view'); $this->printTitle($this->lang['strdrop'], 'pg.view.drop'); - echo '<form action="' . \containerInstance()->subFolder . '/src/views/views" method="post">' . \PHP_EOL; + echo '<form action="views" method="post">' . \PHP_EOL; //If multi drop if (isset($_REQUEST['ma'])) { diff --git a/src/database/Connection.php b/src/database/Connection.php deleted file mode 100644 index df562d31..00000000 --- a/src/database/Connection.php +++ /dev/null @@ -1,188 +0,0 @@ -<?php - -/** - * PHPPgAdmin 6.1.3 - */ - -namespace PHPPgAdmin\Database; - -use Exception; -use PHPPgAdmin\Traits\HelperTrait; -use Slim\Container; - -/** - * @file - * Class to represent a database connection - * - * Id: Connection.php,v 1.15 2008/02/18 21:42:47 ioguix Exp $ - */ -class Connection -{ - use HelperTrait; - - public $conn; - - public $platform = 'UNKNOWN'; - - protected $container; - - protected $server_info; - - protected $version_dictionary = [ - '13' => 'Postgres13', - '12' => 'Postgres12', - '11' => 'Postgres11', - '10' => 'Postgres10', - '9.7' => 'Postgres96', - '9.6' => 'Postgres96', - '9.5' => 'Postgres95', - '9.4' => 'Postgres94', - '9.3' => 'Postgres93', - '9.2' => 'Postgres92', - '9.1' => 'Postgres91', - '9.0' => 'Postgres90', - ]; - - // The backend platform. Set to UNKNOWN by default. - private $_connection_result; - - /** - * Creates a new connection. Will actually make a database connection. - * - * @param array $server_info - * @param string $database database name - * @param Container $container - * @param int $fetchMode Defaults to associative. Override for different behaviour - */ - public function __construct($server_info, $database, $container, $fetchMode = \ADODB_FETCH_ASSOC) - { - $host = $server_info['host']; - $port = $server_info['port']; - $sslmode = $server_info['sslmode']; - $user = $server_info['username']; - $password = $server_info['password']; - - $this->server_info = $server_info; - - $this->container = $container; - - $this->conn = \ADONewConnection('postgres9'); - //$this->conn->debug = true; - $this->conn->setFetchMode($fetchMode); - - // Ignore host if null - if (null === $host || '' === $host) { - if (null !== $port && '' !== $port) { - $pghost = ':' . $port; - } else { - $pghost = ''; - } - } else { - $pghost = \sprintf( - '%s:%s', - $host, - $port - ); - } - - // Add sslmode to $pghost as needed - if (('disable' === $sslmode) || ('allow' === $sslmode) || ('prefer' === $sslmode) || ('require' === $sslmode)) { - $pghost .= ':' . $sslmode; - } elseif ('legacy' === $sslmode) { - $pghost .= ' requiressl=1'; - } - - try { - $this->conn->connect($pghost, $user, $password, $database); - //$this->prtrace($this->conn); - } catch (Exception $e) { - dump($e); - $this->prtrace($e->getMessage(), $e->getTrace()); - } - } - - public function getConnectionResult() - { - return $this->_connection_result; - } - - /** - * Gets the name of the correct database driver to use. As a side effect, - * sets the platform. - * - * @param string $description A description of the database and version (returns by reference) - * - * @return string The driver. e.g. Postgres96 - */ - public function getDriver(&$description) - { - $version = null; - - if ($this->conn->_connectionID) { - $v = \pg_version($this->conn->_connectionID); - - //\PhpConsole\Handler::getInstance()->debug($v, 'pg_version'); - - if (isset($v['server'])) { - $version = $v['server']; - } - } - // If we didn't manage to get the version without a query, query... - if (!isset($version)) { - $adodb = new ADOdbBase($this->conn, $this->container, $this->server_info); - - $sql = 'SELECT VERSION() AS version'; - $field = $adodb->selectField($sql, 'version'); - - // Check the platform, if it's mingw, set it - if (\preg_match('/ mingw /i', $field)) { - $this->platform = 'MINGW'; - } - - $params = \explode(' ', $field); - - if (!isset($params[1])) { - return null; - } - - $version = $params[1]; // eg. 8.4.4 - } - - $description = \sprintf( - 'PostgreSQL %s', - $version - ); - - $version_parts = \explode('.', $version); - - if ((int) (10 <= $version_parts[0])) { - $major_version = $version_parts[0]; - } else { - $major_version = \implode('.', [$version_parts[0], $version_parts[1]]); - } - - //$this->prtrace(['pg_version' => pg_version($this->conn->_connectionID), 'version' => $version, 'major_version' => $major_version]); - // Detect version and choose appropriate database driver - if (\array_key_exists($major_version, $this->version_dictionary)) { - return $this->version_dictionary[$major_version]; - } - - // if major version is less than 9 return null, we don't support it - if (9 > (int) \mb_substr($version, 0, 1)) { - return null; - } - - // If unknown version, then default to latest driver - return 'Postgres'; - } - - /** - * Get the last error in the connection. - * - * @return string Error string - */ - public function getLastError() - { - return \pg_last_error($this->conn->_connectionID); - } -} diff --git a/src/router.php b/src/router.php index 54c40cca..c3f82c54 100644 --- a/src/router.php +++ b/src/router.php @@ -37,8 +37,9 @@ $container = $app->getContainer(); // If no dump function has been globally declared at this point // we fill the gap with an empty one to avoid errors -if(!function_exists('dump')) { - function dump(...$args):void { +if (!function_exists('dump')) { + function dump(...$args): void + { // do nothing } } @@ -124,26 +125,24 @@ $app->get('/redirect[/{subject}]', function ( array $args ) { $subject = (isset($args['subject'])) ? $args['subject'] : 'root'; - $destinationurl = $this->getDestinationWithLastTab($subject); - $cleanDestination=($this->subFolder.'/'. $destinationurl); - - return $response->withStatus(302)->withHeader('Location',$cleanDestination); + $destinationurl = str_replace($this->subFolder . '/', '', $this->getDestinationWithLastTab($subject)); + $cleanDestination = ($this->subFolder . '/' . $destinationurl); + + return $response->withStatus(302)->withHeader('Location', $cleanDestination); }); -ini_set('display_errors','on'); +ini_set('display_errors', 'on'); $app->get('/{subject:servers|intro|browser}[/{server_id}]', function ( \Slim\Http\Request $request, \Slim\Http\Response $response, array $args ) { $subject = $args['subject'] ?? 'intro'; - $this->view->offsetSet('includeJsTree',true); + $this->view->offsetSet('includeJsTree', true); $className = '\PHPPgAdmin\Controller\\' . \ucfirst($subject) . 'Controller'; $controller = new $className($this); - + return $controller->render(); - - }); @@ -153,16 +152,17 @@ $app->map(['GET', 'POST'], '/src/views/{subject}', function ( array $args ) { $subject = $args['subject']; - $nextPath=$this->subFolder.'/'. $subject; + $nextPath = $this->subFolder . '/' . $subject; $query_string = $request->getUri()->getQuery(); -return $response->withStatus(302)->withHeader('Location',$nextPath.($query_string? '?'.$query_string:'')); + return $response->withStatus(307)->withHeader('Location', $nextPath . ($query_string ? '?' . $query_string : '')); }); -$app->get('/{subject:\w+}[/{server_id}]', function ( +$app->map(['GET', 'POST'], '/{subject:\w+}[/{server_id}]', function ( \Slim\Http\Request $request, \Slim\Http\Response $response, array $args ) { + // ddd($args); $subject = $args['subject'] ?? 'intro'; $server_id = $args['server_id'] ?? $request->getQueryParam('server'); $_server_info = $this->misc->getServerInfo(); @@ -174,11 +174,10 @@ $app->get('/{subject:\w+}[/{server_id}]', function ( $subject = 'servers'; } $query_string = $request->getUri()->getQuery(); - $this->view->offsetSet('includeJsTree',true); + $this->view->offsetSet('includeJsTree', true); $className = $this->view->getControllerClassName($subject); $controller = new $className($this); return $controller->render(); - }); $app->get('/', function ( diff --git a/src/xhtml/HTMLFooterController.php b/src/xhtml/HTMLFooterController.php index 885d3abe..42648478 100644 --- a/src/xhtml/HTMLFooterController.php +++ b/src/xhtml/HTMLFooterController.php @@ -65,7 +65,10 @@ class HTMLFooterController extends HTMLController $this->view->offsetSet('reload', $reload_param); $this->view->offsetSet('footer_template', $template); $this->view->offsetSet('print_bottom_link', !$this->_no_bottom_link); -///ddd($template); + if (!$this->view->offsetExists('excludeJsTree')) { + $this->view->offsetSet('excludeJsTree', false); + } + $template = $this->view->offsetGet('excludeJsTree') === true && $template === 'footer_sqledit.twig' ? $template : 'footer.twig'; $footer_html = $this->view->fetch($template); if ($doBody) { diff --git a/src/xhtml/HTMLHeaderController.php b/src/xhtml/HTMLHeaderController.php index 16e31584..dd1a6a6d 100644 --- a/src/xhtml/HTMLHeaderController.php +++ b/src/xhtml/HTMLHeaderController.php @@ -50,14 +50,14 @@ class HTMLHeaderController extends HTMLController $viewVars['dir'] = (0 !== \strcasecmp($lang['applangdir'], 'ltr')) ? ' dir="' . \htmlspecialchars($lang['applangdir']) . '"' : ''; $viewVars['headertemplate'] = $template; - $viewVars['headerFlags'][str_replace('.twig','',basename($template))]=1; - $viewVars['includeJsTree']=$template!=='header_sqledit.twig'; + $viewVars['headerFlags'][str_replace('.twig', '', basename($template))] = 1; + $viewVars['includeJsTree'] = true; + //$viewVars['excludeJsTree']=$template==='header_sqledit.twig'; $viewVars['title'] = ('' !== $title) ? ' - ' . $title : ''; $viewVars['lang'] = $lang; $viewVars['appName'] = \htmlspecialchars($this->appName); - - $reload_param = 'none'; + $reload_param = 'none'; if ($this->view->getReloadBrowser()) { $reload_param = 'other'; } elseif ($this->_reload_drop_database) { @@ -65,7 +65,11 @@ class HTMLHeaderController extends HTMLController } $viewVars['reload'] = $reload_param; $viewVars['script'] = $script; - $header_html = $this->view->fetch($template==='header_sqledit.twig'?$template:'header.twig', $viewVars); + if (!$this->view->offsetExists('excludeJsTree')) { + $this->view->offsetSet('excludeJsTree', false); + } + $template = $this->view->offsetGet('excludeJsTree') === true && $template === 'header_sqledit.twig' ? $template : 'header.twig'; + $header_html = $this->view->fetch($template, $viewVars); /*$plugins_head = []; $_params = ['heads' => &$plugins_head]; @@ -90,20 +94,25 @@ class HTMLHeaderController extends HTMLController * @param bool $doBody True to output body tag, false to return * @param string $bodyClass - name of body class * @param bool $onloadInit - if true, call init() on body load event + * @param bool $includeJsTree - if true, include the jstree section * * @return string the parsed template */ - public function printBody($doBody = true, $bodyClass = 'detailbody', $onloadInit = false,$includeJsTree=true) - { - - // $includeJsTree=$includeJsTree||( $this->view->offsetExists('includeJsTree')?$this->view->offsetGet('includeJsTree'):false); - $viewVars=[ - 'bodyClass'=> $this->lang['applangdir'] . ' ' . \htmlspecialchars($bodyClass).' '.$includeJsTree?'flexbox_body':'', - 'onload'=>($onloadInit ? 'onload="init();" ' : ''), - 'controller_name'=>$this->controller_name, - 'includeJsTree'=>$includeJsTree + public function printBody( + $doBody = true, + $bodyClass = 'detailbody', + $onloadInit = false, + $includeJsTree = true + ) { + + // $includeJsTree=$includeJsTree||( $this->view->offsetExists('includeJsTree')?$this->view->offsetGet('includeJsTree'):false); + $viewVars = [ + 'bodyClass' => $this->lang['applangdir'] . ' ' . \htmlspecialchars($bodyClass) . ' ' . $includeJsTree ? 'flexbox_body' : '', + 'onload' => ($onloadInit ? 'onload="init();" ' : ''), + 'controller_name' => $this->controller_name, + 'includeJsTree' => $includeJsTree ]; - + $bodyHtml = $this->view->fetch('components/common_body.twig', $viewVars); if (!$this->_no_output && $doBody) { diff --git a/src/xhtml/HTMLNavbarController.php b/src/xhtml/HTMLNavbarController.php index 9af68191..68f91585 100644 --- a/src/xhtml/HTMLNavbarController.php +++ b/src/xhtml/HTMLNavbarController.php @@ -47,7 +47,6 @@ class HTMLNavbarController extends HTMLController $viewVars = $this->_getSearchPathsCrumbs($crumbs, $viewVars); $trail_html .= $this->getContainer()->view->fetch('components/trail.twig', $viewVars); - if ($do_print) { echo $trail_html; @@ -191,8 +190,8 @@ class HTMLNavbarController extends HTMLController $search_paths = $data->getSearchPath(); foreach ($search_paths as $schema) { - $destination = $this->container->getDestinationWithLastTab('database'); - $search_path_crumbs[$schema] = [ + $destination = $this->container->getDestinationWithLastTab('database'); + $search_path_crumbs[$schema] = [ 'title' => $lang['strschema'], 'text' => $schema, 'icon' => $this->view->icon('Schema'), @@ -259,6 +258,7 @@ class HTMLNavbarController extends HTMLController ], 'history' => [ 'attr' => [ + 'class' => 'toplink_popup', 'href' => [ 'url' => \containerInstance()->subFolder . '/src/views/history', 'urlvars' => \array_merge($reqvars, [ @@ -266,7 +266,7 @@ class HTMLNavbarController extends HTMLController ]), ], 'id' => 'toplink_history', - 'class' => 'toplink_popup', + ], 'content' => $lang['strhistory'], ], @@ -286,6 +286,7 @@ class HTMLNavbarController extends HTMLController ], 'logout' => [ 'attr' => [ + 'id' => 'toplink_logout', 'href' => [ 'url' => \containerInstance()->subFolder . '/src/views/servers', 'urlvars' => [ @@ -293,7 +294,6 @@ class HTMLNavbarController extends HTMLController 'logoutServer' => \sha1("{$server_info['host']}:{$server_info['port']}:{$server_info['sslmode']}"), ], ], - 'id' => 'toplink_logout', ], 'content' => $lang['strlogout'], ], @@ -305,12 +305,29 @@ class HTMLNavbarController extends HTMLController ]; $topbar_html .= '<td style="text-align: right">'; -$toplinks=$this->printLinksList($toplinks, 'toplink', false, $from); -if(strpos($toplinks,'toplink_popup')!==false) { - $topbar_html .= str_replace(['<li>','</li>','<a','/a>','class="toplink_popup" href','src/views/','target="sqledit"'],[ - '','', - '<button','/button>','class="toplink_popup" rel','','target="_blank" '],$toplinks); -} + $toplinks = $this->printLinksList($toplinks, 'toplink', false, $from); + + if (strpos($toplinks, 'toplink_popup') !== false) { + $topbar_html .= str_replace( + [ + '<li>', + '</li>', '<a', '/a>', + + 'id="toplink_logout" href', + 'class="toplink_popup" href', + 'src/views/', 'target="sqledit"' + ], + [ + '', '', + '<button', + '/button>', + 'id="toplink_logout" rel', + + 'class="toplink_popup" rel', '', 'target="_blank" ' + ], + $toplinks + ); + } $topbar_html .= '</td>'; } else { $topbar_html .= "<span class=\"appname\">{$appName}</span> <span class=\"version\">{$appVersion}</span>"; @@ -332,7 +349,7 @@ if(strpos($toplinks,'toplink_popup')!==false) { $vars = $this->misc->getSubjectParams($subject); \ksort($vars['params']); - return "{$vars['url']}?" . \http_build_query($vars['params'], '', '&'); + return "{$vars['url']}&" . \http_build_query($vars['params'], '', '&'); } /** diff --git a/src/xhtml/HTMLTableController.php b/src/xhtml/HTMLTableController.php index 31ea5e89..96656656 100644 --- a/src/xhtml/HTMLTableController.php +++ b/src/xhtml/HTMLTableController.php @@ -147,7 +147,7 @@ class HTMLTableController extends HTMLController foreach ($columns as $column_id => $column) { // Handle cases where no class has been passed - + $class = (isset($column['class']) && '' !== $column['class']) ? $column['class'] : ''; switch ($column_id) { @@ -159,7 +159,7 @@ class HTMLTableController extends HTMLController break; default: - $thead_html .= '<th class="data' . $class . '">'; + $thead_html .= '<th class="data' . $class . ' '.$column_id.'">'; if (isset($column['help'])) { $thead_html .= $this->view->printHelp($column['title'], $column['help'], false); |