Skip to content

Commit e9d4759

Browse files
Merge pull request #610 from LinkStackOrg/user-management
Update users table
2 parents 0952ea8 + 896e6da commit e9d4759

File tree

14 files changed

+626
-184
lines changed

14 files changed

+626
-184
lines changed

app/Http/Controllers/AdminController.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,21 @@ public function deleteUser(request $request)
223223
return redirect('admin/users/all');
224224
}
225225

226+
//Delete existing user with POST request
227+
public function deleteTableUser(request $request)
228+
{
229+
$id = $request->id;
230+
231+
Link::where('user_id', $id)->delete();
232+
233+
Schema::disableForeignKeyConstraints();
234+
235+
$user = User::find($id);
236+
$user->forceDelete();
237+
238+
Schema::enableForeignKeyConstraints();
239+
}
240+
226241
//Show user to edit
227242
public function showUser(request $request)
228243
{

app/Http/Livewire/UserTable.php

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
<?php
2+
3+
namespace App\Http\Livewire;
4+
5+
use App\Http\Livewire;
6+
use Rappasoft\LaravelLivewireTables\DataTableComponent;
7+
use Rappasoft\LaravelLivewireTables\Views\Column;
8+
use App\Models\User;
9+
use App\Models\Link;
10+
11+
class UserTable extends DataTableComponent
12+
{
13+
protected $model = User::class;
14+
15+
public function configure(): void
16+
{
17+
$this->setPrimaryKey('id');
18+
$this->setPerPageAccepted([50, 100, 250, 500, 1000, -1]);
19+
$this->setColumnSelectEnabled();
20+
}
21+
22+
public function columns(): array
23+
{
24+
return [
25+
Column::make(__('messages.ID'), "id")
26+
->sortable()
27+
->searchable(),
28+
Column::make(__('messages.Name'), "name")
29+
->sortable()
30+
->searchable(),
31+
Column::make(__('messages.E-Mail'), "email")
32+
->sortable()
33+
->searchable(),
34+
Column::make(__('messages.Page'), "littlelink_name")
35+
->sortable()
36+
->searchable()
37+
->format(function ($value, $row, Column $column) {
38+
if (!$row->littlelink_name == NULL) {
39+
return "<a href='" . url('') . "/@" . $row->littlelink_name . "' target='_blank' class='text-info'><i class='bi bi-box-arrow-up-right'></i>&nbsp; " . $row->littlelink_name . " </a>";
40+
} else {
41+
return 'N/A';
42+
}
43+
})
44+
->html(),
45+
Column::make(__('messages.Role'), "role")
46+
->sortable()
47+
->searchable(),
48+
Column::make(__('messages.Links'), "id")
49+
->format(function ($value, $row) {
50+
$linkCount = Link::where('user_id', $row->id)->count();
51+
return $linkCount;
52+
}),
53+
Column::make(__('messages.Clicks'), "id")
54+
->format(function ($value, $row) {
55+
$clicksSum = Link::where('user_id', $row->id)->sum('click_number');
56+
return $clicksSum;
57+
}),
58+
Column::make(__('messages.E-Mail'), "email_verified_at")
59+
->sortable()
60+
->format(function ($value, $row, Column $column) {
61+
if (env('REGISTER_AUTH') !== 'auth') {
62+
if ($row->role == 'admin' && $row->email_verified_at != '') {
63+
return '<center>-</center>';
64+
} else {
65+
$verifyLink = route('verifyUser', [
66+
'verify' => '-' . $row->email_verified_at,
67+
'id' => $row->id
68+
]);
69+
if ($row->email_verified_at == '') {
70+
return '<a style="cursor:pointer" data-id="'.$verifyLink.'" class="user-email text-danger"><span class="badge bg-danger">' . __('messages.Pending') . '</span></a>';
71+
} else {
72+
return '<a style="cursor:pointer" data-id="'.$verifyLink.'" class="user-email text-danger"><span class="badge bg-success">' . __('messages.Verified') . '</span></a>';
73+
}
74+
}
75+
} else {
76+
return '<center>-</center>';
77+
}
78+
return '';
79+
})->html(),
80+
Column::make(__('messages.Status'), "block")
81+
->sortable()
82+
->format(function ($value, $row, Column $column) {
83+
if ($row->role === 'admin' && $row->id === 1) {
84+
return '<center>-</center>';
85+
} else {
86+
$route = route('blockUser', ['block' => $row->block, 'id' => $row->id]);
87+
if ($row->block === 'yes') {
88+
$badge = '<a style="cursor:pointer" data-id="'.$route.'" class="user-block text-danger"><span class="badge bg-danger">'.__('messages.Pending').'</span></a>';
89+
} elseif ($row->block === 'no') {
90+
$badge = '<a style="cursor:pointer" data-id="'.$route.'" class="user-block text-danger"><span class="badge bg-success">'.__('messages.Approved').'</span></a>';
91+
}
92+
return "<a href=\"$route\">$badge</a>";
93+
}
94+
})
95+
->html(),
96+
Column::make(__('messages.Created at'), "created_at")
97+
->sortable()
98+
->format(function ($value) {
99+
if ($value) {
100+
return $value->format('d/m/y');
101+
} else {
102+
return '';
103+
}
104+
}),
105+
Column::make(__('messages.Last seen'), "updated_at")
106+
->sortable()
107+
->format(function ($value) {
108+
$now = now();
109+
$diff = $now->diff($value);
110+
111+
if ($diff->d < 1 && $diff->h < 1) {
112+
return 'Now';
113+
} elseif ($diff->d < 1 && $diff->h < 24) {
114+
return $diff->h . ' hours ago';
115+
} elseif ($diff->d < 365) {
116+
return $diff->d . ' days ago';
117+
} else {
118+
return $diff->y . ' years ago';
119+
}
120+
}),
121+
Column::make(__('messages.Action'), "id")
122+
->format(function ($value, $row, Column $column) {
123+
return view('components.table-components.action', ['user' => $row]);
124+
}),
125+
];
126+
}
127+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace App\Providers;
4+
5+
use Illuminate\Support\ServiceProvider;
6+
7+
class LivewireServiceProvider extends ServiceProvider
8+
{
9+
public function register()
10+
{
11+
$assetUrl = url('');
12+
config(['livewire.asset_url' => $assetUrl]);
13+
}
14+
}

assets/js/cdn.min.js

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

assets/js/livewire-sortable.js

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

composer.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
"laravel/framework": "^9.52.4",
1919
"laravel/socialite": "^5.5",
2020
"laravel/tinker": "^2.5",
21+
"livewire/livewire": "^2.12",
22+
"rappasoft/laravel-livewire-tables": "^2.15",
2123
"spatie/laravel-backup": "^8.17"
2224
},
2325
"require-dev": {

composer.lock

Lines changed: 146 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/app.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ function locales($key, $default)
181181
Illuminate\Validation\ValidationServiceProvider::class,
182182
Illuminate\View\ViewServiceProvider::class,
183183
Laravel\Socialite\SocialiteServiceProvider::class,
184+
App\Providers\LivewireServiceProvider::class,
184185

185186

186187

config/livewire-tables.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
return [
4+
/**
5+
* Options: tailwind | bootstrap-4 | bootstrap-5.
6+
*/
7+
'theme' => 'bootstrap-5',
8+
];

0 commit comments

Comments
 (0)