1
- /* This is a patched version of semantic.dropdown which includes a11y changes, see
2
- https://github.com/go-gitea/gitea/pull/8638#issuecomment-549175290 */
3
-
4
1
/*!
5
2
* # Fomantic-UI - Dropdown
6
3
* http://github.com/fomantic/Fomantic-UI/
@@ -41,6 +38,10 @@ $.fn.dropdown = function(parameters) {
41
38
moduleSelector = $allModules . selector || '' ,
42
39
43
40
hasTouch = ( 'ontouchstart' in document . documentElement ) ,
41
+ clickEvent = hasTouch
42
+ ? 'touchstart'
43
+ : 'click' ,
44
+
44
45
time = new Date ( ) . getTime ( ) ,
45
46
performance = [ ] ,
46
47
@@ -663,27 +664,10 @@ $.fn.dropdown = function(parameters) {
663
664
664
665
bind : {
665
666
events : function ( ) {
666
- if ( hasTouch ) {
667
- module . bind . touchEvents ( ) ;
668
- }
669
667
module . bind . keyboardEvents ( ) ;
670
668
module . bind . inputEvents ( ) ;
671
669
module . bind . mouseEvents ( ) ;
672
670
} ,
673
- touchEvents : function ( ) {
674
- module . debug ( 'Touch device detected binding additional touch events' ) ;
675
- if ( module . is . searchSelection ( ) ) {
676
- // do nothing special yet
677
- }
678
- else if ( module . is . single ( ) ) {
679
- $module
680
- . on ( 'touchstart' + eventNamespace , module . event . test . toggle )
681
- ;
682
- }
683
- $menu
684
- . on ( 'touchstart' + eventNamespace , selector . item , module . event . item . mouseenter )
685
- ;
686
- } ,
687
671
keyboardEvents : function ( ) {
688
672
module . verbose ( 'Binding keyboard events' ) ;
689
673
$module
@@ -710,8 +694,8 @@ $.fn.dropdown = function(parameters) {
710
694
module . verbose ( 'Binding mouse events' ) ;
711
695
if ( module . is . multiple ( ) ) {
712
696
$module
713
- . on ( 'click' + eventNamespace , selector . label , module . event . label . click )
714
- . on ( 'click' + eventNamespace , selector . remove , module . event . remove . click )
697
+ . on ( clickEvent + eventNamespace , selector . label , module . event . label . click )
698
+ . on ( clickEvent + eventNamespace , selector . remove , module . event . remove . click )
715
699
;
716
700
}
717
701
if ( module . is . searchSelection ( ) ) {
@@ -720,24 +704,24 @@ $.fn.dropdown = function(parameters) {
720
704
. on ( 'mouseup' + eventNamespace , module . event . mouseup )
721
705
. on ( 'mousedown' + eventNamespace , selector . menu , module . event . menu . mousedown )
722
706
. on ( 'mouseup' + eventNamespace , selector . menu , module . event . menu . mouseup )
723
- . on ( 'click' + eventNamespace , selector . icon , module . event . icon . click )
724
- . on ( 'click' + eventNamespace , selector . clearIcon , module . event . clearIcon . click )
707
+ . on ( clickEvent + eventNamespace , selector . icon , module . event . icon . click )
708
+ . on ( clickEvent + eventNamespace , selector . clearIcon , module . event . clearIcon . click )
725
709
. on ( 'focus' + eventNamespace , selector . search , module . event . search . focus )
726
- . on ( 'click' + eventNamespace , selector . search , module . event . search . focus )
710
+ . on ( clickEvent + eventNamespace , selector . search , module . event . search . focus )
727
711
. on ( 'blur' + eventNamespace , selector . search , module . event . search . blur )
728
- . on ( 'click' + eventNamespace , selector . text , module . event . text . focus )
712
+ . on ( clickEvent + eventNamespace , selector . text , module . event . text . focus )
729
713
;
730
714
if ( module . is . multiple ( ) ) {
731
715
$module
732
- . on ( 'click' + eventNamespace , module . event . click )
716
+ . on ( clickEvent + eventNamespace , module . event . click )
733
717
;
734
718
}
735
719
}
736
720
else {
737
721
if ( settings . on == 'click' ) {
738
722
$module
739
- . on ( 'click' + eventNamespace , selector . icon , module . event . icon . click )
740
- . on ( 'click' + eventNamespace , module . event . test . toggle )
723
+ . on ( clickEvent + eventNamespace , selector . icon , module . event . icon . click )
724
+ . on ( clickEvent + eventNamespace , module . event . test . toggle )
741
725
;
742
726
}
743
727
else if ( settings . on == 'hover' ) {
@@ -755,7 +739,7 @@ $.fn.dropdown = function(parameters) {
755
739
. on ( 'mousedown' + eventNamespace , module . event . mousedown )
756
740
. on ( 'mouseup' + eventNamespace , module . event . mouseup )
757
741
. on ( 'focus' + eventNamespace , module . event . focus )
758
- . on ( 'click' + eventNamespace , selector . clearIcon , module . event . clearIcon . click )
742
+ . on ( clickEvent + eventNamespace , selector . clearIcon , module . event . clearIcon . click )
759
743
;
760
744
if ( module . has . menuSearch ( ) ) {
761
745
$module
@@ -769,7 +753,7 @@ $.fn.dropdown = function(parameters) {
769
753
}
770
754
}
771
755
$menu
772
- . on ( ' mouseenter' + eventNamespace , selector . item , module . event . item . mouseenter )
756
+ . on ( ( hasTouch ? 'touchstart' : ' mouseenter') + eventNamespace , selector . item , module . event . item . mouseenter )
773
757
. on ( 'mouseleave' + eventNamespace , selector . item , module . event . item . mouseleave )
774
758
. on ( 'click' + eventNamespace , selector . item , module . event . item . click )
775
759
;
@@ -783,7 +767,7 @@ $.fn.dropdown = function(parameters) {
783
767
;
784
768
}
785
769
$document
786
- . on ( 'click' + elementNamespace , module . event . test . hide )
770
+ . on ( clickEvent + elementNamespace , module . event . test . hide )
787
771
;
788
772
}
789
773
} ,
@@ -798,7 +782,7 @@ $.fn.dropdown = function(parameters) {
798
782
;
799
783
}
800
784
$document
801
- . off ( 'click' + elementNamespace )
785
+ . off ( clickEvent + elementNamespace )
802
786
;
803
787
}
804
788
} ,
@@ -946,6 +930,10 @@ $.fn.dropdown = function(parameters) {
946
930
text ,
947
931
value
948
932
;
933
+ if ( $choice . hasClass ( className . unfilterable ) ) {
934
+ results . push ( this ) ;
935
+ return true ;
936
+ }
949
937
if ( settings . match === 'both' || settings . match === 'text' ) {
950
938
text = module . remove . diacritics ( String ( module . get . choiceText ( $choice , false ) ) ) ;
951
939
if ( text . search ( beginsWithRegExp ) !== - 1 ) {
@@ -1084,6 +1072,7 @@ $.fn.dropdown = function(parameters) {
1084
1072
if ( settings . allowAdditions || ( hasSelected && ! module . is . multiple ( ) ) ) {
1085
1073
module . debug ( 'Forcing partial selection to selected item' , $selectedItem ) ;
1086
1074
$selectedItem [ 0 ] . click ( ) ;
1075
+ return ;
1087
1076
}
1088
1077
else {
1089
1078
module . remove . searchTerm ( ) ;
@@ -1115,7 +1104,7 @@ $.fn.dropdown = function(parameters) {
1115
1104
var
1116
1105
value = settings . templates . deQuote ( item [ fields . value ] ) ,
1117
1106
name = settings . templates . escape (
1118
- item [ fields . name ] || item [ fields . value ] ,
1107
+ item [ fields . name ] || '' ,
1119
1108
settings . preserveHTML
1120
1109
)
1121
1110
;
@@ -2077,6 +2066,9 @@ $.fn.dropdown = function(parameters) {
2077
2066
value = ( $option . attr ( 'value' ) !== undefined )
2078
2067
? $option . attr ( 'value' )
2079
2068
: name ,
2069
+ text = ( $option . data ( metadata . text ) !== undefined )
2070
+ ? $option . data ( metadata . text )
2071
+ : name ,
2080
2072
group = $option . parent ( 'optgroup' )
2081
2073
;
2082
2074
if ( settings . placeholder === 'auto' && value === '' ) {
@@ -2094,6 +2086,7 @@ $.fn.dropdown = function(parameters) {
2094
2086
select . values . push ( {
2095
2087
name : name ,
2096
2088
value : value ,
2089
+ text : text ,
2097
2090
disabled : disabled
2098
2091
} ) ;
2099
2092
}
@@ -2182,7 +2175,7 @@ $.fn.dropdown = function(parameters) {
2182
2175
return ;
2183
2176
}
2184
2177
if ( isMultiple ) {
2185
- if ( $ . inArray ( String ( optionValue ) , value ) !== - 1 ) {
2178
+ if ( $ . inArray ( module . escape . htmlEntities ( String ( optionValue ) ) , value ) !== - 1 ) {
2186
2179
$selectedItem = ( $selectedItem )
2187
2180
? $selectedItem . add ( $choice )
2188
2181
: $choice
@@ -2201,7 +2194,7 @@ $.fn.dropdown = function(parameters) {
2201
2194
optionValue = optionValue . toLowerCase ( ) ;
2202
2195
value = value . toLowerCase ( ) ;
2203
2196
}
2204
- if ( String ( optionValue ) == String ( value ) ) {
2197
+ if ( module . escape . htmlEntities ( String ( optionValue ) ) === module . escape . htmlEntities ( String ( value ) ) ) {
2205
2198
module . verbose ( 'Found select item by value' , optionValue , value ) ;
2206
2199
$selectedItem = $choice ;
2207
2200
return true ;
@@ -3175,6 +3168,7 @@ $.fn.dropdown = function(parameters) {
3175
3168
values = module . get . values ( ) ,
3176
3169
newValue
3177
3170
;
3171
+ removedValue = module . escape . htmlEntities ( removedValue ) ;
3178
3172
if ( module . has . selectInput ( ) ) {
3179
3173
module . verbose ( 'Input is <select> removing selected option' , removedValue ) ;
3180
3174
newValue = module . remove . arrayValue ( removedValue , values ) ;
@@ -3764,10 +3758,9 @@ $.fn.dropdown = function(parameters) {
3764
3758
} ,
3765
3759
htmlEntities : function ( string ) {
3766
3760
var
3767
- badChars = / [ & < > " ' ` ] / g,
3761
+ badChars = / [ < > " ' ` ] / g,
3768
3762
shouldEscape = / [ & < > " ' ` ] / ,
3769
3763
escape = {
3770
- "&" : "&" ,
3771
3764
"<" : "<" ,
3772
3765
">" : ">" ,
3773
3766
'"' : """ ,
@@ -3779,6 +3772,7 @@ $.fn.dropdown = function(parameters) {
3779
3772
}
3780
3773
;
3781
3774
if ( shouldEscape . test ( string ) ) {
3775
+ string = string . replace ( / & (? ! [ a - z 0 - 9 # ] { 1 , 6 } ; ) / , "&" ) ;
3782
3776
return string . replace ( badChars , escapedChar ) ;
3783
3777
}
3784
3778
return string ;
@@ -4175,7 +4169,8 @@ $.fn.dropdown.settings = {
4175
4169
delete : 'delete' ,
4176
4170
header : 'header' ,
4177
4171
divider : 'divider' ,
4178
- groupIcon : ''
4172
+ groupIcon : '' ,
4173
+ unfilterable : 'unfilterable'
4179
4174
}
4180
4175
4181
4176
} ;
@@ -4190,10 +4185,9 @@ $.fn.dropdown.settings.templates = {
4190
4185
return string ;
4191
4186
}
4192
4187
var
4193
- badChars = / [ & < > " ' ` ] / g,
4188
+ badChars = / [ < > " ' ` ] / g,
4194
4189
shouldEscape = / [ & < > " ' ` ] / ,
4195
4190
escape = {
4196
- "&" : "&" ,
4197
4191
"<" : "<" ,
4198
4192
">" : ">" ,
4199
4193
'"' : """ ,
@@ -4205,6 +4199,7 @@ $.fn.dropdown.settings.templates = {
4205
4199
}
4206
4200
;
4207
4201
if ( shouldEscape . test ( string ) ) {
4202
+ string = string . replace ( / & (? ! [ a - z 0 - 9 # ] { 1 , 6 } ; ) / , "&" ) ;
4208
4203
return string . replace ( badChars , escapedChar ) ;
4209
4204
}
4210
4205
return string ;
@@ -4260,10 +4255,10 @@ $.fn.dropdown.settings.templates = {
4260
4255
if ( option [ fields . icon ] ) {
4261
4256
html += '<i class="' + deQuote ( option [ fields . icon ] ) + ' ' + ( option [ fields . iconClass ] ? deQuote ( option [ fields . iconClass ] ) : className . icon ) + '"></i>' ;
4262
4257
}
4263
- html += escape ( option [ fields . name ] || option [ fields . value ] , preserveHTML ) ;
4258
+ html += escape ( option [ fields . name ] || '' , preserveHTML ) ;
4264
4259
html += '</div>' ;
4265
4260
} else if ( itemType === 'header' ) {
4266
- var groupName = escape ( option [ fields . name ] , preserveHTML ) ,
4261
+ var groupName = escape ( option [ fields . name ] || '' , preserveHTML ) ,
4267
4262
groupIcon = option [ fields . icon ] ? deQuote ( option [ fields . icon ] ) : className . groupIcon
4268
4263
;
4269
4264
if ( groupName !== '' || groupIcon !== '' ) {
0 commit comments