Skip to content

Commit 10e526f

Browse files
committed
add info assigned user to role.
1 parent 5b0966e commit 10e526f

File tree

6 files changed

+185
-40
lines changed

6 files changed

+185
-40
lines changed

components/Configs.php

+13
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ class Configs extends \mdm\admin\BaseObject
8484
*/
8585
public $defaultUserStatus = 10;
8686

87+
/**
88+
* @var integer Number of user role.
89+
*/
90+
public $userRolePageSize = 100;
91+
8792
/**
8893
* @var boolean If true then AccessControl only check if route are registered.
8994
*/
@@ -256,4 +261,12 @@ public static function strict()
256261
{
257262
return static::instance()->strict;
258263
}
264+
265+
/**
266+
* @return int
267+
*/
268+
public static function userRolePageSize()
269+
{
270+
return static::instance()->userRolePageSize;
271+
}
259272
}

components/ItemController.php

+14
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,20 @@ public function actionAssign($id)
129129
return array_merge($model->getItems(), ['success' => $success]);
130130
}
131131

132+
/**
133+
* Assign items
134+
* @param string $id
135+
* @return array
136+
*/
137+
public function actionGetUsers($id)
138+
{
139+
$page = Yii::$app->getRequest()->get('page', 0);
140+
$model = $this->findModel($id);
141+
Yii::$app->getResponse()->format = 'json';
142+
143+
return array_merge($model->getUsers($page));
144+
}
145+
132146
/**
133147
* Assign or remove items
134148
* @param string $id

models/Assignment.php

+2
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ public function getItems()
103103
unset($available[$item->roleName]);
104104
}
105105

106+
ksort($available);
107+
ksort($assigned);
106108
return [
107109
'available' => $available,
108110
'assigned' => $assigned,

models/AuthItem.php

+61-4
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44

55
use mdm\admin\components\Configs;
66
use mdm\admin\components\Helper;
7+
use mdm\admin\controllers\AssignmentController;
8+
use mdm\admin\Module;
79
use Yii;
810
use yii\base\Model;
911
use yii\helpers\Json;
12+
use yii\helpers\Url;
1013
use yii\rbac\Item;
14+
use yii\rbac\Rule;
1115

1216
/**
1317
* This is the model class for table "tbl_auth_item".
@@ -30,6 +34,7 @@ class AuthItem extends Model
3034
public $description;
3135
public $ruleName;
3236
public $data;
37+
3338
/**
3439
* @var Item
3540
*/
@@ -62,8 +67,8 @@ public function rules()
6267
[['ruleName'], 'checkRule'],
6368
[['name', 'type'], 'required'],
6469
[['name'], 'checkUnique', 'when' => function () {
65-
return $this->isNewRecord || ($this->_item->name != $this->name);
66-
}],
70+
return $this->isNewRecord || ($this->_item->name != $this->name);
71+
}],
6772
[['type'], 'integer'],
6873
[['description', 'data', 'ruleName'], 'default'],
6974
[['name'], 'string', 'max' => 64],
@@ -96,7 +101,7 @@ public function checkRule()
96101
if (!Configs::authManager()->getRule($name)) {
97102
try {
98103
$rule = Yii::createObject($name);
99-
if ($rule instanceof \yii\rbac\Rule) {
104+
if ($rule instanceof Rule) {
100105
$rule->name = $name;
101106
Configs::authManager()->add($rule);
102107
} else {
@@ -259,16 +264,68 @@ public function getItems()
259264

260265
$assigned = [];
261266
foreach ($manager->getChildren($this->_item->name) as $item) {
262-
$assigned[$item->name] = $item->type == 1 ? 'role' : ($item->name[0] == '/' || $advanced && $item->name[0] == '@' ? 'route' : 'permission');
267+
$assigned[$item->name] = $item->type == 1 ? 'role' : ($item->name[0] == '/' || $advanced && $item->name[0] == '@'
268+
? 'route' : 'permission');
263269
unset($available[$item->name]);
264270
}
265271
unset($available[$this->name]);
272+
ksort($available);
273+
ksort($assigned);
266274
return [
267275
'available' => $available,
268276
'assigned' => $assigned,
269277
];
270278
}
271279

280+
public function getUsers()
281+
{
282+
$module = Yii::$app->controller->module;
283+
if (!$module || !$module instanceof Module) {
284+
return [];
285+
}
286+
$ctrl = $module->createController('assignment');
287+
$result = [];
288+
if ($ctrl && $ctrl[0] instanceof AssignmentController) {
289+
$ctrl = $ctrl[0];
290+
$class = $ctrl->userClassName;
291+
$idField = $ctrl->idField;
292+
$usernameField = $ctrl->usernameField;
293+
294+
$manager = Configs::authManager();
295+
$ids = $manager->getUserIdsByRole($this->name);
296+
297+
$provider = new \yii\data\ArrayDataProvider([
298+
'allModels' => $ids,
299+
'pagination' => [
300+
'pageSize' => Configs::userRolePageSize(),
301+
]
302+
]);
303+
$users = $class::find()
304+
->select(['id' => $idField, 'username' => $usernameField])
305+
->where([$idField => $provider->getModels()])
306+
->asArray()->all();
307+
308+
$route = '/' . $ctrl->uniqueId . '/view';
309+
foreach ($users as &$row) {
310+
$row['link'] = Url::to([$route, 'id' => $row['id']]);
311+
}
312+
$result['users'] = $users;
313+
$currentPage = $provider->pagination->getPage();
314+
$pageCount = $provider->pagination->getPageCount();
315+
if ($pageCount > 0) {
316+
$result['first'] = 0;
317+
$result['last'] = $pageCount - 1;
318+
if ($currentPage > 0) {
319+
$result['prev'] = $currentPage - 1;
320+
}
321+
if ($currentPage < $pageCount - 1) {
322+
$result['next'] = $currentPage + 1;
323+
}
324+
}
325+
}
326+
return $result;
327+
}
328+
272329
/**
273330
* Get item
274331
* @return Item

views/item/_script.js

+33
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,23 @@ function updateItems(r) {
55
search('available');
66
search('assigned');
77
}
8+
function updateUsers(r) {
9+
_opts.users = r;
10+
listUsers();
11+
}
12+
13+
$('#list-users').on('click', 'a[data-target]', function () {
14+
var $this = $(this);
15+
var target = $this.data('target');
16+
var page = _opts.users[target];
17+
if (page !== undefined) {
18+
$.get(_opts.getUserUrl, {page: page}, function (r) {
19+
updateUsers(r);
20+
});
21+
}
22+
23+
return false;
24+
});
825

926
$('.btn-assign').click(function () {
1027
var $this = $(this);
@@ -49,6 +66,22 @@ function search(target) {
4966
});
5067
}
5168

69+
function listUsers() {
70+
var $list = $('#list-users');
71+
var users = _opts.users.users.map(function (user) {
72+
return `<span class="label label-info"><a href="${user.link}">${user.username}</a></span>`;
73+
});
74+
users.push('<br>');
75+
if (_opts.users.prev) {
76+
users.push(`<span class="label label-primary"><a href="#" data-target="${_opts.users.prev}">&laquo;</a></span>`);
77+
}
78+
if (_opts.users.next) {
79+
users.push(`<span class="label label-primary"><a href="#" data-target="${_opts.users.next}">&raquo;</a></span>`);
80+
}
81+
$list.html(users.join(' '));
82+
}
83+
5284
// initial
5385
search('available');
5486
search('assigned');
87+
listUsers();

views/item/view.php

+62-36
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
<?php
22

33
use mdm\admin\AnimateAsset;
4+
use mdm\admin\components\ItemController;
5+
use mdm\admin\models\AuthItem;
46
use yii\helpers\Html;
57
use yii\helpers\Json;
8+
use yii\helpers\Url;
9+
use yii\web\View;
610
use yii\web\YiiAsset;
711
use yii\widgets\DetailView;
812

9-
/* @var $this yii\web\View */
10-
/* @var $model mdm\admin\models\AuthItem */
11-
/* @var $context mdm\admin\components\ItemController */
13+
/* @var $this View */
14+
/* @var $model AuthItem */
15+
/* @var $context ItemController */
1216

1317
$context = $this->context;
1418
$labels = $context->labels();
@@ -19,61 +23,83 @@
1923
AnimateAsset::register($this);
2024
YiiAsset::register($this);
2125
$opts = Json::htmlEncode([
22-
'items' => $model->getItems(),
23-
]);
26+
'items' => $model->getItems(),
27+
'users' => $model->getUsers(),
28+
'getUserUrl' => Url::to(['get-users', 'id' => $model->name])
29+
]);
2430
$this->registerJs("var _opts = {$opts};");
2531
$this->registerJs($this->render('_script.js'));
2632
$animateIcon = ' <i class="glyphicon glyphicon-refresh glyphicon-refresh-animate"></i>';
2733
?>
2834
<div class="auth-item-view">
29-
<h1><?=Html::encode($this->title);?></h1>
35+
<h1><?= Html::encode($this->title); ?></h1>
3036
<p>
31-
<?=Html::a(Yii::t('rbac-admin', 'Update'), ['update', 'id' => $model->name], ['class' => 'btn btn-primary']);?>
32-
<?=Html::a(Yii::t('rbac-admin', 'Delete'), ['delete', 'id' => $model->name], [
33-
'class' => 'btn btn-danger',
34-
'data-confirm' => Yii::t('rbac-admin', 'Are you sure to delete this item?'),
35-
'data-method' => 'post',
36-
]);?>
37-
<?=Html::a(Yii::t('rbac-admin', 'Create'), ['create'], ['class' => 'btn btn-success']);?>
37+
<?= Html::a(Yii::t('rbac-admin', 'Update'), ['update', 'id' => $model->name], ['class' => 'btn btn-primary']); ?>
38+
<?=
39+
Html::a(Yii::t('rbac-admin', 'Delete'), ['delete', 'id' => $model->name], [
40+
'class' => 'btn btn-danger',
41+
'data-confirm' => Yii::t('rbac-admin', 'Are you sure to delete this item?'),
42+
'data-method' => 'post',
43+
]);
44+
?>
45+
<?= Html::a(Yii::t('rbac-admin', 'Create'), ['create'], ['class' => 'btn btn-success']); ?>
3846
</p>
3947
<div class="row">
4048
<div class="col-sm-11">
4149
<?=
42-
DetailView::widget([
43-
'model' => $model,
44-
'attributes' => [
45-
'name',
46-
'description:ntext',
47-
'ruleName',
48-
'data:ntext',
49-
],
50-
'template' => '<tr><th style="width:25%">{label}</th><td>{value}</td></tr>',
51-
]);
52-
?>
50+
DetailView::widget([
51+
'model' => $model,
52+
'attributes' => [
53+
'name',
54+
'description:ntext',
55+
'ruleName',
56+
'data:ntext',
57+
],
58+
'template' => '<tr><th style="width:25%">{label}</th><td>{value}</td></tr>',
59+
]);
60+
?>
61+
</div>
62+
</div>
63+
<div class="row">
64+
<div class="col-sm-11">
65+
<table class="table table-striped table-bordered">
66+
<tbody>
67+
<tr>
68+
<th><?= Yii::t('rbac-admin', 'Assigned users'); ?></th>
69+
</tr>
70+
<tr>
71+
<td id="list-users"></td>
72+
</tr>
73+
</tbody>
74+
</table>
5375
</div>
5476
</div>
5577
<div class="row">
5678
<div class="col-sm-5">
5779
<input class="form-control search" data-target="available"
58-
placeholder="<?=Yii::t('rbac-admin', 'Search for available');?>">
80+
placeholder="<?= Yii::t('rbac-admin', 'Search for available'); ?>">
5981
<select multiple size="20" class="form-control list" data-target="available"></select>
6082
</div>
6183
<div class="col-sm-1">
6284
<br><br>
63-
<?=Html::a('&gt;&gt;' . $animateIcon, ['assign', 'id' => $model->name], [
64-
'class' => 'btn btn-success btn-assign',
65-
'data-target' => 'available',
66-
'title' => Yii::t('rbac-admin', 'Assign'),
67-
]);?><br><br>
68-
<?=Html::a('&lt;&lt;' . $animateIcon, ['remove', 'id' => $model->name], [
69-
'class' => 'btn btn-danger btn-assign',
70-
'data-target' => 'assigned',
71-
'title' => Yii::t('rbac-admin', 'Remove'),
72-
]);?>
85+
<?=
86+
Html::a('&gt;&gt;' . $animateIcon, ['assign', 'id' => $model->name], [
87+
'class' => 'btn btn-success btn-assign',
88+
'data-target' => 'available',
89+
'title' => Yii::t('rbac-admin', 'Assign'),
90+
]);
91+
?><br><br>
92+
<?=
93+
Html::a('&lt;&lt;' . $animateIcon, ['remove', 'id' => $model->name], [
94+
'class' => 'btn btn-danger btn-assign',
95+
'data-target' => 'assigned',
96+
'title' => Yii::t('rbac-admin', 'Remove'),
97+
]);
98+
?>
7399
</div>
74100
<div class="col-sm-5">
75101
<input class="form-control search" data-target="assigned"
76-
placeholder="<?=Yii::t('rbac-admin', 'Search for assigned');?>">
102+
placeholder="<?= Yii::t('rbac-admin', 'Search for assigned'); ?>">
77103
<select multiple size="20" class="form-control list" data-target="assigned"></select>
78104
</div>
79105
</div>

0 commit comments

Comments
 (0)