348 lines
15 KiB
PHP
348 lines
15 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use Backpack\CRUD\app\Http\Controllers\CrudController;
|
|
use Backpack\PermissionManager\app\Http\Requests\UserStoreCrudRequest as StoreRequest;
|
|
use Backpack\PermissionManager\app\Http\Requests\UserUpdateCrudRequest as UpdateRequest;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
|
|
use Backpack\CRUD\app\Library\Widget;
|
|
|
|
class UserCrudController extends CrudController
|
|
{
|
|
use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
|
|
use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation { store as traitStore; }
|
|
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation { update as traitUpdate; }
|
|
use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation { destroy as traitDestroy; }
|
|
//use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
|
|
|
|
use \Backpack\CRUD\app\Http\Controllers\Operations\FetchOperation;
|
|
|
|
protected function fetchUser()
|
|
{
|
|
return $this->fetch(\App\Models\User::class);
|
|
}
|
|
|
|
|
|
public function setup()
|
|
{
|
|
$this->crud->setModel(config('backpack.permissionmanager.models.user'));
|
|
$this->crud->setEntityNameStrings(trans('backpack::permissionmanager.user'), trans('backpack::permissionmanager.users'));
|
|
$this->crud->setRoute(backpack_url('user'));
|
|
$this->crud->addClause('where', 'id', '>', '1');
|
|
|
|
$this->crud->removeAllFilters();
|
|
}
|
|
|
|
public function setupListOperation()
|
|
{
|
|
Widget::add([
|
|
'type' => 'chart',
|
|
'controller' => \App\Http\Controllers\Admin\Charts\WeeklyUsersChartController::class,
|
|
|
|
// OPTIONALS
|
|
'class' => 'card mb-2',
|
|
'wrapper' => ['class'=> 'col-md-6'] ,
|
|
'content' => [
|
|
'header' => 'New Users',
|
|
'body' => 'This chart should make it obvious how many new users have signed up in the past 7 days.<br><br>',
|
|
],
|
|
])
|
|
->to('after_content');
|
|
|
|
$this->crud->addColumns([
|
|
[
|
|
'name' => 'name',
|
|
'label' => trans('backpack::permissionmanager.name'),
|
|
'type' => 'text',
|
|
],
|
|
[
|
|
'name' => 'email',
|
|
'label' => trans('backpack::permissionmanager.email'),
|
|
'type' => 'email',
|
|
],
|
|
|
|
[ // n-n relationship (with pivot table)
|
|
'label' => trans('backpack::permissionmanager.roles'), // Table column heading
|
|
'type' => 'select_multiple',
|
|
'name' => 'roles', // the method that defines the relationship in your Model
|
|
'entity' => 'roles', // the method that defines the relationship in your Model
|
|
'attribute' => 'name', // foreign key attribute that is shown to user
|
|
'model' => config('permission.models.role'), // foreign key model
|
|
],
|
|
[ // n-n relationship (with pivot table)
|
|
'label' => trans('backpack::permissionmanager.extra_permissions'), // Table column heading
|
|
'type' => 'select_multiple',
|
|
'name' => 'permissions', // the method that defines the relationship in your Model
|
|
'entity' => 'permissions', // the method that defines the relationship in your Model
|
|
'attribute' => 'name', // foreign key attribute that is shown to user
|
|
'model' => config('permission.models.permission'), // foreign key model
|
|
],
|
|
|
|
]);
|
|
|
|
if (backpack_pro()) {
|
|
// Role Filter
|
|
$this->crud->addFilter(
|
|
[
|
|
'name' => 'role',
|
|
'type' => 'select2',
|
|
'label' => trans('backpack::permissionmanager.role'),
|
|
],
|
|
config('permission.models.role')::all()->pluck('name', 'id')->toArray(),
|
|
function ($value) { // if the filter is active
|
|
$this->crud->addClause('whereHas', 'roles', function ($query) use ($value) {
|
|
$query->where('role_id', '=', $value);
|
|
});
|
|
}
|
|
);
|
|
|
|
// Extra Permission Filter
|
|
// $this->crud->addFilter(
|
|
// [
|
|
// 'name' => 'permission',
|
|
// 'type' => 'select2_multiple',
|
|
// 'label' => trans('backpack::permissionmanager.extra_permissions'),
|
|
// ],
|
|
// config('permission.models.permission')::all()->pluck('name', 'id')->toArray(),
|
|
// function ($values) { // if the filter is active
|
|
// //CRUD::addClause('whereIn', 'status', json_decode($values));
|
|
// $this->crud->addClause('whereHas', 'permissions', function ($query) use ($value) {
|
|
// $query->where('permission_id', 'in', json_decode($values));
|
|
// });
|
|
// }
|
|
// );
|
|
|
|
CRUD::filter('pw')
|
|
->label(trans('backpack::permissionmanager.extra_permissions'))
|
|
->type('select2_multiple')
|
|
->values(function () {
|
|
return config('permission.models.permission')::all()->pluck('name', 'id')->toArray();
|
|
})
|
|
->whenActive(function($values) {
|
|
//var_dump($values);
|
|
// CRUD::addClause('whereIn', 'status', json_decode($values));
|
|
$this->crud->addClause('whereHas', 'permissions', function ($query) use ($values) {
|
|
$query->whereIn('permission_id', json_decode($values));
|
|
});
|
|
});
|
|
|
|
CRUD::filter('pp')
|
|
->type('select2_ajax')
|
|
// set options to customize, www.daterangepicker.com/#options
|
|
->method('POST')
|
|
->values(backpack_url('user/fetch/user'))
|
|
->whenActive(function($value) {
|
|
CRUD::addClause('where', 'id', '=', $value);
|
|
});
|
|
|
|
CRUD::filter('active')
|
|
->type('simple')
|
|
->whenActive(function() {
|
|
// CRUD::addClause('active'); // apply the "active" eloquent scope
|
|
});
|
|
|
|
CRUD::filter('created_at')
|
|
->type('date_range')
|
|
// set options to customize, www.daterangepicker.com/#options
|
|
->date_range_options([
|
|
'timePicker' => true // example: enable/disable time picker
|
|
])
|
|
->whenActive(function($value) {
|
|
// $dates = json_decode($value);
|
|
// CRUD::addClause('where', 'date', '>=', $dates->from);
|
|
// CRUD::addClause('where', 'date', '<=', $dates->to);
|
|
});
|
|
|
|
CRUD::filter('updated_at')
|
|
->type('date')
|
|
->whenActive(function($value) {
|
|
// CRUD::addClause('where', 'date', $value);
|
|
});
|
|
|
|
CRUD::filter('email')
|
|
->type('text')
|
|
->whenActive(function($value) {
|
|
CRUD::addClause('where', 'email', 'LIKE', "%$value%");
|
|
});
|
|
|
|
CRUD::filter('id')
|
|
->type('range')
|
|
->whenActive(function($value) {
|
|
$range = json_decode($value);
|
|
if ($range->from) {
|
|
CRUD::addClause('where', 'id', '>=', (float) $range->from);
|
|
}
|
|
if ($range->to) {
|
|
CRUD::addClause('where', 'id', '<=', (float) $range->to);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
public function setupCreateOperation()
|
|
{
|
|
$this->addUserFields();
|
|
$this->crud->setValidation(StoreRequest::class);
|
|
}
|
|
|
|
public function setupUpdateOperation()
|
|
{
|
|
$this->addUserFields();
|
|
$this->crud->setValidation(UpdateRequest::class);
|
|
}
|
|
|
|
public function destroy($id)
|
|
{
|
|
CRUD::hasAccessOrFail('delete');
|
|
$userId = \Auth::guard(config('backpack.base.guard'))->user()->id;
|
|
if ($id == $userId)
|
|
{
|
|
return \Alert::error('不可刪除自己!');
|
|
}
|
|
return CRUD::delete($id);
|
|
}
|
|
|
|
public function setupShowOperation()
|
|
{
|
|
// automatically add the columns
|
|
$this->crud->column('name');
|
|
$this->crud->column('email');
|
|
$this->crud->column([
|
|
// two interconnected entities
|
|
'label' => trans('backpack::permissionmanager.user_role_permission'),
|
|
'field_unique_name' => 'user_role_permission',
|
|
'type' => 'checklist_dependency',
|
|
'name' => 'roles_permissions',
|
|
|
|
'subfields' => [
|
|
'primary' => [
|
|
'label' => trans('backpack::permissionmanager.role'),
|
|
'name' => 'roles', // the method that defines the relationship in your Model
|
|
'entity' => 'roles', // the method that defines the relationship in your Model
|
|
'entity_secondary' => 'permissions', // the method that defines the relationship in your Model
|
|
'attribute' => 'name', // foreign key attribute that is shown to user
|
|
'model' => config('permission.models.role'), // foreign key model
|
|
],
|
|
'secondary' => [
|
|
'label' => mb_ucfirst(trans('backpack::permissionmanager.permission_singular')),
|
|
'name' => 'permissions', // the method that defines the relationship in your Model
|
|
'entity' => 'permissions', // the method that defines the relationship in your Model
|
|
'entity_primary' => 'roles', // the method that defines the relationship in your Model
|
|
'attribute' => 'name', // foreign key attribute that is shown to user
|
|
'model' => config('permission.models.permission'), // foreign key model,
|
|
],
|
|
],
|
|
|
|
]);
|
|
$this->crud->column('created_at');
|
|
$this->crud->column('updated_at');
|
|
}
|
|
|
|
/**
|
|
* Store a newly created resource in the database.
|
|
*
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function store()
|
|
{
|
|
$this->crud->setRequest($this->crud->validateRequest());
|
|
$this->crud->setRequest($this->handlePasswordInput($this->crud->getRequest()));
|
|
$this->crud->unsetValidation(); // validation has already been run
|
|
|
|
return $this->traitStore();
|
|
}
|
|
|
|
/**
|
|
* Update the specified resource in the database.
|
|
*
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function update()
|
|
{
|
|
$this->crud->setRequest($this->crud->validateRequest());
|
|
$this->crud->setRequest($this->handlePasswordInput($this->crud->getRequest()));
|
|
$this->crud->unsetValidation(); // validation has already been run
|
|
|
|
return $this->traitUpdate();
|
|
}
|
|
|
|
/**
|
|
* Handle password input fields.
|
|
*/
|
|
protected function handlePasswordInput($request)
|
|
{
|
|
// Remove fields not present on the user.
|
|
$request->request->remove('password_confirmation');
|
|
$request->request->remove('roles_show');
|
|
$request->request->remove('permissions_show');
|
|
|
|
// Encrypt password if specified.
|
|
if ($request->input('password')) {
|
|
$request->request->set('password', Hash::make($request->input('password')));
|
|
} else {
|
|
$request->request->remove('password');
|
|
}
|
|
|
|
return $request;
|
|
}
|
|
|
|
protected function addUserFields()
|
|
{
|
|
$this->crud->addFields([
|
|
[
|
|
'name' => 'name',
|
|
'label' => trans('backpack::permissionmanager.name'),
|
|
'type' => 'text',
|
|
],
|
|
[
|
|
'name' => 'email',
|
|
'label' => trans('backpack::permissionmanager.email'),
|
|
'type' => 'email',
|
|
],
|
|
[
|
|
'name' => 'password',
|
|
'label' => trans('backpack::permissionmanager.password'),
|
|
'type' => 'password',
|
|
],
|
|
[
|
|
'name' => 'password_confirmation',
|
|
'label' => trans('backpack::permissionmanager.password_confirmation'),
|
|
'type' => 'password',
|
|
],
|
|
|
|
[
|
|
// two interconnected entities
|
|
'label' => trans('backpack::permissionmanager.user_role_permission'),
|
|
'field_unique_name' => 'user_role_permission',
|
|
'type' => 'checklist_dependency',
|
|
'name' => 'roles,permissions',
|
|
'subfields' => [
|
|
'primary' => [
|
|
'label' => trans('backpack::permissionmanager.roles'),
|
|
'name' => 'roles', // the method that defines the relationship in your Model
|
|
'entity' => 'roles', // the method that defines the relationship in your Model
|
|
'entity_secondary' => 'permissions', // the method that defines the relationship in your Model
|
|
'attribute' => 'name', // foreign key attribute that is shown to user
|
|
'model' => config('permission.models.role'), // foreign key model
|
|
'pivot' => true, // on create&update, do you need to add/delete pivot table entries?]
|
|
'number_columns' => 3, //can be 1,2,3,4,6
|
|
],
|
|
'secondary' => [
|
|
'label' => mb_ucfirst(trans('backpack::permissionmanager.permission_plural')),
|
|
'name' => 'permissions', // the method that defines the relationship in your Model
|
|
'entity' => 'permissions', // the method that defines the relationship in your Model
|
|
'entity_primary' => 'roles', // the method that defines the relationship in your Model
|
|
'attribute' => 'name', // foreign key attribute that is shown to user
|
|
'model' => config('permission.models.permission'), // foreign key model
|
|
'pivot' => true, // on create&update, do you need to add/delete pivot table entries?]
|
|
'number_columns' => 3, //can be 1,2,3,4,6
|
|
],
|
|
],
|
|
],
|
|
|
|
]);
|
|
}
|
|
}
|