Merge pull request #18 from bagisto/master

Update fork
This commit is contained in:
Glenn Hermans 2021-07-08 09:52:23 +02:00 committed by GitHub
commit 630e1a79f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
68 changed files with 3794 additions and 238 deletions

15
composer.lock generated
View File

@ -3545,16 +3545,16 @@
},
{
"name": "league/flysystem",
"version": "1.1.3",
"version": "1.1.4",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
"reference": "9be3b16c877d477357c015cec057548cf9b2a14a"
"reference": "f3ad69181b8afed2c9edf7be5a2918144ff4ea32"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/9be3b16c877d477357c015cec057548cf9b2a14a",
"reference": "9be3b16c877d477357c015cec057548cf9b2a14a",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f3ad69181b8afed2c9edf7be5a2918144ff4ea32",
"reference": "f3ad69181b8afed2c9edf7be5a2918144ff4ea32",
"shasum": ""
},
"require": {
@ -3570,7 +3570,6 @@
"phpunit/phpunit": "^8.5.8"
},
"suggest": {
"ext-fileinfo": "Required for MimeType",
"ext-ftp": "Allows you to use FTP server storage",
"ext-openssl": "Allows you to use FTPS server storage",
"league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
@ -3628,7 +3627,7 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem/issues",
"source": "https://github.com/thephpleague/flysystem/tree/1.x"
"source": "https://github.com/thephpleague/flysystem/tree/1.1.4"
},
"funding": [
{
@ -3636,7 +3635,7 @@
"type": "other"
}
],
"time": "2020-08-23T07:39:11+00:00"
"time": "2021-06-23T21:56:05+00:00"
},
{
"name": "league/mime-type-detection",
@ -11595,5 +11594,5 @@
"php": "^7.3|^8.0"
},
"platform-dev": [],
"plugin-api-version": "2.0.0"
"plugin-api-version": "2.1.0"
}

View File

