This commit is contained in:
shubhammehrotra.symfony@webkul.com 2020-01-10 18:01:23 +05:30
parent 835bbbbf9d
commit ca34d5873a
42 changed files with 1020 additions and 680 deletions

View File

@ -724,9 +724,9 @@
} }
.btn-add-to-cart { .btn-add-to-cart {
padding: 8px; padding: 8px !important;
color: #fff !important;
border-radius: 0px !important; border-radius: 0px !important;
color: #FFFFFF !important;
border-color: #26A37C !important; border-color: #26A37C !important;
background-color: #26A37C !important; background-color: #26A37C !important;
} }
@ -1285,7 +1285,7 @@
top: 44px; top: 44px;
z-index: 100; z-index: 100;
width: 350px; width: 350px;
left: -230px; left: -265px;
position: absolute; position: absolute;
} }
@ -1296,6 +1296,14 @@
position: relative; position: relative;
} }
#cart-modal-content .mini-cart-container {
height: 100%;
font-size: 14px;
max-height: 200px;
overflow-y: scroll;
padding: 10px 15px 0 20px;
}
#cart-modal-content .small-card-container { #cart-modal-content .small-card-container {
margin: 0; margin: 0;
width: 100%; width: 100%;
@ -1356,6 +1364,7 @@
.cart-details .cart-details-header .cart-header { .cart-details .cart-details-header .cart-header {
max-height: 45px; max-height: 45px;
margin-bottom: 20px; margin-bottom: 20px;
padding-bottom: 20px !important;
border-bottom: 2px solid #E5E5E5; border-bottom: 2px solid #E5E5E5;
} }
@ -1805,6 +1814,9 @@
.order-summary-container { .order-summary-container {
padding-top: 25px; padding-top: 25px;
height: -webkit-max-content;
height: -moz-max-content;
height: max-content;
max-width: 500px !important; max-width: 500px !important;
} }
@ -1892,6 +1904,7 @@
} }
.product-price .regular-price { .product-price .regular-price {
font-weight: 500;
margin-right: 10px; margin-right: 10px;
text-decoration: line-through; text-decoration: line-through;
} }
@ -1911,6 +1924,8 @@
.method-sticker { .method-sticker {
font-size: 13px; font-size: 13px;
padding: 4px 8px; padding: 4px 8px;
margin-right: 3px;
margin-bottom: 3px;
text-align: center; text-align: center;
border-radius: 1px; border-radius: 1px;
display: inline-block; display: inline-block;
@ -1919,13 +1934,10 @@
} }
.sidebar { .sidebar {
z-index: 1000000;
width: 230px; width: 230px;
} }
.sidebar .category-content {
margin-bottom: 10px;
}
.sidebar .category-content .category-title { .sidebar .category-content .category-title {
top: -1px; top: -1px;
font-weight: 600; font-weight: 600;
@ -1959,8 +1971,53 @@
display: none; display: none;
} }
.category-list-container {
z-index: 10;
padding: 0px !important;
background: #FFFFFF;
position: absolute !important;
-webkit-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
}
.category-list-container .category {
width: 100%;
line-height: 2.5rem;
display: inline-block;
}
.category-list-container .category span {
top: -4px;
position: relative;
}
.category-list-container li {
padding: 7px 0 5px 15px;
}
.category-list-container li:hover {
background: #ECECEC;
}
.category-list-container .sub-categories {
top: 0px;
left: 100%;
z-index: 100;
padding-top: 10px;
position: absolute;
background: #FFFFFF;
border-left: 1px solid #CCCCCC;
-webkit-box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
}
.category-list-container .sub-categories li:nth-last-of-type(1) {
margin-bottom: 10px;
}
#sidebar-level-0 { #sidebar-level-0 {
display: none; display: none;
z-index: 100000;
border-top: 1px solid #CCCCCC; border-top: 1px solid #CCCCCC;
} }
@ -2259,6 +2316,10 @@
box-shadow: none; box-shadow: none;
} }
.slides-container .VueCarousel-pagination .VueCarousel-dot {
padding: 5px !important;
}
.slides-container .VueCarousel-dot--active { .slides-container .VueCarousel-dot--active {
background-color: #26A37C !important; background-color: #26A37C !important;
} }
@ -2309,65 +2370,6 @@ body .container-margin {
margin: auto 20px; margin: auto 20px;
} }
.account-modal {
right: 10px;
z-index: 100;
width: 350px !important;
position: absolute !important;
}
.account-modal .theme-btn, .account-modal .cart-details .continue-shopping-btn, .cart-details .account-modal .continue-shopping-btn, .account-modal .account-content .account-layout .bottom-toolbar .pagination .page-item, .account-content .account-layout .bottom-toolbar .pagination .account-modal .page-item {
padding: .5rem .9rem;
}
.account-modal .modal-footer .text-left {
padding-left: 5px;
}
.category-list-container {
z-index: 10;
padding: 0px !important;
background: #FFFFFF;
position: absolute !important;
-webkit-box-shadow: inset -1px 0 0 0 #ECECEC;
box-shadow: inset -1px 0 0 0 #ECECEC;
}
.category-list-container .category {
width: 100%;
line-height: 2.5rem;
display: inline-block;
}
.category-list-container .category span {
top: -4px;
position: relative;
}
.category-list-container li {
padding: 7px 0 5px 15px;
}
.category-list-container li:hover {
background: #ECECEC;
}
.category-list-container .sub-category-container {
position: relative;
}
.category-list-container .sub-categories {
top: -40px;
left: 100%;
z-index: 100;
padding-top: 10px;
position: absolute;
background: #FFFFFF;
border-left: 1px solid #CCCCCC;
-webkit-box-shadow: inset -1px 0 0 0 #ECECEC;
box-shadow: inset -1px 0 0 0 #ECECEC;
}
.root-category-menu { .root-category-menu {
border-bottom: solid 1px #d8e6ed; border-bottom: solid 1px #d8e6ed;
} }
@ -2623,7 +2625,7 @@ header #search-form > *:focus {
/* category with custom option */ /* category with custom option */
/* hot & popular categories */ /* hot & popular categories */
.hot-categories-container .hot-category-wrapper { .hot-categories-container .hot-category-wrapper {
padding: 0 10px 15px 0; padding: 0 10px 0 0;
} }
.hot-categories-container .hot-category-wrapper .card { .hot-categories-container .hot-category-wrapper .card {
@ -2648,11 +2650,11 @@ header #search-form > *:focus {
} }
.hot-categories-container .hot-category-wrapper:nth-last-child(2) { .hot-categories-container .hot-category-wrapper:nth-last-child(2) {
padding: 15px 0 15px 0px; padding: 0 0 0 0px;
} }
.hot-categories-container .hot-category-wrapper:last-child { .hot-categories-container .hot-category-wrapper:last-child {
padding: 15px 0 15px 10px; padding: 0 0 0 10px;
} }
.hot-categories-container ul, .hot-categories-container ul,
@ -2690,8 +2692,7 @@ header #search-form > *:focus {
} }
.popular-categories-container .popular-category-wrapper .card-description { .popular-categories-container .popular-category-wrapper .card-description {
padding: 25px; padding: 10px 20px;
margin-top: 15px;
} }
.popular-categories-container .popular-category-wrapper:first-child { .popular-categories-container .popular-category-wrapper:first-child {
@ -2767,6 +2768,7 @@ header #search-form > *:focus {
.categories-sidebar-container .content-list { .categories-sidebar-container .content-list {
margin: 0; margin: 0;
width: 100%; width: 100%;
height: 42px;
text-align: left; text-align: left;
list-style: none; list-style: none;
position: relative; position: relative;
@ -2777,7 +2779,6 @@ header #search-form > *:focus {
.categories-sidebar-container .content-list ul { .categories-sidebar-container .content-list ul {
width: 100%; width: 100%;
height: 100%; height: 100%;
padding-left: 10px;
display: -webkit-inline-box; display: -webkit-inline-box;
display: -ms-inline-flexbox; display: -ms-inline-flexbox;
display: inline-flex; display: inline-flex;
@ -2789,11 +2790,15 @@ header #search-form > *:focus {
cursor: pointer; cursor: pointer;
font-size: 16px; font-size: 16px;
font-weight: 600; font-weight: 600;
padding: 8px 15px;
letter-spacing: 0; letter-spacing: 0;
position: relative; position: relative;
color: #FFFFFF; color: #FFFFFF;
text-decoration: none; text-decoration: none;
padding: 8px 20px 8px 5px; }
.categories-sidebar-container .content-list ul li:hover {
background-color: #42719a;
} }
.velocity-divide-page { .velocity-divide-page {
@ -3361,6 +3366,10 @@ body::after {
cursor: pointer; cursor: pointer;
} }
.cursor-default {
cursor: default;
}
.grey { .grey {
color: #9e9e9e; color: #9e9e9e;
} }
@ -3663,6 +3672,12 @@ body::after {
.small-card-container { .small-card-container {
cursor: pointer; cursor: pointer;
margin-bottom: 10px; margin-bottom: 10px;
margin-left: 0 !important;
margin-right: 0 !important;
}
.small-card-container .material-icons {
font-size: 16px;
} }
.small-card-container .product-image-container { .small-card-container .product-image-container {
@ -3680,6 +3695,11 @@ body::after {
padding: 10px 0 !important; padding: 10px 0 !important;
} }
.small-card-container .sticker,
.small-card-container .regular-price {
display: none;
}
.small-card-container:hover { .small-card-container:hover {
-webkit-box-shadow: 0 6px 14px 0 rgba(0, 0, 0, 0.14); -webkit-box-shadow: 0 6px 14px 0 rgba(0, 0, 0, 0.14);
box-shadow: 0 6px 14px 0 rgba(0, 0, 0, 0.14); box-shadow: 0 6px 14px 0 rgba(0, 0, 0, 0.14);
@ -3809,6 +3829,8 @@ a.default {
.scrollable { .scrollable {
max-height: 100vh; max-height: 100vh;
overflow-y: scroll; overflow-y: scroll;
scrollbar-width: none;
-ms-overflow-style: none;
} }
.scrollable::-webkit-scrollbar { .scrollable::-webkit-scrollbar {
@ -3876,8 +3898,13 @@ button[disabled] {
font-family: 'Webkul Rango' !important; font-family: 'Webkul Rango' !important;
} }
.max-height-350 {
max-height: 350px;
}
.product-detail { .product-detail {
padding-top: 20px; padding-top: 20px;
margin-bottom: 60px;
} }
.product-detail .magnifier > img { .product-detail .magnifier > img {
@ -3898,6 +3925,10 @@ button[disabled] {
padding: 0 15px; padding: 0 15px;
} }
.product-detail .right .reviews {
vertical-align: top;
}
.product-detail .right .reviews > div { .product-detail .right .reviews > div {
display: inline-block; display: inline-block;
} }
@ -4012,10 +4043,21 @@ button[disabled] {
vertical-align: middle; vertical-align: middle;
} }
.store-meta-images {
margin-top: 20px;
}
.store-meta-images img {
width: 100%;
height: 100%;
max-height: 300px;
}
@media only screen and (max-width: 1100px) { @media only screen and (max-width: 1100px) {
.footer .footer-content .newsletter-subscription .newsletter-wrapper .social-icons { .footer .footer-content .newsletter-subscription .newsletter-wrapper .social-icons {
width: 100%; width: 100%;
padding: 5px 0; padding: 5px 0;
text-align: center !important;
} }
.footer .footer-content .newsletter-subscription .newsletter-wrapper .subscribe-newsletter { .footer .footer-content .newsletter-subscription .newsletter-wrapper .subscribe-newsletter {
width: 100%; width: 100%;
@ -11006,7 +11048,7 @@ button.close {
outline: 0; outline: 0;
} }
.modal.fade .modal-dialog, .modal.fade .account-modal { .modal.fade .modal-dialog, .modal.fade #top #account + .account-modal, #top .modal.fade #account + .account-modal {
-webkit-transform: translate(0, -25%); -webkit-transform: translate(0, -25%);
transform: translate(0, -25%); transform: translate(0, -25%);
-webkit-transition: -webkit-transform 0.3s ease-out; -webkit-transition: -webkit-transform 0.3s ease-out;
@ -11015,7 +11057,7 @@ button.close {
transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out; transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;
} }
.modal.in .modal-dialog, .modal.in .account-modal { .modal.in .modal-dialog, .modal.in #top #account + .account-modal, #top .modal.in #account + .account-modal {
-webkit-transform: translate(0, 0); -webkit-transform: translate(0, 0);
transform: translate(0, 0); transform: translate(0, 0);
} }
@ -11025,7 +11067,7 @@ button.close {
overflow-y: auto; overflow-y: auto;
} }
.modal-dialog, .account-modal { .modal-dialog, #top #account + .account-modal {
position: relative; position: relative;
width: auto; width: auto;
margin: 10px; margin: 10px;
@ -11137,7 +11179,7 @@ button.close {
} }
@media (min-width: 768px) { @media (min-width: 768px) {
.modal-dialog, .account-modal { .modal-dialog, #top #account + .account-modal {
width: 600px; width: 600px;
margin: 30px auto; margin: 30px auto;
} }
@ -12213,7 +12255,23 @@ body {
} }
#top #account + .account-modal { #top #account + .account-modal {
height: 135px; right: 10px;
z-index: 100;
height: -webkit-max-content;
height: -moz-max-content;
height: max-content;
width: 290px !important;
position: absolute !important;
}
#top #account + .account-modal .theme-btn, #top #account + .account-modal .cart-details .continue-shopping-btn, .cart-details #top #account + .account-modal .continue-shopping-btn, #top #account + .account-modal .account-content .account-layout .bottom-toolbar .pagination .page-item, .account-content .account-layout .bottom-toolbar .pagination #top #account + .account-modal .page-item {
padding: .5rem .9rem;
}
#top #account + .account-modal .modal-footer {
-webkit-box-pack: unset;
-ms-flex-pack: unset;
justify-content: unset;
} }
#top > div:last-child { #top > div:last-child {
@ -12338,6 +12396,7 @@ header #search-form {
height: 40px; height: 40px;
margin: 5px 0px; margin: 5px 0px;
background: #FFFFFF; background: #FFFFFF;
padding: 4px 1px 0px 0px;
} }
header #search-form * { header #search-form * {

View File

@ -35539,9 +35539,11 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
// //
// //
// //
//
//
/* harmony default export */ __webpack_exports__["default"] = ({ /* harmony default export */ __webpack_exports__["default"] = ({
props: ['id', 'url', 'addClass', 'categories', 'mainSidebar', 'categoryCount'], props: ['id', 'url', 'addClass', 'parentSlug', 'categories', 'mainSidebar', 'categoryCount'],
data: function data() { data: function data() {
var slicedCategories = this.categories; var slicedCategories = this.categories;
@ -35551,6 +35553,8 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
slicedCategories = this.categories.slice(0, categoryCount); slicedCategories = this.categories.slice(0, categoryCount);
} }
if (this.parentSlug) slicedCategories['parentSlug'] = this.parentSlug;
return { return {
slicedCategories: slicedCategories, slicedCategories: slicedCategories,
sidebarLevel: Math.floor(Math.random() * 1000) sidebarLevel: Math.floor(Math.random() * 1000)
@ -35621,7 +35625,13 @@ var render = function() {
staticClass: "category unset", staticClass: "category unset",
class: category.children.length > 0 ? "fw6" : "", class: category.children.length > 0 ? "fw6" : "",
attrs: { attrs: {
href: _vm.url + "/" + category["translations"][0].slug href:
_vm.url +
"/" +
(_vm.slicedCategories.parentSlug
? _vm.slicedCategories.parentSlug + "/"
: "") +
category["translations"][0].slug
} }
}, },
[ [
@ -35698,9 +35708,12 @@ var render = function() {
_c("sidebar-component", { _c("sidebar-component", {
attrs: { attrs: {
url: _vm.url, url: _vm.url,
categories: category.children,
id: id:
"sidebar-level-" + (_vm.sidebarLevel + index), "sidebar-level-" + (_vm.sidebarLevel + index),
categories: category.children "parent-slug": category.parentSlug
? category.parentSlug
: category["translations"][0].slug
} }
}) })
], ],
@ -35801,7 +35814,11 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
// //
/* harmony default export */ __webpack_exports__["default"] = ({ /* harmony default export */ __webpack_exports__["default"] = ({
props: ['slidesCount', 'slidesPerPage', 'navigationEnabled', 'paginationEnabled', 'addClass'] props: ['id', 'addClass', 'slidesCount', 'slidesPerPage', 'navigationEnabled', 'paginationEnabled'],
data: function data() {
return {};
}
}); });
/***/ }), /***/ }),

View File

@ -0,0 +1,32 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class UpdateVelocityMetaData extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('velocity_meta_data', function (Blueprint $table) {
$table->json('product_view_images')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('velocity_meta_data', function (Blueprint $table) {
$table->dropColumn('product_view_images');
});
}
}

View File

@ -18,11 +18,11 @@ class VelocityMetaDataSeeder extends Seeder
'footer_left_content' => trans('velocity::app.admin.meta-data.footer-left-raw-content'), 'footer_left_content' => trans('velocity::app.admin.meta-data.footer-left-raw-content'),
'footer_middle_content' => '<div class="col-4 footer-ct-content"><div class="row"><div class="col-6"><ul type="none"><li><a href="">About Us</a></li><li><a href="">Customer Service</a></li><li><a href="">Whats New</a></li><li><a href="">Contact Us </a></li></div><div class="col-6"><ul type="none"><li><a href="">Order and Returns</a></li><li><a href="">Payment Policy</a></li><li><a href="">Shipping Policy</a></li><li><a href="">Privacy and Cookies Policy</a></li></div></div></div>', 'footer_middle_content' => '<div class="col-lg-6 col-md-12 col-sm-12 no-padding"><ul type="none"><li><a href="https://webkul.com/about-us/company-profile/">About Us</a></li><li><a href="https://webkul.com/about-us/company-profile/">Customer Service</a></li><li><a href="https://webkul.com/about-us/company-profile/">What&rsquo;s New</a></li><li><a href="https://webkul.com/about-us/company-profile/">Contact Us </a></li></ul></div><div class="col-lg-6 col-md-12 col-sm-12 no-padding"><ul type="none"><li><a href="https://webkul.com/about-us/company-profile/"> Order and Returns </a></li><li><a href="https://webkul.com/about-us/company-profile/"> Payment Policy </a></li><li><a href="https://webkul.com/about-us/company-profile/"> Shipping Policy</a></li><li><a href="https://webkul.com/about-us/company-profile/"> Privacy and Cookies Policy </a></li></ul></div>',
'slider' => 1, 'slider' => 1,
'subscription_bar_content' => '<div class="social-icons wk-icon"><i class="fs24 within-circle rango-facebook" title="facebook"></i> <i class="fs24 within-circle rango-twitter" title="twitter"></i> <i class="fs24 within-circle rango-linked-in" title="linkedin"></i> <i class="fs24 within-circle rango-pintrest" title="Pinterest"></i> <i class="fs24 within-circle rango-youtube" title="Youtube"></i> <i class="fs24 within-circle rango-instagram" title="instagram"></i></div>' 'subscription_bar_content' => '<div class="social-icons col-lg-6"><i class="fs24 within-circle rango-facebook" title="facebook"></i> <i class="fs24 within-circle rango-twitter" title="twitter"></i> <i class="fs24 within-circle rango-linked-in" title="linkedin"></i> <i class="fs24 within-circle rango-pintrest" title="Pinterest"></i> <i class="fs24 within-circle rango-youtube" title="Youtube"></i> <i class="fs24 within-circle rango-instagram" title="instagram"></i></div>'
]); ]);
} }
} }

