@@ -19,6 +19,10 @@ $action = "add"; | |||
$username = $_POST["username"]; | |||
$group = $_POST["group"]; | |||
if(!OC_Group::groupExists($group)){ | |||
OC_Group::createGroup($group); | |||
} | |||
// Toggle group | |||
if( OC_Group::inGroup( $username, $group )){ | |||
$action = "remove"; |
@@ -33,11 +33,16 @@ OC_Util::addScript( "admin", "apps" ); | |||
$registeredApps=OC_App::getAllApps(); | |||
$apps=array(); | |||
$blacklist=array('files_imageviewer','files_textviewer');//we dont want to show configuration for these | |||
foreach($registeredApps as $app){ | |||
$info=OC_App::getAppInfo($app); | |||
$active=(OC_Appconfig::getValue($app,'enabled','no')=='yes')?true:false; | |||
$info['active']=$active; | |||
$apps[]=$info; | |||
if(array_search($app,$blacklist)===false){ | |||
$info=OC_App::getAppInfo($app); | |||
$active=(OC_Appconfig::getValue($app,'enabled','no')=='yes')?true:false; | |||
$info['active']=$active; | |||
$apps[]=$info; | |||
} | |||
} | |||
$categories=OC_OCSClient::getCategories(); |
@@ -1,5 +1,6 @@ | |||
form {display:inline} | |||
td.remove>img,td.select>input{display:none;cursor:pointer} | |||
td.select,td.remove{width:1em} | |||
tr:hover>td.remove>img{display:inline} | |||
li.selected{background-color:#ddd} | |||
form { display:inline } | |||
td.remove>img,td.select>input { display:none;cursor:pointer } | |||
td.select,td.remove { width:1em } | |||
tr:hover>td.remove>img { display:inline } | |||
li.selected { background-color:#ddd } | |||
#content>table { margin-top:6.5em } |
@@ -1,5 +1,37 @@ | |||
$(document).ready(function(){ | |||
$('select[multiple]').chosen(); | |||
function applyMultiplySelect(element){ | |||
var checked=[]; | |||
var user=element.data('username') | |||
if(element.data('userGroups')){ | |||
checked=element.data('userGroups').split(', '); | |||
} | |||
if(user){ | |||
var checkHandeler=function(group){ | |||
if(user==OC.currentUser && group=='admin'){ | |||
return false; | |||
} | |||
$.post( | |||
OC.filePath('admin','ajax','togglegroups.php'), | |||
{ | |||
username:user, | |||
group:group | |||
}, | |||
function(){} | |||
); | |||
} | |||
}else{ | |||
checkHandeler=false; | |||
} | |||
element.multiSelect({ | |||
createText:'add group', | |||
checked:checked, | |||
oncheck:checkHandeler, | |||
onuncheck:checkHandeler | |||
}); | |||
} | |||
$('select[multiple]').each(function(index,element){ | |||
applyMultiplySelect($(element)); | |||
}); | |||
$('td.remove>img').live('click',function(event){ | |||
var uid=$(this).parent().parent().data('uid'); | |||
@@ -17,7 +49,7 @@ $(document).ready(function(){ | |||
event.preventDefault(); | |||
var username=$('#newusername').val(); | |||
var password=$('#newuserpassword').val(); | |||
var groups=$('#newusergroups').val(); | |||
var groups=$('#newusergroups').prev().children('div').data('settings').checked; | |||
$.post( | |||
OC.filePath('admin','ajax','createuser.php'), | |||
{ | |||
@@ -29,72 +61,18 @@ $(document).ready(function(){ | |||
} | |||
); | |||
var tr=$('#rightcontent tr').first().clone(); | |||
var tr=$('#content table tr').first().clone(); | |||
tr.attr('data-uid',username); | |||
tr.find('td.name').text(username); | |||
tr.find('td.groups').text(groups.join(', ')); | |||
$('#rightcontent tr').first().after(tr); | |||
if(groups.indexOf($('#leftcontent li.selected').text().trim())!=-1){ | |||
tr.find('td.select input').attr('checked','checked'); | |||
} | |||
}); | |||
$('#newgroup').submit(function(event){ | |||
event.preventDefault(); | |||
var name=$('#newgroupname').val(); | |||
$.post( | |||
OC.filePath('admin','ajax','creategroup.php'), | |||
{groupname:name}, | |||
function(result){ | |||
} | |||
); | |||
$('#newusergroups').append('<option value="'+name+'">'+name+'</option>'); | |||
$('select[multiple]').trigger("liszt:updated"); | |||
var li=$('#leftcontent li').first().next().clone(); | |||
li.text(name); | |||
$('#leftcontent li').first().after(li); | |||
}); | |||
$('#leftcontent li').live('click',function(event){ | |||
$('#leftcontent li').removeClass('selected'); | |||
$(this).addClass('selected'); | |||
$('#rightcontent tr td.select input').show(); | |||
$('#rightcontent tr td.select input').removeAttr('checked'); | |||
var group=$(this).text().trim(); | |||
var rows=$('#rightcontent tr').filter(function(i,tr){ | |||
return ($(tr).children('td.groups').text().split(', ').indexOf(group)>-1); | |||
var select=$('<select multiple="multiple" data-placehoder="Groups" title="Groups">'); | |||
select.data('username',username); | |||
select.data('userGroups',groups.join(', ')); | |||
tr.find('td.groups').empty(); | |||
$.each($('#content table').data('groups').split(', '),function(i,group){ | |||
select.append($('<option value="'+group+'">'+group+'</option>')); | |||
}); | |||
rows.find('td.select input').attr('checked','checked'); | |||
}); | |||
$('#rightcontent tr td.select input').live('change',function(event){ | |||
var group=$('#leftcontent li.selected').text().trim(); | |||
var user=$(this).parent().parent().children('td.name').text().trim(); | |||
if(group=='admin' && user==OC.currentUser){ | |||
event.preventDefault(); | |||
$(this).attr('checked','checked'); | |||
return false; | |||
} | |||
if(group){ | |||
$.post( | |||
OC.filePath('admin','ajax','togglegroups.php'), | |||
{ | |||
username:user, | |||
group:group | |||
}, | |||
function(result){ | |||
} | |||
); | |||
var groups=$(this).parent().parent().children('td.groups').text().trim().split(', '); | |||
if(groups[0]=='') groups.pop(); | |||
var index=groups.indexOf(group); | |||
if(index==-1){ | |||
groups.push(group); | |||
}else{ | |||
groups.splice(index,1); | |||
} | |||
$(this).parent().parent().children('td.groups').text(groups.join(', ')); | |||
} | |||
tr.find('td.groups').append(select); | |||
applyMultiplySelect(select); | |||
$('#content table tr').last().after(tr); | |||
}); | |||
}); |
@@ -1,8 +1,4 @@ | |||
<div id="controls"> | |||
<form id="newgroup"> | |||
<input id="newgroupname" placeholder="<?php echo $l->t('Name')?>"></input> | |||
<input type="submit" value="<?php echo $l->t('Create')?>"></input> | |||
</form> | |||
<form id="newuser"> | |||
<input id="newusername" placeholder="<?php echo $l->t('Name')?>"></input> | |||
<input type="password" id="newuserpassword" placeholder="<?php echo $l->t('Password')?>"></input> | |||
@@ -14,29 +10,29 @@ | |||
<input type="submit" value="<?php echo $l->t('Create')?>"></input> | |||
</form> | |||
</div> | |||
<ul id="leftcontent"> | |||
<?php foreach($_["groups"] as $group): ?> | |||
<li data-gid="<?php echo $group["name"]; ?>"> | |||
<?php echo $group["name"] ?> | |||
</li> | |||
<?php | |||
$allGroups=array(); | |||
foreach($_["groups"] as $group){ | |||
$allGroups[]=$group['name']; | |||
} | |||
?> | |||
<table data-groups="<?php echo implode(', ',$allGroups);?>"> | |||
<?php foreach($_["users"] as $user): ?> | |||
<tr data-uid="<?php echo $user["name"] ?>"> | |||
<td class="select"><input type="checkbox"></input></td> | |||
<td class="name"><?php echo $user["name"]; ?></td> | |||
<td class="groups"> | |||
<select data-username="<?php echo $user['name'] ;?>" data-user-groups="<?php echo $user['groups'] ;?>" data-placeholder="groups" title="<?php echo $l->t('Groups')?>" multiple="multiple"> | |||
<?php foreach($_["groups"] as $group): ?> | |||
<option value="<?php echo $group['name'];?>"><?php echo $group['name'];?></option> | |||
<?php endforeach;?> | |||
</select> | |||
</td> | |||
<td class="remove"> | |||
<?php if($user['name']!=OC_User::getUser()):?> | |||
<img alt="Remove" title="<?php echo $l->t('Remove')?>" class='svg' src='<?php echo image_path('core','actions/delete.svg') ?>'/> | |||
<?php endif;?> | |||
</td> | |||
</tr> | |||
<?php endforeach; ?> | |||
</ul> | |||
<div id="rightcontent"> | |||
<table> | |||
<?php foreach($_["users"] as $user): ?> | |||
<tr data-uid="<?php echo $user["name"] ?>"> | |||
<td class="select"><input type="checkbox"></input></td> | |||
<td class="name"><?php echo $user["name"]; ?></td> | |||
<td class="groups"><?php if( $user["groups"] ){ echo $user["groups"]; }else{echo " ";} ?></td> | |||
<td class="remove"> | |||
<?php if($user['name']!=OC_User::getUser()):?> | |||
<img alt="Remove" title="<?php echo $l->t('Remove')?>" class='svg' src='<?php echo image_path('core','actions/delete.svg') ?>'/> | |||
<?php endif;?> | |||
</td> | |||
</tr> | |||
<?php endforeach; ?> | |||
</table> | |||
</div> | |||
<div id="#selecteduser"> | |||
</div> | |||
</table> |
@@ -38,12 +38,7 @@ $users = array(); | |||
$groups = array(); | |||
foreach( OC_User::getUsers() as $i ){ | |||
// Do some more work here soon | |||
$ingroups = array(); | |||
foreach( OC_Group::getUserGroups( $i ) as $userGroup ){ | |||
$ingroups[] = $userGroup; | |||
} | |||
$users[] = array( "name" => $i, "groups" => join( ", ", $ingroups )); | |||
$users[] = array( "name" => $i, "groups" => join( ", ", OC_Group::getUserGroups( $i ) )); | |||
} | |||
foreach( OC_Group::getGroups() as $i ){ |
@@ -0,0 +1,6 @@ | |||
ul.multiselectoptions { z-index:49; position:absolute; background-color:#fff; padding-top:.5em; border-bottom-left-radius:.5em; border-bottom-right-radius:.5em; border:1px solid #ddd; border-top:none; } | |||
div.multiselect { padding-right:.6em; display:inline; position:relative; display:inline-block } | |||
div.multiselect.active { background-color:#fff; border-bottom:none; border-bottom-left-radius:0; border-bottom-right-radius:0; z-index:50; position:relative } | |||
div.multiselect>span:first-child { margin-right:2em; } | |||
div.multiselect>span:last-child { float:right; position:relative } | |||
ul.multiselectoptions input.new{ margin:0; padding-bottom:0.2em; padding-top:0.2em; border-top-left-radius:0; border-top-right-radius:0; } |
@@ -33,12 +33,12 @@ h1 { margin:1em 3em 1em 0; border-bottom:1px solid #666; text-transform:uppercas | |||
/* INPUTS */ | |||
input[type="text"], input[type="password"] { cursor:text; } | |||
input, select { font-size:1em; width:10em; margin:.3em; padding:.6em .5em .4em; background:#fff; color:#333; border:1px solid #ddd; -moz-box-shadow:0 1px 1px #fff, 0 2px 0 #bbb inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 0 #bbb inset; box-shadow:0 1px 1px #fff, 0 1px 0 #bbb inset; -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; } | |||
input, select, .button { font-size:1em; width:10em; margin:.3em; padding:.6em .5em .4em; background:#fff; color:#333; border:1px solid #ddd; -moz-box-shadow:0 1px 1px #fff, 0 2px 0 #bbb inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 0 #bbb inset; box-shadow:0 1px 1px #fff, 0 1px 0 #bbb inset; -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; } | |||
input[type="text"], input[type="password"] { background:#f8f8f8; color:#555; cursor:text; } | |||
input[type="text"]:hover, input[type="text"]:focus, input[type="password"]:hover, input[type="password"]:focus { background:#fff; color:#333; } | |||
input[type="submit"], input[type="button"] { width:auto; padding:.4em; border:1px solid #ddd; font-weight:bold; cursor:pointer; background:#f8f8f8; color:#555; text-shadow:#fff 0 1px 0; -moz-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; } | |||
input[type="submit"]:hover, input[type="submit"]:focus, input[type="button"]:hover, input[type="button"]:focus { background:#fff; color:#333; } | |||
input[type="submit"], input[type="button"], .button { width:auto; padding:.4em; border:1px solid #ddd; font-weight:bold; cursor:pointer; background:#f8f8f8; color:#555; text-shadow:#fff 0 1px 0; -moz-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -webkit-box-shadow:0 1px 1px #fff, 0 1px 1px #fff inset; -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; } | |||
input[type="submit"]:hover, input[type="submit"]:focus, input[type="button"]:hover, input[type="button"]:focus, .button:hover { background:#fff; color:#333; } | |||
input[type="checkbox"] { width:auto; } | |||
#body-login input { font-size:1.5em; } |
@@ -275,7 +275,29 @@ $(document).ready(function(){ | |||
}) | |||
}); | |||
if (!Array.prototype.map){ | |||
Array.prototype.map = function(fun /*, thisp */){ | |||
"use strict"; | |||
if (this === void 0 || this === null) | |||
throw new TypeError(); | |||
var t = Object(this); | |||
var len = t.length >>> 0; | |||
if (typeof fun !== "function") | |||
throw new TypeError(); | |||
var res = new Array(len); | |||
var thisp = arguments[1]; | |||
for (var i = 0; i < len; i++){ | |||
if (i in t){ | |||
res[i] = fun.call(thisp, t[i], i, t); | |||
} | |||
} | |||
return res; | |||
}; | |||
} | |||
/* |
@@ -0,0 +1,160 @@ | |||
(function( $ ){ | |||
var multiSelectId=-1; | |||
$.fn.multiSelect=function(options){ | |||
multiSelectId++; | |||
var settings = { | |||
'createCallback':false, | |||
'createText':false, | |||
'title':this.attr('title'), | |||
'checked':[], | |||
'oncheck':false, | |||
'onuncheck':false, | |||
}; | |||
$.extend(settings,options); | |||
var button=$('<div class="multiselect button"><span>'+settings.title+'</span><span>▾</span></div>'); | |||
if(settings.checked.length>0){ | |||
button.children('span').first().text(settings.checked.join(', ')); | |||
} | |||
var span=$('<span/>'); | |||
span.append(button); | |||
button.data('id',multiSelectId); | |||
button.selectedItems=[]; | |||
this.hide(); | |||
this.before(span); | |||
settings.minWidth=button.width(); | |||
button.css('min-width',settings.minWidth); | |||
settings.minOuterWidth=button.outerWidth()-2; | |||
button.data('settings',settings); | |||
button.click(function(event){ | |||
var button=$(this); | |||
if(button.parent().children('ul').length>0){ | |||
button.parent().children('ul').slideUp(400,function(){ | |||
button.parent().children('ul').remove(); | |||
button.removeClass('active'); | |||
}); | |||
return; | |||
} | |||
var lists=$('ul.multiselectoptions'); | |||
lists.slideUp(400,function(){ | |||
lists.remove(); | |||
$('div.multiselect').removeClass('active'); | |||
button.addClass('active'); | |||
}); | |||
button.addClass('active'); | |||
event.stopPropagation(); | |||
var options=$(this).parent().next().children().map(function(){return $(this).val()}); | |||
var list=$('<ul class="multiselectoptions"/>').hide().appendTo($(this).parent()); | |||
function createItem(item,checked){ | |||
var id='ms'+multiSelectId+'-option-'+item; | |||
var input=$('<input id="'+id+'" type="checkbox"/>'); | |||
var label=$('<label for="'+id+'">'+item+'</label>'); | |||
if(settings.checked.indexOf(item)!=-1 || checked){ | |||
input.attr('checked','checked'); | |||
} | |||
if(checked){ | |||
settings.checked.push(item); | |||
} | |||
input.change(function(){ | |||
var groupname=$(this).next().text(); | |||
if($(this).attr('checked')){ | |||
settings.checked.push(groupname); | |||
if(settings.oncheck){ | |||
if(settings.oncheck(groupname)===false){ | |||
$(this).removeAttr('checked'); | |||
return; | |||
} | |||
} | |||
}else{ | |||
var index=settings.checked.indexOf(groupname); | |||
settings.checked.splice(index,1); | |||
if(settings.onuncheck){ | |||
if(settings.onuncheck(groupname)===false){ | |||
$(this).attr('checked','checked'); | |||
return; | |||
} | |||
} | |||
} | |||
var oldWidth=button.width(); | |||
if(settings.checked.length>0){ | |||
button.children('span').first().text(settings.checked.join(', ')); | |||
}else{ | |||
button.children('span').first().text(settings.title); | |||
} | |||
var newOuterWidth=Math.max((button.outerWidth()-2),settings.minOuterWidth)+'px' | |||
var newWidth=Math.max(button.width(),settings.minWidth); | |||
button.css('height',button.height()); | |||
button.css('white-space','nowrap'); | |||
button.css('width',oldWidth); | |||
button.animate({'width':newWidth},undefined,undefined,function(){ | |||
button.css('width',''); | |||
}); | |||
list.animate({'width':newOuterWidth}); | |||
}); | |||
var li=$('<li></li>'); | |||
li.append(input).append(label); | |||
return li; | |||
} | |||
$.each(options,function(index,item){ | |||
list.append(createItem(item)); | |||
}); | |||
button.parent().data('preventHide',false); | |||
if(settings.createText){ | |||
var li=$('<li>+ <em>'+settings.createText+'<em></li>'); | |||
li.click(function(event){ | |||
li.empty(); | |||
var input=$('<input class="new">'); | |||
li.append(input); | |||
input.focus(); | |||
input.css('width',button.width()); | |||
button.parent().data('preventHide',true); | |||
input.keypress(function(event) { | |||
if(event.keyCode == 13) { | |||
event.preventDefault(); | |||
event.stopPropagation(); | |||
var li=$(this).parent(); | |||
$(this).remove(); | |||
li.text('+ '+settings.createText); | |||
li.before(createItem($(this).val())); | |||
li.prev().children('input').trigger('click'); | |||
button.parent().data('preventHide',false); | |||
var select=button.parent().next(); | |||
select.append($('<option value="'+$(this).val()+'">'+$(this).val()+'</option>')); | |||
if(settings.createCallback){ | |||
settings.createCallback(); | |||
} | |||
} | |||
}); | |||
input.blur(function(){ | |||
event.preventDefault(); | |||
event.stopPropagation(); | |||
$(this).remove(); | |||
li.text('+ '+settings.createText); | |||
setTimeout(function(){ | |||
button.parent().data('preventHide',false); | |||
},100); | |||
}); | |||
}); | |||
list.append(li); | |||
} | |||
var pos=button.position(); | |||
list.css('top',pos.top+button.outerHeight()-5); | |||
list.css('left',pos.left+3); | |||
list.css('width',(button.outerWidth()-2)+'px'); | |||
list.slideDown(); | |||
list.click(function(event){ | |||
event.stopPropagation(); | |||
}); | |||
}); | |||
$(window).click(function(){ | |||
if(!button.parent().data('preventHide')){ | |||
button.parent().children('ul').slideUp(400,function(){ | |||
button.parent().children('ul').remove(); | |||
button.removeClass('active'); | |||
}); | |||
} | |||
}); | |||
return span; | |||
}; | |||
})( jQuery ); |
@@ -149,9 +149,11 @@ OC_Group::setBackend( OC_Config::getValue( "groupbackend", "database" )); | |||
OC_Util::addScript( "jquery-1.6.2.min" ); | |||
OC_Util::addScript( "jquery-ui-1.8.14.custom.min" ); | |||
OC_Util::addScript( "js" ); | |||
OC_Util::addScript( "multiselect" ); | |||
OC_Util::addScript('search','result'); | |||
OC_Util::addStyle( "jquery-ui-1.8.14.custom" ); | |||
OC_Util::addStyle( "styles" ); | |||
OC_Util::addStyle( "multiselect" ); | |||
// Load Apps | |||
// This includes plugins for users and filesystems as well |
@@ -171,11 +171,11 @@ class OC_Group { | |||
*/ | |||
public static function addToGroup( $uid, $gid ){ | |||
// Does the user exist? | |||
if( !in_array( $uid, OC_User::getUsers())){ | |||
if( !OC_User::userExists($uid)){ | |||
return false; | |||
} | |||
// Does the group exist? | |||
if( !in_array( $gid, self::getGroups())){ | |||
if( !OC_Group::groupExists($gid)){ | |||
return false; | |||
} | |||
@@ -234,4 +234,13 @@ class OC_Group { | |||
public static function getGroups(){ | |||
return self::$_backend->getGroups(); | |||
} | |||
/** | |||
* check if a group exists | |||
* @param string $gid | |||
* @return bool | |||
*/ | |||
public static function groupExists($gid){ | |||
return in_array( $gid, self::getGroups()); | |||
} | |||
} |