Front currency switcher, currency edit page and locale edit page added

This commit is contained in:
jitendra 2018-10-18 13:49:03 +05:30
parent 258262935a
commit 12d68fcb57
23 changed files with 301 additions and 102 deletions

View File

@ -19,7 +19,7 @@ class Kernel extends HttpKernel
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\StartSession::class,
];
/**

View File

@ -298,6 +298,14 @@ Route::group(['middleware' => ['web']], function () {
'redirect' => 'admin.locales.index'
])->name('admin.locales.store');
Route::get('/locales/edit/{id}', 'Webkul\Core\Http\Controllers\LocaleController@edit')->defaults('_config', [
'view' => 'admin::settings.locales.edit'
])->name('admin.locales.edit');
Route::put('/locales/edit/{id}', 'Webkul\Core\Http\Controllers\LocaleController@update')->defaults('_config', [
'redirect' => 'admin.locales.index'
])->name('admin.locales.update');
Route::get('/locales/delete/{id}', 'Webkul\Core\Http\Controllers\LocaleController@destroy')->name('admin.locales.delete');
@ -314,6 +322,14 @@ Route::group(['middleware' => ['web']], function () {
'redirect' => 'admin.currencies.index'
])->name('admin.currencies.store');
Route::get('/currencies/edit/{id}', 'Webkul\Core\Http\Controllers\CurrencyController@edit')->defaults('_config', [
'view' => 'admin::settings.currencies.edit'
])->name('admin.currencies.edit');
Route::put('/currencies/edit/{id}', 'Webkul\Core\Http\Controllers\CurrencyController@update')->defaults('_config', [
'redirect' => 'admin.currencies.index'
])->name('admin.currencies.update');
Route::get('/currencies/delete/{id}', 'Webkul\Core\Http\Controllers\CurrencyController@destroy')->name('admin.currencies.delete');

View File

@ -311,8 +311,8 @@ return [
'settings' => [
'locales' => [
'title' => 'Locales',
'add-locale-title' => 'Add Locale',
'edit-locale-title' => 'Edit Locale',
'add-title' => 'Add Locale',
'edit-title' => 'Edit Locale',
'add-title' => 'Add Locale',
'save-btn-title' => 'Save Locale',
'general' => 'General',

View File

@ -89,7 +89,7 @@
<div class="control-group" :class="[errors.has('slug') ? 'has-error' : '']">
<label for="slug" class="required">{{ __('admin::app.catalog.categories.slug') }}</label>
<input type="text" v-validate="'required'" class="control" id="slug" name="slug" value="{{ old('slug') }}"/>
<input type="text" v-validate="'required'" class="control" id="slug" name="slug" value="{{ old('slug') }}" v-slugify/>
<span class="control-error" v-if="errors.has('slug')">@{{ errors.first('slug') }}</span>
</div>

View File

@ -102,7 +102,7 @@
<div class="control-group" :class="[errors.has('{{$locale}}[slug]') ? 'has-error' : '']">
<label for="slug" class="required">{{ __('admin::app.catalog.categories.slug') }}</label>
<input type="text" v-validate="'required'" class="control" id="slug" name="{{$locale}}[slug]" value="{{ old($locale)['slug'] ?: $category->translate($locale)['slug'] }}"/>
<input type="text" v-validate="'required'" class="control" id="slug" name="{{$locale}}[slug]" value="{{ old($locale)['slug'] ?: $category->translate($locale)['slug'] }}" v-slugify/>
<span class="control-error" v-if="errors.has('{{$locale}}[slug]')">@{{ errors.first('{!!$locale!!}[slug]') }}</span>
</div>

View File

@ -88,7 +88,7 @@
{{ $attribute->admin_name }}
@if ($attribute->type == 'price')
<span class="currency-code">({{ core()->getBaseCurrencySymbol() }})</span>
<span class="currency-code">({{ currency()->symbol(core()->getBaseCurrencyCode()) }})</span>
@endif
<?php

View File

@ -37,12 +37,6 @@
<input v-validate="'required'" class="control" id="name" name="name" value="{{ old('name') }}"/>
<span class="control-error" v-if="errors.has('name')">@{{ errors.first('name') }}</span>
</div>
<div class="control-group" :class="[errors.has('symbol') ? 'has-error' : '']">
<label for="symbol" class="required">{{ __('admin::app.settings.currencies.symbol') }}</label>
<input v-validate="'required'" class="control" id="symbol" name="symbol" value="{{ old('symbol') }}"/>
<span class="control-error" v-if="errors.has('symbol')">@{{ errors.first('symbol') }}</span>
</div>
</div>
</accordian>

View File

@ -0,0 +1,50 @@
@extends('admin::layouts.content')
@section('page_title')
{{ __('admin::app.settings.currencies.edit-title') }}
@stop
@section('content')
<div class="content">
<form method="POST" action="{{ route('admin.currencies.update', $currency->id) }}" @submit.prevent="onSubmit">
<div class="page-header">
<div class="page-title">
<h1>{{ __('admin::app.settings.currencies.edit-title') }}</h1>
</div>
<div class="page-action">
<button type="submit" class="btn btn-lg btn-primary">
{{ __('admin::app.settings.currencies.save-btn-title') }}
</button>
</div>
</div>
<div class="page-content">
<div class="form-container">
@csrf()
<input name="_method" type="hidden" value="PUT">
<accordian :title="'{{ __('admin::app.settings.currencies.general') }}'" :active="true">
<div slot="body">
<div class="control-group" :class="[errors.has('code') ? 'has-error' : '']">
<label for="code" class="required">{{ __('admin::app.settings.currencies.code') }}</label>
<input type="text" v-validate="'required'" class="control" id="code" name="code" value="{{ $currency->code }}" disabled="disabled"/>
<input type="hidden" name="code" value="{{ $currency->code }}"/>
<span class="control-error" v-if="errors.has('code')">@{{ errors.first('code') }}</span>
</div>
<div class="control-group" :class="[errors.has('name') ? 'has-error' : '']">
<label for="name" class="required">{{ __('admin::app.settings.currencies.name') }}</label>
<input v-validate="'required'" class="control" id="name" name="name" value="{{ old('name') ?: $currency->name }}"/>
<span class="control-error" v-if="errors.has('name')">@{{ errors.first('name') }}</span>
</div>
</div>
</accordian>
</div>
</div>
</form>
</div>
@stop

View File

@ -1,7 +1,7 @@
@extends('admin::layouts.content')
@section('page_title')
{{ __('admin::app.settings.locales.add-locale-title') }}
{{ __('admin::app.settings.locales.add-title') }}
@stop
@section('content')

View File

@ -0,0 +1,50 @@
@extends('admin::layouts.content')
@section('page_title')
{{ __('admin::app.settings.locales.edit-title') }}
@stop
@section('content')
<div class="content">
<form method="POST" action="{{ route('admin.locales.update', $locale->id) }}" @submit.prevent="onSubmit">
<div class="page-header">
<div class="page-title">
<h1>{{ __('admin::app.settings.locales.edit-title') }}</h1>
</div>
<div class="page-action">
<button type="submit" class="btn btn-lg btn-primary">
{{ __('admin::app.settings.locales.save-btn-title') }}
</button>
</div>
</div>
<div class="page-content">
<div class="form-container">
@csrf()
<input name="_method" type="hidden" value="PUT">
<accordian :title="'{{ __('admin::app.settings.locales.general') }}'" :active="true">
<div slot="body">
<div class="control-group" :class="[errors.has('code') ? 'has-error' : '']">
<label for="code" class="required">{{ __('admin::app.settings.locales.code') }}</label>
<input type="text" v-validate="'required'" class="control" id="code" name="code" value="{{ $locale->code }}" disabled="disabled"/>
<input type="hidden" name="code" value="{{ $locale->code }}"/>
<span class="control-error" v-if="errors.has('code')">@{{ errors.first('code') }}</span>
</div>
<div class="control-group" :class="[errors.has('name') ? 'has-error' : '']">
<label for="name" class="required">{{ __('admin::app.settings.locales.name') }}</label>
<input v-validate="'required'" class="control" id="name" name="name" value="{{ old('name') ?: $locale->name }}"/>
<span class="control-error" v-if="errors.has('name')">@{{ errors.first('name') }}</span>
</div>
</div>
</accordian>
</div>
</div>
</form>
</div>
@stop

View File

@ -15,7 +15,7 @@ class Code implements Rule
*/
public function passes($attribute, $value)
{
return preg_match('/^[a-z]+[a-z0-9_]+$/', $value);
return preg_match('/^[a-zA-Z]+[a-zA-Z0-9_]+$/', $value);
}
/**

View File

@ -237,21 +237,6 @@ class Core
return ($currency = $this->getBaseCurrency()) ? $currencyCode = $currency->code : '';
}
/**
* Returns base channel's currency symbol
*
* @return string
*/
public function getBaseCurrencySymbol()
{
static $currencySymbol;
if($currencySymbol)
return $currencySymbol;
return $currencySymbol = $this->getBaseCurrency()->symbol ?? $this->getBaseCurrencyCode();
}
/**
* Returns base channel's currency model
*
@ -284,21 +269,6 @@ class Core
return ($currency = $this->getChannelBaseCurrency()) ? $currencyCode = $currency->code : '';
}
/**
* Returns base channel's currency symbol
*
* @return string
*/
public function getChannelBaseCurrencySymbol()
{
static $currencySymbol;
if($currencySymbol)
return $currencySymbol;
return $currencySymbol = $this->getChannelBaseCurrency()->symbol;
}
/**
* Returns current channel's currency model
*
@ -311,7 +281,12 @@ class Core
if($currency)
return $currency;
return $currency = $this->currencyRepository->first();
if($currencyCode = session()->get('currency')) {
if($currency = $this->currencyRepository->findOneByField('code', $currencyCode))
return $currency;
}
return $currency = $this->getChannelBaseCurrency();
}
/**
@ -329,21 +304,6 @@ class Core
return ($currency = $this->getCurrentCurrency()) ? $currencyCode = $currency->code : '';
}
/**
* Returns current channel's currency symbol
*
* @return string
*/
public function getCurrentCurrencySymbol()
{
static $currencySymbol;
if($currencySymbol)
return $currencySymbol;
return $currencySymbol = $this->getCurrentCurrency()->symbol;
}
/**
* Converts price
*

View File

@ -16,7 +16,6 @@ class CreateCurrenciesTable extends Migration
Schema::create('currencies', function (Blueprint $table) {
$table->increments('id');
$table->string('code');
$table->string('symbol');
$table->string('name');
$table->timestamps();
});

View File

@ -73,8 +73,7 @@ class CurrencyController extends Controller
{
$this->validate(request(), [
'code' => 'required|unique:countries,code',
'name' => 'required',
'symbol' => 'required'
'name' => 'required'
]);
$this->currency->create(request()->all());
@ -84,6 +83,40 @@ class CurrencyController extends Controller
return redirect()->route($this->_config['redirect']);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$currency = $this->currency->find($id);
return view($this->_config['view'], compact('currency'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$this->validate(request(), [
'code' => ['required', 'unique:currencies,code,' . $id, new \Webkul\Core\Contracts\Validations\Code],
'name' => 'required'
]);
$this->currency->update(request()->all(), $id);
session()->flash('success', 'Currency updated successfully.');
return redirect()->route($this->_config['redirect']);
}
/**
* Remove the specified resource from storage.
*

View File

@ -83,6 +83,40 @@ class LocaleController extends Controller
return redirect()->route($this->_config['redirect']);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$locale = $this->locale->find($id);
return view($this->_config['view'], compact('locale'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$this->validate(request(), [
'code' => ['required', 'unique:locales,code,' . $id, new \Webkul\Core\Contracts\Validations\Code],
'name' => 'required'
]);
$this->locale->update(request()->all(), $id);
session()->flash('success', 'Locale updated successfully.');
return redirect()->route($this->_config['redirect']);
}
/**
* Remove the specified resource from storage.
*

View File

@ -12,6 +12,6 @@ class Currency extends Model
* @var array
*/
protected $fillable = [
'code', 'name', 'symbol'
'code', 'name'
];
}

