From 277801275ef4b197b6f3828bf3d55b2d0876fd43 Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Mon, 31 Jul 2023 19:09:51 +0100 Subject: [PATCH] tidy up --- .../Resources/Blog/AuthorResource.php | 2 ++ .../Resources/Blog/CategoryResource.php | 6 +++-- app/Filament/Resources/Blog/PostResource.php | 18 +++++---------- .../CommentsRelationManager.php | 23 ++++++++++++++++++- app/Filament/Resources/Shop/BrandResource.php | 3 ++- .../Resources/Shop/CategoryResource.php | 3 ++- .../Resources/Shop/CustomerResource.php | 2 ++ .../PaymentsRelationManager.php | 6 +++-- app/Filament/Resources/Shop/OrderResource.php | 15 ++++++++---- .../Shop/OrderResource/Pages/ListOrders.php | 3 +++ .../PaymentsRelationManager.php | 6 +++-- .../Shop/OrderResource/Widgets/OrderStats.php | 15 +++++++++--- .../Resources/Shop/ProductResource.php | 23 ++++++++++++++----- .../ProductResource/Pages/ListProducts.php | 3 +++ .../CommentsRelationManager.php | 22 +++++++++++++++++- .../ProductResource/Widgets/ProductStats.php | 18 ++++++++++++--- app/Filament/Widgets/CustomersChart.php | 9 +++++++- app/Filament/Widgets/OrdersChart.php | 12 +++++++--- 18 files changed, 146 insertions(+), 43 deletions(-) diff --git a/app/Filament/Resources/Blog/AuthorResource.php b/app/Filament/Resources/Blog/AuthorResource.php index f4ed0e794..73aba20de 100644 --- a/app/Filament/Resources/Blog/AuthorResource.php +++ b/app/Filament/Resources/Blog/AuthorResource.php @@ -33,6 +33,7 @@ public static function form(Form $form): Form ->required(), Forms\Components\TextInput::make('email') + ->label('Email address') ->required() ->email() ->unique(Author::class, 'email', ignoreRecord: true), @@ -61,6 +62,7 @@ public static function table(Table $table): Table ->alignLeft(), Tables\Columns\TextColumn::make('email') + ->label('Email address') ->searchable() ->sortable() ->color('gray') diff --git a/app/Filament/Resources/Blog/CategoryResource.php b/app/Filament/Resources/Blog/CategoryResource.php index e8034115f..03fc2342d 100644 --- a/app/Filament/Resources/Blog/CategoryResource.php +++ b/app/Filament/Resources/Blog/CategoryResource.php @@ -64,8 +64,9 @@ public static function table(Table $table): Table Tables\Columns\TextColumn::make('slug') ->searchable() ->sortable(), - Tables\Columns\BooleanColumn::make('is_visible') - ->label('Visibility'), + Tables\Columns\IconColumn::make('is_visible') + ->label('Visibility') + ->boolean(), Tables\Columns\TextColumn::make('updated_at') ->label('Last Updated') ->date(), @@ -97,6 +98,7 @@ public static function infolist(Infolist $infolist): Infolist TextEntry::make('slug'), TextEntry::make('description'), IconEntry::make('is_visible') + ->label('Visibility') ->boolean(), TextEntry::make('updated_at') ->dateTime(), diff --git a/app/Filament/Resources/Blog/PostResource.php b/app/Filament/Resources/Blog/PostResource.php index 250eb5de9..5dfd4e755 100644 --- a/app/Filament/Resources/Blog/PostResource.php +++ b/app/Filament/Resources/Blog/PostResource.php @@ -12,6 +12,7 @@ use Filament\Infolists\Infolist; use Filament\Notifications\Notification; use Filament\Resources\Resource; +use Filament\Support\Colors\Color; use Filament\Tables; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; @@ -141,7 +142,8 @@ public static function table(Table $table): Table Tables\Columns\TextColumn::make('comments.customer.name') ->label('Comment Authors') - ->listWithLineBreaks(), + ->listWithLineBreaks() + ->limitList(2), ]) ->filters([ Tables\Filters\Filter::make('published_at') @@ -154,11 +156,11 @@ public static function table(Table $table): Table ->query(function (Builder $query, array $data): Builder { return $query ->when( - $data['published_from'], + $data['published_from'] ?? null, fn (Builder $query, $date): Builder => $query->whereDate('published_at', '>=', $date), ) ->when( - $data['published_until'], + $data['published_until'] ?? null, fn (Builder $query, $date): Builder => $query->whereDate('published_at', '<=', $date), ); }) @@ -206,10 +208,7 @@ public static function infolist(Infolist $infolist): Infolist Components\TextEntry::make('published_at') ->badge() ->date() - ->color('danger'), - Components\IconEntry::make('test') - ->boolean() - ->getStateUsing(fn () => rand(0, 1)), + ->color('success'), ]), Components\Group::make([ Components\TextEntry::make('author.name'), @@ -232,11 +231,6 @@ public static function infolist(Infolist $infolist): Infolist ->hiddenLabel(), ]) ->collapsible(), - Components\RepeatableEntry::make('comments') - ->schema([ - Components\TextEntry::make('title'), - Components\TextEntry::make('customer.name'), - ]), ]); } diff --git a/app/Filament/Resources/Blog/PostResource/RelationManagers/CommentsRelationManager.php b/app/Filament/Resources/Blog/PostResource/RelationManagers/CommentsRelationManager.php index 6cf119e00..4407bfdc2 100644 --- a/app/Filament/Resources/Blog/PostResource/RelationManagers/CommentsRelationManager.php +++ b/app/Filament/Resources/Blog/PostResource/RelationManagers/CommentsRelationManager.php @@ -2,8 +2,12 @@ namespace App\Filament\Resources\Blog\PostResource\RelationManagers; +use Filament\Actions\ViewAction; use Filament\Forms; use Filament\Forms\Form; +use Filament\Infolists\Components\IconEntry; +use Filament\Infolists\Components\TextEntry; +use Filament\Infolists\Infolist; use Filament\Resources\RelationManagers\RelationManager; use Filament\Tables; use Filament\Tables\Table; @@ -37,6 +41,21 @@ public function form(Form $form): Form ->columns(1); } + public function infolist(Infolist $infolist): Infolist + { + return $infolist + ->columns(1) + ->schema([ + TextEntry::make('title'), + TextEntry::make('customer.name'), + IconEntry::make('is_visible') + ->label('Visibility') + ->boolean(), + TextEntry::make('content') + ->markdown(), + ]); + } + public function table(Table $table): Table { return $table @@ -51,8 +70,9 @@ public function table(Table $table): Table ->searchable() ->sortable(), - Tables\Columns\BooleanColumn::make('is_visible') + Tables\Columns\IconColumn::make('is_visible') ->label('Visibility') + ->boolean() ->sortable(), ]) ->filters([ @@ -62,6 +82,7 @@ public function table(Table $table): Table Tables\Actions\CreateAction::make(), ]) ->actions([ + Tables\Actions\ViewAction::make(), Tables\Actions\EditAction::make(), Tables\Actions\DeleteAction::make(), ]) diff --git a/app/Filament/Resources/Shop/BrandResource.php b/app/Filament/Resources/Shop/BrandResource.php index d75fd8ccf..2fd9c4538 100644 --- a/app/Filament/Resources/Shop/BrandResource.php +++ b/app/Filament/Resources/Shop/BrandResource.php @@ -86,8 +86,9 @@ public static function table(Table $table): Table ->label('Website') ->searchable() ->sortable(), - Tables\Columns\BooleanColumn::make('is_visible') + Tables\Columns\IconColumn::make('is_visible') ->label('Visibility') + ->boolean() ->sortable(), Tables\Columns\TextColumn::make('updated_at') ->label('Updated Date') diff --git a/app/Filament/Resources/Shop/CategoryResource.php b/app/Filament/Resources/Shop/CategoryResource.php index f0a7eaa44..5e10180fa 100644 --- a/app/Filament/Resources/Shop/CategoryResource.php +++ b/app/Filament/Resources/Shop/CategoryResource.php @@ -91,8 +91,9 @@ public static function table(Table $table): Table ->label('Parent') ->searchable() ->sortable(), - Tables\Columns\BooleanColumn::make('is_visible') + Tables\Columns\IconColumn::make('is_visible') ->label('Visibility') + ->boolean() ->sortable(), Tables\Columns\TextColumn::make('updated_at') ->label('Updated Date') diff --git a/app/Filament/Resources/Shop/CustomerResource.php b/app/Filament/Resources/Shop/CustomerResource.php index bb6be6e13..7fcfe269b 100644 --- a/app/Filament/Resources/Shop/CustomerResource.php +++ b/app/Filament/Resources/Shop/CustomerResource.php @@ -40,6 +40,7 @@ public static function form(Form $form): Form ->required(), Forms\Components\TextInput::make('email') + ->label('Email address') ->required() ->email() ->unique(ignoreRecord: true), @@ -77,6 +78,7 @@ public static function table(Table $table): Table ->searchable(isIndividual: true) ->sortable(), Tables\Columns\TextColumn::make('email') + ->label('Email address') ->searchable(isIndividual: true, isGlobal: false) ->sortable(), Tables\Columns\TextColumn::make('country') diff --git a/app/Filament/Resources/Shop/CustomerResource/RelationManagers/PaymentsRelationManager.php b/app/Filament/Resources/Shop/CustomerResource/RelationManagers/PaymentsRelationManager.php index f0789f63f..81ce693f5 100644 --- a/app/Filament/Resources/Shop/CustomerResource/RelationManagers/PaymentsRelationManager.php +++ b/app/Filament/Resources/Shop/CustomerResource/RelationManagers/PaymentsRelationManager.php @@ -52,7 +52,8 @@ public function form(Form $form): Form 'stripe' => 'Stripe', 'paypal' => 'PayPal', ]) - ->required(), + ->required() + ->native(false), Forms\Components\Select::make('method') ->options([ @@ -60,7 +61,8 @@ public function form(Form $form): Form 'bank_transfer' => 'Bank transfer', 'paypal' => 'PayPal', ]) - ->required(), + ->required() + ->native(false), ]); } diff --git a/app/Filament/Resources/Shop/OrderResource.php b/app/Filament/Resources/Shop/OrderResource.php index cfc4b04b8..cd922537a 100644 --- a/app/Filament/Resources/Shop/OrderResource.php +++ b/app/Filament/Resources/Shop/OrderResource.php @@ -121,11 +121,11 @@ public static function table(Table $table): Table ->query(function (Builder $query, array $data): Builder { return $query ->when( - $data['created_from'], + $data['created_from'] ?? null, fn (Builder $query, $date): Builder => $query->whereDate('created_at', '>=', $date), ) ->when( - $data['created_until'], + $data['created_until'] ?? null, fn (Builder $query, $date): Builder => $query->whereDate('created_at', '<=', $date), ); }) @@ -228,9 +228,11 @@ public static function getFormSchema(string $section = null): array ->afterStateUpdated(fn ($state, callable $set) => $set('unit_price', Product::find($state)?->price ?? 0)) ->columnSpan([ 'md' => 5, - ]), + ]) + ->searchable(), Forms\Components\TextInput::make('qty') + ->label('Quantity') ->numeric() ->default(1) ->columnSpan([ @@ -274,6 +276,7 @@ public static function getFormSchema(string $section = null): array ->required(), Forms\Components\TextInput::make('email') + ->label('Email address') ->required() ->email() ->unique(), @@ -286,7 +289,8 @@ public static function getFormSchema(string $section = null): array 'male' => 'Male', 'female' => 'Female', ]) - ->required(), + ->required() + ->native(false), ]) ->createOptionAction(function (Forms\Components\Actions\Action $action) { return $action @@ -303,7 +307,8 @@ public static function getFormSchema(string $section = null): array 'delivered' => 'Delivered', 'cancelled' => 'Cancelled', ]) - ->required(), + ->required() + ->native(false), Forms\Components\Select::make('currency') ->searchable() diff --git a/app/Filament/Resources/Shop/OrderResource/Pages/ListOrders.php b/app/Filament/Resources/Shop/OrderResource/Pages/ListOrders.php index eff9740de..676d5ef72 100644 --- a/app/Filament/Resources/Shop/OrderResource/Pages/ListOrders.php +++ b/app/Filament/Resources/Shop/OrderResource/Pages/ListOrders.php @@ -4,10 +4,13 @@ use App\Filament\Resources\Shop\OrderResource; use Filament\Pages\Actions; +use Filament\Pages\Concerns\ExposesTableToWidgets; use Filament\Resources\Pages\ListRecords; class ListOrders extends ListRecords { + use ExposesTableToWidgets; + protected static string $resource = OrderResource::class; protected function getActions(): array diff --git a/app/Filament/Resources/Shop/OrderResource/RelationManagers/PaymentsRelationManager.php b/app/Filament/Resources/Shop/OrderResource/RelationManagers/PaymentsRelationManager.php index b24f2df2d..891b51eb4 100644 --- a/app/Filament/Resources/Shop/OrderResource/RelationManagers/PaymentsRelationManager.php +++ b/app/Filament/Resources/Shop/OrderResource/RelationManagers/PaymentsRelationManager.php @@ -39,7 +39,8 @@ public function form(Form $form): Form 'stripe' => 'Stripe', 'paypal' => 'PayPal', ]) - ->required(), + ->required() + ->native(false), Forms\Components\Select::make('method') ->options([ @@ -47,7 +48,8 @@ public function form(Form $form): Form 'bank_transfer' => 'Bank transfer', 'paypal' => 'PayPal', ]) - ->required(), + ->required() + ->native(false), ]); } diff --git a/app/Filament/Resources/Shop/OrderResource/Widgets/OrderStats.php b/app/Filament/Resources/Shop/OrderResource/Widgets/OrderStats.php index 33d2e8b88..323866185 100644 --- a/app/Filament/Resources/Shop/OrderResource/Widgets/OrderStats.php +++ b/app/Filament/Resources/Shop/OrderResource/Widgets/OrderStats.php @@ -2,7 +2,9 @@ namespace App\Filament\Resources\Shop\OrderResource\Widgets; +use App\Filament\Resources\Shop\OrderResource\Pages\ListOrders; use App\Models\Shop\Order; +use Filament\Widgets\Concerns\InteractsWithPageTable; use Filament\Widgets\StatsOverviewWidget as BaseWidget; use Filament\Widgets\StatsOverviewWidget\Card; use Flowframe\Trend\Trend; @@ -10,8 +12,15 @@ class OrderStats extends BaseWidget { + use InteractsWithPageTable; + protected static ?string $pollingInterval = null; + protected function getTablePage(): string + { + return ListOrders::class; + } + protected function getCards(): array { $orderData = Trend::model(Order::class) @@ -23,14 +32,14 @@ protected function getCards(): array ->count(); return [ - Card::make('Orders', Order::count()) + Card::make('Orders', $this->getPageTableQuery()->count()) ->chart( $orderData ->map(fn (TrendValue $value) => $value->aggregate) ->toArray() ), - Card::make('Open orders', Order::whereIn('status', ['open', 'processing'])->count()), - Card::make('Average price', number_format(Order::avg('total_price'), 2)), + Card::make('Open orders', $this->getPageTableQuery()->whereIn('status', ['open', 'processing'])->count()), + Card::make('Average price', number_format($this->getPageTableQuery()->avg('total_price'), 2)), ]; } } diff --git a/app/Filament/Resources/Shop/ProductResource.php b/app/Filament/Resources/Shop/ProductResource.php index 540a00251..32d962f85 100644 --- a/app/Filament/Resources/Shop/ProductResource.php +++ b/app/Filament/Resources/Shop/ProductResource.php @@ -149,8 +149,9 @@ public static function form(Form $form): Form ->searchable() ->hiddenOn(ProductsRelationManager::class), - Forms\Components\MultiSelect::make('categories') + Forms\Components\Select::make('categories') ->relationship('categories', 'name') + ->multiple() ->required(), ]), ]) @@ -177,17 +178,25 @@ public static function table(Table $table): Table ->sortable() ->toggleable(), + Tables\Columns\IconColumn::make('is_visible') + ->label('Visibility') + ->boolean() + ->sortable() + ->toggleable(), + Tables\Columns\TextColumn::make('price') ->label('Price') ->searchable() ->sortable(), Tables\Columns\TextColumn::make('sku') + ->label('SKU') ->searchable() ->sortable() ->toggleable(), Tables\Columns\TextColumn::make('qty') + ->label('Quantity') ->searchable() ->sortable() ->toggleable(), @@ -198,11 +207,6 @@ public static function table(Table $table): Table ->toggleable() ->toggledHiddenByDefault(), - Tables\Columns\BooleanColumn::make('is_visible') - ->label('Visibility') - ->sortable() - ->toggleable(), - Tables\Columns\TextColumn::make('published_at') ->label('Publish Date') ->date() @@ -216,6 +220,13 @@ public static function table(Table $table): Table ->preload() ->multiple() ->searchable(), + + Tables\Filters\TernaryFilter::make('is_visible') + ->label('Visibility') + ->boolean() + ->trueLabel('Only visible') + ->falseLabel('Only hidden') + ->native(false), ]) ->actions([ Tables\Actions\EditAction::make(), diff --git a/app/Filament/Resources/Shop/ProductResource/Pages/ListProducts.php b/app/Filament/Resources/Shop/ProductResource/Pages/ListProducts.php index bca3ff37d..b52bb2a60 100644 --- a/app/Filament/Resources/Shop/ProductResource/Pages/ListProducts.php +++ b/app/Filament/Resources/Shop/ProductResource/Pages/ListProducts.php @@ -4,10 +4,13 @@ use App\Filament\Resources\Shop\ProductResource; use Filament\Pages\Actions; +use Filament\Pages\Concerns\ExposesTableToWidgets; use Filament\Resources\Pages\ListRecords; class ListProducts extends ListRecords { + use ExposesTableToWidgets; + protected static string $resource = ProductResource::class; protected function getActions(): array diff --git a/app/Filament/Resources/Shop/ProductResource/RelationManagers/CommentsRelationManager.php b/app/Filament/Resources/Shop/ProductResource/RelationManagers/CommentsRelationManager.php index f031f423b..701c459ab 100644 --- a/app/Filament/Resources/Shop/ProductResource/RelationManagers/CommentsRelationManager.php +++ b/app/Filament/Resources/Shop/ProductResource/RelationManagers/CommentsRelationManager.php @@ -4,6 +4,9 @@ use Filament\Forms; use Filament\Forms\Form; +use Filament\Infolists\Components\IconEntry; +use Filament\Infolists\Components\TextEntry; +use Filament\Infolists\Infolist; use Filament\Notifications\Notification; use Filament\Resources\RelationManagers\RelationManager; use Filament\Tables; @@ -38,6 +41,21 @@ public function form(Form $form): Form ]); } + public function infolist(Infolist $infolist): Infolist + { + return $infolist + ->columns(1) + ->schema([ + TextEntry::make('title'), + TextEntry::make('customer.name'), + IconEntry::make('is_visible') + ->label('Visibility') + ->boolean(), + TextEntry::make('content') + ->markdown(), + ]); + } + public function table(Table $table): Table { return $table @@ -52,8 +70,9 @@ public function table(Table $table): Table ->searchable() ->sortable(), - Tables\Columns\BooleanColumn::make('is_visible') + Tables\Columns\IconColumn::make('is_visible') ->label('Visibility') + ->boolean() ->sortable(), ]) ->filters([ @@ -70,6 +89,7 @@ public function table(Table $table): Table }), ]) ->actions([ + Tables\Actions\ViewAction::make(), Tables\Actions\EditAction::make(), Tables\Actions\DeleteAction::make(), ]) diff --git a/app/Filament/Resources/Shop/ProductResource/Widgets/ProductStats.php b/app/Filament/Resources/Shop/ProductResource/Widgets/ProductStats.php index ffb94a20c..eaddd9535 100644 --- a/app/Filament/Resources/Shop/ProductResource/Widgets/ProductStats.php +++ b/app/Filament/Resources/Shop/ProductResource/Widgets/ProductStats.php @@ -2,18 +2,30 @@ namespace App\Filament\Resources\Shop\ProductResource\Widgets; +use App\Filament\Resources\Blog\PostResource\Pages\ListPosts; +use App\Filament\Resources\Shop\ProductResource\Pages\ListProducts; use App\Models\Shop\Product; +use Filament\Widgets\Concerns\InteractsWithPageTable; use Filament\Widgets\StatsOverviewWidget as BaseWidget; use Filament\Widgets\StatsOverviewWidget\Card; class ProductStats extends BaseWidget { + use InteractsWithPageTable; + + protected static ?string $pollingInterval = null; + + protected function getTablePage(): string + { + return ListProducts::class; + } + protected function getCards(): array { return [ - Card::make('Total Products', Product::count()), - Card::make('Product Inventory', Product::sum('qty')), - Card::make('Average price', number_format(Product::avg('price'), 2)), + Card::make('Total Products', $this->getPageTableQuery()->count()), + Card::make('Product Inventory', $this->getPageTableQuery()->sum('qty')), + Card::make('Average price', number_format($this->getPageTableQuery()->avg('price'), 2)), ]; } } diff --git a/app/Filament/Widgets/CustomersChart.php b/app/Filament/Widgets/CustomersChart.php index e4dcb8952..3583660e5 100644 --- a/app/Filament/Widgets/CustomersChart.php +++ b/app/Filament/Widgets/CustomersChart.php @@ -2,14 +2,20 @@ namespace App\Filament\Widgets; +use Filament\Widgets\ChartWidget; use Filament\Widgets\LineChartWidget; -class CustomersChart extends LineChartWidget +class CustomersChart extends ChartWidget { protected static ?string $heading = 'Total customers'; protected static ?int $sort = 2; + protected function getType(): string + { + return 'line'; + } + protected function getData(): array { return [ @@ -17,6 +23,7 @@ protected function getData(): array [ 'label' => 'Customers', 'data' => [4344, 5676, 6798, 7890, 8987, 9388, 10343, 10524, 13664, 14345, 15753], + 'fill' => 'start', ], ], 'labels' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], diff --git a/app/Filament/Widgets/OrdersChart.php b/app/Filament/Widgets/OrdersChart.php index 6f3a353dc..4cbc277f7 100644 --- a/app/Filament/Widgets/OrdersChart.php +++ b/app/Filament/Widgets/OrdersChart.php @@ -2,21 +2,27 @@ namespace App\Filament\Widgets; -use Filament\Widgets\LineChartWidget; +use Filament\Widgets\ChartWidget; -class OrdersChart extends LineChartWidget +class OrdersChart extends ChartWidget { protected static ?string $heading = 'Orders per month'; protected static ?int $sort = 1; + protected function getType(): string + { + return 'line'; + } + protected function getData(): array { return [ 'datasets' => [ [ 'label' => 'Orders', - 'data' => [2433, 3454, 4566, 2342, 5545, 5765, 6787, 8767, 7565, 8576, 9686, 8996], + 'data' => [2433, 3454, 4566, 3300, 5545, 5765, 6787, 8767, 7565, 8576, 9686, 8996], + 'fill' => 'start', ], ], 'labels' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],