Skip to content

Commit

Permalink
Added the link editing feature + bump minimum VFW requirement to v4.1
Browse files Browse the repository at this point in the history
  • Loading branch information
fulopattila122 committed May 29, 2024
1 parent 073eab7 commit e78219a
Show file tree
Hide file tree
Showing 23 changed files with 494 additions and 2 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ jobs:
strategy:
matrix:
php: ['8.2', '8.3']
laravel: ['10.43', '10.48', '11.0']
laravel: ['10.43', '10.48', '11.0', '11.9']
name: PHP ${{ matrix.php }} Laravel ${{ matrix.laravel }}
steps:
- name: Checkout
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ composer.lock
build
tests/temp
/.phpunit.result.cache
/.phpunit.cache/
2 changes: 2 additions & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
##### 2024-XX-YY

- Fixed the impossibility to fold out subtaxons
- Added the link editing feature on product forms
- Changed the minimum Vanilo requirement to v4.1

## 4.0.0
##### 2024-05-06
Expand Down
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"konekt/gears": "^1.12",
"konekt/concord": "^1.15",
"spatie/laravel-medialibrary": "^11.0",
"vanilo/framework": "^4.0"
"vanilo/framework": "^4.1"
},
"autoload": {
"psr-4": {
Expand Down
29 changes: 29 additions & 0 deletions src/Contracts/Requests/CreateLink.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

declare(strict_types=1);

/**
* Contains the CreateLink interface.
*
* @copyright Copyright (c) 2024 Vanilo UG
* @author Attila Fulop
* @license MIT
* @since 2024-05-29
*
*/

namespace Vanilo\Admin\Contracts\Requests;

use Illuminate\Database\Eloquent\Model;
use Konekt\Concord\Contracts\BaseRequest;

interface CreateLink extends BaseRequest
{
public function getSourceModel(): ?Model;

public function urlOfModel(Model $model): ?string;

public function getTargetModel(): ?Model;

public function getLinkType(): string;
}
23 changes: 23 additions & 0 deletions src/Contracts/Requests/CreateLinkForm.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

declare(strict_types=1);

/**
* Contains the CreateLinkForm interface.
*
* @copyright Copyright (c) 2024 Vanilo UG
* @author Attila Fulop
* @license MIT
* @since 2024-05-29
*
*/

namespace Vanilo\Admin\Contracts\Requests;

use Illuminate\Database\Eloquent\Model;
use Konekt\Concord\Contracts\BaseRequest;

interface CreateLinkForm extends BaseRequest
{
public function getSourceModel(): ?Model;
}
52 changes: 52 additions & 0 deletions src/Http/Controllers/LinkController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php

declare(strict_types=1);

/**
* Contains the LinkController class.
*
* @copyright Copyright (c) 2024 Vanilo UG
* @author Attila Fulop
* @license MIT
* @since 2024-05-29
*
*/

namespace Vanilo\Admin\Http\Controllers;

use Konekt\AppShell\Http\Controllers\BaseController;
use Vanilo\Admin\Contracts\Requests\CreateLink;
use Vanilo\Admin\Contracts\Requests\CreateLinkForm;
use Vanilo\Links\Contracts\LinkGroupItem;
use Vanilo\Links\Models\LinkTypeProxy;
use Vanilo\Links\Query\Establish;

class LinkController extends BaseController
{
public function create(CreateLinkForm $request)
{
return view('vanilo::link.create', [
'sourceModel' => $request->getSourceModel(),
'linkTypes' => LinkTypeProxy::choices(false, true),
]);
}

public function store(CreateLink $request)
{
$source = $request->getSourceModel();
Establish::a($request->getLinkType())
->link()
->between($source)
->and($request->getTargetModel());

return redirect()->to($request->urlOfModel($source));
}

public function destroy(LinkGroupItem $linkGroupItem)
{
$linkGroupItem->delete();
flash()->success(__('The link has been deleted.'));

return redirect()->back();
}
}
2 changes: 2 additions & 0 deletions src/Http/Controllers/MasterProductController.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
use Vanilo\Admin\Contracts\Requests\CreateMasterProduct;
use Vanilo\Admin\Contracts\Requests\UpdateMasterProduct;
use Vanilo\Category\Models\TaxonomyProxy;
use Vanilo\Links\Models\LinkTypeProxy;
use Vanilo\MasterProduct\Contracts\MasterProduct;
use Vanilo\MasterProduct\Contracts\MasterProductVariant;
use Vanilo\MasterProduct\Models\MasterProductProxy;
Expand Down Expand Up @@ -49,6 +50,7 @@ public function show(MasterProduct $product)
'taxonomies' => TaxonomyProxy::all(),
'properties' => PropertyProxy::all(),
'multiChannelEnabled' => Features::isMultiChannelEnabled(),
'linkTypes' => LinkTypeProxy::choices(false, true),
]);
}

