Skip to content

Commit 2dcb334

Browse files
add bulk actions (#142)
1 parent c7db10f commit 2dcb334

8 files changed

Lines changed: 255 additions & 242 deletions

File tree

app/Filament/Resources/PointResource.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
namespace App\Filament\Resources;
66

77
use App\Enums\Point\Status;
8+
use App\Filament\Resources\PointResource\Actions\Table\BulkAddMaterials;
9+
use App\Filament\Resources\PointResource\Actions\Table\BulkRemoveMaterials;
10+
use App\Filament\Resources\PointResource\Actions\Table\BulkUpdateInfo;
811
use App\Filament\Resources\PointResource\Pages;
912
use App\Models\Point;
1013
use App\Models\PointGroup;
@@ -63,6 +66,13 @@ public static function table(Table $table): Table
6366
->relationship('county', 'name')
6467
->multiple(),
6568

69+
SelectFilter::make('materials')
70+
->label(__('map_points.fields.materials'))
71+
->relationship('materials', 'name')
72+
->multiple()
73+
->searchable()
74+
->preload(),
75+
6676
TrashedFilter::make(),
6777

6878
])
@@ -127,6 +137,9 @@ public static function table(Table $table): Table
127137
->color('warning')
128138
->requiresConfirmation(),
129139

140+
BulkUpdateInfo::make(),
141+
BulkAddMaterials::make(),
142+
BulkRemoveMaterials::make(),
130143

131144
BulkAction::make('allocate_to_group')
132145
->label(__('map_points.buttons.set_group'))

app/Filament/Resources/PointResource/Actions/Page/AddPoint.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ private function showField(Get $get, string $string): bool
191191
return ! $get('chosenService.' . $string);
192192
}
193193

