]> git.joonet.de Git - adminer.git/commitdiff
Autocomplete for big foreign keys
authorJakub Vrana <jakub@vrana.cz>
Wed, 4 May 2011 13:53:26 +0000 (15:53 +0200)
committerJakub Vrana <jakub@vrana.cz>
Wed, 4 May 2011 15:19:54 +0000 (17:19 +0200)
adminer/include/version.inc.php
changes.txt
editor/include/adminer.inc.php
editor/index.php
editor/script.inc.php [new file with mode: 0644]
editor/static/editing.js
todo.txt

index ab0e8360d0c1fd09ef337ea34b17c008e7517f98..7dacd8833f4a014dc3ea17f0f97d56c0eef4a2a9 100644 (file)
@@ -1,2 +1,2 @@
 <?php
-$VERSION = "3.2.3-dev";
+$VERSION = "3.3.0-dev";
index fc14472d744c094801b6a21c8cd590d0d1515f13..6804578aac204ad782fc32fffb089ef4e553c20b 100644 (file)
@@ -1,3 +1,9 @@
+Adminer 3.3.0-dev:
+Append new index with auto index selection (bug #3282127)
+Autocomplete for big foreign keys (Editor)
+Customizable favicon (customization)
+Method name can return a link (customization)
+
 Adminer 3.2.2 (released 2011-03-28):
 Fix AJAX history after reload
 
index 8bc7217a74f484964e688b7d6a62d3f669517967..5df36fcf056ee88e1b748b63b793cff3dc3d0201 100644 (file)
@@ -210,7 +210,7 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
                }
                foreach ($columns as $name => $desc) {
                        $options = $this->_foreignKeyOptions($_GET["select"], $name);
-                       if ($options) {
+                       if (is_array($options)) {
                                if ($fields[$name]["null"]) {
                                        $options[0] = '(' . lang('empty') . ')';
                                }
@@ -423,9 +423,12 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
                                . enum_input("radio", $attrs, $field, ($value || isset($_GET["select"]) ? $value : 0), ($field["null"] ? "" : null))
                        ;
                }
-               $options = $this->_foreignKeyOptions($table, $field["field"]);
-               if ($options) {
-                       return "<select$attrs>" . optionlist($options, $value, true) . "</select>";
+               $options = $this->_foreignKeyOptions($table, $field["field"], $value);
+               if (isset($options)) {
+                       return (is_array($options)
+                               ? "<select$attrs>" . optionlist($options, $value, true) . "</select>"
+                               :  "<input value='" . h($value) . "'$attrs class='hidden'><input value='" . h($options) . "' class='jsonly' onkeyup=\"whisper('" . h(ME . "script=complete&source=" . urlencode($table) . "&field=" . urlencode($field["field"])) . "&value=', this);\"><div onclick='return whisperClick(event, this.previousSibling);'></div>"
+                       );
                }
                if (like_bool($field)) {
                        return '<input type="checkbox" value="' . h($value ? $value : 1) . '"' . ($value ? ' checked' : '') . "$attrs>";
@@ -563,12 +566,16 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
                }
        }
        
-       function _foreignKeyOptions($table, $column) {
+       function _foreignKeyOptions($table, $column, $value = null) {
+               global $connection;
                if (list($table, $id, $name) = $this->_foreignColumn(column_foreign_keys($table), $column)) {
                        $return = &$this->_values[$table];
                        if (!isset($return)) {
                                $table_status = table_status($table);
-                               $return = ($table_status["Rows"] > 1000 ? array() : array("" => "") + get_key_vals("SELECT $id, $name FROM " . table($table) . " ORDER BY 2"));
+                               $return = ($table_status["Rows"] > 1000
+                                       ? (isset($value) ? $connection->result("SELECT $name FROM " . table($table) . " WHERE $id = " . q($value)) : "")
+                                       : array("" => "") + get_key_vals("SELECT $id, $name FROM " . table($table) . " ORDER BY 2")
+                               );
                        }
                        return $return;
                }
index d902e2202b54e84b172d3909654ab0cda3640cdc..00008550fc775251d6b3ba08e6cb041c62f7f82e 100644 (file)
@@ -19,6 +19,8 @@ if (isset($_GET["download"])) {
        include "../adminer/edit.inc.php";
 } elseif (isset($_GET["select"])) {
        include "../adminer/select.inc.php";
+} elseif (isset($_GET["script"])) {
+       include "./script.inc.php";
 } else {
        include "./db.inc.php";
 }
diff --git a/editor/script.inc.php b/editor/script.inc.php
new file mode 100644 (file)
index 0000000..1de9ab4
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+if (list($table, $id, $name) = $adminer->_foreignColumn(column_foreign_keys($_GET["source"]), $_GET["field"])) {
+       $result = $connection->query("SELECT $id, $name FROM " . table($table) . " WHERE $name LIKE " . q("$_GET[value]%") . " ORDER BY 2 LIMIT 11");
+       for ($i=0; $i < 10 && ($row = $result->fetch_row()); $i++) {
+               echo "<a href='" . h(ME . "edit=" . urlencode($table) . "&where" . urlencode("[" . bracket_escape(idf_unescape($id)) . "]") . "=" . urlencode($row[0])) . "'>" . h($row[1]) . "</a><br>\n";
+       }
+       if ($i == 10) {
+               echo "...\n";
+       }
+}
+
+exit; // don't print footer
index 39c9af977437bf168a032a312e5a0e2675f41f37..e89fc14079e077f149dbc68cb4c7a218c9a97f8b 100644 (file)
@@ -5,3 +5,31 @@ function bodyLoad(version) {
                onpopstate(history);
        }
 }
+
+function whisperClick(event, field) {
+       var el = event.target || event.srcElement;
+       if (/^a$/i.test(el.tagName) && !(event.button || event.ctrlKey || event.shiftKey || event.altKey || event.metaKey)) {
+               field.value = el.firstChild.data;
+               field.previousSibling.value = decodeURIComponent(el.href.replace(/.*=/, ''));
+               field.nextSibling.style.display = 'none';
+               eventStop(event);
+               return false;
+       }
+}
+
+function whisper(url, field) {
+       if (field.orig != field.value) {
+               field.orig = field.value;
+               return ajax(url + encodeURIComponent(field.value), function (xmlhttp) {
+                       if (xmlhttp.status && field.orig == field.value) {
+                               field.nextSibling.innerHTML = xmlhttp.responseText;
+                               field.nextSibling.style.display = '';
+                               var a = field.nextSibling.firstChild;
+                               if (a && a.firstChild.data == field.value) {
+                                       field.previousSibling.value = decodeURIComponent(a.href.replace(/.*=/, ''));
+                                       a.style.fontWeight = 'bold';
+                               }
+                       }
+               });
+       }
+}
index aabcb7789dc15a3b7e4fde822bcb3b7de36c1498..cd13bf5d0d3a13d7acd997b168157772a2cbad6d 100644 (file)
--- a/todo.txt
+++ b/todo.txt
@@ -21,7 +21,6 @@ Three-state checkbox for boolean searches
 JavaScript data validation - columns containing word email, url, ...
 Joining tables - PRIMARY KEY (table, joining)
 Rank, Tree structure
-Add whisperer to fields with foreign key to big table
 
 MySQL:
 Data longer than max_allowed_packet can be sent by mysqli_stmt_send_long_data()