]> git.joonet.de Git - adminer.git/commitdiff
Highlight default submit button
authorJakub Vrana <jakub@vrana.cz>
Sun, 5 May 2013 00:02:59 +0000 (17:02 -0700)
committerJakub Vrana <jakub@vrana.cz>
Mon, 6 May 2013 16:27:35 +0000 (09:27 -0700)
12 files changed:
adminer/create.inc.php
adminer/database.inc.php
adminer/edit.inc.php
adminer/include/adminer.inc.php
adminer/include/design.inc.php
adminer/scheme.inc.php
adminer/sql.inc.php
adminer/static/default.css
adminer/static/editing.js
adminer/static/functions.js
changes.txt
editor/include/adminer.inc.php

index 948261834836333b6966c38ac0eb5cd4592fbd6b..019ccf9a9ccb26d8a4b7faf683cfb463155ccc75 100644 (file)
@@ -157,7 +157,7 @@ foreach ($engines as $engine) {
 <form action="" method="post" id="form">
 <p>
 <?php echo lang('Table name'); ?>: <input name="name" maxlength="64" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
-<?php if ($TABLE == "" && !$_POST) { ?><script type='text/javascript'>document.getElementById('form')['name'].focus();</script><?php } ?>
+<?php if ($TABLE == "" && !$_POST) { ?><script type='text/javascript'>focus(document.getElementById('form')['name']);</script><?php } ?>
 <?php echo ($engines ? html_select("Engine", array("" => "(" . lang('engine') . ")") + $engines, $row["Engine"]) : ""); ?>
  <?php echo ($collations && !ereg("sqlite|mssql", $jush) ? html_select("Collation", array("" => "(" . lang('collation') . ")") + $collations, $row["Collation"]) : ""); ?>
  <input type="submit" value="<?php echo lang('Save'); ?>">
index 616549304bf51c5651872561b208b79f0a6f575b..022a0d988e438916ed49299d29d2d6703f79f1b1 100644 (file)
@@ -62,7 +62,7 @@ echo ($_POST["add_x"] || strpos($name, "\n")
        : '<input name="name" id="name" value="' . h($name) . '" maxlength="64" autocapitalize="off">'
 ) . "\n" . ($collations ? html_select("collation", array("" => "(" . lang('collation') . ")") + $collations, $collate) : "");
 ?>
-<script type='text/javascript'>document.getElementById('name').focus();</script>
+<script type='text/javascript'>focus(document.getElementById('name'));</script>
 <input type="submit" value="<?php echo lang('Save'); ?>">
 <?php
 if (DB != "") {
index 1c1fed6363c884c54cbe860a08a5d275bd692170..554d0e220b910b95028ce90b768bb6620636b7fd 100644 (file)
@@ -122,7 +122,7 @@ if ($fields) {
        }
 }
 echo ($update ? "<input type='submit' name='delete' value='" . lang('Delete') . "' onclick=\"return confirm('" . lang('Are you sure?') . "');\">\n"
-       : ($_POST || !$fields ? "" : "<script type='text/javascript'>document.getElementById('form').getElementsByTagName('td')[1].firstChild.focus();</script>\n")
+       : ($_POST || !$fields ? "" : "<script type='text/javascript'>focus(document.getElementById('form').getElementsByTagName('td')[1].firstChild);</script>\n")
 );
 if (isset($_GET["select"])) {
        hidden_fields(array("check" => (array) $_POST["check"], "clone" => $_POST["clone"], "all" => $_POST["all"]));
index 5ebb2d9f449c169066ac8b8d6defbb2a81b5e98f..3a1154066236a24a32a224b66483d8e3e6cc4592 100644 (file)
@@ -78,7 +78,7 @@ class Adminer {
 </table>
 <script type="text/javascript">
 var username = document.getElementById('username');
-username.focus();
+focus(username);
 username.form['auth[driver]'].onchange();
 </script>
 <?php
index 60d2e18b95d1544da5cc777dc840f8ba3492275c..0a9b18185afc539f7b6caa4d241d04c98854202e 100644 (file)
@@ -98,5 +98,6 @@ function page_footer($missing = "") {
 <div id="menu">
 <?php $adminer->navigation($missing); ?>
 </div>
+<script type="text/javascript">setupSubmitHighlight(document);</script>
 <?php
 }
index be2531a1cd6035eb474bd8767cd0fa3833d2c389..19881c34cf41fab7c7ccae90de8b0f0f7b123892 100644 (file)
@@ -26,7 +26,7 @@ if (!$row) {
 
 <form action="" method="post">
 <p><input name="name" id="name" value="<?php echo h($row["name"]); ?>" autocapitalize="off">
-<script type='text/javascript'>document.getElementById('name').focus();</script>
+<script type='text/javascript'>focus(document.getElementById('name'));</script>
 <input type="submit" value="<?php echo lang('Save'); ?>">
 <?php
 if ($_GET["ns"] != "") {
index 97dbd43a34784c640df2b9ba729506971879f3bf..1fa96e17292f83be5243c9fc54090b05657949e9 100644 (file)
@@ -195,7 +195,7 @@ if ($_POST) {
 }
 textarea("query", $q, 20);
 
-echo ($_POST ? "" : "<script type='text/javascript'>document.getElementsByTagName('textarea')[0].focus();</script>\n");
+echo ($_POST ? "" : "<script type='text/javascript'>focus(document.getElementsByTagName('textarea')[0]);</script>\n");
 echo "<p>" . (ini_bool("file_uploads")
        ? lang('File upload') . ': <input type="file" name="sql_file[]" multiple'
                . ($_FILES && $_FILES["sql_file"]["error"][0] != 4 ? '' : ' onchange="this.form[\'only_errors\'].checked = true;"') // 4 - UPLOAD_ERR_NO_FILE
index b5e769f6dce33d17fa421a58d80df6047dd8c389..7aab444fe7d8f4bf3eefe045200906881536f244 100644 (file)
@@ -21,6 +21,7 @@ code { background: #eee; }
 tbody tr:hover td, tbody tr:hover th { background: #eee; }
 pre { margin: 1em 0 0; }
 input[type=image] { vertical-align: middle; }
+input.default { background: #ddf; }
 .version { color: #777; font-size: 67%; }
 .js .hidden, .nojs .jsonly { display: none; }
 .js .column { position: absolute; background: #ddf; padding: .3em 1ex .3em 0; margin-top: -.3em; }
index 9c5a4fbc650d34bef50d60400379df0d17cfe2c3..d27236c94611c43456e7adb9e4f3bc4f069c1899 100644 (file)
@@ -291,7 +291,7 @@ function editingAddRow(button, focus) {
        var match = /(\d+)(\.\d+)?/.exec(button.name);
        var x = match[0] + (match[2] ? added.substr(match[2].length) : added) + '1';
        var row = parentTag(button, 'tr');
-       var row2 = row.cloneNode(true);
+       var row2 = cloneNode(row);
        var tags = row.getElementsByTagName('select');
        var tags2 = row2.getElementsByTagName('select');
        for (var i=0; i < tags.length; i++) {
@@ -434,7 +434,7 @@ function partitionByChange(el) {
 * @param HTMLInputElement
 */
 function partitionNameChange(el) {
-       var row = parentTag(el, 'tr').cloneNode(true);
+       var row = cloneNode(parentTag(el, 'tr'));
        row.firstChild.firstChild.value = '';
        parentTag(el, 'table').appendChild(row);
        el.onchange = function () {};
@@ -447,7 +447,7 @@ function partitionNameChange(el) {
 */
 function foreignAddRow(field) {
        field.onchange = function () { };
-       var row = parentTag(field, 'tr').cloneNode(true);
+       var row = cloneNode(parentTag(field, 'tr'));
        var selects = row.getElementsByTagName('select');
        for (var i=0; i < selects.length; i++) {
                selects[i].name = selects[i].name.replace(/\]/, '1$&');
@@ -463,7 +463,7 @@ function foreignAddRow(field) {
 */
 function indexesAddRow(field) {
        field.onchange = function () { };
-       var row = parentTag(field, 'tr').cloneNode(true);
+       var row = cloneNode(parentTag(field, 'tr'));
        var selects = row.getElementsByTagName('select');
        for (var i=0; i < selects.length; i++) {
                selects[i].name = selects[i].name.replace(/indexes\[\d+/, '$&1');
@@ -506,7 +506,7 @@ function indexesAddColumn(field, prefix) {
                select.selectedIndex = 3;
                select.onchange();
        }
-       var column = field.parentNode.cloneNode(true);
+       var column = cloneNode(field.parentNode);
        select = column.getElementsByTagName('select')[0];
        select.name = select.name.replace(/\]\[\d+/, '$&1');
        select.selectedIndex = 0;
index 17df5faaa9a205206a77aa4dd961ae751b685340..e4378aa994b709667946cdcbb35e625b4ef8c4b0 100644 (file)
@@ -240,7 +240,7 @@ function selectAddRow(field) {
                selectFieldChange(field.form);
        };
        field.onchange();
-       var row = field.parentNode.cloneNode(true);
+       var row = cloneNode(field.parentNode);
        var selects = row.getElementsByTagName('select');
        for (var i=0; i < selects.length; i++) {
                selects[i].name = selects[i].name.replace(/[a-z]\[\d+/, '$&1');
@@ -474,6 +474,7 @@ function selectClick(td, event, text, warning) {
        }
        td.innerHTML = '';
        td.appendChild(input);
+       setupSubmitHighlight(td);
        input.focus();
        if (text == 2) { // long text
                return ajax(location.href + '&' + encodeURIComponent(td.id) + '=', function (request) {
@@ -536,3 +537,88 @@ function eventStop(event) {
                event.cancelBubble = true;
        }
 }
+
+
+
+/** Setup highlighting of default submit button on form field focus
+* @param HTMLElement
+*/
+function setupSubmitHighlight(parent) {
+       for (var key in { input: 1, select: 1, textarea: 1 }) {
+               var inputs = parent.getElementsByTagName(key);
+               for (var i = 0; i < inputs.length; i++) {
+                       if (!/submit|image|file/.test(inputs[i].type)) {
+                               addEvent(inputs[i], 'focus', inputFocus);
+                               addEvent(inputs[i], 'blur', inputBlur);
+                       }
+               }
+       }
+}
+
+/** Highlight default submit button
+* @this HTMLInputElement
+*/
+function inputFocus() {
+       var submit = findDefaultSubmit(this.form);
+       if (submit) {
+               submit.className += ' default';
+       }
+}
+
+/** Unhighlight default submit button
+* @this HTMLInputElement
+*/
+function inputBlur() {
+       var submit = findDefaultSubmit(this.form);
+       if (submit) {
+               submit.className = submit.className.replace(/ default( |$)/, '$1');
+       }
+}
+
+/** Find submit button used by Enter
+* @param HTMLFormElement
+* @return HTMLInputElement
+*/
+function findDefaultSubmit(form) {
+       var inputs = form.getElementsByTagName('input');
+       for (var i = 0; i < inputs.length; i++) {
+               var input = inputs[i];
+               if (input.type == 'submit') {
+                       return input;
+               }
+       }
+}
+
+
+
+/** Add event listener
+* @param HTMLElement
+* @param string without 'on'
+* @param function
+*/
+function addEvent(el, action, handler) {
+       if (el.addEventListener) {
+               el.addEventListener(action, handler, false);
+       } else {
+               el.attachEvent('on' + action, handler);
+       }
+}
+
+/** Defer focusing element
+* @param HTMLElement
+*/
+function focus(el) {
+       setTimeout(function () { // this has to be an anonymous function because Firefox passes some arguments to setTimeout callback
+               el.focus();
+       }, 0);
+}
+
+/** Clone node and setup submit highlighting
+* @param HTMLElement
+* @return HTMLElement
+*/
+function cloneNode(el) {
+       var el2 = el.cloneNode(true);
+       setupSubmitHighlight(el2);
+       return el2;
+}
index a969f74a168e66545204d737c607988c0684a265..45b9da15c80543cf10469df3359dcf93f29003d2 100644 (file)
@@ -1,6 +1,7 @@
 Adminer 3.7.0-dev:
 Allow more SQL files to be uploaded at the same time
 Print run time next to executed queries
+Highlight default submit button
 Disable SQL export when applying functions in select
 Allow using lang() in plugins (customization)
 Remove bzip2 compression support
index 516cd90bed44805791d1b6ee7963f3a0ef4cb460..4f1cfd9be76c6a451b5ec4f86894aa6ea8fe8bbd 100644 (file)
@@ -49,7 +49,7 @@ class Adminer {
 <tr><th><?php echo lang('Password'); ?><td><input type="password" name="auth[password]">
 </table>
 <script type="text/javascript">
-document.getElementById('username').focus();
+focus(document.getElementById('username'));
 </script>
 <?php
                echo "<p><input type='submit' value='" . lang('Login') . "'>\n";