@ -297,6 +297,11 @@ return [
'aliases' => [
/**
* Laravel
*
* Place your aliases in alphabetical order.
*/
'App' => Illuminate\Support\Facades\App::class,
'Artisan' => Illuminate\Support\Facades\Artisan::class,
'Auth' => Illuminate\Support\Facades\Auth::class,
@ -330,18 +335,25 @@ return [
'URL' => Illuminate\Support\Facades\URL::class,
'Validator' => Illuminate\Support\Facades\Validator::class,
'View' => Illuminate\Support\Facades\View::class,
'Datagrid' => Webkul\Ui\DataGrid\Facades\DataGrid::class,
'ProductGrid' => Webkul\Ui\DataGrid\Facades\ProductGrid::class,
'Image' => Intervention\Image\Facades\Image::class,
/**
* Bagisto
*
* Place your aliases in alphabetical order.
*/
'Captcha' => Webkul\Customer\Facades\Captcha::class,
'Cart' => Webkul\Checkout\Facades\Cart::class,
'Core' => Webkul\Core\Facades\Core::class,
'DbView' => Flynsarmy\DbBladeCompiler\Facades\DbView::class,
'PDF' => Barryvdh\DomPDF\Facade::class,
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
'Concord' => Konekt\Concord\Facades\Concord::class,
'Helper' => Konekt\Concord\Facades\Helper::class,
'Core' => Webkul\Core\Facades\Core::class,
'Datagrid' => Webkul\Ui\DataGrid\Facades\DataGrid::class,
'DbView' => Flynsarmy\DbBladeCompiler\Facades\DbView::class,
'Debugbar' => Barryvdh\Debugbar\Facade::class,
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
'Helper' => Konekt\Concord\Facades\Helper::class,
'Image' => Intervention\Image\Facades\Image::class,
'PDF' => Barryvdh\DomPDF\Facade::class,
'ProductImage' => Webkul\Product\Facades\ProductImage::class,
'ProductVideo' => Webkul\Product\Facades\ProductVideo::class
'ProductGrid' => Webkul\Ui\DataGrid\Facades\ProductGrid::class,
'ProductVideo' => Webkul\Product\Facades\ProductVideo::class,
],
];

View File

@ -2,11 +2,11 @@
namespace Webkul\API\Http\Controllers\Shop;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Event;
use Webkul\Customer\Repositories\CustomerRepository;
use Webkul\Customer\Http\Requests\CustomerRegistrationRequest;
use Webkul\Customer\Repositories\CustomerGroupRepository;
use Webkul\Customer\Repositories\CustomerRepository;
class CustomerController extends Controller
{
@ -70,14 +70,9 @@ class CustomerController extends Controller
*
* @return \Illuminate\Http\Response
*/
public function create(Request $request)
public function create(CustomerRegistrationRequest $request)
{
$this->validate($request, [
'first_name' => 'required',
'last_name' => 'required',
'email' => 'email|required|unique:customers,email',
'password' => 'confirmed|min:6|required',
]);
$request->validated();
$data = [
'first_name' => $request->get('first_name'),

View File

@ -4,33 +4,30 @@ namespace Webkul\API\Http\Controllers\Shop;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
use Illuminate\Support\Facades\Password;
use Webkul\Customer\Http\Requests\CustomerForgotPasswordRequest;
class ForgotPasswordController extends Controller
{
use SendsPasswordResetEmails;
/**
* Store a newly created resource in storage.
*
* @return \Illuminate\Http\Response
*/
public function store()
public function store(CustomerForgotPasswordRequest $request)
{
$this->validate(request(), [
'email' => 'required|email',
]);
$request->validated();
$response = $this->broker()->sendResetLink(request(['email']));
$response = $this->broker()->sendResetLink($request->only(['email']));
if ($response == Password::RESET_LINK_SENT) {
return response()->json([
return $response == Password::RESET_LINK_SENT
? response()->json([
'message' => trans($response),
])
: response()->json([
'error' => trans($response),
]);
}
return response()->json([
'error' => trans($response),
]);
}
/**
@ -42,4 +39,4 @@ class ForgotPasswordController extends Controller
{
return Password::broker('customers');
}
}
}

View File

@ -3,8 +3,9 @@
namespace Webkul\API\Http\Controllers\Shop;
use Illuminate\Support\Facades\Event;
use Webkul\Customer\Repositories\CustomerRepository;
use Webkul\API\Http\Resources\Customer\Customer as CustomerResource;
use Webkul\Customer\Http\Requests\CustomerLoginRequest;
use Webkul\Customer\Repositories\CustomerRepository;
class SessionController extends Controller
{
@ -45,22 +46,19 @@ class SessionController extends Controller
*
* @return \Illuminate\Http\Response
*/
public function create()
public function create(CustomerLoginRequest $request)
{
request()->validate([
'email' => 'required|email',
'password' => 'required',
]);
$request->validated();
$jwtToken = null;
if (! $jwtToken = auth()->guard($this->guard)->attempt(request()->only('email', 'password'))) {
if (! $jwtToken = auth()->guard($this->guard)->attempt($request->only(['email', 'password']))) {
return response()->json([
'error' => 'Invalid Email or Password',
], 401);
}
Event::dispatch('customer.after.login', request('email'));
Event::dispatch('customer.after.login', $request->get('email'));
$customer = auth($this->guard)->user();

File diff suppressed because it is too large Load Diff

View File

@ -230,6 +230,7 @@
<tr>
<th>{{ __('admin::app.sales.orders.SKU') }}</th>
<th>{{ __('admin::app.sales.orders.product-name') }}</th>
<th>{{ __('admin::app.sales.orders.price') }}</th>
<th>{{ __('admin::app.sales.orders.item-status') }}</th>
<th>{{ __('admin::app.sales.orders.subtotal') }}</th>
<th>{{ __('admin::app.sales.orders.tax-amount') }}</th>
@ -261,6 +262,8 @@
@endif
</td>
<td>{{ core()->formatBasePrice($item->base_price) }}</td>
<td>
<span class="qty-row">
{{ $item->qty_ordered ? __('admin::app.sales.orders.item-ordered', ['qty_ordered' => $item->qty_ordered]) : '' }}
@ -283,7 +286,7 @@
</span>
</td>
<td>{{ core()->formatBasePrice($item->base_price) }}</td>
<td>{{ core()->formatBasePrice($item->base_total) }}</td>
<td>{{ core()->formatBasePrice($item->base_tax_amount) }}</td>

View File

@ -4,19 +4,19 @@ namespace Webkul\Checkout;
use Exception;
use Illuminate\Support\Arr;
use Webkul\Tax\Helpers\Tax;
use Illuminate\Support\Facades\Event;
use Webkul\Shipping\Facades\Shipping;
use Webkul\Checkout\Models\Cart as CartModel;
use Webkul\Checkout\Models\CartAddress;
use Webkul\Checkout\Models\CartPayment;
use Webkul\Checkout\Models\Cart as CartModel;
use Webkul\Checkout\Repositories\CartRepository;
use Webkul\Product\Repositories\ProductRepository;
use Webkul\Tax\Repositories\TaxCategoryRepository;
use Webkul\Checkout\Repositories\CartItemRepository;
use Webkul\Customer\Repositories\WishlistRepository;
use Webkul\Checkout\Repositories\CartAddressRepository;
use Webkul\Checkout\Repositories\CartItemRepository;
use Webkul\Checkout\Repositories\CartRepository;
use Webkul\Customer\Repositories\CustomerAddressRepository;
use Webkul\Customer\Repositories\WishlistRepository;
use Webkul\Product\Repositories\ProductRepository;
use Webkul\Shipping\Facades\Shipping;
use Webkul\Tax\Helpers\Tax;
use Webkul\Tax\Repositories\TaxCategoryRepository;
class Cart
{
@ -284,7 +284,7 @@ class Cart
}
/**
* Get cart item by product
* Get cart item by product.
*
* @param array $data
* @return \Webkul\Checkout\Contracts\CartItem|void
@ -296,7 +296,7 @@ class Cart
foreach ($items as $item) {
if ($item->product->getTypeInstance()->compareOptions($item->additional, $data['additional'])) {
if (isset($data['additional']['parent_id'])) {
if ($item->parent->product->getTypeInstance()->compareOptions($item->parent->additional, request()->all())) {
if ($item->parent->product->getTypeInstance()->compareOptions($item->parent->additional, $data['additional'])) {
return $item;
}
} else {

View File

@ -73,6 +73,11 @@ class Install extends Command
$result = shell_exec('composer dump-autoload');
$this->info($result);
// removing the installer directory
if (is_dir('public/installer')) {
shell_exec('rm -rf public/installer');
}
// final information
$this->info('-----------------------------');
$this->info('Congratulations!');

View File

@ -2,12 +2,12 @@
namespace Webkul\Core\Exceptions;
use Throwable;
use PDOException;
use Illuminate\Auth\AuthenticationException;
use App\Exceptions\Handler as AppExceptionHandler;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use PDOException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Throwable;
class Handler extends AppExceptionHandler
{
@ -32,16 +32,8 @@ class Handler extends AppExceptionHandler
*/
public function render($request, Throwable $exception)
{
$path = $this->isAdminUri() ? 'admin' : 'shop';
if ($exception instanceof HttpException) {
$statusCode = in_array($exception->getStatusCode(), [401, 403, 404, 503]) ? $exception->getStatusCode() : 500;
return $this->response($path, $statusCode);
} elseif ($exception instanceof ModelNotFoundException) {
return $this->response($path, 404);
} elseif ($exception instanceof PDOException) {
return $this->response($path, 500);
if (! config('app.debug')) {
return $this->renderCustomResponse($request, $exception);
}
return parent::render($request, $exception);
@ -73,6 +65,32 @@ class Handler extends AppExceptionHandler
return strpos(\Illuminate\Support\Facades\Request::path(), 'admin') !== false ? true : false;
}
/**
* Render custom HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Throwable $exception
* @return \Illuminate\Http\Response|null
*/
private function renderCustomResponse($request, Throwable $exception)
{
$path = $this->isAdminUri() ? 'admin' : 'shop';
if ($exception instanceof HttpException) {
$statusCode = in_array($exception->getStatusCode(), [401, 403, 404, 503])
? $exception->getStatusCode()
: 500;
return $this->response($path, $statusCode);
} elseif ($exception instanceof ModelNotFoundException) {
return $this->response($path, 404);
} elseif ($exception instanceof PDOException) {
return $this->response($path, 500);
} else {
return parent::render($request, $exception);
}
}
/**
* Response.
*

View File

@ -0,0 +1,212 @@
<?php
namespace Webkul\Customer;
use Webkul\Customer\Contracts\Captcha as CaptchaContract;
class Captcha implements CaptchaContract
{
/**
* Site key.
*
* @var string
*/
protected $siteKey;
/**
* Secret key.
*
* @var string
*/
protected $secretKey;
/**
* Create a new instance.
*
* @return void
*/
public function __construct()
{
$this->siteKey = $this->getSiteKey();
$this->secretKey = $this->getSecretKey();
}
/**
* Check whether captcha is active or not.
*
* @return bool
*/
public function isActive(): bool
{
return (bool) core()->getConfigData('customer.captcha.credentials.status');
}
/**
* Get site key from the core config.
*
* @return null|string
*/
public function getSiteKey(): ?string
{
return core()->getConfigData('customer.captcha.credentials.site_key');
}
/**
* Get secret key from the core config.
*
* @return null|string
*/
public function getSecretKey(): ?string
{
return core()->getConfigData('customer.captcha.credentials.secret_key');
}
/**
* Get client endpoint.
*
* @return string
*/
public function getClientEndpoint(): string
{
return static::CLIENT_ENDPOINT;
}
/**
* Get site verify endpoint.
*
* @return string
*/
public function getSiteVerifyEndpoint(): string
{
return static::SITE_VERIFY_ENDPOINT;
}
/**
* Render JS.
*
* @return string
*/
public function renderJS(): string
{
return $this->isActive()
? $this->getCaptchaJSView()
: '';
}
/**
* Render Captcha.
*
* @return string
*/
public function render(): string
{
return $this->isActive()
? $this->getCaptchaView()
: '';
}
/**
* Validate response.
*
* @return bool
*/
public function validateResponse($response): bool
{
$client = new \GuzzleHttp\Client();
$response = $client->post($this->getSiteVerifyEndpoint(), [
'query' => [
'secret' => $this->secretKey,
'response' => $response
]
]);
return json_decode($response->getBody())->success;
}
/**
* Get or merge existing validations with your captcha validations.
*
* @return array
*/
public function getValidations($rules = []): array
{
return $this->isActive()
? array_merge($rules, ['g-recaptcha-response' => 'required|captcha'])
: $rules;
}
/**
* Get or merge existing validation messages with your captcha validation messages.
*
* @return array
*/
public function getValidationMessages($messages = []): array
{
return $this->isActive()
? array_merge($messages, [
'g-recaptcha-response.required' => __('customer::app.admin.system.captcha.validations.required'),
'g-recaptcha-response.captcha' => __('customer::app.admin.system.captcha.validations.captcha')
])
: $messages;
}
/**
* Get attributes.
*
* @return array
*/
protected function getAttributes(): array
{
return [
'class' => 'g-recaptcha',
'data-sitekey' => $this->siteKey,
];
}
/**
* Build attributes.
*
* @param array $attributes
* @return string
*/
protected function buildHTMLAttributes(array $attributes): string
{
$htmlAttributes = [];
foreach ($attributes as $key => $value) {
$htmlAttributes[] = "{$key}=\"{$value}\"";
}
return count($htmlAttributes)
? implode(' ', $htmlAttributes)
: '';
}
/**
* Get captcha view.
*
* @return string
*/
protected function getCaptchaView()
{
$htmlAttributes = $this->buildHTMLAttributes($this->getAttributes());
return view('customer::captcha.view', [
'htmlAttributes' => $htmlAttributes
])->render();
}
/**
* Get captcha script view.
*
* @return string
*/
protected function getCaptchaJSView()
{
return view('customer::captcha.scripts', [
'clientEndPoint' => $this->getClientEndpoint()
])->render();
}
}

View File

@ -0,0 +1,31 @@
<?php
return [
[
'key' => 'customer.captcha',
'name' => 'customer::app.admin.system.captcha.title',
'sort' => 1,
], [
'key' => 'customer.captcha.credentials',
'name' => 'customer::app.admin.system.captcha.credentials',
'sort' => 1,
'fields' => [
[
'name' => 'site_key',
'title' => 'customer::app.admin.system.captcha.site-key',
'type' => 'text',
'channel_based' => true,
], [
'name' => 'secret_key',
'title' => 'customer::app.admin.system.captcha.secret-key',
'type' => 'text',
'channel_based' => true,
], [
'name' => 'status',
'title' => 'customer::app.admin.system.captcha.status',
'type' => 'boolean',
'channel_based' => true,
]
],
],
];

View File

@ -0,0 +1,10 @@
<?php
namespace Webkul\Customer\Contracts;
interface Captcha
{
const CLIENT_ENDPOINT = 'https://www.google.com/recaptcha/api.js';
const SITE_VERIFY_ENDPOINT = 'https://google.com/recaptcha/api/siteverify';
}

View File

@ -0,0 +1,18 @@
<?php
namespace Webkul\Customer\Facades;
use Illuminate\Support\Facades\Facade;
class Captcha extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'captcha';
}
}

View File

@ -4,13 +4,14 @@ namespace Webkul\Customer\Http\Controllers;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
use Illuminate\Support\Facades\Password;
use Webkul\Customer\Http\Requests\CustomerForgotPasswordRequest;
class ForgotPasswordController extends Controller
{
use SendsPasswordResetEmails;
/**
* Contains route related configuration
* Contains route related configuration.
*
* @var array
*/
@ -41,16 +42,12 @@ class ForgotPasswordController extends Controller
*
* @return \Illuminate\Http\Response
*/
public function store()
public function store(CustomerForgotPasswordRequest $request)
{
try {
$this->validate(request(), [
'email' => 'required|email',
]);
$request->validated();
$response = $this->broker()->sendResetLink(
request(['email'])
);
try {
$response = $this->broker()->sendResetLink($request->only(['email']));
if ($response == Password::RESET_LINK_SENT) {
session()->flash('success', trans('customer::app.forget_password.reset_link_sent'));
@ -59,7 +56,7 @@ class ForgotPasswordController extends Controller
}
return back()
->withInput(request(['email']))
->withInput($request->only(['email']))
->withErrors([
'email' => trans('customer::app.forget_password.email_not_exist'),
]);
@ -69,6 +66,7 @@ class ForgotPasswordController extends Controller
return redirect()->back();
} catch (\Exception $e) {
report($e);
session()->flash('error', trans($e->getMessage()));
return redirect()->back();
@ -84,4 +82,4 @@ class ForgotPasswordController extends Controller
{
return Password::broker('customers');
}
}
}

View File

@ -2,54 +2,54 @@
namespace Webkul\Customer\Http\Controllers;
use Illuminate\Support\Str;
use Cookie;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Str;
use Webkul\Core\Repositories\SubscribersListRepository;
use Webkul\Customer\Http\Requests\CustomerRegistrationRequest;
use Webkul\Customer\Mail\RegistrationEmail;
use Webkul\Customer\Mail\VerificationEmail;
use Webkul\Shop\Mail\SubscriptionEmail;
use Webkul\Customer\Repositories\CustomerRepository;
use Webkul\Customer\Repositories\CustomerGroupRepository;
use Webkul\Core\Repositories\SubscribersListRepository;
use Cookie;
use Webkul\Customer\Repositories\CustomerRepository;
use Webkul\Shop\Mail\SubscriptionEmail;
class RegistrationController extends Controller
{
/**
* Contains route related configuration
* Contains route related configuration.
*
* @var array
*/
protected $_config;
/**
* CustomerRepository object
* Customer repository instance.
*
* @var \Webkul\Customer\Repositories\CustomerRepository
*/
protected $customerRepository;
/**
* CustomerGroupRepository object
* Customer group repository instance.
*
* @var \Webkul\Customer\Repositories\CustomerGroupRepository
*/
protected $customerGroupRepository;
/**
* SubscribersListRepository
* Subscribers list repository instance.
*
* @var \Webkul\Core\Repositories\SubscribersListRepository
*/
protected $subscriptionRepository;
/**
* Create a new Repository instance.
* Create a new controller instance.
*
* @param \Webkul\Customer\Repositories\CustomerRepository $customer
* @param \Webkul\Customer\Repositories\CustomerGroupRepository $customerGroupRepository
* @param \Webkul\Core\Repositories\SubscribersListRepository $subscriptionRepository
*
* @return void
*/
public function __construct(
@ -80,16 +80,12 @@ class RegistrationController extends Controller
/**
* Method to store user's sign up form data to DB.
*
* @param \Webkul\Customer\Http\Requests\CustomerRegistrationRequest $request
* @return \Illuminate\Http\Response
*/
public function create()
public function create(CustomerRegistrationRequest $request)
{
$this->validate(request(), [
'first_name' => 'string|required',
'last_name' => 'string|required',
'email' => 'email|required|unique:customers,email',
'password' => 'confirmed|min:6|required',
]);
$request->validated();
$data = array_merge(request()->input(), [
'password' => bcrypt(request()->input('password')),
@ -169,7 +165,7 @@ class RegistrationController extends Controller
}
/**
* Method to verify account
* Method to verify account.
*
* @param string $token
* @return \Illuminate\Http\Response
@ -190,6 +186,8 @@ class RegistrationController extends Controller
}
/**
* Resend verification email.
*
* @param string $email
* @return \Illuminate\Http\Response
*/

View File

@ -2,26 +2,27 @@
namespace Webkul\Customer\Http\Controllers;
use Illuminate\Support\Facades\Event;
use Cookie;
use Illuminate\Support\Facades\Event;
use Webkul\Customer\Http\Requests\CustomerLoginRequest;
class SessionController extends Controller
{
/**
* Contains route related configuration
* Contains route related configuration.
*
* @var array
*/
protected $_config;
/**
* Create a new Repository instance.
* Create a new controller instance.
*
* @return void
*/
*/
public function __construct()
{
$this->middleware('customer')->except(['show','create']);
$this->middleware('customer')->except(['show', 'create']);
$this->_config = request('_config');
}
@ -33,26 +34,22 @@ class SessionController extends Controller
*/
public function show()
{
if (auth()->guard('customer')->check()) {
return redirect()->route('customer.profile.index');
} else {
return view($this->_config['view']);
}
return auth()->guard('customer')->check()
? redirect()->route('customer.profile.index')
: view($this->_config['view']);
}
/**
* Show the form for creating a new resource.
*
* @param \Webkul\Customer\Http\Requests\CustomerLoginRequest $request
* @return \Illuminate\Http\Response
*/
public function create()
public function create(CustomerLoginRequest $request)
{
$this->validate(request(), [
'email' => 'required|email',
'password' => 'required',
]);
$request->validated();
if (! auth()->guard('customer')->attempt(request(['email', 'password']))) {
if (! auth()->guard('customer')->attempt($request->only(['email', 'password']))) {
session()->flash('error', trans('shop::app.customer.login-form.invalid-creds'));
return redirect()->back();
@ -71,15 +68,17 @@ class SessionController extends Controller
Cookie::queue(Cookie::make('enable-resend', 'true', 1));
Cookie::queue(Cookie::make('email-for-resend', request('email'), 1));
Cookie::queue(Cookie::make('email-for-resend', $request->get('email'), 1));
auth()->guard('customer')->logout();
return redirect()->back();
}
//Event passed to prepare cart after login
Event::dispatch('customer.after.login', request('email'));
/**
* Event passed to prepare cart after login.
*/
Event::dispatch('customer.after.login', $request->get('email'));
return redirect()->intended(route($this->_config['redirect']));
}
@ -98,4 +97,4 @@ class SessionController extends Controller
return redirect()->route($this->_config['redirect']);
}
}
}

View File

@ -0,0 +1,48 @@
<?php
namespace Webkul\Customer\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Webkul\Customer\Facades\Captcha;
class CustomerForgotPasswordRequest extends FormRequest
{
/**
* Define your rules.
*
* @var array
*/
private $rules = [
'email' => 'required|email',
];
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return Captcha::getValidations($this->rules);
}
/**
* Get custom messages for validator errors.
*
* @return array
*/
public function messages()
{
return Captcha::getValidationMessages();
}
}

View File

@ -0,0 +1,49 @@
<?php
namespace Webkul\Customer\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Webkul\Customer\Facades\Captcha;
class CustomerLoginRequest extends FormRequest
{
/**
* Define your rules.
*
* @var array
*/
private $rules = [
'email' => 'required|email',
'password' => 'required',
];
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return Captcha::getValidations($this->rules);
}
/**
* Get custom messages for validator errors.
*
* @return array
*/
public function messages()
{
return Captcha::getValidationMessages();
}
}

View File

@ -0,0 +1,51 @@
<?php
namespace Webkul\Customer\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Webkul\Customer\Facades\Captcha;
class CustomerRegistrationRequest extends FormRequest
{
/**
* Define your rules.
*
* @var array
*/
private $rules = [
'first_name' => 'string|required',
'last_name' => 'string|required',
'email' => 'email|required|unique:customers,email',
'password' => 'confirmed|min:6|required',
];
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return Captcha::getValidations($this->rules);
}
/**
* Get custom messages for validator errors.
*
* @return array
*/
public function messages()
{
return Captcha::getValidationMessages();
}
}

View File

@ -3,19 +3,31 @@
namespace Webkul\Customer\Providers;
use Illuminate\Database\Eloquent\Factory as EloquentFactory;
use Illuminate\Support\ServiceProvider;
use Illuminate\Routing\Router;
use Illuminate\Support\ServiceProvider;
use Webkul\Customer\Captcha;
use Webkul\Customer\Http\Middleware\RedirectIfNotCustomer;
class CustomerServiceProvider extends ServiceProvider
{
/**
* Bootstrap application services.
*
* @return void
*/
public function boot(Router $router)
{
$router->aliasMiddleware('customer', RedirectIfNotCustomer::class);
$this->loadMigrationsFrom(__DIR__ . '/../Database/Migrations');
$this->loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'customer');
$this->loadMigrationsFrom(__DIR__ . '/../Database/Migrations');
$this->loadViewsFrom(__DIR__ . '/../Resources/views', 'customer');
$this->app['validator']->extend('captcha', function ($attribute, $value, $parameters) {
return $this->app['captcha']->validateResponse($value);
});
}
/**
@ -26,14 +38,19 @@ class CustomerServiceProvider extends ServiceProvider
*/
public function register()
{
$this->registerConfig();
$this->registerEloquentFactoriesFrom(__DIR__ . '/../Database/Factories');
$this->app->singleton('captcha', function ($app) {
return new Captcha();
});
}
/**
* Register factories.
*
* @param string $path
*
* @param string $path
* @return void
* @throws \Illuminate\Contracts\Container\BindingResolutionException
*/
@ -41,4 +58,17 @@ class CustomerServiceProvider extends ServiceProvider
{
$this->app->make(EloquentFactory::class)->load($path);
}
/**
* Register package config.
*
* @return void
*/
protected function registerConfig()
{
$this->mergeConfigFrom(
dirname(__DIR__) . '/Config/system.php',
'core'
);
}
}

View File

@ -11,7 +11,30 @@ return [
'select-options' => 'تحتاج إلى تحديد خيارات قبل إضافة إلى قائمة الأمنيات',
'remove-all-success' => 'تمت إزالة جميع العناصر من قائمة الأمنيات الخاصة بك',
],
'reviews' => [
'empty' => '.لم تقم بمراجعة أي منتج حتى الآن'
]
];
'empty' => '.لم تقم بمراجعة أي منتج حتى الآن',
],
'forget_password' => [
'reset_link_sent' => 'لقد أرسلنا رابط إعادة تعيين كلمة المرور بالبريد الإلكتروني.',
'email_not_exist' => "لا يمكننا العثور على مستخدم بعنوان البريد الإلكتروني هذا",
],
'admin' => [
'system' => [
'captcha' => [
'title' => 'كلمة التحقق',
'credentials' => 'أوراق اعتماد',
'site-key' => 'مفتاح الموقع',
'secret-key' => 'المفتاح السري',
'status' => 'حالة',
'validations' => [
'required' => 'الرجاء اختيار CAPTCHA',
'captcha' => 'هناك خطأ ما! حاول مرة اخرى.',
]
],
],
],
];

View File

@ -11,10 +11,30 @@ return [
'select-options' => 'Vor dem Hinzufügen zur Wunschliste müssen Optionen ausgewählt werden',
'remove-all-success' => 'Alle Elemente von Ihrer Wunschliste wurden entfernt',
],
'reviews' => [
'empty' => 'Sie haben noch kein Produkt bewertet'
'empty' => 'Sie haben noch kein Produkt bewertet',
],
'forget_password' => [
'reset_link_sent' => 'Wir haben Ihren Link zum Zurücksetzen des Passworts per E-Mail gesendet.'
]
];
'reset_link_sent' => 'Wir haben Ihren Link zum Zurücksetzen des Passworts per E-Mail gesendet.',
'email_not_exist' => "Wir können keinen Benutzer mit dieser E-Mail-Adresse finden",
],
'admin' => [
'system' => [
'captcha' => [
'title' => 'Captcha',
'credentials' => 'Referenzen',
'site-key' => 'Site-Schlüssel',
'secret-key' => 'Geheimer Schlüssel',
'status' => 'Status',
'validations' => [
'required' => 'Bitte wählen Sie CAPTCHA',
'captcha' => 'Etwas ist schief gelaufen! Bitte versuche es erneut.',
]
],
],
],
];

View File

@ -11,11 +11,30 @@ return [
'select-options' => 'Need To Select Options Before Adding To Wishlist',
'remove-all-success' => 'All The Items From Your Wishlist Have Been Removed',
],
'reviews' => [
'empty' => 'You have not reviewed any of product yet'
'empty' => 'You have not reviewed any of product yet',
],
'forget_password' => [
'reset_link_sent' => 'We have e-mailed your reset password link.',
'email_not_exist' => "We can't find a user with that e-mail address"
]
];
'email_not_exist' => "We can't find a user with that e-mail address",
],
'admin' => [
'system' => [
'captcha' => [
'title' => 'Captcha',
'credentials' => 'Credentials',
'site-key' => 'Site Key',
'secret-key' => 'Secret Key',
'status' => 'Status',
'validations' => [
'required' => 'Please select CAPTCHA',
'captcha' => 'Something went wrong! Please try again.',
]
],
],
],
];

