This commit is contained in:
Alexander Gabriel 2026-06-02 17:11:39 +00:00
parent 00bcaa2b93
commit 1559580ceb
37 changed files with 211 additions and 162 deletions

View File

@ -30,10 +30,10 @@ class OrderExporter extends Exporter
public static function getCompletedNotificationBody(Export $export): string public static function getCompletedNotificationBody(Export $export): string
{ {
$body = 'Your order export has completed and ' . Number::format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.'; $body = 'Your order export has completed and '.Number::format($export->successful_rows).' '.str('row')->plural($export->successful_rows).' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) { if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . Number::format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.'; $body .= ' '.Number::format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to export.';
} }
return $body; return $body;

View File

@ -5,9 +5,9 @@ namespace App\Filament\Resources\Belts;
use App\Filament\Resources\Belts\Pages\CreateBelt; use App\Filament\Resources\Belts\Pages\CreateBelt;
use App\Filament\Resources\Belts\Pages\EditBelt; use App\Filament\Resources\Belts\Pages\EditBelt;
use App\Filament\Resources\Belts\Pages\ListBelts; use App\Filament\Resources\Belts\Pages\ListBelts;
use App\Filament\Resources\Belts\RelationManagers\CoursesRelationManager;
use App\Filament\Resources\Belts\Schemas\BeltForm; use App\Filament\Resources\Belts\Schemas\BeltForm;
use App\Filament\Resources\Belts\Tables\BeltsTable; use App\Filament\Resources\Belts\Tables\BeltsTable;
use App\Filament\Resources\Belts\RelationManagers\CoursesRelationManager;
use App\Models\Belt; use App\Models\Belt;
use BackedEnum; use BackedEnum;
use Filament\Resources\Resource; use Filament\Resources\Resource;
@ -21,15 +21,20 @@ class BeltResource extends Resource
protected static ?string $model = Belt::class; protected static ?string $model = Belt::class;
protected static string|BackedEnum|null $navigationIcon = Heroicon::ArrowUpCircle; protected static string|BackedEnum|null $navigationIcon = Heroicon::ArrowUpCircle;
protected static string | UnitEnum | null $navigationGroup = 'Kurse und Kinder';
protected static string|UnitEnum|null $navigationGroup = 'Kurse und Kinder';
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';
protected static ?string $pluralLabel = 'Gürtel'; protected static ?string $pluralLabel = 'Gürtel';
protected static ?string $label = 'Gürtel'; protected static ?string $label = 'Gürtel';
protected static ?string $navigationLabel = "Gürtel";
protected static ?string $pluralModelLabel = "Gürtel"; protected static ?string $navigationLabel = 'Gürtel';
protected static ?string $modelLabel = "Gürtel";
protected static ?string $pluralModelLabel = 'Gürtel';
protected static ?string $modelLabel = 'Gürtel';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {
@ -44,7 +49,7 @@ class BeltResource extends Resource
public static function getRelations(): array public static function getRelations(): array
{ {
return [ return [
CoursesRelationManager::class CoursesRelationManager::class,
]; ];
} }

View File

@ -4,10 +4,8 @@ namespace App\Filament\Resources\Belts\RelationManagers;
use Filament\Actions\AttachAction; use Filament\Actions\AttachAction;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\CreateAction;
use Filament\Actions\DetachAction; use Filament\Actions\DetachAction;
use Filament\Actions\DetachBulkAction; use Filament\Actions\DetachBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Resources\RelationManagers\RelationManager; use Filament\Resources\RelationManagers\RelationManager;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;

View File

@ -3,7 +3,6 @@
namespace App\Filament\Resources\Belts\Tables; namespace App\Filament\Resources\Belts\Tables;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction; use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;

View File

@ -22,15 +22,20 @@ class CourseResource extends Resource
protected static ?string $model = Course::class; protected static ?string $model = Course::class;
protected static string|BackedEnum|null $navigationIcon = Heroicon::ArchiveBox; protected static string|BackedEnum|null $navigationIcon = Heroicon::ArchiveBox;
protected static string | UnitEnum | null $navigationGroup = 'Verwaltung';
protected static string|UnitEnum|null $navigationGroup = 'Verwaltung';
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';
protected static ?string $pluralLabel = 'Kurse'; protected static ?string $pluralLabel = 'Kurse';
protected static ?string $label = 'Kurs'; protected static ?string $label = 'Kurs';
protected static ?string $navigationLabel = "Kurse";
protected static ?string $pluralModelLabel = "Kurse"; protected static ?string $navigationLabel = 'Kurse';
protected static ?string $modelLabel = "Kurs";
protected static ?string $pluralModelLabel = 'Kurse';
protected static ?string $modelLabel = 'Kurs';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {
@ -50,7 +55,7 @@ class CourseResource extends Resource
public static function getRelations(): array public static function getRelations(): array
{ {
return [ return [
KidsRelationManager::class KidsRelationManager::class,
]; ];
} }

View File

@ -85,7 +85,7 @@ class KidsRelationManager extends RelationManager
->form(fn (AttachAction $action): array => [ ->form(fn (AttachAction $action): array => [
$action->getRecordSelect(), $action->getRecordSelect(),
DatePicker::make('date')->required(), DatePicker::make('date')->required(),
])->preloadRecordSelect() ])->preloadRecordSelect(),
]) ])
->recordActions([ ->recordActions([
ViewAction::make(), ViewAction::make(),

View File

@ -20,12 +20,16 @@ class GroupResource extends Resource
protected static ?string $model = Group::class; protected static ?string $model = Group::class;
protected static string|BackedEnum|null $navigationIcon = Heroicon::UserGroup; protected static string|BackedEnum|null $navigationIcon = Heroicon::UserGroup;
protected static string | UnitEnum | null $navigationGroup = 'Verwaltung';
protected static ?string $navigationLabel = "Gruppen"; protected static string|UnitEnum|null $navigationGroup = 'Verwaltung';
protected static ?string $pluralLabel = "Gruppen";
protected static ?string $pluralModelLabel = "Gruppen"; protected static ?string $navigationLabel = 'Gruppen';
protected static ?string $modelLabel = "Gruppe";
protected static ?string $pluralLabel = 'Gruppen';
protected static ?string $pluralModelLabel = 'Gruppen';
protected static ?string $modelLabel = 'Gruppe';
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';

View File

@ -22,15 +22,20 @@ class KidResource extends Resource
protected static ?string $model = Kid::class; protected static ?string $model = Kid::class;
protected static string|BackedEnum|null $navigationIcon = Heroicon::UserCircle; protected static string|BackedEnum|null $navigationIcon = Heroicon::UserCircle;
protected static string | UnitEnum | null $navigationGroup = 'Verwaltung';
protected static string|UnitEnum|null $navigationGroup = 'Verwaltung';
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';
protected static ?string $pluralLabel = 'Kinder'; protected static ?string $pluralLabel = 'Kinder';
protected static ?string $label = 'Kind'; protected static ?string $label = 'Kind';
protected static ?string $navigationLabel = "Kinder";
protected static ?string $pluralModelLabel = "Kinder"; protected static ?string $navigationLabel = 'Kinder';
protected static ?string $modelLabel = "Kind";
protected static ?string $pluralModelLabel = 'Kinder';
protected static ?string $modelLabel = 'Kind';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {
@ -50,7 +55,7 @@ class KidResource extends Resource
public static function getRelations(): array public static function getRelations(): array
{ {
return [ return [
CoursesRelationManager::class CoursesRelationManager::class,
]; ];
} }

View File

@ -4,7 +4,6 @@ namespace App\Filament\Resources\Kids\RelationManagers;
use Filament\Actions\AttachAction; use Filament\Actions\AttachAction;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\CreateAction;
use Filament\Actions\DeleteAction; use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction; use Filament\Actions\DeleteBulkAction;
use Filament\Actions\DetachAction; use Filament\Actions\DetachAction;
@ -37,7 +36,7 @@ class CoursesRelationManager extends RelationManager
TextInput::make('duration') TextInput::make('duration')
->required() ->required()
->numeric(), ->numeric(),
DatePicker::make('date') DatePicker::make('date'),
]); ]);
} }
@ -86,7 +85,7 @@ class CoursesRelationManager extends RelationManager
->schema(fn (AttachAction $action): array => [ ->schema(fn (AttachAction $action): array => [
$action->getRecordSelect(), $action->getRecordSelect(),
DatePicker::make('date')->required(), DatePicker::make('date')->required(),
])->preloadRecordSelect() ])->preloadRecordSelect(),
]) ])
->recordActions([ ->recordActions([
ViewAction::make(), ViewAction::make(),

View File

@ -20,10 +20,13 @@ class OrderResource extends Resource
protected static string|BackedEnum|null $navigationIcon = Heroicon::ShoppingBag; protected static string|BackedEnum|null $navigationIcon = Heroicon::ShoppingBag;
protected static ?string $navigationLabel = "Bestellungen"; protected static ?string $navigationLabel = 'Bestellungen';
protected static ?string $pluralLabel = "Bestellungen";
protected static ?string $pluralModelLabel = "Bestellungen"; protected static ?string $pluralLabel = 'Bestellungen';
protected static ?string $modelLabel = "Bestellung";
protected static ?string $pluralModelLabel = 'Bestellungen';
protected static ?string $modelLabel = 'Bestellung';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {

View File

@ -18,27 +18,35 @@ class EditOrder extends EditRecord
{ {
return [ return [
Action::make('bestellt_single') Action::make('bestellt_single')
->icon(Heroicon::ShoppingCart)->label("Bestellt")->action(function(Model $record) { ->icon(Heroicon::ShoppingCart)->label('Bestellt')->action(function (Model $record) {
$orderstatusBestellt = Orderstatus::where("name", "bestellt")->first(); $orderstatusBestellt = Orderstatus::where('name', 'bestellt')->first();
$record->orderstatus()->associate($orderstatusBestellt); $record->orderstatus()->associate($orderstatusBestellt);
$record->save(); $record->save();
$this->refreshFormData(['orderstatus_id']); $this->refreshFormData(['orderstatus_id']);
})->visible(function(Model $record) {return ($record->orderstatus->name == 'erfasst');}), })->visible(function (Model $record) {
return $record->orderstatus->name == 'erfasst';
}),
Action::make('angekommen_single') Action::make('angekommen_single')
->icon(Heroicon::BuildingOffice)->label("Angekommen")->action(function(Model $record) { ->icon(Heroicon::BuildingOffice)->label('Angekommen')->action(function (Model $record) {
$orderstatusAngekommen = Orderstatus::where("name", "angekommen")->first(); $orderstatusAngekommen = Orderstatus::where('name', 'angekommen')->first();
$record->orderstatus()->associate($orderstatusAngekommen); $record->orderstatus()->associate($orderstatusAngekommen);
$record->save(); $record->save();
$this->refreshFormData(['orderstatus_id']); $this->refreshFormData(['orderstatus_id']);
})->visible(function(Model $record) {return ($record->orderstatus->name == 'bestellt');}), })->visible(function (Model $record) {
return $record->orderstatus->name == 'bestellt';
}),
Action::make('genommen_single') Action::make('genommen_single')
->icon(Heroicon::Check)->label("Genommen")->action(function(Model $record) { ->icon(Heroicon::Check)->label('Genommen')->action(function (Model $record) {
$orderstatusGenommen = Orderstatus::where("name", "genommen")->first(); $orderstatusGenommen = Orderstatus::where('name', 'genommen')->first();
$record->orderstatus()->associate($orderstatusGenommen); $record->orderstatus()->associate($orderstatusGenommen);
$record->save(); $record->save();
$this->refreshFormData(['orderstatus_id']); $this->refreshFormData(['orderstatus_id']);
})->visible(function(Model $record) {return ($record->orderstatus->name == 'angekommen');}), })->visible(function (Model $record) {
Action::make("url_oeffnen")->icon(Heroicon::Link)->label("URL öffnen")->url(function (Model $record) { return $record->url;}, true), return $record->orderstatus->name == 'angekommen';
}),
Action::make('url_oeffnen')->icon(Heroicon::Link)->label('URL öffnen')->url(function (Model $record) {
return $record->url;
}, true),
DeleteAction::make(), DeleteAction::make(),
]; ];
} }

View File

@ -16,7 +16,7 @@ class ListOrders extends ListRecords
{ {
return [ return [
CreateAction::make(), CreateAction::make(),
ExportAction::make()->label('exportieren')->exporter(OrderExporter::class)->enableVisibleTableColumnsByDefault() ExportAction::make()->label('exportieren')->exporter(OrderExporter::class)->enableVisibleTableColumnsByDefault(),
]; ];
} }
} }

View File

@ -34,40 +34,48 @@ class OrderForm
->columnSpan(1), ->columnSpan(1),
Select::make('user_id') Select::make('user_id')
->label('Bestellt von')->inlineLabel() ->label('Bestellt von')->inlineLabel()
->relationship("user", "name") ->relationship('user', 'name')
->required() ->required()
->default(filament()->auth()->user()->id), ->default(filament()->auth()->user()->id),
Select::make("orderstatus_id") Select::make('orderstatus_id')
->label('Bestellstatus')->inlineLabel() ->label('Bestellstatus')->inlineLabel()
->relationship("orderstatus", "name") ->relationship('orderstatus', 'name')
->visibleOn(["edit"]) ->visibleOn(['edit'])
->prefixActions([ ->prefixActions([
Action::make('bestellt_single') Action::make('bestellt_single')
->icon(Heroicon::ShoppingCart)->label("Bestellt")->action(function(Model $record) { ->icon(Heroicon::ShoppingCart)->label('Bestellt')->action(function (Model $record) {
$orderstatusBestellt = Orderstatus::where("name", "bestellt")->first(); $orderstatusBestellt = Orderstatus::where('name', 'bestellt')->first();
$record->orderstatus_id = $orderstatusBestellt->id; $record->orderstatus_id = $orderstatusBestellt->id;
$record->save(); $record->save();
redirect(OrderResource::getUrl('edit', ['record' => $record->id,])); redirect(OrderResource::getUrl('edit', ['record' => $record->id]));
})->visible(function(Model $record) {return ($record->orderstatus->name == 'erfasst');}), })->visible(function (Model $record) {
Action::make('angekommen_single') return $record->orderstatus->name == 'erfasst';
->icon(Heroicon::BuildingOffice)->label("Angekommen")->action(function(Model $record) { }),
$orderstatusAngekommen = Orderstatus::where("name", "angekommen")->first(); Action::make('angekommen_single')
$record->orderstatus_id = $orderstatusAngekommen->id; ->icon(Heroicon::BuildingOffice)->label('Angekommen')->action(function (Model $record) {
$record->save(); $orderstatusAngekommen = Orderstatus::where('name', 'angekommen')->first();
redirect(OrderResource::getUrl('edit', ['record' => $record->id,])); $record->orderstatus_id = $orderstatusAngekommen->id;
})->visible(function(Model $record) {return ($record->orderstatus->name == 'bestellt');}), $record->save();
Action::make('genommen_single') redirect(OrderResource::getUrl('edit', ['record' => $record->id]));
->icon(Heroicon::Check)->label("Genommen")->action(function(Model $record) { })->visible(function (Model $record) {
$orderstatusGenommen = Orderstatus::where("name", "genommen")->first(); return $record->orderstatus->name == 'bestellt';
$record->orderstatus_id = $orderstatusGenommen->id; }),
$record->save(); Action::make('genommen_single')
redirect(OrderResource::getUrl('edit', ['record' => $record->id,])); ->icon(Heroicon::Check)->label('Genommen')->action(function (Model $record) {
})->visible(function(Model $record) {return ($record->orderstatus->name == 'angekommen');}), $orderstatusGenommen = Orderstatus::where('name', 'genommen')->first();
Action::make("url_oeffnen")->icon(Heroicon::Link)->label("URL öffnen")->url(function (Model $record) { return $record->url;}, true), $record->orderstatus_id = $orderstatusGenommen->id;
]), $record->save();
redirect(OrderResource::getUrl('edit', ['record' => $record->id]));
})->visible(function (Model $record) {
return $record->orderstatus->name == 'angekommen';
}),
Action::make('url_oeffnen')->icon(Heroicon::Link)->label('URL öffnen')->url(function (Model $record) {
return $record->url;
}, true),
]),
DateTimePicker::make('orderdatetime') DateTimePicker::make('orderdatetime')
->label('Bestellzeitpunkt')->inlineLabel() ->label('Bestellzeitpunkt')->inlineLabel()
->visibleOn(["edit", "view"]) ->visibleOn(['edit', 'view'])
->disabled(), ->disabled(),
])->columns(1); ])->columns(1);
} }

