Merge pull request #1 from bagisto/master

update
This commit is contained in:
hexu 2020-03-27 11:54:31 +08:00 committed by GitHub
commit fb6801e868
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
51 changed files with 1004 additions and 369 deletions

View File

@ -2,7 +2,7 @@
#### This changelog consists the bug & security fixes and new features being included in the releases listed below.
## **v1.1.0 (20th of March 2020)** - *Release*
## **v1.1.0 (24th of March 2020)** - *Release*
* [feature] Added new booking type product.
@ -10,6 +10,8 @@
* [feature] Impletment compare product feature.
* #2525 [fixed] - Add more settings to the installers
* #2541 [fixed] - Showing product's price with the price including tax
* #2552 [fixed] - error mysql 8
@ -72,14 +74,20 @@
* #2606 [fixed] - custom attributes are not Visible on Product View Page on Front-end
* #2607 [fixed] - Getting exception on editing category for pt_BR locale in php 7.4
* #2608 [fixed] - Getting exception on creating category.
* #2609 [fixed] - product removed from comparison page when update product by name
* #2611 [fixed] - installer error
* #2612 [fixed] - available slots are not showing for current date even if slot time is not expired
* #2613 [fixed] - Propaganistas/Laravel-Intl is abandoned
* #2614 [fixed] - table booking slot time is expired still exist in cart
* #2619 [fixed] - Issue when category slug & product slug are same
* #2621 [fixed] - i create a site and it is up kind of noting works
@ -150,7 +158,9 @@
* #2667 [fixed] - By default wishlist option is selected in cart
* #2669 [fixed] - Booking product should be removed from the cart when selected slot time expired
* #2670 [fixed] - Booking product should be removed from the cart when selected slot time expired
* #2669 [fixed] - Browser compatibility issue
* #2671 [fixed] - Error on moving booking product to wishlist
@ -164,7 +174,25 @@
* #2693 [fixed] - Booking product page - add to cart button js error
* #2707 [fixed] Getting exception when generate invoice in appointment booking
* #2704 [fixed] - product's assigned category can't be removed
* #2707 [fixed] - Getting exception when generate invoice in appointment booking
* #2715 [fixed] - Error message should throw if "To" time is less than "From".
* #2716 [fixed] - After saving the default booking time product selected time for date range changes to 00:00:00 ,because of which not able to book appointment on frontend.
* #2717 [fixed] - Getting error message on adding rental product in cart if rental booking is not available for that day.
* #2722 [fixed] - warning showing when update event booking cart quantity from the product page
* #2723 [fixed] - Compare product icon on header showing counts of compare product but there are no product in compare list.
* #2724 [fixed] - table bookings quantity should update in existing booking added in cart for same slot/date
* #2726 [fixed] - is shop.js the vue framework ??
* #2732 [fixed] - missing product's quick view in category page
## **v1.0.0 (24th of February 2020)** - *Release*

View File

@ -13,6 +13,7 @@ class AddressDataGrid extends DataGrid
*/
public $index = 'address_id';
/**
* @var string
*/
@ -168,4 +169,4 @@ class AddressDataGrid extends DataGrid
'method' => 'DELETE',
]);
}
}
}

View File

