diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows_temp/deploy.yaml similarity index 100% rename from .gitea/workflows/deploy.yaml rename to .gitea/workflows_temp/deploy.yaml diff --git a/README.md b/README.md index 05f00c5..cd4a35c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,13 @@ # Changelog +**2025-04-04** +- Fixed #133 - Make product name not required +- Fixed #127 - Implement resource lock for orders +- Fixed #125 - 'Add Payment' on LIst Invoice page modal is too wide +- Fixed #124 - Reorder button for product services is displayed on wrong side +- Fixed #123 - Typo 'Add to product Services' **2025-03-11** +- Fixed #122 - Non-admins can see payments - Fixed #107 - Fix dashboard - Fixed #118 - Improved customer form and re-add 'create customer' to order form - Fixed #117 - Draft orders should not show up in order tabs diff --git a/app/Filament/Admin/Resources/CustomerResource.php b/app/Filament/Admin/Resources/CustomerResource.php index c31b046..c0ac10a 100644 --- a/app/Filament/Admin/Resources/CustomerResource.php +++ b/app/Filament/Admin/Resources/CustomerResource.php @@ -112,8 +112,7 @@ public static function getPages(): array { return [ 'index' => \App\Filament\Admin\Resources\CustomerResource\Pages\ListCustomers::route('/'), - // 'create' => \App\Filament\Admin\Resources\CustomerResource\Pages\CreateCustomer::route('/create'), - 'edit' => \App\Filament\Admin\Resources\CustomerResource\Pages\EditCustomer::route('/{record}/edit'), + 'edit' => \App\Filament\Admin\Resources\CustomerResource\Pages\EditCustomer::route('/{record}/edit'), ]; } } diff --git a/app/Filament/Admin/Resources/CustomerResource/RelationManagers/PaymentsRelationManager.php b/app/Filament/Admin/Resources/CustomerResource/RelationManagers/PaymentsRelationManager.php index 4e80297..32e5589 100644 --- a/app/Filament/Admin/Resources/CustomerResource/RelationManagers/PaymentsRelationManager.php +++ b/app/Filament/Admin/Resources/CustomerResource/RelationManagers/PaymentsRelationManager.php @@ -7,6 +7,7 @@ use Filament\Forms\Form; use Filament\Resources\RelationManagers\RelationManager; use Filament\Tables\Table; +use Illuminate\Database\Eloquent\Model; class PaymentsRelationManager extends RelationManager { @@ -27,4 +28,9 @@ public function table(Table $table): Table { return PaymentResource::table($table); } + + public static function canViewForRecord(Model $ownerRecord, string $pageClass): bool + { + return auth()->user()->is_admin ?? false; + } } diff --git a/app/Filament/Admin/Resources/InvoiceResource.php b/app/Filament/Admin/Resources/InvoiceResource.php index 3c85f8f..7a3bc1c 100644 --- a/app/Filament/Admin/Resources/InvoiceResource.php +++ b/app/Filament/Admin/Resources/InvoiceResource.php @@ -249,6 +249,7 @@ public static function table(Table $table): Table BulkAction::make('Create Payment') ->icon(IconEnum::PAYMENTS->value) ->form(fn ($form) => PaymentResource::form($form)) + ->modalWidth('lg') ->action(function (Collection $records, array $data) { if ($records->pluck('customer_id')->unique()->count() !== 1) { Notification::make() diff --git a/app/Filament/Admin/Resources/OrderResource.php b/app/Filament/Admin/Resources/OrderResource.php index aa42251..904d542 100644 --- a/app/Filament/Admin/Resources/OrderResource.php +++ b/app/Filament/Admin/Resources/OrderResource.php @@ -145,12 +145,15 @@ public static function form(Form $form): Form TableRepeater::make('order_products') ->label('Garments') + ->addActionLabel('Add new garment') + ->reorderable() + ->cloneable() + ->defaultItems(1) ->schema([ TextInput::make('sku') ->datalist(OrderProduct::all()->unique('sku')->pluck('sku')->toArray()), TextInput::make('product_name') - ->datalist(OrderProduct::all()->unique('product_name')->pluck('product_name')->toArray()) - ->required(), + ->datalist(OrderProduct::all()->unique('product_name')->pluck('product_name')->toArray()), TextInput::make('color') ->datalist(OrderProduct::all()->unique('color')->pluck('color')->toArray()), Cluster::make([ @@ -180,14 +183,12 @@ public static function form(Form $form): Form ->rules('numeric'), ]) ->label('Sizes'), - ]) - ->reorderable() - ->cloneable() - ->defaultItems(1), + ]), Repeater::make('services') ->view('filament.forms.compact-repeater') ->label('Product Services') + ->addActionLabel('Add new product service') ->schema([ Grid::make(19) ->schema([ diff --git a/app/Filament/Admin/Resources/OrderResource/Pages/EditOrder.php b/app/Filament/Admin/Resources/OrderResource/Pages/EditOrder.php index 7ad745e..70775fa 100644 --- a/app/Filament/Admin/Resources/OrderResource/Pages/EditOrder.php +++ b/app/Filament/Admin/Resources/OrderResource/Pages/EditOrder.php @@ -21,9 +21,12 @@ use Filament\Resources\Pages\EditRecord; use Illuminate\Contracts\Support\Htmlable; use Illuminate\Database\Eloquent\Model; +use Kenepa\ResourceLock\Resources\Pages\Concerns\UsesResourceLock; class EditOrder extends EditRecord { + use UsesResourceLock; + protected static string $resource = OrderResource::class; public function getTitle(): string|Htmlable diff --git a/app/Models/Order.php b/app/Models/Order.php index ee7741f..363d914 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -16,13 +16,14 @@ use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Carbon; +use Kenepa\ResourceLock\Models\Concerns\HasLocks; #[ObservedBy(OrderObserver::class)] class Order extends Model { /** @use HasFactory */ - use HasFactory, SoftDeletes; + use HasFactory, SoftDeletes, HasLocks; protected $fillable = [ 'customer_id', diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php index 3cb54b3..3429770 100644 --- a/app/Providers/Filament/AdminPanelProvider.php +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -18,6 +18,7 @@ use Illuminate\Session\Middleware\AuthenticateSession; use Illuminate\Session\Middleware\StartSession; use Illuminate\View\Middleware\ShareErrorsFromSession; +use Kenepa\ResourceLock\ResourceLockPlugin; class AdminPanelProvider extends PanelProvider { @@ -62,6 +63,7 @@ public function panel(Panel $panel): Panel NavigationGroup::make('Financial'), NavigationGroup::make('Reports'), NavigationGroup::make('Settings'), - ]); + ]) + ->plugin(ResourceLockPlugin::make()); } } diff --git a/composer.json b/composer.json index 03bd614..b8afb6c 100644 --- a/composer.json +++ b/composer.json @@ -7,15 +7,16 @@ "require": { "php": "^8.2", "davidhsianturi/blade-bootstrap-icons": "^1.5", + "fakerphp/faker": "^1.23", "filament/filament": "^3.2", "guava/filament-clusters": "^1.4", "icetalker/filament-table-repeater": "^1.3", + "kenepa/resource-lock": "^2.1", "laravel/framework": "^11.9", "laravel/tinker": "^2.9", "livewire/livewire": "^3.5", "mallardduck/blade-lucide-icons": "^1.23", - "spatie/laravel-pdf": "^1.5", - "fakerphp/faker": "^1.23" + "spatie/laravel-pdf": "^1.5" }, "require-dev": { "barryvdh/laravel-ide-helper": "^3.5", diff --git a/composer.lock b/composer.lock index 427fea6..624609f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "46ac06345fc3d57a7d0a01cfcaeaac17", + "content-hash": "8b981a2679ca20ca011a3c8b0c38ec22", "packages": [ { "name": "anourvalar/eloquent-serialize", @@ -2238,6 +2238,74 @@ ], "time": "2025-03-05T16:06:45+00:00" }, + { + "name": "kenepa/resource-lock", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/kenepa/resource-lock.git", + "reference": "dda6e14b5c4a47817569081b11248c572ebdfd07" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kenepa/resource-lock/zipball/dda6e14b5c4a47817569081b11248c572ebdfd07", + "reference": "dda6e14b5c4a47817569081b11248c572ebdfd07", + "shasum": "" + }, + "require": { + "filament/filament": "^3.0", + "illuminate/contracts": "^9.0|^10.0|^11.0|^12.0", + "php": "^8.1", + "spatie/laravel-package-tools": "^1.15.0" + }, + "require-dev": { + "laravel/pint": "^1.0", + "nunomaduro/collision": "^7.0|^8.1", + "nunomaduro/larastan": "^2.0.1", + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", + "pestphp/pest": "^2.0|^3.7", + "pestphp/pest-plugin-laravel": "^2.0|^3.1", + "pestphp/pest-plugin-livewire": "^2.0|^3.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0|^2.0", + "phpstan/phpstan-phpunit": "^1.0|^2.0", + "spatie/laravel-ray": "^1.26", + "tightenco/duster": "^1.1|^3.1" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "ResourceLock": "Kenepa\\ResourceLock\\Facades\\ResourceLock" + }, + "providers": [ + "Kenepa\\ResourceLock\\ResourceLockServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Kenepa\\ResourceLock\\": "src", + "Kenepa\\ResourceLock\\Database\\Factories\\": "database/factories" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Filament Resource Lock is a Filament plugin that adds resource locking functionality to your site.", + "homepage": "https://github.com/kenepa/resource-lock", + "keywords": [ + "Kenepa", + "laravel", + "resource-lock" + ], + "support": { + "issues": "https://github.com/kenepa/resource-lock/issues", + "source": "https://github.com/kenepa/resource-lock/tree/2.1.3" + }, + "time": "2025-03-14T16:31:20+00:00" + }, { "name": "kirschbaum-development/eloquent-power-joins", "version": "4.2.1", @@ -11705,12 +11773,12 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": {}, + "stability-flags": [], "prefer-stable": true, "prefer-lowest": false, "platform": { "php": "^8.2" }, - "platform-dev": {}, + "platform-dev": [], "plugin-api-version": "2.6.0" } diff --git a/config/app.php b/config/app.php index 2a6b4b4..b27af5d 100644 --- a/config/app.php +++ b/config/app.php @@ -25,7 +25,7 @@ | or any other location as required by the application or its packages. */ - 'version' => '20250311', + 'version' => '20250403', /* |-------------------------------------------------------------------------- diff --git a/database/migrations/2025_04_03_194923_create_resource_lock_table.php b/database/migrations/2025_04_03_194923_create_resource_lock_table.php new file mode 100644 index 0000000..def48ec --- /dev/null +++ b/database/migrations/2025_04_03_194923_create_resource_lock_table.php @@ -0,0 +1,29 @@ +id(); + $table->timestamps(); + $table->foreignId('user_id')->constrained(); + $table->morphs('lockable'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('resource_locks'); + } +}; diff --git a/package-lock.json b/package-lock.json index 431400d..41ab04a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "topnotch_website", + "name": "order_system", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/resources/views/filament/forms/compact-repeater.blade.php b/resources/views/filament/forms/compact-repeater.blade.php index c581e62..744d8df 100644 --- a/resources/views/filament/forms/compact-repeater.blade.php +++ b/resources/views/filament/forms/compact-repeater.blade.php @@ -118,6 +118,7 @@ class="fi-fo-repeater-item divide-y divide-gray-100 rounded-xl bg-white shadow- > @if ($reorderActionIsVisible || $moveUpActionIsVisible || $moveDownActionIsVisible)