View File

@ -0,0 +1,44 @@
<?php
namespace Webkul\Shop\Http\Middleware;
use Webkul\Core\Repositories\CurrencyRepository;
use Closure;
class Currency
{
/**
* @var CurrencyRepository
*/
protected $currency;
/**
* @param \Webkul\Core\Repositories\CurrencyRepository $locale
*/
public function __construct(CurrencyRepository $currency)
{
$this->currency = $currency;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if($currency = $request->get('currency')) {
if($this->currency->findOneByField('code', $currency)) {
session()->put('currency', $currency);
}
} else {
if(!session()->get('currency')) {
session()->put('currency', core()->getChannelBaseCurrencyCode());
}
}
return $next($request);
}
}

View File

@ -1,6 +1,6 @@
<?php
Route::group(['middleware' => ['web', 'theme', 'locale']], function () {
Route::group(['middleware' => ['web', 'theme', 'locale', 'currency']], function () {
Route::get('/', 'Webkul\Shop\Http\Controllers\HomeController@index')->defaults('_config', [
'view' => 'shop::home.index'

View File

@ -8,6 +8,7 @@ use Illuminate\Routing\Router;
use Illuminate\Support\Facades\Blade;
use Webkul\Shop\Http\Middleware\Locale;
use Webkul\Shop\Http\Middleware\Theme;
use Webkul\Shop\Http\Middleware\Currency;
use Webkul\Shop\Providers\ComposerServiceProvider;
use Webkul\Ui\Menu;
@ -31,8 +32,8 @@ class ShopServiceProvider extends ServiceProvider
$this->loadViewsFrom(__DIR__ . '/../Resources/views', 'shop');
$router->aliasMiddleware('locale', Locale::class);
$router->aliasMiddleware('theme', Theme::class);
$router->aliasMiddleware('currency', Currency::class);
$this->app->register(ComposerServiceProvider::class);

View File

@ -391,6 +391,21 @@ section.slider-block {
align-items: center;
// cursor: pointer;
.currency-switcher {
float: right;
border-right: 2px solid $border-color;
cursor: pointer;
.dropdown-list {
width: 100px;
top: 37px;
.dropdown-container {
padding: 0 10px;
}
}
}
ul.account-dropdown-container {
float: right;
border-right: 2px solid $border-color;
@ -399,6 +414,7 @@ section.slider-block {
display: flex;
flex-direction: row;
margin-right: 14px;
margin-left: 14px;
.dropdown-list {
width: 300px;
@ -622,21 +638,6 @@ section.slider-block {
display: none;
}
.nav > li:last-child {
display:flex; align-items:center;
border-radius: 0 0 4px 0;
float:right;
display: none;
img {
margin-right:6px;
}
}
.nav > li:last-child > a {
border-radius: 0 4px 0 0;
}
.nav li li a {
margin-top: 1px;
}

View File

@ -25,6 +25,27 @@
</div>
<div class="right-content">
@if (core()->getCurrentChannel()->currencies->count() > 1)
<div class="currency-switcher">
<div class="dropdown-toggle">
USD
<i class="icon arrow-down-icon active"></i>
</div>
<div class="dropdown-list bottom-right">
<div class="dropdown-container">
<ul>
@foreach (core()->getCurrentChannel()->currencies as $currency)
<li>
<a href="?currency={{ $currency->code }}">{{ $currency->code }}</a>
</li>
@endforeach
</ul>
</div>
</div>
</div>
@endif
<ul class="account-dropdown-container">
<li class="account-dropdown">
<div class="dropdown-toggle">

View File

@ -3,7 +3,7 @@
bind(el, binding, vnode) {
let handler = function(e) {
setTimeout(function() {
e.target.value = e.target.value.toString().toLowerCase()
e.target.value = e.target.value.toString()
.replace(/[^\w_ ]+/g,'')
.trim()
.replace(/ +/g,'-');

View File

@ -956,6 +956,21 @@ section.slider-block div.slider-content div.slider-control .light-right-icon {
align-items: center;
}
.header .header-top div.right-content .currency-switcher {
float: right;
border-right: 2px solid #C7C7C7;
cursor: pointer;
}
.header .header-top div.right-content .currency-switcher .dropdown-list {
width: 100px;
top: 37px;
}
.header .header-top div.right-content .currency-switcher .dropdown-list .dropdown-container {
padding: 0 10px;
}
.header .header-top div.right-content ul.account-dropdown-container {
float: right;
border-right: 2px solid #C7C7C7;
@ -970,6 +985,7 @@ section.slider-block div.slider-content div.slider-control .light-right-icon {
-ms-flex-direction: row;
flex-direction: row;
margin-right: 14px;
margin-left: 14px;
}
.header .header-top div.right-content ul.account-dropdown-container li.account-dropdown .dropdown-list {
@ -1222,26 +1238,6 @@ section.slider-block div.slider-content div.slider-control .light-right-icon {
display: none;
}
.header .header-bottom .nav > li:last-child {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
border-radius: 0 0 4px 0;
float: right;
display: none;
}
.header .header-bottom .nav > li:last-child img {
margin-right: 6px;
}
.header .header-bottom .nav > li:last-child > a {
border-radius: 0 4px 0 0;
}
.header .header-bottom .nav li li a {
margin-top: 1px;
}