2026-07-01 18:35:39 +03:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace Modules\Core;
|
|
|
|
|
|
2026-08-31 13:16:13 +03:00
|
|
|
use Lunar\Admin\Filament\Resources\OrderResource\Pages\ManageOrder;
|
2026-09-09 00:48:09 +03:00
|
|
|
use Lunar\Admin\Filament\Resources\OrderResource\Pages\Components\OrderItemsTable;
|
2026-07-01 18:35:39 +03:00
|
|
|
use Filament\Contracts\Plugin;
|
|
|
|
|
use Filament\Panel;
|
2026-07-10 15:19:48 +03:00
|
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
2026-08-25 09:33:03 +03:00
|
|
|
use Illuminate\Database\Eloquent\Relations\MorphMany;
|
2026-07-01 18:35:39 +03:00
|
|
|
use Illuminate\Support\Facades\Mail;
|
2026-08-25 09:33:03 +03:00
|
|
|
use Lunar\Admin\Filament\Resources\CustomerResource;
|
|
|
|
|
use Lunar\Admin\Filament\Resources\CustomerResource\Pages\EditCustomer;
|
|
|
|
|
use Lunar\Admin\Filament\Resources\CustomerResource\Pages\ViewCustomer;
|
2026-08-27 01:55:58 +03:00
|
|
|
use Lunar\Admin\Filament\Resources\ProductOptionResource;
|
|
|
|
|
use Lunar\Admin\Filament\Resources\ProductOptionResource\RelationManagers\ValuesRelationManager;
|
2026-07-19 00:52:01 +03:00
|
|
|
use Lunar\Admin\Filament\Resources\OrderResource;
|
2026-07-10 15:19:48 +03:00
|
|
|
use Lunar\Admin\Filament\Resources\ProductResource;
|
2026-07-01 18:35:39 +03:00
|
|
|
use Lunar\Admin\Filament\Resources\StaffResource;
|
|
|
|
|
use Lunar\Admin\Models\Staff as LunarStaff;
|
|
|
|
|
use Lunar\Admin\Support\Facades\LunarPanel;
|
2026-08-25 09:33:03 +03:00
|
|
|
use Lunar\Models\Customer;
|
2026-07-10 15:19:48 +03:00
|
|
|
use Lunar\Models\Product;
|
2026-07-19 00:52:01 +03:00
|
|
|
use Lunar\Shipping\Filament\Resources\ShippingMethodResource;
|
|
|
|
|
use Lunar\Shipping\Filament\Resources\ShippingMethodResource\Pages\ListShippingMethod;
|
2026-07-06 03:10:34 +03:00
|
|
|
use Lunar\Shipping\ShippingPlugin;
|
2026-07-01 18:35:39 +03:00
|
|
|
use Modules\Core\Auth\Extensions\StaffResourceExtension;
|
|
|
|
|
use Modules\Core\Auth\Filament\Pages\Login;
|
|
|
|
|
use Modules\Core\Auth\Mail\InviteMail;
|
2026-08-28 00:27:46 +03:00
|
|
|
use Modules\Core\Cart\Filament\Resources\CartResource;
|
2026-08-27 11:42:13 +03:00
|
|
|
use Modules\Core\Catalog\Filament\Extensions\ProductOptionResourceExtension;
|
|
|
|
|
use Modules\Core\Catalog\Filament\Extensions\ValuesRelationManagerExtension;
|
2026-08-06 12:06:55 +03:00
|
|
|
use Modules\Core\Localization\Filament\Resources\LanguageLineResource;
|
2026-09-09 00:48:09 +03:00
|
|
|
use Modules\Core\Order\Filament\Extensions\OrderItemsTableExtension;
|
2026-09-14 00:03:06 +03:00
|
|
|
use Modules\Core\Order\Filament\Extensions\OrderPaymentMethodSummaryExtension;
|
2026-09-15 21:17:56 +03:00
|
|
|
use Modules\Core\Order\Filament\Extensions\OrderActionsExtension;
|
2026-09-09 00:48:09 +03:00
|
|
|
use Modules\Core\Order\Filament\Extensions\OrderTransactionsExtension;
|
2026-08-31 13:54:20 +03:00
|
|
|
use Modules\Core\Payment\Filament\Resources\PaymentMethodResource;
|
2026-08-25 09:33:03 +03:00
|
|
|
use Modules\Core\Privacy\Filament\Extensions\CustomerErasureActionsExtension;
|
|
|
|
|
use Modules\Core\Privacy\Filament\Extensions\CustomerErasureRelationsExtension;
|
|
|
|
|
use Modules\Core\Privacy\Filament\Resources\DataErasureRequestResource;
|
|
|
|
|
use Modules\Core\Privacy\Filament\Resources\DataExportRequestResource;
|
|
|
|
|
use Modules\Core\Privacy\Models\DataErasureRequest;
|
|
|
|
|
use Modules\Core\Privacy\Models\DataExportRequest;
|
2026-08-27 12:11:01 +03:00
|
|
|
use Modules\Core\Review\Filament\Extensions\ProductResourceExtension;
|
2026-07-10 15:19:48 +03:00
|
|
|
use Modules\Core\Review\Models\ProductReview;
|
2026-09-14 00:03:06 +03:00
|
|
|
use Modules\Core\Shipping\Extensions\OrderShipmentsExtension;
|
2026-07-19 00:52:01 +03:00
|
|
|
use Modules\Core\Shipping\Extensions\OrderViewExtension;
|
|
|
|
|
use Modules\Core\Shipping\Extensions\ShippingMethodListExtension;
|
|
|
|
|
use Modules\Core\Shipping\Extensions\ShippingMethodResourceExtension;
|
2026-09-14 00:03:06 +03:00
|
|
|
use Modules\Core\Shipping\Filament\Resources\ManifestResource;
|
|
|
|
|
use Modules\Core\Shipping\Filament\Resources\ShipmentResource;
|
2026-07-01 18:35:39 +03:00
|
|
|
|
|
|
|
|
class CorePlugin implements Plugin
|
|
|
|
|
{
|
|
|
|
|
public function getId(): string
|
|
|
|
|
{
|
|
|
|
|
return 'core';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function register(Panel $panel): void
|
|
|
|
|
{
|
|
|
|
|
$panel->path('boboko')
|
|
|
|
|
->brandName('Boboko')
|
2026-07-02 23:48:55 +03:00
|
|
|
->brandLogo(asset('static/logos/core/boboko-logo.svg'))
|
|
|
|
|
->darkModeBrandLogo(asset('static/logos/core/boboko-logo-white.svg'))
|
2026-07-06 03:10:34 +03:00
|
|
|
->login(Login::class)
|
2026-08-06 12:06:55 +03:00
|
|
|
->resources([
|
|
|
|
|
LanguageLineResource::class,
|
2026-08-25 09:33:03 +03:00
|
|
|
DataErasureRequestResource::class,
|
|
|
|
|
DataExportRequestResource::class,
|
2026-08-28 00:27:46 +03:00
|
|
|
CartResource::class,
|
2026-08-31 13:54:20 +03:00
|
|
|
PaymentMethodResource::class,
|
2026-09-14 00:03:06 +03:00
|
|
|
ShipmentResource::class,
|
|
|
|
|
ManifestResource::class,
|
2026-08-06 12:06:55 +03:00
|
|
|
])
|
2026-07-06 03:10:34 +03:00
|
|
|
->plugin(ShippingPlugin::make());
|
2026-07-01 18:35:39 +03:00
|
|
|
|
|
|
|
|
LunarPanel::extensions([
|
|
|
|
|
StaffResource::class => StaffResourceExtension::class,
|
2026-07-10 15:19:48 +03:00
|
|
|
ProductResource::class => ProductResourceExtension::class,
|
2026-08-27 01:55:58 +03:00
|
|
|
ProductOptionResource::class => ProductOptionResourceExtension::class,
|
|
|
|
|
ValuesRelationManager::class => ValuesRelationManagerExtension::class,
|
2026-07-19 00:52:01 +03:00
|
|
|
ShippingMethodResource::class => ShippingMethodResourceExtension::class,
|
|
|
|
|
ListShippingMethod::class => ShippingMethodListExtension::class,
|
2026-09-15 21:17:56 +03:00
|
|
|
ManageOrder::class => [OrderViewExtension::class, OrderActionsExtension::class, OrderTransactionsExtension::class, OrderPaymentMethodSummaryExtension::class, OrderShipmentsExtension::class],
|
2026-09-09 00:48:09 +03:00
|
|
|
OrderItemsTable::class => OrderItemsTableExtension::class,
|
2026-08-25 09:33:03 +03:00
|
|
|
// headerActions() is resolved per PAGE class, not per resource class —
|
|
|
|
|
// unlike extendForm()/extendTable(), which really are resource-keyed
|
|
|
|
|
// (called statically from the Resource class itself). Registering this
|
|
|
|
|
// under CustomerResource::class would silently never fire; it has to be
|
|
|
|
|
// keyed by each concrete page it should appear on. Layered with
|
|
|
|
|
// whatever extension the consuming app registers for the same page —
|
|
|
|
|
// LunarPanel::extensions() merges per key, and this one only touches
|
|
|
|
|
// headerActions(), so it never conflicts with an app's own extension
|
|
|
|
|
// (see docs/modules.md "Layering Module and App Configuration").
|
|
|
|
|
EditCustomer::class => CustomerErasureActionsExtension::class,
|
|
|
|
|
ViewCustomer::class => CustomerErasureActionsExtension::class,
|
|
|
|
|
// getRelations(), unlike headerActions(), genuinely is resolved
|
|
|
|
|
// statically from the Resource class itself — CustomerResource::class
|
|
|
|
|
// is the correct key here.
|
|
|
|
|
CustomerResource::class => CustomerErasureRelationsExtension::class,
|
2026-07-01 18:35:39 +03:00
|
|
|
]);
|
|
|
|
|
|
2026-07-10 15:19:48 +03:00
|
|
|
Product::macro('reviews', function (): HasMany {
|
|
|
|
|
/** @var Product $this */
|
|
|
|
|
return $this->hasMany(ProductReview::class);
|
|
|
|
|
});
|
|
|
|
|
|
2026-08-25 09:33:03 +03:00
|
|
|
// Customer::erasureRequests()/exportRequests() and the User-model
|
|
|
|
|
// equivalents below let a relation manager scope
|
|
|
|
|
// DataErasureRequest/DataExportRequest to one specific subject — both
|
|
|
|
|
// tables use a plain subject_type/subject_id pair rather than Laravel's
|
|
|
|
|
// usual morphs() convention, since one column pair identifies either a
|
|
|
|
|
// Customer or a User (see docs/privacy.md "User-scope vs Customer-scope"),
|
|
|
|
|
// so this is a MorphMany built by hand rather than a bare Eloquent
|
|
|
|
|
// convention lookup.
|
|
|
|
|
Customer::macro('erasureRequests', function (): MorphMany {
|
|
|
|
|
/** @var Customer $this */
|
|
|
|
|
return $this->morphMany(DataErasureRequest::class, 'subject', 'subject_type', 'subject_id');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Customer::macro('exportRequests', function (): MorphMany {
|
|
|
|
|
/** @var Customer $this */
|
|
|
|
|
return $this->morphMany(DataExportRequest::class, 'subject', 'subject_type', 'subject_id');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
$userModel = config('auth.providers.users.model');
|
|
|
|
|
|
|
|
|
|
$userModel::macro('erasureRequests', function (): MorphMany {
|
|
|
|
|
return $this->morphMany(DataErasureRequest::class, 'subject', 'subject_type', 'subject_id');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
$userModel::macro('exportRequests', function (): MorphMany {
|
|
|
|
|
return $this->morphMany(DataExportRequest::class, 'subject', 'subject_type', 'subject_id');
|
|
|
|
|
});
|
|
|
|
|
|
2026-07-01 18:35:39 +03:00
|
|
|
LunarStaff::addActivitylogExcept([
|
|
|
|
|
'otp_code',
|
|
|
|
|
'otp_expires_at',
|
|
|
|
|
'password',
|
|
|
|
|
'remember_token',
|
|
|
|
|
'email_verified_at',
|
2026-08-31 13:16:13 +03:00
|
|
|
'app_authentication_secret',
|
|
|
|
|
'app_authentication_recovery_codes',
|
2026-07-01 18:35:39 +03:00
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
LunarStaff::created(function (LunarStaff $staff) {
|
|
|
|
|
Mail::to($staff->email)->send(new InviteMail($staff->first_name));
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function boot(Panel $panel): void {}
|
|
|
|
|
}
|