I am using yajra datatebles with HTML builder to show server side. Here I have to hide the delete button in the action column from a particular role.
I am using spatie permission package and added @can()
to hide the delete button. My code is given below.
UserDatatable.php
namespace App\DataTables;
use App\User;
use DB;
use Builder;
use Auth;
use Yajra\DataTables\Services\DataTable;
use Yajra\DataTables\Html\Column;
class UsersDataTable extends DataTable
{
/**
* Build DataTable class.
*
* @param mixed $query Results from query() method.
* @return \Yajra\DataTables\DataTableAbstract
*/
public function dataTable($query)
{
return datatables($query)
->addIndexColumn()
->editColumn('status', function(User $user){
if($user->status == 1)
return '<label class="label label-success">Active</label>';
else return '<label class="label label-danger">Deactive</label>';
})
->editColumn('created_at', function(User $user){
return date('d-m-Y H:i:s',strtotime($user->created_at));
})
->editColumn('checkbox', function(User $user){
return '<input type="checkbox" data-id="'.$user->id.'" class="sub_chk" name="ids[]" />';
})
->addColumn('action', function(User $user) {
return view('backend.users.usersaction', compact('user'))->render();
})
->rawColumns(['checkbox','status','action']);
}
/**
* Get query source of dataTable.
*
* @param \App\User $model
* @return \Illuminate\Database\Eloquent\Builder
*/
public function query(User $model)
{
$users = User::select('id','name','email','status', 'created_at', 'updated_at');
if($this->request()->get('startDate')) {
$st = $this->request()->get('startDate');
$dt = ($this->request()->get('endDate') == '') ? date('Y-m-d') : $this->request()->get('endDate');
$users->whereDate('created_at','<=', "$dt");
$users->whereDate('created_at','>=', "$st");
}
if($this->request()->get('status') == '0' || $this->request()->get('status') == '1') {
$users->where('status', $this->request()->get('status'));
}
// $users->orderBy('created_at','DESC')
$users->get();
return $this->applyScopes($users);
}
/**
* Optional method if you want to use html builder.
*
* @return \Yajra\DataTables\Html\Builder
*/
public function html()
{
return $this->builder()
->columns($this->getColumns())
->minifiedAjax()
->addAction(['width' => '10%'])
->addCheckbox(['width'=> '10px'],true)
->parameters($this->getBuilderParameters())
->parameters([
'order' => [
5, // here is the column number
'desc'
],
'scrollX' => true,
'extend' => 'collection',
'text' => 'Export',
'dom' => 'Bfrtipl',
// 'buttons' => ['csv', 'excel', 'pdf' , 'print'],
'initComplete' => "function () {
this.api().columns().every(function () {
var column = this;
var input = document.createElement(\"input\");
$(input).appendTo($(column.footer()).empty())
.on('change', function () {
column.search($(this).val(), false, false, true).draw();
});
});
}",
]);
}
/**
* Get columns.
*
* @return array
*/
protected function getColumns()
{
return [
'DT_RowIndex'=>['width'=>'10px','title'=>'S.No','searchable'=>false,'orderable'=>false],
'name',
'email',
'status',
'created_at'
];
}
/**
* Get filename for export.
*
* @return string
*/
protected function filename()
{
return 'Users_' . date('YmdHis');
}
}
Below is my action view where I add the condition.
usersaction.blade.php
@can('View User')
<a href="javascript:void(0);" data-user_id="{{ encrypt($user->id) }}" class="btn btn-sm btn-default viewUser"><i class="fa fa-eye"></i></a>
@endcan
@can('Edit User')
<a href="{!! url('admin/editUser/'.encrypt($user->id)) !!}" class="btn btn-sm btn-primary"><i class="fa fa-edit"></i></a>
@endcan
@can('Delete User')
<a href="javascript:void(0);" data-user_id="{{ encrypt($user->id) }}" class="btn btn-sm btn-danger deleteUser"><i class="fa fa-trash"></i></a>
@endcan
Here View User, Edit User, Delete User are permissions created by laravel spatie permission package. It's working fine, but the problem is that in the data table view, the action column is shifted left and too much blank space is left at the right side:
I tried another way like below
->addColumn('action', function(User $user){
$actionBtn='';
if(Auth::user()->can('View User')){
$actionBtn .= '<a href="javascript:void(0);" data-user_id="'.encrypt($user->id).'" class="btn btn-sm btn-default viewUser"><i class="fa fa-eye"></i></a>';
}
if(Auth::user()->can('Edit User')){
$actionBtn .= '<a href="'.url('admin/editUser/'.encrypt($user->id)).'" class="btn btn-sm btn-primary"><i class="fa fa-edit"></i></a>';
}
if(Auth::user()->can('Delete User')){
$actionBtn .= '<a href="javascript:void(0);" data-user_id="'.encrypt($user->id).'" class="btn btn-sm btn-danger deleteUser"><i class="fa fa-trash"></i></a>';
}
return $actionBtn;
})
But I get the same result. How can I fix this?