Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
<?php

namespace Modules\Core\Filament\Company\Resources\CompanyUsers;

use BackedEnum;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Support\Icons\Heroicon;
use Filament\Tables\Actions\BulkActionGroup;
use Filament\Tables\Actions\DeleteBulkAction;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Model;
use Modules\Core\Enums\UserRole;
use Modules\Core\Filament\Company\Resources\CompanyUsers\Pages\ListCompanyUsers;
use Modules\Core\Models\Company;
use Modules\Core\Models\User;

class CompanyUserResource extends Resource
{
protected static ?string $model = User::class;

protected static string|BackedEnum|null $navigationIcon = Heroicon::Users;

protected static ?string $navigationLabel = 'team_members';

public static function form(Form $form): Form
{
return $form->schema([
TextInput::make('email')
->label(trans('ip.email'))
->email()
->required(),
]);
}

public static function table(Table $table): Table
{
return $table
->query(fn () => Company::getTenant()?->users() ?? User::query())
->columns([
TextColumn::make('name')
->label(trans('ip.name'))
->searchable()
->sortable(),
TextColumn::make('email')
->label(trans('ip.email'))
->searchable()
->sortable(),
])
->filters([])
->actions([
\Filament\Tables\Actions\Action::make('remove')
->label(trans('ip.remove'))
->icon('heroicon-m-trash-2')
->color('danger')
->action(function (User $record) {
Company::getTenant()?->users()->detach($record->id);
})
->requiresConfirmation(),
])
->bulkActions([
BulkActionGroup::make([
DeleteBulkAction::make()
->action(function ($records) {
$company = Company::getTenant();
foreach ($records as $record) {
$company?->users()->detach($record->id);
}
}),
]),
]);
}

public static function getRelations(): array
{
return [];
}

public static function getPages(): array
{
return [
'index' => ListCompanyUsers::route('/'),
];
}

public static function canViewAny(): bool
{
$roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]);
return auth()->user()?->hasRole($roles) ?? false;
}

public static function canCreate(): bool
{
$roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]);
return auth()->user()?->hasRole($roles) ?? false;
}

public static function canView(Model $record): bool
{
$roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]);
return auth()->user()?->hasRole($roles) ?? false;
}

public static function canEdit(Model $record): bool
{
$roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]);
return auth()->user()?->hasRole($roles) ?? false;
}

public static function canDelete(Model $record): bool
{
$roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]);
return auth()->user()?->hasRole($roles) ?? false;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php

namespace Modules\Core\Filament\Company\Resources\CompanyUsers\Pages;

use Filament\Actions\Action;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Pages\ListRecords;
use Modules\Core\Filament\Company\Resources\CompanyUsers\CompanyUserResource;
use Modules\Core\Models\Company;
use Modules\Core\Models\User;

class ListCompanyUsers extends ListRecords
{
protected static string $resource = CompanyUserResource::class;

protected function getHeaderActions(): array
{
return [
Action::make('add_user')
->label(trans('ip.add_team_member'))
->icon('heroicon-m-plus')
->form([
TextInput::make('email')
->label(trans('ip.email'))
->email()
->required()
->unique(ignoreRecord: true),
])
->action(function (array $data) {
$user = User::whereEmail($data['email'])->first();
if (!$user) {
\Filament\Notifications\Notification::make()
->danger()
->title(trans('ip.user_not_found'))
->body(trans('ip.no_user_found_with_email', ['email' => $data['email']]))
->send();
return;
}

Company::getTenant()?->users()->syncWithoutDetaching([$user->id]);

\Filament\Notifications\Notification::make()
->success()
->title(trans('ip.team_member_added'))
->body(trans('ip.user_added_to_team', ['name' => $user->name]))
->send();
})
->modalHeading(trans('ip.add_team_member'))
->modalSubmitActionLabel(trans('ip.add_member')),
];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
<?php

namespace Modules\Core\Filament\Company\Resources\EmailTemplates;

use BackedEnum;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Model;
use Modules\Core\Enums\UserRole;
use Modules\Core\Filament\Admin\Resources\EmailTemplates\Schemas\EmailTemplateForm;
use Modules\Core\Filament\Admin\Resources\EmailTemplates\Tables\EmailTemplatesTable;
use Modules\Core\Filament\Company\Resources\EmailTemplates\Pages\CreateEmailTemplate;
use Modules\Core\Filament\Company\Resources\EmailTemplates\Pages\EditEmailTemplate;
use Modules\Core\Filament\Company\Resources\EmailTemplates\Pages\ListEmailTemplates;
use Modules\Core\Models\EmailTemplate;

class EmailTemplateResource extends Resource
{
protected static ?string $model = EmailTemplate::class;

protected static string|BackedEnum|null $navigationIcon = Heroicon::EnvelopeOpen;

public static function form(Schema $schema): Schema
{
return EmailTemplateForm::configure($schema);
}

public static function table(Table $table): Table
{
return EmailTemplatesTable::configure($table);
}

public static function getRelations(): array
{
return [];
}

public static function getPages(): array
{
return [
'index' => ListEmailTemplates::route('/'),
'create' => CreateEmailTemplate::route('/create'),
'edit' => EditEmailTemplate::route('/{record}/edit'),
];
}

public static function canViewAny(): bool
{
$roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]);
return auth()->user()?->hasRole($roles) ?? false;
}

public static function canCreate(): bool
{
$roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]);
return auth()->user()?->hasRole($roles) ?? false;
}

