From 857cfb14290670a23737cff555684c4bdab4b152 Mon Sep 17 00:00:00 2001 From: AMOS bot Date: Wed, 10 Oct 2018 00:07:15 +0000 Subject: [PATCH 1/5] Automatically generated installer lang files --- install/lang/el/admin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/lang/el/admin.php b/install/lang/el/admin.php index 33faa8b12a4..d15be713395 100644 --- a/install/lang/el/admin.php +++ b/install/lang/el/admin.php @@ -35,7 +35,7 @@ $string['cliansweryes'] = 'ν'; $string['cliincorrectvalueerror'] = 'Σφάλμα, λανθασμένη τιμή "{$a->value}" για το "{$a->option}"'; $string['cliincorrectvalueretry'] = 'Λανθασμένη τιμή. Παρακαλούμε προσπαθήστε ξανά.'; $string['clitypevalue'] = 'πληκτρολογήστε μια τιμή'; -$string['clitypevaluedefault'] = 'πληκτρολογήστε μια τιμή· πατήστε Enter για να χρησιμοποιήσετε την προκαθορισμένη τιμή ({$a})'; +$string['clitypevaluedefault'] = 'πληκτρολογήστε μια τιμή· πατήστε Enter για να χρησιμοποιήσετε τηνπροεπιλεγμένη τιμή ({$a})'; $string['cliunknowoption'] = 'Μη αναγνωρίσιμες επιλογές: {$a}
Παρακαλούμε χρησιμοποιήστε την επιλογή --βοήθεια'; $string['cliyesnoprompt'] = 'πατώντας ν (σημαίνει ναι) αλλιώς πατώντας ο (σημαίνει όχι)'; From f2211eb823497266a751e5971c585ec9ee33e3be Mon Sep 17 00:00:00 2001 From: AMOS bot Date: Thu, 11 Oct 2018 00:07:18 +0000 Subject: [PATCH 2/5] Automatically generated installer lang files --- install/lang/el/install.php | 10 +++++----- install/lang/sl/admin.php | 1 + install/lang/sl/install.php | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/install/lang/el/install.php b/install/lang/el/install.php index dcef1e0be92..a7d49fcb691 100644 --- a/install/lang/el/install.php +++ b/install/lang/el/install.php @@ -30,7 +30,7 @@ defined('MOODLE_INTERNAL') || die(); -$string['admindirname'] = 'Φάκελος Admin'; +$string['admindirname'] = 'Φάκελος διαχειριστή'; $string['availablelangs'] = 'Λίστα διαθέσιμων πακέτων γλωσσών'; $string['chooselanguagehead'] = 'Επιλογή γλώσσας'; $string['chooselanguagesub'] = 'Παρακαλούμε, επιλέξτε γλώσσα για την εγκατάσταση ΜΟΝΟ. Θα μπορείτε να επιλέξετε γλώσσα ιστοσελίδας και χρηστών σε μια μετέπειτα οθόνη.'; @@ -39,7 +39,7 @@ $string['clialreadyinstalled'] = 'Το αρχείο ρυθμίσεων config.ph $string['databasehost'] = 'Κεντρικός Υπολογιστής Βάσης Δεδομένων'; $string['databasename'] = 'Όνομα Βάσης Δεδομένων'; $string['databasetypehead'] = 'Επιλογή οδηγού βάσης δεδομένων'; -$string['dataroot'] = 'Φάκελος Δεδομένων'; +$string['dataroot'] = 'Φάκελος δεδομένων'; $string['dbprefix'] = 'Πρόθεμα πινάκων'; $string['dirroot'] = 'Φάκελος Moodle'; $string['environmenthead'] = 'Έλεγχος περιβάλλοντος...'; @@ -50,10 +50,10 @@ $string['installation'] = 'Εγκατάσταση'; $string['langdownloaderror'] = 'Δυστυχώς η γλώσσα "{$a}" δεν είναι εγκατεστημένη. Η εγκατάσταση θα συνεχιστεί στα αγγλικά.'; $string['memorylimithelp'] = '