View File

@ -2,22 +2,21 @@
namespace App\Filament\Resources\Orders\Tables; namespace App\Filament\Resources\Orders\Tables;
use App\Models\Order;
use App\Models\Orderstatus; use App\Models\Orderstatus;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction; use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction; use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Illuminate\Database\Eloquent\Collection;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Enums\RecordActionsPosition; use Filament\Tables\Enums\RecordActionsPosition;
use Filament\Tables\Filters\Filter; use Filament\Tables\Filters\Filter;
use Filament\Tables\Filters\SelectFilter; use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
use Filament\Tables\Grouping\Group; use Filament\Tables\Grouping\Group;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
class OrdersTable class OrdersTable
@ -65,42 +64,58 @@ class OrdersTable
Group::make('user.name')->label('Bestellt von'), Group::make('user.name')->label('Bestellt von'),
]) ])
->filters([ ->filters([
SelectFilter::make('orderstatus_id')->relationship('orderstatus', 'name')->label("Bestellstatus")->multiple(), SelectFilter::make('orderstatus_id')->relationship('orderstatus', 'name')->label('Bestellstatus')->multiple(),
Filter::make('mine')->label("meine") Filter::make('mine')->label('meine')
->default() ->default()
->query(function (Builder $query) { ->query(function (Builder $query) {
$query->where('user_id', filament()->auth()->user()->id); $query->where('user_id', filament()->auth()->user()->id);
return $query; return $query;
}), }),
Filter::make('alleoffenen') Filter::make('alleoffenen')
->default() ->default()
->label("alle offenen") ->label('alle offenen')
->query(function (Builder $query) { ->query(function (Builder $query) {
$orderstatusGenommen = Orderstatus::where("name", "genommen")->first(); $orderstatusGenommen = Orderstatus::where('name', 'genommen')->first();
$query->where('orderstatus_id', '!=', $orderstatusGenommen->id); $query->where('orderstatus_id', '!=', $orderstatusGenommen->id);
return $query; return $query;
}), }),
]) ])
->recordActions([ ->recordActions([
Action::make('bestellt_single') Action::make('bestellt_single')
->icon(Heroicon::ShoppingCart)->iconButton()->label("Bestellt")->action(function(Model $record) { ->icon(Heroicon::ShoppingCart)->iconButton()->label('Bestellt')->action(function (Model $record) {
$orderstatusBestellt = Orderstatus::where("name", "bestellt")->first(); $orderstatusBestellt = Orderstatus::where('name', 'bestellt')->first();
$record->orderstatus_id = $orderstatusBestellt->id; $record->orderstatus_id = $orderstatusBestellt->id;
$record->save(); $record->save();
})->visible(function(Model $record) {$orderstatusErfasst = Orderstatus::where("name", "erfasst")->first();return ($orderstatusErfasst->id == $record->orderstatus_id);}), })->visible(function (Model $record) {
$orderstatusErfasst = Orderstatus::where('name', 'erfasst')->first();
return $orderstatusErfasst->id == $record->orderstatus_id;
}),
Action::make('angekommen_single') Action::make('angekommen_single')
->icon(Heroicon::BuildingOffice)->iconButton()->label("Angekommen")->action(function(Model $record) { ->icon(Heroicon::BuildingOffice)->iconButton()->label('Angekommen')->action(function (Model $record) {
$orderstatusAngekommen = Orderstatus::where("name", "angekommen")->first(); $orderstatusAngekommen = Orderstatus::where('name', 'angekommen')->first();
$record->orderstatus_id = $orderstatusAngekommen->id; $record->orderstatus_id = $orderstatusAngekommen->id;
$record->save(); $record->save();
})->visible(function(Model $record) {$orderstatusBestellt = Orderstatus::where("name", "bestellt")->first();return ($orderstatusBestellt->id == $record->orderstatus_id);}), })->visible(function (Model $record) {
$orderstatusBestellt = Orderstatus::where('name', 'bestellt')->first();
return $orderstatusBestellt->id == $record->orderstatus_id;
}),
Action::make('genommen_single') Action::make('genommen_single')
->icon(Heroicon::Check)->iconButton()->label("Genommen")->action(function(Model $record) { ->icon(Heroicon::Check)->iconButton()->label('Genommen')->action(function (Model $record) {
$orderstatusGenommen = Orderstatus::where("name", "genommen")->first(); $orderstatusGenommen = Orderstatus::where('name', 'genommen')->first();
$record->orderstatus_id = $orderstatusGenommen->id; $record->orderstatus_id = $orderstatusGenommen->id;
$record->save(); $record->save();
})->visible(function(Model $record) {$orderstatusAngekommen = Orderstatus::where("name", "angekommen")->first();return ($orderstatusAngekommen->id == $record->orderstatus_id);}), })->visible(function (Model $record) {
Action::make("url_oeffnen")->icon(Heroicon::Link)->iconButton()->label("URL öffnen")->url(function (Model $record) { return $record->url;}, true), $orderstatusAngekommen = Orderstatus::where('name', 'angekommen')->first();
return $orderstatusAngekommen->id == $record->orderstatus_id;
}),
Action::make('url_oeffnen')->icon(Heroicon::Link)->iconButton()->label('URL öffnen')->url(function (Model $record) {
return $record->url;
}, true),
EditAction::make()->iconButton(), EditAction::make()->iconButton(),
DeleteAction::make()->iconButton(), DeleteAction::make()->iconButton(),
], position: RecordActionsPosition::BeforeColumns) ], position: RecordActionsPosition::BeforeColumns)
@ -108,24 +123,24 @@ class OrdersTable
BulkActionGroup::make([ BulkActionGroup::make([
DeleteBulkAction::make(), DeleteBulkAction::make(),
Action::make('bestellt_bulk') Action::make('bestellt_bulk')
->label("Ausgewählte bestellt") ->label('Ausgewählte bestellt')
->accessSelectedRecords() ->accessSelectedRecords()
->action(function (Collection $selectedRecords) { ->action(function (Collection $selectedRecords) {
$orderstatusBestellt = Orderstatus::where("name", "bestellt")->first(); $orderstatusBestellt = Orderstatus::where('name', 'bestellt')->first();
$selectedRecords->each( $selectedRecords->each(
fn (Model $selectedRecord) => $selectedRecord->update([ fn (Model $selectedRecord) => $selectedRecord->update([
'orderstatus_id' => $orderstatusBestellt->id 'orderstatus_id' => $orderstatusBestellt->id,
]), ]),
); );
})->requiresConfirmation()->icon(Heroicon::ShoppingCart), })->requiresConfirmation()->icon(Heroicon::ShoppingCart),
Action::make('angekommen_bulk') Action::make('angekommen_bulk')
->label("Ausgewählte angekommen") ->label('Ausgewählte angekommen')
->accessSelectedRecords() ->accessSelectedRecords()
->action(function (Collection $selectedRecords) { ->action(function (Collection $selectedRecords) {
$orderstatusAngekommen = Orderstatus::where("name", "angekommen")->first(); $orderstatusAngekommen = Orderstatus::where('name', 'angekommen')->first();
$selectedRecords->each( $selectedRecords->each(
fn (Model $selectedRecord) => $selectedRecord->update([ fn (Model $selectedRecord) => $selectedRecord->update([
'orderstatus_id' => $orderstatusAngekommen->id 'orderstatus_id' => $orderstatusAngekommen->id,
]), ]),
); );
})->requiresConfirmation()->icon(Heroicon::BuildingOffice), })->requiresConfirmation()->icon(Heroicon::BuildingOffice),

View File

@ -2,9 +2,7 @@
namespace App\Filament\Resources\Users\Schemas; namespace App\Filament\Resources\Users\Schemas;
use App\Filament\Resources\Groups\GroupResource;
use App\Filament\Resources\Groups\Schemas\GroupForm; use App\Filament\Resources\Groups\Schemas\GroupForm;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Components\DateTimePicker; use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\Select; use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
@ -36,7 +34,7 @@ class UserForm
->relationship('groups', 'name') ->relationship('groups', 'name')
->label('Gruppen') ->label('Gruppen')
->preload() ->preload()
->createOptionForm(function(Schema $schema) { ->createOptionForm(function (Schema $schema) {
return GroupForm::configure($schema); return GroupForm::configure($schema);
}) })
->multiple(), ->multiple(),

View File

@ -24,10 +24,10 @@ class UsersTable
->dateTime() ->dateTime()
->sortable(), ->sortable(),
TextColumn::make('roles.title') TextColumn::make('roles.title')
->label("Rollen") ->label('Rollen')
->toggleable(), ->toggleable(),
TextColumn::make('groups.name') TextColumn::make('groups.name')
->label("Gruppen") ->label('Gruppen')
->toggleable(), ->toggleable(),
TextColumn::make('created_at') TextColumn::make('created_at')
->dateTime() ->dateTime()

View File

@ -15,19 +15,22 @@ use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon; use Filament\Support\Icons\Heroicon;
use Filament\Tables\Table; use Filament\Tables\Table;
use UnitEnum; use UnitEnum;
use Override;
class UserResource extends Resource class UserResource extends Resource
{ {
protected static ?string $model = User::class; protected static ?string $model = User::class;
protected static string|BackedEnum|null $navigationIcon = Heroicon::User; protected static string|BackedEnum|null $navigationIcon = Heroicon::User;
protected static string | UnitEnum | null $navigationGroup = 'Verwaltung';
protected static ?string $navigationLabel = "Benutzer"; protected static string|UnitEnum|null $navigationGroup = 'Verwaltung';
protected static ?string $pluralLabel = "Benutzer";
protected static ?string $pluralModelLabel = "Benutzer"; protected static ?string $navigationLabel = 'Benutzer';
protected static ?string $modelLabel = "Benutzer";
protected static ?string $pluralLabel = 'Benutzer';
protected static ?string $pluralModelLabel = 'Benutzer';
protected static ?string $modelLabel = 'Benutzer';
public static function form(Schema $schema): Schema public static function form(Schema $schema): Schema
{ {

View File

@ -11,21 +11,26 @@ class OrderController extends Controller
public function ordered($uuid) public function ordered($uuid)
{ {
$order = Order::where('public_uuid', $uuid)->firstOrFail(); $order = Order::where('public_uuid', $uuid)->firstOrFail();
$orderstatus = Orderstatus::where("name", "bestellt")->firstOrFail(); $orderstatus = Orderstatus::where('name', 'bestellt')->firstOrFail();
if($order->orderstatus_id >= $orderstatus->id) return redirect(OrderResource::getUrl('edit', ['record' => $order->id])); if ($order->orderstatus_id >= $orderstatus->id) {
return redirect(OrderResource::getUrl('edit', ['record' => $order->id]));
}
$order->orderstatus_id = $orderstatus->id; $order->orderstatus_id = $orderstatus->id;
$order->save(); $order->save();
return view('OrderOrdered', ['url' => OrderResource::getUrl('edit', ['record' => $order->id,])]);
return view('OrderOrdered', ['url' => OrderResource::getUrl('edit', ['record' => $order->id])]);
} }
public function taken($uuid) public function taken($uuid)
{ {
$order = Order::where('public_uuid', $uuid)->firstOrFail(); $order = Order::where('public_uuid', $uuid)->firstOrFail();
$orderstatus = Orderstatus::where("name", "genommen")->firstOrFail(); $orderstatus = Orderstatus::where('name', 'genommen')->firstOrFail();
if($order->orderstatus_id >= $orderstatus->id) return redirect(OrderResource::getUrl('edit', ['record' => $order->id])); if ($order->orderstatus_id >= $orderstatus->id) {
return redirect(OrderResource::getUrl('edit', ['record' => $order->id]));
}
$order->orderstatus_id = $orderstatus->id; $order->orderstatus_id = $orderstatus->id;
$order->save(); $order->save();
return view('OrderTaken', ['url' => OrderResource::getUrl('edit', ['record' => $order->id,])]);
return view('OrderTaken', ['url' => OrderResource::getUrl('edit', ['record' => $order->id])]);
} }
} }

View File

@ -6,6 +6,7 @@ use App\Filament\Resources\Orders\OrderResource;
use App\Models\Order; use App\Models\Order;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable; use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Attachment;
use Illuminate\Mail\Mailables\Content; use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope; use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
@ -20,8 +21,7 @@ class OrderArrived extends Mailable
*/ */
public function __construct( public function __construct(
public Order $order, public Order $order,
) ) {
{
// //
} }
@ -53,7 +53,7 @@ class OrderArrived extends Mailable
/** /**
* Get the attachments for the message. * Get the attachments for the message.
* *
* @return array<int, \Illuminate\Mail\Mailables\Attachment> * @return array<int, Attachment>
*/ */
public function attachments(): array public function attachments(): array
{ {

View File

@ -6,6 +6,7 @@ use App\Filament\Resources\Orders\OrderResource;
use App\Models\Order; use App\Models\Order;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable; use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Attachment;
use Illuminate\Mail\Mailables\Content; use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope; use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
@ -20,8 +21,7 @@ class OrderRegistered extends Mailable
*/ */
public function __construct( public function __construct(
public Order $order, public Order $order,
) ) {
{
// //
} }
@ -53,7 +53,7 @@ class OrderRegistered extends Mailable
/** /**
* Get the attachments for the message. * Get the attachments for the message.
* *
* @return array<int, \Illuminate\Mail\Mailables\Attachment> * @return array<int, Attachment>
*/ */
public function attachments(): array public function attachments(): array
{ {

View File

@ -7,11 +7,10 @@ use Illuminate\Database\Eloquent\Relations\BelongsToMany;
class Belt extends Model class Belt extends Model
{ {
protected $fillable = ["name"]; protected $fillable = ['name'];
public function courses(): BelongsToMany public function courses(): BelongsToMany
{ {
return $this->belongsToMany(Course::class); return $this->belongsToMany(Course::class);
} }
} }

View File

@ -2,22 +2,20 @@
namespace App\Models; namespace App\Models;
use App\Models\Kid;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\BelongsToMany;
class Course extends Model class Course extends Model
{ {
protected $fillable = ["name", "duration"]; protected $fillable = ['name', 'duration'];
public function kids(): BelongsToMany public function kids(): BelongsToMany
{ {
return $this->belongsToMany(Kid::class)->withPivot("date"); return $this->belongsToMany(Kid::class)->withPivot('date');
} }
public function belts(): BelongsToMany public function belts(): BelongsToMany
{ {
return $this->belongsToMany(Belt::class); return $this->belongsToMany(Belt::class);
} }
} }

View File

@ -13,5 +13,4 @@ class Group extends Model
{ {
return $this->belongsToMany(User::class); return $this->belongsToMany(User::class);
} }
} }

View File

@ -7,10 +7,10 @@ use Illuminate\Database\Eloquent\Relations\BelongsToMany;
class Kid extends Model class Kid extends Model
{ {
protected $fillable = ["name", "email"]; protected $fillable = ['name', 'email'];
public function courses(): BelongsToMany public function courses(): BelongsToMany
{ {
return $this->belongsToMany(Course::class)->withPivot("date"); return $this->belongsToMany(Course::class)->withPivot('date');
} }
} }

View File

@ -6,21 +6,19 @@ use App\Observers\OrderObserver;
use Illuminate\Database\Eloquent\Attributes\ObservedBy; use Illuminate\Database\Eloquent\Attributes\ObservedBy;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use App\Models\Orderstatus;
#[ObservedBy([OrderObserver::class])] #[ObservedBy([OrderObserver::class])]
class Order extends Model class Order extends Model
{ {
protected $fillable = ["name", "url", "count", "orderstatus_id", "orderdatetime", "user_id"]; protected $fillable = ['name', 'url', 'count', 'orderstatus_id', 'orderdatetime', 'user_id'];
public function user(): BelongsTo public function user(): BelongsTo
{ {
return $this->belongsTo(User::class); return $this->belongsTo(User::class);
} }
public function orderstatus(): BelongsTo public function orderstatus(): BelongsTo
{ {
return $this->belongsTo(Orderstatus::class); return $this->belongsTo(Orderstatus::class);
} }
}
}

View File

@ -13,5 +13,4 @@ class Role extends Model
{ {
return $this->belongsToMany(User::class); return $this->belongsToMany(User::class);
} }
} }

View File

@ -4,9 +4,9 @@ namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail; // use Illuminate\Contracts\Auth\MustVerifyEmail;
use Database\Factories\UserFactory;
use Filament\Models\Contracts\FilamentUser; use Filament\Models\Contracts\FilamentUser;
use Filament\Panel; use Filament\Panel;
use Database\Factories\UserFactory;
use Illuminate\Database\Eloquent\Attributes\Fillable; use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Attributes\Hidden; use Illuminate\Database\Eloquent\Attributes\Hidden;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;

View File

@ -19,7 +19,7 @@ class OrderObserver
{ {
$order->public_uuid = (string) Str::uuid(); $order->public_uuid = (string) Str::uuid();
$order->save(); $order->save();
$users = Role::where("name", "ordermanager")->users()->get(); $users = Role::where('name', 'ordermanager')->users()->get();
foreach ($users as $user) { foreach ($users as $user) {
Mail::to($user)->send(new OrderRegistered($order)); Mail::to($user)->send(new OrderRegistered($order));
} }
@ -31,12 +31,12 @@ class OrderObserver
public function updated(Order $order): void public function updated(Order $order): void
{ {
$hasChanged = $order->getChanges(); $hasChanged = $order->getChanges();
if($hasChanged && isset($hasChanged['orderstatus_id'])) { if ($hasChanged && isset($hasChanged['orderstatus_id'])) {
if($order->orderstatus->name == "bestellt") { if ($order->orderstatus->name == 'bestellt') {
$order->orderdatetime = $order->updated_at; $order->orderdatetime = $order->updated_at;
$order->saveQuietly(); $order->saveQuietly();
} }
if($order->orderstatus->name == "angekommen") { if ($order->orderstatus->name == 'angekommen') {
$user = User::find($order->user_id); $user = User::find($order->user_id);
Mail::to($user)->send(new OrderArrived($order)); Mail::to($user)->send(new OrderArrived($order));
} }

View File

@ -10,7 +10,6 @@ use Filament\Pages\Dashboard;
use Filament\Panel; use Filament\Panel;
use Filament\PanelProvider; use Filament\PanelProvider;
use Filament\Support\Colors\Color; use Filament\Support\Colors\Color;
use Filament\Support\Enums\Width;
use Filament\Widgets\AccountWidget; use Filament\Widgets\AccountWidget;
use Filament\Widgets\FilamentInfoWidget; use Filament\Widgets\FilamentInfoWidget;
use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse; use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;

View File

@ -1,7 +1,7 @@
<?php <?php
use App\Models\User;
use App\Models\Orderstatus; use App\Models\Orderstatus;
use App\Models\User;
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
@ -16,11 +16,11 @@ return new class extends Migration
Schema::create('orders', function (Blueprint $table) { Schema::create('orders', function (Blueprint $table) {
$table->id(); $table->id();
$table->timestamps(); $table->timestamps();
$table->string("name"); $table->string('name');
$table->string("url")->nullable(); $table->string('url')->nullable();
$table->integer("count")->nullable(); $table->integer('count')->nullable();
$table->foreignidfor(Orderstatus::class)->default(1); $table->foreignidfor(Orderstatus::class)->default(1);
$table->datetime("orderdatetime")->nullable(); $table->datetime('orderdatetime')->nullable();
$table->foreignIdFor(User::class); $table->foreignIdFor(User::class);
}); });
} }

View File

@ -14,7 +14,7 @@ return new class extends Migration
Schema::create('orderstatuses', function (Blueprint $table) { Schema::create('orderstatuses', function (Blueprint $table) {
$table->id(); $table->id();
$table->timestamps(); $table->timestamps();
$table->string("name"); $table->string('name');
}); });
} }

View File

@ -12,7 +12,7 @@ return new class extends Migration
public function up(): void public function up(): void
{ {
Schema::table('users', function (Blueprint $table) { Schema::table('users', function (Blueprint $table) {
$table->boolean("ordermanager")->default(false); $table->boolean('ordermanager')->default(false);
}); });
} }

View File

@ -14,8 +14,8 @@ return new class extends Migration
Schema::create('kids', function (Blueprint $table) { Schema::create('kids', function (Blueprint $table) {
$table->id(); $table->id();
$table->timestamps(); $table->timestamps();
$table->string("name"); $table->string('name');
$table->string("email")->nullable(); $table->string('email')->nullable();
}); });
} }

View File

@ -14,8 +14,8 @@ return new class extends Migration
Schema::create('courses', function (Blueprint $table) { Schema::create('courses', function (Blueprint $table) {
$table->id(); $table->id();
$table->timestamps(); $table->timestamps();
$table->string("name"); $table->string('name');
$table->integer("duration"); $table->integer('duration');
}); });
} }

View File

@ -18,7 +18,7 @@ return new class extends Migration
$table->timestamps(); $table->timestamps();
$table->foreignIdFor(Kid::class); $table->foreignIdFor(Kid::class);
$table->foreignIdFor(Course::class); $table->foreignIdFor(Course::class);
$table->date("date")->nullable(); $table->date('date')->nullable();
}); });
} }