View File

@ -11,11 +11,30 @@ return [
'select-options' => 'Necesita seleccionar opciones antes de agregar a la lista de deseos',
'remove-all-success' => 'Se han eliminado todos los elementos de su lista de deseos',
],
'reviews' => [
'empty' => 'Aún no has calificado ningún producto'
'empty' => 'Aún no has calificado ningún producto',
],
'forget_password' => [
'reset_link_sent' => 'Hemos enviado un correo electrónico con el enlace para restablecer la contraseña.',
'email_not_exist' => "No podemos encontrar un usuario con esa dirección de correo electrónico"
]
'email_not_exist' => "No podemos encontrar un usuario con esa dirección de correo electrónico",
],
'admin' => [
'system' => [
'captcha' => [
'title' => 'Captcha',
'credentials' => 'Cartas credenciales',
'site-key' => 'Clave del sitio',
'secret-key' => 'Llave secreta',
'status' => 'Estado',
'validations' => [
'required' => 'Seleccione CAPTCHA',
'captcha' => '¡Algo salió mal! Inténtalo de nuevo.',
]
],
],
],
];

View File

@ -0,0 +1,40 @@
<?php
return [
'wishlist' => [
'success' => 'Article ajouté avec succès à la liste de souhaits',
'failure' => 'L\'article ne peut pas être ajouté à la liste de souhaits',
'already' => 'Article déjà présent dans votre liste de souhaits',
'removed' => 'Article supprimé avec succès de la liste de souhaits',
'remove-fail' => 'L\'article ne peut pas être supprimé de la liste de souhaits',
'empty' => 'Vous n\'avez aucun article dans votre liste de souhaits',
'select-options' => 'Besoin de sélectionner des options avant d\'ajouter à la liste de souhaits',
'remove-all-success' => 'Tous les articles de votre liste de souhaits ont été supprimés',
],
'reviews' => [
'empty' => 'Vous n\'avez pas encore évalué de produit',
],
'forget_password' => [
'reset_link_sent' => 'Nous avons envoyé par e-mail votre lien de réinitialisation de mot de passe.',
'email_not_exist' => 'Nous ne pouvons pas trouver un utilisateur avec cette adresse e-mail',
],
'admin' => [
'system' => [
'captcha' => [
'title' => 'Captcha',
'credentials' => 'Crédits',
'site-key' => 'Clé du site',
'secret-key' => 'Clef secrète',
'status' => 'Statut',
'validations' => [
'required' => 'Veuillez sélectionner CAPTCHA',
'captcha' => 'Quelque chose s\'est mal passé ! Veuillez réessayer.',
]
],
],
],
];

View File

@ -11,11 +11,30 @@ return [
'select-options' => 'Seleziona una opzione del prodotto prima di aggiungerlo ai Preferiti',
'remove-all-success' => 'Tutti i Prodotti presenti nei preferiti sono stati rimossi',
],
'reviews' => [
'empty' => 'Non hai ancora recensito i nostri prodotti'
],
'forget_password' => [
'reset_link_sent' => 'Ti abbiamo inviato una email per generare una nuova password.'
]
];
'forget_password' => [
'reset_link_sent' => 'Abbiamo inviato un\'e-mail con il link per reimpostare la password.',
'email_not_exist' => "Non riusciamo a trovare un utente con quell'indirizzo e-mail",
],
'admin' => [
'system' => [
'captcha' => [
'title' => 'Captcha',
'credentials' => 'Credenziali',
'site-key' => 'Chiave del sito',
'secret-key' => 'Chiave segreta',
'status' => 'Stato',
'validations' => [
'required' => 'Seleziona CAPTCHA',
'captcha' => 'Qualcosa è andato storto! Per favore riprova.',
]
],
],
],
];

View File

@ -0,0 +1,40 @@
<?php
return [
'wishlist' => [
'success' => 'Artikel succesvol toegevoegd aan verlanglijst',
'failure' => 'Artikel kan niet worden toegevoegd aan verlanglijst',
'already' => 'Artikel al aanwezig in uw verlanglijst',
'removed' => 'Artikel succesvol verwijderd van verlanglijst',
'remove-fail' => 'Artikel kan niet van verlanglijst worden verwijderd',
'empty' => 'U heeft geen items op uw verlanglijst',
'select-options' => 'Moet opties selecteren voordat u aan verlanglijst toevoegt',
'remove-all-success' => 'Alle items van je verlanglijst zijn verwijderd',
],
'reviews' => [
'empty' => 'U heeft nog geen product beoordeeld',
],
'forget_password' => [
'reset_link_sent' => 'We hebben de link voor het opnieuw instellen van uw wachtwoord per e-mail verzonden.',
'email_not_exist' => "We kunnen geen gebruiker met dat e-mailadres vinden",
],
'admin' => [
'system' => [
'captcha' => [
'title' => 'Captcha',
'credentials' => 'Inloggegevens',
'site-key' => 'Sitesleutel',
'secret-key' => 'Geheime sleutel',
'status' => 'Toestand',
'validations' => [
'required' => 'Selecteer CAPTCHA',
'captcha' => 'Er is iets fout gegaan! Probeer het opnieuw.',
]
],
],
],
];

View File

@ -11,7 +11,30 @@ return [
'select-options' => 'Precisa selecionar opções antes de adicionar à lista de desejos',
'remove-all-success' => 'Todos os itens da sua lista de desejos foram removidos',
],
'reviews' => [
'empty' => 'Você não avaliou nenhum produto ainda'
]
];
'empty' => 'Você não avaliou nenhum produto ainda',
],
'forget_password' => [
'reset_link_sent' => 'Enviamos por e-mail o link de redefinição de senha.',
'email_not_exist' => "Não conseguimos encontrar um usuário com esse endereço de e-mail",
],
'admin' => [
'system' => [
'captcha' => [
'title' => 'Captcha',
'credentials' => 'Credenciais',
'site-key' => 'Chave do Site',
'secret-key' => 'Chave secreta',
'status' => 'Status',
'validations' => [
'required' => 'Selecione CAPTCHA',
'captcha' => 'Algo deu errado! Por favor, tente novamente.',
]
],
],
],
];

View File

@ -0,0 +1 @@
<script src="{{ $clientEndPoint }}" async defer></script>

View File

@ -0,0 +1,7 @@
<div {!! $htmlAttributes !!}></div>
@if ($errors->has('g-recaptcha-response'))
<span class="control-error">
{{ $errors->first('g-recaptcha-response') }}
</span>
@endif

View File

@ -1,6 +0,0 @@
<?php
return [
'name' => 'Webkul Bagisto Customer',
'version' => '0.0.1'
];

View File

@ -4,14 +4,20 @@ namespace Webkul\Product\Models;
use Illuminate\Database\Eloquent\Model;
use Webkul\Attribute\Models\AttributeProxy;
use Webkul\Channel\Models\ChannelProxy;
use Webkul\Product\Contracts\ProductAttributeValue as ProductAttributeValueContract;
class ProductAttributeValue extends Model implements ProductAttributeValueContract
{
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = false;
/**
* Attribute type fields.
*
* @var array
*/
public static $attributeTypeFields = [
@ -28,10 +34,14 @@ class ProductAttributeValue extends Model implements ProductAttributeValueContra
'checkbox' => 'text_value',
];
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'product_id',
'attribute_id',
'channel_id',
'locale',
'channel',
'text_value',
@ -58,12 +68,4 @@ class ProductAttributeValue extends Model implements ProductAttributeValueContra
{
return $this->belongsTo(ProductProxy::modelClass());
}
/**
* Get the channel that owns the attribute value.
*/
public function channel()
{
return $this->belongsTo(ChannelProxy::modelClass());
}
}
}

View File