Expand Down
2 changes: 2 additions & 0 deletions src/Http/Controllers/MasterProductVariantController.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use Konekt\AppShell\Http\Controllers\BaseController;
use Vanilo\Admin\Contracts\Requests\CreateMasterProductVariant;
use Vanilo\Admin\Contracts\Requests\UpdateMasterProductVariant;
use Vanilo\Links\Models\LinkTypeProxy;
use Vanilo\MasterProduct\Contracts\MasterProduct;
use Vanilo\MasterProduct\Contracts\MasterProductVariant;
use Vanilo\MasterProduct\Models\MasterProductVariantProxy;
Expand Down Expand Up @@ -85,6 +86,7 @@ public function edit(MasterProduct $masterProduct, MasterProductVariant $masterP
'variant' => $masterProductVariant,
'states' => ProductStateProxy::choices(),
'properties' => PropertyProxy::all(),
'linkTypes' => LinkTypeProxy::choices(false, true),
]);
}

Expand Down
4 changes: 4 additions & 0 deletions src/Http/Controllers/ProductController.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
use Vanilo\Admin\Contracts\Requests\CreateProduct;
use Vanilo\Admin\Contracts\Requests\UpdateProduct;
use Vanilo\Category\Models\TaxonomyProxy;
use Vanilo\Links\Contracts\LinkType;
use Vanilo\Links\Models\LinkGroupItemProxy;
use Vanilo\Links\Models\LinkTypeProxy;
use Vanilo\MasterProduct\Models\MasterProductProxy;
use Vanilo\Product\Contracts\Product;
use Vanilo\Product\Models\ProductProxy;
Expand Down Expand Up @@ -115,6 +118,7 @@ public function show(Product $product)
'taxonomies' => TaxonomyProxy::all(),
'properties' => PropertyProxy::all(),
'multiChannelEnabled' => Features::isMultiChannelEnabled(),
'linkTypes' => LinkTypeProxy::choices(false, true),
]);
}

Expand Down
77 changes: 77 additions & 0 deletions src/Http/Requests/CreateLink.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<?php

declare(strict_types=1);

/**
* Contains the CreateLink class.
*
* @copyright Copyright (c) 2024 Vanilo UG
* @author Attila Fulop
* @license MIT
* @since 2024-05-29
*
*/

namespace Vanilo\Admin\Http\Requests;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Vanilo\Admin\Contracts\Requests\CreateLink as CreateLinkContract;
use Vanilo\Links\Models\LinkTypeProxy;
use Vanilo\Product\Contracts\Product;

class CreateLink extends FormRequest implements CreateLinkContract
{
use HasSourceModel;

public function rules(): array
{
return [
'link_type' => 'required|string|exclude_with:link_type_to_create|exists:link_types,slug',
'link_type_to_create' => 'sometimes|string|min:1|max:255',
'source_type' => ['sometimes', 'nullable', 'string', Rule::in(CreateLinkForm::$acceptedTypes)],
'source_id' => 'required|numeric',
'target_type' => ['sometimes', 'nullable', 'string', Rule::in(CreateLinkForm::$acceptedTypes)],
'target_id' => 'required|numeric',
];
}

public function urlOfModel(Model $model): ?string
{
return match (true) {
is_master_product($model) => route('vanilo.admin.master_product.show', $model),
is_master_product_variant($model) => route('vanilo.admin.master_product_variant.edit', $model),
$model instanceof Product => route('vanilo.admin.product.show', $model),
default => null,
};
}

public function getTargetModel(): ?Model
{
if (null === $class = $this->resolveModelClass($this->input('target_type'))) {
return null;
}

return $class::find($this->input('target_id'));
}

public function getLinkType(): string
{
if ($this->has('link_type_to_create')) {
$linkType = LinkTypeProxy::create([
'name' => $this->input('link_type_to_create'),
'is_active' => true,
]);

return $linkType->slug;
}

return $this->input('link_type');
}

public function authorize()
{
return true;
}
}
39 changes: 39 additions & 0 deletions src/Http/Requests/CreateLinkForm.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

