src/modules/user/views/rbac/index.tpl
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item active">
<a class="nav-link active" href="#users" role="tab" data-toggle="tab">{Yii::tr('Users', [], 'user')}</a></li>
<li class="nav-item">
<a class="nav-link" href="#roles" role="tab" data-toggle="tab">{Yii::tr('Roles', [], 'user')}</a></li>
<li class="nav-item">
<a class="nav-link" href="#permission" role="tab" data-toggle="tab">{Yii::tr('Permissions', [], 'user')}</a>
</li>
</ul>
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="users">
<div class="object-filters form-inline">
<div class="filter form-group">
<label for="search-user">{Yii::tr('Search:', [], 'user')}</label>
<input class="form-control" name="search" id="search-user" type="text" value="{if isset($search)}{$search}{/if}">
</div>
<div class="filter form-group">
<label for="select-filter-role">{Yii::tr('Role', [], 'user')}:</label>
<select class="selectpicker select-filter-role" id="select-filter-role" title="{Yii::tr('Select role', [], 'user')}...">
<option value="">----</option>
{foreach $roles as $role}
<option value="{$role.name}"{if $role.name==$filterRole} selected="selected"{/if}>{$role.name}</option>
{/foreach}
</select>
</div>
</div>
<table class="table table-hover table-striped" id="user-list">
<thead>
<tr>
{foreach [ 'id','', 'name', 'email', 'roles', 'active', 'loginDT', 'activeDT'] as $key}
<th>
{Yii::tr(ucfirst($key), [], 'user')}
{if isset($sort)}
{if array_key_exists($key, $sort->attributeOrders)}
{if $sort->attributeOrders[$key] == SORT_ASC}
<a class="sort" href="{Url::current([ 'sort' => "-`$key`",'page' => "" ])}">
<i class="fa fa-sort-numeric-asc"></i>
</a>
{else}
<a class="sort" href="{Url::current([ 'sort' => $key,'page' => "" ])}">
<i class="fa fa-sort-numeric-desc"></i>
</a>
{/if}
{elseif array_key_exists($key, $sort->attributes)}
<a class="sort" href="{Url::current([ 'sort' => $key,'page' => "" ])}">
<i class="fa fa-sort"></i>
</a>
{/if}
{/if}
</th>
{/foreach}
{if Yii::$app->user->can('admin')}
<th class="no-sort"></th>
<th class="no-sort"></th>
{/if}
</tr>
</thead>
<tbody>
{foreach $users as $user}
<tr>
<td>{$user['id']}</td>
<td>
{if $user['image']}
{Html::img($user['image'],['height'=>'30'])}
{/if}
</td>
<td>{Html::a($user['name'],Url::toRoute(['user/view','id'=>$user['id']]))}</td>
<td>{$user['email']}</td>
<td>
<select class="selectpicker select-user-role" title="{Yii::tr('Select role', [], 'user')}..." data-id="{$user['id']}" multiple {if $user['id'] == Yii::$app->user->id}disabled="1"{/if}>
{foreach $roles as $role}
<option value="{$role.name}"{if in_array($role.name,explode(',',$user['rolesNames']))} selected="selected"{/if}>{$role.name}</option>
{/foreach}
</select>
</td>
<td class="state">
<button id="btn{$user['id']}" class="btn btn-sm user-state btn-{if !$user['active']}danger{else}success{/if}" {if $user['id'] == Yii::$app->user->id}disabled="1"{/if} data-id="{$user['id']}" data-state="{1 - $user['active']}" title="{if !$user['active']}{Yii::tr('Enable', [], 'user')}{else}{Yii::tr('Disable', [], 'user')}{/if}">
{if $user['active']}
{Html::fa('check',['id'=>"btn{$user['id']}",'class'=>'text-default','title'=>Yii::tr('Disable', [], 'user')])}
{else}
{Html::fa('ban',['id'=>"btn{$user['id']}",'class'=>'text-default','title'=>Yii::tr('Enable', [], 'user')])}
{/if}
</button>
</td>
<td data-order="{Yii::$app->formatter->asTimestamp($user['loginDT'])}">{Yii::$app->formatter->asDatetime($user['loginDT'])}</td>
<td data-order="{Yii::$app->formatter->asTimestamp($user['activeDT'])}">{Yii::$app->formatter->asDatetime($user['activeDT'])}</td>
{if Yii::$app->user->can('admin')}
<td>
{if $user['id'] != Yii::$app->user->id}
{$url="/user/temp-login?id=`$user['id']`"}
{Html::afa('user-secret', $url, [ 'target' => '_blank', 'title' => Yii::tr('Login as "{user}"', [ 'user' => $user['name'] ]) ])}
{/if}
</td>
<td>
{if $user['id'] != Yii::$app->user->id}
{Html::a(Html::fa('remove'),Url::toRoute(['user/delete', 'id' => $user['id']]), [ 'class' => 'btn btn-sm btn-xs btn-danger', 'title' => Yii::tr('Remove user?', [], 'user'), 'data-toggle'=>'confirmation', 'data-btn-ok-class'=>'btn-xs btn-danger', 'data-title'=>Yii::tr('Remove user?', [], 'user'), 'data-btn-ok-label'=>Yii::tr('Yes', [], 'user'), 'data-btn-cancel-label'=>Yii::tr('No', [], 'user') ])}
{/if}
</td>
{/if}
</tr>
{/foreach}
</tbody>
</table>
{include file='pagination.tpl'}
</div>
<div role="tabpanel" class="tab-pane" id="roles">
<table class="table table-hover table-striped" id="role-list">
<thead>
<tr>
<th>{Yii::tr('Name', [], 'user')}</th>
<th>{Yii::tr('Description', [], 'user')}</th>
<th>{Yii::tr('Rule name', [], 'user')}</th>
<th>{Yii::tr('Data', [], 'user')}</th>
<th>{Yii::tr('Child roles', [], 'user')}</th>
<th></th>
</tr>
</thead>
<tbody>
{foreach $roles as $role}
<tr>
<td>{$role.name}</td>
<td>{$role.description}</td>
<td>{$role.ruleName}</td>
<td>{$role.data}</td>
<td>{foreach Yii::$app->authManager->getChildren($role.name) as $child}
<p>{$child->name}</p>
{/foreach}
</td>
<td>
{if !$role.fixed}
{Html::a(Html::fa('pencil'),'#roles',['class'=>'btn btn-xs btn-success role-edit', 'data-id'=>{$role.name} ])}
{Html::a(Html::fa('remove'),{Url::toRoute(['rbac/delete-role','id'=>$role.name])},['class'=>'btn btn-xs btn-danger role-delete', 'data-id'=>{$role.name}, 'data-toggle'=>'confirmation', 'data-title'=>{Yii::tr('Remove?',[],'user')}, 'title'=>{Yii::tr('Remove?',[],'user')}, 'data-btn-ok-label'=>"{Yii::tr('Yes', [], 'user')}",'data-btn-ok-class'=>"btn btn-xs btn-danger", 'data-btn-cancel-label'=>"{Yii::tr('No', [], 'user')}" ])}
{/if}
</td>
</tr>
{/foreach}
</tbody>
</table>
{Html::button({Yii::tr('Add', [], 'user')},['class'=>'btn btn-info role-add'])}
</div>
<div role="tabpanel" class="tab-pane" id="permission">
<table class="table table-hover table-striped" id="rule-list">
<thead>
<tr>
<th>{Yii::tr('Name', [], 'user')}</th>
<th>{Yii::tr('Description', [], 'user')}</th>
<th>{Yii::tr('Rule name', [], 'user')}</th>
<th>{Yii::tr('Data', [], 'user')}</th>
</tr>
</thead>
<tbody>
{foreach $permissions as $permission}
<tr>
<td>{$permission->name}</td>
<td>{$permission->description}</td>
<td>{$permission->ruleName}</td>
<td>{$permission->data}</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
</div>
<!-- Modal -->
<div class="modal fade" id="formModal" tabindex="-1" role="dialog" aria-labelledby="formModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalLabel"></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
{Form assign='f' id="role-form" action="#roles" options=['data-pjax' => true]}
{$f->field($roleForm, 'name')->textInput(['id'=>'name'])}
{$f->field($roleForm, 'description')->textInput(['id'=>'description'])}
{if count($rules)> 0}
{$f->field($roleForm, 'ruleName')->select($rules, [ 'value' => 'name', 'label' => 'name' ], [ 'class' => 'selectpicker', 'title' => Yii::tr('Select rule', [], 'user'),'id'=>'ruleName'])}
{/if}
{$f->field($roleForm, 'data')->textInput(['id'=>'data'])}
{$f->field($roleForm, 'childRoles')->select(Yii::$app->authManager->getRoles(), [ 'value' => 'name', 'label' => 'name' ], [ 'class' => 'selectpicker', 'multiple' => true, 'title' => Yii::tr('Select child roles', [], 'user'),'id'=>'childRoles' ])}
{$f->field($roleForm, 'childPermissions')->select($permissions, [ 'value' => 'name', 'label' => 'name' ], [ 'class' => 'selectpicker', 'multiple' => true, 'title' => Yii::tr('Select permissions', [], 'user'),'id'=>'childPermissions' ])}
{$f->field($roleForm, 'method')->hidden(['id'=>'method', 'label' => false])}
{/Form}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary role-form">{Yii::tr('Save changes', [], 'user')}</button>
</div>
</div>
</div>
</div>
{if count($roleForm->errors)>0}
<script type="text/javascript">
$('#formModal').modal('show');
</script>
{/if}
<script type="text/javascript">
var childRoles = $('#childRoles');
childRoles.find('[value=admin]').remove();
childRoles.selectpicker('refresh');
var roles = {
data : {json_encode($roles)},
getByName : function (name) {
for (var i in this.data) {
if (this.data[ i ].name == name)
return this.data[ i ];
}
return null;
}
};
$().ready(function () {
var originalValue = $('#search-user').val();
$('#search-user').val('');
$('#search-user').blur().focus().val(originalValue);
});
var loadTimeout = null;
$(document).on('input', '#search-user', function (e) {
if (e.keyCode != 9) {
if (loadTimeout !== null) {
clearTimeout(loadTimeout);
loadTimeout = null;
}
var el = $(this);
var role = $('#select-filter-role');
loadTimeout = setTimeout(function () {
window.location.href = '{Url::toRoute('user/manage')}?search=' + el.val() + '&filterRole=' + role.val();
loadTimeout = null;
}, 1000);
}
});
$('.select-filter-role').change(function () {
window.location.href = '{Url::toRoute('user/manage')}?filterRole=' + $(this).val() + '&search=' + $('#search-user').val();
});
$('.role-add').click(function (e) {
$('#modalLabel').html('{Yii::tr('Adding Role', [], 'user')}');
$('#method').val('rbac-add');
$('#name').val('');
$('#ruleName').val('');
$('#data').val('');
$('#description').val('');
$('#formModal').modal('show');
childRoles.selectpicker('val', 0);
$('#childPermissions').selectpicker('val', 0);
});
$('.role-edit').click(function (e) {
e.preventDefault();
e.stopPropagation();
setEditData($(this).data('id'));
$('#formModal').modal('show');
});
function setEditData (roleName) {
var role = roles.getByName(roleName);
if (role !== null) {
$('#method').val(role.name);
$('#modalLabel').html('{Yii::tr('Editing a Role', [], 'user')}');
$('#name').val(role.name);
$('#description').val(role.description);
$('.form-group').removeClass('has-error');
$('.error-block').addClass('hide');
$('#ruleName').val(role.ruleName);
$('#data').val(role.description);
childRoles.find('[value=' + role.name + ']').remove();
childRoles.selectpicker('val', role.childRoles);
childRoles.selectpicker('refresh');
$('#childPermissions').selectpicker('val', role.childPermissions);
}
}
$('.role-form').click(function () {
$('#role-form').submit();
});
$('.select-user-role').change(function () {
jQuery.ajax({
url : '{Url::toRoute(['rbac/user-role'])}',
type : 'POST',
data : { _csrf : '{Yii::$app->request->getCsrfToken()}', id : $(this).data('id'), roles : $(this).val() },
dataType : "json",
});
});
$('.user-state').click(function () {
var id = $(this).data('id');
var button = $('#btn' + id);
jQuery.ajax({
url : '{Url::toRoute(['rbac/user-state'])}',
type : 'POST',
data : { _csrf : '{Yii::$app->request->getCsrfToken()}', id : id, state : $(this).data('state') },
dataType : "json",
success : function (data) {
if (data == 1) {
button.html('{Html::fa('check',['id'=>"btn{$user['id']}",'class'=>'text-default','title'=>Yii::tr('Disable', [], 'user')])}').attr('title', '{Yii::tr('Disable', [], 'user')}').removeClass('btn-danger').data('state', 0).addClass('btn-success');
} else {
button.html('{Html::fa('ban',['id'=>"btn{$user['id']}",'class'=>'text-default','title'=>Yii::tr('Enable', [], 'user')])}').attr('title', '{Yii::tr('Enable', [], 'user')}').removeClass('btn-success').data('state', 1).addClass('btn-danger');
}
}
});
});
</script>