@ -466,17 +466,19 @@ class ProductRepository extends Repository
} else {
$results = app(ProductFlatRepository::class)->scopeQuery(function ($query) use ($term, $channel, $locale) {
$query = $query->distinct()
->addSelect('product_flat.*')
->join('product_flat as variants', 'product_flat.id', '=', DB::raw('COALESCE(' . DB::getTablePrefix() . 'variants.parent_id, ' . DB::getTablePrefix() . 'variants.id)'))
->where('product_flat.channel', $channel)
->where('product_flat.locale', $locale)
->whereNotNull('product_flat.url_key');
if (! core()->getConfigData('catalog.products.homepage.out_of_stock_items')) {
$query = $this->checkOutOfStockItem($query);
}
return $query->distinct()
->addSelect('product_flat.*')
->where('product_flat.status', 1)
return $query->where('product_flat.status', 1)
->where('product_flat.visible_individually', 1)
->where('product_flat.channel', $channel)
->where('product_flat.locale', $locale)
->whereNotNull('product_flat.url_key')
->where(function ($subQuery) use ($term) {
$queries = explode('_', $term);
@ -840,13 +842,14 @@ class ProductRepository extends Repository
}
/**
* Check out of stock items.
* Check out of stock items. This method needed `variants` alias in
* the `product_flat` query.
*
* @param Webkul\Product\Models\ProductFlat
*
* @return Model
*/
public function checkOutOfStockItem($query) {
* @param Webkul\Product\Models\ProductFlat $query
* @return Illuminate\Database\Eloquent\Builder
*/
public function checkOutOfStockItem($query)
{
return $query
->leftJoin('products as ps', 'product_flat.product_id', '=', 'ps.id')
->leftJoin('product_inventories as pv', 'product_flat.product_id', '=', 'pv.product_id')
@ -865,7 +868,6 @@ class ProductRepository extends Repository
->selectRaw('SUM(' . DB::getTablePrefix() . 'product_inventories.qty)')
->from('product_flat')
->leftJoin('product_inventories', 'product_inventories.product_id', '=', 'product_flat.product_id')
->join('product_flat as variants', 'product_flat.id', '=', DB::raw('COALESCE(' . DB::getTablePrefix() . 'variants.parent_id, ' . DB::getTablePrefix() . 'variants.id)'))
->whereRaw(DB::getTablePrefix() . 'product_flat.parent_id = variants.id');
}, '>', 0);
});

View File

@ -289,6 +289,11 @@ class Order extends Model implements OrderContract
if ($this->status === self::STATUS_FRAUD) {
return false;
}
$pendingInvoice = $this->invoices->where('state', 'pending')->first();
if ($pendingInvoice) {
return false;
}
foreach ($this->items as $item) {
if ($item->qty_to_refund > 0 && $item->order->status !== self::STATUS_CLOSED) {
@ -302,4 +307,4 @@ class Order extends Model implements OrderContract
return false;
}
}
}

View File

@ -247,7 +247,7 @@ Route::group(['middleware' => ['web', 'locale', 'theme', 'currency']], function
Route::get('addresses/default/{id}', 'Webkul\Customer\Http\Controllers\AddressController@makeDefault')->name('make.default.address');
//Customer Address Delete
Route::get('addresses/delete/{id}', 'Webkul\Customer\Http\Controllers\AddressController@destroy')->name('address.delete');
Route::delete('addresses/delete/{id}', 'Webkul\Customer\Http\Controllers\AddressController@destroy')->name('address.delete');
/* Wishlist route */
//Customer wishlist(listing)
@ -281,7 +281,7 @@ Route::group(['middleware' => ['web', 'locale', 'theme', 'currency']], function
'view' => 'shop::customers.account.orders.print'
])->name('customer.orders.print');
Route::get('/orders/cancel/{id}', 'Webkul\Shop\Http\Controllers\OrderController@cancel')->name('customer.orders.cancel');
Route::post('/orders/cancel/{id}', 'Webkul\Shop\Http\Controllers\OrderController@cancel')->name('customer.orders.cancel');
/* Reviews route */
//Customer reviews
@ -290,12 +290,12 @@ Route::group(['middleware' => ['web', 'locale', 'theme', 'currency']], function
])->name('customer.reviews.index');
//Customer review delete
Route::get('reviews/delete/{id}', 'Webkul\Shop\Http\Controllers\ReviewController@destroy')->defaults('_config', [
Route::delete('reviews/delete/{id}', 'Webkul\Shop\Http\Controllers\ReviewController@destroy')->defaults('_config', [
'redirect' => 'customer.reviews.index'
])->name('customer.review.delete');
//Customer all review delete
Route::get('reviews/all-delete', 'Webkul\Shop\Http\Controllers\ReviewController@deleteAll')->defaults('_config', [
Route::delete('reviews/all-delete', 'Webkul\Shop\Http\Controllers\ReviewController@deleteAll')->defaults('_config', [
'redirect' => 'customer.reviews.index'
])->name('customer.review.deleteall');
});

View File

@ -391,7 +391,16 @@ return [
'view' => [
'page-tile' => '#:id مراجعة',
]
],
'delete' => [
'confirmation-message' => 'هل أنت متأكد أنك تريد حذف هذه المراجعة؟',
],
'delete-all' => [
'title' => 'حذف الكل',
'confirmation-message' => 'هل أنت متأكد أنك تريد حذف جميع المراجعات؟',
],
]
]
],

View File

@ -388,7 +388,16 @@ return [
'view' => [
'page-tile' => 'Bewertung #:id',
]
],
'delete' => [
'confirmation-message' => 'Möchten Sie diese Bewertung wirklich löschen?',
],
'delete-all' => [
'title' => 'Alles löschen',
'confirmation-message' => 'Möchten Sie wirklich alle Bewertungen löschen?',
],
]
]
],

View File

@ -387,12 +387,22 @@ return [
'review' => [
'index' => [
'title' => 'Reviews',
'page-title' => 'Reviews'
'page-title' => 'Reviews',
],
'view' => [
'page-tile' => 'Review #:id',
]
],
'delete' => [
'confirmation-message' => 'Are you sure you want to delete this review?',
],
'delete-all' => [
'title' => 'Delete All',
'confirmation-message' => 'Are you sure you want to delete all the reviews?',
],
]
]
],

View File

@ -391,7 +391,16 @@ return [
'view' => [
'page-tile' => 'Opinión #:id',
]
],
'delete' => [
'confirmation-message' => '¿Seguro que quieres eliminar esta crítica?',
],
'delete-all' => [
'title' => 'Eliminar todos',
'confirmation-message' => '¿Estás segura de que quieres eliminar todas las críticas?',
],
]
]
],

View File

@ -387,7 +387,16 @@ return [
'view' => [
'page-tile' => '#:id بررسی',
]
],
'delete' => [
'confirmation-message' => 'آیا شما مطمئن هستید که می خواهید این نظر را حذف کنید؟',
],
'delete-all' => [
'title' => 'حذف همه',
'confirmation-message' => 'آیا مطمئن هستید که می خواهید همه بررسی ها را حذف کنید؟',
],
]
]
],

View File

