Skip to content

Commit 9f496c3

Browse files
authored
fix(dropdown,calendar): avoid tab to enter input on disabled variant
When a dropdown with search selection, or a calendar field, is disabled, the input fields were still accessible by using the tab key
1 parent eb3436f commit 9f496c3

File tree

2 files changed

+85
-5
lines changed

2 files changed

+85
-5
lines changed

src/definitions/modules/calendar.js

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ $.fn.calendar = function(parameters) {
4343
'20': {'row': 3, 'column': 1 },
4444
'30': {'row': 2, 'column': 1 }
4545
},
46-
numberText = ['','one','two','three','four','five','six','seven','eight'],
47-
selectionComplete = false
46+
numberText = ['','one','two','three','four','five','six','seven','eight']
4847
;
4948

5049
$allModules
@@ -78,6 +77,8 @@ $.fn.calendar = function(parameters) {
7877
isTouchDown = false,
7978
isInverted = $module.hasClass(className.inverted),
8079
focusDateUsedForRange = false,
80+
selectionComplete = false,
81+
classObserver,
8182
module
8283
;
8384

@@ -95,6 +96,7 @@ $.fn.calendar = function(parameters) {
9596
module.create.calendar();
9697

9798
module.bind.events();
99+
module.observeChanges();
98100
module.instantiate();
99101
},
100102

@@ -108,6 +110,7 @@ $.fn.calendar = function(parameters) {
108110
module.verbose('Destroying previous calendar for', element);
109111
$module.removeData(moduleNamespace);
110112
module.unbind.events();
113+
module.disconnect.classObserver();
111114
},
112115

113116
setup: {
@@ -197,6 +200,7 @@ $.fn.calendar = function(parameters) {
197200
if (settings.touchReadonly && $input.length && isTouch) {
198201
$input.prop('readonly', true);
199202
}
203+
module.check.disabled();
200204
},
201205
date: function () {
202206
var date;
@@ -639,6 +643,53 @@ $.fn.calendar = function(parameters) {
639643
module.trigger.change();
640644
selectionComplete = false;
641645
}
646+
},
647+
class: {
648+
mutation: function(mutations) {
649+
mutations.forEach(function(mutation) {
650+
if(mutation.attributeName === "class") {
651+
module.check.disabled();
652+
}
653+
});
654+
}
655+
}
656+
},
657+
658+
observeChanges: function() {
659+
if('MutationObserver' in window) {
660+
classObserver = new MutationObserver(module.event.class.mutation);
661+
module.debug('Setting up mutation observer', classObserver);
662+
module.observe.class();
663+
}
664+
},
665+
666+
disconnect: {
667+
classObserver: function() {
668+
if($input.length && classObserver) {
669+
classObserver.disconnect();
670+
}
671+
}
672+
},
673+
674+
observe: {
675+
class: function() {
676+
if($input.length && classObserver) {
677+
classObserver.observe($module[0], {
678+
attributes : true
679+
});
680+
}
681+
}
682+
},
683+
684+
is: {
685+
disabled: function() {
686+
return $module.hasClass(className.disabled);
687+
}
688+
},
689+
690+
check: {
691+
disabled: function(){
692+
$input.attr('tabindex',module.is.disabled() ? -1 : 0);
642693
}
643694
},
644695

@@ -1694,7 +1745,8 @@ $.fn.calendar.settings = {
16941745
rangeCell: 'range',
16951746
focusCell: 'focus',
16961747
todayCell: 'today',
1697-
today: 'today link'
1748+
today: 'today link',
1749+
disabled: 'disabled'
16981750
},
16991751

17001752
metadata: {

src/definitions/modules/dropdown.js

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ $.fn.dropdown = function(parameters) {
9797
id,
9898
selectObserver,
9999
menuObserver,
100+
classObserver,
100101
module
101102
;
102103

@@ -162,15 +163,18 @@ $.fn.dropdown = function(parameters) {
162163
;
163164
module.disconnect.menuObserver();
164165
module.disconnect.selectObserver();
166+
module.disconnect.classObserver();
165167
},
166168

167169
observeChanges: function() {
168170
if('MutationObserver' in window) {
169171
selectObserver = new MutationObserver(module.event.select.mutation);
170172
menuObserver = new MutationObserver(module.event.menu.mutation);
171-
module.debug('Setting up mutation observer', selectObserver, menuObserver);
173+
classObserver = new MutationObserver(module.event.class.mutation);
174+
module.debug('Setting up mutation observer', selectObserver, menuObserver, classObserver);
172175
module.observe.select();
173176
module.observe.menu();
177+
module.observe.class();
174178
}
175179
},
176180

@@ -184,6 +188,11 @@ $.fn.dropdown = function(parameters) {
184188
if(selectObserver) {
185189
selectObserver.disconnect();
186190
}
191+
},
192+
classObserver: function() {
193+
if(classObserver) {
194+
classObserver.disconnect();
195+
}
187196
}
188197
},
189198
observe: {
@@ -202,6 +211,13 @@ $.fn.dropdown = function(parameters) {
202211
subtree : true
203212
});
204213
}
214+
},
215+
class: function() {
216+
if(module.has.search() && classObserver) {
217+
classObserver.observe($module[0], {
218+
attributes : true
219+
});
220+
}
205221
}
206222
},
207223

@@ -1216,6 +1232,15 @@ $.fn.dropdown = function(parameters) {
12161232
}
12171233
}
12181234
},
1235+
class: {
1236+
mutation: function(mutations) {
1237+
mutations.forEach(function(mutation) {
1238+
if(mutation.attributeName === "class") {
1239+
module.check.disabled();
1240+
}
1241+
});
1242+
}
1243+
},
12191244
select: {
12201245
mutation: function(mutations) {
12211246
module.debug('<select> modified, recreating menu');
@@ -2136,6 +2161,9 @@ $.fn.dropdown = function(parameters) {
21362161
}
21372162
}
21382163
return true;
2164+
},
2165+
disabled: function(){
2166+
$search.attr('tabindex',module.is.disabled() ? -1 : 0);
21392167
}
21402168
},
21412169

@@ -2401,8 +2429,8 @@ $.fn.dropdown = function(parameters) {
24012429
module.debug('Added tabindex to searchable dropdown');
24022430
$search
24032431
.val('')
2404-
.attr('tabindex', 0)
24052432
;
2433+
module.check.disabled();
24062434
$menu
24072435
.attr('tabindex', -1)
24082436
;

0 commit comments

Comments
 (0)