public static function canView(Model $record): bool
{
$roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]);
return auth()->user()?->hasRole($roles) ?? false;
}

public static function canEdit(Model $record): bool
{
$roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]);
return auth()->user()?->hasRole($roles) ?? false;
}

public static function canDelete(Model $record): bool
{
$roles = array_merge(UserRole::elevated(), [UserRole::CUSTOMER_ADMIN->value]);
return auth()->user()?->hasRole($roles) ?? false;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Modules\Core\Filament\Company\Resources\EmailTemplates\Pages;

use Filament\Resources\Pages\CreateRecord;
use Modules\Core\Filament\Company\Resources\EmailTemplates\EmailTemplateResource;

class CreateEmailTemplate extends CreateRecord
{
protected static string $resource = EmailTemplateResource::class;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace Modules\Core\Filament\Company\Resources\EmailTemplates\Pages;

use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
use Modules\Core\Filament\Company\Resources\EmailTemplates\EmailTemplateResource;

class EditEmailTemplate extends EditRecord
{
protected static string $resource = EmailTemplateResource::class;

protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace Modules\Core\Filament\Company\Resources\EmailTemplates\Pages;

use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
use Modules\Core\Filament\Company\Resources\EmailTemplates\EmailTemplateResource;

class ListEmailTemplates extends ListRecords
{
protected static string $resource = EmailTemplateResource::class;

protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
6 changes: 6 additions & 0 deletions Modules/Core/Providers/CompanyPanelProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
use Modules\Core\Filament\Company\Pages\CompanySettings;
use Modules\Core\Filament\Company\Pages\Dashboard;
use Modules\Core\Filament\Company\Pages\MyCompanies;
use Modules\Core\Filament\Company\Resources\CompanyUsers\CompanyUserResource;
use Modules\Core\Filament\Company\Resources\EmailTemplates\EmailTemplateResource;
use Modules\Core\Filament\Company\Resources\NoteTemplates\NoteTemplateResource;
use Modules\Core\Filament\Pages\Auth\Login;
use Modules\Core\Http\Middleware\ConfigureTenant;
Expand Down Expand Up @@ -174,6 +176,8 @@ public function panel(Panel $panel): Panel
TaskResource::class,
QuoteResource::class,
NoteTemplateResource::class,
EmailTemplateResource::class,
CompanyUserResource::class,
])
->discoverPages(in: app_path('Filament/Company/Pages'), for: 'App\Filament\Company\Pages')
->discoverWidgets(in: app_path('Filament/Company/Widgets'), for: 'App\Filament\Company\Widgets')
Expand Down Expand Up @@ -248,6 +252,8 @@ public function panel(Panel $panel): Panel
//->icon('heroicon-o-cog-6-tooth')
->items([
...NoteTemplateResource::getNavigationItems(),
...EmailTemplateResource::getNavigationItems(),
...CompanyUserResource::getNavigationItems(),
]),
]);
})
Expand Down
Loading