Skip to content

Commit b6de69e

Browse files
author
Andy Ford
authored
Merge pull request #422 from ECFMP/division-discord-webhooks
Division discord webhooks admin
2 parents 771a1ea + 840fc95 commit b6de69e

File tree

10 files changed

+763
-11
lines changed

10 files changed

+763
-11
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?php
2+
3+
namespace App\Filament\Resources;
4+
5+
use App\Filament\Resources\DivisionDiscordWebhookResource\Pages;
6+
use App\Filament\Resources\DivisionDiscordWebhookResource\RelationManagers\FlightinformationregionsRelationManager;
7+
use App\Models\DivisionDiscordWebhook;
8+
use App\Models\FlightInformationRegion;
9+
use Filament\Forms\Components\TextInput;
10+
use Filament\Resources\Form;
11+
use Filament\Resources\Resource;
12+
use Filament\Resources\Table;
13+
use Filament\Tables;
14+
use Filament\Tables\Columns\TagsColumn;
15+
use Filament\Tables\Columns\TextColumn;
16+
17+
class DivisionDiscordWebhookResource extends Resource
18+
{
19+
protected static ?string $model = DivisionDiscordWebhook::class;
20+
21+
protected static ?string $navigationIcon = 'heroicon-o-collection';
22+
23+
public static function form(Form $form): Form
24+
{
25+
return $form
26+
->schema([
27+
TextInput::make('description')
28+
->label(__('Description'))
29+
->required()
30+
->maxLength(255),
31+
TextInput::make('url')
32+
->url()
33+
->required()
34+
->maxLength(
35+
500
36+
)
37+
]);
38+
}
39+
40+
public static function table(Table $table): Table
41+
{
42+
return $table
43+
->columns([
44+
TextColumn::make('id')
45+
->label(__('id')),
46+
TextColumn::make('description')
47+
->label(__('description'))
48+
->searchable(),
49+
TextColumn::make('url')
50+
->label(__('URL')),
51+
TagsColumn::make('firs')
52+
->getStateUsing(fn (DivisionDiscordWebhook $record) => $record->flightInformationRegions->map(fn (FlightInformationRegion $fir) => $fir->identifierName)->toArray())
53+
->label(__('FIRs')),
54+
TextColumn::make('created_at')
55+
->label(__('Created At')),
56+
])
57+
->actions([
58+
Tables\Actions\EditAction::make(),
59+
]);
60+
}
61+
62+
public static function getRelations(): array
63+
{
64+
return [
65+
FlightinformationregionsRelationManager::class,
66+
];
67+
}
68+
69+
public static function getPages(): array
70+
{
71+
return [
72+
'index' => Pages\ListDivisionDiscordWebhooks::route('/'),
73+
'create' => Pages\CreateDivisionDiscordWebhook::route('/create'),
74+
'edit' => Pages\EditDivisionDiscordWebhook::route('/{record}/edit'),
75+
];
76+
}
77+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace App\Filament\Resources\DivisionDiscordWebhookResource\Pages;
4+
5+
use App\Filament\Resources\DivisionDiscordWebhookResource;
6+
use Filament\Resources\Pages\CreateRecord;
7+
8+
class CreateDivisionDiscordWebhook extends CreateRecord
9+
{
10+
protected static string $resource = DivisionDiscordWebhookResource::class;
11+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace App\Filament\Resources\DivisionDiscordWebhookResource\Pages;
4+
5+
use App\Filament\Resources\DivisionDiscordWebhookResource;
6+
use Filament\Pages\Actions;
7+
use Filament\Resources\Pages\EditRecord;
8+
9+
class EditDivisionDiscordWebhook extends EditRecord
10+
{
11+
protected static string $resource = DivisionDiscordWebhookResource::class;
12+
13+
protected function getActions(): array
14+
{
15+
return [
16+
Actions\DeleteAction::make(),
17+
];
18+
}
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace App\Filament\Resources\DivisionDiscordWebhookResource\Pages;
4+
5+
use App\Filament\Resources\DivisionDiscordWebhookResource;
6+
use Filament\Pages\Actions;
7+
use Filament\Resources\Pages\ListRecords;
8+
9+
class ListDivisionDiscordWebhooks extends ListRecords
10+
{
11+
protected static string $resource = DivisionDiscordWebhookResource::class;
12+
13+
protected function getActions(): array
14+
{
15+
return [
16+
Actions\CreateAction::make(),
17+
];
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
namespace App\Filament\Resources\DivisionDiscordWebhookResource\RelationManagers;
4+
5+
use App\Models\FlightInformationRegion;
6+
use Filament\Forms\Components\TextInput;
7+
use Filament\Resources\RelationManagers\RelationManager;
8+
use Filament\Resources\Table;
9+
use Filament\Tables;
10+
use Filament\Tables\Actions\AttachAction;
11+
use Filament\Tables\Actions\DetachAction;
12+
13+
class FlightinformationregionsRelationManager extends RelationManager
14+
{
15+
protected static string $relationship = 'flightInformationRegions';
16+
17+
protected static ?string $title = 'Flight Information Regions';
18+
19+
protected static ?string $recordTitleAttribute = 'identifier';
20+
21+
protected static ?string $inverseRelationship = 'divisionDiscordWebhooks';
22+
23+
public static function table(Table $table): Table
24+
{
25+
return $table
26+
->columns([
27+
Tables\Columns\TextColumn::make('fir')
28+
->label(__('FIR'))
29+
->formatStateUsing(fn (FlightInformationRegion $record) => $record->identifierName),
30+
Tables\Columns\TextColumn::make('tag')
31+
->label(__('Mention Tag')),
32+
])
33+
->headerActions([
34+
AttachAction::make('attach-fir')
35+
->form(fn (AttachAction $action) => [
36+
$action->getRecordSelect(),
37+
TextInput::make('tag')
38+
->label(__('Discord Tag'))
39+
->helperText(__('A Discord tag for a person / group / role that should be mentioned in the post.'))
40+
->maxLength(255)
41+
]),
42+
])
43+
->actions([
44+
DetachAction::make(),
45+
]);
46+
}
47+
}
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
<?php
2+
3+
namespace App\Policies;
4+
5+
use App\Models\User;
6+
use App\Enums\RoleKey;
7+
use App\Models\DivisionDiscordWebhook;
8+
use Illuminate\Auth\Access\HandlesAuthorization;
9+
10+
class DivisionDiscordWebhookPolicy
11+
{
12+
use HandlesAuthorization;
13+
14+
/**
15+
* Determine whether the user can view any models.
16+
*
17+
* @param \App\Models\User $user
18+
* @return \Illuminate\Auth\Access\Response|bool
19+
*/
20+
public function viewAny(User $user)
21+
{
22+
return in_array($user->role->key, [
23+
RoleKey::SYSTEM,
24+
RoleKey::NMT,
25+
]);
26+
}
27+
28+
/**
29+
* Determine whether the user can view the model.
30+
*
31+
* @param \App\Models\User $user
32+
* @param \App\Models\DivisionDiscordWebhook $divisionDiscordWebhook
33+
* @return \Illuminate\Auth\Access\Response|bool
34+
*/
35+
public function view(User $user, DivisionDiscordWebhook $divisionDiscordWebhook)
36+
{
37+
return in_array($user->role->key, [
38+
RoleKey::SYSTEM,
39+
RoleKey::NMT,
40+
]);
41+
}
42+
43+
/**
44+
* Determine whether the user can create models.
45+
*
46+
* @param \App\Models\User $user
47+
* @return \Illuminate\Auth\Access\Response|bool
48+
*/
49+
public function create(User $user)
50+
{
51+
return in_array($user->role->key, [
52+
RoleKey::SYSTEM,
53+
RoleKey::NMT,
54+
]);
55+
}
56+
57+
/**
58+
* Determine whether the user can update the model.
59+
*
60+
* @param \App\Models\User $user
61+
* @param \App\Models\DivisionDiscordWebhook $divisionDiscordWebhook
62+
* @return \Illuminate\Auth\Access\Response|bool
63+
*/
64+
public function update(User $user, DivisionDiscordWebhook $divisionDiscordWebhook)
65+
{
66+
return in_array($user->role->key, [
67+
RoleKey::SYSTEM,
68+
RoleKey::NMT,
69+
]);
70+
}
71+
72+
/**
73+
* Determine whether the user can delete the model.
74+
*
75+
* @param \App\Models\User $user
76+
* @param \App\Models\DivisionDiscordWebhook $divisionDiscordWebhook
77+
* @return \Illuminate\Auth\Access\Response|bool
78+
*/
79+
public function delete(User $user, DivisionDiscordWebhook $divisionDiscordWebhook)
80+
{
81+
return in_array($user->role->key, [
82+
RoleKey::SYSTEM,
83+
RoleKey::NMT,
84+
]);
85+
}
86+
87+
/**
88+
* Determine whether the user can restore the model.
89+
*
90+
* @param \App\Models\User $user
91+
* @param \App\Models\DivisionDiscordWebhook $divisionDiscordWebhook
92+
* @return \Illuminate\Auth\Access\Response|bool
93+
*/
94+
public function restore(User $user, DivisionDiscordWebhook $divisionDiscordWebhook)
95+
{
96+
return in_array($user->role->key, [
97+
RoleKey::SYSTEM,
98+
RoleKey::NMT,
99+
]);
100+
}
101+
102+
/**
103+
* Determine whether the user can permanently delete the model.
104+
*
105+
* @param \App\Models\User $user
106+
* @param \App\Models\DivisionDiscordWebhook $divisionDiscordWebhook
107+
* @return \Illuminate\Auth\Access\Response|bool
108+
*/
109+
public function forceDelete(User $user, DivisionDiscordWebhook $divisionDiscordWebhook)
110+
{
111+
return in_array($user->role->key, [
112+
RoleKey::SYSTEM,
113+
RoleKey::NMT,
114+
]);
115+
}
116+
117+
public function deleteAny()
118+
{
119+
return false;
120+
}
121+
122+
public function detachAny()
123+
{
124+
return false;
125+
}
126+
127+
/**
128+
* Determine whether the user can restore the model.
129+
*
130+
* @param \App\Models\User $user
131+
* @param \App\Models\DivisionDiscordWebhook $divisionDiscordWebhook
132+
* @return \Illuminate\Auth\Access\Response|bool
133+
*/
134+
public function attach(User $user, DivisionDiscordWebhook $divisionDiscordWebhook)
135+
{
136+
return in_array($user->role->key, [
137+
RoleKey::SYSTEM,
138+
RoleKey::NMT,
139+
]);
140+
}
141+
142+
/**
143+
* Determine whether the user can restore the model.
144+
*
145+
* @param \App\Models\User $user
146+
* @param \App\Models\DivisionDiscordWebhook $divisionDiscordWebhook
147+
* @return \Illuminate\Auth\Access\Response|bool
148+
*/
149+
public function detach(User $user, DivisionDiscordWebhook $divisionDiscordWebhook)
150+
{
151+
return in_array($user->role->key, [
152+
RoleKey::SYSTEM,
153+
RoleKey::NMT,
154+
]);
155+
}
156+
}

app/Providers/AuthServiceProvider.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
namespace App\Providers;
44

5+
use App\Models\DivisionDiscordWebhook;
56
use App\Policies\ActivityPolicy;
7+
use App\Policies\DivisionDiscordWebhookPolicy;
68
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
79
use Spatie\Activitylog\Models\Activity;
810

@@ -15,6 +17,7 @@ class AuthServiceProvider extends ServiceProvider
1517
*/
1618
protected $policies = [
1719
Activity::class => ActivityPolicy::class,
20+
DivisionDiscordWebhook::class => DivisionDiscordWebhookPolicy::class,
1821
];
1922

2023
/**

0 commit comments

Comments
 (0)