View File

@ -64,11 +64,18 @@ class ConfigurationController extends Controller
foreach ($params['images'] as $index => $advertisement) { foreach ($params['images'] as $index => $advertisement) {
if ($advertisement['image_1'] !== "") { if ($advertisement['image_1'] !== "") {
$params['advertisement'][$index] = $this->uploadImages($advertisement, $index); $params['advertisement'][$index] = $this->uploadAdvertisementImages($advertisement, $index);
}
}
foreach ($params['product_view_images'] as $index => $productViewImage) {
if ($productViewImage !== "") {
$params['product_view_images'][$index] = $this->uploadImage($productViewImage, $index);
} }
} }
$params['advertisement'] = json_encode($params['advertisement']); $params['advertisement'] = json_encode($params['advertisement']);
$params['product_view_images'] = json_encode($params['product_view_images']);
$params['home_page_content'] = str_replace('=&gt;', '=>', $params['home_page_content']); $params['home_page_content'] = str_replace('=&gt;', '=>', $params['home_page_content']);
unset($params['images']); unset($params['images']);
@ -82,11 +89,12 @@ class ConfigurationController extends Controller
return redirect()->route($this->_config['redirect']); return redirect()->route($this->_config['redirect']);
} }
public function uploadImages($data, $index) public function uploadAdvertisementImages($data, $index)
{ {
$type = 'images'; $type = 'images';
$request = request(); $request = request();
$advertisement = [];
foreach ($data as $imageId => $image) { foreach ($data as $imageId => $image) {
$file = $type . '.' . $index . '.' . $imageId; $file = $type . '.' . $index . '.' . $imageId;
$dir = "velocity/$type"; $dir = "velocity/$type";
@ -100,4 +108,22 @@ class ConfigurationController extends Controller
return $advertisement; return $advertisement;
} }
public function uploadImage($data, $index)
{
$type = 'product_view_images';
$request = request();
$image = '';
$file = $type . '.' . $index;
$dir = "velocity/$type";
if ($request->hasFile($file)) {
Storage::delete($dir . $file);
$image = $request->file($file)->store($dir);
}
return $image;
}
} }