@ -0,0 +1,739 @@
<?php
return [
'invalid_vat_format' => 'L\'identifiant de TVA donné a un format incorrect',
'security-warning' => 'Activité suspecte détectée !!!',
'nothing-to-delete' => 'Rien à supprimer',
'layouts' => [
'my-account' => 'Mon compte',
'profile' => 'Profil',
'address' => 'Adresse',
'reviews' => 'Commentaires',
'wishlist' => 'Liste de souhaits',
'orders' => 'Ordres',
'downloadable-products' => 'Produits téléchargeables',
],
'common' => [
'error' => 'Quelque chose c\'est mal passé. Merci d\'essayer plus tard.',
'image-upload-limit' => 'La taille maximale de téléchargement de l\'image est de 2 Mo',
'no-result-found' => 'Nous n\'avons pu trouver aucun enregistrement.',
],
'home' => [
'page-title' => 'APP_NAME - Accueil',
'featured-products' => 'Produits populaires',
'new-products' => 'Nouveaux produits',
'verify-email' => 'Vérifiez votre compte de messagerie',
'resend-verify-email' => 'Renvoyer l\'e-mail de vérification',
],
'header' => [
'title' => 'Compte',
'dropdown-text' => 'Gérer le panier, les commandes et la liste de souhaits',
'sign-in' => 'S\'identifier',
'sign-up' => 'S\'inscrire',
'account' => 'Compte',
'cart' => 'Chariot',
'profile' => 'Profil',
'wishlist' => 'Liste de souhaits',
'logout' => 'Se déconnecter',
'search-text' => 'Rechercher des produits ici',
],
'minicart' => [
'view-cart' => 'Voir Panier d\'achat',
'checkout' => 'Vérifier',
'cart' => 'Chariot',
'zero' => '0',
],
'footer' => [
'subscribe-newsletter' => 'Abonnez-vous à la newsletter',
'subscribe' => 'S\'abonner',
'locale' => 'Lieu',
'currency' => 'Devise',
],
'subscription' => [
'unsubscribe' => 'Se désinscrire',
'subscribe' => 'S\'abonner',
'subscribed' => 'Vous êtes maintenant abonné aux e-mails d\'abonnement.',
'not-subscribed' => 'Erreur! Le courrier ne peut pas être envoyé actuellement, veuillez réessayer plus tard.',
'already' => 'Vous êtes déjà inscrit à notre liste d\'abonnement.',
'unsubscribed' => 'Vous êtes désabonné des mails d\'abonnement.',
'already-unsub' => 'Vous êtes déjà désabonné.',
],
'search' => [
'no-results' => 'Aucun résultat trouvé',
'page-title' => 'APP_NAME - Rechercher',
'found-results' => 'Résultats de la recherche trouvés',
'found-result' => 'Résultat de la recherche trouvé',
'analysed-keywords' => 'Mots-clés analysés',
'image-search-option' => 'Option de recherche d\'images',
],
'reviews' => [
'title' => 'Titre',
'add-review-page-title' => 'Ajouter un commentaire',
'write-review' => 'Écrire une critique',
'review-title' => 'Donnez un titre à votre avis',
'product-review-page-title' => 'Évaluation du produit',
'rating-reviews' => 'Évaluation et commentaires',
'submit' => 'NOUS FAIRE PARVENIR',
'delete-all' => 'Tous les avis ont été supprimés avec succès',
'ratingreviews' => ':rating Notes & :review Avis',
'star' => 'Star',
'percentage' => ':percentage %',
'id-star' => 'Star',
'name' => 'Nom',
],
'customer' => [
'compare' => [
'text' => 'Comparer',
'compare_similar_items' => 'Comparer des articles similaires',
'add-tooltip' => 'Ajouter un produit à la liste de comparaison',
'added' => 'Article ajouté avec succès à la liste de comparaison',
'already_added' => 'Article déjà ajouté à la liste de comparaison',
'removed' => 'Article supprimé avec succès de la liste de comparaison',
'removed-all' => 'Tous les éléments ont été supprimés avec succès de la liste de comparaison',
'empty-text' => 'Vous n\'avez aucun article dans votre liste de comparaison',
'product_image' => 'Image du produit',
'actions' => 'Actions',
],
'signup-text' => [
'account_exists' => 'Vous avez déjà un compte',
'title' => 'S\'identifier',
],
'signup-form' => [
'page-title' => 'Créer un nouveau compte client',
'title' => 'S\'inscrire',
'firstname' => 'Prénom',
'lastname' => 'Nom de famille',
'email' => 'E-mail',
'password' => 'Mot de passe',
'confirm_pass' => 'Confirmez le mot de passe',
'button_title' => 'S\'inscrire',
'agree' => 'Accepter',
'terms' => 'termes',
'conditions' => 'Conditions',
'using' => 'en utilisant ce site',
'agreement' => 'Accord',
'subscribe-to-newsletter' => 'S\'inscrire à la Newsletter',
'success' => 'Compte créé avec succès.',
'success-verify' => 'Compte créé avec succès, un e-mail a été envoyé pour vérification.',
'success-verify-email-unsent' => 'Compte créé avec succès, mais e-mail de vérification non envoyé.',
'failed' => 'Erreur! Impossible de créer votre compte, veuillez réessayer plus tard.',
'already-verified' => 'Votre compte est déjà vérifié Ou veuillez réessayer d\'envoyer un nouvel e-mail de vérification.',
'verification-not-sent' => 'Erreur! Problème lors de l\'envoi de l\'e-mail de vérification, veuillez réessayer ultérieurement.',
'verification-sent' => 'L\'email de vérification a été envoyé',
'verified' => 'Votre compte a été vérifié, essayez de vous connecter maintenant.',
'verify-failed' => 'Nous ne pouvons pas vérifier votre compte de messagerie.',
'dont-have-account' => 'Vous n\'avez pas de compte chez nous.',
'customer-registration' => 'Client enregistré avec succès',
],
'login-text' => [
'no_account' => 'Ne pas avoir de compte',
'title' => 'S\'inscrire',
],
'login-form' => [
'page-title' => 'Connexion client',
'title' => 'S\'identifier',
'email' => 'E-mail',
'password' => 'Mot de passe',
'forgot_pass' => 'Mot de passe oublié?',
'button_title' => 'S\'identifier',
'remember' => 'Souviens-toi de moi',
'footer' => '© Copyright :year Webkul Software, Tous droits réservés',
'invalid-creds' => 'Veuillez vérifier vos informations d\'identification et réessayer.',
'verify-first' => 'Vérifiez d\'abord votre compte de messagerie.',
'not-activated' => 'Votre activation demande l\'approbation de l\'administrateur',
'resend-verification' => 'Renvoyer à nouveau l\'e-mail de vérification',
],
'forgot-password' => [
'title' => 'Récupérer mot de passe',
'email' => 'E-mail',
'submit' => 'Envoyer un e-mail de réinitialisation du mot de passe',
'page_title' => 'Mot de passe oublié ?',
],
'reset-password' => [
'title' => 'réinitialiser le mot de passe',
'email' => 'Email enregistré',
'password' => 'Mot de passe',
'confirm-password' => 'Confirmez le mot de passe',
'back-link-title' => 'Retour à la connexion',
'submit-btn-title' => 'réinitialiser le mot de passe',
],
'account' => [
'dashboard' => 'Editer le profil',
'menu' => 'Menu',
'general' => [
'no' => 'Non',
'yes' => 'Oui',
],
'profile' => [
'index' => [
'page-title' => 'Profil',
'title' => 'Profil',
'edit' => 'Éditer',
],
'edit-success' => 'Mise à jour du profil réussie.',
'edit-fail' => 'Erreur! Le profil ne peut pas être mis à jour, veuillez réessayer plus tard.',
'unmatch' => 'L\'ancien mot de passe ne correspond pas.',
'fname' => 'Prénom',
'lname' => 'Nom de famille',
'gender' => 'Genre',
'other' => 'Autre',
'male' => 'Homme',
'female' => 'Femelle',
'dob' => 'Date de naissance',
'phone' => 'Téléphoner',
'email' => 'E-mail',
'opassword' => 'ancien mot de passe',
'password' => 'Mot de passe',
'cpassword' => 'Confirmez le mot de passe',
'submit' => 'Mettre à jour le profil',
'edit-profile' => [
'title' => 'Editer le profil',
'page-title' => 'Editer le profil',
],
],
'address' => [
'index' => [
'page-title' => 'Adresse',
'title' => 'Adresse',
'add' => 'Ajoutez l\'adresse',
'edit' => 'Éditer',
'empty' => 'Vous n\'avez aucune adresse enregistrée ici, veuillez essayer de la créer en cliquant sur le bouton Ajouter.',
'create' => 'Créer une adresse',
'delete' => 'Effacer',
'make-default' => 'Faire défaut',
'default' => 'Défaut',
'contact' => 'Contacter',
'confirm-delete' => 'Voulez-vous vraiment supprimer cette adresse ?',
'default-delete' => 'L\'adresse par défaut ne peut pas être modifiée.',
'enter-password' => 'Tapez votre mot de passe.',
],
'create' => [
'page-title' => 'Ajoutez l\'adresse',
'company_name' => 'Nom de la compagnie',
'first_name' => 'Prénom',
'last_name' => 'Nom de famille',
'vat_id' => 'Identifiant de TVA',
'vat_help_note' => '[Remarque : Utilisez le code de pays avec l\'identifiant de TVA. Par exemple. INV01234567891]',
'title' => 'Ajoutez l\'adresse',
'street-address' => 'Adresse de rue',
'country' => 'Pays',
'state' => 'État',
'select-state' => 'Sélectionnez une région, un état ou une province',
'city' => 'Ville',
'postcode' => 'code postal',
'phone' => 'Téléphoner',
'submit' => 'Enregistrer l\'adresse',
'success' => 'L\'adresse a été ajoutée avec succès.',
'error' => 'L\'adresse ne peut pas être ajoutée.',
],
'edit' => [
'page-title' => 'Modifier l\'adresse',
'company_name' => 'Nom de la compagnie',
'first_name' => 'Prénom',
'last_name' => 'Nom de famille',
'vat_id' => 'Identifiant de TVA',
'title' => 'Modifier l\'adresse',
'street-address' => 'Adresse de rue',
'submit' => 'Enregistrer l\'adresse',
'success' => 'Adresse mise à jour avec succès.',
],
'delete' => [
'success' => 'Adresse supprimée avec succès',
'failure' => 'L\'adresse ne peut pas être supprimée',
'wrong-password' => 'Mauvais mot de passe !',
],
'default-address' => 'Adresse par défaut',
],
'order' => [
'index' => [
'page-title' => 'Ordres',
'title' => 'Ordres',
'order_id' => 'numéro de commande',
'date' => 'Date',
'status' => 'Statut',
'total' => 'Le total',
'order_number' => 'Numéro de commande',
'processing' => 'Traitement',
'completed' => 'Complété',
'canceled' => 'Annulé',
'closed' => 'Fermé',
'pending' => 'En attente',
'pending-payment' => 'En attente de paiement',
'fraud' => 'Fraude',
],
'view' => [
'page-tile' => 'N° de commande :order_id',
'info' => 'Informations',
'placed-on' => 'Placé sur',
'products-ordered' => 'Produits commandés',
'invoices' => 'Factures',
'shipments' => 'Expéditions',
'SKU' => 'UGS',
'product-name' => 'Nom',
'qty' => 'Qté',
'item-status' => 'Statut de l\'article',
'item-ordered' => 'Commandé (:qty_ordered]',
'item-invoice' => 'Facturé (:qty_invoiced]',
'item-shipped' => 'expédié (:qty_shipped]',
'item-canceled' => 'Annulé (:qty_cancelled]',
'item-refunded' => 'Remboursé (:qty_refunded]',
'price' => 'Prix',
'total' => 'Le total',
'subtotal' => 'Total',
'shipping-handling' => 'Expédition et manutention',
'tax' => 'Impôt',
'discount' => 'Rabais',
'tax-percent' => 'Pourcentage d\'impôt',
'tax-amount' => 'Montant de la taxe',
'discount-amount' => 'Montant de la remise',
'grand-total' => 'Total',
'total-paid' => 'Total payé',
'total-refunded' => 'Total remboursé',
'total-due' => 'Total dû',
'shipping-address' => 'adresse de livraison',
'billing-address' => 'adresse de facturation',
'shipping-method' => 'Mode de livraison',
'payment-method' => 'Mode de paiement',
'individual-invoice' => 'Facture # :invoice_id',
'individual-shipment' => 'N° d\'expédition :shipment_id',
'print' => 'Imprimer',
'invoice-id' => 'Identifiant de la facture',
'order-id' => 'Numéro de commande',
'order-date' => 'Date de commande',
'invoice-date' => 'Date de la facture',
'payment-terms' => 'Modalités de paiement',
'bill-to' => 'facturer',
'ship-to' => 'Envoyez à',
'contact' => 'Contacter',
'refunds' => 'Remboursements',
'individual-refund' => 'Remboursement #:refund_id',
'adjustment-refund' => 'Ajustement Remboursement',
'adjustment-fee' => 'Frais d\'ajustement',
'cancel-btn-title' => 'Annuler',
'tracking-number' => 'Numéro de suivi',
'cancel-confirm-msg' => 'Êtes-vous sûr de vouloir annuler cette commande ?',
],
],
'wishlist' => [
'page-title' => 'Liste de souhaits',
'title' => 'Liste de souhaits',
'deleteall' => 'Tout supprimer',
'moveall' => 'Déplacer tous les produits vers le panier',
'move-to-cart' => 'Passer au panier',
'error' => 'Impossible d\'ajouter le produit à la liste de souhaits en raison de problèmes inconnus, veuillez vérifier plus tard',
'add' => 'Article ajouté avec succès à la liste de souhaits',
'remove' => 'Article supprimé avec succès de la liste de souhaits',
'add-wishlist-text' => 'Ajouter un produit à la liste de souhaits',
'remove-wishlist-text' => 'Supprimer le produit de la liste de souhaits',
'moved' => 'Article déplacé avec succès Vers le panier',
'option-missing' => 'Les options du produit sont manquantes, l\'article ne peut donc pas être déplacé vers la liste de souhaits.',
'move-error' => 'L\'article ne peut pas être déplacé vers la liste de souhaits, veuillez réessayer plus tard',
'success' => 'Article ajouté avec succès à la liste de souhaits',
'failure' => 'L\'article ne peut pas être ajouté à la liste de souhaits, veuillez réessayer plus tard',
'already' => 'Article déjà présent dans votre wishlist',
'removed' => 'Article supprimé avec succès de la liste de souhaits',
'remove-fail' => 'L\'article ne peut pas être supprimé de la liste de souhaits, veuillez réessayer plus tard',
'empty' => 'Vous n\'avez aucun article dans votre liste de souhaits',
'remove-all-success' => 'Tous les articles de votre liste de souhaits ont été supprimés',
],
'downloadable_products' => [
'title' => 'Produits téléchargeables',
'order-id' => 'Numéro de commande',
'date' => 'Date',
'name' => 'Titre',
'status' => 'Statut',
'pending' => 'En attente',
'available' => 'Disponible',
'expired' => 'Expiré',
'remaining-downloads' => 'Téléchargements restants',
'unlimited' => 'Illimité',
'download-error' => 'Le lien de téléchargement a expiré.',
'payment-error' => 'Le paiement n\'a pas été effectué pour ce téléchargement.',
],
'review' => [
'index' => [
'title' => 'Commentaires',
'page-title' => 'Commentaires',
],
'view' => [
'page-tile' => 'Avis n° :id',
],
'delete' => [
'confirmation-message' => 'Êtes-vous sûr de vouloir supprimer cet avis ?',
],
'delete-all' => [
'title' => 'Tout supprimer',
'confirmation-message' => 'Êtes-vous sûr de vouloir supprimer tous les avis ?',
],
],
],
],
'products' => [
'layered-nav-title' => 'Magasiner par',
'price-label' => 'Aussi bas que',
'remove-filter-link-title' => 'Tout effacer',
'filter-to' => 'à',
'sort-by' => 'Trier par',
'from-a-z' => 'De A à Z',
'from-z-a' => 'De Z-A',
'newest-first' => 'Le plus récent d\'abord',
'oldest-first' => 'Le plus vieux d\'abord',
'cheapest-first' => 'Le moins cher d\'abord',
'expensive-first' => 'Cher d\'abord',
'show' => 'Spectacle',
'pager-info' => 'Affichage :showing de :total Articles',
'description' => 'La description',
'specification' => 'spécification',
'total-reviews' => ':total des avis',
'total-rating' => ':total_rating Notes & :total_reviews Avis',
'by' => 'De :name',
'up-sell-title' => 'Nous avons trouvé d\'autres produits qui pourraient vous plaire !',
'related-product-title' => 'Produits connexes',
'cross-sell-title' => 'Plus de choix',
'reviews-title' => 'Évaluations et commentaires',
'write-review-btn' => 'Ecrire une critique',
'choose-option' => 'Choisis une option',
'sale' => 'Vente',
'new' => 'Nouveau',
'empty' => 'Aucun produit disponible dans cette catégorie',
'add-to-cart' => 'Ajouter au panier',
'book-now' => 'Reserve maintenant',
'buy-now' => 'Acheter maintenant',
'whoops' => 'Oups !',
'quantity' => 'Quantité',
'in-stock' => 'En stock',
'out-of-stock' => 'En rupture de stock',
'view-all' => 'Voir tout',
'select-above-options' => 'Veuillez d\'abord sélectionner les options ci-dessus.',
'less-quantity' => 'La quantité ne peut pas être inférieure à un.',
'samples' => 'Échantillons',
'links' => 'Liens',
'sample' => 'Goûter',
'name' => 'Nom',
'qty' => 'Qté',
'starting-at' => 'À partir de',
'customize-options' => 'Personnaliser les options',
'choose-selection' => 'Choisissez une sélection',
'your-customization' => 'Votre personnalisation',
'total-amount' => 'Montant total',
'none' => 'Rien',
'available-for-order' => 'Disponible à la commande',
'settings' => 'Paramètres',
'compare_options' => 'Comparer les options',
'wishlist-options' => 'Options de liste de souhaits',
'offers' => 'Achetez :qty pour :price chacun et économisez :discount%',
'tax-inclusive' => 'Toutes taxes comprises',
],
'buynow' => [
'no-options' => 'Veuillez sélectionner des options avant d\'acheter ce produit.',
],
'checkout' => [
'cart' => [
'integrity' => [
'missing_fields' => 'Certains champs obligatoires sont manquants pour ce produit.',
'missing_options' => 'Il manque des options pour ce produit.',
'missing_links' => 'Il manque des liens téléchargeables pour ce produit.',
'qty_missing' => 'Au moins un produit doit avoir plus d\'une quantité.',
'qty_impossible' => 'Impossible d\'ajouter plus d\'un de ces produits au panier.',
],
'create-error' => 'J\'ai rencontré un problème lors de la création d\'une instance de panier.',
'title' => 'Panier',
'empty' => 'Votre panier est vide',
'update-cart' => 'Mise à jour panier',
'continue-shopping' => 'Continuer vos achats',
'proceed-to-checkout' => 'Passer à la caisse',
'remove' => 'Supprimer',
'remove-link' => 'Supprimer',
'move-to-wishlist' => 'Placer dans la liste de souhaits',
'move-to-wishlist-success' => 'L\'article a été déplacé vers la liste de souhaits avec succès.',
'move-to-wishlist-error' => 'Impossible de déplacer l\'élément vers la liste de souhaits, veuillez réessayer plus tard.',
'add-config-warning' => 'Veuillez sélectionner l\'option avant d\'ajouter au panier.',
'quantity' => [
'quantity' => 'Quantité',
'success' => 'Article(s) du panier mis à jour avec succès.',
'illegal' => 'La quantité ne peut pas être inférieure à un.',
'inventory_warning' => 'La quantité demandée n\'est pas disponible, veuillez réessayer plus tard.',
'error' => 'Impossible de mettre à jour le ou les éléments pour le moment, veuillez réessayer plus tard.',
],
'item' => [
'error_remove' => 'Aucun article à retirer du panier.',
'success' => 'L\'article a été ajouté au panier avec succès.',
'success-remove' => 'L\'article a été supprimé avec succès du panier.',
'error-add' => 'L\'article ne peut pas être ajouté au panier, veuillez réessayer plus tard.',
'inactive' => 'Un article est inactif et a été supprimé du panier.',
'inactive-add' => 'L\'article inactif ne peut pas être ajouté au panier.',
],
'quantity-error' => 'La quantité demandée n\'est pas disponible.',
'cart-subtotal' => 'Sous-total du panier',
'cart-remove-action' => 'Veux-tu vraiment faire ça ?',
'partial-cart-update' => 'Seuls certains produits ont été mis à jour',
'link-missing' => ' ',
'event' => [
'expired' => 'Cet événement a expiré.',
],
'minimum-order-message' => 'Le montant minimum de commande est de :amount',
],
'onepage' => [
'title' => 'Vérifier',
'information' => 'Informations',
'shipping' => 'Expédition',
'payment' => 'Paiement',
'complete' => 'Compléter',
'review' => 'Revoir',
'billing-address' => 'adresse de facturation',
'sign-in' => 'S\'identifier',
'company-name' => 'Nom de la compagnie',
'first-name' => 'Prénom',
'last-name' => 'Nom de famille',
'email' => 'E-mail',
'address1' => 'Adresse de rue',
'city' => 'Ville',
'state' => 'État',
'select-state' => 'Sélectionnez une région, un état ou une province',
'postcode' => 'Code postal/Zip',
'phone' => 'Téléphone',
'country' => 'Pays',
'order-summary' => 'Récapitulatif de la commande',
'shipping-address' => 'adresse de livraison',
'use_for_shipping' => 'Envoyer à cette adresse',
'continue' => 'Continuer',
'shipping-method' => 'Sélectionnez le mode de livraison',
'payment-methods' => 'Sélectionnez le mode de paiement',
'payment-method' => 'Mode de paiement',
'summary' => 'Récapitulatif de la commande',
'price' => 'Prix',
'quantity' => 'Quantité',
'contact' => 'Contacter',
'place-order' => 'Passer la commande',
'new-address' => 'Ajouter une nouvelle adresse',
'save_as_address' => 'Enregistrer cette adresse',
'apply-coupon' => 'Appliquer Coupon',
'amt-payable' => 'Montant payable',
'got' => 'A obtenu',
'free' => 'Libérer',
'coupon-used' => 'Coupon utilisé',
'applied' => 'Appliqué',
'back' => 'Dos',
'cash-desc' => 'Paiement à la livraison',
'money-desc' => 'Transfert d\'argent',
'paypal-desc' => 'Norme Paypal',
'free-desc' => 'Ceci est une livraison gratuite',
'flat-desc' => 'Il s\'agit d\'un forfait',
'password' => 'Mot de passe',
'login-exist-message' => 'Vous avez déjà un compte chez nous, connectez-vous ou continuez en tant qu\'invité.',
'enter-coupon-code' => 'Entrer le code promotionnel',
],
'total' => [
'order-summary' => 'Récapitulatif de la commande',
'sub-total' => 'Articles',
'grand-total' => 'Total',
'delivery-charges' => 'Frais de livraison',
'tax' => 'Impôt',
'discount' => 'Rabais',
'price' => 'le prix',
'disc-amount' => 'Montant escompté',
'new-grand-total' => 'Nouveau total général',
'coupon' => 'Coupon',
'coupon-applied' => 'Coupon appliqué',
'remove-coupon' => 'Supprimer le coupon',
'cannot-apply-coupon' => 'Impossible d\'appliquer le coupon',
'invalid-coupon' => 'Le code promo n\'est pas valide.',
'success-coupon' => 'Code promo appliqué avec succès.',
'coupon-apply-issue' => 'Le code promo ne peut pas être appliqué.',
],
'success' => [
'title' => 'Commande passée avec succès',
'thanks' => 'Nous vous remercions de votre commande!',
'order-id-info' => 'Votre identifiant de commande est #:order_id',
'info' => 'Nous vous enverrons un e-mail, les détails de votre commande et les informations de suivi',
],
],
'mail' => [
'order' => [
'subject' => 'Confirmation de nouvelle commande',
'heading' => 'Confirmation de commande!',
'dear' => 'Cher :customer_name',
'dear-admin' => 'Cher :admin_name',
'greeting' => 'Merci pour votre commande :order_id passée sur :created_at',
'greeting-admin' => 'Id de commande :order_id placé sur :created_at',
'summary' => 'Résumé de la commande',
'shipping-address' => 'adresse de livraison',
'billing-address' => 'adresse de facturation',
'contact' => 'Contacter',
'shipping' => 'Mode de livraison',
'payment' => 'Mode de paiement',
'price' => 'Prix',
'quantity' => 'Quantité',
'subtotal' => 'Total',
'shipping-handling' => 'Expédition et manutention',
'tax' => 'Impôt',
'discount' => 'Rabais',
'grand-total' => 'Total',
'final-summary' => 'Merci d\'avoir montré votre intérêt pour notre magasin, nous vous enverrons un numéro de suivi une fois expédié',
'help' => 'Si vous avez besoin d\'aide, veuillez nous contacter à l\'adresse :support_email',
'thanks' => 'Merci!',
'comment' => [
'subject' => 'Nouveau commentaire ajouté à votre commande #:order_id',
'dear' => 'Cher :customer_name',
'final-summary' => 'Merci de montrer votre intérêt pour notre magasin',
'help' => 'Si vous avez besoin d\'aide, veuillez nous contacter à l\'adresse :support_email',
'thanks' => 'Merci!',
],
'cancel' => [
'subject' => 'Confirmation d\'annulation de commande',
'heading' => 'Commande annulée',
'dear' => 'Cher :customer_name',
'greeting' => 'Votre commande avec l\'identifiant de commande :order_id passée sur :created_at a été annulée',
'summary' => 'Résumé de la commande',
'shipping-address' => 'adresse de livraison',
'billing-address' => 'adresse de facturation',
'contact' => 'Contacter',
'shipping' => 'Mode de livraison',
'payment' => 'Mode de paiement',
'subtotal' => 'Total',
'shipping-handling' => 'Expédition et manutention',
'tax' => 'Impôt',
'discount' => 'Rabais',
'grand-total' => 'Total',
'final-summary' => 'Merci de montrer votre intérêt pour notre magasin',
'help' => 'Si vous avez besoin d\'aide, veuillez nous contacter à l\'adresse :support_email',
'thanks' => 'Merci!',
],
],
'invoice' => [
'heading' => 'Votre facture #:invoice_id pour la commande #:order_id',
'subject' => 'Facture de votre commande n° :order_id',
'summary' => 'Résumé de la facture',
],
'shipment' => [
'heading' => 'L\'envoi #:shipment_id a été généré pour la commande #:order_id',
'inventory-heading' => 'Un nouvel envoi #:shipment_id a été généré pour la commande #:order_id',
'subject' => 'Expédition pour votre commande #:order_id',
'inventory-subject' => 'Un nouvel envoi a été généré pour la commande n° :order_id',
'summary' => 'Résumé de l\'expédition',
'carrier' => 'Transporteur',
'tracking-number' => 'Numéro de suivi',
'greeting' => 'Une commande :order_id a été passée sur :created_at',
],
'refund' => [
'heading' => 'Votre numéro de remboursement :refund_id pour la commande #:order_id',
'subject' => 'Remboursement de votre commande #:order_id',
'summary' => 'Résumé du remboursement',
'adjustment-refund' => 'Ajustement Remboursement',
'adjustment-fee' => 'Frais d\'ajustement',
],
'forget-password' => [
'subject' => 'Mot de passe de réinitialisation du client',
'dear' => 'Cher :name',
'info' => 'Vous recevez cet e-mail car nous avons reçu une demande de réinitialisation de mot de passe pour votre compte',
'reset-password' => 'réinitialiser le mot de passe',
'final-summary' => 'Si vous n\'avez pas demandé de réinitialisation de mot de passe, aucune autre action n\'est requise',
'thanks' => 'Merci!',
],
'update-password' => [
'subject' => 'Mot de passe mis à jour',
'dear' => 'Cher :name',
'info' => 'Vous recevez cet e-mail car vous avez mis à jour votre mot de passe.',
'thanks' => 'Merci!',
],
'customer' => [
'new' => [
'dear' => 'Cher :customer_name',
'username-email' => 'Nom d\'utilisateur/Email',
'subject' => 'Enregistrement d\'un nouveau client',
'password' => 'Mot de passe',
'summary' => 'Votre compte a été créé. Les détails de votre compte sont ci-dessous :',
'thanks' => 'Merci!',
],
'registration' => [
'subject' => 'Enregistrement d\'un nouveau client',
'customer-registration' => 'Enregistrement d\'un nouveau client',
'dear' => 'Cher :customer_name',
'greeting' => 'Bienvenue et merci de vous être inscrit chez nous !',
'summary' => 'Votre compte a maintenant été créé avec succès et vous pouvez vous connecter en utilisant votre adresse e-mail et votre mot de passe. Une fois connecté, vous pourrez accéder à d\'autres services, notamment consulter les commandes passées, les listes de souhaits et modifier les informations de votre compte.',
'thanks' => 'Merci!',
],
'verification' => [
'heading' => 'APP_NAME - Vérification des e-mails',
'subject' => 'Courrier de vérification',
'verify' => 'Vérifiez votre compte',
'summary' => 'Ceci est l\'e-mail pour vérifier que l\'adresse e-mail que vous avez saisie est la vôtre.',
],
'subscription' => [
'subject' => 'Courriel d\'abonnement',
'greeting' => 'Bienvenue dans APP_NAME - Abonnement par e-mail',
'unsubscribe' => 'Se désabonner',
'summary' => 'Merci de m\'avoir mis dans votre boîte de réception. Cela fait un moment que vous n\'avez pas lu l\'e-mail APP_NAME, et nous ne voulons pas surcharger votre boîte de réception. Si vous ne souhaitez toujours pas recevoir',
],
],
],
'webkul' => [
'copy-right' => '© Copyright :year Webkul Software, Tous droits réservés',
],
'response' => [
'create-success' => ':name créé avec succès.',
'update-success' => ':name mis à jour avec succès.',
'delete-success' => ':name supprimé avec succès.',
'submit-success' => ':name soumis avec succès.'
],
];

