MDL-23344 new option to autofocus username or password on the login form
authorPetr Skoda <commits@skodak.org>
Thu, 14 Jul 2011 13:58:01 +0000 (15:58 +0200)
committerPetr Skoda <commits@skodak.org>
Thu, 14 Jul 2011 13:58:01 +0000 (15:58 +0200)
Nearly everybody else does this login page autofocus. Once we switch to HMTL 5 we should use the new autofocus input option. I believe the admin setting should be enabled by default but it would not be possible to get it through the reviews.

admin/settings/plugins.php
lang/en/admin.php
lib/javascript-static.js
login/index.php

index cf1d555..6ee6608 100644 (file)
@@ -74,6 +74,7 @@ if ($hassiteconfig) {
     $temp->add(new admin_setting_manageauths());
     $temp->add(new admin_setting_heading('manageauthscommonheading', get_string('commonsettings', 'admin'), ''));
     $temp->add(new admin_setting_special_registerauth());
+    $temp->add(new admin_setting_configcheckbox('loginpageautofocus', get_string('loginpageautofocus', 'admin'), get_string('loginpageautofocus_help', 'admin'), 0));
     $temp->add(new admin_setting_configselect('guestloginbutton', get_string('guestloginbutton', 'auth'),
                                               get_string('showguestlogin', 'auth'), '1', array('0'=>get_string('hide'), '1'=>get_string('show'))));
     $temp->add(new admin_setting_configtext('alternateloginurl', get_string('alternateloginurl', 'auth'),
index 115dd5b..322498d 100644 (file)
@@ -653,6 +653,8 @@ $string['log'] = 'Logs';
 $string['logguests'] = 'Log guest access';
 $string['logguests_help'] = 'This setting enables logging of actions by guest account and not logged in users. High profile sites may want to disable this logging for performance reasons. It is recommended to keep this setting enabled on production sites.';
 $string['loginhttps'] = 'Use HTTPS for logins';
+$string['loginpageautofocus'] = 'Autofocus login page form';
+$string['loginpageautofocus_help'] = 'Enabling this option improves usability of the login page, but automatically focusing fields may be considered an accessibility issue.';
 $string['loglifetime'] = 'Keep logs for';
 $string['longtimewarning'] = '<b>Please note that this process can take a long time.</b>';
 $string['maintenancemode'] = 'In maintenance mode';
index f847920..a3d1946 100644 (file)
@@ -739,6 +739,34 @@ M.util.get_string = function(identifier, component, a) {
     return stringvalue;
 };
 
+/**
+ * Set focus on username or password field of the login form
+ */
+M.util.focus_login_form = function(Y) {
+    var username = Y.one('#username');
+    var password = Y.one('#password');
+
+    if (username == null || password == null) {
+        // something is wrong here
+        return;
+    }
+
+    var curElement = document.activeElement
+    if (curElement == 'undefined') {
+        // legacy browser - skip refocus protection
+    } else if (curElement.tagName == 'INPUT') {
+        // user was probably faster to focus something, do not mess with focus
+        return;
+    }
+
+    if (username.get('value') == '') {
+        username.focus();
+    } else {
+        password.focus();
+    }
+}
+
+
 //=== old legacy JS code, hopefully to be replaced soon by M.xx.yy and YUI3 code ===
 
 function checkall() {
index 52d86a5..f3b87be 100644 (file)
@@ -341,6 +341,10 @@ if (isloggedin() and !isguestuser()) {
     echo $OUTPUT->box_end();
 } else {
     include("index_form.html");
+    if (!empty($CFG->loginpageautofocus)) {
+        //focus username or password
+        $PAGE->requires->js_init_call('M.util.focus_login_form', null, true);
+    }
 }
 
 echo $OUTPUT->footer();