View File

@ -1,54 +0,0 @@
<?php
namespace Webkul\Velocity\Http\Controllers\Shop;
use Webkul\Product\Repositories\SearchRepository;
use Webkul\Velocity\Http\Shop\Controllers;
/**
* Search controller
*
* @author Shubham Mehrotra <shubhammehrotra.symfony@webkul.com> @shubhwebkul
* @copyright 2019 Webkul Software Pvt Ltd (http://www.webkul.com)
*/
class SearchController extends Controller
{
/**
* Contains route related configuration
*
* @var array
*/
protected $_config;
/**
* SearchRepository object
*
* @var Object
*/
protected $searchRepository;
/**
* Create a new controller instance.
*
* @param \Webkul\Product\Repositories\SearchRepository $searchRepository
* @return void
*/
public function __construct(SearchRepository $searchRepository)
{
$this->_config = request('_config');
$this->searchRepository = $searchRepository;
}
/**
* Index to handle the view loaded with the search results
*
* @return \Illuminate\View\View
*/
public function index()
{
$results = $this->searchRepository->search(request()->all());
return view($this->_config['view'])->with('results', $results ? $results : null);
}
}

View File

@ -0,0 +1,95 @@
<?php
namespace Webkul\Velocity\Http\Controllers\Shop;
use Webkul\Velocity\Helpers\Helper;
use Webkul\Velocity\Http\Shop\Controllers;
use Webkul\Product\Repositories\SearchRepository;
use Webkul\Product\Repositories\ProductRepository;
/**
* Search controller
*
* @author Shubham Mehrotra <shubhammehrotra.symfony@webkul.com> @shubhwebkul
* @copyright 2019 Webkul Software Pvt Ltd (http://www.webkul.com)
*/
class ShopController extends Controller
{
/**
* Contains route related configuration
*
* @var array
*/
protected $_config;
/**
* SearchRepository object
*
* @var SearchRepository
*/
protected $searchRepository;
/**
* ProductRepository object
*
* @var ProductRepository
*/
protected $productRepository;
/**
* Create a new controller instance.
*
* @param \Webkul\Product\Repositories\SearchRepository $searchRepository
* @return void
*/
public function __construct(
SearchRepository $searchRepository,
ProductRepository $productRepository
) {
$this->_config = request('_config');
$this->searchRepository = $searchRepository;
$this->productRepository = $productRepository;
}
/**
* Index to handle the view loaded with the search results
*
* @return \Illuminate\View\View
*/
public function search()
{
$results = $this->searchRepository->search(request()->all());
return view($this->_config['view'])->with('results', $results ? $results : null);
}
public function fetchProductDetails($slug)
{
$product = $this->productRepository->findBySlug($slug);
if ($product) {
$productReviewHelper = app('Webkul\Product\Helpers\Review');
$productImageHelper = app('Webkul\Product\Helpers\ProductImage');
$response = [
'status' => true,
'details' => [
'name' => $product->name,
'urlKey' => $product->url_key,
'priceHTML' => $product->getTypeInstance()->getPriceHtml(),
'totalReviews' => $productReviewHelper->getTotalReviews($product),
'rating' => ceil($productReviewHelper->getAverageRating($product)),
'image' => $productImageHelper->getProductBaseImage($product)['small_image_url'],
]
];
} else {
$response = [
'status' => false
];
}
return $response;
}
}

View File

@ -43,10 +43,4 @@ Route::group(['middleware' => ['web']], function () {
}); });
}); });
}); });
Route::group(['middleware' => ['theme']], function () {
Route::get('/search', 'Webkul\Velocity\Http\Controllers\Shop\SearchController@index')->defaults('_config', [
'view' => 'velocity::search.search'
])->name('shop.search.index');
});
}); });

View File

@ -0,0 +1,14 @@
<?php
Route::group(['middleware' => ['web']], function () {
Route::group(['middleware' => ['theme']], function () {
Route::namespace('Webkul\Velocity\Http\Controllers\Shop')->group(function () {
// Content Pages Route
Route::get('/product-details/{slug}', 'ShopController@fetchProductDetails')->name('velocity.shop.product');
});
Route::get('/search', 'ShopController@search')->defaults('_config', [
'view' => 'velocity::search.search'
])->name('shop.search.index');
});
});

View File

@ -27,6 +27,7 @@ class VelocityServiceProvider extends ServiceProvider
{ {
include __DIR__ . '/../Http/helpers.php'; include __DIR__ . '/../Http/helpers.php';
include __DIR__ . '/../Http/admin-routes.php'; include __DIR__ . '/../Http/admin-routes.php';
include __DIR__ . '/../Http/front-routes.php';
$this->app->register(EventServiceProvider::class); $this->app->register(EventServiceProvider::class);
@ -46,7 +47,7 @@ class VelocityServiceProvider extends ServiceProvider
$velocityHelper = app('Webkul\Velocity\Helpers\Helper'); $velocityHelper = app('Webkul\Velocity\Helpers\Helper');
$velocityMetaData = $velocityHelper->getVelocityMetaData(); $velocityMetaData = $velocityHelper->getVelocityMetaData();
view()->share('showRecentlyViewed', false); view()->share('showRecentlyViewed', true);
view()->share('velocityMetaData', $velocityMetaData); view()->share('velocityMetaData', $velocityMetaData);
} }

View File

@ -20,11 +20,16 @@
<script type="text/javascript"> <script type="text/javascript">
export default { export default {
props: [ props: [
'id',
'addClass',
'slidesCount', 'slidesCount',
'slidesPerPage', 'slidesPerPage',
'navigationEnabled', 'navigationEnabled',
'paginationEnabled', 'paginationEnabled',
'addClass'
], ],
data: function () {
return {}
}
} }
</script> </script>

View File