View File

@ -389,7 +389,16 @@ return [
'view' => [
'page-tile' => 'Recensione #:id',
]
],
'delete' => [
'confirmation-message' => 'Sei sicuro di voler eliminare questa recensione?',
],
'delete-all' => [
'title' => 'Cancella tutto',
'confirmation-message' => 'Sei sicuro di voler eliminare tutte le recensioni?',
],
]
]
],

View File

@ -369,7 +369,16 @@ return [
'view' => [
'page-tile' => 'レビュー #:id',
]
],
'delete' => [
'confirmation-message' => 'このレビューを削除してもよろしいですか?',
],
'delete-all' => [
'title' => 'すべて削除',
'confirmation-message' => 'すべてのレビューを削除してもよろしいですか?',
],
]
]
],

View File

@ -395,7 +395,16 @@ return [
'view' => [
'page-tile' => 'Recensies #:id',
]
],
'delete' => [
'confirmation-message' => 'Weet je zeker dat je deze recensie wilt verwijderen?',
],
'delete-all' => [
'title' => 'Verwijder alles',
'confirmation-message' => 'Weet u zeker dat u alle beoordelingen wilt verwijderen?',
],
]
]
],

View File

@ -389,7 +389,16 @@ return [
'view' => [
'page-tile' => 'Recenzja #:id',
]
],
'delete' => [
'confirmation-message' => 'Czy na pewno chcesz usunąć tę recenzję?',
],
'delete-all' => [
'title' => 'Usuń wszystko',
'confirmation-message' => 'Czy na pewno chcesz usunąć wszystkie opinie?',
],
]
]
],

View File

@ -383,7 +383,16 @@ return [
'view' => [
'page-tile' => 'Avaliação #:id',
]
],
'delete' => [
'confirmation-message' => 'Tem certeza de que deseja excluir este comentário?',
],
'delete-all' => [
'title' => 'Apagar tudo',
'confirmation-message' => 'Tem certeza de que deseja excluir todos os comentários?',
],
]
]
],

