This commit is contained in:
Aayush Bhatt 2020-01-10 18:34:36 +05:30
commit acadbbea1f
49 changed files with 1238 additions and 827 deletions

View File

@ -1,8 +1,8 @@
<?php
use Illuminate\Database\Seeder;
use Webkul\Velocity\Database\Seeders\VelocityMetaDataSeeder;
use Webkul\Admin\Database\Seeders\DatabaseSeeder as BagistoDatabaseSeeder;
use Webkul\Velocity\Database\Seeders\VelocityMetaDataSeeder as VelocityDatabaseSeeder;
class DatabaseSeeder extends Seeder
{
@ -14,6 +14,6 @@ class DatabaseSeeder extends Seeder
public function run()
{
$this->call(BagistoDatabaseSeeder::class);
$this->call(VelocityDatabaseSeeder::class);
$this->call(VelocityMetaDataSeeder::class);
}
}

View File

@ -7,31 +7,11 @@
background-image: url("../images/Icon-Velocity.svg");
}
.router-link-active .velocity-icon,
.active .velocity-icon {
.router-link-active .velocity-icon, .active .velocity-icon {
background-image: url("../images/Icon-Velocity-Active.svg");
}
.router-link-active.velocity-icon,
.active.velocity-icon {
background-image: url("../images/Icon-Velocity-Active.svg");
}
.velocity-icon {
width: 60px;
height: 55px;
display: inline-block;
background-size: cover;
background-image: url("../images/Icon-Velocity.svg");
}
.router-link-active .velocity-icon,
.active .velocity-icon {
background-image: url("../images/Icon-Velocity-Active.svg");
}
.router-link-active.velocity-icon,
.active.velocity-icon {
.router-link-active.velocity-icon, .active.velocity-icon {
background-image: url("../images/Icon-Velocity-Active.svg");
}
@ -700,6 +680,22 @@
content: "\E99F";
}
.velocity-icon {
width: 60px;
height: 55px;
display: inline-block;
background-size: cover;
background-image: url("../images/Icon-Velocity.svg");
}
.router-link-active .velocity-icon, .active .velocity-icon {
background-image: url("../images/Icon-Velocity-Active.svg");
}
.router-link-active.velocity-icon, .active.velocity-icon {
background-image: url("../images/Icon-Velocity-Active.svg");
}
.qty-btn {
height: 36px;
display: inline-block;
@ -728,9 +724,9 @@
}
.btn-add-to-cart {
padding: 8px;
color: #fff !important;
padding: 8px !important;
border-radius: 0px !important;
color: #FFFFFF !important;
border-color: #26A37C !important;
background-color: #26A37C !important;
}
@ -1195,6 +1191,7 @@
}
.customer-options {
top: 40px;
float: right;
padding: 20px;
height: 150px;
@ -1210,6 +1207,7 @@
.customer-options li {
padding: 3px 0;
height: unset !important;
}
.customer-options a {
@ -1291,7 +1289,7 @@
top: 44px;
z-index: 100;
width: 350px;
left: -230px;
left: -265px;
position: absolute;
}
@ -1302,6 +1300,14 @@
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 {
margin: 0;
width: 100%;
@ -1362,6 +1368,7 @@
.cart-details .cart-details-header .cart-header {
max-height: 45px;
margin-bottom: 20px;
padding-bottom: 20px !important;
border-bottom: 2px solid #E5E5E5;
}
@ -1811,6 +1818,9 @@
.order-summary-container {
padding-top: 25px;
height: -webkit-max-content;
height: -moz-max-content;
height: max-content;
max-width: 500px !important;
}
@ -1898,6 +1908,7 @@
}
.product-price .regular-price {
font-weight: 500;
margin-right: 10px;
text-decoration: line-through;
}
@ -1917,6 +1928,8 @@
.method-sticker {
font-size: 13px;
padding: 4px 8px;
margin-right: 3px;
margin-bottom: 3px;
text-align: center;
border-radius: 1px;
display: inline-block;
@ -1925,13 +1938,10 @@
}
.sidebar {
z-index: 1000000;
width: 230px;
}
.sidebar .category-content {
margin-bottom: 10px;
}
.sidebar .category-content .category-title {
top: -1px;
font-weight: 600;
@ -1965,8 +1975,53 @@
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 {
display: none;
z-index: 100000;
border-top: 1px solid #CCCCCC;
}
@ -2265,6 +2320,10 @@
box-shadow: none;
}
.slides-container .VueCarousel-pagination .VueCarousel-dot {
padding: 5px !important;
}
.slides-container .VueCarousel-dot--active {
background-color: #26A37C !important;
}
@ -2338,65 +2397,6 @@ body .container-margin {
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 {
border-bottom: solid 1px #d8e6ed;
}
@ -2652,15 +2652,13 @@ header #search-form > *:focus {
/* category with custom option */
/* hot & popular categories */
.hot-categories-container .hot-category-wrapper {
padding: 0 10px 15px 0;
padding: 0 10px 0 0;
}
.hot-categories-container .hot-category-wrapper .card {
height: 100%;
padding: 20px;
border: none;
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);
}
.hot-categories-container .hot-category-wrapper .velocity-divide-page .left {
@ -2679,11 +2677,11 @@ header #search-form > *:focus {
}
.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 {
padding: 15px 0 15px 10px;
padding: 0 0 0 10px;
}
.hot-categories-container ul,
@ -2721,8 +2719,7 @@ header #search-form > *:focus {
}
.popular-categories-container .popular-category-wrapper .card-description {
padding: 25px;
margin-top: 15px;
padding: 10px 20px;
}
.popular-categories-container .popular-category-wrapper:first-child {
@ -2798,6 +2795,7 @@ header #search-form > *:focus {
.categories-sidebar-container .content-list {
margin: 0;
width: 100%;
height: 42px;
text-align: left;
list-style: none;
position: relative;
@ -2807,8 +2805,7 @@ header #search-form > *:focus {
.categories-sidebar-container .content-list ul {
width: 100%;
height: 104%;
padding-left: 10px;
height: 100%;
display: -webkit-inline-box;
display: -ms-inline-flexbox;
display: inline-flex;
@ -2820,11 +2817,15 @@ header #search-form > *:focus {
cursor: pointer;
font-size: 16px;
font-weight: 600;
padding: 8px 15px;
letter-spacing: 0;
position: relative;
color: #FFFFFF;
text-decoration: none;
padding: 8px 20px 8px 5px;
}
.categories-sidebar-container .content-list ul li:hover {
background-color: #42719a;
}
.velocity-divide-page {
@ -2997,22 +2998,25 @@ body::after {
.footer .footer-content .newsletter-subscription .newsletter-wrapper input.subscribe-field {
width: 300px;
height: 38px;
border: none;
height: 38px;
font-size: 18px;
max-width: 250px;
padding: 10px 20px;
color: rgba(0, 0, 0, 0.83);
}
.footer .footer-content .newsletter-subscription .newsletter-wrapper button.subscribe-btn {
left: -1px;
left: -2px;
height: 38px;
font-size: 18px;
max-width: 110px;
line-height: 10px;
position: relative;
}
.footer .footer-content .newsletter-subscription .newsletter-wrapper .social-icons {
height: 100%;
padding: 20px 0;
color: #FFFFFF;
}
@ -3035,7 +3039,7 @@ body::after {
}
.footer .footer-content .newsletter-subscription .newsletter-wrapper .subscribe-newsletter {
padding: 30px 0;
padding: 25px 0 30px 0;
}
.footer .footer-content > .row {
@ -3055,7 +3059,15 @@ body::after {
line-height: 2.5rem;
}
.footer .footer-content > .row .footer-ct-content > div li a {
.footer .footer-content > .row .footer-ct-content > div ul {
margin-bottom: 0px;
}
.footer .footer-content > .row .footer-ct-content > div ul li {
margin-bottom: 5px;
}
.footer .footer-content > .row .footer-ct-content > div ul li a {
color: rgba(255, 255, 255, 0.83);
}
@ -3396,6 +3408,10 @@ body::after {
cursor: pointer;
}
.cursor-default {
cursor: default;
}
.grey {
color: #9e9e9e;
}
@ -3699,6 +3715,12 @@ body::after {
.small-card-container {
cursor: pointer;
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 {
@ -3716,6 +3738,11 @@ body::after {
padding: 10px 0 !important;
}
.small-card-container .sticker,
.small-card-container .regular-price {
display: none;
}
.small-card-container:hover {
-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);
@ -3845,6 +3872,8 @@ a.default {
.scrollable {
max-height: 100vh;
overflow-y: scroll;
scrollbar-width: none;
-ms-overflow-style: none;
}
.scrollable::-webkit-scrollbar {
@ -3924,8 +3953,13 @@ button[disabled] {
font-size: 14px;
}
.max-height-350 {
max-height: 350px;
}
.product-detail {
padding-top: 20px;
margin-bottom: 60px;
}
.product-detail .magnifier > img {
@ -3946,6 +3980,10 @@ button[disabled] {
padding: 0 15px;
}
.product-detail .right .reviews {
vertical-align: top;
}
.product-detail .right .reviews > div {
display: inline-block;
}
@ -4060,6 +4098,32 @@ button[disabled] {
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) {
.footer .footer-content .newsletter-subscription .newsletter-wrapper .social-icons {
width: 100%;
padding: 5px 0;
text-align: center !important;
}
.footer .footer-content .newsletter-subscription .newsletter-wrapper .subscribe-newsletter {
width: 100%;
padding: 10px 0;
text-align: center;
}
.footer .footer-content .footer-statics > div:not(:last-child) {
margin-bottom: 30px;
}
}
/*!
* Bootstrap v3.4.1 (https://getbootstrap.com/)
* Copyright 2011-2019 Twitter, Inc.
@ -11039,7 +11103,7 @@ button.close {
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%);
transform: translate(0, -25%);
-webkit-transition: -webkit-transform 0.3s ease-out;
@ -11048,7 +11112,7 @@ button.close {
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);
transform: translate(0, 0);
}
@ -11058,7 +11122,7 @@ button.close {
overflow-y: auto;
}
.modal-dialog, .account-modal {
.modal-dialog, #top #account + .account-modal {
position: relative;
width: auto;
margin: 10px;
@ -11170,7 +11234,7 @@ button.close {
}
@media (min-width: 768px) {
.modal-dialog, .account-modal {
.modal-dialog, #top #account + .account-modal {
width: 600px;
margin: 30px auto;
}
@ -12228,17 +12292,41 @@ body {
#top #account .select-icon {
top: 0px;
left: -3px;
left: 0px;
padding-left: 5px;
}
#top #account .welcome-content {
width: 150px;
float: right;
display: table;
min-width: 150px;
cursor: pointer;
text-align: right;
}
#top #account .welcome-content * {
display: table-cell;
vertical-align: middle;
}
#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 {
@ -12249,16 +12337,6 @@ body {
height: 100%;
}
#top > div:last-child .welcome-content {
float: right;
display: table;
}
#top > div:last-child .welcome-content * {
display: table-cell;
vertical-align: middle;
}
.dropdown-menu {
border-top: 3px solid #269c77;
border-radius: 0px;
@ -12370,9 +12448,14 @@ header .logo {
}
header #search-form {
height: 35px;
height: 40px;
margin: 5px 0px;
background: #FFFFFF;
padding: 4px 1px 0px 0px;
}
header #search-form * {
height: 100%;
}
header #search-form .btn-group, header #search-form .quantity {
@ -12385,7 +12468,7 @@ header #search-form .btn-group .selectdiv, header #search-form .quantity .select
header #search-form .btn-group .selectdiv:before, header #search-form .quantity .selectdiv:before {
top: 13px;
left: 100px;
left: 108px;
z-index: 10;
font-size: 16px;
content: "\E906";
@ -12421,11 +12504,6 @@ header #search-form input {
border-left: 1px solid #CCCCCC;
}
header #search-form .btn, header #search-form .quantity button, .quantity header #search-form button,
header #search-form .quantity input, .quantity header #search-form input {
height: 40px;
}
header #search-form .btn:hover, header #search-form .quantity button:hover, .quantity header #search-form button:hover,
header #search-form .quantity input:hover, .quantity header #search-form input:hover {
text-decoration: none;
@ -12698,15 +12776,15 @@ header .dropdown-menu-large .dropdown-footer .checkout-link {
}
#nav-menu .secondary-navbar li a {
padding: 5px 20px 5px 5px;
font-family: SourceSansPro-Semibold;
font-size: 16px;
color: #FFFFFF;
letter-spacing: 0;
display: block;
position: relative;
text-decoration: none;
cursor: pointer;
font-size: 16px;
font-weight: 600;
letter-spacing: 0;
position: relative;
color: #FFFFFF;
text-decoration: none;
padding: 5px 20px 5px 5px;
}
.viewed-products .viewed-products-listing {
@ -12835,10 +12913,6 @@ i.within-circle {
height: 50px;
}
.mb60 {
margin-bottom: 60px;
}
.center_div {
margin: 0 auto;
width: 80%;

View File

@ -35539,9 +35539,11 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
//
//
//
//
//
/* harmony default export */ __webpack_exports__["default"] = ({
props: ['id', 'url', 'addClass', 'categories', 'mainSidebar', 'categoryCount'],
props: ['id', 'url', 'addClass', 'parentSlug', 'categories', 'mainSidebar', 'categoryCount'],
data: function data() {
var slicedCategories = this.categories;
@ -35551,6 +35553,8 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
slicedCategories = this.categories.slice(0, categoryCount);
}
if (this.parentSlug) slicedCategories['parentSlug'] = this.parentSlug;
return {
slicedCategories: slicedCategories,
sidebarLevel: Math.floor(Math.random() * 1000)
@ -35621,7 +35625,13 @@ var render = function() {
staticClass: "category unset",
class: category.children.length > 0 ? "fw6" : "",
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", {
attrs: {
url: _vm.url,
categories: category.children,
id:
"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"] = ({
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_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,
'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) {
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['product_view_images'] = json_encode($params['product_view_images']);
$params['home_page_content'] = str_replace('=&gt;', '=>', $params['home_page_content']);
unset($params['images']);
@ -82,11 +89,12 @@ class ConfigurationController extends Controller
return redirect()->route($this->_config['redirect']);
}
public function uploadImages($data, $index)
public function uploadAdvertisementImages($data, $index)
{
$type = 'images';
$request = request();
$advertisement = [];
foreach ($data as $imageId => $image) {
$file = $type . '.' . $index . '.' . $imageId;
$dir = "velocity/$type";
@ -100,4 +108,22 @@ class ConfigurationController extends Controller
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/admin-routes.php';
include __DIR__ . '/../Http/front-routes.php';
$this->app->register(EventServiceProvider::class);
@ -46,7 +47,7 @@ class VelocityServiceProvider extends ServiceProvider
$velocityHelper = app('Webkul\Velocity\Helpers\Helper');
$velocityMetaData = $velocityHelper->getVelocityMetaData();
view()->share('showRecentlyViewed', false);
view()->share('showRecentlyViewed', true);
view()->share('velocityMetaData', $velocityMetaData);
}

View File

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

View File

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

View File

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

View File

@ -1,13 +1,14 @@
@import "icons";
@import "variables";
@import "mixins";
@import "rango";
@import "icons";
@import "mixins";
@import "variables";
@import "components/UI";
@import "components/app";
@import "components/home";
@import "components/footer";
@import "components/shared";
@import "components/product-view";
@import "components/media";
@import "node_modules/bootstrap-sass/assets/stylesheets/bootstrap";
@ -179,19 +180,42 @@ body {
.select-icon {
top: 0px;
left: -3px;
left: 0px;
padding-left: 5px;
}
.welcome-content {
@extend .unselectable;
width: 150px;
float: right;
display: table;
min-width: 150px;
cursor: pointer;
text-align: right;
* {
display: table-cell;
vertical-align: middle;
}
}
+ .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;
}
}
}
@ -201,16 +225,6 @@ body {
* {
height: 100%;
}
.welcome-content {
float: right;
display: table;
* {
display: table-cell;
vertical-align: middle;
}
}
}
}
@ -330,9 +344,14 @@ header {
}
#search-form {
height: 35px;
height: 40px;
margin: 5px 0px;
background: $white-color;
padding: 4px 1px 0px 0px;
* {
height: 100%;
}
.btn-group {
max-width: 550px;
@ -345,7 +364,7 @@ header {
.selectdiv:before {
top: 13px;
left: 100px;
left: 108px;
z-index: 10;
font-size: 16px;
content: "\E906";
@ -385,8 +404,6 @@ header {
}
.btn {
height: 40px;
&:hover {
text-decoration: none;
}
@ -631,10 +648,6 @@ header {
left: 283px;
width: 250px;
height: 350px;
.child-category {
}
}
}
}
@ -656,15 +669,15 @@ header {
float: left;
a {
padding: 5px 20px 5px 5px;
font-family: SourceSansPro-Semibold;
font-size: 16px;
color: #FFFFFF;
letter-spacing: 0;
display: block;
position: relative;
text-decoration: none;
cursor: pointer;
font-size: 16px;
font-weight: 600;
letter-spacing: 0;
position: relative;
color: $white-color;
text-decoration: none;
padding: 5px 20px 5px 5px;
}
}
}
@ -795,10 +808,6 @@ i.within-circle {
height: 50px;
}
.mb60 {
margin-bottom: 60px;
}
.center_div {
margin: 0 auto;
width: 80%/* value of your choice which suits your alignment */

View File

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

View File

@ -405,6 +405,7 @@
}
.customer-options{
top: 40px;
float: right;
padding: 20px;
height: 150px;
@ -422,6 +423,7 @@
li {
padding: 3px 0;
height: unset !important;
}
a {
@ -509,7 +511,7 @@
top: 44px;
z-index: 100;
width: 350px;
left: -230px;
left: -265px;
position: absolute;
.close {
@ -519,6 +521,14 @@
position: relative;
}
.mini-cart-container {
height: 100%;
font-size: 14px;
max-height: 200px;
overflow-y: scroll;
padding: 10px 15px 0 20px;
}
.small-card-container {
margin: 0;
width: 100%;
@ -579,6 +589,7 @@
.cart-header {
max-height: 45px;
margin-bottom: 20px;
padding-bottom: 20px !important;
border-bottom: 2px solid $border-general;
> h3 {
@ -1083,6 +1094,7 @@
.order-summary-container {
padding-top: 25px;
height: max-content;
max-width: 500px !important;
> div {
@ -1170,6 +1182,7 @@
}
.regular-price {
font-weight: 500;
margin-right: 10px;
text-decoration: line-through;
}
@ -1192,6 +1205,8 @@
.method-sticker {
font-size: 13px;
padding: 4px 8px;
margin-right: 3px;
margin-bottom: 3px;
text-align: center;
border-radius: 1px;
display: inline-block;
@ -1200,10 +1215,11 @@
}
.sidebar {
z-index: 1000000;
width: $sidebar-width;
.category-content {
margin-bottom: 10px;
// margin-bottom: 10px;
.category-title {
top: -1px;
@ -1244,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 {
display: none;
z-index: 100000;
border-top: 1px solid $border-common;
}
@ -1568,6 +1633,10 @@
outline: none;
box-shadow: none;
}
.VueCarousel-dot {
padding: 5px !important;
}
}
.VueCarousel-dot--active {

View File

@ -19,22 +19,25 @@
input.subscribe-field {
width: 300px;
height: 38px;
border: none;
height: 38px;
font-size: 18px;
max-width: 250px;
padding: 10px 20px;
color: rgba(0,0,0,0.83);
}
button.subscribe-btn {
left: -1px;
left: -2px;
height: 38px;
font-size: 18px;
max-width: 110px;
line-height: 10px;
position: relative;
}
.social-icons {
height: 100%;
padding: 20px 0;
color: $light-color;
@ -57,7 +60,7 @@
}
.subscribe-newsletter {
padding: 30px 0;
padding: 25px 0 30px 0;
}
}
}
@ -78,8 +81,16 @@
font-size: 14px;
line-height: 2.5rem;
li a {
color: rgba(255,255,255,0.83);
ul {
margin-bottom: 0px;
li {
margin-bottom: 5px;
a {
color: rgba(255,255,255,0.83);
}
}
}
}
}

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 {
border-bottom: solid 1px #d8e6ed;
}
@ -352,14 +287,14 @@ header #search-form > *:focus {
.hot-categories-container {
.hot-category-wrapper {
padding: 0 10px 15px 0;
padding: 0 10px 0 0;
.card {
height: 100%;
padding: 20px;
border: none;
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);
// -webkit-box-shadow: 0 6px 14px 0 rgba(0, 0, 0, 0.14);
}
.velocity-divide-page {
@ -381,11 +316,11 @@ header #search-form > *:focus {
}
.hot-category-wrapper:nth-last-child(2) {
padding: 15px 0 15px 0px;
padding: 0 0 0 0px;
}
.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 {
padding: 25px;
margin-top: 15px;
padding: 10px 20px;
}
}
@ -513,6 +447,7 @@ header #search-form > *:focus {
.content-list {
margin: 0;
width: 100%;
height: 42px;
text-align: left;
list-style: none;
position: relative;
@ -521,8 +456,7 @@ header #search-form > *:focus {
ul {
width: 100%;
height: 104%;
padding-left: 10px;
height: 100%;
display: inline-flex;
background-color: $link-color;
@ -532,13 +466,17 @@ header #search-form > *:focus {
cursor: pointer;
font-size: 16px;
font-weight: 600;
padding: 8px 15px;
letter-spacing: 0;
position: relative;
color: $white-color;
text-decoration: none;
padding: 8px 20px 8px 5px;
}
}
li:hover {
background-color: #42719a;
}
}
}
}

View File

@ -0,0 +1,43 @@
@media only screen and (max-width: 1100px) {
.footer {
.footer-content {
.newsletter-subscription {
.newsletter-wrapper {
.social-icons {
width: 100%;
padding: 5px 0;
text-align: center !important;
}
.subscribe-newsletter {
width: 100%;
padding: 10px 0;
text-align: center;
}
}
}
.footer-statics {
> div:not(:last-child) {
margin-bottom: 30px;
}
}
}
}
}
@media only screen and (max-width: 992px) {
}
@media only screen and (max-width: 768px) {
// body {
// display: none;
// }
}
@media only screen and (max-width: 576px) {
// body {
// display: block;
// }
}

View File

@ -1,5 +1,6 @@
.product-detail {
padding-top: 20px;
margin-bottom: 60px;
.magnifier {
> img {
@ -31,6 +32,8 @@
}
.reviews {
vertical-align: top;
> div {
display: inline-block;
}
@ -206,4 +209,15 @@
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-default {
cursor: default;
}
.grey {
color: rgb(158, 158, 158);
@ -500,6 +503,12 @@
.small-card-container {
cursor: pointer;
margin-bottom: 10px;
margin-left: 0 !important;
margin-right: 0 !important;
.material-icons {
font-size: 16px;
}
.product-image-container {
padding: 0;
@ -517,6 +526,11 @@
display: inline-block;
padding: 10px 0 !important;
}
.sticker,
.regular-price {
display: none;
}
}
.small-card-container:hover {
@ -656,6 +670,8 @@ a {
.scrollable {
max-height: 100vh;
overflow-y: scroll;
scrollbar-width: none;
-ms-overflow-style: none;
}
.scrollable::-webkit-scrollbar {
@ -729,4 +745,8 @@ button[disabled] {
.description-text {
font-size: 14px;
}
.max-height-350 {
max-height: 350px;
}

View File

@ -95,13 +95,14 @@ return [
'subscription-content' => 'Subscription bar Content',
'activate-slider' => 'Activate Slider',
'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',
'update-meta-data' => 'Update Meta Data',
'advertisement-four' => 'Advertisement Four Images',
'advertisement-three' => 'Advertisement Three Images',
'advertisement-two' => 'Advertisement Two Images',
'advertisement-one' => 'Advertisement One Images',
'product-view-image' => 'Product View Image',
'footer' => 'Footer',
],
'category' => [

View File

@ -1,5 +1,5 @@
<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
v-if="editable"
type="number"
@ -7,30 +7,35 @@
name="rating"
class="hidden" />
<span
:class="`rango-star-fill ${editable ? 'cursor-pointer' : ''}`"
<i
:class="`material-icons ${editable ? 'cursor-pointer' : ''}`"
v-for="(rating, index) in parseInt(showFilled ? showFilled : 3)"
:key="`${index}${Math.random()}`"
@click="updateRating(index + 1)">
</span>
star
</i>
<template v-if="!hideBlank">
<span
:class="`rango-star ${editable ? 'cursor-pointer' : ''}`"
<i
:class="`material-icons ${editable ? 'cursor-pointer' : ''}`"
v-for="(blankStar, index) in (5 - (showFilled ? showFilled : 3))"
:key="`${index}${Math.random()}`"
@click="updateRating(showFilled + index + 1)">
</span>
star_border
</i>
</template>
{{-- <i class="material-icons">star_border</i>
<i class="material-icons">star</i> --}}
</div>
</script>
<script type="text/x-template" id="cart-btn-template">
<button
:class="`btn btn-link disable-box-shadow ${parseInt(itemCount)}`"
type="button"
id="mini-cart"
@click="toggleMiniCart">
@click="toggleMiniCart"
class="btn btn-link disable-box-shadow">
<div class="mini-cart-content">
<i class="icon fs16 cell rango-arrow-down down-icon-position down-arrow-margin"></i>

View File

@ -121,6 +121,14 @@
input-name="images[1]">
</image-wrapper>
</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>
</accordian>

View File

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

View File

@ -573,20 +573,6 @@
onSubmit: function() {
var this_this = this;
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() {
@ -603,16 +589,6 @@
removeCoupon: function () {
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

@ -14,6 +14,7 @@
<a class="unset fw6 full-width" href="{{ $subMenuItem['url'] }}">
<i class="icon {{ $index }} text-down-3"></i>
<span>{{ trans($subMenuItem['name']) }}<span>
<i class="rango-arrow-right pull-right text-down-3"></i>
</a>
</li>
@endforeach

View File

@ -9,94 +9,97 @@
{!! view_render_event('bagisto.shop.customers.login.before') !!}
<div class="container">
<div class="heading">
<h2 class="fs24 fw6">
{{ __('velocity::app.customer.login-form.customer-login')}}
</h2>
<div class="container">
<div class="row col-10 offset-1">
<div class="heading">
<h2 class="fs24 fw6">
{{ __('velocity::app.customer.login-form.customer-login')}}
</h2>
<a href="{{ route('customer.register.index') }}" class="btn-new-customer">
<button type="button" class="theme-btn light">
{{ __('velocity::app.customer.login-form.new-customer')}}
</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 href="{{ route('customer.register.index') }}" class="btn-new-customer">
<button type="button" class="theme-btn light">
{{ __('velocity::app.customer.login-form.new-customer')}}
</button>
</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') !!}
<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>
{!! view_render_event('bagisto.shop.customers.login.after') !!}
</div>
@endsection

View File

@ -1,58 +1,71 @@
@extends('shop::layouts.master')
@section('page_title')
{{ __('shop::app.customer.forgot-password.page_title') }}
@stop
{{ __('shop::app.customer.forgot-password.page_title') }}
@endsection
@section('content-wrapper')
<div class="auth-content">
<div class="container">
<div class="login-text">
<h2 style="font-weight:bold;" class="fs24">
{{ __('velocity::app.customer.forget-password.forgot-password')}}
<div style="" class="w3-card-login"><a href="{{ route('customer.session.index') }}" class="btn-new-customer-login">{{ __('velocity::app.customer.signup-form.login')}}</a></div>
</h2>
</div>
<div class="mb60" style="height:260px;width:575px;border:1px solid #E5E5E5;margin: 0 auto;margin-bottom:44px;">
<div style="margin: 45px;">
<div class="auth-content form-container">
<div class="container">
<div class="row col-10 offset-1">
<div class="heading">
<h2 class="fs24 fw6">
{{ __('velocity::app.customer.forget-password.forgot-password')}}
</h2>
<p class="fs16" style="font-weight:bold">
{{ __('velocity::app.customer.forget-password.recover-password')}}
</p>
<p class="fs16">
{{ __('velocity::app.customer.forget-password.recover-password-text')}}
</p>
<a href="{{ route('customer.session.index') }}" class="btn-new-customer">
<button type="button" class="theme-btn light">
{{ __('velocity::app.customer.signup-form.login') }}
</button>
</a>
</div>
{!! view_render_event('bagisto.shop.customers.forget_password.before') !!}
<div class="body col-12">
<h3 class="fw6">
{{ __('velocity::app.customer.forget-password.recover-password')}}
</h3>
<p class="fs16">
{{ __('velocity::app.customer.forget-password.recover-password-text')}}
</p>
{!! view_render_event('bagisto.shop.customers.forget_password.before') !!}
<form
method="post"
action="{{ route('customer.register.create') }}"
@submit.prevent="onSubmit">
{{ csrf_field() }}
<form method="post" action="{{ route('customer.forgot-password.store') }}" @submit.prevent="onSubmit">
{{ csrf_field() }}
<div class="login-form">
{!! view_render_event('bagisto.shop.customers.forget_password_form_controls.before') !!}
<div class="control-group" :class="[errors.has('email') ? 'has-error' : '']">
<label for="email" class="label-style">{{ __('shop::app.customer.forgot-password.email') }}</label>
<input type="email" class="form-control" name="email" v-validate="'required|email'">
<span class="control-error" v-if="errors.has('email')">@{{ errors.first('email') }}</span>
<label for="email" class="required label-style">
{{ __('shop::app.customer.forgot-password.email') }}
</label>
<input
type="email"
class="form-style"
name="email"
v-validate="'required|email'" />
<span class="control-error" v-if="errors.has('email')">
@{{ errors.first('email') }}
</span>
</div>
<br>
{!! view_render_event('bagisto.shop.customers.forget_password_form_controls.before') !!}
<div class="button-group">
<button type="submit" class="btn btn-dark-green">
{{ __('shop::app.customer.forgot-password.submit') }}
</button>
</div>
</div>
</form>
{!! view_render_event('bagisto.shop.customers.forget_password.before') !!}
{!! view_render_event('bagisto.shop.customers.forget_password_form_controls.after') !!}
<button class="theme-btn" type="submit">
{{ __('shop::app.customer.forgot-password.submit') }}
</button>
</form>
{!! view_render_event('bagisto.shop.customers.forget_password.after') !!}
</div>
</div>
</div>
</div>
</div>
@endsection
@endsection

View File

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

View File

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

View File

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

View File

@ -16,9 +16,11 @@
<div class="row flex-nowrap">
<carousel-component
:slides-count="{{ $featuredProductsCount }}"
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)

View File

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

View File

@ -1,4 +1,4 @@
<div class="col-4 software-description">
<div class="col-lg-4 col-md-12 col-sm-12 software-description">
<div class="logo">
<a href="{{ route('shop.home.index') }}">
@if ($logo = core()->getCurrentChannel()->logo_url)

View File

@ -1 +1,5 @@
{!! $velocityMetaData->footer_middle_content !!}
<div class="col-lg-4 col-md-12 col-sm-12 footer-ct-content">
<div class="row">
{!! $velocityMetaData->footer_middle_content !!}
</div>
</div>

View File

@ -20,14 +20,13 @@
}
@endphp
<div class="col-4 footer-rt-content">
<div class="col-lg-4 col-md-12 col-sm-12 footer-rt-content">
<div class="row">
<div class="mb5">
<div class="mb5 col-12">
<h3>{{ __('velocity::app.home.payment-methods') }}</h3>
</div>
<div class="payment-methods">
<div class="payment-methods col-12">
@foreach($activePayments as $paymentMethod)
<div class="method-sticker">
{{ $paymentMethod}}
@ -37,11 +36,11 @@
</div>
<div class="row">
<div class="mb5">
<h3>{{ __('velocity::app.home.payment-methods') }}</h3>
<div class="mb5 col-12">
<h3>{{ __('velocity::app.home.shipping-methods') }}</h3>
</div>
<div class="shipping-methods">
<div class="shipping-methods col-12">
@foreach($activeShippings as $shippingMethod)
<div class="method-sticker">
{{ $shippingMethod}}
@ -49,5 +48,4 @@
@endforeach
</div>
</div>
</div>

View File

@ -2,15 +2,13 @@
<div class="footer-content">
@include('shop::layouts.footer.newsletter-subscription')
@include('shop::layouts.footer.footer-links')
@if ($categories)
@include('shop::layouts.footer.top-brands')
{{-- @include('shop::layouts.footer.top-brands') --}}
@endif
@include('shop::layouts.footer.copy-right')
</div>
</div>

View File

@ -3,38 +3,33 @@
|| core()->getConfigData('customer.settings.newsletter.subscription')
)
<div class="newsletter-subscription">
<div class="newsletter-wrapper">
@if ($velocityMetaData->subscription_bar_content)
{!! $velocityMetaData->subscription_bar_content !!}
@endif
<div class="newsletter-wrapper row">
@if ($velocityMetaData->subscription_bar_content)
{!! $velocityMetaData->subscription_bar_content !!}
@endif
@if (core()->getConfigData('customer.settings.newsletter.subscription'))
<div class="subscribe-newsletter">
@if (core()->getConfigData('customer.settings.newsletter.subscription'))
<div class="subscribe-newsletter col-lg-6 text-right">
<div class="form-container">
<form action="{{ route('shop.subscribe') }}">
<div class="subscriber-form-div">
<div :class="`control-group ${errors.has('subscriber_email') ? 'has-error' : ''}`">
<input
type="email"
name="subscriber_email"
class="control subscribe-field"
placeholder="{{ __('velocity::app.customer.login-form.your-email-address') }}"
required />
<div class="form-container">
<form action="{{ route('shop.subscribe') }}">
<div class="subscriber-form-div">
<div
:class="`control-group ${errors.has('subscriber_email') ? 'has-error' : ''}`">
<input
type="email"
class="control subscribe-field"
name="subscriber_email"
placeholder="{{ __('velocity::app.customer.login-form.your-email-address') }}"
required />
<button class="theme-btn subscribe-btn fw6">
{{ __('shop::app.subscription.subscribe') }}
</button>
</div>
</div>
</form>
<button class="theme-btn subscribe-btn fw6">
{{ __('shop::app.subscription.subscribe') }}
</button>
</div>
</div>
</form>
</div>
@endif
</div>
@endif
</div>
</div>
@endif

View File

@ -9,12 +9,11 @@
</a>
<div class="row no-margin right">
<div class="col-8 no-padding">
<div class="col-8 no-padding input-group">
<form
method="GET"
role="search"
id="search-form"
class="input-group"
action="{{ route('shop.search.index') }}">
<div

View File

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

View File

@ -46,7 +46,7 @@
</div>
<div class="product-rating">
<star-ratings ratings="3"></star-ratings>
<star-ratings ratings="{{ $avgRatings }}"></star-ratings>
<span>{{ $totalReviews }} Ratings</span>
</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 ('productImageHelper', 'Webkul\Product\Helpers\ProductImage')
@php
$recentlyViewedProducts = app('Webkul\Product\Repositories\ProductRepository')->getNewProducts(3)->items();
@endphp
<recently-viewed
add-class="{{ isset($addClass) ? $addClass : '' }}"
add-class-wrapper="{{ isset($addClassWrapper) ? $addClassWrapper : '' }}">
</recently-viewed>
<div class="col-3 recently-viewed">
<div class="row mb20 pl20">
<div class="col-12 no-padding">
<h2 class="fs20 fw6">{{ __('velocity::app.products.recently-viewed') }}</h2>
</div>
</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>
@push('scripts')
<script type="text/x-template" id="recently-viewed-template">
<div :class="`${addClass} recently-viewed`">
<div class="row remove-padding-margin">
<div class="col-12 no-padding">
<h2 class="fs20 fw6 mb15">{{ __('velocity::app.products.recently-viewed') }}</h2>
</div>
</div>
<div class="col-8 no-padding card-body align-vertical-top">
<div class="no-padding">
<div class="fs16 text-nowrap">{{ $product->name }}</div>
<div :class="`recetly-viewed-products-wrapper ${addClassWrapper}`">
<div
:key="Math.random()"
class="row small-card-container"
v-for="(product, index) in recentlyViewed">
<div class="fs18 card-current-price fw6">
@include ('shop::products.price', [
'product' => $product,
'showDiscount' => false,
])
<div class="col-4 product-image-container mr15">
<a :href="`${baseURL}/${product.urlKey}`" class="unset">
<div class="product-image" :style="`background-image: url(${product.image})`"></div>
</a>
</div>
<star-ratings ratings="{{ intval($productAverageRating) }}"></star-ratings>
</div>
<div class="col-8 no-padding card-body align-vertical-top">
<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>
@endforeach
</div>
</script>
<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 class="comment">
<label>Rating*</label>
<label>Description*</label>
<textarea rows="4" placeholder="Your Comment" name="comment"></textarea>
</div>

View File

@ -19,116 +19,142 @@
<meta name="keywords" content="{{ $product->meta_keywords }}"/>
@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]) !!}
@if ($showRecentlyViewed)
<section class="col-7 offset-1 product-detail">
@else
<section class="col-10 offset-1 product-detail">
@endif
<div class="layouter">
<product-view>
<div class="form-container">
@csrf()
<div class="row no-margin">
@if ($showRecentlyViewed)
<section class="col-9 product-detail">
@else
<section class="col-12 product-detail">
@endif
<div class="layouter">
<product-view>
<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 --}}
<div class="left col-lg-5">
@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])
{{-- product-gallery --}}
<div class="left col-lg-5">
@include ('shop::products.view.gallery')
</div>
@include ('shop::products.add-to-cart', [
'product' => $product,
'showCartIcon' => false
])
{{-- 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>
@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>
{!! 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>
</product-view>
</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>
@include ('shop::products.view.related-products')
@include ('shop::products.view.up-sells')
</section>
@if ($showRecentlyViewed)
@include ('shop::products.list.recently-viewed')
@endif
</div>
{!! view_render_event('bagisto.shop.products.view.after', ['product' => $product]) !!}
@endsection
@push('scripts')
<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)">
@ -155,17 +181,33 @@
<script type="text/javascript">
Vue.component('product-view', {
template: '#product-view-template',
inject: ['$validator'],
template: '#product-view-template',
data: function() {
return {
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: {
onSubmit: function(e) {
if (e.target.getAttribute('type') != 'submit')
@ -189,9 +231,8 @@
});
Vue.component('quantity-changer', {
template: '#quantity-changer-template',
inject: ['$validator'],
template: '#quantity-changer-template',
props: {
controlName: {
@ -257,8 +298,7 @@
var productHeroImage = document.getElementsByClassName('product-hero-image')[0];
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.width = (productHeroImage.offsetHeight/4)+ "px";
}

View File

@ -182,11 +182,13 @@
</div>
<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>
{{ $review->name }},
</label>
<label>
{{ $review->name }},
</label>
@endif
<span>{{ core()->formatDate($review->created_at, 'F d, Y') }}
</span>

View File

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