From 160f92b5426105a1135bd10fa562e186d259191e Mon Sep 17 00:00:00 2001 From: jitendra Date: Thu, 13 Sep 2018 16:34:56 +0530 Subject: [PATCH] Product detail page completed --- composer.json | 1 + composer.lock | 221 +++++++++++++++- config/app.php | 3 +- config/filesystems.php | 2 +- config/imagecache.php | 72 ++++++ config/repository.php | 244 ++++++++++++++++++ .../src/Providers/CoreServiceProvider.php | 6 +- .../src/Providers/CustomerServiceProvider.php | 6 - .../Webkul/Product/src/CacheFilters/Large.php | 14 + .../Product/src/CacheFilters/Medium.php | 14 + .../Webkul/Product/src/CacheFilters/Small.php | 14 + .../src/Product/ConfigurableOption.php | 14 +- .../Webkul/Product/src/Product/Gallery.php | 25 -- .../Product/src/Product/ProductImage.php | 72 ++++++ packages/Webkul/Shop/src/Http/routes.php | 2 +- .../product/large-product-placeholder.png | Bin 0 -> 12914 bytes .../product/meduim-product-placeholder.png | Bin 0 -> 7119 bytes .../product/small-product-placeholder.png | Bin 0 -> 2412 bytes .../Shop/src/Resources/assets/sass/app.scss | 90 ++++++- .../views/products/list/card.blade.php | 7 +- .../Resources/views/products/view.blade.php | 2 +- .../view/configurable-options.blade.php | 20 +- .../views/products/view/gallery.blade.php | 105 +++++++- .../assets/images/down-arrow-white.svg | 10 + .../assets/images/up-arrow-white.svg | 15 ++ .../Ui/src/Resources/assets/sass/app.scss | 1 + .../Ui/src/Resources/assets/sass/icons.scss | 12 + packages/Webkul/User/src/Bouncer.php | 14 + public/themes/default/assets/css/shop.css | 93 +++++-- .../product/large-product-placeholder.png | Bin 0 -> 12914 bytes .../product/meduim-product-placeholder.png | Bin 0 -> 7119 bytes .../product/small-product-placeholder.png | Bin 0 -> 2412 bytes 32 files changed, 984 insertions(+), 95 deletions(-) create mode 100644 config/imagecache.php create mode 100644 config/repository.php create mode 100644 packages/Webkul/Product/src/CacheFilters/Large.php create mode 100644 packages/Webkul/Product/src/CacheFilters/Medium.php create mode 100644 packages/Webkul/Product/src/CacheFilters/Small.php delete mode 100644 packages/Webkul/Product/src/Product/Gallery.php create mode 100644 packages/Webkul/Product/src/Product/ProductImage.php create mode 100644 packages/Webkul/Shop/src/Resources/assets/images/product/large-product-placeholder.png create mode 100644 packages/Webkul/Shop/src/Resources/assets/images/product/meduim-product-placeholder.png create mode 100644 packages/Webkul/Shop/src/Resources/assets/images/product/small-product-placeholder.png create mode 100644 packages/Webkul/Ui/src/Resources/assets/images/down-arrow-white.svg create mode 100644 packages/Webkul/Ui/src/Resources/assets/images/up-arrow-white.svg create mode 100644 public/themes/default/assets/images/product/large-product-placeholder.png create mode 100644 public/themes/default/assets/images/product/meduim-product-placeholder.png create mode 100644 public/themes/default/assets/images/product/small-product-placeholder.png diff --git a/composer.json b/composer.json index 48d0cd2dd..5bbba23f3 100644 --- a/composer.json +++ b/composer.json @@ -12,6 +12,7 @@ "dimsav/laravel-translatable": "^9.0", "fideloper/proxy": "^4.0", "intervention/image": "^2.4", + "intervention/imagecache": "^2.3", "kalnoy/nestedset": "^4.3", "laravel/framework": "5.6.*", "laravel/tinker": "^1.0", diff --git a/composer.lock b/composer.lock index cb287d95e..ec992ced6 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": "ee788a0a8a86526cd58b0b4853a45c06", + "content-hash": "c0c2a23aa2502c590b2ccf7975329ce1", "packages": [ { "name": "commerceguys/intl", @@ -600,6 +600,59 @@ ], "time": "2018-05-29T14:19:03+00:00" }, + { + "name": "intervention/imagecache", + "version": "2.3.3", + "source": { + "type": "git", + "url": "https://github.com/Intervention/imagecache.git", + "reference": "7936b90e695daee1aafbd25221815352ef97bcbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/imagecache/zipball/7936b90e695daee1aafbd25221815352ef97bcbc", + "reference": "7936b90e695daee1aafbd25221815352ef97bcbc", + "shasum": "" + }, + "require": { + "illuminate/cache": "~4|~5", + "illuminate/filesystem": "~4|~5", + "intervention/image": "dev-master|~2,>=2.2.0", + "jeremeamia/superclosure": "~1|~2", + "php": ">=5.3.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.2", + "phpunit/phpunit": "3.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Intervention\\Image\\": "src/Intervention/Image" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@olivervogel.net", + "homepage": "http://olivervogel.net/" + } + ], + "description": "Caching extension for the Intervention Image Class", + "homepage": "http://image.intervention.io", + "keywords": [ + "cache", + "gd", + "image", + "imagick", + "laravel" + ], + "time": "2015-09-22T15:22:47+00:00" + }, { "name": "jakub-onderka/php-console-color", "version": "0.1", @@ -752,6 +805,64 @@ ], "time": "2018-05-16T11:53:55+00:00" }, + { + "name": "jeremeamia/SuperClosure", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/jeremeamia/super_closure.git", + "reference": "5707d5821b30b9a07acfb4d76949784aaa0e9ce9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jeremeamia/super_closure/zipball/5707d5821b30b9a07acfb4d76949784aaa0e9ce9", + "reference": "5707d5821b30b9a07acfb4d76949784aaa0e9ce9", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^1.2|^2.0|^3.0|^4.0", + "php": ">=5.4", + "symfony/polyfill-php56": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "SuperClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia", + "role": "Developer" + } + ], + "description": "Serialize Closure objects, including their context and binding", + "homepage": "https://github.com/jeremeamia/super_closure", + "keywords": [ + "closure", + "function", + "lambda", + "parser", + "serializable", + "serialize", + "tokenizer" + ], + "time": "2018-03-21T22:21:57+00:00" + }, { "name": "kalnoy/nestedset", "version": "v4.3.2", @@ -2580,6 +2691,62 @@ ], "time": "2018-04-26T10:06:28+00:00" }, + { + "name": "symfony/polyfill-php56", + "version": "v1.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php56.git", + "reference": "7b4fc009172cc0196535b0328bd1226284a28000" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/7b4fc009172cc0196535b0328bd1226284a28000", + "reference": "7b4fc009172cc0196535b0328bd1226284a28000", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-util": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php56\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2018-08-06T14:22:27+00:00" + }, { "name": "symfony/polyfill-php72", "version": "v1.8.0", @@ -2635,6 +2802,58 @@ ], "time": "2018-04-26T10:06:28+00:00" }, + { + "name": "symfony/polyfill-util", + "version": "v1.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-util.git", + "reference": "8e15d04ba3440984d23e7964b2ee1d25c8de1581" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/8e15d04ba3440984d23e7964b2ee1d25c8de1581", + "reference": "8e15d04ba3440984d23e7964b2ee1d25c8de1581", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Util\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony utilities for portability of PHP codes", + "homepage": "https://symfony.com", + "keywords": [ + "compat", + "compatibility", + "polyfill", + "shim" + ], + "time": "2018-08-06T14:22:27+00:00" + }, { "name": "symfony/process", "version": "v4.1.2", diff --git a/config/app.php b/config/app.php index d34452c5f..d9aa90898 100644 --- a/config/app.php +++ b/config/app.php @@ -238,7 +238,8 @@ return [ 'View' => Illuminate\Support\Facades\View::class, 'Datagrid' => Webkul\Ui\DataGrid\Facades\DataGrid::class, 'ProductGrid' => Webkul\Ui\DataGrid\Facades\ProductGrid::class, - 'Image' => Intervention\Image\Facades\Image::class + 'Image' => Intervention\Image\Facades\Image::class, + 'Core' => Webkul\Core\Facades\Core::class ], ]; diff --git a/config/filesystems.php b/config/filesystems.php index 25a84a4bd..b36f4c121 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -51,7 +51,7 @@ return [ 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), - 'url' => env('APP_URL').'/public/storage', + 'url' => env('APP_URL') . '/public/storage', 'visibility' => 'public', ], diff --git a/config/imagecache.php b/config/imagecache.php new file mode 100644 index 000000000..83dae729f --- /dev/null +++ b/config/imagecache.php @@ -0,0 +1,72 @@ + 'cache', + + /* + |-------------------------------------------------------------------------- + | Storage paths + |-------------------------------------------------------------------------- + | + | The following paths will be searched for the image filename, submited + | by URI. + | + | Define as many directories as you like. + | + */ + + 'paths' => array( + storage_path('app/public'), + public_path('storage') + ), + + /* + |-------------------------------------------------------------------------- + | Manipulation templates + |-------------------------------------------------------------------------- + | + | Here you may specify your own manipulation filter templates. + | The keys of this array will define which templates + | are available in the URI: + | + | {route}/{template}/{filename} + | + | The values of this array will define which filter class + | will be applied, by its fully qualified name. + | + */ + + 'templates' => array( + 'small' => 'Webkul\Product\CacheFilters\Small', + 'medium' => 'Webkul\Product\CacheFilters\Medium', + 'large' => 'Webkul\Product\CacheFilters\Large', + ), + + /* + |-------------------------------------------------------------------------- + | Image Cache Lifetime + |-------------------------------------------------------------------------- + | + | Lifetime in minutes of the images handled by the imagecache route. + | + */ + + 'lifetime' => 1, + // 'lifetime' => 43200, + +); diff --git a/config/repository.php b/config/repository.php new file mode 100644 index 000000000..a251120c6 --- /dev/null +++ b/config/repository.php @@ -0,0 +1,244 @@ + [ + 'limit' => 15 + ], + + /* + |-------------------------------------------------------------------------- + | Fractal Presenter Config + |-------------------------------------------------------------------------- + | + + Available serializers: + ArraySerializer + DataArraySerializer + JsonApiSerializer + + */ + 'fractal' => [ + 'params' => [ + 'include' => 'include' + ], + 'serializer' => League\Fractal\Serializer\DataArraySerializer::class + ], + + /* + |-------------------------------------------------------------------------- + | Cache Config + |-------------------------------------------------------------------------- + | + */ + 'cache' => [ + /* + |-------------------------------------------------------------------------- + | Cache Status + |-------------------------------------------------------------------------- + | + | Enable or disable cache + | + */ + 'enabled' => false, + + /* + |-------------------------------------------------------------------------- + | Cache Minutes + |-------------------------------------------------------------------------- + | + | Time of expiration cache + | + */ + 'minutes' => 30, + + /* + |-------------------------------------------------------------------------- + | Cache Repository + |-------------------------------------------------------------------------- + | + | Instance of Illuminate\Contracts\Cache\Repository + | + */ + 'repository' => 'cache', + + /* + |-------------------------------------------------------------------------- + | Cache Clean Listener + |-------------------------------------------------------------------------- + | + | + | + */ + 'clean' => [ + + /* + |-------------------------------------------------------------------------- + | Enable clear cache on repository changes + |-------------------------------------------------------------------------- + | + */ + 'enabled' => true, + + /* + |-------------------------------------------------------------------------- + | Actions in Repository + |-------------------------------------------------------------------------- + | + | create : Clear Cache on create Entry in repository + | update : Clear Cache on update Entry in repository + | delete : Clear Cache on delete Entry in repository + | + */ + 'on' => [ + 'create' => true, + 'update' => true, + 'delete' => true, + ] + ], + + 'params' => [ + /* + |-------------------------------------------------------------------------- + | Skip Cache Params + |-------------------------------------------------------------------------- + | + | + | Ex: http://prettus.local/?search=lorem&skipCache=true + | + */ + 'skipCache' => 'skipCache' + ], + + /* + |-------------------------------------------------------------------------- + | Methods Allowed + |-------------------------------------------------------------------------- + | + | methods cacheable : all, paginate, find, findByField, findWhere, getByCriteria + | + | Ex: + | + | 'only' =>['all','paginate'], + | + | or + | + | 'except' =>['find'], + */ + 'allowed' => [ + 'only' => null, + 'except' => null + ] + ], + + /* + |-------------------------------------------------------------------------- + | Criteria Config + |-------------------------------------------------------------------------- + | + | Settings of request parameters names that will be used by Criteria + | + */ + 'criteria' => [ + /* + |-------------------------------------------------------------------------- + | Accepted Conditions + |-------------------------------------------------------------------------- + | + | Conditions accepted in consultations where the Criteria + | + | Ex: + | + | 'acceptedConditions'=>['=','like'] + | + | $query->where('foo','=','bar') + | $query->where('foo','like','bar') + | + */ + 'acceptedConditions' => [ + '=', + 'like' + ], + /* + |-------------------------------------------------------------------------- + | Request Params + |-------------------------------------------------------------------------- + | + | Request parameters that will be used to filter the query in the repository + | + | Params : + | + | - search : Searched value + | Ex: http://prettus.local/?search=lorem + | + | - searchFields : Fields in which research should be carried out + | Ex: + | http://prettus.local/?search=lorem&searchFields=name;email + | http://prettus.local/?search=lorem&searchFields=name:like;email + | http://prettus.local/?search=lorem&searchFields=name:like + | + | - filter : Fields that must be returned to the response object + | Ex: + | http://prettus.local/?search=lorem&filter=id,name + | + | - orderBy : Order By + | Ex: + | http://prettus.local/?search=lorem&orderBy=id + | + | - sortedBy : Sort + | Ex: + | http://prettus.local/?search=lorem&orderBy=id&sortedBy=asc + | http://prettus.local/?search=lorem&orderBy=id&sortedBy=desc + | + | - searchJoin: Specifies the search method (AND / OR), by default the + | application searches each parameter with OR + | EX: + | http://prettus.local/?search=lorem&searchJoin=and + | http://prettus.local/?search=lorem&searchJoin=or + | + */ + 'params' => [ + 'search' => 'search', + 'searchFields' => 'searchFields', + 'filter' => 'filter', + 'orderBy' => 'orderBy', + 'sortedBy' => 'sortedBy', + 'with' => 'with', + 'searchJoin' => 'searchJoin' + ] + ], + /* + |-------------------------------------------------------------------------- + | Generator Config + |-------------------------------------------------------------------------- + | + */ + 'generator' => [ + 'basePath' => app()->path(), + 'rootNamespace' => 'App\\', + 'stubsOverridePath' => app()->path(), + 'paths' => [ + 'models' => 'Entities', + 'repositories' => 'Repositories', + 'interfaces' => 'Repositories', + 'transformers' => 'Transformers', + 'presenters' => 'Presenters', + 'validators' => 'Validators', + 'controllers' => 'Http/Controllers', + 'provider' => 'RepositoryServiceProvider', + 'criteria' => 'Criteria' + ] + ] +]; diff --git a/packages/Webkul/Core/src/Providers/CoreServiceProvider.php b/packages/Webkul/Core/src/Providers/CoreServiceProvider.php index 08779f405..b05b4b3b4 100644 --- a/packages/Webkul/Core/src/Providers/CoreServiceProvider.php +++ b/packages/Webkul/Core/src/Providers/CoreServiceProvider.php @@ -27,9 +27,9 @@ class CoreServiceProvider extends ServiceProvider $router->aliasMiddleware('locale', Locale::class); - $this->publishes([ - __DIR__ . '/../../publishable/lang' => public_path('vendor/webkul/core/lang'), - ], 'public'); + // $this->publishes([ + // __DIR__ . '/../../publishable/lang' => public_path('vendor/webkul/core/lang'), + // ], 'public'); Validator::extend('slug', 'Webkul\Core\Contracts\Validations\Slug@passes'); diff --git a/packages/Webkul/Customer/src/Providers/CustomerServiceProvider.php b/packages/Webkul/Customer/src/Providers/CustomerServiceProvider.php index e6109be99..fedbe7294 100644 --- a/packages/Webkul/Customer/src/Providers/CustomerServiceProvider.php +++ b/packages/Webkul/Customer/src/Providers/CustomerServiceProvider.php @@ -13,12 +13,6 @@ class CustomerServiceProvider extends ServiceProvider { public function boot(Router $router) { - // include __DIR__ . '/../Http/routes.php'; - - $this->publishes([ - __DIR__ . '/../../publishable/assets' => public_path('vendor/webkul/customer/assets'), - ], 'public'); - $router->aliasMiddleware('customer', RedirectIfNotCustomer::class); $this->loadMigrationsFrom(__DIR__ . '/../Database/migrations'); diff --git a/packages/Webkul/Product/src/CacheFilters/Large.php b/packages/Webkul/Product/src/CacheFilters/Large.php new file mode 100644 index 000000000..bb71ee7f9 --- /dev/null +++ b/packages/Webkul/Product/src/CacheFilters/Large.php @@ -0,0 +1,14 @@ +resize(480, 480); + } +} \ No newline at end of file diff --git a/packages/Webkul/Product/src/CacheFilters/Medium.php b/packages/Webkul/Product/src/CacheFilters/Medium.php new file mode 100644 index 000000000..39ec33170 --- /dev/null +++ b/packages/Webkul/Product/src/CacheFilters/Medium.php @@ -0,0 +1,14 @@ +resize(280, 350); + } +} \ No newline at end of file diff --git a/packages/Webkul/Product/src/CacheFilters/Small.php b/packages/Webkul/Product/src/CacheFilters/Small.php new file mode 100644 index 000000000..a3698696c --- /dev/null +++ b/packages/Webkul/Product/src/CacheFilters/Small.php @@ -0,0 +1,14 @@ +resize(120, 120); + } +} \ No newline at end of file diff --git a/packages/Webkul/Product/src/Product/ConfigurableOption.php b/packages/Webkul/Product/src/Product/ConfigurableOption.php index b078576ba..216fd5408 100644 --- a/packages/Webkul/Product/src/Product/ConfigurableOption.php +++ b/packages/Webkul/Product/src/Product/ConfigurableOption.php @@ -3,7 +3,7 @@ namespace Webkul\Product\Product; use Webkul\Attribute\Repositories\AttributeOptionRepository as AttributeOption; -use Webkul\Product\Product\Gallery; +use Webkul\Product\Product\ProductImage; use Webkul\Product\Product\Price; class ConfigurableOption extends AbstractProduct @@ -16,11 +16,11 @@ class ConfigurableOption extends AbstractProduct protected $attributeOption; /** - * Gallery object + * ProductImage object * * @var array */ - protected $gallery; + protected $productImage; /** * Price object @@ -33,19 +33,19 @@ class ConfigurableOption extends AbstractProduct * Create a new controller instance. * * @param Webkul\Attribute\Repositories\AttributeOptionRepository $attributeOption - * @param Webkul\Product\Product\Gallery $gallery + * @param Webkul\Product\Product\ProductImage $productImage * @param Webkul\Product\Product\Price $price * @return void */ public function __construct( AttributeOption $attributeOption, - Gallery $gallery, + ProductImage $productImage, Price $price ) { $this->attributeOption = $attributeOption; - $this->gallery = $gallery; + $this->productImage = $productImage; $this->price = $price; } @@ -230,7 +230,7 @@ class ConfigurableOption extends AbstractProduct $images = []; foreach ($this->getAllowProducts($product) as $variant) { - $images[$variant->id] = $this->gallery->getImages($variant); + $images[$variant->id] = $this->productImage->getGalleryImages($variant); } return $images; diff --git a/packages/Webkul/Product/src/Product/Gallery.php b/packages/Webkul/Product/src/Product/Gallery.php deleted file mode 100644 index 7e47592c1..000000000 --- a/packages/Webkul/Product/src/Product/Gallery.php +++ /dev/null @@ -1,25 +0,0 @@ - '', - 'medium_image_url' => '', - 'large_image_url' => '', - ]; - - return $images; - } -} \ No newline at end of file diff --git a/packages/Webkul/Product/src/Product/ProductImage.php b/packages/Webkul/Product/src/Product/ProductImage.php new file mode 100644 index 000000000..1477144e9 --- /dev/null +++ b/packages/Webkul/Product/src/Product/ProductImage.php @@ -0,0 +1,72 @@ +images as $image) { + if(!Storage::has($image->path)) + continue; + + $images[] = [ + 'small_image_url' => url('cache/small/' . $image->path), + 'medium_image_url' => url('cache/medium/' . $image->path), + 'large_image_url' => url('cache/large/' . $image->path), + 'original_image_url' => url('cache/original/' . $image->path), + ]; + } + + if(!$product->parent_id && !count($images)) { + $images[] = [ + 'small_image_url' => bagisto_asset('images/product/small-product-placeholder.png'), + 'medium_image_url' => bagisto_asset('images/product/meduim-product-placeholder.png'), + 'large_image_url' => bagisto_asset('images/product/large-product-placeholder.png'), + 'original_image_url' => bagisto_asset('images/product/large-product-placeholder.png'), + ]; + } + + return $images; + } + + /** + * Get product's base image + * + * @param Product $product + * @return array + */ + public function getProductBaseImage($product) + { + $images = $product->images; + + if($images->count()) { + $image = [ + 'small_image_url' => url('cache/small/' . $images[0]->path), + 'medium_image_url' => url('cache/medium/' . $images[0]->path), + 'large_image_url' => url('cache/large/' . $images[0]->path), + 'original_image_url' => url('cache/original/' . $images[0]->path), + ]; + } else { + $image = [ + 'small_image_url' => bagisto_asset('images/product/small-product-placeholder.png'), + 'medium_image_url' => bagisto_asset('images/product/meduim-product-placeholder.png'), + 'large_image_url' => bagisto_asset('images/product/large-product-placeholder.png'), + 'original_image_url' => bagisto_asset('images/product/large-product-placeholder.png'), + ]; + } + + return $image; + } +} \ No newline at end of file diff --git a/packages/Webkul/Shop/src/Http/routes.php b/packages/Webkul/Shop/src/Http/routes.php index 40a1d73aa..846bf14c7 100644 --- a/packages/Webkul/Shop/src/Http/routes.php +++ b/packages/Webkul/Shop/src/Http/routes.php @@ -24,7 +24,7 @@ Route::group(['middleware' => ['web']], function () { 'view' => 'shop::products.reviews.create' ])->name('shop.reviews.create'); - Route::post('/reviews/create/{slug}', 'Webkul\Core\Http\Controllers\ReviewController@store')->defaults('_config', [ + Route::post('/reviews/create/{slug}', 'Webkul\Shop\Http\Controllers\ReviewController@store')->defaults('_config', [ 'redirect' => 'admin.reviews.index' ])->name('admin.reviews.store'); diff --git a/packages/Webkul/Shop/src/Resources/assets/images/product/large-product-placeholder.png b/packages/Webkul/Shop/src/Resources/assets/images/product/large-product-placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..e839910ccb43d249c2259100efa6929803ad7bd1 GIT binary patch literal 12914 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 S0sln8pnuWm!uxX$_x=N20pnc& literal 0 HcmV?d00001 diff --git a/packages/Webkul/Shop/src/Resources/assets/images/product/meduim-product-placeholder.png b/packages/Webkul/Shop/src/Resources/assets/images/product/meduim-product-placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..0aa66dc5200c0a9b9e96da022f344e7db1004be2 GIT binary patch literal 7119 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 VR;Si}W&EK7=xP~hR;Xj~{|2acysrQN literal 0 HcmV?d00001 diff --git a/packages/Webkul/Shop/src/Resources/assets/images/product/small-product-placeholder.png b/packages/Webkul/Shop/src/Resources/assets/images/product/small-product-placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..8526a85f5f5735a9ce2894e304d9ae3dc4fdc259 GIT binary patch literal 2412 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 literal 0 HcmV?d00001 diff --git a/packages/Webkul/Shop/src/Resources/assets/sass/app.scss b/packages/Webkul/Shop/src/Resources/assets/sass/app.scss index e9c6882b4..e386d89fd 100644 --- a/packages/Webkul/Shop/src/Resources/assets/sass/app.scss +++ b/packages/Webkul/Shop/src/Resources/assets/sass/app.scss @@ -483,10 +483,18 @@ section.slider-block { .product-card { - .product-image img { - align-self: center; - width: 100%; - margin-bottom: 14px; + .product-image { + background: #F2F2F2; + margin-bottom: 10px; + // width: 380px; + // max-width: 100%; + // text-align: center; + + img { + align-self: center; + width: 100%; + margin-bottom: 14px; + } } .product-name { @@ -995,25 +1003,80 @@ section.product-detail { } div.layouter { - display:flex; - flex-flow: row; - margin-top: 21px; + margin-top: 20px; + margin-bottom: 20px; + display: inline-block; + width: 100%; div.product-image-group { - display:flex; - flex-direction: row; - justify-content: flex-start; - margin-right: 2.5%; + width: 43%; + float: left; + min-height: 1px; + position: relative; - .side-group { + .thumb-list { display: flex; flex-direction: column; margin-right: 4px; + height: 480px; + overflow: hidden; + position: relative; + float: left; + + .thumb-frame { + border: 2px solid transparent; + background: #F2F2F2; + width: 120px; + height: 120px; + + &.active { + border-color: #979797; + } + + img { + width: 100%; + height: 100%; + } + } + + .gallery-control { + width: 100%; + position: absolute; + text-align: center; + cursor: pointer; + z-index: 1; + + .overlay { + opacity: 0.3; + background: #000000; + width: 100%; + height: 18px; + position: absolute; + left: 0; + z-index: -1; + } + + .icon { + z-index: 2; + } + + &.top { + top: 0; + } + + &.bottom { + bottom: 0; + } + } } .product-hero-image { display: block; position: relative; + background: #F2F2F2; + width: 480px; + max-height: 480px; + float: left; .wishlist { position: absolute; @@ -1030,6 +1093,9 @@ section.product-detail { } .details { + width: 57%; + float: left; + .product-price { margin-bottom: 14px; } diff --git a/packages/Webkul/Shop/src/Resources/views/products/list/card.blade.php b/packages/Webkul/Shop/src/Resources/views/products/list/card.blade.php index 4a8597386..fcf42cf63 100644 --- a/packages/Webkul/Shop/src/Resources/views/products/list/card.blade.php +++ b/packages/Webkul/Shop/src/Resources/views/products/list/card.blade.php @@ -1,7 +1,12 @@
+ + @inject ('productImageHelper', 'Webkul\Product\Product\ProductImage') + + getProductBaseImage($product); ?> + diff --git a/packages/Webkul/Shop/src/Resources/views/products/view.blade.php b/packages/Webkul/Shop/src/Resources/views/products/view.blade.php index 67807dfdc..d39dd2bb1 100644 --- a/packages/Webkul/Shop/src/Resources/views/products/view.blade.php +++ b/packages/Webkul/Shop/src/Resources/views/products/view.blade.php @@ -10,7 +10,7 @@
-
+ @csrf() diff --git a/packages/Webkul/Shop/src/Resources/views/products/view/configurable-options.blade.php b/packages/Webkul/Shop/src/Resources/views/products/view/configurable-options.blade.php index fceefd15f..1b545815c 100644 --- a/packages/Webkul/Shop/src/Resources/views/products/view/configurable-options.blade.php +++ b/packages/Webkul/Shop/src/Resources/views/products/view/configurable-options.blade.php @@ -16,7 +16,7 @@ @@ -43,10 +43,14 @@ selectedProductId: '', - simpleProduct: null + simpleProduct: null, + + galleryImages: [] }), created () { + this.galleryImages = galleryImages.slice(0) + var config = @json($config); var childAttributes = this.childAttributes, @@ -228,7 +232,17 @@ }, changeProductImages () { - console.log(this.config.variant_images[this.simpleProduct]) + galleryImages.splice(0, galleryImages.length) + + this.galleryImages.forEach(function(image) { + galleryImages.push(image) + }); + + if(this.simpleProduct) { + this.config.variant_images[this.simpleProduct].forEach(function(image) { + galleryImages.unshift(image) + }); + } }, } diff --git a/packages/Webkul/Shop/src/Resources/views/products/view/gallery.blade.php b/packages/Webkul/Shop/src/Resources/views/products/view/gallery.blade.php index 285dd080f..c9616f8ab 100644 --- a/packages/Webkul/Shop/src/Resources/views/products/view/gallery.blade.php +++ b/packages/Webkul/Shop/src/Resources/views/products/view/gallery.blade.php @@ -1,25 +1,104 @@ +@inject ('productImageHelper', 'Webkul\Product\Product\ProductImage') + +getGalleryImages($product); ?> +
-
- - - - -
+ + + @include ('shop::products.add-to') -
- - - -
@push('scripts') + + diff --git a/packages/Webkul/Ui/src/Resources/assets/images/down-arrow-white.svg b/packages/Webkul/Ui/src/Resources/assets/images/down-arrow-white.svg new file mode 100644 index 000000000..b80e0ae72 --- /dev/null +++ b/packages/Webkul/Ui/src/Resources/assets/images/down-arrow-white.svg @@ -0,0 +1,10 @@ + + + + down-arrow + Created with Sketch. + + + + + \ No newline at end of file diff --git a/packages/Webkul/Ui/src/Resources/assets/images/up-arrow-white.svg b/packages/Webkul/Ui/src/Resources/assets/images/up-arrow-white.svg new file mode 100644 index 000000000..468ad116f --- /dev/null +++ b/packages/Webkul/Ui/src/Resources/assets/images/up-arrow-white.svg @@ -0,0 +1,15 @@ + + + + up-arrow + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/packages/Webkul/Ui/src/Resources/assets/sass/app.scss b/packages/Webkul/Ui/src/Resources/assets/sass/app.scss index 289562d52..4527e90d1 100644 --- a/packages/Webkul/Ui/src/Resources/assets/sass/app.scss +++ b/packages/Webkul/Ui/src/Resources/assets/sass/app.scss @@ -988,6 +988,7 @@ h2 { background-image: url("../images/placeholder-icon.svg"); background-repeat: no-repeat; background-position: center; + margin-bottom: 20px; img.preview { width: 100%; diff --git a/packages/Webkul/Ui/src/Resources/assets/sass/icons.scss b/packages/Webkul/Ui/src/Resources/assets/sass/icons.scss index 75a8828e5..b87fec187 100644 --- a/packages/Webkul/Ui/src/Resources/assets/sass/icons.scss +++ b/packages/Webkul/Ui/src/Resources/assets/sass/icons.scss @@ -164,6 +164,18 @@ height: 24px; } +.arrow-down-white-icon { + background-image: url("../images/down-arrow-white.svg"); + width: 17px; + height: 13px; +} + +.arrow-up-white-icon { + background-image: url("../images/up-arrow-white.svg"); + width: 17px; + height: 13px; +} + .active { .dashboard-icon { background-image: url("../images/Icon-Dashboard-Active.svg"); diff --git a/packages/Webkul/User/src/Bouncer.php b/packages/Webkul/User/src/Bouncer.php index 0a22518d9..4d3196e31 100644 --- a/packages/Webkul/User/src/Bouncer.php +++ b/packages/Webkul/User/src/Bouncer.php @@ -4,6 +4,20 @@ namespace Webkul\User; class Bouncer { + /** + * Checks if user has permission for certain action + * + * @param String $permission + * @return Void + */ + public static function hasPermission($permission) + { + if(!auth()->check() || !auth()->user()->hasPermission($permission)) + return false; + + return true; + } + /** * Checks if user allowed or not for certain action * diff --git a/public/themes/default/assets/css/shop.css b/public/themes/default/assets/css/shop.css index 2eb091bee..4b648ebe8 100644 --- a/public/themes/default/assets/css/shop.css +++ b/public/themes/default/assets/css/shop.css @@ -570,6 +570,11 @@ section.slider-block div.slider-content div.slider-control .light-right-icon { justify-content: center; } +.main-container-wrapper .product-card .product-image { + background: #F2F2F2; + margin-bottom: 10px; +} + .main-container-wrapper .product-card .product-image img { -ms-flex-item-align: center; align-self: center; @@ -1105,31 +1110,20 @@ section.product-detail div.category-breadcrumbs { } section.product-detail div.layouter { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row; - flex-flow: row; - margin-top: 21px; + margin-top: 20px; + margin-bottom: 20px; + display: inline-block; + width: 100%; } section.product-detail div.layouter div.product-image-group { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - margin-right: 2.5%; + width: 43%; + float: left; + min-height: 1px; + position: relative; } -section.product-detail div.layouter div.product-image-group .side-group { +section.product-detail div.layouter div.product-image-group .thumb-list { display: -webkit-box; display: -ms-flexbox; display: flex; @@ -1138,11 +1132,65 @@ section.product-detail div.layouter div.product-image-group .side-group { -ms-flex-direction: column; flex-direction: column; margin-right: 4px; + height: 480px; + overflow: hidden; + position: relative; + float: left; +} + +section.product-detail div.layouter div.product-image-group .thumb-list .thumb-frame { + border: 2px solid transparent; + background: #F2F2F2; + width: 120px; + height: 120px; +} + +section.product-detail div.layouter div.product-image-group .thumb-list .thumb-frame.active { + border-color: #979797; +} + +section.product-detail div.layouter div.product-image-group .thumb-list .thumb-frame img { + width: 100%; + height: 100%; +} + +section.product-detail div.layouter div.product-image-group .thumb-list .gallery-control { + width: 100%; + position: absolute; + text-align: center; + cursor: pointer; + z-index: 1; +} + +section.product-detail div.layouter div.product-image-group .thumb-list .gallery-control .overlay { + opacity: 0.3; + background: #000000; + width: 100%; + height: 18px; + position: absolute; + left: 0; + z-index: -1; +} + +section.product-detail div.layouter div.product-image-group .thumb-list .gallery-control .icon { + z-index: 2; +} + +section.product-detail div.layouter div.product-image-group .thumb-list .gallery-control.top { + top: 0; +} + +section.product-detail div.layouter div.product-image-group .thumb-list .gallery-control.bottom { + bottom: 0; } section.product-detail div.layouter div.product-image-group .product-hero-image { display: block; position: relative; + background: #F2F2F2; + width: 480px; + max-height: 480px; + float: left; } section.product-detail div.layouter div.product-image-group .product-hero-image .wishlist { @@ -1157,6 +1205,11 @@ section.product-detail div.layouter div.product-image-group .product-hero-image right: 45px; } +section.product-detail div.layouter .details { + width: 57%; + float: left; +} + section.product-detail div.layouter .details .product-price { margin-bottom: 14px; } diff --git a/public/themes/default/assets/images/product/large-product-placeholder.png b/public/themes/default/assets/images/product/large-product-placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..e839910ccb43d249c2259100efa6929803ad7bd1 GIT binary patch literal 12914 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 S0sln8pnuWm!uxX$_x=N20pnc& literal 0 HcmV?d00001 diff --git a/public/themes/default/assets/images/product/meduim-product-placeholder.png b/public/themes/default/assets/images/product/meduim-product-placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..0aa66dc5200c0a9b9e96da022f344e7db1004be2 GIT binary patch literal 7119 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 VR;Si}W&EK7=xP~hR;Xj~{|2acysrQN literal 0 HcmV?d00001 diff --git a/public/themes/default/assets/images/product/small-product-placeholder.png b/public/themes/default/assets/images/product/small-product-placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..8526a85f5f5735a9ce2894e304d9ae3dc4fdc259 GIT binary patch literal 2412 zcmbW3Su`667snGxNh7h82&%TRHkN2@)wB&_>`IGTqP8^A+ES{BsYc!NB}oT_HJnrXCszgm45diX)T%DUMz@S3+nEnl+fzD|B{dB zXY|+5t8%ONeht}75)xgnT#Jf{@htJQ`NY`z`Z4mm;@-i&XBY2r6A@y3^V2JQY-ngj z`SpazYflJ)rOYkwa`5>6(jHX7D zNMGDi6BL@W{!vEDj`P}XRu(QuUyZ~W{SxtW{A zyD_fF5o-6;6I4$&3jOdTDm3(Bm$a;S0Ndv@7J+UPL}Z)Ejt@flrp`)AKPmpHJ(CZzE$*N3ebAu&&&T&qfJDq`4RxMjpnb#u!0u) zBl#>|eqaf?e*;f$^^?o^NPo_yxX)a@iJuEb3RnAinm&G8b_WTeS9>8+B)3Z= zPi`XGwUIU7yE2eA$Sy0N4&=O2Xjk09o)h$9i3#mfXQw&BTvP2%08**9Rq{gI!OJ9N zjlU=xRV^HEZ|^Hs8}3Bvs%aOQzck)-R#9~}-(vnEOmaQWyRA0{Vb14rxpq35sqfB4 zF88kvfD~q1(<5jqa=nM2uAOj*ekR?!YgXrX#lp-1&UUHQ{goyy(0!7GlCPdHaW$V4 zv(!ie%oO{$$ej`+=afIN3w>THTx(S2A{59uN%b3$xh|R!L2qD8yvu0RZnC~U2$^a) z(AM>m))_SQ5Kf-{7bc6Q<-&t%&zc1>KVV^+B2H+P!2aluFHl}W!e}r#ho9apA6~*1 zl=DMBUBZ^k&d!De2KITJ7_452ndb3$^<9o5(9Hgsc!hJ6;ozVkjo%0gV?&;h{XN^k zo|QG--b#Qx0-cYEUL|bp??!eh*Ke;(o8LoRk5^)-Ifg+>-JhI8T!g#6Hf;BlhL3hwt2kPE`QL;~%l2mce z_~+2HZ_@2&3<*MZKj#Usmpdm4M1Y3=__}bgluye89vb~jB>INTctv9m$}k`|EE%9P zyN##Zo5q*w&`4phzKCY$%YC%SFnbTcmm40mbx0=-^Q&zgy10+?U*YSF^yXbLh26&~ zW0^Y###3-dUk>CHakq-P)bkZ<^YB7-d%2)m_-kUs&%k;8y{5 zLk9JJk6;uv)V(|0^OjqyIWUfkiCmUbCF$j15AR#)>FzFrXX{tLGPYu)+spsrq#F7T z1*083RbGU6p|j{#-l)?WkeWr;Gud46cP z<+OPX=S&Eu&{skW#!|kV%`YP^3ShDR8+@nuV4oiH@wqahUBrN~T7coyc?N+YQYf59 z=n@zZv$W{goj(yp?%Znx7+kwE;hTYBv@Eb<6mK!2B) zuqy^v3SX#Ri1!Ayv#rxF|4J=4Od^Y_qH2RC(8f>Om6 z$#$ssW@MC|2^qo?>27$W{eKF}x2x`{na>xc^2XS}-ePL&cZ>;ZCTlF^(S++~=M&~B zbFQBK7w|n42EWN!dw7_s!N>oEH%#pL_B{S!8~4)$+$&{{>wzW2Bu~8&d1{Z}R5Hm0 ztx(Rq^cStm-rHWIbJ6}05sjUJb1Qy-zKxIN27FCxY-}Xxio+XG4SO9DFu!_`_<%tMX(HpFe=37d*|TzR#s^!P8nPrxilbLoechz02(qmYTY+mVrfqhqH#?k&Hg z*)p%TG&PO3#%wu=XM~wNKmY0&OHx;P=x^~F3E@lircw_R%0^UVB{X2I`EISTyRPtV zOH0di2^eRz)@xyX3zV(Jz2T&gp7y3J>LIl@#izs#Z)>Ur?^6_y33ie>K9rB0Hd%z~ zQ4Ox?3Ji4}ReKj8RU;8-GMpN~eBhuZ3#4}!o*K9{fJ6Rdob1LaJCFOKIMPu4b2(E2 zlXA#9<$9j44Gdkf43^NGSX|My%XFqh=DEOuz(u!TaQdZ$*zYT*X{Xiw{UgZp<5b=o znak>DS(+ox^ zNmUS)eWFk$zt{~mMDTvld_A!z;j$X#82DnroV7T{qFmj2C5OtsTa*(sB=eAe+}{F1 zoP3%b1g5|I5qvLG(pc>rj!q5;K9#*O#ZCRhrCMFfT68JsW#+!gRcbk=e5pVQOkWLB z4ZAmGbLdjUivLxJM3jYvz;q56P5$c>n+a literal 0 HcmV?d00001