Το όριο μνήμης της PHP στον εξυπηρετητή σας είναι ορισμένο αυτή τη στιγμή στα {$a}.

Αυτό μπορεί να προκαλέσει προβλήματα μνήμης στο Moodle στη συνέχεια, ειδικά αν έχετε πολλά ενεργοποιημένα αρθρώματα και/ή πολλούς χρήστες.

Προτείνεται η ρύθμιση της PHP με μεγαλύτερο όριο, αν αυτό είναι δυνατό, π.χ. 40M. Υπάρχουν πολλοί τρόποι να το κάνετε αυτό, τους οποίους μπορείτε να δοκιμάσετε:

  1. Αν έχετε τη δυνατότητα, κάνετε επαναμεταγλώττιση την PHP με την παράμετρο --enable-memory-limit. Αυτό θα επιτρέψει στο Moodle να ορίσει μόνο του το όριο μνήμης.
  2. Αν έχετε πρόσβαση στο αρχείο php.ini, μπορείτε να αλλάξετε τη ρύθμιση memory_limit σε 40M. Αν δεν έχετε πρόσβαση ζητήστε από το διαχειριστή να το κάνει για εσάς.
  3. Σε κάποιους εξυπηρετητές PHP μπορείτε να δημιουργήσετε ένα αρχείο .htaccess στο φάκελο του Moodle που να περιέχει τις παρακάτω γραμμές:

    php_value memory_limit 40M

    Ωστόσο, σε κάποιους εξυπηρετητές αυτό θα εμποδίσει τη λειτουργία όλων των σελιδών PHP (θα βλέπετε σφάλματα όταν ανοίγετε τις σελίδες), οπότε θα πρέπει να διαγράψετε το αρχείο .htaccess.

'; $string['paths'] = 'Διαδρομές'; -$string['pathserrcreatedataroot'] = 'Ο Φάκελος Δεδομένων ({$a->dataroot}) δεν μπορεί να δημιουργθεί από το πρόγραμμα εγκατάστασης.'; +$string['pathserrcreatedataroot'] = 'Ο Φάκελος δεδομένων ({$a->dataroot}) δεν μπορεί να δημιουργθεί από το πρόγραμμα εγκατάστασης.'; $string['pathshead'] = 'Επιβεβαίωση Διαδρομών'; $string['pathsrodataroot'] = 'Ο Φάκελος Δεδομένων δεν είναι εγγράψιμος.'; -$string['pathsroparentdataroot'] = 'Ο Φάκελος γονέας ({$a->parent}) δεν είναι εγγράψιμος. Ο Φάκελος Δεδομένων ({$a->dataroot}) δεν μπορεί να δημιουργθεί από το πρόγραμμα εγκατάστασης.'; +$string['pathsroparentdataroot'] = 'Ο γονικός φάκελος ({$a->parent}) δεν είναι εγγράψιμος. Ο φάκελος δεδομένων ({$a->dataroot}) δεν μπορεί να δημιουργθεί από το πρόγραμμα εγκατάστασης.'; $string['pathssubadmindir'] = 'Κάποιοι λίγοι κεντρικοί υπολογιστές ιστού χρησιμοποιούν το /admin ως ειδική διεύθυνση URL για την πρόσβαση σε κάποιο πίνακα ελέγχου ή κάτι τέτοιο. Δυστυχώς αυτό έρχεται σε αντίθεση με την τυπική τοποθεσία των σελίδων διαχείρισης (admin) του Moodle. Αυτό μπορεί να διορθωθεί με την μετονομασία του admin φακέλου στην εγκατάστασή σας, και βάζοντας αυτό το καινούργιο όνομα εδώ. Για παράδειγμα: moodleadmin. Αυτό θα διορθώσει όλους τους συνδέσμους με το admin στην διεύθυνσή τους σε όλη την εγκατάσταση του Moodle σας.'; $string['pathssubdataroot'] = '