@ -1,8 +1,8 @@
<?php
return [
'save' => 'Salve ',
'create' => 'Crio',
'save' => 'Salvar',
'create' => 'Criar',
'update' => 'Atualizar',
'delete' => 'Excluir',
'failed' => 'Falhou',
@ -64,7 +64,7 @@ return [
'settings' => 'Opções',
'locales' => 'Idiomas',
'currencies' => 'Moedas',
'exchange-rates' => 'Impostos de Câmbios',
'exchange-rates' => 'Taxas de Câmbios',
'inventory-sources' => 'Fontes de Inventários',
'channels' => 'Canais (Lojas)',
'users' => 'Usuários',
@ -98,7 +98,7 @@ return [
'locales' => 'Idiomas',
'currencies' => 'Moedas',
'exchange-rates' => 'Impostos de Câmbios',
'inventory-sources' => 'Fontes de Inventários',
'inventory-sources' => 'Origens de Estoque',
'channels' => 'Canais (Lojas)',
'users' => 'Usuários',
'roles' => 'Funções',
@ -1248,7 +1248,7 @@ return [
'allow-guest-review' => 'Permitir comentário de convidado',
'inventory' => 'Inventário',
'stock-options' => 'Opções de ações',
'allow-backorders' => 'Permitir atrasos',
'allow-backorders' => 'Permitir Pedidos por Admin',
'customer' => 'Cliente',
'settings' => 'Definições',
'address' => 'Endereço',
@ -1287,29 +1287,30 @@ return [
'locale-options' => 'Opções de unidade',
'weight-unit' => 'Unidade de peso',
'admin-page-limit' => 'Itens padrão por página (administrador)',
'design' => 'Projeto',
'email-settings' => 'Email Settings',
'email-sender-name' => 'Email Sender Name',
'shop-email-from' => 'Shop Email Address [For sending emails]',
'admin-name' => 'Admin Name',
'design' => 'Design',
'email-settings' => 'Configurações de Email',
'email-sender-name' => 'Nome do Email da Loja',
'shop-email-from' => 'Endereço de Email da Loja [Para enviar emails]',
'admin-name' => 'Admin Nome',
'admin-email' => 'Admin Email',
'admin-page-limit' => 'Quantidade Padrão de Itens por Página (Admin)',
'design' => 'Design',
'admin-logo' => 'Admin Logo',
'logo-image' => 'Logo Imagem',
'credit-max' => 'Máximo de crédito do cliente',
'credit-max-value' => 'Valor Máximo de Crédito',
'use-credit-max' => 'Use o máximo de crédito',
'order-settings' => 'Order Settings',
'orderNumber' => 'Order Number Settings',
'order-number-prefix' => 'Order Number Prefix',
'order-number-length' => 'Order Number Length',
'order-number-suffix' => 'Order Number Suffix',
'order-settings' => 'Configurações do Pedido',
'orderNumber' => 'Configuração do Número do Pedido',
'order-number-prefix' => 'Prefixo do Número do Pedido',
'order-number-length' => 'Tamanho do Número do Pedido',
'order-number-suffix' => 'Sufixo do Número de Pedido',
'default' => 'Padrão',
'sandbox' => 'Sandbox',
'all-channels' => 'Todos',
'all-locales' => 'Todos',
'sandbox' => 'Sandbox',
'invoice-slip-design' => 'Invoice Slip Design',
'invoice-slip-design' => 'Design da Nota do Pedido',
'logo' => 'logo'
]
]

View File

@ -140,24 +140,48 @@ class RentalSlot extends Booking
public function isSlotExpired($cartItem)
{
$bookingProduct = $this->bookingProductRepository->findOneByField('product_id', $cartItem['product_id']);
$typeHelper = app($this->typeHelpers[$bookingProduct->type]);
$timeIntervals = $typeHelper->getSlotsByDate($bookingProduct, $cartItem['additional']['booking']['date']);
if (isset($cartItem['additional']['booking']['date'])) {
$timeIntervals = $this->getSlotsByDate($bookingProduct, $cartItem['additional']['booking']['date']);
$isExpired = true;
$isExpired = true;
foreach ($timeIntervals as $timeInterval) {
foreach ($timeInterval['slots'] as $slot) {
if ($slot['from_timestamp'] == $cartItem['additional']['booking']['slot']['from']
&& $slot['to_timestamp'] == $cartItem['additional']['booking']['slot']['to']
) {
$isExpired = false;
foreach ($timeIntervals as $timeInterval) {
foreach ($timeInterval['slots'] as $slot) {
if ($slot['from_timestamp'] == $cartItem['additional']['booking']['slot']['from']
&& $slot['to_timestamp'] == $cartItem['additional']['booking']['slot']['to']
) {
$isExpired = false;
}
}
}
}
return $isExpired;
return $isExpired;
} else {
$currentTime = Carbon::now();
$requestedFromDate = Carbon::createFromTimeString($cartItem['additional']['booking']['date_from'] . " 00:00:00");
$requestedToDate = Carbon::createFromTimeString($cartItem['additional']['booking']['date_to'] . " 23:59:59");
$availableFrom = ! $bookingProduct->available_every_week && $bookingProduct->available_from
? Carbon::createFromTimeString($bookingProduct->available_from)
: Carbon::createFromTimeString($currentTime->format('Y-m-d 00:00:00'));
$availableTo = ! $bookingProduct->available_every_week && $bookingProduct->available_from
? Carbon::createFromTimeString($bookingProduct->available_to)
: Carbon::createFromTimeString('2080-01-01 00:00:00');
if ($requestedFromDate < $availableFrom
|| $requestedFromDate > $availableTo
|| $requestedToDate < $availableFrom
|| $requestedToDate > $availableTo
) {
return true;
}
return false;
}
}
/**

View File

@ -174,6 +174,12 @@ class BookingProductRepository extends Repository
$to = Carbon::createFromTimeString($timeInterval['to'])->getTimestamp();
if ($from > $to) {
unset($slots[$key]);
continue;
}
$isOverLapping = false;
foreach ($tempSlots as $slot) {

View File

@ -57,7 +57,7 @@
</div>
<div v-if="! parseInt(booking.available_every_week)">
<div class="control-group" :class="[errors.has('booking[available_from]') ? 'has-error' : '']">
<div class="control-group date" :class="[errors.has('booking[available_from]') ? 'has-error' : '']">
<label class="required">{{ __('bookingproduct::app.admin.catalog.products.available-from') }}</label>
<datetime>
@ -67,11 +67,11 @@
<span class="control-error" v-if="errors.has('booking[available_from]')">@{{ errors.first('booking[available_from]') }}</span>
</div>
<div class="control-group" :class="[errors.has('booking[available_to]') ? 'has-error' : '']">
<div class="control-group date" :class="[errors.has('booking[available_to]') ? 'has-error' : '']">
<label class="required">{{ __('bookingproduct::app.admin.catalog.products.available-to') }}</label>
<datetime>
<input type="text" v-validate="'required|date_format:yyyy-MM-dd HH:mm:ss|after:available_from'" name="booking[available_to]" v-model="booking.available_to" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.admin.catalog.products.available-to') }}&quot;"/>
<input type="text" v-validate="'required|date_format:yyyy-MM-dd HH:mm:ss|after:available_from'" name="booking[available_to]" v-model="booking.available_to" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.admin.catalog.products.available-to') }}&quot;" ref="available_to"/>
</datetime>
<span class="control-error" v-if="errors.has('booking[available_to]')">@{{ errors.first('booking[available_to]') }}</span>

View File

@ -157,7 +157,7 @@
<script type="text/x-template" id="default-slot-item-template">
<tr>
<td class="has-control-group">
<div class="control-group" :class="[errors.has(controlName + '[from_day]') ? 'has-error' : '']">
<div class="control-group date" :class="[errors.has(controlName + '[from_day]') ? 'has-error' : '']">
<select v-validate="'required'" :name="controlName + '[from_day]'" v-model="slotItem.from_day" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.admin.catalog.products.day') }}&quot;">
<option v-for="(day, index) in $parent.days" :value="index">@{{ day }}</option>
</select>
@ -165,7 +165,7 @@
<span class="control-error" v-if="errors.has(controlName + '[from_day]')">@{{ errors.first(controlName + '[from_day]') }}</span>
</div>
<div class="control-group" :class="[errors.has(controlName + '[from]') ? 'has-error' : '']">
<div class="control-group date" :class="[errors.has(controlName + '[from]') ? 'has-error' : '']">
<time-component>
<input type="text" v-validate="'required'" :name="controlName + '[from]'" v-model="slotItem.from" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.admin.catalog.products.from') }}&quot;">
</time-component>
@ -177,7 +177,7 @@
</td>
<td class="has-control-group">
<div class="control-group" :class="[errors.has(controlName + '[to_day]') ? 'has-error' : '']">
<div class="control-group date" :class="[errors.has(controlName + '[to_day]') ? 'has-error' : '']">
<select v-validate="'required'" :name="controlName + '[to_day]'" v-model="slotItem.to_day" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.admin.catalog.products.day') }}&quot;">
<option v-for="(day, index) in $parent.days" :value="index">@{{ day }}</option>
</select>
@ -185,7 +185,7 @@
<span class="control-error" v-if="errors.has(controlName + '[to_day]')">@{{ errors.first(controlName + '[to_day]') }}</span>
</div>
<div class="control-group" :class="[errors.has(controlName + '[to]') ? 'has-error' : '']">
<div class="control-group date" :class="[errors.has(controlName + '[to]') ? 'has-error' : '']">
<time-component>
<input type="text" v-validate="'required'" :name="controlName + '[to]'" v-model="slotItem.to" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.admin.catalog.products.to') }}&quot;">
</time-component>

View File

@ -71,7 +71,7 @@
<script type="text/x-template" id="slot-item-template">
<tr>
<td>
<div class="control-group" :class="[errors.has(controlName + '[from]') ? 'has-error' : '']">
<div class="control-group date" :class="[errors.has(controlName + '[from]') ? 'has-error' : '']">
<time-component>
<input type="text" v-validate="'required'" :name="controlName + '[from]'" v-model="slotItem.from" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.admin.catalog.products.from') }}&quot;">
</time-component>
@ -83,7 +83,7 @@
</td>
<td>
<div class="control-group" :class="[errors.has(controlName + '[to]') ? 'has-error' : '']">
<div class="control-group date" :class="[errors.has(controlName + '[to]') ? 'has-error' : '']">
<time-component>
<input type="text" v-validate="'required'" :name="controlName + '[to]'" v-model="slotItem.to" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.admin.catalog.products.to') }}&quot;">
</time-component>

View File

@ -86,7 +86,7 @@
<div class="control-group-container">
<div class="control-group date" :class="[errors.has('booking[date_from]') ? 'has-error' : '']">
<date @onChange="dateSelected($event)">
<input type="text" v-validate="'required'" name="booking[date_from]" v-model="date_from" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.from') }}&quot;" placeholder="{{ __('bookingproduct::app.shop.products.from') }}" data-min-date="today"/>
<input type="text" v-validate="'required|date_format:yyyy-MM-dd|before_or_equal:date_to'" name="booking[date_from]" v-model="date_from" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.from') }}&quot;" placeholder="{{ __('bookingproduct::app.shop.products.from') }}" ref="date_from" data-min-date="today"/>
</date>
<span class="control-error" v-if="errors.has('booking[date_from]')">@{{ errors.first('booking[date_from]') }}</span>
@ -94,7 +94,7 @@
<div class="control-group date" :class="[errors.has('booking[date_to]') ? 'has-error' : '']">
<date @onChange="dateSelected($event)">
<input type="text" v-validate="'required'" name="booking[date_to]" v-model="date_to" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.to') }}&quot;" placeholder="{{ __('bookingproduct::app.shop.products.to') }}"/>
<input type="text" v-validate="'required|date_format:yyyy-MM-dd|after_or_equal:date_from'" name="booking[date_to]" v-model="date_to" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.to') }}&quot;" placeholder="{{ __('bookingproduct::app.shop.products.to') }}" ref="date_to" data-min-date="today"/>
</date>
<span class="control-error" v-if="errors.has('booking[date_to]')">@{{ errors.first('booking[date_to]') }}</span>
@ -131,6 +131,46 @@
}
},
created: function() {
var self = this;
this.$validator.extend('after_or_equal', {
getMessage(field, val) {
return 'The "To" must be equal or after "From"';
},
validate(value, field) {
if (! self.date_from) {
return true;
}
var from = new Date(self.date_from);
var to = new Date(self.date_to);
return from <= to;
}
});
this.$validator.extend('before_or_equal', {
getMessage(field, val) {
return 'The "From must be equal or before "To"';
},
validate(value, field) {
if (! self.date_to) {
return true;
}
var from = new Date(self.date_from);
var to = new Date(self.date_to);
return from <= to;
}
});
},
methods: {
dateSelected: function(date) {
var this_this = this;

View File

@ -86,7 +86,7 @@
<div class="control-group-container">
<div class="form-group date" :class="[errors.has('booking[date_from]') ? 'has-error' : '']">
<date @onChange="dateSelected($event)">
<input type="text" v-validate="'required'" name="booking[date_from]" v-model="date_from" class="form-style" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.from') }}&quot;" placeholder="{{ __('bookingproduct::app.shop.products.from') }}" data-min-date="today"/>
<input type="text" v-validate="'required|date_format:yyyy-MM-dd|before_or_equal:date_to'" name="booking[date_from]" v-model="date_from" class="form-style" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.from') }}&quot;" placeholder="{{ __('bookingproduct::app.shop.products.from') }}" ref="date_from" data-min-date="today"/>
</date>
<span class="control-error" v-if="errors.has('booking[date_from]')">@{{ errors.first('booking[date_from]') }}</span>
@ -94,7 +94,7 @@
<div class="form-group date" :class="[errors.has('booking[date_to]') ? 'has-error' : '']">
<date @onChange="dateSelected($event)">
<input type="text" v-validate="'required'" name="booking[date_to]" v-model="date_to" class="form-style" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.to') }}&quot;" placeholder="{{ __('bookingproduct::app.shop.products.to') }}"/>
<input type="text" v-validate="'required|date_format:yyyy-MM-dd|after_or_equal:date_from'" name="booking[date_to]" v-model="date_to" class="form-style" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.to') }}&quot;" placeholder="{{ __('bookingproduct::app.shop.products.to') }}" ref="date_to" data-min-date="today"/>
</date>
<span class="control-error" v-if="errors.has('booking[date_to]')">@{{ errors.first('booking[date_to]') }}</span>
@ -131,6 +131,46 @@
}
},
created: function() {
var self = this;
this.$validator.extend('after_or_equal', {
getMessage(field, val) {
return 'The "To" must be equal or after "From"';
},
validate(value, field) {
if (! self.date_from) {
return true;
}
var from = new Date(self.date_from);
var to = new Date(self.date_to);
return from <= to;
}
});
this.$validator.extend('before_or_equal', {
getMessage(field, val) {
return 'The "From must be equal or before "To"';
},
validate(value, field) {
if (! self.date_to) {
return true;
}
var from = new Date(self.date_from);
var to = new Date(self.date_to);
return from <= to;
}
});
},
methods: {
dateSelected: function(date) {
var this_this = this;

View File

@ -2,6 +2,7 @@
namespace Webkul\BookingProduct\Type;
use Illuminate\Support\Arr;
use Webkul\Attribute\Repositories\AttributeRepository;
use Webkul\Product\Repositories\ProductRepository;
use Webkul\Product\Repositories\ProductAttributeValueRepository;
@ -167,6 +168,14 @@ class Booking extends Virtual
$bookingProduct = $this->getBookingProduct($data['product_id']);
if ($bookingProduct->type == 'event') {
$filtered = Arr::where($data['booking']['qty'], function ($qty, $key) {
return $qty != 0;
});
if (! count($filtered)) {
return trans('shop::app.checkout.cart.integrity.missing_options');
}
foreach ($data['booking']['qty'] as $ticketId => $qty) {
if (! $qty) {
continue;
@ -214,7 +223,7 @@ class Booking extends Virtual
}
if (isset($options1['booking']) && isset($options2['booking'])) {
return $options1['booking'] === $options2['booking'];
return $options1['booking'] == $options2['booking'];
} elseif (! isset($options1['booking'])) {
return false;
} elseif (! isset($options2['booking'])) {

View File

@ -165,9 +165,9 @@ class Cart
'cart_id' => $cart->id
]));
} else {
if ($cartItem->product->getTypeInstance()->showQuantityBox() === false) {
return ['warning' => __('shop::app.checkout.cart.integrity.qty_impossible')];
}
// if ($cartItem->product->getTypeInstance()->showQuantityBox() === false) {
// return ['warning' => __('shop::app.checkout.cart.integrity.qty_impossible')];
// }
$cartItem = $this->cartItemRepository->update($cartProduct, $cartItem->id);
}

View File

@ -5,8 +5,16 @@ use Webkul\Core\Models\Locale;
/** @var \Illuminate\Database\Eloquent\Factory $factory */
$factory->define(Locale::class, function (Faker $faker, array $attributes) {
$languageCode = $faker->languageCode;
$locale = Locale::query()->firstWhere('code', $languageCode);
if ($locale !== null) {
return $locale->id;
}
return [
'code' => $faker->languageCode,
'code' => $languageCode,
'name' => $faker->country,
'direction' => 'ltr',
];

View File

@ -64,6 +64,10 @@ class ForgotPasswordController extends Controller
->withErrors([
'email' => trans($response),
]);
} catch (\Swift_RfcComplianceException $e) {
session()->flash('success', trans('customer::app.forget_password.reset_link_sent'));
return redirect()->back();
} catch (\Exception $e) {
report($e);
session()->flash('error', trans($e->getMessage()));

View File

@ -13,5 +13,8 @@ return [
],
'reviews' => [
'empty' => 'You have not reviewed any of product yet'
],
'forget_password' => [
'reset_link_sent' => 'We have e-mailed your reset password link.'
]
];

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
{
"/js/shop.js": "/js/shop.js?id=6bb928c2e527b045a56b",
"/css/shop.css": "/css/shop.css?id=ccf417b825955d8bd301"
"/css/shop.css": "/css/shop.css?id=d1c42d10589004fac3f8"
}

View File

@ -785,6 +785,7 @@ section.slider-block {
border-bottom-right-radius: 0px;
padding-left: 12px;
font-size: 14px;
-webkit-appearance: none;
}
.search-icon-wrapper {
@ -794,11 +795,13 @@ section.slider-block {
border: 2px solid $border-color;
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
margin-left: -2px;
button {
background: $btn-background-color;
border: 0;
padding: 3px 5px;
margin: 0px;
}
}
}
@ -3832,6 +3835,7 @@ section.review {
border-radius: 2px;
border-top-left-radius: 0px;
border-bottom-left-radius: 0px;
-webkit-appearance: none;
}
.search-icon-wrapper {
@ -3840,6 +3844,7 @@ section.review {
border-radius: 2px;
border-top-right-radius: 0px;
border-bottom-right-radius: 0px;
margin-left: -2px;
}
}
}

View File

@ -1,6 +1,10 @@
<?php
return [
'invalid_vat_format' => 'The given vat id has a wrong format',
'security-warning' => 'Suspicious activity found!!!',
'nothing-to-delete' => 'Nothing to delete',
'layouts' => [
'my-account' => 'Minha Conta',
'profile' => 'Perfil',
@ -113,8 +117,9 @@ return [
'verification-not-sent' => 'Erro! Problema ao enviar e-mail de verificação, tente novamente mais tarde',
'verification-sent' => 'E-mail de verificação enviado',
'verified' => 'Sua Conta Foi Verificada, Tente Entrar Agora',
'verify-failed' => 'Não podemos verificar sua conta de e-mail',
'verify-failed' => 'Não podemos verificar sua conta de e-mail.',
'dont-have-account' => 'Você não tem conta conosco',
'customer-registration' => 'Cliente Cadastrado com Sucesso'
],
'login-text' => [
@ -245,13 +250,14 @@ return [
'date' => 'Data',
'status' => 'Status',
'total' => 'Total',
'processing' => 'Processing',
'completed' => 'Completed',
'canceled' => 'Canceled',
'closed' => 'Closed',
'pending' => 'Pending',
'pending-payment' => 'Pending Payment',
'fraud' => 'Fraud'
'order_number' => 'Número do Pedido',
'processing' => 'Precessando',
'completed' => 'Completo',
'canceled' => 'Cancelado',
'closed' => 'Fechado',
'pending' => 'Pendente',
'pending-payment' => 'Pagamento Pendente',
'fraud' => 'Fraude'
],
'view' => [
@ -304,7 +310,7 @@ return [
],
'wishlist' => [
'page-title' => 'Customer - Wishlist',
'page-title' => 'Lista de Desejos',
'title' => 'Lista de Desejos',
'deleteall' => 'Excluir Tudo',
'moveall' => 'Adicionar todos ao Carrinho',
@ -313,6 +319,7 @@ return [
'add' => 'Item adicionado com sucesso a Lista de Desejos',
'remove' => 'Item removido com sucesso da Lista de Desejos',
'moved' => 'Item movido com sucesso para Lista de Desejos',
'option-missing' => 'As opções do produto estão ausentes, portanto, o item não pode ser movido para a lista de desejos.',
'move-error' => 'Item não pode ser movido para Lista de Desejos, por favor, tente novamente mais tarde',
'success' => 'Item adicionado com sucesso a Lista de Desejos',
'failure' => 'Item não pode ser adicionado à Lista de Desejos, por favor, tente novamente mais tarde',
@ -408,8 +415,9 @@ return [
'integrity' => [
'missing_fields' =>'Violação de integridade do sistema de carrinho, alguns campos obrigatórios ausentes',
'missing_options' =>'Violação de Integridade do Sistema de Carrinho, Faltam Opções para o Produto Configurável',
'missing_links' => 'Downloadable links are missing for this product.',
'qty_missing' => 'Atleast one product should have more than 1 quantity.'
'missing_links' => 'Faltam links para download para este produto.',
'qty_missing' => 'Pelo menos um produto deve ter mais de 1 quantidade.',
'qty_impossible' => 'Não é possível adicionar mais do que um desse produto ao carrinho.'
],
'create-error' => 'Encontrou algum problema ao fazer a instância do carrinho',
@ -438,11 +446,11 @@ return [
'success-remove' => 'Item foi removido com sucesso do carrinho',
'error-add' => 'Item não pode ser adicionado ao carrinho, por favor, tente novamente mais tarde',
],
'quantity-error' => 'Quantidade solicitada não está disponível',
'cart-subtotal' => 'Subtotal do carrinho',
'cart-remove-action' => 'Você realmente quer fazer isso ?',
'partial-cart-update' => 'Only some of the product(s) were updated'
'partial-cart-update' => 'Only some of the product(s) were updated',
'link-missing' => ''
],
'onepage' => [
@ -466,7 +474,7 @@ return [
'country' => 'País',
'order-summary' => 'Resumo do Pedido',
'shipping-address' => 'Endereço de Entrega',
'use_for_shipping' => 'Enviar para esse endereçõ',
'use_for_shipping' => 'Enviar para esse endereço',
'continue' => 'Continuar',
'shipping-method' => 'Selecione o Método de Entrega',
'payment-methods' => 'Selecione o Método de Pagamento',
@ -479,7 +487,9 @@ return [
'contact' => 'Contato',
'place-order' => 'Enviar Pedido',
'new-address' => 'Add Novo Endereço',
'save_as_address' => 'Salvar Endereço'
'save_as_address' => 'Salvar Endereço',
'apply-coupon' => 'Aplicar Cupom',
'enter-coupon-code' => 'Digite aqui o seu Cupom'
],
'total' => [
@ -488,8 +498,17 @@ return [
'grand-total' => 'Total',
'delivery-charges' => 'Taxas de Entrega',
'tax' => 'Imposto',
'discount' => 'Discount',
'price' => 'preço'
'discount' => 'Desconto',
'price' => 'preço',
'disc-amount' => 'Valor descontado',
'new-grand-total' => 'Novo Total',
'coupon' => 'Cupom',
'coupon-applied' => 'Cupom Aplicado',
'remove-coupon' => 'Remover Cupom',
'cannot-apply-coupon' => 'Não foi possível aplicar esse Cupom',
'invalid-coupon' => 'Código do Cupom é inválido.',
'success-coupon' => 'Cupom aplicado com sucesso.',
'coupon-apply-issue' => 'Não foi possível aplicar esse Cupom'
],
'success' => [
@ -505,6 +524,7 @@ return [
'subject' => 'Confirmação de Novo Pedido',
'heading' => 'Confirmação de Pedido!',
'dear' => 'Caro :customer_name',
'dear-admin' => 'Caro :admin_name',
'greeting' => 'Obrigado pelo seu Pedido :order_id realizado em :created_at',
'summary' => 'Resumo do Pedido',
'shipping-address' => 'Endereço de Entrega',
@ -521,7 +541,27 @@ return [
'grand-total' => 'Total',
'final-summary' => 'Obrigado por mostrar o seu interesse em nossa loja nós lhe enviaremos o número de rastreamento assim que for despachado',
'help' => 'Se você precisar de algum tipo de ajuda, por favor entre em contato conosco :support_email',
'thanks' => 'Muito Obrigado!'
'thanks' => 'Muito Obrigado!',
'cancel' => [
'subject' => 'Confirmação de Cancelamento de Pedido',
'heading' => 'Pedido Cancelado',
'dear' => 'Caro :customer_name',
'greeting' => 'Seu Pedido com o ID #:order_id finalizado em :created_at foi cancelado',
'summary' => 'Resumo do Pedido',
'shipping-address' => 'Endereço de Entrega',
'billing-address' => 'Endereço de Faturamento',
'contact' => 'Contato',
'shipping' => 'Método de Envio',
'payment' => 'Método de Pagamento',
'subtotal' => 'Subtotal',
'shipping-handling' => 'Entrega & Manuseio',
'tax' => 'Taxa',
'discount' => 'Desconto',
'grand-total' => 'Total',
'final-summary' => 'Obrigado por mostrar interesse em nosa Loja',
'help' => 'Caso precise de qualquer tipo de ajuda entre em contato conosco :support_email',
'thanks' => 'Obrigado!',
]
],
'invoice' => [
@ -547,11 +587,49 @@ return [
],
'forget-password' => [
'subject' => 'Recuperação de Senha',
'dear' => 'Caro :name',
'info' => 'Você está recebendo este e-mail porque recebemos uma solicitação de redefinição de senha para sua conta',
'reset-password' => 'Redefinir Senha',
'final-summary' => 'Se você não solicitou uma redefinição de senha, nenhuma ação adicional é necessária',
'thanks' => 'Muito Obrigado!'
'thanks' => 'Obrigado!'
],
'customer' => [
'new' => [
'dear' => 'Caro :customer_name',
'username-email' => 'Nome de usuário/Email',
'subject' => 'Nova Conta',
'password' => 'Senha',
'summary' => 'Sua conta foi criada.
Abaixo está suas informaços: ',
'thanks' => 'Obrigado!',
],
'registration' => [
'subject' => 'Novo Cliente',
'customer-registration' => 'Cliente cadastrado com Sucesso',
'dear' => 'Caro :customer_name',
'greeting' => 'Bem vindo e obrigado por se cadastrar conosco!',
'summary' => 'Sua conta foi criada com sucesso e agora você pode entrar utilizando seu endereço de email e senha. Ao fazer login, você poderá acessar outros serviços, incluindo a revisão de pedidos anteriores, listas de desejos e a edição das informações da sua conta..',
'thanks' => 'Obrigado!',
],
'verification' => [
'heading' => config('app.name') . ' - Verificação de Email',
'subject' => 'Verificação de Email',
'verify' => 'Confirme sua conta',
'summary' => 'Esse email é para confirmar que esse endereço de e-mail é válido e pertence a você.
Por favor, clique no botão Confirme sua conta abaixo para verificar sua conta. '
],
'subscription' => [
'subject' => 'Email de Inscrição',
'greeting' => ' Bem vindo a ' . config('app.name') . ' - Incrição de Email',
'unsubscribe' => 'Unsubscribe',
'summary' => 'Obrigado por me colocar na sua caixa de entrada. Já faz um tempo desde que você leu ' . config('app.name') . ' e-mail e não queremos sobrecarregar sua caixa de entrada. Se você ainda não deseja receber
as últimas notícias de email marketing e, com certeza, clique no botão abaixo.'
]
]
],

View File

@ -0,0 +1,29 @@
@extends('shop::layouts.master')
@include('shop::guest.compare.compare-products')
@section('page_title')
{{ __('velocity::app.customer.compare.compare_similar_items') }}
@endsection
@section('content-wrapper')
<div class="account-content">
@include('shop::customers.account.partials.sidemenu')
<div class="account-layout">
{!! view_render_event('bagisto.shop.customers.account.comparison.list.before') !!}
<div class="account-items-list">
<div class="account-table-content">
<compare-product></compare-product>
</div>
</div>
{!! view_render_event('bagisto.shop.customers.account.comparison.list.after') !!}
</div>
</div>
@endsection

View File

@ -0,0 +1,295 @@
@php
$attributeRepository = app('\Webkul\Attribute\Repositories\AttributeRepository');
$comparableAttributes = $attributeRepository->findByField('is_comparable', 1);
@endphp
@push('css')
<style>
body {
overflow-x: hidden;
}
.comparison-component {
width: 100%;
padding-top: 20px;
}
.comparison-component > h1 {
display: inline-block;
}
td {
padding: 15px;
min-width: 250px;
max-width: 250px;
line-height: 30px;
vertical-align: top;
word-break: break-word;
}
.icon.remove-product {
top: 15px;
float: right;
cursor: pointer;
position: relative;
background-color: black;
}
.action > div {
display: inline-block;
}
</style>
@endpush
@push('scripts')
<script type="text/x-template" id="compare-product-template">
<section class="comparison-component">
<h1>
{{ __('velocity::app.customer.compare.compare_similar_items') }}
</h1>
<button
v-if="products.length > 0"
class="btn btn-primary btn-md pull-right"
@click="removeProductCompare('all')">
{{ __('shop::app.customer.account.wishlist.deleteall') }}
</button>
{!! view_render_event('bagisto.shop.customers.account.compare.view.before') !!}
<table class="compare-products">
<template v-if="isProductListLoaded && products.length > 0">
@php
$comparableAttributes = $comparableAttributes->toArray();
array_splice($comparableAttributes, 1, 0, [[
'code' => 'image',
'admin_name' => 'Product Image'
]]);
array_splice($comparableAttributes, 2, 0, [[
'code' => 'addToCartHtml',
'admin_name' => 'Actions'
]]);
@endphp
@foreach ($comparableAttributes as $attribute)
<tr>
<td>
<span class="fs16">{{ $attribute['admin_name'] }}</span>
</td>
<td :key="`title-${index}`" v-for="(product, index) in products">
@switch ($attribute['code'])
@case('name')
<a :href="`${baseUrl}/${product.url_key}`" class="unset remove-decoration active-hover">
<h3 class="fw6 fs18" v-text="product['{{ $attribute['code'] }}']"></h3>
</a>
@break
@case('image')
<a :href="`${baseUrl}/${product.url_key}`" class="unset">
<img
class="image-wrapper"
:src="product['{{ $attribute['code'] }}']"
:onerror="`this.src='${baseUrl}/vendor/webkul/ui/assets/images/product/large-product-placeholder.png'`" />
</a>
@break
@case('price')
<span v-html="product['priceHTML']"></span>
@break
@case('addToCartHtml')
<div class="action">
<div v-html="product.defaultAddToCart"></div>
<span class="icon white-cross-sm-icon remove-product" @click="removeProductCompare(product.id)"></span>
</div>
@break
@case('color')
<span v-html="product.color_label" class="fs16"></span>
@break
@case('size')
<span v-html="product.size_label" class="fs16"></span>
@break
@case('description')
<span v-html="product.description"></span>
@break
@default
@switch ($attribute['type'])
@case('boolean')
<span
v-text="product.product['{{ $attribute['code'] }}']
? '{{ __('velocity::app.shop.general.yes') }}'
: '{{ __('velocity::app.shop.general.no') }}'"
></span>
@break;
@default
<span v-html="product['{{ $attribute['code'] }}'] ? product['{{ $attribute['code'] }}'] : product.product['{{ $attribute['code'] }}'] ? product.product['{{ $attribute['code'] }}'] : '__'" class="fs16"></span>
@break;
@endswitch
@break
@endswitch
</td>
</tr>
@endforeach
</template>
<span v-else-if="isProductListLoaded && products.length == 0">
{{ __('velocity::app.customer.compare.empty-text') }}
</span>
</table>
{!! view_render_event('bagisto.shop.customers.account.compare.view.after') !!}
</section>
</script>
<script>
Vue.component('compare-product', {
template: '#compare-product-template',
data: function () {
return {
'products': [],
'isProductListLoaded': false,
'baseUrl': "{{ url()->to('/') }}",
'isCustomer': '{{ auth()->guard('customer')->user() ? "true" : "false" }}' == "true",
}
},
mounted: function () {
this.getComparedProducts();
},
methods: {
'getComparedProducts': function () {
let items = '';
let url = `${this.baseUrl}/${this.isCustomer ? 'comparison' : 'detailed-products'}`;
let data = {
params: {'data': true}
}
if (! this.isCustomer) {
items = this.getStorageValue('compared_product');
items = items ? items.join('&') : '';
data = {
params: {
items
}
};
}
if (this.isCustomer || (! this.isCustomer && items != "")) {
this.$http.get(url, data)
.then(response => {
this.isProductListLoaded = true;
if (response.data.products.length > 2) {
$('.comparison-component').css('overflow-x', 'scroll');
}
this.products = response.data.products;
})
.catch(error => {
this.isProductListLoaded = true;
console.log("{{ __('velocity::app.error.something_went_wrong') }}");
});
} else {
this.isProductListLoaded = true;
}
},
'removeProductCompare': function (productId) {
if (this.isCustomer) {
this.$http.delete(`${this.baseUrl}/comparison?productId=${productId}`)
.then(response => {
if (productId == 'all') {
this.$set(this, 'products', this.products.filter(product => false));
} else {
this.$set(this, 'products', this.products.filter(product => product.id != productId));
}
// window.showAlert(`alert-${response.data.status}`, response.data.label, response.data.message);
})
.catch(error => {
console.log("{{ __('velocity::app.error.something_went_wrong') }}");
});
} else {
let existingItems = this.getStorageValue('compared_product');
if (productId == "all") {
updatedItems = [];
this.$set(this, 'products', []);
} else {
updatedItems = existingItems.filter(item => item != productId);
this.$set(this, 'products', this.products.filter(product => product.id != productId));
}
this.setStorageValue('compared_product', updatedItems);
// window.showAlert(
// `alert-success`,
// "{{ __('velocity::app.shop.general.alert.success') }}",
// `${this.__('customer.compare.removed')}`
// );
}
},
'getDynamicHTML': function (input) {
var _staticRenderFns;
const { render, staticRenderFns } = Vue.compile(input);
if (this.$options.staticRenderFns.length > 0) {
_staticRenderFns = this.$options.staticRenderFns;
} else {
_staticRenderFns = this.$options.staticRenderFns = staticRenderFns;
}
try {
var output = render.call(this, this.$createElement);
} catch (exception) {
console.log(this.__('error.something_went_wrong'));
}
this.$options.staticRenderFns = _staticRenderFns;
return output;
},
'isMobile': function () {
if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
return true
} else {
return false
}
},
'getStorageValue': function (key) {
let value = window.localStorage.getItem(key);
if (value) {
value = JSON.parse(value);
}
return value;
},
'setStorageValue': function (key, value) {
window.localStorage.setItem(key, JSON.stringify(value));
return true;
},
}
});
</script>
@endpush

View File

@ -1,3 +1,11 @@
<script>
window.location.href = window.location.href.replace('/comparison', '');
</script>
@extends('shop::layouts.master')
@include('shop::guest.compare.compare-products')
@section('page_title')
{{ __('velocity::app.customer.compare.compare_similar_items') }}
@endsection
@section('content-wrapper')
<compare-product></compare-product>
@endsection

View File

@ -42,6 +42,26 @@
<ul class="right-content-menu">
{!! view_render_event('bagisto.shop.layout.header.comppare-item.before') !!}
<li class="compare-dropdown-container">
<a
@auth('customer')
href="{{ route('velocity.customer.product.compare') }}"
@endauth
@guest('customer')
href="{{ route('velocity.product.compare') }}"
@endguest
style="color: #242424;"
>
<span class="name">{{ __('velocity::app.customer.compare.text') }}</span>
</a>
</li>
{!! view_render_event('bagisto.shop.layout.header.compare-item.after') !!}
{!! view_render_event('bagisto.shop.layout.header.currency-item.before') !!}
@if (core()->getCurrentChannel()->currencies->count() > 1)

View File

@ -163,7 +163,7 @@
data: function() {
let maxPrice = '{{ core()->convertPrice($productFlatRepository->getCategoryProductMaximumPrice($category)) }}';
maxPrice = (parseInt(maxPrice) !== 0) ? parseInt(maxPrice) : 500;
maxPrice = maxPrice ? ((parseInt(maxPrice) !== 0 || maxPrice) ? parseInt(maxPrice) : 500) : 500;
return {
appliedFilters: [],

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
{
"/js/ui.js": "/js/ui.js?id=f4734f49f2e95bf51c83",
"/css/ui.css": "/css/ui.css?id=0895b560bbc19259cee8"
"/js/ui.js": "/js/ui.js?id=8238d4a34ce254a81437",
"/css/ui.css": "/css/ui.css?id=78f86756674b5f637c8b"
}

View File

@ -49,6 +49,7 @@
height: 36px;
width: 280px;
padding-left: 10px;
-webkit-appearance: none;
}
.contorl:focus {

View File

@ -23,7 +23,7 @@
"bootstrap-sass": "^3.4.1",
"font-awesome": "^4.7.0",
"material-icons": "^0.3.1",
"vee-validate": "2.0.0-rc.26",
"vee-validate": "^2.2.15",
"vue-slider-component": "^3.1.0",
"vue-toast-notification": "0.0.2"
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
{
"/js/velocity.js": "/js/velocity.js?id=d3f7d56e990550452f19",
"/js/velocity.js": "/js/velocity.js?id=b795a54f5795ed77fa28",
"/css/velocity-admin.css": "/css/velocity-admin.css?id=612d35e452446366eef7",
"/css/velocity.css": "/css/velocity.css?id=52109e4f344a8b0bce61"
"/css/velocity.css": "/css/velocity.css?id=a68c6d04ce36e1455e1e"
}

View File

@ -279,7 +279,8 @@ class Helper extends Review
/**
* @param \Webkul\Product\Contracts\Product $product
* @param bool $list
* @param bool $list
* @param array $metaInformation
* @return array
*/
public function formatProduct($product, $list = false, $metaInformation = [])
@ -317,16 +318,15 @@ class Helper extends Review
'shortDescription' => $product->short_description,
'firstReviewText' => trans('velocity::app.products.be-first-review'),
'priceHTML' => view('shop::products.price', ['product' => $product])->render(),
'defaultAddToCart' => view('shop::products.add-buttons', ['product' => $product])->render(),
'addToCartHtml' => view('shop::products.add-to-cart', [
'showCompare' => true,
'product' => $product,
'addWishlistClass' => ! (isset($list) && $list) ? '' : '',
'btnText' => (isset($metaInformation['btnText']) && $metaInformation['btnText'])
? $metaInformation['btnText']
: null,
'moveToCart' => (isset($metaInformation['moveToCart']) && $metaInformation['moveToCart'])
? $metaInformation['moveToCart']
: null,
? $metaInformation['btnText'] : null,
'moveToCart' => (isset($metaInformation['moveToCart']) && $metaInformation['moveToCart'])
? $metaInformation['moveToCart'] : null,
'addToCartBtnClass' => ! (isset($list) && $list) ? 'small-padding' : '',
])->render(),
];
@ -364,6 +364,7 @@ class Helper extends Review
$productMetaDetails['priceHTML'] = $formattedProduct['priceHTML'];
$productMetaDetails['addToCartHtml'] = $formattedProduct['addToCartHtml'];
$productMetaDetails['galleryImages'] = $formattedProduct['galleryImages'];
$productMetaDetails['defaultAddToCart'] = $formattedProduct['defaultAddToCart'];
$product = array_merge($productFlat->toArray(), $productMetaDetails);

View File

@ -31,14 +31,15 @@ class ComparisonController extends Controller
->get()
->toArray();
foreach ($productCollection as $index => $customerCompare) {
$product = $this->productRepository->find($customerCompare['product_id']);
$formattedProduct = $this->velocityHelper->formatProduct($product);
$items = [];
$productCollection[$index]['image'] = $formattedProduct['image'];
$productCollection[$index]['priceHTML'] = $formattedProduct['priceHTML'];
$productCollection[$index]['addToCartHtml'] = $formattedProduct['addToCartHtml'];
foreach ($productCollection as $index => $customerCompare) {
array_push($items, $customerCompare['id']);
}
$items = implode('&', $items);
$productCollection = $this->velocityHelper->fetchProductCollection($items);
} else {
// for product details
if ($items = request()->get('items')) {

View File

@ -20,12 +20,15 @@
{{ isActive ? 'favorite' : 'favorite_border' }}
</i>
<span style="vertical-align: super;" v-html="text"></span>
</a>
</template>
<script type="text/javascript">
export default {
props: [
'text',
'active',
'addClass',
'addedText',
@ -33,6 +36,7 @@
'removeText',
'isCustomer',
'productSlug',
'moveToWishlist',
],
data: function () {
@ -54,7 +58,7 @@
let existingValue = this.getStorageValue('wishlist_product');
if (existingValue) {
let valueIndex = existingValue.indexOf(productId);
var valueIndex = existingValue.indexOf(productId);
if (valueIndex == -1) {
this.isActive = true;
@ -78,6 +82,10 @@
this.isActive ? this.addedText : this.removeText
);
if (this.moveToWishlist && valueIndex == -1) {
window.location.href = this.moveToWishlist;
}
return true;
},

View File

@ -58,13 +58,13 @@ $(document).ready(function () {
Vue.mixin({
data: function () {
return {
'baseUrl': document.querySelector("script[src$='velocity.js']").getAttribute('baseUrl'),
'imageObserver': null,
'navContainer': false,
'headerItemsCount': 0,
'sharedRootCategories': [],
'responsiveSidebarTemplate': '',
'responsiveSidebarKey': Math.random(),
'sharedRootCategories': [],
'imageObserver': null,
'baseUrl': document.querySelector("script[src$='velocity.js']").getAttribute('baseUrl'),
}
},

View File

@ -26,6 +26,7 @@
::-webkit-scrollbar {
width: 3px;
height: 5px;
}
/* Track */
::-webkit-scrollbar-track {
@ -196,6 +197,8 @@ body {
min-width: 150px;
cursor: pointer;
text-align: right;
padding-top: 5px;
* {
display: table-cell;
@ -248,7 +251,7 @@ body {
height: 32px;
* {
height: 100%;
// height: 100%;
}
}
@ -971,3 +974,5 @@ i.within-circle {
border: 1px #E5E5E5;
margin: 0 auto;
}
.row:before, .row:after {display: none !important;}

View File

@ -2305,15 +2305,17 @@
.compare-products {
// overflow-x: scroll;
// padding-bottom: 30px;
width: 100%;
padding-bottom: 20px;
word-break: break-word;
margin-left: 0 !important;
margin-right: 10px !important;
.col,
.col-2 {
max-width: 20%;
min-width: 17%;
padding-left: 0;
word-break: break-word;
td {
padding: 15px;
min-width: 250px;
max-width: 250px;
vertical-align: top;
}
.image-wrapper {

View File

@ -255,6 +255,8 @@ return [
'female' => 'أنثى',
],
'general' => [
'no' => 'No',
'yes' => 'Yes',
'view' => 'رأي',
'filter' => 'منقي',
'update' => 'تحديث',

View File

@ -1,8 +1,8 @@
<?php
return [
'admin' => [
'system' => [
'admin' => [
'system' => [
'velocity' => [
'general' => 'General',
'category' => 'Category',
@ -39,14 +39,14 @@ return [
'num-sub-category' => 'Number Of Sub Category',
]
],
'layouts' => [
'layouts' => [
'velocity' => 'Velocity',
'cms-pages' => 'CMS Pages',
'meta-data' => 'Meta Data',
'category-menu' => 'Category Menu',
'header-content' => 'Header Content',
],
'contents' => [
'contents' => [
'self' => 'Self',
'active' => 'Active',
'new-tab' => 'New Tab',
@ -112,7 +112,7 @@ return [
'general' => 'General',
'add-image-btn-title' => 'Add Image'
],
'category' => [
'category' => [
'save-btn-title' => 'Save Menu',
'title' => 'Category Menu List',
'add-title' => 'Add Menu Content',
@ -136,151 +136,153 @@ return [
'tooltip-content' => 'Tooltip Content',
'mass-delete-success' => 'Selected categories menu deleted successfully.',
],
'general' => [
'general' => [
'locale_logo' => 'Locale Logo',
],
],
'home' => [
'view-all' => 'View All',
'add-to-cart' => 'Add To Cart',
'hot-categories' => 'Hot Categories',
'payment-methods' => 'Payment Methods',
'customer-reviews' => 'Customer Reviews',
'shipping-methods' => 'Shipping Methods',
'home' => [
'view-all' => 'View All',
'add-to-cart' => 'Add To Cart',
'hot-categories' => 'Hot Categories',
'payment-methods' => 'Payment Methods',
'customer-reviews' => 'Customer Reviews',
'shipping-methods' => 'Shipping Methods',
'popular-categories' => 'Popular Categories',
],
'header' => [
'cart' => 'Cart',
'cart' => 'Cart',
'guest' => 'Guest',
'logout' => 'Logout',
'title' => 'Account',
'account' => 'Account',
'profile' => 'Profile',
'wishlist' => 'Wishlist',
'all-categories' => 'All Categories',
'search-text' => 'Search products here',
'welcome-message' => 'Welcome, :customer_name',
'dropdown-text' => 'Manage Cart, Orders & Wishlist',
'header' => [
'cart' => 'Cart',
'cart' => 'Cart',
'guest' => 'Guest',
'logout' => 'Logout',
'title' => 'Account',
'account' => 'Account',
'profile' => 'Profile',
'wishlist' => 'Wishlist',
'all-categories' => 'All Categories',
'search-text' => 'Search products here',
'welcome-message' => 'Welcome, :customer_name',
'dropdown-text' => 'Manage Cart, Orders & Wishlist',
],
'menu-navbar' => [
'text-more' => 'More',
'menu-navbar' => [
'text-more' => 'More',
'text-category' => 'Shop by Category',
],
'minicart' => [
'cart' => 'Cart',
'minicart' => [
'cart' => 'Cart',
'view-cart' => 'View Cart',
],
'checkout' => [
'qty' => 'Qty',
'checkout' => 'Checkout',
'cart' => [
'view-cart' => 'View Cart',
'cart-summary' => 'Cart Summary',
'checkout' => [
'qty' => 'Qty',
'checkout' => 'Checkout',
'cart' => [
'view-cart' => 'View Cart',
'cart-summary' => 'Cart Summary',
],
'qty' => 'Qty',
'items' => 'Items',
'subtotal' => 'Subtotal',
'qty' => 'Qty',
'items' => 'Items',
'subtotal' => 'Subtotal',
'sub-total' => 'Sub Total',
'proceed' => 'Proceed to checkout',
'proceed' => 'Proceed to checkout',
],
'customer' => [
'compare' => [
'text' => 'Compare',
'customer' => [
'compare' => [
'text' => 'Compare',
'compare_similar_items' => 'Compare Similar Items',
'added' => 'Item successfully added to compare list',
'already_added' => 'Item already added to compare list',
'removed' => 'Item successfully removed from compare list',
'empty-text' => "You don't have any items in your compare list",
'added' => 'Item successfully added to compare list',
'already_added' => 'Item already added to compare list',
'removed' => 'Item successfully removed from compare list',
'empty-text' => "You don't have any items in your compare list",
],
'login-form' => [
'sign-up' => 'Sign up',
'new-customer' => 'New Customer',
'customer-login' => 'Customer Login',
'registered-user' => 'Registered User',
'your-email-address' => 'Your email address',
'form-login-text' => 'If you have an account, sign in with your email address.',
'login-form' => [
'sign-up' => 'Sign up',
'new-customer' => 'New Customer',
'customer-login' => 'Customer Login',
'registered-user' => 'Registered User',
'your-email-address' => 'Your email address',
'form-login-text' => 'If you have an account, sign in with your email address.',
],
'signup-form' => [
'login' => 'Login',
'become-user' => 'Become User',
'signup-form' => [
'login' => 'Login',
'become-user' => 'Become User',
'user-registration' => 'User Registration',
'form-sginup-text' => 'If you are new to our store, we glab to have you as member.',
'form-sginup-text' => 'If you are new to our store, we glab to have you as member.',
],
'forget-password' => [
'login' => 'Login',
'forgot-password' => 'Forgot Password',
'recover-password' => 'Recover Password',
'forget-password' => [
'login' => 'Login',
'forgot-password' => 'Forgot Password',
'recover-password' => 'Recover Password',
'recover-password-text' => 'If you forgot your password, recover it by entering your email address.',
]
],
'error' => [
'go-to-home' => 'Go to home',
'page-lost-short' => 'Page lost content',
'something_went_wrong' => 'something went wrong',
'error' => [
'go-to-home' => 'Go to home',
'page-lost-short' => 'Page lost content',
'something_went_wrong' => 'something went wrong',
'page-lost-description' => "The page you're looking for isn't available. Try to search again or use the Go Back button below.",
],
'products' => [
'text' => 'Products',
'details' => 'Details',
'reviews-title' => 'Reviews',
'reviewed' => 'Reviewed',
'review-by' => 'Review by',
'quick-view' => 'Quick View',
'not-available' => 'Not Available',
'submit-review' => 'Submit Review',
'ratings' => ':totalRatings Ratings',
'reviews-count' => ':totalReviews Reviews',
'customer-rating' => 'Customer Rating',
'more-infomation' => 'More Information',
'view-all-reviews' => 'View All Reviews',
'products' => [
'text' => 'Products',
'details' => 'Details',
'reviews-title' => 'Reviews',
'reviewed' => 'Reviewed',
'review-by' => 'Review by',
'quick-view' => 'Quick View',
'not-available' => 'Not Available',
'submit-review' => 'Submit Review',
'ratings' => ':totalRatings Ratings',
'reviews-count' => ':totalReviews Reviews',
'customer-rating' => 'Customer Rating',
'more-infomation' => 'More Information',
'view-all-reviews' => 'View All Reviews',
'write-your-review' => 'Write Your Review',
'short-description' => 'Short Descriptions',
'recently-viewed' => 'Recently Viewed Products',
'be-first-review' => 'Be the first to write a review',
'recently-viewed' => 'Recently Viewed Products',
'be-first-review' => 'Be the first to write a review',
],
'shop' => [
'gender' => [
'male' => 'Male',
'other' => 'Other',
'shop' => [
'gender' => [
'male' => 'Male',
'other' => 'Other',
'female' => 'Female',
],
'general' => [
'view' => 'View',
'filter' => 'Filter',
'orders' => 'Orders',
'update' => 'Update',
'reviews' => 'Reviews',
'addresses' => 'Addresses',
'top-brands' => 'Top Brands',
'new-password' => 'New password',
'downloadables' => 'Downloadable Products',
'confirm-new-password' => 'Confirm new password',
'general' => [
'no' => 'No',
'yes' => 'Yes',
'view' => 'View',
'filter' => 'Filter',
'orders' => 'Orders',
'update' => 'Update',
'reviews' => 'Reviews',
'addresses' => 'Addresses',
'top-brands' => 'Top Brands',
'new-password' => 'New password',
'downloadables' => 'Downloadable Products',
'confirm-new-password' => 'Confirm new password',
'enter-current-password' => 'Enter your current password',
'alert' => [
'info' => 'Info',
'error' => 'Error',
'success' => 'Success',
'warning' => 'Warning',
'info' => 'Info',
'error' => 'Error',
'success' => 'Success',
'warning' => 'Warning',
],
],
'wishlist' => [
'add-wishlist-text' => 'Add product to wishlist',
'remove-wishlist-text' => 'Remove product from wishlist'
'wishlist' => [
'add-wishlist-text' => 'Add product to wishlist',
'remove-wishlist-text' => 'Remove product from wishlist'
]
],
'responsive' => [
'responsive' => [
'header' => [
'greeting' => 'Welcome, :customer !',
]

View File

@ -255,6 +255,8 @@ return [
'female' => 'زن',
],
'general' => [
'no' => 'No',
'yes' => 'Yes',
'view' => 'چشم انداز',
'filter' => 'فیلتر',
'orders' => 'سفارشات',

View File

@ -255,6 +255,8 @@ return [
'female' => 'Vrouw',
],
'general' => [
'no' => 'No',
'yes' => 'Yes',
'view' => 'View',
'filter' => 'Filter',
'orders' => 'Orders',

View File

@ -4,140 +4,140 @@ return [
'admin' => [
'system' => [
'velocity' => [
'general' => 'General',
'category' => 'Category',
'settings' => 'Settings',
'extension_name' => 'Velocity Theme',
'error-module-inactive' => 'Warning: Velocity theme status is inactive',
'general' => 'Geral',
'category' => 'Categoria',
'settings' => 'Configurações',
'extension_name' => 'Velocity Tema',
'error-module-inactive' => 'Atenção: Tema Velocity está inativo',
],
'settings' => [
'channels'=> [
'subscription_bar' => 'Subscription bar content'
'subscription_bar' => 'Conteúdo da barra de inscrição'
],
],
'general' => [
'status' => 'Status',
'active' => 'Active',
'inactive' => 'Inactive',
'active' => 'Ativo',
'inactive' => 'Inativo',
],
'category' => [
'all' => 'All',
'left' => 'Left',
'right' => 'Right',
'active' => 'Active',
'custom' => 'Custom',
'inactive' => 'Inactive',
'image-alignment' => 'Image Alignment',
'icon-status' => 'Category Icon Status',
'image-status' => 'Category Image Status',
'sub-category-show' => 'Show Sub Category',
'image-height' => 'Image\'s Height [in Pixel]',
'image-width' => 'Image\'s Width [in Pixel]',
'show-tooltip' => 'Show Category\'s Tooltip',
'num-sub-category' => 'Number Of Sub Category',
'all' => 'Todos',
'left' => 'Esquerda',
'right' => 'Direita',
'active' => 'Ativo',
'custom' => 'Personalizar',
'inactive' => 'Inativo',
'image-alignment' => 'Alinhamento da Imagem',
'icon-status' => 'Status do Ícone da Categoria',
'image-status' => 'Status da Imagem de Categoria',
'sub-category-show' => 'Mostrar Subcategorias',
'image-height' => 'Altura da Imagem [em Pixel]',
'image-width' => 'Largura da Imagem [em Pixel]',
'show-tooltip' => 'Mostrar Sugestão de Categoria',
'num-sub-category' => 'Número de Subcategorias',
]
],
'layouts' => [
'velocity' => 'Velocity',
'cms-pages' => 'CMS Pages',
'cms-pages' => 'CMS Páginas',
'meta-data' => 'Meta Data',
'category-menu' => 'Category Menu',
'header-content' => 'Header Content',
'category-menu' => 'Categoria Menu',
'header-content' => 'Cabeçalho Conteúdo',
],
'contents' => [
'self' => 'Self',
'active' => 'Active',
'new-tab' => 'New Tab',
'inactive' => 'Inactive',
'title' => 'Content List',
'select' => '-- Select --',
'add-title' => 'Add Content',
'btn-add-content' => 'Add Content',
'save-btn-title' => 'Save Content',
'autocomplete' => '[Autocomplete]',
'no-result-found' => 'No record found.',
'search-hint' => 'Search product here...',
'mass-delete-success' => 'Selected content deleted successfully.',
'self' => 'Auto',
'active' => 'Ativo',
'new-tab' => 'Nova Aba',
'inactive' => 'Inativo',
'title' => 'Lista de Conteúdo',
'select' => '-- Selecione --',
'add-title' => 'Adicionar Conteúdo',
'btn-add-content' => 'Add Conteúdo',
'save-btn-title' => 'Salvar Conteúdo',
'autocomplete' => '[Autocompletar]',
'no-result-found' => 'Nenhum registo encontrado.',
'search-hint' => 'Busque produtos aqui...',
'mass-delete-success' => 'Conteúdo selecionado excluído com sucesso.',
'tab' => [
'page' => 'Page Setting',
'content' => 'Content Setting',
'page' => 'Configuração da Página',
'content' => 'Configuração do Conteúdo',
'meta_content' => 'Meta Data',
],
'page' => [
'title' => 'Title',
'title' => 'Título',
'status' => 'Status',
'position' => 'Position',
'position' => 'Posição',
],
'content' => [
'content-type' => 'Content Type',
'custom-title' => 'Custom Title',
'category-slug' => 'Category Slug',
'link-target' => 'Page Link Target',
'custom-product' => 'Store Products',
'custom-heading' => 'Custom Heading',
'catalog-type' => 'Product Catalog Type',
'static-description' => 'Content Description',
'page-link' => 'Page Link [e.g. http://example.com/../../]',
'content-type' => 'Tipo de Conteúdo',
'custom-title' => 'Título Customizado',
'category-slug' => 'Slug da Categoria',
'link-target' => 'Destino do Link da Página',
'custom-product' => 'Produtos da Loja',
'custom-heading' => 'Cabeçalho Customizado',
'catalog-type' => 'Tipo de Catálogo de Produtos',
'static-description' => 'Descrição do Conteúdo',
'page-link' => 'Link da Página [e.g. http://example.com/../../]',
],
'datagrid' => [
'id' => 'Id',
'title' => 'Title',
'title' => 'Título',
'status' => 'Status',
'position' => 'Position',
'content-type' => 'Content Type',
'position' => 'Posisção',
'content-type' => 'Tipo de Conteúdo',
]
],
'meta-data' => [
'footer' => 'Footer',
'footer' => 'Rodapé',
'title' => 'Velocity meta data',
'activate-slider' => 'Activate Slider',
'home-page-content' => 'Home Page Content',
'footer-left-content' => 'Footer Left Content',
'subscription-content' => 'Subscription bar Content',
'activate-slider' => 'Ativar Slider',
'home-page-content' => 'Conteúdo da Página Inicial',
'footer-left-content' => 'Conteúdo Rodapé Esquerdo',
'subscription-content' => 'Conteúdo da Barra de Inscrição',
'sidebar-categories' => 'Sidebar Categories',
'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>',
'slider-path' => 'Slider Path',
'category-logo' => 'Category logo',
'product-policy' => 'Product Policy',
'update-meta-data' => 'Update Meta Data',
'product-view-image' => 'Product View Image',
'advertisement-two' => 'Advertisement Two Images',
'advertisement-one' => 'Advertisement One Images',
'footer-middle-content' => 'Footer Middle Content',
'advertisement-four' => 'Advertisement Four Images',
'advertisement-three' => 'Advertisement Three Images',
'images' => 'Images',
'general' => 'General',
'add-image-btn-title' => 'Add Image'
'slider-path' => 'Caminho do Slider',
'category-logo' => 'Logo da Categoria',
'product-policy' => 'Política de Produto',
'update-meta-data' => 'Atualizar Meta Data',
'product-view-image' => 'Imagem da Visualização do produto',
'advertisement-two' => 'Anúncio Duas Imagens',
'advertisement-one' => 'Anúncio Uma Imagem',
'footer-middle-content' => 'Rodapé Conteúdo do Meio',
'advertisement-four' => 'Anúncio Quatro Imagens',
'advertisement-three' => 'Anúncio Três Imagens',
'images' => 'Imagens',
'general' => 'Geral',
'add-image-btn-title' => 'Add Imagem'
],
'category' => [
'save-btn-title' => 'Save Menu',
'title' => 'Category Menu List',
'add-title' => 'Add Menu Content',
'edit-title' => 'Edit Menu Content',
'btn-add-category' => 'Add Category Content',
'save-btn-title' => 'Salvar Menu',
'title' => 'Lista de Categorias Menu',
'add-title' => 'Adicionar Conteúdo do Menu',
'edit-title' => 'Editar Conteúdo do Menu',
'btn-add-category' => 'Add Conteúdo da Categoria',
'datagrid' => [
'category-id' => 'Category Id',
'category-name' => 'Category Name',
'category-icon' => 'Category Icon',
'category-id' => 'Categoria Id',
'category-name' => 'Categoria Nome',
'category-icon' => 'Categoria Ícone',
'category-status' => 'Status',
],
'tab' => [
'general' => 'General',
'general' => 'Geral',
],
'status' => 'Status',
'active' => 'Active',
'inactive' => 'Inactive',
'select' => '-- Select --',
'icon-class' => 'Icon Class',
'select-category' => 'Choose Category',
'tooltip-content' => 'Tooltip Content',
'mass-delete-success' => 'Selected categories menu deleted successfully.',
'active' => 'Ativo',
'inactive' => 'Inativo',
'select' => '-- Selecionar --',
'icon-class' => 'Classe do Ícone',
'select-category' => 'Escolha a Categoria',
'tooltip-content' => 'Conteúdo da Dica',
'mass-delete-success' => 'Menu de categorias selecionadas excluído com sucesso.',
],
'general' => [
'locale_logo' => 'Logotipo da localidade',
'locale_logo' => 'Logotipo da liguagem',
],
],
@ -152,23 +152,24 @@ return [
],
'header' => [
'cart' => 'Cart',
'cart' => 'Cart',
'guest' => 'Hóspede',
'logout' => 'Logout',
'title' => 'Account',
'account' => 'Account',
'profile' => 'Profile',
'wishlist' => 'Wishlist',
'all-categories' => 'todas as categorias',
'cart' => 'Carrinho',
'guest' => 'Cliente',
'logout' => 'Sair',
'title' => 'Minha Conta',
'account' => 'Minha Conta',
'profile' => 'Conta',
'wishlist' => 'Lista de Desejo',
'all-categories' => 'Toda Loja',
'search-text' => 'Pesquise produtos aqui',
'welcome-message' => 'Bem-vinda, :customer_name',
'dropdown-text' => 'Manage Cart, Orders & Wishlist',
'welcome-message' => 'Bem-vindo, :customer_name',
'dropdown-text' => 'Configurar Carrinho, Pedidos & Listas de Desejo',
'sign-in' => 'Entrar',
'sign-up' => 'Criar Conta'
],
'menu-navbar' => [
'text-more' => 'More',
'text-category' => 'Compre por categoria',
'text-more' => 'Mais',
'text-category' => 'Comprar por categoria',
],
'minicart' => [
@ -177,17 +178,18 @@ return [
],
'checkout' => [
'qty' => 'Qty',
'checkout' => 'Checkout',
'qty' => 'Qtd',
'checkout' => 'Finalizar Compra',
'cart' => [
'view-cart' => 'View Cart',
'cart-summary' => 'Cart Summary',
'view-cart' => 'Ver Carrinho',
'cart-summary' => 'Resumo do Carrinho',
'cart-subtotal' => 'Subtotal',
],
'qty' => 'Qty',
'items' => 'Items',
'qty' => 'Qtd',
'items' => 'Itens',
'subtotal' => 'Subtotal',
'sub-total' => 'Sub Total',
'proceed' => 'Proceed to checkout',
'proceed' => 'Finalizar Compra',
],
'customer' => [
@ -200,7 +202,7 @@ return [
'empty-text' => "Você não possui nenhum item na sua lista de comparação",
],
'login-form' => [
'sign-up' => 'inscrever-se',
'sign-up' => 'Cadastrar',
'new-customer' => 'Novo cliente',
'customer-login' => 'Login do cliente',
'registered-user' => 'Usuário Registrado',
@ -222,10 +224,10 @@ return [
],
'error' => [
'go-to-home' => 'Vá para casa',
'go-to-home' => 'Vá para Página Inicial',
'something_went_wrong' => 'algo deu errado',
'page-lost-short' => 'Conteúdo perdido da página',
'page-lost-description' => "A página que você está procurando não está disponível. Tente pesquisar novamente ou use o botão Voltar atrás abaixo.",
'page-lost-description' => "A página que você está procurando não está disponível. Tente pesquisar novamente ou use o botão Voltar abaixo.",
],
'products' => [
@ -237,8 +239,8 @@ return [
'quick-view' => 'Olhada rápida',
'submit-review' => 'Enviar revisão',
'not-available' => 'Não disponível',
'ratings' => ':totalRatings Avaliações',
'reviews-count' => ':totalReviews Avaliações',
'ratings' => ':total Ratings Avaliações',
'reviews-count' => ':total Reviews Avaliações',
'more-infomation' => 'Mais Informações',
'short-description' => 'Descrições breves',
'customer-rating' => 'Avaliação do cliente',
@ -250,11 +252,13 @@ return [
'shop' => [
'gender' => [
'female' => 'Fêmea',
'male' => 'Masculino',
'other' => 'De outros',
'female' => 'Mulher',
'male' => 'Homem',
'other' => 'Outro',
],
'general' => [
'no' => 'Não',
'yes' => 'Sim',
'view' => 'Visão',
'filter' => 'Filtro',
'update' => 'Atualizar',
@ -282,7 +286,7 @@ return [
'responsive' => [
'header' => [
'greeting' => 'Bem-vinda, :customer !',
'greeting' => 'Bem-vindo, :customer !',
]
],
]

View File

@ -74,7 +74,6 @@
this.disable_button = false;
}).catch(error => {
debugger
this.error_message = error.response.data.message;
this.disable_button = false;

View File

@ -116,28 +116,18 @@
'text' => "<span class='align-vertical-super'>$moveToWishlist</span>"
])
@else
<a
class="unset"
href="{{ route('shop.movetowishlist', $item->child->id) }}"
onclick="removeLink('{{ __('shop::app.checkout.cart.cart-remove-action') }}')">
<wishlist-component
active="false"
add-class="align-vertical-top">
</wishlist-component>
<span class="align-vertical-top">
{{ __('shop::app.layouts.wishlist') }}
</span>
</a>
@include('shop::products.wishlist', [
'route' => route('shop.movetowishlist', $item->child->id),
'text' => "<span class='align-vertical-super'>$moveToWishlist</span>"
])
@endif
@endauth
@guest('customer')
@include('shop::products.wishlist')
<span class="align-vertical-top">
{{ __('shop::app.checkout.cart.move-to-wishlist') }}
</span>
@include('shop::products.wishlist', [
'isMoveToWishlist' => route('shop.checkout.cart.remove', ['id' => $item->id]),
'text' => "<span class='align-vertical-top'>$moveToWishlist</span>"
])
@endguest
<a

View File

@ -20,8 +20,8 @@
$subMenuCollection['wishlist'] = $menuItem['children']['wishlist'];
$subMenuCollection['compare'] = [
'key' => 'account.compare',
'url' => route('velocity.customer.product.compare'),
'name' => 'velocity::app.customer.compare.text',
'url' => route('velocity.customer.product.compare'),
];
$subMenuCollection['reviews'] = $menuItem['children']['reviews'];
$subMenuCollection['address'] = $menuItem['children']['address'];

View File

@ -20,7 +20,7 @@
{!! view_render_event('bagisto.shop.customers.account.compare.view.before') !!}
<div class="row compare-products col-12 ml0">
<table class="row compare-products">
<shimmer-component v-if="!isProductListLoaded && !isMobile()"></shimmer-component>
<template v-else-if="isProductListLoaded && products.length > 0">
@ -39,12 +39,12 @@
@endphp
@foreach ($comparableAttributes as $attribute)
<div class="row col-12 pr-0 mt15">
<div class="col-2">
<tr>
<td>
<span class="fs16">{{ $attribute['admin_name'] }}</span>
</div>
</td>
<div class="col" :key="`title-${index}`" v-for="(product, index) in products">
<td :key="`title-${index}`" v-for="(product, index) in products">
@switch ($attribute['code'])
@case('name')
<a :href="`${$root.baseUrl}/${product.url_key}`" class="unset remove-decoration active-hover">
@ -91,19 +91,31 @@
@break
@default
<span v-html="product['{{ $attribute['code'] }}']" class="fs16"></span>
@switch ($attribute['type'])
@case('boolean')
<span
v-text="product.product['{{ $attribute['code'] }}']
? '{{ __('velocity::app.shop.general.yes') }}'
: '{{ __('velocity::app.shop.general.no') }}'"
></span>
@break;
@default
<span v-html="product['{{ $attribute['code'] }}'] ? product['{{ $attribute['code'] }}'] : product.product['{{ $attribute['code'] }}'] ? product.product['{{ $attribute['code'] }}'] : '__'" class="fs16"></span>
@break;
@endswitch
@break
@endswitch
</div>
</div>
</td>
</tr>
@endforeach
</template>
<span v-else-if="isProductListLoaded && products.length == 0">
@{{ __('customer.compare.empty-text') }}
</span>
</div>
</table>
{!! view_render_event('bagisto.shop.customers.account.compare.view.after') !!}
</section>
@ -149,6 +161,11 @@
this.$http.get(url, data)
.then(response => {
this.isProductListLoaded = true;
if (response.data.products.length > 3) {
$('.compare-products').css('overflow-x', 'scroll');
}
this.products = response.data.products;
})
.catch(error => {

View File

@ -27,15 +27,13 @@
<button
type="submit"
{{ ! $product->isSaleable() ? 'disabled' : '' }}
class="btn btn-add-to-cart {{ $addToCartBtnClass ?? '' }}">
class="theme-btn {{ $addToCartBtnClass ?? '' }}">
@if (! (isset($showCartIcon) && !$showCartIcon))
<i class="material-icons text-down-3">shopping_cart</i>
@endif
<span type="submit" class="fs14 fw6 text-uppercase text-up-4">
{{ __('shop::app.products.add-to-cart') }}
</span>
</button>
@elseif(isset($addToCartForm) && !$addToCartForm)
<form

View File

@ -183,7 +183,7 @@
data: function() {
let maxPrice = '{{ core()->convertPrice($productFlatRepository->getCategoryProductMaximumPrice($category)) }}';
maxPrice = (parseInt(maxPrice) !== 0) ? parseInt(maxPrice) : 500;
maxPrice = maxPrice ? ((parseInt(maxPrice) !== 0 || maxPrice) ? parseInt(maxPrice) : 500) : 500;
return {
active: false,

View File

@ -16,7 +16,6 @@
foreach ($images as $key => $image) {
array_push($productImages, $image['medium_image_url']);
}
@endphp
@section('page_title')
@ -73,8 +72,8 @@
@if ($total)
<div class="reviews col-lg-12">
<star-ratings
:ratings="{{ $avgStarRating }}"
push-class="mr5"
:ratings="{{ $avgStarRating }}"
></star-ratings>
<div class="reviews">

View File

@ -30,9 +30,12 @@
<wishlist-component
active="false"
is-customer="false"
text="{{ $text ?? null }}"
product-id="{{ $product->id }}"
item-id="{{ $item->id ?? null}}"
product-slug="{{ $product->url_key }}"
add-class="{{ $addWishlistClass ?? '' }}"
move-to-wishlist="{{ $isMoveToWishlist ?? null}}"
added-text="{{ __('shop::app.customer.account.wishlist.add') }}"
remove-text="{{ __('shop::app.customer.account.wishlist.remove') }}">
</wishlist-component>