diff --git a/composer.json b/composer.json index 0e69457..1afb163 100644 --- a/composer.json +++ b/composer.json @@ -10,15 +10,15 @@ }, "require": { "php": "^8.5", - "lunarphp/lunar": "1.3.0", + "lunarphp/lunar": "1.5.0", "laravel/framework": "^12.0", "laravel/tinker": "^3.0", "symfony/yaml": "^7.0", - "lunarphp/table-rate-shipping": "^1.3", + "lunarphp/table-rate-shipping": "1.5.0", "lunarphp/search": "*", "lunarphp/meilisearch": "*", "spatie/laravel-translation-loader": "^2.8", - "lunarphp/stripe": "1.3.0" + "lunarphp/stripe": "^1.5" }, "require-dev": { "fakerphp/faker": "^1.23", @@ -28,7 +28,8 @@ "mockery/mockery": "^1.6", "nunomaduro/collision": "^8.6", "pestphp/pest": "^4.6", - "pestphp/pest-plugin-laravel": "^4.1" + "pestphp/pest-plugin-laravel": "^4.1", + "filament/upgrade": "^4.0" }, "extra": { "laravel": { diff --git a/src/Auth/Extensions/StaffResourceExtension.php b/src/Auth/Extensions/StaffResourceExtension.php index 02d04db..a4d604d 100644 --- a/src/Auth/Extensions/StaffResourceExtension.php +++ b/src/Auth/Extensions/StaffResourceExtension.php @@ -2,18 +2,18 @@ namespace Modules\Core\Auth\Extensions; -use Filament\Forms\Form; +use Filament\Schemas\Schema; use Lunar\Admin\Support\Extending\ResourceExtension; class StaffResourceExtension extends ResourceExtension { - public function extendForm(Form $form): Form + public function extendForm(Schema $form): Schema { $schema = collect($form->getComponents()) ->reject(fn ($component) => method_exists($component, 'getName') && $component->getName() == 'password') ->values() ->all(); - return $form->schema($schema); + return $form->components($schema); } } diff --git a/src/Auth/Filament/Pages/Login.php b/src/Auth/Filament/Pages/Login.php index 883aa4b..d431ffd 100644 --- a/src/Auth/Filament/Pages/Login.php +++ b/src/Auth/Filament/Pages/Login.php @@ -15,7 +15,7 @@ class Login extends SimplePage { use WithRateLimiting; - protected static string $view = 'core::auth.filament.pages.login'; + protected string $view = 'core::auth.filament.pages.login'; public ?string $email = ''; public ?string $otp = ''; @@ -78,7 +78,7 @@ class Login extends SimplePage ]); } - if ($staff instanceof FilamentUser && !$staff->canAccessPanel(Filament::getCurrentPanel())) { + if ($staff instanceof FilamentUser && !$staff->canAccessPanel(Filament::getCurrentOrDefaultPanel())) { throw ValidationException::withMessages([ 'email' => 'You do not have access to this panel.', ]); diff --git a/src/Cart/Exceptions/InvalidCouponException.php b/src/Cart/Exceptions/InvalidCouponException.php index f024053..c009444 100644 --- a/src/Cart/Exceptions/InvalidCouponException.php +++ b/src/Cart/Exceptions/InvalidCouponException.php @@ -12,8 +12,8 @@ use RuntimeException; */ class InvalidCouponException extends RuntimeException { - public function __construct(public readonly string $code) + public function __construct(public readonly string $couponCode) { - parent::__construct("The coupon code \"{$code}\" is not valid."); + parent::__construct("The coupon code \"{$couponCode}\" is not valid."); } } diff --git a/src/Cart/Filament/Resources/CartResource.php b/src/Cart/Filament/Resources/CartResource.php index e1c2e0f..bba5a5f 100644 --- a/src/Cart/Filament/Resources/CartResource.php +++ b/src/Cart/Filament/Resources/CartResource.php @@ -2,6 +2,10 @@ namespace Modules\Core\Cart\Filament\Resources; +use Filament\Tables\Columns\TextColumn; +use Filament\Actions\ViewAction; +use Modules\Core\Cart\Filament\Resources\CartResource\Pages\ListCarts; +use Modules\Core\Cart\Filament\Resources\CartResource\Pages\ViewCart; use Filament\Resources\Resource; use Filament\Tables; use Filament\Tables\Table; @@ -24,9 +28,9 @@ class CartResource extends Resource { protected static ?string $model = Cart::class; - protected static ?string $navigationIcon = 'heroicon-o-shopping-cart'; + protected static string | \BackedEnum | null $navigationIcon = 'heroicon-o-shopping-cart'; - protected static ?string $navigationGroup = 'Sales'; + protected static string | \UnitEnum | null $navigationGroup = 'Sales'; protected static ?string $modelLabel = 'Cart'; @@ -70,37 +74,37 @@ class CartResource extends Resource { return $table ->columns([ - Tables\Columns\TextColumn::make('id') + TextColumn::make('id') ->label('Cart') ->sortable(), - Tables\Columns\TextColumn::make('customer.full_name') + TextColumn::make('customer.full_name') ->label('Customer') ->placeholder('—') ->searchable() ->url(fn (Cart $record) => $record->customer_id !== null ? CustomerResource::getUrl('view', ['record' => $record->customer_id]) : null), - Tables\Columns\TextColumn::make('user.email') + TextColumn::make('user.email') ->label('User') ->placeholder('—') ->searchable(), - Tables\Columns\TextColumn::make('lines_count') + TextColumn::make('lines_count') ->label('Lines') ->counts('lines') ->sortable(), - Tables\Columns\TextColumn::make('lines_sum_quantity') + TextColumn::make('lines_sum_quantity') ->label('Items') ->sum('lines', 'quantity') ->sortable(), - Tables\Columns\TextColumn::make('currency.code') + TextColumn::make('currency.code') ->label('Currency'), - Tables\Columns\TextColumn::make('updated_at') + TextColumn::make('updated_at') ->label('Last activity') ->dateTime() ->sortable(), ]) - ->actions([ - Tables\Actions\ViewAction::make(), + ->recordActions([ + ViewAction::make(), ]) ->defaultSort('updated_at', 'desc'); } @@ -108,8 +112,8 @@ class CartResource extends Resource public static function getPages(): array { return [ - 'index' => Pages\ListCarts::route('/'), - 'view' => Pages\ViewCart::route('/{record}'), + 'index' => ListCarts::route('/'), + 'view' => ViewCart::route('/{record}'), ]; } diff --git a/src/Cart/Filament/Resources/CartResource/Pages/ListCarts.php b/src/Cart/Filament/Resources/CartResource/Pages/ListCarts.php index a1e5b4d..488c7c1 100644 --- a/src/Cart/Filament/Resources/CartResource/Pages/ListCarts.php +++ b/src/Cart/Filament/Resources/CartResource/Pages/ListCarts.php @@ -2,7 +2,7 @@ namespace Modules\Core\Cart\Filament\Resources\CartResource\Pages; -use Filament\Resources\Components\Tab; +use Filament\Schemas\Components\Tabs\Tab; use Filament\Resources\Pages\ListRecords; use Illuminate\Database\Eloquent\Builder; use Modules\Core\Cart\Filament\Resources\CartResource; diff --git a/src/Cart/Filament/Resources/CartResource/Pages/ViewCart.php b/src/Cart/Filament/Resources/CartResource/Pages/ViewCart.php index 7ea4460..79c5124 100644 --- a/src/Cart/Filament/Resources/CartResource/Pages/ViewCart.php +++ b/src/Cart/Filament/Resources/CartResource/Pages/ViewCart.php @@ -2,11 +2,11 @@ namespace Modules\Core\Cart\Filament\Resources\CartResource\Pages; +use Filament\Schemas\Schema; +use Filament\Schemas\Components\Section; use Filament\Actions\Action; use Filament\Infolists\Components\RepeatableEntry; -use Filament\Infolists\Components\Section; use Filament\Infolists\Components\TextEntry; -use Filament\Infolists\Infolist; use Filament\Resources\Pages\ViewRecord; use Lunar\Admin\Filament\Resources\CustomerResource; use Lunar\Models\Cart; @@ -44,10 +44,10 @@ class ViewCart extends ViewRecord return $cart->calculate(); } - public function infolist(Infolist $infolist): Infolist + public function infolist(Schema $schema): Schema { - return $infolist - ->schema([ + return $schema + ->components([ Section::make('Cart') ->columns(3) ->schema([ diff --git a/src/Catalog/Contracts/ProductOptionTypeInterface.php b/src/Catalog/Contracts/ProductOptionTypeInterface.php index 49fb205..09f6688 100644 --- a/src/Catalog/Contracts/ProductOptionTypeInterface.php +++ b/src/Catalog/Contracts/ProductOptionTypeInterface.php @@ -2,7 +2,7 @@ namespace Modules\Core\Catalog\Contracts; -use Filament\Forms\Components\Component; +use Filament\Schemas\Components\Component; /** * A Product Option Type describes how a category of Lunar `ProductOption` (e.g. diff --git a/src/Catalog/Filament/Extensions/ProductOptionResourceExtension.php b/src/Catalog/Filament/Extensions/ProductOptionResourceExtension.php index b816ce6..46e0913 100644 --- a/src/Catalog/Filament/Extensions/ProductOptionResourceExtension.php +++ b/src/Catalog/Filament/Extensions/ProductOptionResourceExtension.php @@ -2,8 +2,8 @@ namespace Modules\Core\Catalog\Filament\Extensions; +use Filament\Schemas\Schema; use Filament\Forms\Components\Select; -use Filament\Forms\Form; use Illuminate\Support\Str; use Lunar\Admin\Support\Extending\ResourceExtension; use Modules\Core\Catalog\Services\ProductOptionTypeManager; @@ -16,7 +16,7 @@ use Modules\Core\Catalog\Services\ProductOptionTypeManager; */ class ProductOptionResourceExtension extends ResourceExtension { - public function extendForm(Form $form): Form + public function extendForm(Schema $schema): Schema { $options = collect(ProductOptionTypeManager::get()->all()) ->keys() @@ -24,11 +24,11 @@ class ProductOptionResourceExtension extends ResourceExtension ->all(); if ($options === []) { - return $form; + return $schema; } - return $form->schema([ - ...$form->getComponents(), + return $schema->components([ + ...$schema->getComponents(), Select::make('meta.option_type') ->label('Option Type') ->options($options) diff --git a/src/Catalog/Filament/Extensions/ValuesRelationManagerExtension.php b/src/Catalog/Filament/Extensions/ValuesRelationManagerExtension.php index 1429d89..827fa9c 100644 --- a/src/Catalog/Filament/Extensions/ValuesRelationManagerExtension.php +++ b/src/Catalog/Filament/Extensions/ValuesRelationManagerExtension.php @@ -2,7 +2,7 @@ namespace Modules\Core\Catalog\Filament\Extensions; -use Filament\Forms\Form; +use Filament\Schemas\Schema; use Lunar\Admin\Support\Extending\RelationManagerExtension; use Lunar\Models\ProductOption; use Modules\Core\Catalog\Services\ProductOptionTypeManager; @@ -15,7 +15,7 @@ use Modules\Core\Catalog\Services\ProductOptionTypeManager; */ class ValuesRelationManagerExtension extends RelationManagerExtension { - public function extendForm(Form $form): Form + public function extendForm(Schema $schema): Schema { /** @var ProductOption $option */ $option = $this->caller->getOwnerRecord(); @@ -23,11 +23,11 @@ class ValuesRelationManagerExtension extends RelationManagerExtension $type = ProductOptionTypeManager::get()->resolve($option->meta['option_type'] ?? null); if ($type === null) { - return $form; + return $schema; } - return $form->schema([ - ...$form->getComponents(), + return $schema->components([ + ...$schema->getComponents(), ...$type->getMetaForm(), ]); } diff --git a/src/Checkout/Contracts/PaymentDriver.php b/src/Checkout/Contracts/PaymentDriver.php index f8c56ac..4f458c0 100644 --- a/src/Checkout/Contracts/PaymentDriver.php +++ b/src/Checkout/Contracts/PaymentDriver.php @@ -2,6 +2,8 @@ namespace Modules\Core\Checkout\Contracts; +use Lunar\Exceptions\FingerprintMismatchException; +use Lunar\Exceptions\Carts\CartException; use Lunar\Models\Cart; use Lunar\Models\Order; @@ -34,8 +36,8 @@ interface PaymentDriver * * @param array $data * - * @throws \Lunar\Exceptions\FingerprintMismatchException - * @throws \Lunar\Exceptions\Carts\CartException + * @throws FingerprintMismatchException + * @throws CartException */ public function confirm(Cart $cart, string $fingerprint, array $data): Order; } diff --git a/src/Checkout/Services/CheckoutService.php b/src/Checkout/Services/CheckoutService.php index 0cd79b5..46c258a 100644 --- a/src/Checkout/Services/CheckoutService.php +++ b/src/Checkout/Services/CheckoutService.php @@ -2,6 +2,8 @@ namespace Modules\Core\Checkout\Services; +use Lunar\Exceptions\FingerprintMismatchException; +use Lunar\Exceptions\Carts\CartException; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Event; use Lunar\Base\Addressable; @@ -107,8 +109,8 @@ class CheckoutService * render as form errors directly. FingerprintMismatchException * propagates the same way, for the same reason. * - * @throws \Lunar\Exceptions\FingerprintMismatchException - * @throws \Lunar\Exceptions\Carts\CartException + * @throws FingerprintMismatchException + * @throws CartException */ public function placeOrder(string $fingerprint): Order { diff --git a/src/Command/CreateAdminCommand.php b/src/Command/CreateAdminCommand.php index a728930..a281c42 100644 --- a/src/Command/CreateAdminCommand.php +++ b/src/Command/CreateAdminCommand.php @@ -2,6 +2,7 @@ namespace Modules\Core\Command; +use Lunar\Admin\Models\Staff; use Lunar\Admin\Console\Commands\MakeLunarAdminCommand; use function Laravel\Prompts\text; @@ -31,7 +32,7 @@ class CreateAdminCommand extends MakeLunarAdminCommand required: true, validate: fn (string $email): ?string => match (true) { ! filter_var($email, FILTER_VALIDATE_EMAIL) => 'The email address must be valid.', - \Lunar\Admin\Models\Staff::where('email', $email)->exists() => 'A user with this email address already exists', + Staff::where('email', $email)->exists() => 'A user with this email address already exists', default => null, }, ), diff --git a/src/Command/ExportCommand.php b/src/Command/ExportCommand.php index 5a01855..4d6725a 100644 --- a/src/Command/ExportCommand.php +++ b/src/Command/ExportCommand.php @@ -2,6 +2,9 @@ namespace Modules\Core\Command; +use RecursiveIteratorIterator; +use RecursiveDirectoryIterator; +use FilesystemIterator; use Illuminate\Console\Command; use Illuminate\Support\Facades\Storage; use Modules\Core\ResultType\Error; @@ -88,10 +91,10 @@ class ExportCommand extends Command $zip->addFile($sqlFile, basename($sqlFile)); if (is_dir($filesDir)) { - $iterator = new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator( + $iterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator( $filesDir, - \FilesystemIterator::SKIP_DOTS, + FilesystemIterator::SKIP_DOTS, ), ); foreach ($iterator as $file) { diff --git a/src/CorePlugin.php b/src/CorePlugin.php index 53c60ba..5d19cd4 100644 --- a/src/CorePlugin.php +++ b/src/CorePlugin.php @@ -2,6 +2,7 @@ namespace Modules\Core; +use Lunar\Admin\Filament\Resources\OrderResource\Pages\ManageOrder; use Filament\Contracts\Plugin; use Filament\Panel; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -59,7 +60,7 @@ class CorePlugin implements Plugin ValuesRelationManager::class => ValuesRelationManagerExtension::class, ShippingMethodResource::class => ShippingMethodResourceExtension::class, ListShippingMethod::class => ShippingMethodListExtension::class, - OrderResource\Pages\ManageOrder::class => OrderViewExtension::class, + ManageOrder::class => OrderViewExtension::class, ]); Product::macro('reviews', function (): HasMany { @@ -73,9 +74,8 @@ class CorePlugin implements Plugin 'password', 'remember_token', 'email_verified_at', - 'two_factor_secret', - 'two_factor_recovery_codes', - 'two_factor_confirmed_at', + 'app_authentication_secret', + 'app_authentication_recovery_codes', ]); LunarStaff::created(function (LunarStaff $staff) { diff --git a/src/Customer/RelationManagers/AddressRelationManager.php b/src/Customer/RelationManagers/AddressRelationManager.php index b430797..2041db4 100644 --- a/src/Customer/RelationManagers/AddressRelationManager.php +++ b/src/Customer/RelationManagers/AddressRelationManager.php @@ -2,12 +2,12 @@ namespace Modules\Core\Customer\RelationManagers; -use Filament\Forms\Components\Group; +use Filament\Actions\CreateAction; +use Filament\Actions\EditAction; +use Filament\Actions\DeleteAction; +use Filament\Schemas\Components\Group; use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; -use Filament\Tables\Actions\CreateAction; -use Filament\Tables\Actions\DeleteAction; -use Filament\Tables\Actions\EditAction; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Model; @@ -38,9 +38,9 @@ class AddressRelationManager extends BaseAddressRelationManager ), ]) ->headerActions([ - CreateAction::make()->form($this->addressForm()), + CreateAction::make()->schema($this->addressForm()), ]) - ->actions([ + ->recordActions([ EditAction::make('editAddress') ->fillForm(fn (AddressContract $record): array => [ 'line_one' => $record->line_one, @@ -51,7 +51,7 @@ class AddressRelationManager extends BaseAddressRelationManager 'contact_email' => $record->contact_email, 'contact_phone' => $record->contact_phone, ]) - ->form($this->addressForm()), + ->schema($this->addressForm()), DeleteAction::make('deleteAddress'), ]); } diff --git a/src/Customer/RelationManagers/UserRelationManager.php b/src/Customer/RelationManagers/UserRelationManager.php index ff3f862..0bb7fef 100644 --- a/src/Customer/RelationManagers/UserRelationManager.php +++ b/src/Customer/RelationManagers/UserRelationManager.php @@ -2,6 +2,8 @@ namespace Modules\Core\Customer\RelationManagers; +use Filament\Tables\Columns\TextColumn; +use Filament\Actions\EditAction; use Filament\Forms\Components\TextInput; use Filament\Tables; use Filament\Tables\Table; @@ -14,16 +16,16 @@ class UserRelationManager extends BaseUserRelationManager public function getDefaultTable(Table $table): Table { return $table->columns([ - Tables\Columns\TextColumn::make('name') + TextColumn::make('name') ->label(__('lunarpanel::user.table.name.label')), - Tables\Columns\TextColumn::make('email') + TextColumn::make('email') ->label(__('lunarpanel::user.table.email.label')), - ])->actions([ - Tables\Actions\EditAction::make('edit') + ])->recordActions([ + EditAction::make('edit') ->after( fn (Model $record) => CustomerUserEdited::dispatch($record) ) - ->form([ + ->schema([ TextInput::make('email') ->label(__('lunarpanel::user.form.email.label')) ->required() diff --git a/src/Localization/Filament/Resources/LanguageLineResource.php b/src/Localization/Filament/Resources/LanguageLineResource.php index 3fe9469..8d4b718 100644 --- a/src/Localization/Filament/Resources/LanguageLineResource.php +++ b/src/Localization/Filament/Resources/LanguageLineResource.php @@ -2,8 +2,17 @@ namespace Modules\Core\Localization\Filament\Resources; +use Filament\Schemas\Schema; +use Filament\Forms\Components\TextInput; +use Filament\Schemas\Components\Fieldset; +use Filament\Tables\Columns\TextColumn; +use Filament\Tables\Filters\SelectFilter; +use Modules\Core\Localization\Filament\Resources\LanguageLineResource\Pages\ListLanguageLines; +use Modules\Core\Localization\Filament\Resources\LanguageLineResource\Pages\CreateLanguageLine; +use Modules\Core\Localization\Filament\Resources\LanguageLineResource\Pages\EditLanguageLine; +use Filament\Forms\Components\Textarea; +use Illuminate\Support\Collection; use Filament\Forms; -use Filament\Forms\Form; use Filament\Resources\Resource; use Filament\Tables; use Filament\Tables\Table; @@ -15,29 +24,29 @@ class LanguageLineResource extends Resource { protected static ?string $model = LanguageLine::class; - protected static ?string $navigationIcon = 'heroicon-o-language'; + protected static string | \BackedEnum | null $navigationIcon = 'heroicon-o-language'; - protected static ?string $navigationGroup = 'Settings'; + protected static string | \UnitEnum | null $navigationGroup = 'Settings'; protected static ?string $modelLabel = 'Translation'; protected static ?string $pluralModelLabel = 'Translations'; - public static function form(Form $form): Form + public static function form(Schema $schema): Schema { - return $form->schema([ - Forms\Components\TextInput::make('group') + return $schema->components([ + TextInput::make('group') ->required() ->maxLength(255) ->default('storefront') ->helperText('Namespace for this label, e.g. "storefront" for e-shop UI text.'), - Forms\Components\TextInput::make('key') + TextInput::make('key') ->required() ->maxLength(255) ->helperText('Dot-notation key, e.g. "nav.cart".'), - Forms\Components\Fieldset::make('Translations') + Fieldset::make('Translations') ->schema(static::localeInputs()), ]); } @@ -46,16 +55,16 @@ class LanguageLineResource extends Resource { return $table ->columns([ - Tables\Columns\TextColumn::make('group') + TextColumn::make('group') ->badge() ->sortable(), - Tables\Columns\TextColumn::make('key') + TextColumn::make('key') ->searchable() ->sortable(), ...static::localeColumns(), ]) ->filters([ - Tables\Filters\SelectFilter::make('group') + SelectFilter::make('group') ->options(fn () => LanguageLine::query()->distinct()->pluck('group', 'group')), ]) ->defaultSort('key'); @@ -69,38 +78,38 @@ class LanguageLineResource extends Resource public static function getPages(): array { return [ - 'index' => Pages\ListLanguageLines::route('/'), - 'create' => Pages\CreateLanguageLine::route('/create'), - 'edit' => Pages\EditLanguageLine::route('/{record}/edit'), + 'index' => ListLanguageLines::route('/'), + 'create' => CreateLanguageLine::route('/create'), + 'edit' => EditLanguageLine::route('/{record}/edit'), ]; } /** - * @return array + * @return array