View File

@ -388,7 +388,16 @@ return [
'view' => [
'page-tile' => 'İnceleme #:id',
]
],
'delete' => [
'confirmation-message' => 'Bu incelemeyi silmek istediğinizden emin misiniz?',
],
'delete-all' => [
'title' => 'Hepsini sil',
'confirmation-message' => 'Tüm yorumları silmek istediğinizden emin misiniz?',
],
]
]
],

View File

@ -77,18 +77,22 @@
</ul>
<div class="control-links mt-20">
<span>
<a href="{{ route('customer.address.edit', $address->id) }}">
{{ __('shop::app.customer.account.address.index.edit') }}
</a>
</span>
<span>
<a href="{{ route('customer.address.edit', $address->id) }}">
{{ __('shop::app.customer.account.address.index.edit') }}
</a>
</span>
<span>
<a href="{{ route('address.delete', $address->id) }}"
onclick="deleteAddress('{{ __('shop::app.customer.account.address.index.confirm-delete') }}')">
{{ __('shop::app.customer.account.address.index.delete') }}
</a>
</span>
<a href="javascript:void(0);" onclick="deleteAddress('{{ __('shop::app.customer.account.address.index.confirm-delete') }}')">
{{ __('shop::app.customer.account.address.index.delete') }}
</a>
<form id="deleteAddressForm" action="{{ route('address.delete', $address->id) }}" method="post">
@method('delete')
@csrf
</form>
</span>
</div>
</div>
</div>
@ -105,8 +109,11 @@
@push('scripts')
<script>
function deleteAddress(message) {
if (!confirm(message))
event.preventDefault();
if (! confirm(message)) {
return;
}
$('#deleteAddressForm').submit();
}
</script>
@endpush

View File

@ -21,7 +21,11 @@
@if ($order->canCancel())
<a href="{{ route('customer.orders.cancel', $order->id) }}" class="btn btn-lg btn-primary" v-alert:message="'{{ __('shop::app.customer.account.order.view.cancel-confirm-msg') }}'" style="float: right;">
<form id="cancelOrderForm" action="{{ route('customer.orders.cancel', $order->id) }}" method="post">
@csrf
</form>
<a href="javascript:void(0);" class="btn btn-lg btn-primary" onclick="cancelOrder('{{ __('shop::app.customer.account.order.view.cancel-confirm-msg') }}')" style="float: right;">
{{ __('shop::app.customer.account.order.view.cancel-btn-title') }}
</a>
@endif
@ -560,3 +564,15 @@
</div>
@endsection
@push('scripts')
<script>
function cancelOrder(message) {
if (! confirm(message)) {
return;
}
$('#cancelOrderForm').submit();
}
</script>
@endpush

View File

@ -17,7 +17,14 @@
@if (count($reviews) > 1)
<div class="account-action">
<a href="{{ route('customer.review.deleteall') }}">{{ __('shop::app.customer.account.wishlist.deleteall') }}</a>
<form id="deleteAllReviewForm" action="{{ route('customer.review.deleteall') }}" method="post">
@method('delete')
@csrf
</form>
<a href="javascript:void(0);" onclick="confirm('{{ __('shop::app.customer.account.review.delete-all.confirmation-message') }}') ? document.getElementById('deleteAllReviewForm').submit() : null;">
{{ __('shop::app.customer.account.review.delete-all.title') }}
</a>
</div>
@endif
@ -57,9 +64,17 @@
</div>
<div class="operations">
<a class="mb-50" href="{{ route('customer.review.delete', $review->id) }}"><span class="icon trash-icon"></span></a>
<form id="deleteReviewForm" action="{{ route('customer.review.delete', $review->id) }}" method="post">
@method('delete')
@csrf
</form>
<a class="mb-50" href="javascript:void(0);" onclick="confirm('{{ __('shop::app.customer.account.review.delete.confirmation-message') }}') ? document.getElementById('deleteReviewForm').submit() : null;">
<span class="icon trash-icon"></span>
</a>
</div>
</div>
<div class="horizontal-rule mb-10 mt-10"></div>
@endforeach
@ -77,4 +92,4 @@
{!! view_render_event('bagisto.shop.customers.account.reviews.list.after', ['reviews' => $reviews]) !!}
</div>
</div>
@endsection
@endsection

View File

@ -5,7 +5,6 @@
@endsection
@section('content-wrapper')
<div class="auth-content">
<div class="sign-up-text">
{{ __('shop::app.customer.login-text.no_account') }} - <a href="{{ route('customer.register.index') }}">{{ __('shop::app.customer.login-text.title') }}</a>
@ -14,7 +13,9 @@
{!! view_render_event('bagisto.shop.customers.login.before') !!}
<form method="POST" action="{{ route('customer.session.create') }}" @submit.prevent="onSubmit">
{{ csrf_field() }}
<div class="login-form">
<div class="login-text">{{ __('shop::app.customer.login-form.title') }}</div>
@ -32,8 +33,6 @@
<span class="control-error" v-if="errors.has('password')">@{{ errors.first('password') }}</span>
</div>
{!! view_render_event('bagisto.shop.customers.login_form_controls.after') !!}
<div class="forgot-password-link">
<a href="{{ route('customer.forgot-password.create') }}">{{ __('shop::app.customer.login-form.forgot_pass') }}</a>
@ -46,12 +45,25 @@
</div>
</div>
<div class="control-group">
{!! Captcha::render() !!}
</div>
{!! view_render_event('bagisto.shop.customers.login_form_controls.after') !!}
<input class="btn btn-primary btn-lg" type="submit" value="{{ __('shop::app.customer.login-form.button_title') }}">
</div>
</form>
{!! view_render_event('bagisto.shop.customers.login.after') !!}
</div>
@stop
@push('scripts')
{!! Captcha::renderJS() !!}
@endpush

View File

@ -59,6 +59,8 @@
<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.password_confirmation.after') !!}
{{-- <div class="signup-confirm" :class="[errors.has('agreement') ? 'has-error' : '']">
<span class="checkbox">
<input type="checkbox" id="checkbox2" name="agreement" v-validate="'required'">
@ -76,6 +78,12 @@
Checkbox Value 1
</span> --}}
<div class="control-group">
{!! Captcha::render() !!}
</div>
@if (core()->getConfigData('customer.settings.newsletter.subscription'))
<div class="control-group">
<input type="checkbox" id="checkbox2" name="is_subscribed">
@ -95,3 +103,9 @@
{!! view_render_event('bagisto.shop.customers.signup.after') !!}
</div>
@endsection
@push('scripts')
{!! Captcha::renderJS() !!}
@endpush

View File

@ -106,6 +106,11 @@
<span v-else class="fs16">__</span>
@break;
@case('multiselect')
<span v-if="product.product['{{ $attribute['code'] }}']" v-html="getAttributeOptions(product['{{ $attribute['code'] }}'] ? product : product.product['{{ $attribute['code'] }}'] ? product.product : null, '{{ $attribute['code'] }}', 'multiple')" class="fs16"></span>
<span v-else class="fs16">__</span>
@break
@case ('file')
@case ('image')
<a :href="`${baseUrl}/${product.url_key}`" class="unset">

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
{
"/js/velocity.js": "/js/velocity.js?id=1c12a991b9a3d04715bd",
"/css/velocity-admin.css": "/css/velocity-admin.css?id=4322502d80a0e4a0affd",
"/css/velocity.css": "/css/velocity.css?id=538a341507dd6592ac27"
"/css/velocity.css": "/css/velocity.css?id=1128e04b7f7920dfa37a"
}

View File