Ένας φάκελος όπου το Moodle θα αποθηκεύει όλα τα ανεβασμένα από τους χρήστες αρχεία.

Αυτος ο φάκελος θα πρέπει να είναι αναγνώσιμος ΚΑΙ ΕΓΓΡΑΨΙΜΟΣ από τον χρήστη του εξυπηρετητή ιστού (συνήθως \'nobody\' ή \'apache\').

Δεν πρέπει να είναι προσβάσιμος κατευθείαν από τον ιστό.

Αν ο φάκελος δεν υπάρχει, η διαδικασία εγκατάστασης θα προσπαθήσει να τον δημιουργήσει.

'; $string['pathssubdirroot'] = '

Η πλήρης διαδρομή του φακέλου που περιέχει τα αρχεία κώδικα του Moodle.

'; @@ -70,7 +70,7 @@ $string['welcomep10'] = '{$a->installername} ({$a->installerversion})'; $string['welcomep20'] = 'Βλέπετε αυτή τη σελίδα γιατί εγκαταστήσατε και ξεκινήσατε με επιτυχία το πακέτο {$a->packname} {$a->packversion} στον υπολογιστή σας. Συγχαρητήρια!'; $string['welcomep30'] = 'Αυτή η έκδοση/διανομή {$a->installername} περιλαμβάνει τις εφαρμογές για τη δημιουργία ενός περιβάλλοντος μέσα στο οποίο θα λειτουργεί το Moodle, ονομαστικά:'; $string['welcomep40'] = 'Το πακέτο περιλαμβάνει επίσης το Moodle {$a->moodlerelease} ({$a->moodleversion}).'; -$string['welcomep50'] = 'Η χρήση όλων των εφαρμογών σε αυτό το πακέτο υπόκειται στις αντίστοιχες άδειες. Ολόκληρο το πακέτο {$a->installername} είναι open source και διανέμεται με την GPL άδεια.'; +$string['welcomep50'] = 'Η χρήση όλων των εφαρμογών σε αυτό το πακέτο υπόκειται στις αντίστοιχες άδειες. Ολόκληρο το πακέτο {$a->installername} είναι λογισμικό ανοικτού κώδικα και διανέμεται με την GPL άδεια.'; $string['welcomep60'] = 'Οι παρακάτω σελίδες θα σας καθοδηγήσουν με εύκολα βήματα στην εγκατάσταση και ρύθμιση του Moodle στον υπολογιστή σας. Μπορείτε να δεχθείτε τις προεπιλεγμένες ρυθμίσεις ή προαιρετικά, να τις τροποποιήσετε ανάλογα με τις ανάγκες σας.'; $string['welcomep70'] = 'Πατήστε το κουμπί "Συνέχεια" για να συνεχίσετε με την εκγατάσταση του Moodle.'; $string['wwwroot'] = 'Διεύθυνση ιστοσελίδας'; diff --git a/install/lang/sl/admin.php b/install/lang/sl/admin.php index 47d9907ee43..66ee7b89e8c 100644 --- a/install/lang/sl/admin.php +++ b/install/lang/sl/admin.php @@ -42,3 +42,4 @@ Uporabite --help opcijo.'; $string['cliyesnoprompt'] = 'pritisnite d (pomeni da) ali n (pomeni ne)'; $string['environmentrequireinstall'] = 'namestitev oz. omogočanje je zahtevano.'; $string['environmentrequireversion'] = 'različica {$a->needed} je zahtevana, vi uporabljate {$a->current}'; +$string['upgradekeyset'] = 'Ključ za nadgradnjo (pustite prazno, če ga ne želite nastaviti)'; diff --git a/install/lang/sl/install.php b/install/lang/sl/install.php index 942648d300b..3f75fd64dd7 100644 --- a/install/lang/sl/install.php +++ b/install/lang/sl/install.php @@ -72,7 +72,7 @@ $string['pathserrcreatedataroot'] = 'Podatkovna mapa ({$a->dataroot}) ne more bi $string['pathshead'] = 'Potrdite poti'; $string['pathsrodataroot'] = 'Korenska mapa ni za pisanje.'; $string['pathsroparentdataroot'] = 'Starševska mapa ({$a->parent}) ni za pisanje. Podatkovna mapa ({$a->dataroot}) ne more biti ustvarjena preko namestitvenega programa.'; -$string['pathssubadmindir'] = 'Zelo malo Spletnih gostiteljev uporablja /admin kot posebni URL preko katerega dostopate do nadzorn plošče. Na žalost je to v konfliktu s standardno lokacijo za Moodlove skrbniške strani. To lahko popravite s preimenovanjemskrbniške mape v vaši namestitvi in vnesete tukaj to novo ime. Na primer: moodleadmin. To bo popravilo skrbniške povezave v Moodlu.'; +$string['pathssubadmindir'] = 'Zelo malo Spletnih gostiteljev uporablja /admin kot posebni URL preko katerega dostopate do nadzorne plošče. Na žalost je to v konfliktu s standardno lokacijo za Moodlove skrbniške strani. To lahko popravite s preimenovanjemskrbniške mape v vaši namestitvi in vnesete tukaj to novo ime. Na primer: moodleadmin. To bo popravilo skrbniške povezave v Moodlu.'; $string['pathssubdataroot'] = 'Potrebujete prostor, kamor bo Moodle shranjeval naložene datoteke. Ta mapa naj ima omogočeno branje IN PISANJE s strani uporabnika spletnega strežnika (po navadi \'brez\' ali \'apache\'), ampak ne sme biti dostopno neposredno preko spleta. Namestitveni program jo bo poskušal ustvariti, če že ne obstaja.'; $string['pathssubdirroot'] = '

Polna pot do mape s kodo Moodle.

'; $string['pathssubwwwroot'] = 'Polni spletni naslov kjer bo Moodle dostopan. Dostop do Moodla z uporabo več naslovov ni mogoč. Če ima vaša stran več javnih naslovov, morate nastaviti trajne preusmeritve na vse naslove razen tega. Če je vaša stran dosropana preko interneta in omrežja, uporabite tukaj javne naslove in nastaviet DNS tako, da lahko uporabniki znotraj omrežja uporabljajo tudi javne naslove. Če naslovi niso pravilni prosimo spremenite URL v vašem brskalniku in ponovno poženite namestitev z drugo vrednostjo.'; From 1a33d0869aff4ae7e6011c696a18cd2549f645de Mon Sep 17 00:00:00 2001 From: "Eloy Lafuente (stronk7)" Date: Thu, 11 Oct 2018 13:22:56 +0200 Subject: [PATCH 3/5] weekly release 3.5.2+ --- version.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/version.php b/version.php index b3638f374d8..0cfaa0006b9 100644 --- a/version.php +++ b/version.php @@ -29,11 +29,11 @@ defined('MOODLE_INTERNAL') || die(); -$version = 2018051702.05; // 20180517 = branching date YYYYMMDD - do not modify! +$version = 2018051702.06; // 20180517 = branching date YYYYMMDD - do not modify! // RR = release increments - 00 in DEV branches. // .XX = incremental changes. -$release = '3.5.2+ (Build: 20181005)'; // Human-friendly version name +$release = '3.5.2+ (Build: 20181011)'; // Human-friendly version name $branch = '35'; // This version's branch. $maturity = MATURITY_STABLE; // This version's maturity level. From e0f64e0feb2febf5173f766cb2e7f0ce4cd8372c Mon Sep 17 00:00:00 2001 From: Damyon Wiese Date: Fri, 10 Aug 2018 12:41:04 +0800 Subject: [PATCH 4/5] MDL-62139 output: Accessible action menus Add label on the "gear" menu and default keyboard and focus controls. --- lang/en/moodle.php | 1 + lib/outputcomponents.php | 6 +- lib/templates/action_menu_trigger.mustache | 2 +- lib/tests/user_menu_test.php | 5 +- theme/boost/amd/build/aria.min.js | 1 + theme/boost/amd/build/loader.min.js | 2 +- theme/boost/amd/src/aria.js | 183 ++++++++++++++++++ theme/boost/amd/src/loader.js | 8 +- .../boost/templates/core/action_menu.mustache | 2 +- .../core/action_menu_trigger.mustache | 6 +- .../templates/core/custom_menu_item.mustache | 2 +- 11 files changed, 205 insertions(+), 13 deletions(-) create mode 100644 theme/boost/amd/build/aria.min.js create mode 100644 theme/boost/amd/src/aria.js diff --git a/lang/en/moodle.php b/lang/en/moodle.php index eff6444238d..59830fa5f21 100644 --- a/lang/en/moodle.php +++ b/lang/en/moodle.php @@ -26,6 +26,7 @@ $string['abouttobeinstalled'] = 'about to be installed'; $string['action'] = 'Action'; $string['actionchoice'] = 'What do you want to do with the file \'{$a}\'?'; $string['actions'] = 'Actions'; +$string['actionsmenu'] = 'Actions menu'; $string['active'] = 'Active'; $string['activeusers'] = 'Active users'; $string['activities'] = 'Activities'; diff --git a/lib/outputcomponents.php b/lib/outputcomponents.php index 4e17d443c29..2e941ab0f8e 100644 --- a/lib/outputcomponents.php +++ b/lib/outputcomponents.php @@ -4287,7 +4287,7 @@ class action_menu implements renderable, templatable { $pixicon = ''; $linkclasses[] = 'textmenu'; } else { - $title = new lang_string('actions', 'moodle'); + $title = new lang_string('actionsmenu', 'moodle'); $this->actionicon = new pix_icon( 't/edit_menu', '', @@ -4476,8 +4476,8 @@ class action_menu implements renderable, templatable { $primary->menutrigger = $this->menutrigger; $primary->triggerextraclasses = $this->triggerextraclasses; } else { - $primary->title = get_string('actions'); - $actionicon = new pix_icon('t/edit_menu', '', 'moodle', ['class' => 'iconsmall actionmenu', 'title' => '']); + $primary->title = get_string('actionsmenu'); + $actionicon = new pix_icon('t/edit_menu', '', 'moodle', ['class' => 'iconsmall actionmenu', 'title' => $primary->title]); } if ($actionicon instanceof pix_icon) { diff --git a/lib/templates/action_menu_trigger.mustache b/lib/templates/action_menu_trigger.mustache index fce1a8b7e1f..bab31932683 100644 --- a/lib/templates/action_menu_trigger.mustache +++ b/lib/templates/action_menu_trigger.mustache @@ -27,4 +27,4 @@ "triggerextraclasses": "" } }} -{{{actiontext}}}{{{menutrigger}}}{{#icon}}{{#pix}}{{key}}, {{component}}, {{title}}{{/pix}}{{/icon}}{{#rawicon}}{{{.}}}{{/rawicon}}{{#menutrigger}}{{/menutrigger}} +{{{actiontext}}}{{{menutrigger}}}{{#icon}}{{#pix}}{{key}}, {{component}}, {{title}}{{/pix}}{{/icon}}{{#rawicon}}{{{.}}}{{/rawicon}}{{#menutrigger}}{{/menutrigger}} diff --git a/lib/tests/user_menu_test.php b/lib/tests/user_menu_test.php index 647d4408ec5..175be4c3990 100644 --- a/lib/tests/user_menu_test.php +++ b/lib/tests/user_menu_test.php @@ -86,6 +86,8 @@ test $this->setAdminUser(); $PAGE->set_url('/'); $CFG->theme = 'clean'; + $PAGE->reset_theme_and_output(); + $PAGE->initialise_theme_and_output(); // Set the configuration. set_config('customusermenuitems', $data); @@ -94,7 +96,8 @@ test $dividercount += 2; // The basic entry count will additionally include the wrapper menu, Dashboard, Profile, Logout and switch roles link. - $entrycount += 4; + // On clean theme only, the trigger is also a menuitem. + $entrycount += 5; $output = $OUTPUT->user_menu($USER); preg_match_all('/]+role="menuitem"[^>]+>/', $output, $results); diff --git a/theme/boost/amd/build/aria.min.js b/theme/boost/amd/build/aria.min.js new file mode 100644 index 00000000000..3ab88b9c87a --- /dev/null +++ b/theme/boost/amd/build/aria.min.js @@ -0,0 +1 @@ +define(["jquery"],function(a){return{init:function(){var b=!1,c=function(){b=!0},d=function(){var a=b;return b=!1,a};a('[data-toggle="dropdown"]').keydown(function(b){var d,e=b.which||b.keyCode;38==e&&c(),27==e&&(d=a(b.target).attr("aria-expanded"),b.preventDefault(),"false"==d&&a(b.target).click()),32!=e&&13!=e||(b.preventDefault(),a(b.target).click())});var e=function(b){var c=function(){a(this).focus()}.bind(b);setTimeout(c,50)};a(".dropdown").on("shown.bs.dropdown",function(b){var c=a(b.target).find('[role="menu"]'),f=!1,g=!1;c&&(f=a(c).find('[role="menuitem"]')),f&&f.length>0&&(g=d()?f[f.length-1]:f[0]),g&&e(g)}),a('.dropdown [role="menu"] [role="menuitem"]').keypress(function(b){var c,d=String.fromCharCode(b.which||b.keyCode),f=a(b.target).closest('[role="menu"]'),g=0,h=!1;if(f&&(h=a(f).find('[role="menuitem"]')))for(d=d.toLowerCase(),g=0;g. + +/** + * Enhancements to Bootstrap components for accessibility. + * + * @module theme_boost/aria + * @copyright 2018 Damyon Wiese + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +define(['jquery'], function($) { + return { + init: function() { + // Drop downs from bootstrap don't support keyboard accessibility by default. + var focusEnd = false, + setFocusEnd = function() { + focusEnd = true; + }, + getFocusEnd = function() { + var result = focusEnd; + focusEnd = false; + return result; + }; + + // Special handling for "up" keyboard control. + $('[data-toggle="dropdown"]').keydown(function (e) { + var trigger = e.which || e.keyCode, + expanded; + + // Up key opens the menu at the end. + if (trigger == 38) { + // Focus the end of the menu, not the beginning. + setFocusEnd(); + } + + // Escape key only closes the menu, it doesn't open it. + if (trigger == 27) { + expanded = $(e.target).attr('aria-expanded'); + e.preventDefault(); + if (expanded == "false") { + $(e.target).click(); + } + } + + // Space key or Enter key opens the menu. + if (trigger == 32 || trigger == 13) { + // Cancel random scroll. + e.preventDefault(); + // Open the menu instead. + $(e.target).click(); + } + }); + + // Special handling for navigation keys when menu is open. + var shiftFocus = function(element) { + var delayedFocus = function() { + $(this).focus(); + }.bind(element); + setTimeout(delayedFocus, 50); + }; + + $('.dropdown').on('shown.bs.dropdown', function(e) { + // We need to focus on the first menuitem. + var menu = $(e.target).find('[role="menu"]'), + menuItems = false, + foundMenuItem = false; + + if (menu) { + menuItems = $(menu).find('[role="menuitem"]'); + } + if (menuItems && menuItems.length > 0) { + if (getFocusEnd()) { + foundMenuItem = menuItems[menuItems.length - 1]; + } else { + // The first menu entry, pretty reasonable. + foundMenuItem = menuItems[0]; + } + } + if (foundMenuItem) { + shiftFocus(foundMenuItem); + } + }); + // Search for menu items. + $('.dropdown [role="menu"] [role="menuitem"]').keypress(function (e) { + var trigger = String.fromCharCode(e.which || e.keyCode), + menu = $(e.target).closest('[role="menu"]'), + i = 0, + menuItems = false, + item; + + if (!menu) { + return; + } + menuItems = $(menu).find('[role="menuitem"]'); + if (!menuItems) { + return; + } + + trigger = trigger.toLowerCase(); + for (i = 0; i < menuItems.length; i++) { + item = $(menuItems[i]); + if ((item.text().trim().indexOf(trigger) == 0) || + (item.text().trim().indexOf(trigger.toUpperCase()) == 0)) { + shiftFocus(item); + break; + } + } + }); + + // Keyboard navigation for arrow keys, home and end keys. + $('.dropdown [role="menu"] [role="menuitem"]').keydown(function (e) { + var trigger = e.which || e.keyCode, + next = false, + menu = $(e.target).closest('[role="menu"]'), + i = 0, + menuItems = false; + if (!menu) { + return; + } + menuItems = $(menu).find('[role="menuitem"]'); + if (!menuItems) { + return; + } + // Down. + if (trigger == 40) { + for (i = 0; i < menuItems.length - 1; i++) { + if (menuItems[i] == e.target) { + next = menuItems[i + 1]; + } + } + if (!next) { + // Wrap to first item. + trigger = 36; + } + } + // Up. + if (trigger == 38) { + for (i = 1; i < menuItems.length; i++) { + if (menuItems[i] == e.target) { + next = menuItems[i - 1]; + } + } + if (!next) { + // Wrap to last item. + trigger = 35; + } + } + // Home. + if (trigger == 36) { + next = menuItems[0]; + } + // End. + if (trigger == 35) { + next = menuItems[menuItems.length - 1]; + } + if (next) { + e.preventDefault(); + shiftFocus(next); + } + return; + }); + $('.dropdown').on('hidden.bs.dropdown', function(e) { + // We need to focus on the menu trigger. + var trigger = $(e.target).find('[data-toggle="dropdown"]'); + if (trigger) { + shiftFocus(trigger); + } + }); + } + }; +}); diff --git a/theme/boost/amd/src/loader.js b/theme/boost/amd/src/loader.js index bfd6d50fde5..8ab1706af09 100644 --- a/theme/boost/amd/src/loader.js +++ b/theme/boost/amd/src/loader.js @@ -28,7 +28,8 @@ define(['jquery', './tether', 'core/event'], function(jQuery, Tether, Event) { window.jQuery = jQuery; window.Tether = Tether; - require(['theme_boost/util', + require(['theme_boost/aria', + 'theme_boost/util', 'theme_boost/alert', 'theme_boost/button', 'theme_boost/carousel', @@ -39,7 +40,7 @@ define(['jquery', './tether', 'core/event'], function(jQuery, Tether, Event) { 'theme_boost/tab', 'theme_boost/tooltip', 'theme_boost/popover'], - function() { + function(Aria) { // We do twice because: https://github.com/twbs/bootstrap/issues/10547 jQuery('body').popover({ @@ -63,8 +64,11 @@ define(['jquery', './tether', 'core/event'], function(jQuery, Tether, Event) { selector: '[data-toggle="popover"]', trigger: 'focus' }); + }); }); + + Aria.init(); }); diff --git a/theme/boost/templates/core/action_menu.mustache b/theme/boost/templates/core/action_menu.mustache index c6878eab060..ab38ebab653 100644 --- a/theme/boost/templates/core/action_menu.mustache +++ b/theme/boost/templates/core/action_menu.mustache @@ -52,4 +52,4 @@ {{/primary}} - \ No newline at end of file + diff --git a/theme/boost/templates/core/action_menu_trigger.mustache b/theme/boost/templates/core/action_menu_trigger.mustache index e53f52bfa20..35c28e32b25 100644 --- a/theme/boost/templates/core/action_menu_trigger.mustache +++ b/theme/boost/templates/core/action_menu_trigger.mustache @@ -78,7 +78,7 @@ } }}