The branch, master has been updated via 3b74d9ba019f6e1904699d5355e5e9c597896dcb (commit) via d09e630af2fff492d6b75fea40da37547eeba63d (commit) via 9dd406c0455089b6a5b285ec73e4f2d675216376 (commit) via e3bb1f875969280e9a2bdf991b21fc808b8eaa55 (commit) via eb83a062bd91c9ed206f27017f49e5042748c310 (commit) via 369b5d00f8474d2e82e371e565edf1891ca8bfc5 (commit) via e6bb88117f61466b24ac79b36ad1f27da1168bd1 (commit) via 638cee4decf831773cefabe50edd750da430e371 (commit) via 5dce476c4ce706790143852220591c4a9655eef1 (commit) via 5fce10df15de80ddf8db3ed68911401dc03c142f (commit) via 0d58ceb962650535343d4774d3c7f0e470bfd1c1 (commit) via 64f1f5a0ea81c363f1a0d4454984ef3fb21bc7cf (commit) via 10daf4da1b2a5354d7433cd8fc6f44fd6104c8dc (commit) via 55c310a24d3afa14dee4bf4c599843e31ed3f5c4 (commit) via 2c03eb298655b264b8f6acb3341030a70ee77a91 (commit) via 1cf156c91361e0f6b0f2767c7f35b0b1ae42e469 (commit) via de28609ff984b3e3314f749893729bf88fddaf97 (commit) via 80cca8f6b32da2bd3c38e48d12aedf37218b285e (commit) via 8a672bad12d08013ba3242ba457e790a49bbfe00 (commit) via 7e37b2cdb37bcc1c64ef726986e6e3efc8b25145 (commit) via f3d9b75c3503d87aff57d02feef7736bbbca98de (commit) via bc910761d6cd48a40c91bb8af38ae9402ad18c63 (commit) via 2c80a5023bb8d7b21e5f2f955e5a70ae6119deb4 (commit) via ca3a49dfcff833168de8584cdd659ca6cc01b5d0 (commit) via dea405cfc3379c8e8e91e4b2446c63fdee16c8c0 (commit) via 12af64757baf59b9b00c4895cc3a9dc7902a567b (commit) via 58a2724c315f49f34ce503fc168b2a594e256a14 (commit) via d8af30ca5c2fc0e726eaee986757db9bb79f474f (commit) via 701b93f3520d39cbca9a0be09eea06619fe2b0d1 (commit) via c3eb6f389bfb84eebe6d2bfe27c45091af31eefd (commit) via d14a5a8dc0cef4bfccb9065b1a435bb4e23b981c (commit) from 20e460fc50adeaa3da3da28b54b2361c577f11c6 (commit)
- Log ----------------------------------------------------------------- commit 3b74d9ba019f6e1904699d5355e5e9c597896dcb Author: Marc Delisle marc@infomarc.info Date: Fri Nov 19 13:07:49 2010 -0500
credits
commit d09e630af2fff492d6b75fea40da37547eeba63d Author: Marc Delisle marc@infomarc.info Date: Fri Nov 19 13:02:41 2010 -0500
improve message and make it translatable
commit 9dd406c0455089b6a5b285ec73e4f2d675216376 Author: Marc Delisle marc@infomarc.info Date: Fri Nov 19 12:52:10 2010 -0500
capitalize keywords; make other strings translatable
commit e3bb1f875969280e9a2bdf991b21fc808b8eaa55 Author: Marc Delisle marc@infomarc.info Date: Fri Nov 19 12:21:43 2010 -0500
wrong target to execute the query; missing parameters
commit eb83a062bd91c9ed206f27017f49e5042748c310 Merge: 20e460fc50adeaa3da3da28b54b2361c577f11c6 369b5d00f8474d2e82e371e565edf1891ca8bfc5 Author: Marc Delisle marc@infomarc.info Date: Fri Nov 19 12:17:33 2010 -0500
Merge remote branch 'ankitg/master'
commit 369b5d00f8474d2e82e371e565edf1891ca8bfc5 Author: ankitg ankitatbits@gmail.com Date: Tue Aug 17 00:23:57 2010 +0530
minor bugsfixed documentation added
commit e6bb88117f61466b24ac79b36ad1f27da1168bd1 Author: ankitg ankitatbits@gmail.com Date: Thu Aug 12 05:20:44 2010 +0530
from and having clause added with auto left joins
commit 638cee4decf831773cefabe50edd750da430e371 Author: ankitg ankitatbits@gmail.com Date: Wed Jul 28 12:00:46 2010 +0530
where orderby groupby clauses
commit 5dce476c4ce706790143852220591c4a9655eef1 Author: ankitg ankitatbits@gmail.com Date: Thu Jul 15 01:08:19 2010 +0530
bugs fixed
commit 5fce10df15de80ddf8db3ed68911401dc03c142f Author: ankitg ankitatbits@gmail.com Date: Wed Jul 14 04:16:25 2010 +0530
query window
commit 0d58ceb962650535343d4774d3c7f0e470bfd1c1 Author: ankitg ankitatbits@gmail.com Date: Mon Jul 12 08:25:46 2010 +0530
Select part of Query builder complete with rename and aggregate operators
commit 64f1f5a0ea81c363f1a0d4454984ef3fb21bc7cf Author: ankitg ankitatbits@gmail.com Date: Fri Jul 9 03:33:14 2010 +0530
store selected columns info
commit 10daf4da1b2a5354d7433cd8fc6f44fd6104c8dc Author: ankitg ankitatbits@gmail.com Date: Wed Jul 7 00:31:53 2010 +0530
some changes plus comments added
commit 55c310a24d3afa14dee4bf4c599843e31ed3f5c4 Merge: 1cf156c91361e0f6b0f2767c7f35b0b1ae42e469 2c03eb298655b264b8f6acb3341030a70ee77a91 Author: ankitg ankitatbits@gmail.com Date: Fri Jul 2 12:11:27 2010 +0530
Merge branch 'visualbuilder'
commit 2c03eb298655b264b8f6acb3341030a70ee77a91 Author: ankitg ankitatbits@gmail.com Date: Fri Jul 2 12:10:56 2010 +0530
new features in history tab
commit 1cf156c91361e0f6b0f2767c7f35b0b1ae42e469 Merge: 80cca8f6b32da2bd3c38e48d12aedf37218b285e de28609ff984b3e3314f749893729bf88fddaf97 Author: ankitg ankitatbits@gmail.com Date: Sat Jun 26 16:42:59 2010 +0530
Merge branch 'visualbuilder'
commit de28609ff984b3e3314f749893729bf88fddaf97 Author: ankitg ankitatbits@gmail.com Date: Sat Jun 26 16:42:29 2010 +0530
history tab changes
commit 80cca8f6b32da2bd3c38e48d12aedf37218b285e Merge: 7e37b2cdb37bcc1c64ef726986e6e3efc8b25145 8a672bad12d08013ba3242ba457e790a49bbfe00 Author: ankitg ankitatbits@gmail.com Date: Fri Jun 25 09:46:33 2010 +0530
Merge branch 'visualbuilder'
commit 8a672bad12d08013ba3242ba457e790a49bbfe00 Author: ankitg ankitatbits@gmail.com Date: Fri Jun 25 09:46:08 2010 +0530
history tab few changes
commit 7e37b2cdb37bcc1c64ef726986e6e3efc8b25145 Merge: ca3a49dfcff833168de8584cdd659ca6cc01b5d0 f3d9b75c3503d87aff57d02feef7736bbbca98de Author: ankitg ankitatbits@gmail.com Date: Fri Jun 25 09:33:40 2010 +0530
Merge branch 'visualbuilder'
commit f3d9b75c3503d87aff57d02feef7736bbbca98de Author: ankitg ankitatbits@gmail.com Date: Wed Jun 23 11:39:52 2010 +0530
initalized h_tabs
commit bc910761d6cd48a40c91bb8af38ae9402ad18c63 Author: ankitg ankitatbits@gmail.com Date: Wed Jun 23 11:19:23 2010 +0530
.js file added for history
commit 2c80a5023bb8d7b21e5f2f955e5a70ae6119deb4 Author: ankitg ankitatbits@gmail.com Date: Wed Jun 23 11:15:16 2010 +0530
added new images for history
commit ca3a49dfcff833168de8584cdd659ca6cc01b5d0 Author: ankitg ankitatbits@gmail.com Date: Wed Jun 23 11:01:48 2010 +0530
.js file for history tab operatoins
commit dea405cfc3379c8e8e91e4b2446c63fdee16c8c0 Author: ankitg ankitatbits@gmail.com Date: Wed Jun 23 10:49:15 2010 +0530
CSS for history tab
commit 12af64757baf59b9b00c4895cc3a9dc7902a567b Author: ankitg ankitatbits@gmail.com Date: Wed Jun 9 22:53:13 2010 +0530
options added in designer
commit 58a2724c315f49f34ce503fc168b2a594e256a14 Author: ankitg ankitatbits@gmail.com Date: Wed Jun 9 22:49:29 2010 +0530
link in query tab
commit d8af30ca5c2fc0e726eaee986757db9bb79f474f Merge: 701b93f3520d39cbca9a0be09eea06619fe2b0d1 b5b75a4bf19214431b528dbc52ec7510db901cf6 Author: ankitg ankitatbits@gmail.com Date: Tue Jun 8 12:43:28 2010 +0530
Merge git://repo.or.cz/phpmyadmin
commit 701b93f3520d39cbca9a0be09eea06619fe2b0d1 Merge: c3eb6f389bfb84eebe6d2bfe27c45091af31eefd 7a9dd2bcd25e68253e327d93fce65d1735c016d4 Author: ankitg ankitatbits@gmail.com Date: Sat Jun 5 13:11:18 2010 +0530
Merge git://repo.or.cz/phpmyadmin
commit c3eb6f389bfb84eebe6d2bfe27c45091af31eefd Merge: 667dc8417702c4f13783e4e51c18f80c1afe5b32 d14a5a8dc0cef4bfccb9065b1a435bb4e23b981c Author: ankitg ankitatbits@gmail.com Date: Tue May 25 22:26:37 2010 +0530
Merge branch 'master' of ssh://repo.or.cz/srv/git/phpmyadmin/ankitg
commit d14a5a8dc0cef4bfccb9065b1a435bb4e23b981c Author: ankitg ankitatbits@gmail.com Date: Sat May 22 15:30:59 2010 +0530
first commit
-----------------------------------------------------------------------
Summary of changes: ChangeLog | 7 +- Documentation.html | 6 + db_qbe.php | 23 + js/messages.php | 3 + .../img/b_chart.png => pmd/images/and_icon.png | Bin 3118 -> 3539 bytes pmd/images/or_icon.png | Bin 0 -> 50345 bytes pmd/images/query_builder.png | Bin 0 -> 49112 bytes pmd/scripts/history.js | 765 ++++++++++++++++++++ pmd/scripts/move.js | 182 +++++- pmd/styles/default/images/minus.png | Bin 0 -> 48703 bytes pmd/styles/default/images/plus.png | Bin 0 -> 48663 bytes pmd/styles/default/style1.css | 203 ++++++ pmd_common.php | 6 +- pmd_general.php | 450 +++++++++++- 14 files changed, 1630 insertions(+), 15 deletions(-) copy themes/original/img/b_chart.png => pmd/images/and_icon.png (75%) create mode 100644 pmd/images/or_icon.png create mode 100644 pmd/images/query_builder.png create mode 100644 pmd/scripts/history.js create mode 100644 pmd/styles/default/images/minus.png create mode 100644 pmd/styles/default/images/plus.png create mode 100644 readme
diff --git a/ChangeLog b/ChangeLog index 73375bf..0a10389 100644 --- a/ChangeLog +++ b/ChangeLog @@ -113,12 +113,13 @@ - bug #3056610 [interface] Removed modification options for information_schema + patch #3055886 [config] Add Left frame table filter visibility config option, thanks to eesau - [core] Force generating of new session on login -- rfe #1105678 [interface] Drop page-break-before as it is useless for smaller ++ rfe #1105678 [interface] Drop page-break-before as it is useless for smaller tables. -- rfe #2956556 [interface] Allow to wrap enum values. ++ rfe #2956556 [interface] Allow to wrap enum values. - bug #1669459 [interface] Do not automatically mark PDF schema rows to delete - bug #3087682 [interface] Do not apply LeftFrameDBSeparator on first character. -- rfe #3111455 [interface] Column highlighting and marking in table view ++ rfe #3111455 [interface] Column highlighting and marking in table view ++ Visual query builder
3.3.9.0 (not yet released) - bug [doc] Fix references to MySQL doc diff --git a/Documentation.html b/Documentation.html index e96044b..f6235e7 100644 --- a/Documentation.html +++ b/Documentation.html @@ -4834,6 +4834,12 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA <li>BLOBstreaming support with PBMS PHP extension</li> </ul></li>
+<li>Ankit Gupta (Google Summer of Code 2010) +<ul> + <li>Visual query builder</li> +</ul></li> + + </ul>
<p> diff --git a/db_qbe.php b/db_qbe.php index a8aeb42..daaba0d 100644 --- a/db_qbe.php +++ b/db_qbe.php @@ -163,6 +163,29 @@ function showColumnSelectCell($columns, $column_number, $selected = '') }
?> +<?php if (!empty($tab_designer['link'])) { + $tab_designer['link'] = htmlentities($tab_designer['link']); + $tab_designer['link'] = $tab_designer['link'] . PMA_generate_common_url($url_params); + if (! empty($tab_designer['args'])) { + foreach ($tab_designer['args'] as $param => $value) { + $tab_designer['link'] .= PMA_get_arg_separator('html') . urlencode($param) . '=' + . urlencode($value); + } + } + } + if (! empty($tab['fragment'])) { + $tab['link'] .= $tab['fragment']; + } +?> +<div class="notice"> + <span id="footnote_1"> + Switch to + <form action="<?php echo $tab_designer['link'] ?>" method="post"> + <input type="submit" style="background-color:#FFD; border-width:0; color:#00F; + font-size: 15px;cursor: pointer" name="query" onmouseover="this.style.color='#F00';" + value="visual builder" onmouseout="this.style.color='#00F'"/></span> + </form> +</div> <form action="db_qbe.php" method="post"> <fieldset> <table class="data" style="width: 100%;"> diff --git a/js/messages.php b/js/messages.php index c034d74..761f810 100644 --- a/js/messages.php +++ b/js/messages.php @@ -94,6 +94,9 @@ $js_messages['strSelectForeignKey'] = __('Select Foreign Key'); $js_messages['strPleaseSelectPrimaryOrUniqueKey'] = __('Please select the primary key or a unique key'); $js_messages['strChangeDisplay'] = __('Choose column to display');
+/* Visual query builder (pmd/scripts/move.js) */ +$js_messages['strAddOption'] = __('Add an option for column '); + /* password generation */ $js_messages['strGeneratePassword'] = __('Generate password'); $js_messages['strGenerate'] = __('Generate'); diff --git a/themes/original/img/b_chart.png b/pmd/images/and_icon.png similarity index 75% copy from themes/original/img/b_chart.png copy to pmd/images/and_icon.png index 388ec30..bb51726 100644 Binary files a/themes/original/img/b_chart.png and b/pmd/images/and_icon.png differ diff --git a/pmd/images/or_icon.png b/pmd/images/or_icon.png new file mode 100644 index 0000000..fa76f3b Binary files /dev/null and b/pmd/images/or_icon.png differ diff --git a/pmd/images/query_builder.png b/pmd/images/query_builder.png new file mode 100644 index 0000000..6d0f554 Binary files /dev/null and b/pmd/images/query_builder.png differ diff --git a/pmd/scripts/history.js b/pmd/scripts/history.js new file mode 100644 index 0000000..ace5bae --- /dev/null +++ b/pmd/scripts/history.js @@ -0,0 +1,765 @@ +/* vim: set expandtab sw=4 ts=4 sts=4: */ +/** + * @fileoverview function used in this file builds history tab and generates query. + * + * @requires jQuery + * @requires moves.js + * @version $Id$ + */ + +var history_array = []; // Global array to store history objects +var select_field = []; // Global array to store informaation for columns which are used in select clause +var g_index; + +/** + * function for panel, hides and shows toggle_container <div>,which is for history elements uses {@link JQuery}. + * + * @param index has value 1 or 0,decides wheter to hide toggle_container on load. +**/ + +function panel(index) { + if (!index) { + $(".toggle_container").hide(); + } + $("h2.tiger").click(function(){ + $(this).toggleClass("active").next().slideToggle("slow"); + }); +} + +/** + * Sorts history_array[] first,using table name as the key and then generates the HTML code for history tab, + * clubbing all objects of same tables together + * This function is called whenever changes are made in history_array[] + * + * @uses and_or() + * @uses history_edit() + * @uses history_delete() + * + * @param {int} init starting index of unsorted array + * @param {int} final last index of unsorted array + * +**/ + +function display(init,final) { + var str,i,j,k,sto; + // this part sorts the history array based on table name,this is needed for clubbing all object of same name together. + for (i = init;i < final;i++) { + sto = history_array[i]; + var temp = history_array[i].get_tab() ;//+ '.' + history_array[i].get_obj_no(); for Self JOINS + for(j = 0;j < i;j++){ + if(temp > (history_array[j].get_tab())) {//+ '.' + history_array[j].get_obj_no())) { //for Self JOINS + for(k = i;k > j;k--) { + history_array[k] = history_array[k-1]; + } + history_array[j] = sto; + break; + } + } + } + // this part generates HTML code for history tab.adds delete,edit,and/or and detail features with objects. + str =''; // string to store Html code for history tab + for ( var i=0; i < history_array.length; i++){ + var temp = history_array[i].get_tab(); //+ '.' + history_array[i].get_obj_no(); for Self JOIN + str += '<h2 class="tiger"><a href="#">' + temp + '</a></h2>'; + str += '<div class="toggle_container">\n'; + while((history_array[i].get_tab()) == temp) { //+ '.' + history_array[i].get_obj_no()) == temp) { + str +='<div class="block"> <table width ="250">'; + str += '<thead><tr><td>'; + if(history_array[i].get_and_or()){ + str +='<img src="pmd/images/or_icon.png" onclick="and_or('+i+')" title="OR"/></td>'; + } + else { + str +='<img src="pmd/images/and_icon.png" onclick="and_or('+i+')" title="AND"/></td>'; + } + str +='<td style="padding-left: 5px;" align="right"><img src="./themes/original/img/b_sbrowse.png" title="column name"/></td><td width="175" style="padding-left: 5px">' + history_array[i].get_column_name(); + if (history_array[i].get_type() == "GroupBy" || history_array[i].get_type() == "OrderBy") { + str += '</td><td align="center"><img src="themes/original/img/b_info.png" title="'+detail(i)+'"/><td title="' + detail(i) +'">' + history_array[i].get_type() + '</td></td><td onmouseover="this.className='history_table';" onmouseout="this.className='history_table2'" onclick=history_delete('+ i +')><img src="themes/original/img/b_drop.png" title="Delete"></td></tr></thead>'; + } + else { + str += '</td><td align="center"><img src="themes/original/img/b_info.png" title="'+detail(i)+'"/></td><td title="' + detail(i) +'">' + history_array[i]. get_type() + '</td><td <td onmouseover="this.className='history_table';" onmouseout="this.className='history_table2'" onclick=history_edit('+ i +')><img src="themes/original/img/b_edit.png" title="Edit"/></td><td onmouseover="this.className='history_table';" onmouseout="this.className='history_table2'" onclick=history_delete('+ i +')><img src="themes/original/img/b_drop.png" title="Delete"></td></tr></thead>'; + } + i++; + if(i >= history_array.length) { + break; + } + str += '</table></div><br/>'; + } + i--; + str += '</div><br/>'; + } + return str; +} + +/** + * To change And/Or relation in history tab + * + * @uses panel() + * + * @param {int} index of history_array where change is to be made + * +**/ + +function and_or(index) { + if (history_array[index].get_and_or()) { + history_array[index].set_and_or(0); + } + else { + history_array[index].set_and_or(1); + } + var existingDiv = document.getElementById('ab'); + existingDiv.innerHTML = display(0,0); + panel(1); +} + +/** + * To display details of obects(where,rename,Having,aggregate,groupby,orderby,having) + * + * @param index index of history_array where change is to be made + * +**/ + +function detail (index) { + var type = history_array[index].get_type(); + var str; + if (type == "Where") { + str = 'Where ' + history_array[index].get_column_name() + history_array[index].get_obj().getrelation_operator() + history_array[index].get_obj().getquery(); + } + if (type == "Rename") { + str = 'Rename ' + history_array[index].get_column_name() + ' To ' + history_array[index].get_obj().getrename_to(); + } + if (type == "Aggregate") { + str = 'Select ' + history_array[index].get_obj().get_operator() + '( ' + history_array[index].get_column_name() + ' )'; + } + if (type == "GroupBy") { + str = 'GroupBy ' + history_array[index].get_column_name() ; + } + if (type == "OrderBy") { + str = 'OrderBy ' + history_array[index].get_column_name() ; + } + if (type == "Having") { + str = 'Having '; + if (history_array[index].get_obj().get_operator() != 'None') { + str += history_array[index].get_obj().get_operator() + '( ' + history_array[index].get_column_name() + ' )'; + str += history_array[index].get_obj().getrelation_operator() + history_array[index].get_obj().getquery(); + } + else { + str = 'Having ' + history_array[index].get_column_name() + history_array[index].get_obj().getrelation_operator() + history_array[index].get_obj().getquery(); + } + } + return str; +} + +/** + * Deletes entry in history_array + * + * @uses panel() + * @uses display() + * @param index index of history_array[] which is to be deleted + * +**/ + +function history_delete(index) { + for(var k =0 ;k < from_array.length;k++){ + if(from_array[k] == history_array[index].get_tab()){ + from_array.splice(k,1); + break; + } + } + history_array.splice(index,1); + var existingDiv = document.getElementById('ab'); + existingDiv.innerHTML = display(0,0); + panel(1); +} + +/** + * To show where,rename,aggregate,having forms to edit a object + * + * @param{int} index index of history_array where change is to be made + * +**/ + +function history_edit(index) { + g_index = index; + var type = history_array[index].get_type(); + if (type == "Where") { + document.getElementById('eQuery').value = history_array[index].get_obj().getquery(); + document.getElementById('erel_opt').value = history_array[index].get_obj().getrelation_operator(); + document.getElementById('query_where').style.left = '530px'; + document.getElementById('query_where').style.top = '130px'; + document.getElementById('query_where').style.position = 'absolute'; + document.getElementById('query_where').style.zIndex = '9'; + document.getElementById('query_where').style.visibility = 'visible'; + } + if (type == "Having") { + document.getElementById('hQuery').value = history_array[index].get_obj().getquery(); + document.getElementById('hrel_opt').value = history_array[index].get_obj().getrelation_operator(); + document.getElementById('hoperator').value = history_array[index].get_obj().get_operator(); + document.getElementById('query_having').style.left = '530px'; + document.getElementById('query_having').style.top = '130px'; + document.getElementById('query_having').style.position = 'absolute'; + document.getElementById('query_having').style.zIndex = '9'; + document.getElementById('query_having').style.visibility = 'visible'; + } + if (type == "Rename") { + document.getElementById('query_rename_to').style.left = '530px'; + document.getElementById('query_rename_to').style.top = '130px'; + document.getElementById('query_rename_to').style.position = 'absolute'; + document.getElementById('query_rename_to').style.zIndex = '9'; + document.getElementById('query_rename_to').style.visibility = 'visible'; + } + if (type == "Aggregate") { + document.getElementById('query_Aggregate').style.left = '530px'; + document.getElementById('query_Aggregate').style.top = '130px'; + document.getElementById('query_Aggregate').style.position = 'absolute'; + document.getElementById('query_Aggregate').style.zIndex = '9'; + document.getElementById('query_Aggregate').style.visibility = 'visible'; + } +} + +/** + * Make changes in history_array when Edit button is clicked + * checks for the type of object and then sets the new value + * @uses panel() + * @uses display() + * + * @param index index of history_array where change is to be made +**/ + +function edit(type) { + if (type == "Rename") { + if (document.getElementById('e_rename').value != "") { + history_array[g_index].get_obj().setrename_to(document.getElementById('e_rename').value); + document.getElementById('e_rename').value = ""; + } + document.getElementById('query_rename_to').style.visibility = 'hidden'; + } + if (type == "Aggregate") { + if (document.getElementById('e_operator').value != '---') { + history_array[g_index].get_obj().set_operator(document.getElementById('e_operator').value); + document.getElementById('e_operator').value = '---'; + } + document.getElementById('query_Aggregate').style.visibility = 'hidden'; + } + if (type == "Where") { + if (document.getElementById('erel_opt').value != '--' && document.getElementById('eQuery').value !="") { + history_array[g_index].get_obj().setquery(document.getElementById('eQuery').value); + history_array[g_index].get_obj().setrelation_operator(document.getElementById('erel_opt').value); + } + document.getElementById('query_where').style.visibility = 'hidden'; + } + if (type == "Having") { + if (document.getElementById('hrel_opt').value != '--' && document.getElementById('hQuery').value !="") { + history_array[g_index].get_obj().setquery(document.getElementById('hQuery').value); + history_array[g_index].get_obj().setrelation_operator(document.getElementById('hrel_opt').value); + history_array[g_index].get_obj().set_operator(document.getElementById('hoperator').value); + } + document.getElementById('query_having').style.visibility = 'hidden'; + } + var existingDiv = document.getElementById('ab'); + existingDiv.innerHTML = display(0,0); + panel(1); +} + +/** + * history object closure + * + * @param ncolumn_name name of the column on which conditions are put + * @param nobj object details(where,rename,orderby,groupby,aggregate) + * @param ntab table name of the column on which conditions are applied + * @param nobj_no object no used for inner join + * @param ntype type of object + * +**/ + +function history(ncolumn_name,nobj,ntab,nobj_no,ntype) { + var and_or; + var obj; + var tab; + var column_name; + var obj_no; + var type; + this.set_column_name = function (ncolumn_name) { + column_name = ncolumn_name; + }; + this.get_column_name = function() { + return column_name; + }; + this.set_and_or = function(nand_or) { + and_or = nand_or; + }; + this.get_and_or = function() { + return and_or; + } + this.get_relation = function() { + return and_or; + }; + this.set_obj = function(nobj) { + obj = nobj; + }; + this.get_obj = function() { + return obj; + }; + this.set_tab = function(ntab) { + tab = ntab; + }; + this.get_tab = function() { + return tab; + }; + this.set_obj_no = function(nobj_no) { + obj_no = nobj_no; + }; + this.get_obj_no = function() { + return obj_no; + }; + this.set_type = function(ntype) { + type = ntype; + } + this.get_type = function() { + return type; + } + this.set_obj_no(nobj_no); + this.set_tab(ntab); + this.set_and_or(0); + this.set_obj(nobj); + this.set_column_name(ncolumn_name); + this.set_type(ntype); +}; + +/** + * where object closure, makes an object with all information of where + * + * @param nrelation_operator type of relation operator to be applied + * @param nquery stores value of value/sub-query + * +**/ + + +var where = function (nrelation_operator,nquery) { + var relation_operator; + var query; + this.setrelation_operator = function(nrelation_operator) { + relation_operator = nrelation_operator; + }; + this.setquery = function(nquery) { + query = nquery; + }; + this.getquery = function() { + return query; + }; + this.getrelation_operator = function() { + return relation_operator; + }; + this.setquery(nquery); + this.setrelation_operator(nrelation_operator); +}; + + +/** + * Having object closure, makes an object with all information of where + * + * @param nrelation_operator type of relation operator to be applied + * @param nquery stores value of value/sub-query + * +**/ + +var having = function (nrelation_operator,nquery,noperator) { + var relation_operator; + var query; + var operator; + this.set_operator = function(noperator) { + operator = noperator; + }; + this.setrelation_operator = function(nrelation_operator) { + relation_operator = nrelation_operator; + }; + this.setquery = function(nquery) { + query = nquery; + }; + this.getquery = function() { + return query; + }; + this.getrelation_operator = function() { + return relation_operator; + }; + this.get_operator = function() { + return operator; + }; + this.setquery(nquery); + this.setrelation_operator(nrelation_operator); + this.set_operator(noperator); +}; + +/** + * rename object closure,makes an object with all information of rename + * + * @param nrename_to new name information + * +**/ + +var rename = function(nrename_to) { + var rename_to; + this.setrename_to = function(nrename_to) { + rename_to = nrename_to; + }; + this.getrename_to =function() { + return rename_to; + }; + this.setrename_to(nrename_to); +}; + +/** + * aggregate object closure + * + * @param noperator aggregte operator + * +**/ + +var aggregate = function(noperator) { + var operator; + this.set_operator = function(noperator) { + operator = noperator; + }; + this.get_operator = function() { + return operator; + }; + this.set_operator(noperator); +}; + +/** + * This function returns unique element from an array + * + * @param arraName array from which duplicate elem are to be removed. + * @return unique array + */ + +function unique(arrayName) { + var newArray=new Array(); + label:for(var i=0; i<arrayName.length;i++ ) + { + for(var j=0; j<newArray.length;j++ ) + { + if(newArray[j]==arrayName[i]) + continue label; + } + newArray[newArray.length] = arrayName[i]; + } + return newArray; +} + +/** + * This function takes in array and a value as input and returns 1 if values is present in array + * else returns -1 + * + * @param arrayName array + * @param value value which is to be searched in the array + */ + +function found(arrayName,value) { + for(var i=0; i<arrayName.length; i++) { + if(arrayName[i] == value) { return 1;} + } + return -1; +} + +/** + * This function is the main function for query building. + * uses history object details for this. + * + * @ uses query_where() + * @ uses query_groupby() + * @ uses query_having() + * @ uses query_orderby() + * + * @param formtitle title for the form + * @param fadin + */ + +function build_query(formtitle, fadin) { + var q_select = "SELECT "; + var temp; + for(i = 0;i < select_field.length; i++) { + temp = check_aggregate(select_field[i]); + if (temp != "") { + q_select += temp; + temp = check_rename(select_field[i]); + q_select += temp + ","; + } + else { + temp = check_rename(select_field[i]); + q_select += select_field[i] + temp +","; + } + } + q_select = q_select.substring(0,q_select.length - 1); + q_select += " FROM " + query_from(); + if(query_where() != "") { + q_select +="\n WHERE"; + q_select += query_where(); + } + if(query_groupby() != "") { q_select += "\nGROUP BY " + query_groupby(); } + if(query_having() != "") { q_select += "\nHAVING " + query_having(); } + if(query_orderby() != "") { q_select += "\nORDER BY " + query_orderby(); } + var box = document.getElementById('box'); + document.getElementById('filter').style.display='block'; + var btitle = document.getElementById('boxtitle'); + btitle.innerHTML = 'SELECT';//formtitle; + if(fadin){ + gradient("box", 0); + fadein("box"); + } + else{ + box.style.display='block'; + } + document.getElementById('textSqlquery').innerHTML = q_select; +} + /** + * This function builds from clause of query + * makes automatic joins. + * + * @uses unique + * @uses add_array + * @uses remove_array + * + */ + + +function query_from() { + var i =0; + var tab_left = []; + var tab_used = []; + var t_tab_used = []; + var t_tab_left = []; + var temp; + var query = ""; + var quer = ""; + var parts = []; + var t_array = []; + t_array = from_array; + var K = 0; + for(i; i < history_array.length ; i++) { + from_array.push(history_array[i].get_tab()); + } + from_array = unique( from_array ); + tab_left = from_array; + temp = tab_left.shift(); + quer = temp; + tab_used.push(temp); + // if master table (key2) matches with tab used get all keys and check if tab_left matches + //after this check if master table (key2) matches with tab left then check if any foriegn matches with master . + for( i =0; i<2 ; i++) { + for (K in contr){ + for (key in contr[K]){// contr name + for (key2 in contr[K][key]){// table name + parts = key2.split("."); + if(found(tab_used,parts[1]) > 0) { + for (key3 in contr[K][key][key2]) { + parts1 = contr[K][key][key2][key3][0].split("."); + if(found(tab_left,parts1[1]) > 0) { + query += "\n" + 'LEFT JOIN '; + query += '`' + parts1[0] + '`.`' + parts1[1] + '` ON ' ; + query += '`' + parts[1] +'`.`' + key3 + '` = '; + query += '`' + parts1[1] + '`.`' + contr[K][key][key2][key3][1] + '` '; + t_tab_left.push(parts1[1]); + } + } + } + } + } + } + K = 0; + t_tab_left = unique (t_tab_left); + tab_used = add_array(t_tab_left,tab_used); + tab_left = remove_array(t_tab_left,tab_left); + t_tab_left = []; + for (K in contr) { + for (key in contr[K]) { + for (key2 in contr[K][key]){// table name + parts = key2.split("."); + if(found(tab_left,parts[1]) > 0){ + for (key3 in contr[K][key][key2]){ + parts1 = contr[K][key][key2][key3][0].split("."); + if(found(tab_used,parts1[1]) > 0) { + query += "\n" + 'LEFT JOIN '; + query += '`' + parts[0] + '`.`' + parts[1] + '` ON ' ; + query += '`' + parts1[1] + '`.`' + contr[K][key][key2][key3][1] + '` = '; + query += '`' + parts[1] + '`.`' + key3 + '` '; + t_tab_left.push(parts[1]); + } + } + } + } + } + } + t_tab_left = unique (t_tab_left); + tab_used = add_array(t_tab_left,tab_used); + tab_left = remove_array(t_tab_left,tab_left); + t_tab_left = []; + } + for (k in tab_left) { + quer += " , `" + tab_left[k] + "`"; + } + query = quer + query; + from_array = t_array; + return query; +} + /* document.write(key3+";"); //master_field + document.write(contr[K][key][key2][key3][0]+";"); // foreign_table + document.write(contr[K][key][key2][key3][1]+";"); //forieign_feild */ +/** + * This function concatenates two array + * + * @params add array elements of which are pushed in + * @params arr array in which elemnets are added + */ +function add_array(add,arr){ + for( var i=0; i<add.length; i++){ + arr.push(add[i]); + } + return arr; +} + +/* This fucntion removes all elements present in one array from the other. + * + * @params rem array from which each element is removed from other array. + * @params arr array from which elements are removed. + * + */ +function remove_array(rem,arr){ + for(var i=0; i<rem.length; i++){ + for(var j=0; j<arr.length; j++) + if(rem[i] == arr[j]) { arr.splice(j,1); } + } + return arr; +} + +/** + * This function builds the groupby clause from history object + * + */ + +function query_groupby() { + var i = 0; + var str = ""; + for(i; i < history_array.length;i++) { + if(history_array[i].get_type() == "GroupBy") { str +=history_array[i].get_column_name() + ", ";} + } + str = str.substr(0,str.length -1); + return str; +} + +/** + * This function builds the Having clause from the history object. + * + */ + +function query_having() { + var i = 0; + var and = "("; + for(i; i < history_array.length;i++) { + if(history_array[i].get_type() == "Having") { + if (history_array[i].get_obj().get_operator() != 'None') { + and += history_array[i].get_obj().get_operator() + "(" + history_array[i].get_column_name() + " ) " + history_array[i].get_obj().getrelation_operator(); + and += " " + history_array[i].get_obj().getquery() + ", " ; + } + else { + and += history_array[i].get_column_name() + " " + history_array[i].get_obj().getrelation_operator() + " " + history_array[i].get_obj().getquery() + ", "; + } + } + } + if (and =="(") { and = "" ;} + else { and = and.substr(0,and.length -2) + ")";} + return and; +} + + +/** + * This function builds the orderby clause from the history object. + * + */ + +function query_orderby() { + var i = 0; + var str = "" ; + for(i; i < history_array.length;i++) { + if(history_array[i].get_type() == "OrderBy") { str += history_array[i].get_column_name() + " , "; } + } + str = str.substr(0,str.length -1); + return str; +} + + +/** + * This function builds the Where clause from the history object. + * + */ + +function query_where(){ + var i = 0; + var and = "("; + var or = "("; + for(i; i < history_array.length;i++) { + if(history_array[i].get_type() == "Where") { + if(history_array[i].get_and_or() == 0) { + and += "( " + history_array[i].get_column_name() + " " + history_array[i].get_obj().getrelation_operator() +" " + history_array[i].get_obj().getquery() + ")"; and += " AND "; + } + else { + or +="( " + history_array[i].get_column_name() + " " + history_array[i].get_obj().getrelation_operator() + " " + history_array[i].get_obj().getquery() +")"; + or +=" OR " ; + } + } + } + if ( or != "(") { or = or.substring(0,(or.length - 4 )) + ")"; } + else { or = "" ;} + if (and !="(") {and = and.substring(0,(and.length - 5)) + ")"; } + else {and = "" ;} + if ( or != "" ) { and = and + " OR " + or + " )"; } + return and; +} + +function check_aggregate(id_this) { + var i = 0; + for(i;i < history_array.length;i++) { + var temp = '`' + history_array[i].get_tab() + '`.`' +history_array[i].get_column_name() +'`'; + if(temp == id_this && history_array[i].get_type() == "Aggregate") { + return history_array[i].get_obj().get_operator() + '(' + id_this +')'; + } + } + return ""; +} + +function check_rename(id_this) { + var i = 0; + for (i;i < history_array.length;i++) { + var temp = '`' + history_array[i].get_tab() + '`.`' +history_array[i].get_column_name() +'`'; + if(temp == id_this && history_array[i].get_type() == "Rename") { + return " AS `" + history_array[i].get_obj().getrename_to() +"`"; + } + } + return ""; +} + +function gradient(id, level) +{ + var box = document.getElementById(id); + box.style.opacity = level; + box.style.MozOpacity = level; + box.style.KhtmlOpacity = level; + box.style.filter = "alpha(opacity=" + level * 100 + ")"; + box.style.display="block"; + return; +} + + +function fadein(id) +{ + var level = 0; + while(level <= 1){ + setTimeout( "gradient('" + id + "'," + level + ")", (level* 1000) + 10); + level += 0.01; + } +} + +function closebox() +{ + document.getElementById('box').style.display='none'; + document.getElementById('filter').style.display='none'; +} diff --git a/pmd/scripts/move.js b/pmd/scripts/move.js index 93180cb..b2f99ee 100644 --- a/pmd/scripts/move.js +++ b/pmd/scripts/move.js @@ -32,6 +32,8 @@ var timeoutID; var layer_menu_cur_click = 0; var step = 10; var old_class; +var from_array = []; +var downer;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------ @@ -620,7 +622,6 @@ function Small_tab(t, re_load) var id = document.getElementById('id_tbody_' + t); var id_this = document.getElementById('id_hide_tbody_' + t); var id_t = document.getElementById(t); - id_t.style.width = id_t.offsetWidth + 'px'; if (id_this.innerHTML == "v") { //---CROSS @@ -646,7 +647,6 @@ function Select_tab(t) //---------- var id_t = document.getElementById(t); window.scrollTo(parseInt(id_t.style.left) - 300, parseInt(id_t.style.top) - 300); - setTimeout(function(){document.getElementById('id_zag_' + t).className = 'tab_zag';}, 800); } //------------------------------------------------------------------------------ @@ -964,3 +964,181 @@ function getColorByTarget( target )
return color; } + +function Click_option(id_this,column_name,table_name) +{ + var left = Glob_X - (document.getElementById(id_this).offsetWidth>>1); + document.getElementById(id_this).style.left = left + 'px'; + // var top = Glob_Y - document.getElementById(id_this).offsetHeight - 10; + document.getElementById(id_this).style.top = (screen.height / 4) + 'px'; + document.getElementById(id_this).style.visibility = "visible"; + document.getElementById('option_col_name').innerHTML = '<strong>' + PMA_messages['strAddOption'] +'"' +column_name+ '"</strong>'; + col_name = column_name; + tab_name = table_name; +} + +function Close_option() +{ + document.getElementById('pmd_optionse').style.visibility = "hidden"; +} + +function Select_all(id_this,owner) +{ + var parent= document.form1; + downer =owner; + var i; + var tab = []; + for(i = 0; i < parent.elements.length; i++) { + if (parent.elements[i].type == "checkbox" && parent.elements[i].id.substring(0,(9 + id_this.length)) == 'select_' + id_this + '._') { + if(document.getElementById('select_all_' + id_this).checked == true) { + parent.elements[i].checked = true; + parent.elements[i].disabled = true; + var temp = '`' + id_this.substring(owner.length +1) + '`.*'; + } + else { + parent.elements[i].checked = false; + parent.elements[i].disabled = false; + } + } + } + if(document.getElementById('select_all_' + id_this).checked == true) { + select_field.push('`' + id_this.substring(owner.length +1) + '`.*'); + tab = id_this.split("."); + from_array.push(tab[1]); + } + else { + for (i =0; i < select_field.length; i++) { + if (select_field[i] == ('`' + id_this.substring(owner.length +1) + '`.*')) { + select_field.splice(i,1); + } + } + for(k =0 ;k < from_array.length;k++){ + if(from_array[k] == id_this){ + from_array.splice(k,1); + break; + } + } + } + Re_load(); +} + +function Table_onover(id_this,val,buil) +{ + if(!val) { + document.getElementById("id_zag_" + id_this).className="tab_zag_2"; + if(buil) { + document.getElementById("id_zag_" + id_this + "_2").className="tab_zag_2"; + } + } + else { + document.getElementById("id_zag_" + id_this).className="tab_zag"; + if(buil) { + document.getElementById("id_zag_" + id_this + "_2").className="tab_zag"; + } + } +} + +/* This function stores selected column information in select_field[] + * In case column is checked it add else it deletes + * + */ +function store_column(id_this,owner,col) { + var i = 0; + var k = 0; + if (document.getElementById('select_' + owner + '.' + id_this + '._' + col).checked == true) { + select_field.push('`' + id_this + '`.`' + col +'`'); + from_array.push(id_this); + } + else { + for(i; i < select_field.length ;i++) { + if (select_field[i] == ('`' + id_this + '`.`' + col +'`')) { + select_field.splice(i,1); + break; + } + } + for(k =0 ;k < from_array.length;k++){ + if(from_array[k] == id_this){ + from_array.splice(k,1); + break; + } + } + } +} + +/** + * This function builds object and adds them to history_array + * first it does a few checks on each object, then makes an object(where,rename,groupby,aggregate,orderby) + * then a new history object is made and finally all these history objects are addded to history_array[] + * + * @uses where() + * @uses history() + * @uses aggregate() + * @uses rename() + * @uses panel() + * @uses display() +**/ + +function add_object() { + var rel = document.getElementById('rel_opt'); + var sum = 0; + var init = history_array.length; + if (rel.value != '--') { + if (document.getElementById('Query').value == "") { + document.getElementById('hint').innerHTML = "value/subQuery is empty" ; + document.getElementById('hint').style.visibility = "visible"; + return; + } + var p = document.getElementById('Query'); + var where_obj = new where(rel.value,p.value);//make where object + history_array.push(new history(col_name,where_obj,tab_name,h_tabs[downer + '.' + tab_name],"Where")); + sum = sum + 1; + rel.value = '--'; + p.value = ""; + } + if (document.getElementById('new_name').value !="") { + var rename_obj = new rename(document.getElementById('new_name').value);//make Rename object + history_array.push(new history(col_name,rename_obj,tab_name,h_tabs[downer + '.' + tab_name],"Rename")); + sum = sum + 1; + document.getElementById('new_name').value = "" ; + } + if (document.getElementById('operator').value != '---') { + var aggregate_obj = new aggregate(document.getElementById('operator').value) ; + history_array.push(new history(col_name,aggregate_obj,tab_name,h_tabs[downer + '.' + tab_name],"Aggregate")); + sum = sum + 1; + document.getElementById('operator').value = '---'; + //make aggregate operator + } + if (document.getElementById('groupby').checked == true ) { + history_array.push(new history(col_name,'GroupBy',tab_name,h_tabs[downer + '.' +tab_name],"GroupBy")); + sum = sum + 1; + document.getElementById('groupby').checked = false; + //make groupby + } + if (document.getElementById('h_rel_opt').value != '--') { + if (document.getElementById('having').value == "") { + document.getElementById('hint').innerHTML = "value/subQuery is empty" ; + document.getElementById('hint').style.visibility = "visible"; + return; + } + var p = document.getElementById('having'); + var where_obj = new having(document.getElementById('h_rel_opt').value,p.value,document.getElementById('h_operator').value);//make where object + history_array.push(new history(col_name,where_obj,tab_name,h_tabs[downer + '.' + tab_name],"Having")); + sum = sum + 1; + document.getElementById('h_rel_opt').value = '--'; + document.getElementById('h_operator').value = '---'; + p.value = ""; //make having + } + if (document.getElementById('orderby').checked == true) { + history_array.push(new history(col_name,'OrderBy',tab_name,h_tabs[downer + '.' + tab_name],"OrderBy")); + sum = sum + 1; + document.getElementById('orderby').checked = false; + //make orderby + } + document.getElementById('hint').innerHTML = sum + "object created" ; + document.getElementById('hint').style.visibility = "visible"; + //output sum new objects created + var existingDiv = document.getElementById('ab'); + existingDiv.innerHTML = display(init,history_array.length); + Close_option(); + panel(0); +} diff --git a/pmd/styles/default/images/minus.png b/pmd/styles/default/images/minus.png new file mode 100644 index 0000000..cf72f39 Binary files /dev/null and b/pmd/styles/default/images/minus.png differ diff --git a/pmd/styles/default/images/plus.png b/pmd/styles/default/images/plus.png new file mode 100644 index 0000000..ebcd27d Binary files /dev/null and b/pmd/styles/default/images/plus.png differ diff --git a/pmd/styles/default/style1.css b/pmd/styles/default/style1.css index 129c8d3..eb3d690 100644 --- a/pmd/styles/default/style1.css +++ b/pmd/styles/default/style1.css @@ -146,6 +146,23 @@ form { color: #888888; }
+.option_tab { + padding-left: 2px; + padding-right: 2px; + width: 5px; +} + +.select_all { + vertical-align: top; + padding-left: 2px; + padding-right: 2px; + cursor: default; + width: 1px; + color: #000000; + background-image: url(images/Header.png); + background-repeat: repeat-x; +} + .small_tab { vertical-align: top; background-color: #0064ea; @@ -371,9 +388,195 @@ a.M_butt:hover { width: 153px; }
+#pmd_optionse { + position: absolute; + left: 636px; + top: 85px; + z-index: 1000; + width: 153px; +} + #layer_menu_sizer { background-image: url(../../images/resize.png); cursor: nw-resize; width: 16px; height: 16px; } + +.panel { +position: fixed; +top: 50px; +right: 0; +display: none; +background: #FFF; +border:1px solid #F5F5F5; +width: 350 px; +height: auto; +padding: 30px 170px 30px 30px; +color:#FFF; +z-index:99; +} + +a.trigger{ +position: fixed; +text-decoration: none; +top: 60px; right: 0; +font-size: 16px; +font-family: verdana, helvetica, arial, sans-serif; +color:#fff; +padding: 10px 40px 10px 15px; +font-weight: 700; +background:#333333 url(images/plus.png) 85% 55% no-repeat; +border:1px solid #444444; +display: block; +} + +a.trigger:hover{ +position: fixed; +text-decoration: none; +top: 60px; right: 0; +font-size: 16px; +font-family: verdana, helvetica, arial, sans-serif; +color:#080808; +padding: 10px 40px 10px 15px; +font-weight: 700; +background:#fff696 url(images/plus.png) 85% 55% no-repeat; +border:1px solid #999; +display: block; +} + +a.active.trigger { +background:#222222 url(images/minus.png) 85% 55% no-repeat; +z-index:999; +} + +a.active.trigger:hover { +background:#fff696 url(images/minus.png) 85% 55% no-repeat; +z-index:999; +} + +h2.tiger{ + background-repeat: repeat-x; + padding: 1px; + font-weight: bold; + font-size:14px; + padding: 50 20 50 20px; + margin: 0 0 5px 0; + width: 250px; + float: left; + color : #333; + text-align: center; +} + +h2.tiger a { + background-image: url(images/Header.png); + text-align: center; + text-decoration: none; + color : #333; + display: block; +} + +h2.tiger a:hover { + color: #000; + background-image: url(images/Header_Linked.png); +} + +h2.active { + background-image: url(images/Header.png); + background-repeat: repeat-x; + padding: 1px; + background-position: left bottom; +} + +.toggle_container { + margin: 0 0 5px; + padding: 0; + border-top: 1px solid #d6d6d6; + background: #FFF ; + width: 250px; + overflow: hidden; + font-size: 1.2em; + clear: both; +} + +.toggle_container .block { + background-color: #DBE4E8; + padding:40 15 40 15px; /*--Padding of Container--*/ + border:1px solid #999; + color:#000; +} + +.history_table { + text-align: center; + background-color: #9999CC; +} + +.history_table2 { + text-align: center; + background-color: #DBE4E8; +} + +#filter { + display: none; + position: absolute; + top: 0%; + left: 0%; + width: 100%; + height: 100%; + background-color: #CCA; + z-index:10; + opacity:0.5; + filter: alpha(opacity=50); +} + +#box { + display: none; + position: absolute; + top: 20%; + left: 30%; + width: 500px; + height: 220px; + padding: 48px; + margin:0; + border: 1px solid black; + background-color: white; + z-index:101; + overflow: visible; +} + +#boxtitle { + position:absolute; + float:center; + top:0; + left:0; + width:593px; + height:20px; + padding:0; + padding-top:4px; + left-padding:8px; + margin:0; + border-bottom:4px solid #3CF; + background-color: #D0DCE0; //#09c; + color:black; + font-weight:bold; + padding-left: 2px; + font-family:"Times New Roman", Times, serif; + font-size:16px; + text-align:left; +} + +#tblfooter { + background-color: D3DCE3; + float: right; + padding-top:10px; + color: black; + font-weight: normal; +} + +input.btn { + color:#333; + font: bold 84%'trebuchet ms',helvetica,sans-serif; + background-color: #D0DCE0; +} + + diff --git a/pmd_common.php b/pmd_common.php index 2cb2213..df8fdf2 100644 --- a/pmd_common.php +++ b/pmd_common.php @@ -237,11 +237,13 @@ function get_script_tabs() $script_tabs = '<script type="text/javascript">' . "\n" . '// <![CDATA[' . "\n" . - 'var j_tabs = new Array();' . "\n"; + 'var j_tabs = new Array();' . "\n" . + 'var h_tabs = new Array();' . "\n" ; for ($i = 0, $cnt = count($GLOBALS['PMD']['TABLE_NAME']); $i < $cnt; $i++) { $script_tabs .= "j_tabs['" . $GLOBALS['PMD_URL']['TABLE_NAME'][$i] . "'] = '" . (PMA_foreignkey_supported($GLOBALS['PMD']['TABLE_TYPE'][$i]) ? '1' : '0') . "';\n"; - } + $script_tabs .="h_tabs['" . $GLOBALS['PMD_URL']['TABLE_NAME'][$i] . "'] = 1;"."\n" ; + } $script_tabs .= '// ]]>' . "\n" . '</script>' . "\n"; diff --git a/pmd_general.php b/pmd_general.php index 90ed0a8..eb2e445 100644 --- a/pmd_general.php +++ b/pmd_general.php @@ -27,6 +27,7 @@ $hidden = "hidden"; <link rel="shortcut icon" href="pmd/images/favicon.ico" type="image/x-icon" /> <link rel="stylesheet" type="text/css" href="pmd/styles/<?php echo $GLOBALS['PMD']['STYLE'] ?>/style1.css" /> <title>Designer</title> + <script src="./js/jquery/jquery-1.4.2.js" type="text/javascript"></script> <script type="text/javascript"> // <![CDATA[ <?php @@ -34,8 +35,18 @@ echo ' var server = "' . PMA_escapeJsString($server) . '"; var db = "' . PMA_escapeJsString($db) . '"; var token = "' . PMA_escapeJsString($token) . '";'; + echo "\n"; + if($_REQUEST['query']) { + echo ' + $(document).ready(function(){ + $(".trigger").click(function(){ + $(".panel").toggle("fast"); + $(this).toggleClass("active"); + return false; + }); + });'; + } ?> - // ]]> </script> <?php @@ -47,7 +58,8 @@ require_once './libraries/header_scripts.inc.php'; ?> <script src="js/messages.php<?php echo PMA_generate_common_url($params); ?>" type="text/javascript"></script> <script src="pmd/scripts/ajax.js" type="text/javascript"></script> - <script src="pmd/scripts/move.js" type="text/javascript"></script> + <script src="pmd/scripts/history.js" type="text/javascript"></script> + <script src="pmd/scripts/move.js" type="text/javascript"></script> <!--[if IE]> <script src="pmd/scripts/iecanvas.js" type="text/javascript"></script> <![endif]--> @@ -98,11 +110,18 @@ echo $script_tabs . $script_contr . $script_display_field; class="M_butt" target="_self" ><img title="<?php echo __('Toggle small/big'); ?>" alt="key" src="pmd/images/bottom.png" /></a><img class="M_bord" src="pmd/images/bord.png" alt="" - /><a href="javascript:PDF_save();" onmousedown="return false;" + /><a href="javascript:PDF_save();" onmousedown="return false;" class="M_butt" target="_self" ><img src="pmd/images/pdf.png" alt="key" width="20" height="20" - title="<?php echo __('Import/Export coordinates for PDF schema'); ?>" /></a> - <a href="javascript:Top_menu_right(document.getElementById('key_Left_Right'));" + title="<?php echo __('Import/Export coordinates for PDF schema'); ?>" /></a + > + <?php if($_REQUEST['query']){ + echo '<a href="#" onClick="build_query(\'SQL Query on Database\', 0)" onmousedown="return false;" + class="M_butt" target="_self">'; + echo '<img src="pmd/images/query_builder.png" alt="key" width="20" height="20" title="'; + echo __('Build Query'); + echo '"/></a>'; }?> + <a href="javascript:Top_menu_right(document.getElementById('key_Left_Right'));" onmousedown="return false;" class="M_butt last" target="_self"> <img src="pmd/images/2rightarrow_m.png" id="key_Left_Right" alt=">" title="<?php echo __('Move Menu'); ?>" /></a> @@ -187,6 +206,13 @@ for ($i = 0; $i < count($GLOBALS['PMD']["TABLE_NAME"]); $i++) { "> <thead> <tr> + <?php + if(isset($_REQUEST['query'])) { + echo '<td class="select_all">'; + echo '<input type="checkbox" value="select_all_'.htmlspecialchars($t_n_url).'" style="margin: 0px;" '; + echo 'id="select_all_'.htmlspecialchars($t_n_url).'" title="select all" '; + echo 'onclick="Select_all(\''. htmlspecialchars($t_n_url) .'\',\''.htmlspecialchars($GLOBALS['PMD_OUT']["OWNER"][$i]).'\')"></td>'; + }?> <td class="small_tab" onmouseover="this.className='small_tab2';" onmouseout="this.className='small_tab';" id="id_hide_tbody_<?php echo $t_n_url ?>" @@ -204,15 +230,21 @@ for ($i = 0; $i < count($GLOBALS['PMD']["TABLE_NAME"]); $i++) { onclick="Start_tab_upd('<?php echo $GLOBALS['PMD_URL']["TABLE_NAME_SMALL"][$i]; ?>');"> <img src="pmd/images/exec_small.png" alt="" /></td> <td nowrap="nowrap" id="id_zag_<?php echo $t_n_url ?>" class="tab_zag" - onmousedown="cur_click=document.getElementById('<?php echo $t_n_url ?>');" - onmouseover="this.className = 'tab_zag_2'" - onmouseout="this.className = 'tab_zag'"> + onmousedown="cur_click=document.getElementById('<?php echo $t_n_url ?>');"/ + onmouseover="Table_onover('<?php echo $t_n_url ?>',0,<?php echo (isset($_REQUEST['query'])? 1 : 0 )?> )" + onmouseout="Table_onover('<?php echo $t_n_url ?>',1,<?php echo (isset($_REQUEST['query']) ? 1 : 0 )?>)"> <span class='owner'> <?php echo $GLOBALS['PMD_OUT']["OWNER"][$i]; echo '.</span>'; echo $GLOBALS['PMD_OUT']["TABLE_NAME_SMALL"][$i]; ?></td> + <?php + if(isset($_REQUEST['query'])) { + echo '<td class="tab_zag" onmouseover="Table_onover(\''.htmlspecialchars($t_n_url).'\',0,1)" id="id_zag_'.htmlspecialchars($t_n_url).'_2"'; + echo 'onmousedown="cur_click=document.getElementById(\''.htmlspecialchars($t_n_url).'\');"'; + echo 'onmouseout="Table_onover(\''.htmlspecialchars($t_n_url).'\',1,1)">'; + }?> </tr> </thead> <tbody id="id_tbody_<?php echo $t_n_url ?>" @@ -243,6 +275,14 @@ for ($i = 0; $i < count($GLOBALS['PMD']["TABLE_NAME"]); $i++) { echo (isset($tables_all_keys[$t_n.".".$tab_column[$t_n]["COLUMN_NAME"][$j]]) ? 1 : 0); } ?>)"> + <?php + if(isset($_REQUEST['query'])) { + echo '<td class="select_all">'; + echo '<input value="'.htmlspecialchars($t_n_url).urlencode($tab_column[$t_n]["COLUMN_NAME"][$j]).'"'; + echo 'type="checkbox" id="select_'.htmlspecialchars($t_n_url).'._'.urlencode($tab_column[$t_n]["COLUMN_NAME"][$j]).'" '; + echo 'style="margin: 0px;" title="select_'.urlencode($tab_column[$t_n]["COLUMN_NAME"][$j]).'" '; + echo 'onclick="store_column(\''.urlencode($GLOBALS['PMD_OUT']["TABLE_NAME_SMALL"][$i]).'\',\''.htmlspecialchars($GLOBALS['PMD_OUT']["OWNER"][$i]).'\',\''.urlencode($tab_column[$t_n]["COLUMN_NAME"][$j]).'\')"></td>'; + }?> <td width="10px" colspan="3" id="<?php echo $t_n_url.".".urlencode($tab_column[$t_n]["COLUMN_NAME"][$j]) ?>"> <div style="white-space:nowrap"> @@ -276,6 +316,14 @@ for ($i = 0; $i < count($GLOBALS['PMD']["TABLE_NAME"]); $i++) { ?> </div> </td> + <?php + if(isset($_REQUEST['query'])) { + //$temp = $GLOBALS['PMD_OUT']["OWNER"][$i].'.'.$GLOBALS['PMD_OUT']["TABLE_NAME_SMALL"][$i]; + echo '<td class="small_tab_pref" onmouseover="this.className=\'small_tab_pref2\';"'; + echo 'onmouseout="this.className=\'small_tab_pref\';"'; + echo 'onclick="Click_option(\'pmd_optionse\',\''.urlencode($tab_column[$t_n]["COLUMN_NAME"][$j]).'\',\''.$GLOBALS['PMD_OUT']["TABLE_NAME_SMALL"][$i].'\')" >'; + echo '<img src="pmd/images/exec_small.png" title="options" alt="" /></td> '; + } ?> </tr> <?php } @@ -390,6 +438,392 @@ for ($i = 0; $i < count($GLOBALS['PMD']["TABLE_NAME"]); $i++) { </tr> </tbody> </table> + +<table id="pmd_optionse" style="visibility:<?php echo $hidden ?>;" + width="5%" border="0" cellpadding="0" cellspacing="0"> +<tbody> +<tr> + <td class="frams1" width="10px"></td> + <td class="frams5" width="99%" ></td> + <td class="frams2" width="10px"><div class="bor"></div></td> +</tr> +<tr> + <td class="frams8"></td> + <td class="input_tab"> + <table width="168" border="0" align="center" cellpadding="2" cellspacing="0"> + <thead> + <tr> + <td colspan="2" rowspan="2" id="option_col_name" nowrap="nowrap" align="center"></td> + </tr> + </thead> + <tbody id="where"> + <tr><td align="center" nowrap="nowrap"><b>WHERE</b></td></tr> + <tr> + <td width="58" nowrap="nowrap"><?php echo __('Relation operator'); ?></td> + <td width="102"><select name="rel_opt" id="rel_opt"> + <option value="--" selected="selected"> -- </option> + <option value="=" > = </option> + <option value=">"> > </option> + <option value="<"> < </option> + <option value=">="> >= </option> + <option value="<="> <= </option> + <option value="NOT"> NOT </option> + <option value="IN"> IN </option> + <option value="EXCEPT"> <?php echo __('Except'); ?> </option> + <option value="NOT IN"> NOT IN </option> + </select> + </td> + </tr> + <tr> + <td nowrap="nowrap"><?php echo __('Value'); ?>/<br /><?php echo __('subquery'); ?></td> + <td><textarea id="Query" value="" cols="18"></textarea> + </td> + </tr> + <tr><td align="center" nowrap="nowrap"><b><?php echo __('Rename to'); ?></b></td></tr> + <tr> + <td width="58" nowrap="nowrap"><?php echo __('New name'); ?></td> + <td width="102"><input type="text" value="" id="new_name"/></td> + </tr> + <tr><td align="center" nowrap="nowrap"><b><?php echo __('Aggregate'); ?></b></td></tr> + <tr> + <td width="58" nowrap="nowrap"><?php echo __('Operator'); ?></td> + <td width="102"><select name="operator" id="operator"> + <option value="---" selected="selected">---</option> + <option value="sum" > SUM </option> + <option value="min"> MIN </option> + <option value="max"> MAX </option> + <option value="avg"> AVG </option> + <option value="count"> COUNT </option> + </select> + </td></tr> + <tr> + <td nowrap="nowrap" width="58" align="center"><b>GROUP BY</b></td> + <td><input type="checkbox" value="groupby" id="groupby"/></td> + </tr> + <tr> + <td nowrap="nowrap" width="58" align="center"><b>ORDER BY</b></td> + <td><input type="checkbox" value="orderby" id="orderby"/></td> + </tr> + <tr><td align="center" nowrap="nowrap"><b>HAVING</b></td></tr> + <tr> + <td width="58" nowrap="nowrap"><?php echo __('Operator'); ?></td> + <td width="102"><select name="h_operator" id="h_operator"> + <option value="---" selected="selected">---</option> + <option value="None" > <?php echo __('None'); ?> </option> + <option value="sum" > SUM </option> + <option value="min"> MIN </option> + <option value="max"> MAX </option> + <option value="avg"> AVG </option> + <option value="count"> COUNT </option> + </select> + </td></tr> + <tr> + <td width="58" nowrap="nowrap"><?php echo __('Relation operator'); ?></td> + <td width="102"><select name="h_rel_opt" id="h_rel_opt"> + <option value="--" selected="selected"> -- </option> + <option value="=" > = </option> + <option value=">"> > </option> + <option value="<"> < </option> + <option value=">="> >= </option> + <option value="<="> <= </option> + <option value="NOT"> NOT </option> + <option value="IN"> IN </option> + <option value="EXCEPT"> <?php echo __('Except'); ?> </option> + <option value="NOT IN"> NOT IN </option> + </select> + </td> + </tr> + <tr> + <td width="58" nowrap="nowrap"><?php echo __('Value'); ?>/<br/><?php echo __('subquery'); ?></td> + <td width="102"><textarea id="having" value="" cols="18"></textarea></td> + </tr> + </tbody> + <tbody> + <tr> + <td colspan="2" align="center" nowrap="nowrap"> + <input type="button" class="butt" name="Button" + value="<?php echo __('OK'); ?>" onclick="add_object()" /> + <input type="button" class="butt" name="Button" + value="<?php echo __('Cancel'); ?>" + onclick="Close_option()" /> + </td> + </tr> + </tbody> + </table> + </td> + <td class="frams6"></td> +</tr> +<tr> + <td class="frams4"><div class="bor"></div></td> + <td class="frams7"></td> + <td class="frams3"></td> +</tr> +</tbody> +</table> + +<table id="query_rename_to" style="visibility:<?php echo $hidden ?>;" + width="5%" border="0" cellpadding="0" cellspacing="0"> +<tbody> +<tr> + <td class="frams1" width="10px"></td> + <td class="frams5" width="99%" ></td> + <td class="frams2" width="10px"><div class="bor"></div></td> +</tr> +<tr> + <td class="frams8"></td> + <td class="input_tab"> + <table width="168" border="0" align="center" cellpadding="2" cellspacing="0"> + <thead> + <tr> + <td colspan="2" align="center" nowrap="nowrap"><strong><?php echo __('Rename to'); ?></strong></td> + </tr> + </thead> + <tbody id="rename_to"> + <tr> + <td width="58" nowrap="nowrap"><?php echo __('New name'); ?></td> + <td width="102"> + <input type="text" value="" id="e_rename"/> + </td> + </tr> + </tbody> + <tbody> + <tr> + <td colspan="2" align="center" nowrap="nowrap"> + <input type="button" class="butt" name="Button" + value="<?php echo __('OK'); ?>" onclick="edit('Rename')" /> + <input type="button" class="butt" name="Button" + value="<?php echo __('Cancel'); ?>" + onclick="document.getElementById('query_rename_to').style.visibility = 'hidden';" /> + </td> + </tr> + </tbody> + </table> + </td> + <td class="frams6"></td> +</tr> +<tr> + <td class="frams4"><div class="bor"></div></td> + <td class="frams7"></td> + <td class="frams3"></td> +</tr> +</tbody> +</table> + +<table id="query_having" style="visibility:<?php echo $hidden ?>;" + width="5%" border="0" cellpadding="0" cellspacing="0"> +<tbody> + <tr> + <td class="frams1" width="10px"></td> + <td class="frams5" width="99%" ></td> + <td class="frams2" width="10px"><div class="bor"></div></td> + </tr> +<tr> + <td class="frams8"></td> + <td class="input_tab"> + <table width="168" border="0" align="center" cellpadding="2" cellspacing="0"> + <thead> + <tr> + <td colspan="2" align="center" nowrap="nowrap"><strong>HAVING</strong></td> + </tr> + </thead> + <tbody id="rename_to"> + <tr> + <td width="58" nowrap="nowrap"><?php echo __('Operator'); ?></td> + <td width="102"><select name="hoperator" id="hoperator"> + <option value="---" selected="selected">---</option> + <option value="None" > None </option> + <option value="sum" > SUM </option> + <option value="min"> MIN </option> + <option value="max"> MAX </option> + <option value="avg"> AVG </option> + <option value="count"> COUNT </option> + </select> + </td></tr> + <tr> + <tr> + <td width="58" nowrap="nowrap"><?php echo __('Operator'); ?></td> + <td width="102"><select name="hrel_opt" id="hrel_opt"> + <option value="--" selected="selected"> -- </option> + <option value="=" > = </option> + <option value=">"> > </option> + <option value="<"> < </option> + <option value=">="> >= </option> + <option value="<="> <= </option> + <option value="NOT"> NOT </option> + <option value="IN"> IN </option> + <option value="EXCEPT"> <?php echo __('Except'); ?> </option> + <option value="NOT IN"> NOT IN </option> + </select> + </td> + </tr> + <tr> + <td nowrap="nowrap"><?php echo __('Value'); ?>/<br /><?php echo __('subquery'); ?></td> + <td><textarea id="hQuery" value="" cols="18"></textarea> + </td> + </tr> + </tbody> + <tbody> + <tr> + <td colspan="2" align="center" nowrap="nowrap"> + <input type="button" class="butt" name="Button" + value="<?php echo __('OK'); ?>" onclick="edit('Having')" /> + <input type="button" class="butt" name="Button" + value="<?php echo __('Cancel'); ?>" + onclick="document.getElementById('query_having').style.visibility = 'hidden';" /> + </td> + </tr> + </tbody> + </table> + </td> + <td class="frams6"></td> +</tr> +<tr> + <td class="frams4"><div class="bor"></div></td> + <td class="frams7"></td> + <td class="frams3"></td> +</tr> +</tbody> +</table> + +<table id="query_Aggregate" style="visibility:<?php echo $hidden ?>;" + width="5%" border="0" cellpadding="0" cellspacing="0"> +<tbody> +<tr> + <td class="frams1" width="10px"></td> + <td class="frams5" width="99%" ></td> + <td class="frams2" width="10px"><div class="bor"></div></td> +</tr> +<tr> + <td class="frams8"></td> + <td class="input_tab"> + <table width="168" border="0" align="center" cellpadding="2" cellspacing="0"> + <thead> + <tr> + <td colspan="2" align="center" nowrap="nowrap"><strong><?php echo __('Aggregate'); ?></strong></td> + </tr> + </thead> + <tbody> + <tr> + <td width="58" nowrap="nowrap"><?php echo __('Operator'); ?></td> + <td width="102"> + <select name="operator" id="e_operator"> + <option value="---" selected="selected">---</option> + <option value="sum" > SUM </option> + <option value="min"> MIN </option> + <option value="max"> MAX </option> + <option value="avg"> AVG </option> + <option value="avg"> COUNT </option> + </select> + </td></tr> + </tbody> + <tbody> + <tr> + <td colspan="2" align="center" nowrap="nowrap"> + <input type="button" class="butt" name="Button" + value="<?php echo __('OK'); ?>" onclick="edit('Aggregate')" /> + <input type="button" class="butt" name="Button" + value="<?php echo __('Cancel'); ?>" + onclick="document.getElementById('query_Aggregate').style.visibility = 'hidden';" /> + </td> + </tr> + </tbody> + </table> + </td> + <td class="frams6"></td> +</tr> +<tr> + <td class="frams4"><div class="bor"></div></td> + <td class="frams7"></td> + <td class="frams3"></td> +</tr> +</tbody> +</table> + +<table id="query_where" style="visibility:<?php echo $hidden ?>;" + width="5%" border="0" cellpadding="0" cellspacing="0"> +<tbody> + <tr> + <td class="frams1" width="10px"></td> + <td class="frams5" width="99%" ></td> + <td class="frams2" width="10px"><div class="bor"></div></td> + </tr> +<tr> + <td class="frams8"></td> + <td class="input_tab"> + <table width="168" border="0" align="center" cellpadding="2" cellspacing="0"> + <thead> + <tr> + <td colspan="2" align="center" nowrap="nowrap"><strong>WHERE</strong></td> + </tr> + </thead> + <tbody id="rename_to"> + <tr> + <td width="58" nowrap="nowrap"><?php echo __('Operator'); ?></td> + <td width="102"><select name="erel_opt" id="erel_opt"> + <option value="--" selected="selected"> -- </option> + <option value="=" > = </option> + <option value=">"> > </option> + <option value="<"> < </option> + <option value=">="> >= </option> + <option value="<="> <= </option> + <option value="NOT"> NOT </option> + <option value="IN"> IN </option> + <option value="EXCEPT"> <?php echo __('Except'); ?> </option> + <option value="NOT IN"> NOT IN </option> + </select> + </td> + </tr> + <tr> + <td nowrap="nowrap"><?php echo __('Value'); ?>/<br /><?php echo __('subquery'); ?></td> + <td><textarea id="eQuery" value="" cols="18"></textarea> + </td> + </tr> + </tbody> + <tbody> + <tr> + <td colspan="2" align="center" nowrap="nowrap"> + <input type="button" class="butt" name="Button" + value="<?php echo __('OK'); ?>" onclick="edit('Where')" /> + <input type="button" class="butt" name="Button" + value="<?php echo __('Cancel'); ?>" + onclick="document.getElementById('query_where').style.visibility = 'hidden';" /> + </td> + </tr> + </tbody> + </table> + </td> + <td class="frams6"></td> +</tr> +<tr> + <td class="frams4"><div class="bor"></div></td> + <td class="frams7"></td> + <td class="frams3"></td> +</tr> +</tbody> +</table> + +<?php +if($_REQUEST['query']) { + echo '<div class="panel">'; + echo '<div style="clear:both;"></div>'; + echo '<div id="ab"></div>'; + echo '<div style="clear:both;"></div>'; + echo '</div>'; + echo '<a class="trigger" href="#">' . __('Active options') . '</a>'; + echo '<div id="filter"></div>'; + echo '<div id="box">'; + echo '<span id="boxtitle"></span>'; + echo '<form method="post" action="db_qbe.php" >'; + echo '<textarea cols="80" name="sql_query" id="textSqlquery" rows="15"></textarea><div id="tblfooter">'; + echo ' <input type="submit" name="submit_sql" class="btn">'; + echo ' <input type="button" name="cancel" value="Cancel" onClick="closebox()" class="btn">'; + echo PMA_generate_common_hidden_inputs($GLOBALS['db']); + echo '</div></p>'; + echo '</form></div>'; + +} ?> + + <!-- cache images --> <img src="pmd/images/2leftarrow_m.png" width="0" height="0" alt="" /> <img src="pmd/images/rightarrow1.png" width="0" height="0" alt="" /> diff --git a/readme b/readme new file mode 100644 index 0000000..e69de29
hooks/post-receive