@ -235,6 +235,17 @@
border: none !important;
margin: 0 5px 10px 10px;
.category-product-image-container {
margin: 0 auto;
height: 190px;
position: relative;
img {
max-width: 100%;
max-height: 100%;
}
}
.product-image-container {
max-height: 190px;
position: relative;
@ -354,7 +365,7 @@
display: block;
}
.product-image-container {
.category-product-image-container, .product-image-container {
overflow: hidden;
img {

View File

@ -12,7 +12,7 @@ return [
],
'settings' => [
'channels'=> [
'channels' => [
'subscription_bar' => 'Subscription bar content'
],
],
@ -311,6 +311,4 @@ return [
'greeting' => 'Welcome, :customer !',
]
],
]
?>
];

View File

@ -0,0 +1,334 @@
<?php
return [
'admin' => [
'system' => [
'velocity' => [
'general' => 'Général',
'category' => 'Catégorie',
'settings' => 'Paramètres',
'extension_name' => 'Thème de la vitesse',
'error-module-inactive' => 'Avertissement : L\'état du thème Velocity est inactif',
],
'settings' => [
'channels' => [
'subscription_bar' => 'Contenu de la barre d\'abonnement',
],
],
'general' => [
'status' => 'Statut',
'active' => 'actif',
'inactive' => 'Inactif',
],
'category' => [
'all' => 'Tout',
'left' => 'La gauche',
'right' => 'Droite',
'active' => 'actif',
'custom' => 'Personnalisé',
'inactive' => 'Inactif',
'image-alignment' => 'Alignement des images',
'icon-status' => 'Statut de l\'icône de catégorie',
'image-status' => 'Statut de l\'image de la catégorie',
'sub-category-show' => 'Afficher la sous-catégorie',
'image-height' => 'Hauteur de l\'image [en pixels]',
'image-width' => 'Largeur de l\'image [en pixels]',
'show-tooltip' => 'Afficher l\'info-bulle de la catégorie',
'num-sub-category' => 'Nombre de sous-catégorie',
],
],
'layouts' => [
'velocity' => 'Rapidité',
'cms-pages' => 'Pages CMS',
'meta-data' => 'Métadonnées',
'category-menu' => 'Menu Catégorie',
'header-content' => 'Contenu de l\'en-tête',
],
'contents' => [
'self' => 'Soi',
'active' => 'actif',
'new-tab' => 'Nouvel onglet',
'inactive' => 'Inactif',
'title' => 'Liste de contenu',
'select' => '-- Sélectionnez --',
'add-title' => 'Ajouter du contenu',
'btn-add-content' => 'Ajouter du contenu',
'save-btn-title' => 'Enregistrer le contenu',
'autocomplete' => '[Saisie automatique]',
'no-result-found' => 'Aucun Enregistrement Trouvé.',
'search-hint' => 'Rechercher un produit ici...',
'mass-delete-success' => 'Contenu sélectionné supprimé avec succès.',
'tab' => [
'page' => 'Paramétrage des pages',
'content' => 'Réglage du contenu',
'meta_content' => 'Métadonnées',
],
'page' => [
'title' => 'Titre',
'status' => 'Statut',
'position' => 'Positionner',
],
'content' => [
'content-type' => 'Type de contenu',
'custom-title' => 'Titre personnalisé',
'category-slug' => 'Catégorie Limace',
'link-target' => 'Cible du lien de page',
'custom-product' => 'Magasiner les produits',
'custom-heading' => 'En-tête personnalisé',
'catalog-type' => 'Type de catalogue de produits',
'static-description' => 'Description du contenu',
'page-link' => 'Lien de page [par ex. http://exemple.com/../../]',
],
'datagrid' => [
'id' => 'Identifiant',
'title' => 'Titre',
'status' => 'Statut',
'position' => 'Positionner',
'content-type' => 'Type de contenu',
],
],
'meta-data' => [
'footer' => 'Bas de page',
'title' => 'Métadonnées de vitesse',
'activate-slider' => 'Activer le curseur',
'home-page-content' => 'Contenu de la page d\'accueil',
'footer-left-content' => 'Contenu du pied de page gauche',
'subscription-content' => 'Barre d\'abonnement Contenu',
'sidebar-categories' => 'Catégories de la barre latérale',
'header_content_count' => 'Nombre de contenus d\'en-tête',
'footer-left-raw-content' => '<p>Nous aimons créer des logiciels et résoudre les problèmes du monde réel avec les binaires. Nous sommes très attachés à nos objectifs. Nous investissons nos ressources pour créer des logiciels et des applications faciles à utiliser et de classe mondiale pour les entreprises avec une expertise technologique de pointe et de pointe.</p>',
'slider-path' => 'Chemin du curseur',
'category-logo' => 'Logo de la catégorie',
'product-policy' => 'Politique de produit',
'update-meta-data' => 'Mettre à jour les métadonnées',
'product-view-image' => 'Image du produit',
'advertisement-two' => 'Publicité Deux Images',
'advertisement-one' => 'Publicité One Images',
'footer-middle-content' => 'Contenu intermédiaire du pied de page',
'advertisement-four' => 'Publicité Quatre Images',
'advertisement-three' => 'Publicité Trois Images',
'images' => 'Images',
'general' => 'Général',
'add-image-btn-title' => 'Ajouter une image',
'footer-middle' => [
'about-us' => 'À propos de nous',
'customer-service' => 'Service Clients',
'whats-new' => 'Quoi de neuf',
'contact-us' => 'Nous contacter',
'order-and-returns' => 'Commande et retours',
'payment-policy' => 'Politique de paiement',
'shipping-policy' => 'Politique d\'expédition',
'privacy-and-cookies-policy' => 'Politique de confidentialité et de cookies',
],
],
'category' => [
'save-btn-title' => 'Enregistrer le menu',
'title' => 'Liste des menus des catégories',
'add-title' => 'Ajouter du contenu de menu',
'edit-title' => 'Modifier le contenu du menu',
'btn-add-category' => 'Ajouter du contenu de catégorie',
'datagrid' => [
'category-id' => 'Identifiant de la catégorie',
'category-name' => 'Nom de catégorie',
'category-icon' => 'Icône de catégorie',
'category-status' => 'Statut',
],
'tab' => [
'general' => 'Général',
],
'status' => 'Statut',
'active' => 'actif',
'inactive' => 'Inactif',
'select' => '-- Sélectionnez --',
'icon-class' => 'Classe d\'icônes',
'select-category' => 'Choisissez la catégorie',
'tooltip-content' => 'Contenu de l\'info-bulle',
'mass-delete-success' => 'Le menu des catégories sélectionnées a été supprimé avec succès.',
],
'general' => [
'locale_logo' => 'Logo de la région',
],
],
'home' => [
'view-all' => 'Voir tout',
'add-to-cart' => 'Ajouter au panier',
'hot-categories' => 'Catégories chaudes',
'payment-methods' => 'méthodes de payement',
'customer-reviews' => 'Avis des clients',
'shipping-methods' => 'méthodes de livraison',
'popular-categories' => 'Catégories populaires',
],
'header' => [
'cart' => 'Chariot',
'guest' => 'Invité',
'logout' => 'Se déconnecter',
'title' => 'Compte',
'account' => 'Compte',
'profile' => 'Profil',
'wishlist' => 'Liste de souhaits',
'all-categories' => 'toutes catégories',
'search-text' => 'Rechercher des produits ici',
'welcome-message' => 'Bienvenue, :customer_name',
'dropdown-text' => 'Gérer le panier, les commandes et la liste de souhaits',
],
'menu-navbar' => [
'text-more' => 'Suite',
'text-category' => 'Acheter par catégorie',
],
'minicart' => [
'cart' => 'Chariot',
'view-cart' => 'Voir le panier',
],
'checkout' => [
'qty' => 'Qté',
'checkout' => 'Vérifier',
'cart' => [
'view-cart' => 'Voir le panier',
'cart-summary' => 'Sommaire du panier',
],
'items' => 'Articles',
'subtotal' => 'Total',
'sub-total' => 'Sous-total',
'proceed' => 'Passer à la caisse',
],
'customer' => [
'compare' => [
'text' => 'Comparer',
'compare_similar_items' => 'Comparer des articles similaires',
'add-tooltip' => 'Ajouter un produit à la liste de comparaison',
'added' => 'Article ajouté avec succès à la liste de comparaison',
'already_added' => 'Article déjà ajouté à la liste de comparaison',
'removed' => 'Article supprimé avec succès de la liste de comparaison',
'removed-all' => 'Tous les articles ont été supprimés avec succès de la liste de comparaison',
'empty-text' => 'Vous n\'avez aucun article dans votre liste de comparaison',
'product_image' => 'Image du produit',
'actions' => 'Actions',
],
'login-form' => [
'sign-up' => 'S\'inscrire',
'new-customer' => 'Nouveau client',
'customer-login' => 'Connexion client',
'registered-user' => 'Utilisateur enregistré',
'your-email-address' => 'Votre adresse email',
'form-login-text' => 'Si vous avez un compte, connectez-vous avec votre adresse e-mail.',
],
'signup-form' => [
'login' => 'Connexion',
'become-user' => 'Devenir utilisateur',
'user-registration' => 'Enregistrement de l\'utilisateur',
'form-sginup-text' => 'Si vous êtes nouveau dans notre magasin, nous sommes heureux de vous compter parmi nos membres.',
],
'forget-password' => [
'login' => 'Connexion',
'forgot-password' => 'Mot de passe oublié',
'recover-password' => 'Récupérer mot de passe',
'recover-password-text' => 'Si vous avez oublié votre mot de passe, récupérez-le en saisissant votre adresse e-mail.',
],
'wishlist' => [
'remove-all-success' => 'Tous les articles de votre liste de souhaits ont été supprimés',
],
],
'error' => [
'go-to-home' => 'Aller à la maison',
'page-lost-short' => 'Contenu perdu de la page',
'something_went_wrong' => 'quelque chose s\'est mal passé',
'page-lost-description' => 'La page que vous recherchez n\'est pas disponible. Essayez de rechercher à nouveau ou utilisez le bouton Retour ci-dessous.',
],
'products' => [
'text' => 'Des produits',
'details' => 'Des détails',
'reviews-title' => 'Commentaires',
'reviewed' => 'Révisé',
'review-by' => 'Examen par',
'quick-view' => 'Aperçu rapide',
'not-available' => 'Indisponible',
'submit-review' => 'Poster le commentaire',
'ratings' => ':totalRatings Notes',
'reviews-count' => ':totalReviews Avis',
'customer-rating' => 'Évaluation du client',
'more-infomation' => 'Plus d\'information',
'view-all-reviews' => 'Voir tous les avis',
'write-your-review' => 'Donnez votre avis',
'short-description' => 'Brèves descriptions',
'recently-viewed' => 'Derniers produits consultés',
'be-first-review' => 'Soyez le premier à rédiger un avis',
'tax-inclusive' => 'Toutes taxes comprises',
],
'shop' => [
'gender' => [
'male' => 'Homme',
'other' => 'Autre',
'female' => 'Femelle',
],
'general' => [
'no' => 'Non',
'yes' => 'Oui',
'view' => 'Vue',
'filter' => 'Filtre',
'orders' => 'Ordres',
'update' => 'Mettre à jour',
'reviews' => 'Commentaires',
'download' => 'Télécharger',
'currencies' => 'Devises',
'addresses' => 'Adresses',
'top-brands' => 'Les meilleures marques',
'new-password' => 'Nouveau mot de passe',
'no-file-available' => 'Aucun fichier disponible !',
'downloadables' => 'Produits téléchargeables',
'confirm-new-password' => 'Confirmer le nouveau mot de passe',
'enter-current-password' => 'Entrer votre mot de passe actuel',
'alert' => [
'info' => 'Info',
'error' => 'Erreur',
'success' => 'Succès',
'warning' => 'Avertissement',
],
],
'wishlist' => [
'add-wishlist-text' => 'Ajouter un produit à la liste de souhaits',
'remove-wishlist-text' => 'Supprimer le produit de la liste de souhaits',
],
],
'responsive' => [
'header' => [
'done' => 'Fait',
'languages' => 'Langues',
'greeting' => 'Bienvenue, :customer !',
],
],
];

View File

@ -56,13 +56,14 @@
{{ __('shop::app.customer.account.address.index.edit') }}
</a>
<a
class="card-link"
href="{{ route('address.delete', $address->id) }}"
onclick="deleteAddress('{{ __('shop::app.customer.account.address.index.confirm-delete') }}')">
<a class="card-link" href="javascript:void(0);" onclick="deleteAddress('{{ __('shop::app.customer.account.address.index.confirm-delete') }}')">
{{ __('shop::app.customer.account.address.index.delete') }}
</a>
<form id="deleteAddressForm" action="{{ route('address.delete', $address->id) }}" method="post">
@method('delete')
@csrf
</form>
</div>
</div>
</div>
@ -77,8 +78,11 @@
@push('scripts')
<script>
function deleteAddress(message) {
if (!confirm(message))
event.preventDefault();
if (! confirm(message)) {
return;
}
$('#deleteAddressForm').submit();
}
</script>
@endpush

View File

@ -28,7 +28,11 @@
@if ($order->canCancel())
<span class="account-action">
<a href="{{ route('customer.orders.cancel', $order->id) }}" class="theme-btn light unset float-right" v-alert:message="'{{ __('shop::app.customer.account.order.view.cancel-confirm-msg') }}'" style="float: right">
<form id="cancelOrderForm" action="{{ route('customer.orders.cancel', $order->id) }}" method="post">
@csrf
</form>
<a href="javascript:void(0);" class="theme-btn light unset float-right" onclick="cancelOrder('{{ __('shop::app.customer.account.order.view.cancel-confirm-msg') }}')" style="float: right">
{{ __('shop::app.customer.account.order.view.cancel-btn-title') }}
</a>
</span>
@ -579,4 +583,16 @@
{!! view_render_event('bagisto.shop.customers.account.orders.view.after', ['order' => $order]) !!}
</div>
</div>
@endsection
@endsection
@push('scripts')
<script>
function cancelOrder(message) {
if (! confirm(message)) {
return;
}
$('#cancelOrderForm').submit();
}
</script>
@endpush

View File

@ -16,8 +16,13 @@
@if (count($reviews) > 1)
<div class="account-action float-right">
<a href="{{ route('customer.review.deleteall') }}" class="theme-btn light unset">
{{ __('shop::app.customer.account.wishlist.deleteall') }}
<form id="deleteAllReviewForm" action="{{ route('customer.review.deleteall') }}" method="post">
@method('delete')
@csrf
</form>
<a href="javascript:void(0);" class="theme-btn light unset" onclick="confirm('{{ __('shop::app.customer.account.review.delete-all.confirmation-message') }}') ? document.getElementById('deleteAllReviewForm').submit() : null;">
{{ __('shop::app.customer.account.review.delete-all.title') }}
</a>
</div>
@endif
@ -59,7 +64,12 @@
</div>
<div class="col-2">
<a class="unset" href="{{ route('customer.review.delete', $review->id) }}">
<form id="deleteReviewForm" action="{{ route('customer.review.delete', $review->id) }}" method="post">
@method('delete')
@csrf
</form>
<a class="unset" href="javascript:void(0);" onclick="confirm('{{ __('shop::app.customer.account.review.delete.confirmation-message') }}') ? document.getElementById('deleteReviewForm').submit() : null;">
<span class="rango-delete fs24"></span>
<span class="align-vertical-top">{{ __('shop::app.checkout.cart.remove') }}</span>
</a>

View File

@ -91,6 +91,12 @@
</div>
</div>
<div class="form-group">
{!! Captcha::render() !!}
</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') }}">
@ -103,3 +109,9 @@
{!! view_render_event('bagisto.shop.customers.login.after') !!}
</div>
@endsection
@push('scripts')
{!! Captcha::renderJS() !!}
@endpush

View File

@ -56,6 +56,12 @@
</span>
</div>
<div class="control-group">
{!! Captcha::render() !!}
</div>
{!! view_render_event('bagisto.shop.customers.forget_password_form_controls.after') !!}
<button class="theme-btn" type="submit">
@ -69,3 +75,9 @@
</div>
</div>
@endsection
@push('scripts')
{!! Captcha::renderJS() !!}
@endpush

View File

@ -138,6 +138,14 @@
</span>
</div>
{!! view_render_event('bagisto.shop.customers.signup_form_controls.password_confirmation.after') !!}
<div class="control-group">
{!! Captcha::render() !!}
</div>
@if (core()->getConfigData('customer.settings.newsletter.subscription'))
<div class="control-group">
<input type="checkbox" id="checkbox2" name="is_subscribed">
@ -158,3 +166,9 @@
</div>
</div>
@endsection
@push('scripts')
{!! Captcha::renderJS() !!}
@endpush

View File

@ -116,6 +116,11 @@
<span v-else class="fs16">__</span>
@break;
@case('multiselect')
<span v-if="product.product['{{ $attribute['code'] }}']" v-html="getAttributeOptions(product['{{ $attribute['code'] }}'] ? product : product.product['{{ $attribute['code'] }}'] ? product.product : null, '{{ $attribute['code'] }}', 'multiple')" class="fs16"></span>
<span v-else class="fs16">__</span>
@break
@case ('file')
@case ('image')
<a :href="`${$root.baseUrl}/${product.url_key}`" class="unset">
@ -215,7 +220,7 @@
} else {
this.$set(this, 'products', this.products.filter(product => product.id != productId));
}
this.$root.headerItemsCount++;
window.showAlert(`alert-${response.data.status}`, response.data.label, response.data.message);

View File

@ -119,7 +119,7 @@
<a
href="{{ route('shop.productOrCategory.index', $product->url_key) }}"
title="{{ $product->name }}"
class="product-image-container">
class="{{ $cardClass ?? 'product-image-container' }}">
<img
loading="lazy"

View File

@ -108,11 +108,14 @@
@foreach ($results as $productFlat)
@if ($toolbarHelper->getCurrentMode() == 'grid')
@include('shop::products.list.card', ['product' => $productFlat->product])
@include('shop::products.list.card', [
'cardClass' => 'category-product-image-container',
'product' => $productFlat->product,
])
@else
@include('shop::products.list.card', [
'list' => true,
'product' => $productFlat->product
'product' => $productFlat->product,
])
@endif
@endforeach