This commit is contained in:
Saeed Vaziry
2024-09-27 20:36:03 +02:00
committed by GitHub
parent b62c40c97d
commit f6bc04763b
122 changed files with 6609 additions and 807 deletions

View File

@ -0,0 +1,73 @@
<?php
namespace App\Web\Pages\Settings\Users;
use App\Actions\User\CreateUser;
use App\Models\User;
use App\Web\Traits\PageHasWidgets;
use Filament\Actions\CreateAction;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Form;
use Filament\Pages\Page;
use Filament\Support\Enums\MaxWidth;
class Index extends Page
{
use PageHasWidgets;
protected static ?string $navigationGroup = 'Settings';
protected static ?string $slug = 'users';
protected static ?string $navigationIcon = 'heroicon-o-users';
protected static ?int $navigationSort = 3;
protected static ?string $title = 'Users';
public static function canAccess(): bool
{
return auth()->user()?->can('viewAny', User::class) ?? false;
}
public function getWidgets(): array
{
return [
[Widgets\UsersList::class],
];
}
protected function getHeaderActions(): array
{
return [
CreateAction::make()
->label('Create User')
->authorize('create', User::class)
->action(function (array $data) {
$user = app(CreateUser::class)->create($data);
$this->dispatch('$refresh');
return $user;
})
->form(function (Form $form) {
$rules = CreateUser::rules();
return $form
->schema([
TextInput::make('name')
->rules($rules['name']),
TextInput::make('email')
->rules($rules['email']),
TextInput::make('password')
->rules($rules['password']),
Select::make('role')
->rules($rules['role'])
->options(collect(config('core.user_roles'))->mapWithKeys(fn ($role) => [$role => $role])),
])
->columns(1);
})
->modalWidth(MaxWidth::Large),
];
}
}

View File

@ -0,0 +1,113 @@
<?php
namespace App\Web\Pages\Settings\Users\Widgets;
use App\Actions\User\UpdateProjects;
use App\Actions\User\UpdateUser;
use App\Models\Project;
use App\Models\User;
use Filament\Forms\Components\CheckboxList;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Form;
use Filament\Notifications\Notification;
use Filament\Support\Enums\MaxWidth;
use Filament\Tables\Actions\Action;
use Filament\Tables\Actions\DeleteAction;
use Filament\Tables\Actions\EditAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Filament\Widgets\TableWidget as Widget;
use Illuminate\Database\Eloquent\Builder;
class UsersList extends Widget
{
protected $listeners = ['$refresh'];
protected function getTableQuery(): Builder
{
return User::query();
}
protected static ?string $heading = '';
protected function getTableColumns(): array
{
return [
TextColumn::make('name')
->searchable()
->sortable(),
TextColumn::make('email')
->searchable()
->sortable(),
TextColumn::make('timezone'),
TextColumn::make('created_at_by_timezone')
->label('Created At')
->searchable()
->sortable(),
TextColumn::make('role'),
];
}
public function getTable(): Table
{
return $this->table
->actions([
EditAction::make('edit')
->authorize(fn ($record) => auth()->user()->can('update', $record))
->using(function ($record, array $data) {
app(UpdateUser::class)->update($record, $data);
})
->form(function (Form $form, $record) {
return $form
->schema([
TextInput::make('name')
->rules(UpdateUser::rules($record)['name']),
TextInput::make('email')
->rules(UpdateUser::rules($record)['email']),
Select::make('timezone')
->searchable()
->options(
collect(timezone_identifiers_list())
->mapWithKeys(fn ($timezone) => [$timezone => $timezone])
)
->rules(UpdateUser::rules($record)['timezone']),
Select::make('role')
->options(
collect(config('core.user_roles'))
->mapWithKeys(fn ($role) => [$role => $role])
)
->rules(UpdateUser::rules($record)['role']),
])
->columns(1);
})
->modalWidth(MaxWidth::Large),
Action::make('update-projects')
->label('Projects')
->icon('heroicon-o-rectangle-stack')
->authorize(fn ($record) => auth()->user()->can('update', $record))
->action(function ($record, array $data) {
app(UpdateProjects::class)->update($record, $data);
Notification::make()
->title('Projects Updated')
->success()
->send();
})
->form(function (Form $form, $record) {
return $form
->schema([
CheckboxList::make('projects')
->options(Project::query()->pluck('name', 'id')->toArray())
->searchable()
->default($record->projects->pluck('id')->toArray())
->rules(UpdateProjects::rules()['projects.*']),
])
->columns(1);
})
->modalSubmitActionLabel('Save')
->modalWidth(MaxWidth::Large),
DeleteAction::make()
->authorize(fn ($record) => auth()->user()->can('delete', $record)),
]);
}
}