View File

@ -14,7 +14,7 @@ return new class extends Migration
Schema::create('belts', function (Blueprint $table) { Schema::create('belts', function (Blueprint $table) {
$table->id(); $table->id();
$table->timestamps(); $table->timestamps();
$table->string("name"); $table->string('name');
}); });
} }

View File

@ -13,10 +13,12 @@ return new class extends Migration
*/ */
public function up(): void public function up(): void
{ {
$ordermanager = Role::firstOrCreate(["name" => "ordermanager", 'title' => 'Ordermanager', 'description' => 'Verwaltet Bestellungen'])->save(); $ordermanager = Role::firstOrCreate(['name' => 'ordermanager', 'title' => 'Ordermanager', 'description' => 'Verwaltet Bestellungen'])->save();
$users = User::all(); $users = User::all();
foreach($users as $user) { foreach ($users as $user) {
if($user->ordermanager) $user->roles()->attach($ordermanager); if ($user->ordermanager) {
$user->roles()->attach($ordermanager);
}
} }
Schema::table('users', function (Blueprint $table) { Schema::table('users', function (Blueprint $table) {
$table->dropColumn('ordermanager'); $table->dropColumn('ordermanager');
@ -30,11 +32,11 @@ return new class extends Migration
public function down(): void public function down(): void
{ {
Schema::table('users', function (Blueprint $table) { Schema::table('users', function (Blueprint $table) {
$table->boolean("ordermanager")->default(false); $table->boolean('ordermanager')->default(false);
}); });
$users = User::all(); $users = User::all();
foreach($users as $user) { foreach ($users as $user) {
if($user->hasRole("ordermanager")) { if ($user->hasRole('ordermanager')) {
$user->ordermanager = 1; $user->ordermanager = 1;
$user->save(); $user->save();
} }