@@ -24,6 +24,28 @@ function getSelection($row) {
2424 return values ;
2525}
2626
27+ function getSelectedApplicable ( $row ) {
28+ var users = [ ] ;
29+ var groups = [ ] ;
30+ var multiselect = getSelection ( $row ) ;
31+ $ . each ( multiselect , function ( index , value ) {
32+ // FIXME: don't rely on string parts to detect groups...
33+ var pos = ( value . indexOf ) ?value . indexOf ( '(group)' ) : - 1 ;
34+ if ( pos !== - 1 ) {
35+ groups . push ( value . substr ( 0 , pos ) ) ;
36+ } else {
37+ users . push ( value ) ;
38+ }
39+ } ) ;
40+
41+ // FIXME: this should be done in the multiselect change event instead
42+ $row . find ( '.applicable' )
43+ . data ( 'applicable-groups' , groups )
44+ . data ( 'applicable-users' , users ) ;
45+
46+ return { users, groups } ;
47+ }
48+
2749function highlightBorder ( $element , highlight ) {
2850 $element . toggleClass ( 'warning-input' , highlight ) ;
2951 return highlight ;
@@ -56,7 +78,7 @@ function highlightInput($input) {
5678 * @param {Array<Object> } array of jQuery elements
5779 * @param {number } userListLimit page size for result list
5880 */
59- function addSelect2 ( $elements , userListLimit ) {
81+ function initApplicableUsersMultiselect ( $elements , userListLimit ) {
6082 var escapeHTML = function ( text ) {
6183 return text . toString ( )
6284 . split ( '&' ) . join ( '&' )
@@ -68,8 +90,8 @@ function addSelect2 ($elements, userListLimit) {
6890 if ( ! $elements . length ) {
6991 return ;
7092 }
71- $elements . select2 ( {
72- placeholder : t ( 'files_external' , 'All users. Type to select user or group.' ) ,
93+ return $elements . select2 ( {
94+ placeholder : t ( 'files_external' , 'Type to select user or group.' ) ,
7395 allowClear : true ,
7496 multiple : true ,
7597 toggleSelect : true ,
@@ -167,6 +189,8 @@ function addSelect2 ($elements, userListLimit) {
167189 $div . avatar ( $div . data ( 'name' ) , 32 ) ;
168190 }
169191 } ) ;
192+ } ) . on ( 'change' , function ( event ) {
193+ highlightBorder ( $ ( event . target ) . closest ( '.applicableUsersContainer' ) . find ( '.select2-choices' ) , ! event . val . length ) ;
170194 } ) ;
171195}
172196
@@ -721,6 +745,8 @@ MountConfigListView.prototype = _.extend({
721745
722746 this . $el . on ( 'change' , '.selectBackend' , _ . bind ( this . _onSelectBackend , this ) ) ;
723747 this . $el . on ( 'change' , '.selectAuthMechanism' , _ . bind ( this . _onSelectAuthMechanism , this ) ) ;
748+
749+ this . $el . on ( 'change' , '.applicableToAllUsers' , _ . bind ( this . _onChangeApplicableToAllUsers , this ) ) ;
724750 } ,
725751
726752 _onChange : function ( event ) {
@@ -746,6 +772,7 @@ MountConfigListView.prototype = _.extend({
746772
747773 var onCompletion = jQuery . Deferred ( ) ;
748774 $tr = this . newStorage ( storageConfig , onCompletion ) ;
775+ $tr . find ( '.applicableToAllUsers' ) . prop ( 'checked' , false ) . trigger ( 'change' ) ;
749776 onCompletion . resolve ( ) ;
750777
751778 $tr . find ( 'td.configuration' ) . children ( ) . not ( '[type=hidden]' ) . first ( ) . focus ( ) ;
@@ -764,6 +791,19 @@ MountConfigListView.prototype = _.extend({
764791 this . saveStorageConfig ( $tr ) ;
765792 } ,
766793
794+ _onChangeApplicableToAllUsers : function ( event ) {
795+ var $target = $ ( event . target ) ;
796+ var $tr = $target . closest ( 'tr' ) ;
797+ var checked = $target . is ( ':checked' ) ;
798+
799+ $tr . find ( '.applicableUsersContainer' ) . toggleClass ( 'hidden' , checked ) ;
800+ if ( ! checked ) {
801+ $tr . find ( '.applicableUsers' ) . select2 ( 'val' , '' , true ) ;
802+ }
803+
804+ this . saveStorageConfig ( $tr ) ;
805+ } ,
806+
767807 /**
768808 * Configure the storage config with a new authentication mechanism
769809 *
@@ -818,7 +858,7 @@ MountConfigListView.prototype = _.extend({
818858 $tr . removeAttr ( 'id' ) ;
819859 $tr . find ( 'select#selectBackend' ) ;
820860 if ( ! deferAppend ) {
821- addSelect2 ( $tr . find ( '.applicableUsers' ) , this . _userListLimit ) ;
861+ initApplicableUsersMultiselect ( $tr . find ( '.applicableUsers' ) , this . _userListLimit ) ;
822862 }
823863
824864 if ( storageConfig . id ) {
@@ -890,7 +930,14 @@ MountConfigListView.prototype = _.extend({
890930 } )
891931 ) ;
892932 }
893- $tr . find ( '.applicableUsers' ) . val ( applicable ) . trigger ( 'change' ) ;
933+ if ( applicable . length ) {
934+ $tr . find ( '.applicableUsers' ) . val ( applicable ) . trigger ( 'change' )
935+ $tr . find ( '.applicableUsersContainer' ) . removeClass ( 'hidden' ) ;
936+ } else {
937+ // applicable to all
938+ $tr . find ( '.applicableUsersContainer' ) . addClass ( 'hidden' ) ;
939+ }
940+ $tr . find ( '.applicableToAllUsers' ) . prop ( 'checked' , ! applicable . length ) ;
894941
895942 var priorityEl = $ ( '<input type="hidden" class="priority" value="' + backend . priority + '" />' ) ;
896943 $tr . append ( priorityEl ) ;
@@ -967,7 +1014,7 @@ MountConfigListView.prototype = _.extend({
9671014 }
9681015 $rows = $rows . add ( $tr ) ;
9691016 } ) ;
970- addSelect2 ( self . $el . find ( '.applicableUsers' ) , this . _userListLimit ) ;
1017+ initApplicableUsersMultiselect ( self . $el . find ( '.applicableUsers' ) , this . _userListLimit ) ;
9711018 self . $el . find ( 'tr#addMountPoint' ) . before ( $rows ) ;
9721019 var mainForm = $ ( '#files_external' ) ;
9731020 if ( result . length === 0 && mainForm . attr ( 'data-can-create' ) === 'false' ) {
@@ -1007,7 +1054,7 @@ MountConfigListView.prototype = _.extend({
10071054 }
10081055 $rows = $rows . add ( $tr ) ;
10091056 } ) ;
1010- addSelect2 ( $rows . find ( '.applicableUsers' ) , this . _userListLimit ) ;
1057+ initApplicableUsersMultiselect ( $rows . find ( '.applicableUsers' ) , this . _userListLimit ) ;
10111058 self . $el . find ( 'tr#addMountPoint' ) . before ( $rows ) ;
10121059 onCompletion . resolve ( ) ;
10131060 onLoaded2 . resolve ( ) ;
@@ -1126,24 +1173,25 @@ MountConfigListView.prototype = _.extend({
11261173
11271174 // gather selected users and groups
11281175 if ( ! this . _isPersonal ) {
1129- var groups = [ ] ;
1130- var users = [ ] ;
1131- var multiselect = getSelection ( $tr ) ;
1132- $ . each ( multiselect , function ( index , value ) {
1133- var pos = ( value . indexOf ) ?value . indexOf ( '(group)' ) : - 1 ;
1134- if ( pos !== - 1 ) {
1135- groups . push ( value . substr ( 0 , pos ) ) ;
1136- } else {
1137- users . push ( value ) ;
1138- }
1139- } ) ;
1140- // FIXME: this should be done in the multiselect change event instead
1141- $tr . find ( '.applicable' )
1142- . data ( 'applicable-groups' , groups )
1143- . data ( 'applicable-users' , users ) ;
1176+ var multiselect = getSelectedApplicable ( $tr ) ;
1177+ var users = multiselect . users || [ ] ;
1178+ var groups = multiselect . groups || [ ] ;
1179+ var isApplicableToAllUsers = $tr . find ( '.applicableToAllUsers' ) . is ( ':checked' ) ;
1180+
1181+ if ( isApplicableToAllUsers ) {
1182+ storage . applicableUsers = [ ] ;
1183+ storage . applicableGroups = [ ] ;
1184+ } else {
1185+ storage . applicableUsers = users ;
1186+ storage . applicableGroups = groups ;
11441187
1145- storage . applicableUsers = users ;
1146- storage . applicableGroups = groups ;
1188+ if ( ! storage . applicableUsers . length && ! storage . applicableGroups . length ) {
1189+ if ( ! storage . errors ) {
1190+ storage . errors = { } ;
1191+ }
1192+ storage . errors [ 'requiredApplicable' ] = true ;
1193+ }
1194+ }
11471195
11481196 storage . priority = parseInt ( $tr . find ( 'input.priority' ) . val ( ) || '100' , 10 ) ;
11491197 }
0 commit comments