Skip to content

Commit 5cb221a

Browse files
authored
Merge pull request #26 from mailcarrierapp/feat/users-dashboard
[2.x] Users management dashboard
2 parents 4a1d0ee + fa91894 commit 5cb221a

File tree

6 files changed

+154
-12
lines changed

6 files changed

+154
-12
lines changed

resources/dist/css/theme.css

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

src/Providers/Filament/MailCarrierPanelProvider.php

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@
1717
use Illuminate\Session\Middleware\StartSession;
1818
use Illuminate\View\Middleware\ShareErrorsFromSession;
1919
use MailCarrier\Pages\Login;
20-
use MailCarrier\Resources\ApiTokenResource;
21-
use MailCarrier\Resources\LayoutResource;
22-
use MailCarrier\Resources\LogResource;
23-
use MailCarrier\Resources\TemplateResource;
20+
use MailCarrier\Resources;
2421
use MailCarrier\Widgets\SentFailureChartWidget;
2522
use MailCarrier\Widgets\StatsOverviewWidget;
2623

@@ -45,10 +42,11 @@ public function panel(Panel $panel): Panel
4542
->collapsibleNavigationGroups(false)
4643
->discoverResources(in: '../../Resources', for: 'MailCarrier\\Resources')
4744
->resources([
48-
LogResource::class,
49-
LayoutResource::class,
50-
TemplateResource::class,
51-
ApiTokenResource::class,
45+
Resources\LogResource::class,
46+
Resources\LayoutResource::class,
47+
Resources\TemplateResource::class,
48+
Resources\ApiTokenResource::class,
49+
Resources\UserResource::class,
5250
])
5351
->discoverPages(in: app_path('Filament/Pages'), for: 'MailCarrier\\Pages')
5452
->pages([

src/Resources/ApiTokenResource/Actions/CreateAction.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use Carbon\Carbon;
66
use Filament\Actions\Action;
7-
use Filament\Actions\Concerns\CanCustomizeProcess;
87
use Filament\Forms;
98
use Filament\Support\Enums\Alignment;
109
use Filament\Support\Enums\MaxWidth;
@@ -13,8 +12,6 @@
1312

1413
class CreateAction extends Action
1514
{
16-
use CanCustomizeProcess;
17-
1815
const GENERATED_TOKEN_FIELD_NAME = 'generated_token';
1916

2017
public static function getDefaultName(): ?string

src/Resources/UserResource.php

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
3+
namespace MailCarrier\Resources;
4+
5+
use Filament\Resources\Resource;
6+
use Filament\Tables;
7+
use Illuminate\Support\Str;
8+
use Illuminate\Support\Stringable;
9+
use MailCarrier\Enums\Auth;
10+
use MailCarrier\Models\User;
11+
use MailCarrier\Resources\UserResource\Pages;
12+
13+
class UserResource extends Resource
14+
{
15+
protected static ?string $model = User::class;
16+
17+
protected static ?string $navigationIcon = 'heroicon-o-users';
18+
19+
protected static ?string $navigationGroup = 'Management';
20+
21+
/**
22+
* List all the records.
23+
*/
24+
public static function table(Tables\Table $table): Tables\Table
25+
{
26+
return $table
27+
->columns([
28+
Tables\Columns\TextColumn::make('name')
29+
->placeholder('No name provided'),
30+
31+
Tables\Columns\TextColumn::make('email')
32+
->formatStateUsing(
33+
fn (string $state) => Str::of($state)
34+
->when(
35+
Str::of($state)->before('@')->length() > 5,
36+
fn (Stringable $str) => $str->mask('*', 3, strpos($state, '@') - 3),
37+
fn (Stringable $str) => $str->mask('*', 0, strpos($state, '@')),
38+
)
39+
),
40+
41+
Tables\Columns\TextColumn::make('created_at')
42+
->label('Creation date')
43+
->dateTime(),
44+
])
45+
->actions([
46+
Tables\Actions\DeleteAction::make(),
47+
])
48+
->query(User::query()->whereNot('email', Auth::AuthManagerEmail->value));
49+
}
50+
51+
/**
52+
* Get Filament CRUD pages.
53+
*/
54+
public static function getPages(): array
55+
{
56+
return [
57+
'index' => Pages\ListUsers::route('/'),
58+
];
59+
}
60+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?php
2+
3+
namespace MailCarrier\Resources\UserResource\Actions;
4+
5+
use Filament\Actions\CreateAction as BaseCreateAction;
6+
use Filament\Forms;
7+
use Filament\Support\Enums\Alignment;
8+
use Filament\Support\Enums\MaxWidth;
9+
use Illuminate\Support\Facades\Hash;
10+
use Illuminate\Support\HtmlString;
11+
use MailCarrier\Facades\MailCarrier;
12+
use MailCarrier\Models\User;
13+
use MailCarrier\Resources\UserResource;
14+
15+
class CreateAction extends BaseCreateAction
16+
{
17+
protected function setUp(): void
18+
{
19+
parent::setUp();
20+
21+
$this->authorize(fn (): bool => UserResource::canCreate());
22+
23+
$this->modalFooterActionsAlignment(Alignment::End);
24+
$this->modalWidth(MaxWidth::Large);
25+
26+
if (!is_null(MailCarrier::getSocialAuthDriver())) {
27+
$this->form([
28+
Forms\Components\Placeholder::make('cannot_create_users')
29+
->label('')
30+
->content(new HtmlString(<<<'HTML'
31+
<div class="bg-warning-100 dark:bg-warning-500/20 border border-warning-300 dark:border-warning-600 rounded py-2 px-4">
32+
Cannot create users with social authentication enabled.
33+
</div>
34+
HTML)),
35+
]);
36+
37+
$this->modalHeading('Cannot create users');
38+
$this->modalIcon('heroicon-o-exclamation-triangle');
39+
$this->modalIconColor('warning');
40+
$this->modalSubmitAction(false);
41+
$this->modalCancelActionLabel('Close');
42+
$this->extraModalFooterActions([]);
43+
44+
return;
45+
}
46+
47+
$this->form([
48+
Forms\Components\TextInput::make('name')
49+
->required(),
50+
51+
Forms\Components\TextInput::make('email')
52+
->email()
53+
->required()
54+
->unique((new User())->getTable(), 'email'),
55+
56+
Forms\Components\TextInput::make('password')
57+
->password()
58+
->revealable()
59+
->required(),
60+
]);
61+
62+
$this->mutateFormDataUsing(function (array $data): array {
63+
$data['password'] = Hash::make($data['password']);
64+
65+
return $data;
66+
});
67+
}
68+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace MailCarrier\Resources\UserResource\Pages;
4+
5+
use Filament\Resources\Pages\ListRecords;
6+
use MailCarrier\Resources\UserResource;
7+
use MailCarrier\Resources\UserResource\Actions\CreateAction;
8+
9+
class ListUsers extends ListRecords
10+
{
11+
protected static string $resource = UserResource::class;
12+
13+
protected function getHeaderActions(): array
14+
{
15+
return [
16+
CreateAction::make(),
17+
];
18+
}
19+
}

0 commit comments

Comments
 (0)