194-
private function getMaterialsFields(): array
194+
public static function getMaterialsFields(): array
195195
{
196196
$categories = MaterialCategory::with('materials')->orderBy('position')->get();
197197
$fields = [];
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Filament\Resources\PointResource\Actions\Table;
6+
7+
use App\Filament\Resources\PointResource\Actions\Page\AddPoint;
8+
use App\Models\Point;
9+
use Filament\Forms\Form;
10+
use Filament\Notifications\Notification;
11+
use Filament\Tables\Actions\BulkAction;
12+
use Illuminate\Support\Collection;
13+
14+
class BulkAddMaterials extends BulkAction
15+
{
16+
public static function make(?string $name = null): static
17+
{
18+
return parent::make('bulkAddMaterials');
19+
}
20+
21+
protected function setUp(): void
22+
{
23+
parent::setUp();
24+
25+
$this->label(__('map_points.actions.bulk_add_materials.title'));
26+
27+
$this->color('primary');
28+
$this->icon('heroicon-o-plus');
29+
$this->action(fn (Collection $records, array $data) => $this->addMaterialsToPoints($records, $data));
30+
$this->slideOver();
31+
}
32+
33+
public function getForm(Form $form): ?Form
34+
{
35+
return $form->schema(AddPoint::getMaterialsFields())
36+
->columns(2);
37+
}
38+
39+
private function addMaterialsToPoints(Collection $records, array $data): void
40+
{
41+
$materialsToAttach = [];
42+
collect($data)
43+
->values()
44+
->map(function ($materials) use (&$materialsToAttach) {
45+
foreach ($materials as $key => $value) {
46+
if ($value) {
47+
$materialsToAttach[] = $key;
48+
}
49+
}
50+
});
51+
$numberOfChangedPoints = 0;
52+
$records->each(function (Point $record) use ($materialsToAttach , &$numberOfChangedPoints) {
53+
if ($record->serviceType->can_collect_materials)
54+
{
55+
$record->materials()->attach($materialsToAttach);
56+
$numberOfChangedPoints++;
57+
}
58+
});
59+
60+
if ($numberOfChangedPoints > 0) {
61+
Notification::make('success')
62+
->title(__('map_points.actions.bulk_add_materials.success', ['count' => $numberOfChangedPoints]))
63+
->icon('heroicon-o-check')
64+
->iconColor('success')
65+
->send();
66+
} else {
67+
Notification::make('error')
68+
->title(__('map_points.actions.bulk_add_materials.error'))
69+
->danger()
70+
->send();
71+
}
72+
}
73+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Filament\Resources\PointResource\Actions\Table;
6+
7+
use App\Filament\Resources\PointResource\Actions\Page\AddPoint;
8+
use App\Models\Point;
9+
use Filament\Forms\Form;
10+
use Filament\Notifications\Notification;
11+
use Filament\Tables\Actions\BulkAction;
12+
use Illuminate\Support\Collection;
13+
14+
class BulkRemoveMaterials extends BulkAction
15+
{
16+
public static function make(?string $name = null): static
17+
{
18+
return parent::make('bulkRemoveMaterials');
19+
}
20+
21+
protected function setUp(): void
22+
{
23+
parent::setUp();
24+
25+
$this->label(__('map_points.actions.bulk_remove_materials.title'));
26+
27+
$this->color('danger');
28+
$this->icon('heroicon-o-minus');
29+
$this->action(fn (Collection $records, array $data) => $this->removeMaterialsFromPoints($records, $data));
30+
$this->slideOver();
31+
}
32+
33+
public function getForm(Form $form): ?Form
34+
{
35+
return $form->schema(AddPoint::getMaterialsFields())
36+
->columns(2);
37+
}
38+
39+
private function removeMaterialsFromPoints(Collection $records, array $data): void
40+
{
41+
$materialsToAttach = [];
42+
collect($data)
43+
->values()
44+
->map(function ($materials) use (&$materialsToAttach) {
45+
foreach ($materials as $key => $value) {
46+
if ($value) {
47+
$materialsToAttach[] = $key;
48+
}
49+
}
50+
});
51+
$numberOfChangedPoints = 0;
52+
$records->each(function (Point $record) use ($materialsToAttach, &$numberOfChangedPoints) {
53+
if ($record->serviceType->can_collect_materials) {
54+
$record->materials()->detach($materialsToAttach);
55+
$numberOfChangedPoints++;
56+
}
57+
});
58+
59+
if ($numberOfChangedPoints > 0) {
60+
Notification::make('success')
61+
->title(__('map_points.actions.bulk_remove_materials.success', ['count' => $numberOfChangedPoints]))
62+
->icon('heroicon-o-check')
63+
->iconColor('success')
64+
->send();
65+
} else {
66+
Notification::make('error')
67+
->title(__('map_points.actions.bulk_remove_materials.error'))
68+
->danger()
69+
->send();
70+
}
71+
}
72+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Filament\Resources\PointResource\Actions\Table;
6+
7+
use App\Models\Point;
8+
use Filament\Forms\Components\Select;
9+
use Filament\Forms\Components\TextInput;
10+
use Filament\Forms\Form;
11+
use Filament\Notifications\Notification;
12+
use Filament\Tables\Actions\BulkAction;
13+
use Illuminate\Support\Collection;
14+
15+
class BulkUpdateInfo extends BulkAction
16+
{
17+
public static function make(?string $name = null): static
18+
{
19+
return parent::make('bulkUpdateInfo');
20+
}
21+
22+
protected function setUp(): void
23+
{
24+
parent::setUp();
25+
26+
$this->label(__('map_points.actions.bulk_update_info.title'));
27+
$this->color('warning');
28+
$this->icon('heroicon-o-pencil');
29+
$this->action(fn (Collection $records, array $data) => $this->updateInfo($records, $data));
30+
}
31+
32+
public function getForm(Form $form): ?Form
33+
{
34+
return $form->schema([
35+
Select::make('field')
36+
->label(__('map_points.actions.bulk_update_info.field'))
37+
->options([
38+
'notes' => __('map_points.fields.notes'),
39+
'administered_by' => __('map_points.fields.administered_by'),
40+
'business_name' => __('map_points.fields.business_name'),
41+
'email' => __('map_points.fields.email'),
42+
'phone' => __('map_points.fields.phone'),
43+
'website' => __('map_points.fields.website'),
44+
'observations' => __('map_points.fields.observations'),
45+
'schedule' => __('map_points.fields.schedule'),
46+
])
47+
->required(),
48+
TextInput::make('field_value')
49+
->label(__('map_points.actions.bulk_update_info.field_value'))
50+
->required()
51+
->maxLength(255),
52+
])
53+
->columns(2);
54+
}
55+
56+
private function updateInfo(Collection $records, array $data)
57+
{
58+
$numberOfChangedPoints = 0;
59+
$records->each(function (Point $record) use ($data, &$numberOfChangedPoints) {
60+
$record->{$data['field']} = $data['field_value'];
61+
$record->save();
62+
$numberOfChangedPoints++;
63+
});
64+
65+
if ($numberOfChangedPoints > 0) {
66+
Notification::make('success')
67+
->success()
68+
->title(__('map_points.actions.bulk_update_info.success', ['count' => $numberOfChangedPoints]))
69+
->send();
70+
} else {
71+
Notification::make('error')
72+
->title(__('map_points.actions.bulk_update_info.error'))
73+
->danger()
74+
->send();
75+
}
76+
}
77+
}

0 commit comments

Comments
 (0)