@ -15,10 +15,11 @@
@mouseout="toggleSidebar(id, $event, 'mouseout')" @mouseout="toggleSidebar(id, $event, 'mouseout')"
@mouseover="toggleSidebar(id, $event, 'mouseover')"> @mouseover="toggleSidebar(id, $event, 'mouseover')">
<a <a
class="category unset" class="category unset"
:class="(category.children.length > 0) ? 'fw6' : ''" :class="(category.children.length > 0) ? 'fw6' : ''"
:href="`${url}/${category['translations'][0].slug}`"> :href="`${url}/${slicedCategories.parentSlug ? slicedCategories.parentSlug + '/' : ''}${category['translations'][0].slug}`">
<div <div
class="category-icon" class="category-icon"
@ -45,8 +46,9 @@
<div :class="`sub-categories sub-category-${sidebarLevel+index}`"> <div :class="`sub-categories sub-category-${sidebarLevel+index}`">
<sidebar-component <sidebar-component
:url="url" :url="url"
:categories="category.children"
:id="`sidebar-level-${sidebarLevel+index}`" :id="`sidebar-level-${sidebarLevel+index}`"
:categories="category.children"> :parent-slug="category.parentSlug ? category.parentSlug : category['translations'][0].slug">
</sidebar-component> </sidebar-component>
</div> </div>
</div> </div>
@ -61,6 +63,7 @@
'id', 'id',
'url', 'url',
'addClass', 'addClass',
'parentSlug',
'categories', 'categories',
'mainSidebar', 'mainSidebar',
'categoryCount' 'categoryCount'
@ -76,6 +79,9 @@
slicedCategories = this.categories.slice(0, categoryCount); slicedCategories = this.categories.slice(0, categoryCount);
} }
if (this.parentSlug)
slicedCategories['parentSlug'] = this.parentSlug;
return { return {
slicedCategories, slicedCategories,
sidebarLevel: Math.floor(Math.random() * 1000), sidebarLevel: Math.floor(Math.random() * 1000),

View File

@ -23,6 +23,7 @@ $grey-clr: rgba(0,0,0,0.53);
$light-grey-clr: rgb(158, 158, 158); $light-grey-clr: rgb(158, 158, 158);
$light-background: #F7F7F9; $light-background: #F7F7F9;
$sidebar-width: 230px; $sidebar-width: 230px;
$box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
$font-family-pro: 'Source Sans Pro', sans-serif; $font-family-pro: 'Source Sans Pro', sans-serif;
$font-family-regular: 'SourceSansPro-Regular'; $font-family-regular: 'SourceSansPro-Regular';

View File

@ -11,12 +11,6 @@
font-style: normal; font-style: normal;
} }
.wk-icon {
font-size: 20px;
font-weight: 400;
text-align: center;
color: #0041ff;
}
[class^="rango-"], [class*=" rango-"] { [class^="rango-"], [class*=" rango-"] {
/* use !important to prevent issues with browser extensions that change fonts */ /* use !important to prevent issues with browser extensions that change fonts */

View File

@ -201,7 +201,21 @@ body {
} }
+ .account-modal { + .account-modal {
height: 135px; @extend .modal-dialog;
right: 10px;
z-index: 100;
height: max-content;
width: 290px !important;
position: absolute !important;
.theme-btn {
padding: .5rem .9rem;
}
.modal-footer {
justify-content: unset;
}
} }
} }
@ -333,6 +347,7 @@ header {
height: 40px; height: 40px;
margin: 5px 0px; margin: 5px 0px;
background: $white-color; background: $white-color;
padding: 4px 1px 0px 0px;
* { * {
height: 100%; height: 100%;

View File

@ -30,11 +30,11 @@
} }
.btn-add-to-cart { .btn-add-to-cart {
padding: 8px; padding: 8px !important;
color: #fff !important;
border-radius: 0px !important; border-radius: 0px !important;
border-color: #26A37C !important; color: $white-color !important;
background-color: #26A37C !important; border-color: $theme-color !important;
background-color: $theme-color !important;
&.large { &.large {
padding: 12px 18px; padding: 12px 18px;

View File

@ -511,7 +511,7 @@
top: 44px; top: 44px;
z-index: 100; z-index: 100;
width: 350px; width: 350px;
left: -230px; left: -265px;
position: absolute; position: absolute;
.close { .close {
@ -521,6 +521,14 @@
position: relative; position: relative;
} }
.mini-cart-container {
height: 100%;
font-size: 14px;
max-height: 200px;
overflow-y: scroll;
padding: 10px 15px 0 20px;
}
.small-card-container { .small-card-container {
margin: 0; margin: 0;
width: 100%; width: 100%;
@ -581,6 +589,7 @@
.cart-header { .cart-header {
max-height: 45px; max-height: 45px;
margin-bottom: 20px; margin-bottom: 20px;
padding-bottom: 20px !important;
border-bottom: 2px solid $border-general; border-bottom: 2px solid $border-general;
> h3 { > h3 {
@ -1085,6 +1094,7 @@
.order-summary-container { .order-summary-container {
padding-top: 25px; padding-top: 25px;
height: max-content;
max-width: 500px !important; max-width: 500px !important;
> div { > div {
@ -1172,6 +1182,7 @@
} }
.regular-price { .regular-price {
font-weight: 500;
margin-right: 10px; margin-right: 10px;
text-decoration: line-through; text-decoration: line-through;
} }
@ -1194,6 +1205,8 @@
.method-sticker { .method-sticker {
font-size: 13px; font-size: 13px;
padding: 4px 8px; padding: 4px 8px;
margin-right: 3px;
margin-bottom: 3px;
text-align: center; text-align: center;
border-radius: 1px; border-radius: 1px;
display: inline-block; display: inline-block;
@ -1202,10 +1215,11 @@
} }
.sidebar { .sidebar {
z-index: 1000000;
width: $sidebar-width; width: $sidebar-width;
.category-content { .category-content {
margin-bottom: 10px; // margin-bottom: 10px;
.category-title { .category-title {
top: -1px; top: -1px;
@ -1246,8 +1260,57 @@
} }
} }
.category-list-container {
z-index: 10;
padding: 0px !important;
background: $white-color;
position: absolute !important;
box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23);
.category {
@extend .cursor-pointer;
width: 100%;
line-height: 2.5rem;
display: inline-block;
span {
top: -4px;
position: relative;
}
}
li {
padding: 7px 0 5px 15px;
}
li:hover {
background: $border-light;
}
.sub-category-container {
// position: relative;
}
.sub-categories {
top: 0px;
left: 100%;
z-index: 100;
padding-top: 10px;
position: absolute;
background: $light-color;
border-left: 1px solid $border-common;
box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23);
li:nth-last-of-type(1) {
margin-bottom: 10px;
}
}
}
#sidebar-level-0 { #sidebar-level-0 {
display: none; display: none;
z-index: 100000;
border-top: 1px solid $border-common; border-top: 1px solid $border-common;
} }
@ -1570,6 +1633,10 @@
outline: none; outline: none;
box-shadow: none; box-shadow: none;
} }
.VueCarousel-dot {
padding: 5px !important;
}
} }
.VueCarousel-dot--active { .VueCarousel-dot--active {

View File

@ -9,71 +9,6 @@ body {
} }
} }
.account-modal {
@extend .modal-dialog;
right: 10px;
z-index: 100;
width: 350px !important;
position: absolute !important;
.theme-btn {
padding: .5rem .9rem;
}
.modal-footer {
.text-left {
padding-left: 5px;
}
}
}
.category-list-container {
z-index: 10;
padding: 0px !important;
background: $white-color;
position: absolute !important;
box-shadow: inset -1px 0 0 0 $border-light;
.category {
@extend .cursor-pointer;
width: 100%;
line-height: 2.5rem;
display: inline-block;
span {
top: -4px;
position: relative;
}
}
}
.category-list-container li {
padding: 7px 0 5px 15px;
}
.category-list-container li:hover {
background: $border-light;
}
.category-list-container {
.sub-category-container {
position: relative;
}
.sub-categories {
top: -40px;
left: 100%;
z-index: 100;
padding-top: 10px;
position: absolute;
background: $light-color;
border-left: 1px solid $border-common;
box-shadow: inset -1px 0 0 0 $border-light;
}
}
.root-category-menu { .root-category-menu {
border-bottom: solid 1px #d8e6ed; border-bottom: solid 1px #d8e6ed;
} }
@ -352,7 +287,7 @@ header #search-form > *:focus {
.hot-categories-container { .hot-categories-container {
.hot-category-wrapper { .hot-category-wrapper {
padding: 0 10px 15px 0; padding: 0 10px 0 0;
.card { .card {
height: 100%; height: 100%;
@ -381,11 +316,11 @@ header #search-form > *:focus {
} }
.hot-category-wrapper:nth-last-child(2) { .hot-category-wrapper:nth-last-child(2) {
padding: 15px 0 15px 0px; padding: 0 0 0 0px;
} }
.hot-category-wrapper:last-child { .hot-category-wrapper:last-child {
padding: 15px 0 15px 10px; padding: 0 0 0 10px;
} }
} }
@ -427,8 +362,7 @@ header #search-form > *:focus {
} }
.card-description { .card-description {
padding: 25px; padding: 10px 20px;
margin-top: 15px;
} }
} }
@ -513,6 +447,7 @@ header #search-form > *:focus {
.content-list { .content-list {
margin: 0; margin: 0;
width: 100%; width: 100%;
height: 42px;
text-align: left; text-align: left;
list-style: none; list-style: none;
position: relative; position: relative;
@ -522,7 +457,6 @@ header #search-form > *:focus {
ul { ul {
width: 100%; width: 100%;
height: 100%; height: 100%;
padding-left: 10px;
display: inline-flex; display: inline-flex;
background-color: $link-color; background-color: $link-color;
@ -532,13 +466,17 @@ header #search-form > *:focus {
cursor: pointer; cursor: pointer;
font-size: 16px; font-size: 16px;
font-weight: 600; font-weight: 600;
padding: 8px 15px;
letter-spacing: 0; letter-spacing: 0;
position: relative; position: relative;
color: $white-color; color: $white-color;
text-decoration: none; text-decoration: none;
padding: 8px 20px 8px 5px;
} }
} }
li:hover {
background-color: #42719a;
}
} }
} }
} }

View File