declare(strict_types=1);

/**
* Contains the CreateLinkForm class.
*
* @copyright Copyright (c) 2024 Vanilo UG
* @author Attila Fulop
* @license MIT
* @since 2024-05-29
*
*/

namespace Vanilo\Admin\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Vanilo\Admin\Contracts\Requests\CreateLinkForm as CreateLinkFormContract;

class CreateLinkForm extends FormRequest implements CreateLinkFormContract
{
use HasSourceModel;

public static array $acceptedTypes = ['product', 'master_product', 'master_product_variant'];

public function rules(): array
{
return [
'source_type' => ['sometimes', 'nullable', 'string', Rule::in(self::$acceptedTypes)],
'source_id' => 'required|numeric',
];
}

public function authorize(): bool
{
return true;
}
}
32 changes: 32 additions & 0 deletions src/Http/Requests/HasSourceModel.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

declare(strict_types=1);

/**
* Contains the HasSourceModel trait.
*
* @copyright Copyright (c) 2024 Vanilo UG
* @author Attila Fulop
* @license MIT
* @since 2024-05-29
*
*/

namespace Vanilo\Admin\Http\Requests;

use Illuminate\Database\Eloquent\Model;
use Vanilo\Product\Contracts\Product;

trait HasSourceModel
{
use ResolvesModelClass;

public function getSourceModel(): ?Model
{
if (null === $class = $this->resolveModelClass($this->input('source_type'))) {
return null;
}

return $class::find($this->input('source_id'));
}
}
32 changes: 32 additions & 0 deletions src/Http/Requests/ResolvesModelClass.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

declare(strict_types=1);

/**
* Contains the ResolvesModelClass trait.
*
* @copyright Copyright (c) 2024 Vanilo UG
* @author Attila Fulop
* @license MIT
* @since 2024-05-29
*
*/

namespace Vanilo\Admin\Http\Requests;

use Vanilo\MasterProduct\Models\MasterProductProxy;
use Vanilo\MasterProduct\Models\MasterProductVariantProxy;
use Vanilo\Product\Models\ProductProxy;

trait ResolvesModelClass
{
protected function resolveModelClass(string $shortName): ?string
{
return match ($shortName) {
null, 'product' => ProductProxy::modelClass(),
'master_product' => MasterProductProxy::modelClass(),
'master_product_variant' => MasterProductVariantProxy::modelClass(),
default => null,
};
}
}
5 changes: 5 additions & 0 deletions src/Providers/ModuleServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
use Vanilo\Admin\Http\Requests\AssignChannels;
use Vanilo\Admin\Http\Requests\CreateCarrier;
use Vanilo\Admin\Http\Requests\CreateChannel;
use Vanilo\Admin\Http\Requests\CreateLink;
use Vanilo\Admin\Http\Requests\CreateLinkForm;
use Vanilo\Admin\Http\Requests\CreateMasterProduct;
use Vanilo\Admin\Http\Requests\CreateMasterProductVariant;
use Vanilo\Admin\Http\Requests\CreateMedia;
Expand Down Expand Up @@ -108,6 +110,8 @@ class ModuleServiceProvider extends BaseBoxServiceProvider
UpdateTaxCategory::class,
CreateTaxRate::class,
UpdateTaxRate::class,
CreateLinkForm::class,
CreateLink::class,
];

public function register(): void
Expand All @@ -127,6 +131,7 @@ public function boot()
$aclResourceMapper->addAlias('master product', 'product');
$aclResourceMapper->addAlias('master product variant', 'product');
$aclResourceMapper->addAlias('zone member', 'zone');
$aclResourceMapper->addAlias('link', 'product');

$this->registerIconExtensions();
$this->registerEnumIcons();
Expand Down
Loading

0 comments on commit e78219a

Please sign in to comment.