@ -6,6 +6,7 @@
.social-icons { .social-icons {
width: 100%; width: 100%;
padding: 5px 0; padding: 5px 0;
text-align: center !important;
} }
.subscribe-newsletter { .subscribe-newsletter {

View File

@ -1,5 +1,6 @@
.product-detail { .product-detail {
padding-top: 20px; padding-top: 20px;
margin-bottom: 60px;
.magnifier { .magnifier {
> img { > img {
@ -31,6 +32,8 @@
} }
.reviews { .reviews {
vertical-align: top;
> div { > div {
display: inline-block; display: inline-block;
} }
@ -206,4 +209,15 @@
vertical-align: middle; vertical-align: middle;
} }
} }
}
.store-meta-images {
margin-top: 20px;
img {
width: 100%;
height: 100%;
max-height: 300px;
}
} }

View File

@ -187,6 +187,9 @@
.cursor-pointer { .cursor-pointer {
cursor: pointer; cursor: pointer;
} }
.cursor-default {
cursor: default;
}
.grey { .grey {
color: rgb(158, 158, 158); color: rgb(158, 158, 158);
@ -499,6 +502,12 @@
.small-card-container { .small-card-container {
cursor: pointer; cursor: pointer;
margin-bottom: 10px; margin-bottom: 10px;
margin-left: 0 !important;
margin-right: 0 !important;
.material-icons {
font-size: 16px;
}
.product-image-container { .product-image-container {
padding: 0; padding: 0;
@ -516,6 +525,11 @@
display: inline-block; display: inline-block;
padding: 10px 0 !important; padding: 10px 0 !important;
} }
.sticker,
.regular-price {
display: none;
}
} }
.small-card-container:hover { .small-card-container:hover {
@ -655,6 +669,8 @@ a {
.scrollable { .scrollable {
max-height: 100vh; max-height: 100vh;
overflow-y: scroll; overflow-y: scroll;
scrollbar-width: none;
-ms-overflow-style: none;
} }
.scrollable::-webkit-scrollbar { .scrollable::-webkit-scrollbar {
@ -716,5 +732,8 @@ button[disabled] {
font-variant: normal; font-variant: normal;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
font-family: 'Webkul Rango' !important; font-family: 'Webkul Rango' !important;
}
.max-height-350 {
max-height: 350px;
} }

View File

@ -95,13 +95,14 @@ return [
'subscription-content' => 'Subscription bar Content', 'subscription-content' => 'Subscription bar Content',
'activate-slider' => 'Activate Slider', 'activate-slider' => 'Activate Slider',
'sidebar-categories' => 'Sidebar Categories', 'sidebar-categories' => 'Sidebar Categories',
'footer-left-raw-content' => 'We love to craft softwares and solve the real world problems with the binaries. We are highly committed to our goals. We invest our resources to create world class easy to use softwares and applications for the enterprise business with the top notch, on the edge technology expertise.', 'footer-left-raw-content' => '<p>We love to craft softwares and solve the real world problems with the binaries. We are highly committed to our goals. We invest our resources to create world class easy to use softwares and applications for the enterprise business with the top notch, on the edge technology expertise.</p>',
'footer-middle-content' => 'Footer Middle Content', 'footer-middle-content' => 'Footer Middle Content',
'update-meta-data' => 'Update Meta Data', 'update-meta-data' => 'Update Meta Data',
'advertisement-four' => 'Advertisement Four Images', 'advertisement-four' => 'Advertisement Four Images',
'advertisement-three' => 'Advertisement Three Images', 'advertisement-three' => 'Advertisement Three Images',
'advertisement-two' => 'Advertisement Two Images', 'advertisement-two' => 'Advertisement Two Images',
'advertisement-one' => 'Advertisement One Images', 'advertisement-one' => 'Advertisement One Images',
'product-view-image' => 'Product View Image',
'footer' => 'Footer', 'footer' => 'Footer',
], ],
'category' => [ 'category' => [

View File

@ -1,5 +1,5 @@
<script type="text/x-template" id="star-ratings-template"> <script type="text/x-template" id="star-ratings-template">
<div :class="`stars mr10 fs${size ? size : '16'} ${pushClass ? pushClass : ''}`"> <div :class="`stars mr5 fs${size ? size : '16'} ${pushClass ? pushClass : ''}`">
<input <input
v-if="editable" v-if="editable"
type="number" type="number"
@ -7,21 +7,26 @@
name="rating" name="rating"
class="hidden" /> class="hidden" />
<span <i
:class="`rango-star-fill ${editable ? 'cursor-pointer' : ''}`" :class="`material-icons ${editable ? 'cursor-pointer' : ''}`"
v-for="(rating, index) in parseInt(showFilled ? showFilled : 3)" v-for="(rating, index) in parseInt(showFilled ? showFilled : 3)"
:key="`${index}${Math.random()}`" :key="`${index}${Math.random()}`"
@click="updateRating(index + 1)"> @click="updateRating(index + 1)">
</span> star
</i>
<template v-if="!hideBlank"> <template v-if="!hideBlank">
<span <i
:class="`rango-star ${editable ? 'cursor-pointer' : ''}`" :class="`material-icons ${editable ? 'cursor-pointer' : ''}`"
v-for="(blankStar, index) in (5 - (showFilled ? showFilled : 3))" v-for="(blankStar, index) in (5 - (showFilled ? showFilled : 3))"
:key="`${index}${Math.random()}`" :key="`${index}${Math.random()}`"
@click="updateRating(showFilled + index + 1)"> @click="updateRating(showFilled + index + 1)">
</span> star_border
</i>
</template> </template>
{{-- <i class="material-icons">star_border</i>
<i class="material-icons">star</i> --}}
</div> </div>
</script> </script>

View File

@ -121,6 +121,14 @@
input-name="images[1]"> input-name="images[1]">
</image-wrapper> </image-wrapper>
</div> </div>
<div class="control-group product-view-image">
<label>{{ __('velocity::app.admin.meta-data.product-view-image') }}</label>
<image-wrapper
input-name="product_view_images">
</image-wrapper>
</div>
</div> </div>
</accordian> </accordian>

View File

@ -16,7 +16,7 @@
<div class="modal-content sensitive-modal cart-modal-content hide" id="cart-modal-content"> <div class="modal-content sensitive-modal cart-modal-content hide" id="cart-modal-content">
<!--Body--> <!--Body-->
<div class="pl20 pt10 pr15 fs14"> <div class="mini-cart-container">
@foreach ($items as $item) @foreach ($items as $item)
@php @php
$images = $item->product->getTypeInstance()->getBaseImage($item); $images = $item->product->getTypeInstance()->getBaseImage($item);

View File

@ -573,20 +573,6 @@
onSubmit: function() { onSubmit: function() {
var this_this = this; var this_this = this;
const emptyCouponErrorText = "Please enter a coupon code"; const emptyCouponErrorText = "Please enter a coupon code";
axios.post('{{ route('shop.checkout.check.coupons') }}', {code: this_this.coupon_code})
.then(function(response) {
this_this.$emit('onApplyCoupon');
this_this.couponChanged = true;
})
.catch(function(error) {
this_this.couponChanged = true;
this_this.error_message = (error.response.data.message === "The given data was invalid.")?
emptyCouponErrorText :
(error.response.data.message === "Cannot Apply Coupon")?
"Sorry, this Coupon code is invalid":error.response.data.message;
});
}, },
changeCoupon: function() { changeCoupon: function() {
@ -603,16 +589,6 @@
removeCoupon: function () { removeCoupon: function () {
var this_this = this; var this_this = this;
axios.post('{{ route('shop.checkout.remove.coupon') }}')
.then(function(response) {
this_this.$emit('onRemoveCoupon')
})
.catch(function(error) {
window.flashMessages = [{'type' : 'alert-error', 'message' : error.response.data.message}];
this_this.$root.addFlashMessages();
});
} }
} }
}); });

View File

@ -9,94 +9,97 @@
{!! view_render_event('bagisto.shop.customers.login.before') !!} {!! view_render_event('bagisto.shop.customers.login.before') !!}
<div class="container"> <div class="container">
<div class="heading"> <div class="row col-10 offset-1">
<h2 class="fs24 fw6"> <div class="heading">
{{ __('velocity::app.customer.login-form.customer-login')}} <h2 class="fs24 fw6">
</h2> {{ __('velocity::app.customer.login-form.customer-login')}}
</h2>
<a href="{{ route('customer.register.index') }}" class="btn-new-customer"> <a href="{{ route('customer.register.index') }}" class="btn-new-customer">
<button type="button" class="theme-btn light"> <button type="button" class="theme-btn light">
{{ __('velocity::app.customer.login-form.new-customer')}} {{ __('velocity::app.customer.login-form.new-customer')}}
</button> </button>
</a>
</div>
<div class="body">
<div class="form-header">
<h3 class="fw6">
{{ __('velocity::app.customer.login-form.registered-user')}}
</h3>
<p class="fs16">
{{ __('velocity::app.customer.login-form.form-login-text')}}
</p>
</div>
<form
method="POST"
action="{{ route('customer.session.create') }}"
@submit.prevent="onSubmit">
{{ csrf_field() }}
{!! view_render_event('bagisto.shop.customers.login_form_controls.before') !!}
<div class="form-group" :class="[errors.has('email') ? 'has-error' : '']">
<label for="email" class="required label-style">
{{ __('shop::app.customer.login-form.email') }}*
</label>
<input
type="text"
class="form-style"
name="email"
v-validate="'required|email'"
value="{{ old('email') }}"
data-vv-as="&quot;{{ __('shop::app.customer.login-form.email') }}&quot;" />
<span class="control-error" v-if="errors.has('email')">
@{{ errors.first('email') }}
</span>
</div>
<div class="form-group" :class="[errors.has('password') ? 'has-error' : '']">
<label for="password" class="required label-style">
{{ __('shop::app.customer.login-form.password') }}*
</label>
<input
type="password"
class="form-style"
name="password"
v-validate="'required'"
value="{{ old('password') }}"
data-vv-as="&quot;{{ __('shop::app.customer.login-form.password') }}&quot;" />
<span class="control-error" v-if="errors.has('password')">
@{{ errors.first('password') }}
</span>
<a href="{{ route('customer.forgot-password.create') }}" style="float: right;">
{{ __('shop::app.customer.login-form.forgot_pass') }}
</a> </a>
<div class="mt10">
@if (Cookie::has('enable-resend'))
@if (Cookie::get('enable-resend') == true)
<a href="{{ route('customer.resend.verification-email', Cookie::get('email-for-resend')) }}">{{ __('shop::app.customer.login-form.resend-verification') }}</a>
@endif
@endif
</div>
</div> </div>
{!! view_render_event('bagisto.shop.customers.login_form_controls.after') !!} <div class="body col-12">
<div class="form-header">
<h3 class="fw6">
{{ __('velocity::app.customer.login-form.registered-user')}}
</h3>
<input class="theme-btn" type="submit" value="{{ __('shop::app.customer.login-form.button_title') }}"> <p class="fs16">
{{ __('velocity::app.customer.login-form.form-login-text')}}
</p>
</div>
</form> <form
method="POST"
action="{{ route('customer.session.create') }}"
@submit.prevent="onSubmit">
{{ csrf_field() }}
{!! view_render_event('bagisto.shop.customers.login_form_controls.before') !!}
<div class="form-group" :class="[errors.has('email') ? 'has-error' : '']">
<label for="email" class="required label-style">
{{ __('shop::app.customer.login-form.email') }}*
</label>
<input
type="text"
class="form-style"
name="email"
v-validate="'required|email'"
value="{{ old('email') }}"
data-vv-as="&quot;{{ __('shop::app.customer.login-form.email') }}&quot;" />
<span class="control-error" v-if="errors.has('email')">
@{{ errors.first('email') }}
</span>
</div>
<div class="form-group" :class="[errors.has('password') ? 'has-error' : '']">
<label for="password" class="required label-style">
{{ __('shop::app.customer.login-form.password') }}*
</label>
<input
type="password"
class="form-style"
name="password"
v-validate="'required'"
value="{{ old('password') }}"
data-vv-as="&quot;{{ __('shop::app.customer.login-form.password') }}&quot;" />
<span class="control-error" v-if="errors.has('password')">
@{{ errors.first('password') }}
</span>
<a href="{{ route('customer.forgot-password.create') }}" style="float: right;">
{{ __('shop::app.customer.login-form.forgot_pass') }}
</a>
<div class="mt10">
@if (Cookie::has('enable-resend'))
@if (Cookie::get('enable-resend') == true)
<a href="{{ route('customer.resend.verification-email', Cookie::get('email-for-resend')) }}">{{ __('shop::app.customer.login-form.resend-verification') }}</a>
@endif
@endif
</div>
</div>
{!! view_render_event('bagisto.shop.customers.login_form_controls.after') !!}
<input class="theme-btn" type="submit" value="{{ __('shop::app.customer.login-form.button_title') }}">
</form>
</div>
</div>
</div> </div>
</div>
{!! view_render_event('bagisto.shop.customers.login.after') !!} {!! view_render_event('bagisto.shop.customers.login.after') !!}
</div> </div>
@endsection @endsection

View File

@ -7,62 +7,64 @@
@section('content-wrapper') @section('content-wrapper')
<div class="auth-content form-container"> <div class="auth-content form-container">
<div class="container"> <div class="container">
<div class="heading"> <div class="row col-10 offset-1">
<h2 class="fs24 fw6"> <div class="heading">
{{ __('velocity::app.customer.forget-password.forgot-password')}} <h2 class="fs24 fw6">
</h2> {{ __('velocity::app.customer.forget-password.forgot-password')}}
</h2>
<a href="{{ route('customer.session.index') }}" class="btn-new-customer"> <a href="{{ route('customer.session.index') }}" class="btn-new-customer">
<button type="button" class="theme-btn light"> <button type="button" class="theme-btn light">
{{ __('velocity::app.customer.signup-form.login') }} {{ __('velocity::app.customer.signup-form.login') }}
</button> </button>
</a> </a>
</div> </div>
<div class="body"> <div class="body col-12">
<h3 class="fw6"> <h3 class="fw6">
{{ __('velocity::app.customer.forget-password.recover-password')}} {{ __('velocity::app.customer.forget-password.recover-password')}}
</h3> </h3>
<p class="fs16"> <p class="fs16">
{{ __('velocity::app.customer.forget-password.recover-password-text')}} {{ __('velocity::app.customer.forget-password.recover-password-text')}}
</p> </p>
{!! view_render_event('bagisto.shop.customers.forget_password.before') !!} {!! view_render_event('bagisto.shop.customers.forget_password.before') !!}
<form <form
method="post" method="post"
action="{{ route('customer.register.create') }}" action="{{ route('customer.register.create') }}"
@submit.prevent="onSubmit"> @submit.prevent="onSubmit">
{{ csrf_field() }} {{ csrf_field() }}
{!! view_render_event('bagisto.shop.customers.forget_password_form_controls.before') !!} {!! view_render_event('bagisto.shop.customers.forget_password_form_controls.before') !!}
<div class="control-group" :class="[errors.has('email') ? 'has-error' : '']"> <div class="control-group" :class="[errors.has('email') ? 'has-error' : '']">
<label for="email" class="required label-style"> <label for="email" class="required label-style">
{{ __('shop::app.customer.forgot-password.email') }} {{ __('shop::app.customer.forgot-password.email') }}
</label> </label>
<input <input
type="email" type="email"
class="form-style" class="form-style"
name="email" name="email"
v-validate="'required|email'" /> v-validate="'required|email'" />
<span class="control-error" v-if="errors.has('email')"> <span class="control-error" v-if="errors.has('email')">
@{{ errors.first('email') }} @{{ errors.first('email') }}
</span> </span>
</div> </div>
{!! view_render_event('bagisto.shop.customers.forget_password_form_controls.after') !!} {!! view_render_event('bagisto.shop.customers.forget_password_form_controls.after') !!}
<button class="theme-btn" type="submit"> <button class="theme-btn" type="submit">
{{ __('shop::app.customer.forgot-password.submit') }} {{ __('shop::app.customer.forgot-password.submit') }}
</button> </button>
</form> </form>
{!! view_render_event('bagisto.shop.customers.forget_password.after') !!} {!! view_render_event('bagisto.shop.customers.forget_password.after') !!}
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -7,136 +7,138 @@
@section('content-wrapper') @section('content-wrapper')
<div class="auth-content form-container"> <div class="auth-content form-container">
<div class="container"> <div class="container">
<div class="heading"> <div class="row col-10 offset-1">
<h2 class="fs24 fw6"> <div class="heading">
{{ __('velocity::app.customer.signup-form.user-registration')}} <h2 class="fs24 fw6">
</h2> {{ __('velocity::app.customer.signup-form.user-registration')}}
</h2>
<a href="{{ route('customer.session.index') }}" class="btn-new-customer"> <a href="{{ route('customer.session.index') }}" class="btn-new-customer">
<button type="button" class="theme-btn light"> <button type="button" class="theme-btn light">
{{ __('velocity::app.customer.signup-form.login')}} {{ __('velocity::app.customer.signup-form.login')}}
</button> </button>
</a> </a>
</div> </div>
<div class="body"> <div class="body col-12">
<h3 class="fw6"> <h3 class="fw6">
{{ __('velocity::app.customer.signup-form.become-user')}} {{ __('velocity::app.customer.signup-form.become-user')}}
</h3> </h3>
<p class="fs16"> <p class="fs16">
{{ __('velocity::app.customer.signup-form.form-sginup-text')}} {{ __('velocity::app.customer.signup-form.form-sginup-text')}}
</p> </p>
{!! view_render_event('bagisto.shop.customers.signup.before') !!} {!! view_render_event('bagisto.shop.customers.signup.before') !!}
<form <form
method="post" method="post"
action="{{ route('customer.register.create') }}" action="{{ route('customer.register.create') }}"
@submit.prevent="onSubmit"> @submit.prevent="onSubmit">
{{ csrf_field() }} {{ csrf_field() }}
{!! view_render_event('bagisto.shop.customers.signup_form_controls.before') !!} {!! view_render_event('bagisto.shop.customers.signup_form_controls.before') !!}
<div class="control-group" :class="[errors.has('first_name') ? 'has-error' : '']"> <div class="control-group" :class="[errors.has('first_name') ? 'has-error' : '']">
<label for="first_name" class="required label-style"> <label for="first_name" class="required label-style">
{{ __('shop::app.customer.signup-form.firstname') }} {{ __('shop::app.customer.signup-form.firstname') }}
</label> </label>
<input <input
type="text" type="text"
class="form-style" class="form-style"
name="first_name" name="first_name"
v-validate="'required'" v-validate="'required'"
value="{{ old('first_name') }}" value="{{ old('first_name') }}"
data-vv-as="&quot;{{ __('shop::app.customer.signup-form.firstname') }}&quot;" /> data-vv-as="&quot;{{ __('shop::app.customer.signup-form.firstname') }}&quot;" />
<span class="control-error" v-if="errors.has('first_name')"> <span class="control-error" v-if="errors.has('first_name')">
@{{ errors.first('first_name') }} @{{ errors.first('first_name') }}
</span> </span>
</div> </div>
<div class="control-group" :class="[errors.has('last_name') ? 'has-error' : '']"> <div class="control-group" :class="[errors.has('last_name') ? 'has-error' : '']">
<label for="last_name" class="required label-style"> <label for="last_name" class="required label-style">
{{ __('shop::app.customer.signup-form.lastname') }} {{ __('shop::app.customer.signup-form.lastname') }}
</label> </label>
<input <input
type="text" type="text"
class="form-style" class="form-style"
name="last_name" name="last_name"
v-validate="'required'" v-validate="'required'"
value="{{ old('last_name') }}" value="{{ old('last_name') }}"
data-vv-as="&quot;{{ __('shop::app.customer.signup-form.lastname') }}&quot;" /> data-vv-as="&quot;{{ __('shop::app.customer.signup-form.lastname') }}&quot;" />
<span class="control-error" v-if="errors.has('last_name')"> <span class="control-error" v-if="errors.has('last_name')">
@{{ errors.first('last_name') }} @{{ errors.first('last_name') }}
</span> </span>
</div> </div>
<div class="control-group" :class="[errors.has('email') ? 'has-error' : '']"> <div class="control-group" :class="[errors.has('email') ? 'has-error' : '']">
<label for="email" class="required label-style"> <label for="email" class="required label-style">
{{ __('shop::app.customer.signup-form.email') }} {{ __('shop::app.customer.signup-form.email') }}
</label> </label>
<input <input
type="email" type="email"
class="form-style" class="form-style"
name="email" name="email"
v-validate="'required|email'" v-validate="'required|email'"
value="{{ old('email') }}" value="{{ old('email') }}"
data-vv-as="&quot;{{ __('shop::app.customer.signup-form.email') }}&quot;" /> data-vv-as="&quot;{{ __('shop::app.customer.signup-form.email') }}&quot;" />
<span class="control-error" v-if="errors.has('email')"> <span class="control-error" v-if="errors.has('email')">
@{{ errors.first('email') }} @{{ errors.first('email') }}
</span> </span>
</div> </div>
<div class="control-group" :class="[errors.has('password') ? 'has-error' : '']"> <div class="control-group" :class="[errors.has('password') ? 'has-error' : '']">
<label for="password" class="required label-style"> <label for="password" class="required label-style">
{{ __('shop::app.customer.signup-form.password') }} {{ __('shop::app.customer.signup-form.password') }}
</label> </label>
<input <input
type="password" type="password"
class="form-style" class="form-style"
name="password" name="password"
v-validate="'required|min:6'" v-validate="'required|min:6'"
ref="password" ref="password"
value="{{ old('password') }}" value="{{ old('password') }}"
data-vv-as="&quot;{{ __('shop::app.customer.signup-form.password') }}&quot;" /> data-vv-as="&quot;{{ __('shop::app.customer.signup-form.password') }}&quot;" />
<span class="control-error" v-if="errors.has('password')"> <span class="control-error" v-if="errors.has('password')">
@{{ errors.first('password') }} @{{ errors.first('password') }}
</span> </span>
</div> </div>
<div class="control-group" :class="[errors.has('password_confirmation') ? 'has-error' : '']"> <div class="control-group" :class="[errors.has('password_confirmation') ? 'has-error' : '']">
<label for="password_confirmation" class="required label-style"> <label for="password_confirmation" class="required label-style">
{{ __('shop::app.customer.signup-form.confirm_pass') }} {{ __('shop::app.customer.signup-form.confirm_pass') }}
</label> </label>
<input <input
type="password" type="password"
class="form-style" class="form-style"
name="password_confirmation" name="password_confirmation"
v-validate="'required|min:6|confirmed:password'" v-validate="'required|min:6|confirmed:password'"
data-vv-as="&quot;{{ __('shop::app.customer.signup-form.confirm_pass') }}&quot;" /> data-vv-as="&quot;{{ __('shop::app.customer.signup-form.confirm_pass') }}&quot;" />
<span class="control-error" v-if="errors.has('password_confirmation')"> <span class="control-error" v-if="errors.has('password_confirmation')">
@{{ errors.first('password_confirmation') }} @{{ errors.first('password_confirmation') }}
</span> </span>
</div> </div>
{!! view_render_event('bagisto.shop.customers.signup_form_controls.after') !!} {!! view_render_event('bagisto.shop.customers.signup_form_controls.after') !!}
<button class="theme-btn" type="submit"> <button class="theme-btn" type="submit">
{{ __('shop::app.customer.signup-form.title') }} {{ __('shop::app.customer.signup-form.title') }}
</button> </button>
</form> </form>
{!! view_render_event('bagisto.shop.customers.signup.after') !!} {!! view_render_event('bagisto.shop.customers.signup.after') !!}
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -18,11 +18,11 @@
<div class="container-fluid advertisement-two-container"> <div class="container-fluid advertisement-two-container">
<div class="row"> <div class="row">
<a class="col-8 no-padding"> <a class="col-9 no-padding">
<img src="{{ asset('/storage/' . $advertisementTwo['image_1']) }}" /> <img src="{{ asset('/storage/' . $advertisementTwo['image_1']) }}" />
</a> </a>
<a class="col-4 pr0"> <a class="col-3 pr0">
<img src="{{ asset('/storage/' . $advertisementTwo['image_2']) }}" /> <img src="{{ asset('/storage/' . $advertisementTwo['image_2']) }}" />
</a> </a>
</div> </div>
@ -33,11 +33,11 @@
@if (! $isRendered) @if (! $isRendered)
<div class="container-fluid advertisement-two-container"> <div class="container-fluid advertisement-two-container">
<div class="row"> <div class="row">
<a class="col-8 no-padding"> <a class="col-9 no-padding">
<img src="{{ asset('/themes/velocity/assets/images/toster.png') }}" /> <img src="{{ asset('/themes/velocity/assets/images/toster.png') }}" />
</a> </a>
<a class="col-4 pr0"> <a class="col-3 pr0">
<img src="{{ asset('/themes/velocity/assets/images/trimmer.png') }}" /> <img src="{{ asset('/themes/velocity/assets/images/trimmer.png') }}" />
</a> </a>
</div> </div>

View File

@ -18,8 +18,10 @@
<div class="row flex-nowrap"> <div class="row flex-nowrap">
<carousel-component <carousel-component
:slides-count="{{ sizeof($products) }}"
slides-per-page="6" slides-per-page="6"
navigation-enabled="hide"
pagination-enabled="hide"
:slides-count="{{ sizeof($products) }}"
id="{{ $categoryDetails->name }}-carousel"> id="{{ $categoryDetails->name }}-carousel">
@foreach ($products as $index => $product) @foreach ($products as $index => $product)

View File

@ -16,9 +16,11 @@
<div class="row flex-nowrap"> <div class="row flex-nowrap">
<carousel-component <carousel-component
:slides-count="{{ $featuredProductsCount }}"
slides-per-page="6" slides-per-page="6"
id="fearured-products-carousel"> navigation-enabled="hide"
pagination-enabled="hide"
id="fearured-products-carousel"
:slides-count="{{ $featuredProductsCount }}">
@foreach ($featuredProducts as $index => $product) @foreach ($featuredProducts as $index => $product)

View File

@ -2,8 +2,6 @@
$count = $velocityMetaData->new_products_count; $count = $velocityMetaData->new_products_count;
$newProducts = app('Webkul\Velocity\Repositories\Product\ProductRepository')->getNewProducts($count); $newProducts = app('Webkul\Velocity\Repositories\Product\ProductRepository')->getNewProducts($count);
$showRecentlyViewed = false;
@endphp @endphp
@if (! empty($newProducts)) @if (! empty($newProducts))
@ -26,11 +24,11 @@
<div class="col-9 no-padding"> <div class="col-9 no-padding">
<carousel-component <carousel-component
:slides-count="{{ sizeof($newProducts) }}"
slides-per-page="5" slides-per-page="5"
id="new-products-carousel"
navigation-enabled="hide" navigation-enabled="hide"
pagination-enabled="hide"> pagination-enabled="hide"
id="new-products-carousel"
:slides-count="{{ sizeof($newProducts) }}">
@foreach ($newProducts as $index => $product) @foreach ($newProducts as $index => $product)
@ -43,12 +41,17 @@
</carousel-component> </carousel-component>
</div> </div>
@include ('shop::products.list.recently-viewed') @include ('shop::products.list.recently-viewed', [
'addClass' => 'col-3',
'addClassWrapper' => 'scrollable max-height-350',
])
@else @else
<carousel-component <carousel-component
:slides-count="{{ sizeof($newProducts) }}"
slides-per-page="6" slides-per-page="6"
id="new-products-carousel"> navigation-enabled="hide"
pagination-enabled="hide"
id="new-products-carousel"
:slides-count="{{ sizeof($newProducts) }}">
@foreach ($newProducts as $index => $product) @foreach ($newProducts as $index => $product)

View File

@ -5,11 +5,10 @@
@include('shop::layouts.footer.footer-links') @include('shop::layouts.footer.footer-links')
@if ($categories) @if ($categories)
@include('shop::layouts.footer.top-brands') {{-- @include('shop::layouts.footer.top-brands') --}}
@endif @endif
@include('shop::layouts.footer.copy-right') @include('shop::layouts.footer.copy-right')
</div> </div>
</div> </div>

View File

@ -9,7 +9,7 @@
@endif @endif
@if (core()->getConfigData('customer.settings.newsletter.subscription')) @if (core()->getConfigData('customer.settings.newsletter.subscription'))
<div class="subscribe-newsletter"> <div class="subscribe-newsletter col-lg-6 text-right">
<div class="form-container"> <div class="form-container">
<form action="{{ route('shop.subscribe') }}"> <form action="{{ route('shop.subscribe') }}">
<div class="subscriber-form-div"> <div class="subscriber-form-div">

View File

@ -41,22 +41,22 @@
<!--Footer--> <!--Footer-->
<div class="modal-footer"> <div class="modal-footer">
<div class="col-6 text-left"> <div>
<a href="{{ route('customer.session.index') }}"> <a href="{{ route('customer.session.index') }}">
<button <button
type="button" type="button"
class="theme-btn fs15"> class="theme-btn fs14 fw6">
{{ __('velocity::app.header.sign-in') }} {{ __('velocity::app.header.sign-in') }}
</button> </button>
</a> </a>
</div> </div>
<div class="col-6 text-right"> <div>
<a href="{{ route('customer.register.index') }}"> <a href="{{ route('customer.register.index') }}">
<button <button
type="button" type="button"
class="theme-btn fs15"> class="theme-btn fs14 fw6">
{{ __('velocity::app.header.sign-up') }} {{ __('velocity::app.header.sign-up') }}
</button> </button>
</a> </a>

View File

@ -46,7 +46,7 @@
</div> </div>
<div class="product-rating"> <div class="product-rating">
<star-ratings ratings="3"></star-ratings> <star-ratings ratings="{{ $avgRatings }}"></star-ratings>
<span>{{ $totalReviews }} Ratings</span> <span>{{ $totalReviews }} Ratings</span>
</div> </div>

View File

@ -1,46 +1,91 @@
@inject ('productImageHelper', 'Webkul\Product\Helpers\ProductImage') @inject ('velocityHelper', 'Webkul\Velocity\Helpers\Helper')
@inject ('productRatingHelper', 'Webkul\Product\Helpers\Review') @inject ('productRatingHelper', 'Webkul\Product\Helpers\Review')
@inject ('productImageHelper', 'Webkul\Product\Helpers\ProductImage')
@php <recently-viewed
$recentlyViewedProducts = app('Webkul\Product\Repositories\ProductRepository')->getNewProducts(3)->items(); add-class="{{ isset($addClass) ? $addClass : '' }}"
@endphp add-class-wrapper="{{ isset($addClassWrapper) ? $addClassWrapper : '' }}">
</recently-viewed>
<div class="col-3 recently-viewed"> @push('scripts')
<div class="row mb20 pl20"> <script type="text/x-template" id="recently-viewed-template">
<div class="col-12 no-padding"> <div :class="`${addClass} recently-viewed`">
<h2 class="fs20 fw6">{{ __('velocity::app.products.recently-viewed') }}</h2> <div class="row remove-padding-margin">
</div> <div class="col-12 no-padding">
</div> <h2 class="fs20 fw6 mb15">{{ __('velocity::app.products.recently-viewed') }}</h2>
</div>
@foreach ($recentlyViewedProducts as $index => $product)
@php
$productBaseImage = $productImageHelper->getProductBaseImage($product);
$productAverageRating = $productRatingHelper->getAverageRating($product);
@endphp
<div class="row small-card-container">
<div class="col-4 product-image-container mr15">
<a href="{{ route('shop.productOrCategory.index', $product->url_key) }}" class="unset">
<div class="product-image" style="background-image: url({{ $productBaseImage['small_image_url'] }})"></div>
</a>
</div> </div>
<div class="col-8 no-padding card-body align-vertical-top"> <div :class="`recetly-viewed-products-wrapper ${addClassWrapper}`">
<div class="no-padding"> <div
<div class="fs16 text-nowrap">{{ $product->name }}</div> :key="Math.random()"
class="row small-card-container"
v-for="(product, index) in recentlyViewed">
<div class="fs18 card-current-price fw6"> <div class="col-4 product-image-container mr15">
@include ('shop::products.price', [ <a :href="`${baseURL}/${product.urlKey}`" class="unset">
'product' => $product, <div class="product-image" :style="`background-image: url(${product.image})`"></div>
'showDiscount' => false, </a>
])
</div> </div>
<star-ratings ratings="{{ intval($productAverageRating) }}"></star-ratings> <div class="col-8 no-padding card-body align-vertical-top">
</div> <a :href="`${baseURL}/${product.urlKey}`" class="unset no-padding">
<span class="fs16 text-nowrap">@{{ product.name }}</span>
<div
v-html="product.priceHTML"
class="fs18 card-current-price fw6">
</div>
<star-ratings
push-class="display-inbl"
:ratings="product.rating">
</star-ratings>
<span class="fs16 text-nowrap align-text-bottom">@{{ product.totalReviews }} Reviews</span>
</a>
</div>
</div>
</div> </div>
</div> </div>
@endforeach </script>
</div>
<script type="text/javascript">
(() => {
Vue.component('recently-viewed', {
template: '#recently-viewed-template',
props: ['addClass', 'addClassWrapper'],
data: function () {
return {
baseURL: '{{ url()->to('/') }}',
recentlyViewed: (() => {
let slugs = JSON.parse(window.localStorage.recentlyViewed);
let updatedSlugs = {};
slugs.forEach(slug => {
updatedSlugs[slug] = {};
});
return updatedSlugs;
})(),
}
},
created: function () {
for (slug in this.recentlyViewed) {
if (slug) {
this.$http(`${this.baseURL}/product-details/${slug}`)
.then(response => {
if (response.data.status) {
this.$set(this.recentlyViewed, response.data.details.urlKey, response.data.details);
}
})
.catch(error => {})
}
}
},
})
})()
</script>
@endpush

View File

@ -39,7 +39,7 @@
</div> </div>
<div class="comment"> <div class="comment">
<label>Rating*</label> <label>Description*</label>
<textarea rows="4" placeholder="Your Comment" name="comment"></textarea> <textarea rows="4" placeholder="Your Comment" name="comment"></textarea>
</div> </div>

View File

@ -19,116 +19,142 @@
<meta name="keywords" content="{{ $product->meta_keywords }}"/> <meta name="keywords" content="{{ $product->meta_keywords }}"/>
@stop @stop
@section('content-wrapper') @push('css')
<style type="text/css">
.recently-viewed {
margin-top: 20px;
}
.store-meta-images > .recently-viewed:first-child {
margin-top: 0px;
}
.categories-sidebar-container {
margin-bottom: 0px;
}
</style>
@endpush
@section('full-content-wrapper')
{!! view_render_event('bagisto.shop.products.view.before', ['product' => $product]) !!} {!! view_render_event('bagisto.shop.products.view.before', ['product' => $product]) !!}
@if ($showRecentlyViewed) <div class="row no-margin">
<section class="col-7 offset-1 product-detail"> @if ($showRecentlyViewed)
@else <section class="col-9 product-detail">
<section class="col-10 offset-1 product-detail"> @else
@endif <section class="col-12 product-detail">
<div class="layouter"> @endif
<product-view> <div class="layouter">
<div class="form-container"> <product-view>
@csrf() <div class="form-container">
@csrf()
<input type="hidden" name="product_id" value="{{ $product->product_id }}"> <input type="hidden" name="product_id" value="{{ $product->product_id }}">
{{-- product-gallery --}} {{-- product-gallery --}}
<div class="left col-lg-5"> <div class="left col-lg-5">
@include ('shop::products.view.gallery') @include ('shop::products.view.gallery')
</div>
{{-- right-section --}}
<div class="right col-lg-7 scrollable">
{{-- product-info-section --}}
<div class="row info">
<h2 class="col-lg-12">{{ $product->name }}</h2>
@if ($total)
<div class="reviews col-lg-12">
<star-ratings
:ratings="{{ $avgStarRating }}"
push-class="mr5"
></star-ratings>
<div class="reviews">
<span>{{ $avgRatings }} Ratings and {{ $total }} Reviews</span>
</div>
</div>
@endif
@include ('shop::products.view.stock', ['product' => $product])
<div class="col-12 price">
@include ('shop::products.price', ['product' => $product])
</div> </div>
@include ('shop::products.add-to-cart', [ {{-- right-section --}}
'product' => $product, <div class="right col-lg-7 scrollable">
'showCartIcon' => false {{-- product-info-section --}}
]) <div class="row info">
<h2 class="col-lg-12">{{ $product->name }}</h2>
@if ($total)
<div class="reviews col-lg-12">
<star-ratings
:ratings="{{ $avgStarRating }}"
push-class="mr5"
></star-ratings>
<div class="reviews">
<span>{{ $avgRatings }} Ratings and {{ $total }} Reviews</span>
</div>
</div>
@endif
@include ('shop::products.view.stock', ['product' => $product])
<div class="col-12 price">
@include ('shop::products.price', ['product' => $product])
</div>
@include ('shop::products.add-to-cart', [
'product' => $product,
'showCartIcon' => false
])
</div>
{!! view_render_event('bagisto.shop.products.view.short_description.before', ['product' => $product]) !!}
<div class="description">
<h3 class="col-lg-12">{{ __('velocity::app.products.short-description') }}</h3>
{!! $product->short_description !!}
</div>
{!! view_render_event('bagisto.shop.products.view.short_description.after', ['product' => $product]) !!}
{!! view_render_event('bagisto.shop.products.view.quantity.before', ['product' => $product]) !!}
@if ($product->getTypeInstance()->showQuantityBox())
<quantity-changer></quantity-changer>
@else
<input type="hidden" name="quantity" value="1">
@endif
{!! view_render_event('bagisto.shop.products.view.quantity.after', ['product' => $product]) !!}
@include ('shop::products.view.configurable-options')
@include ('shop::products.view.downloadable')
@include ('shop::products.view.grouped-products')
@include ('shop::products.view.bundle-options')
@include ('shop::products.view.attributes', [
'active' => true
])
{{-- product long description --}}
@include ('shop::products.view.description')
{{-- reviews count --}}
@include ('shop::products.view.reviews', ['accordian' => true])
</div>
</div> </div>
</product-view>
{!! view_render_event('bagisto.shop.products.view.short_description.before', ['product' => $product]) !!}
<div class="description">
<h3 class="col-lg-12">{{ __('velocity::app.products.short-description') }}</h3>
{!! $product->short_description !!}
</div>
{!! view_render_event('bagisto.shop.products.view.short_description.after', ['product' => $product]) !!}
{!! view_render_event('bagisto.shop.products.view.quantity.before', ['product' => $product]) !!}
@if ($product->getTypeInstance()->showQuantityBox())
<quantity-changer></quantity-changer>
@else
<input type="hidden" name="quantity" value="1">
@endif
{!! view_render_event('bagisto.shop.products.view.quantity.after', ['product' => $product]) !!}
@include ('shop::products.view.configurable-options')
@include ('shop::products.view.downloadable')
@include ('shop::products.view.grouped-products')
@include ('shop::products.view.bundle-options')
@include ('shop::products.view.attributes', [
'active' => true
])
{{-- product long description --}}
@include ('shop::products.view.description')
{{-- reviews count --}}
@include ('shop::products.view.reviews', ['accordian' => true])
</div>
</div> </div>
</product-view>
@include ('shop::products.view.related-products')
@include ('shop::products.view.up-sells')
</section>
<div class="store-meta-images col-3">
@foreach (json_decode($velocityMetaData['product_view_images'], true) as $image)
@if ($image && $image !== '')
<img src="{{ url()->to('/') }}/storage/{{ $image }}" />
@endif
@endforeach
@if ($showRecentlyViewed)
@include ('shop::products.list.recently-viewed')
@endif
</div> </div>
@include ('shop::products.view.related-products') </div>
@include ('shop::products.view.up-sells')
</section>
@if ($showRecentlyViewed)
@include ('shop::products.list.recently-viewed')
@endif
{!! view_render_event('bagisto.shop.products.view.after', ['product' => $product]) !!} {!! view_render_event('bagisto.shop.products.view.after', ['product' => $product]) !!}
@endsection @endsection
@push('scripts') @push('scripts')
<script type="text/x-template" id="product-view-template"> <script type="text/x-template" id="product-view-template">
<form method="POST" id="product-form" action="{{ route('cart.add', $product->product_id) }}" @click="onSubmit($event)"> <form method="POST" id="product-form" action="{{ route('cart.add', $product->product_id) }}" @click="onSubmit($event)">
@ -155,17 +181,33 @@
<script type="text/javascript"> <script type="text/javascript">
Vue.component('product-view', { Vue.component('product-view', {
template: '#product-view-template',
inject: ['$validator'], inject: ['$validator'],
template: '#product-view-template',
data: function() { data: function() {
return { return {
is_buy_now: 0, is_buy_now: 0,
} }
}, },
mounted: function () {
let currentProductId = '{{ $product->url_key }}';
let existingViewed = window.localStorage.getItem('recentlyViewed');
if (! existingViewed) {
existingViewed = [];
} else {
existingViewed = JSON.parse(existingViewed);
}
if (existingViewed.indexOf(currentProductId) == -1) {
existingViewed.push(currentProductId);
if (existingViewed.length >= 4)
existingViewed = existingViewed.slice(Math.max(existingViewed.length - 4, 1));
window.localStorage.setItem('recentlyViewed', JSON.stringify(existingViewed));
}
},
methods: { methods: {
onSubmit: function(e) { onSubmit: function(e) {
if (e.target.getAttribute('type') != 'submit') if (e.target.getAttribute('type') != 'submit')
@ -189,9 +231,8 @@
}); });
Vue.component('quantity-changer', { Vue.component('quantity-changer', {
template: '#quantity-changer-template',
inject: ['$validator'], inject: ['$validator'],
template: '#quantity-changer-template',
props: { props: {
controlName: { controlName: {
@ -257,8 +298,7 @@
var productHeroImage = document.getElementsByClassName('product-hero-image')[0]; var productHeroImage = document.getElementsByClassName('product-hero-image')[0];
if (thumbList && productHeroImage) { if (thumbList && productHeroImage) {
for (let i=0; i < thumbFrame.length ; i++) {
for(let i=0; i < thumbFrame.length ; i++) {
thumbFrame[i].style.height = (productHeroImage.offsetHeight/4) + "px"; thumbFrame[i].style.height = (productHeroImage.offsetHeight/4) + "px";
thumbFrame[i].style.width = (productHeroImage.offsetHeight/4)+ "px"; thumbFrame[i].style.width = (productHeroImage.offsetHeight/4)+ "px";
} }

View File

@ -182,11 +182,13 @@
</div> </div>
<div class="col-lg-12 review-date-time"> <div class="col-lg-12 review-date-time">
<span>{{ __('velocity::app.products.review-by') }} -</span> @if ("{{ $review->name }}")
<span>{{ __('velocity::app.products.review-by') }} -</span>
<label> <label>
{{ $review->name }}, {{ $review->name }},
</label> </label>
@endif
<span>{{ core()->formatDate($review->created_at, 'F d, Y') }} <span>{{ core()->formatDate($review->created_at, 'F d, Y') }}
</span> </span>

View File

@ -1,23 +1,29 @@
@inject ('wishListHelper', 'Webkul\Customer\Helpers\Wishlist') @inject ('wishListHelper', 'Webkul\Customer\Helpers\Wishlist')
@auth('customer') {!! view_render_event('bagisto.shop.products.wishlist.before') !!}
{!! view_render_event('bagisto.shop.products.wishlist.before') !!} @auth('customer')
@php
$isWished = $wishListHelper->getWishlistProduct($product);
@endphp
@php <a
$isWished = $wishListHelper->getWishlistProduct($product); class="unset wishlist-icon col-4 offset-4 text-right"
@endphp @if (! $isWished)
href="{{ route('customer.wishlist.add', $product->product_id) }}"
@elseif (isset($itemId) && $itemId)
href="{{ route('customer.wishlist.remove', $itemId) }}"
@endif
>
<a <i class="fs24 {{ $isWished ? 'rango-heart-fill' : 'rango-heart'}}"></i>
class="unset wishlist-icon col-4 offset-4 text-right" </a>
@if (! $isWished) @endauth
href="{{ route('customer.wishlist.add', $product->product_id) }}"
@elseif (isset($itemId) && $itemId)
href="{{ route('customer.wishlist.remove', $itemId) }}"
@endif
>
<i class="fs24 {{ $isWished ? 'rango-heart-fill' : 'rango-heart'}}"></i> @guest('customer')
</a> <a
href="{{ route('customer.session.index') }}"
{!! view_render_event('bagisto.shop.products.wishlist.after') !!} class="unset wishlist-icon col-4 offset-4 text-right">
@endauth <i class="fs24 rango-heart"></i>
</a>
@endauth
{!! view_render_event('bagisto.shop.products.wishlist.after') !!}