conflict resolve

This commit is contained in:
rahul shukla 2018-09-19 15:36:32 +05:30
commit 8fbf2b7b79
50 changed files with 3034 additions and 839 deletions

View File

@ -1,51 +0,0 @@
<?php
return [
'flatrate' => [
[
'code' => 'flatrate_one',
'title' => 'Flatrate One',
'name' => 'fixed 20% discount for today',
'description' => 'this is a flat rate',
'status' => '1',
'price' => '10',
'type' => [
'per_unit' => 'Per Unit',
'per order' => 'Per Order',
],
'class' => 'Webkul\Shipping\Helper\Rate',
],
[
'code' => 'flatrate_two',
'title' => 'Flatrate Two',
'name' => 'fixed 50% discount till 10/10/2018',
'description' => 'this is a flat rate',
'status' => '1',
'price' => '100',
'type' => [
'per unit' => 'Per Unit',
'per order' => 'Per Order',
],
'class' => 'Webkul\Shipping\Helper\Rate',
],
[
'code' => 'flatrate_three',
'title' => 'Flatrate Three',
'name' => 'fixed 30% discount',
'description' => 'this is a flat rate',
'status' => '1',
'price' => '1000',
'type' => [
'per unit' => 'Per Unit',
'per order' => 'Per Order',
],
'class' => 'Webkul\Shipping\Helper\Rate',
]
]
]
?>

18
config/carriers.php Normal file
View File

@ -0,0 +1,18 @@
<?php
return [
'flatrate' => [
'code' => 'flatrate',
'title' => 'Flatrate',
'description' => 'This is a flat rate',
'status' => '1',
'default_rate' => '10',
'type' => [
'per_unit' => 'Per Unit',
'per order' => 'Per Order',
],
'class' => 'Webkul\Shipping\Carriers\FlatRate',
]
];
?>

View File

@ -4,7 +4,6 @@
{{ __('admin::app.catalog.attributes.add-title') }}
@stop
@section('content')
<div class="content">
<form method="POST" action="{{ route('admin.catalog.attributes.store') }}" @submit.prevent="onSubmit">

View File

@ -18,7 +18,9 @@
?>
<div class="control-group" :class="[errors.has('inventories[{{ $inventorySource->id }}]') ? 'has-error' : '']">
<label>{{ $inventorySource->name }}</label>
<input type="text" v-validate="'numeric|min:0'" name="inventories[{{ $inventorySource->id }}]" class="control" value="{{ $qty }}"/>
<span class="control-error" v-if="errors.has('inventories[{{ $inventorySource->id }}]')">@{{ errors.first('inventories[{!! $inventorySource->id !!}]') }}</span>
</div>

View File

@ -2,7 +2,7 @@
<ul class="menubar">
@foreach($menu->items as $menuItem)
<li class="menu-item {{ $menu->getActive($menuItem) }}">
<a href="{{ $menuItem['url'] }}">
<a href="{{ count($menuItem['children']) ? current($menuItem['children'])['url'] : $menuItem['url'] }}">
<span class="icon {{ $menuItem['icon-class'] }}">
</span>
{{ $menuItem['name'] }}

View File

@ -1,8 +1,7 @@
@extends('admin::layouts.content')
@section('page_title')
@endsection
{{ __('admin::app.users.users.title') }}
@stop
@section('content')

View File

@ -32,84 +32,93 @@ class Cart {
protected $customer;
public function __construct(CartRepository $cart, CartProductRepository $cartProduct, CustomerRepository $customer) {
//Cookie expiry limit in minutes
protected $minutes = 150;
public function __construct(CartRepository $cart, CartProductRepository $cartProduct, CustomerRepository $customer ,$minutes = 150) {
$this->customer = $customer;
$this->cart = $cart;
$this->cartProduct = $cartProduct;
$this->minutes = $minutes;
}
public function guestUnitAdd($id) {
//empty array for storing the products
$products = array();
$minutes = 10;
if(Cookie::has('cart_session_id')) {
//getting the cart session id from cookie
$cart_session_id = Cookie::get('cart_session_id');
//finding current cart instance in the database table.
$current_cart = $this->cart->findOneByField('session_id', $cart_session_id);
// dd('Cookie = ',$cart_session_id, 'Session = ', session()->get('cart_session_id'), 'DB = ', $current_cart->session_id);
//check there is any cart or not
if(isset($current_cart)) {
$current_cart_id = $current_cart['id'] ?? $current_cart->id;
$current_cart_session_id = $current_cart['session_id'] ?? $current_cart->session_id;
} else {
//if someone deleted then take the flow to the normal
$this->repairCart($cart_session_id, $id);
}
//matching the session id present in the cookie and database are same or not.
if((session()->get('cart_session_id') == Cookie::get('cart_session_id')) && ($current_cart_session_id == session()->get('cart_session_id'))) {
$current_cart_products = array();
$current_cart_products = $this->cart->getProducts($current_cart_id);
//checking new product coming in the cart is new or previously added item.
foreach($current_cart_products as $key => $value) {
$product_id = $value['id'] ?? $value->id;
if($product_id == $id) {
//create status code to communicate with session flash
session()->flash('error', 'Item Already In Cart');
//remove this its temporary
dump('Item Already In Cart');
return redirect()->back();
}
}
//cart data being attached to the instace.
$cart_data = $this->cart->attach($current_cart_id, $id, 1);
//getting the products after being attached to cart instance
$cart_products = $this->cart->getProducts($current_cart_id);
//storing the information in session.
session()->put('cart_data', [$current_cart, $cart_products]);
session()->flash('Success', 'Item Added In Cart');
session()->flash('Success', 'Item Added To Cart Successfully');
dump($cart_products);
//return the control to the controller
return redirect()->back();
} else {
// throw new \Exception('Error, Many or Few Session discrepancies found.');
//repair the cart, will remake the session
//and add the product in the new cart instance.
$this->repairCart($cart_session_id, $id);
}
} else {
//function call
$this->createNewCart($id);
}
}
/*helpers*/
public function makeCartSession($to_process) {
session()->put('cart_session_id', $to_process);
return session()->get('cart_session_id');
}
/**
* Create New Cart
@ -117,23 +126,20 @@ class Cart {
* Session.
*
* @return mixed
*/
*/
public function createNewCart($id) {
$minutes = 120;
$fresh_cart_session_id = session()->getId();
Cookie::queue('cart_session_id', $fresh_cart_session_id, $minutes);
$cart_session_id = $this->makeCartSession($fresh_cart_session_id);
$data['session_id'] = $fresh_cart_session_id;
$data['channel_id'] = core()->getCurrentChannel()->id;
if($cart = $this->cart->create($data)) {
$this->makeCartSession($fresh_cart_session_id);
$new_cart_id = $cart->id ?? $cart['id'];
$cart_product['product_id'] = $id;
@ -146,7 +152,7 @@ class Cart {
session()->put('cart_data', [$cart, $cart_product]);
session()->flash('success', 'Product Added To Cart');
session()->flash('success', 'Item Added To Cart Successfully');
return redirect()->back();
}
@ -156,6 +162,20 @@ class Cart {
return redirect()->back();
}
/**
* This makes session
* cart.
*/
public function makeCartSession($cart_session_id) {
$fresh_cart_session_id = $cart_session_id;
Cookie::queue('cart_session_id', $fresh_cart_session_id, $this->minutes);
session()->put('cart_session_id', $fresh_cart_session_id);
}
/**
* Reset Session and
* Cookie values
@ -164,8 +184,7 @@ class Cart {
*
* @return mixed
*/
public function repairCart($cart_session_id, $product_id) {
public function repairCart($cart_session_id ="null", $product_id = 0) {
if($cart_session_id == session()->get('cart_session_id')) {
$data['session_id'] = $cart_session_id;
@ -178,7 +197,7 @@ class Cart {
$this->cart->attach($cart_id, $product_id, 1);
session()->flash('success', 'Product Added In Cart');
session()->flash('success', 'Item Added To Cart Successfully');
return redirect()->back();
@ -206,8 +225,8 @@ class Cart {
public function guestUnitRemove($id) {
//remove the products here
if(Cookie::has('session_c')) {
$products = unserialize(Cookie::get('session_c'));
if(Cookie::has('session_cart_id')) {
$products = unserialize(Cookie::get('session_cart_id'));
foreach($products as $key => $value) {
if($value == $id) {
@ -215,7 +234,7 @@ class Cart {
array_push($products, $id);
Cookie::queue('session_c', serialize($products));
Cookie::queue('session_cart_id', serialize($products));
return redirect()->back();
}
@ -233,46 +252,80 @@ class Cart {
$products = array();
// $customerLoggedIn = auth()->guard('customer')->check();
// //customer is authenticated
// if ($customerLoggedIn) {
//assuming that there is data in cookie and customer's cart also.
if(!auth()->guard('customer')->check()) {
throw new \Exception('This function is protected for auth customers only.');
}
$data['customer_id'] = auth()->guard('customer')->user()->id;
$data['channel_id'] = core()->getCurrentChannel()->id;
$customerCart = $this->cart->findOneByField('customer_id', $data['customer_id']);
$customer_cart = $this->cart->findOneByField('customer_id', $data['customer_id']);
//if there are products already in cart of that customer.
$customerCartId = $customerCart->id ?? $customerCart['id'];
$customer_cart_id = $customer_cart->id ?? $customer_cart['id'];
$customerCartProducts = $this->cart->getProducts($customerCartId);
/**
* Check if their any
* instance of current
* customer in the cart
* table.
*/
if(isset($customer_cart)) {
$customer_cart_products = $this->cart->getProducts($customer_cart_id);
if (isset($customerCartProducts)) {
if (isset($customer_cart_products)) {
foreach ($customerCartProducts as $previousCartProduct) {
foreach ($customer_cart_products as $customer_cart_product) {
if($customer_cart_product->id == $id) {
dump('Item already exists in cart');
if($previousCartProduct->id == $id) {
dd('product already exists in cart');
session()->flash('error', 'Item already exists in cart');
session()->flash('error', 'Product already exists in cart');
return redirect()->back();
return redirect()->back();
//maybe increase the quantity in here
}
}
//add the product in the cart
$this->cart->attach($customer_cart_id, $id, 1);
session()->flash('success', 'Item Added To Cart Successfully');
return redirect()->back();
} else {
$this->cart->destroy($customer_cart_id);
session()->flash('error', 'Try Adding The Item Again');
dd('cart instance without any product found, delete it and create a new one for the current product id');
return redirect()->back();
}
//add the product in the cart
} else {
/**
* this will work
* for logged in users
* and they do not have
* any cart instance
* found in the database.
*/
$product['product_id'] = $id;
if($new_cart = $this->cart->create($data)) {
$new_cart_id = $new_cart->id ?? $new_cart['id'];
$product['quantity'] = 1;
$this->cart->attach($new_cart_id, $id, 1);
$product['cart_id'] = $customerCartId;
session()->flash('success', 'Item Added To Cart Successfully');
$this->cartProduct->create($product);
return redirect()->back();
return redirect()->back();
} else {
session()->flash('error', 'Cannot Add Item in Cart');
return redirect()->back();
}
}
}
@ -295,105 +348,81 @@ class Cart {
*/
public function mergeCart() {
//considering cookie as a source of truth.
if(Cookie::has('cart_session_id')) {
/*
Check for previous cart of customer and
pull products from that cart instance
and then check for unique products
and delete the record with session id
and increase the quantity of the products
that are added again before deleting the
guest cart record.
*/
//To hold the customer ID which is currently logged in
$customer_id = auth()->guard('customer')->user()->id;
//having the session id saved in the cart.
$cart_session_id = Cookie::get('cart_session_id');
$current_cart = $this->cart->findOneByField('session_id', $cart_session_id);
//pull the record from cart table for above session id.
$guest_cart = $this->cart->findOneByField('session_id', $cart_session_id);
//it is impossible to not have an entry in cart table and cart_products.
//will later handle the exceoption.
$current_cart_id = $current_cart['id'] ?? $current_cart->id;
if(!isset($guest_cart)) {
dd('Some One Deleted Cart or it wasn\'t there from the start');
$current_cart_session_id = $current_cart['session_id'] ?? $current_cart->session_id;
$current_cart_products = $this->cart->getProducts($current_cart_id);
$customer_id = auth()->guard('customer')->user()->id; //working
if($cart_session_id == $current_cart_session_id) {
$current_cart_products = array();
$customer_cart = $this->cart->findByField(['customer_id'=> $customer_id]);
//check previous saved cart of customer.
if(!$customer_cart->isEmpty()) {
$customer_cart_id = $customer_cart->id;
$customer_cart_products = $this->cart->getProducts($customer_cart_id);
foreach($current_cart_products as $key => $value) {
$product_id = $value['id'] ?? $value->id;
foreach($current_cart_products as $key => $current_cart_product) {
$current_product_id = $current_cart_product['id'] ?? $current_cart_product->id;
if($current_product_id == $product_id) {
unset($current_cart_products[$key]);
}
}
}
foreach($current_cart_products as $current_cart_product) {
$current_cart_product_id = $current_cart_product['id'] ?? $current_cart_product->id;
$this->cart->attach($current_cart_id, $current_cart_product_id, 1);
}
$this->cart->update(['customer_id' => $customer_id], $current_cart_id);
$customer_cart = $this->cart->findOneByField('customer_id', $customer_id);
$customer_cart_id = $customer_cart->id;
if($this->cart->getProducts($customer_cart_id) && isset($current_cart_products)) {
foreach($current_cart_products as $key => $value) {
array_push($cart_products, $current_cart_product);
}
}
session()->put('cart_data', [$customer_cart, $cart_products]);
session()->flash('Success', 'Item Added In Cart');
dump($cart_products);
return redirect()->back();
} else {
$session_id = session()->getId();
$customer_id = auth()->guard('customer')->user()->id;
$updated_cart = $this->cart->update(['customer_id' => $customer_id, 'session_id' => $session_id], $current_cart_id);
$updated_cart_products = $this->cart->getProducts($updated_cart->id);
Cookie::queue('cart_session_id', $session_id, 120);
session()->put('cart_session_id', $session_id);
session('cart_data', [$updated_cart, $updated_cart_products]);
return redirect()->back();
}
} else {
throw new \Exception('Error, Session discrepancies found.');
$this->repairCart($cart_session_id, $id);
return redirect()->back();
}
} else {
throw new \Exception('Nothing found');
return redirect()->back();
$guest_cart_products = $this->cart->getProducts($guest_cart->id);
//check if the current logged in customer is also
//having any previously saved cart instances.
$customer_cart = $this->cart->findOneByField('customer_id', $customer_id);
if(isset($customer_cart)) {
$customer_cart_products = $this->cart->getProducts($customer_cart->id);
foreach($guest_cart_products as $key => $guest_cart_product) {
foreach($customer_cart_products as $customer_cart_product) {
if($guest_cart_product->id == $customer_cart_product->id) {
$quantity = $guest_cart_product->toArray()['pivot']['quantity'] + 1;
$pivot = $guest_cart_product->toArray()['pivot'];
$saveQuantity = $this->cart->updateRelatedForMerge($pivot, 'quantity', $quantity);
unset($guest_cart_products[$key]);
}
}
}
//insert the new products here.
foreach ($guest_cart_products as $key => $guest_cart_product) {
$product = $guest_cart_product->toArray();
$this->cart->updateRelatedForMerge($product['pivot'], 'cart_id', $customer_cart->id);
}
//detach with guest cart records
$this->cart->detachAndDeleteParent($guest_cart->id);
Cookie::queue(Cookie::forget('cart_session_id'));
return redirect()->back();
} else {
//this will just update the customer id column in the cart table
$this->cart->update(['customer_id' => $customer_id], $guest_cart->id);
Cookie::queue(Cookie::forget('cart_session_id'));
return redirect()->back();
}
}
return redirect()->back();
}
}

View File

@ -42,7 +42,7 @@ class CartController extends Controller
public function __construct(CartRepository $cart, CartProductRepository $cartProduct, CustomerRepository $customer) {
$this->middleware('customer')->except(['add', 'remove']);
$this->middleware('customer')->except(['add', 'remove', 'test']);
$this->customer = $customer;
@ -80,4 +80,21 @@ class CartController extends Controller
return redirect()->back();
}
// public function test() {
// $cookie = Cookie::get('cart_session_id');
// $cart = $this->cart->findOneByField('session_id', $cookie);
// $cart_products = $this->cart->getProducts($cart->id);
// foreach($cart_products as $cart_product) {
// $quantity = $cart_product->toArray()['pivot']['quantity'] + 1;
// $pivot = $cart_product->toArray()['pivot'];
// $saveQuantity = $this->cart->saveRelated($pivot, 'quantity', $quantity+1);
// }
// dd('done');
// }
}

View File

@ -10,23 +10,26 @@ use Auth;
* Chekout controller for the customer
* and guest for placing order
*
* @author Rahul Shukla <rahulshukla.symfony517@webkul.com>
* @author Jitendra Singh <jitendra@webkul.com>
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
*/
class CheckoutController extends Controller
{
/**
* Display a listing of the resource.
* Contains route related configuration
*
* @return \Illuminate\Http\Response
* @var array
*/
protected $_config;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
// $this->middleware(['customer', 'guest']);
$this->_config = request('_config');
}
@ -37,9 +40,7 @@ class CheckoutController extends Controller
*/
public function index()
{
$customer_id = auth()->guard('customer')->user();
return view($this->_config['view'],compact('customer_id'));
return view($this->_config['view']);
}
}

View File

@ -0,0 +1,59 @@
<?php
namespace Webkul\Cart\Http\ViewComposers;
use Illuminate\View\View;
use Illuminate\Support\Collection;
use Webkul\Cart\Repositories\CartRepository;
use Cookie;
use Cart;
/**
* cart List Composer on Navigation Menu
*
* @author Prashant Singh <prashant.singh852@webkul.com>
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
*/
class CartComposer
{
/**
* The cart implementation
* for shop bundle's navigation
* menu
*/
protected $cart;
/**
* Bind data to the view.
*
* @param View $view
* @return void
*/
public function __construct(CartRepository $cart) {
$this->cart = $cart;
}
public function compose(View $view) {
if(auth()->guard('customer')->check()) {
$cart = $this->cart->findOneByField('customer_id', auth()->guard('customer')->user()->id);
$cart_products = $this->cart->getProducts($cart['id']);
// dd($cart_products);
$view->with('cart', $cart_products);
} else {
if(Cookie::has('cart_session_id')) {
$cart = $this->cart->findOneByField('session_id', Cookie::get('cart_session_id'));
$cart_products = $this->cart->getProducts($cart['id']);
$view->with('cart', $cart_products);
}
}
}
}

View File

@ -10,11 +10,12 @@ class Cart extends Model
{
protected $table = 'cart';
protected $fillable = ['customer_id','session_id','channel_id','coupon_code','is_gift'];
protected $fillable = ['customer_id', 'session_id', 'channel_id', 'coupon_code', 'is_gift'];
protected $hidden = ['coupon_code'];
public function with_products() {
return $this->belongsToMany(Product::class, 'cart_products');
return $this->belongsToMany(Product::class, 'cart_products')->withPivot('id', 'product_id','quantity', 'cart_id');
}
}

View File

@ -9,6 +9,7 @@ use Illuminate\Foundation\AliasLoader;
use Webkul\User\Http\Middleware\RedirectIfNotAdmin;
use Webkul\Customer\Http\Middleware\RedirectIfNotCustomer;
use Webkul\Cart\Facades\Cart;
use Webkul\Cart\Providers\ComposerServiceProvider;
class CartServiceProvider extends ServiceProvider
{
@ -19,9 +20,9 @@ class CartServiceProvider extends ServiceProvider
$router->aliasMiddleware('admin', RedirectIfNotAdmin::class);
// $router->aliasMiddleware('customer', RedirectIfNotCustomer::class);
$router->aliasMiddleware('customer', RedirectIfNotCustomer::class);
$this->register(EventServiceProvider::class);
$this->app->register(ComposerServiceProvider::class);
}
/**
@ -41,14 +42,14 @@ class CartServiceProvider extends ServiceProvider
*/
protected function registerFacades()
{
$loader = AliasLoader::getInstance();
$loader->alias('cart', Cart::class);
//to make the cart facade and bind the
//alias to the class needed to be called.
$loader = AliasLoader::getInstance();
$loader->alias('cart', CartFacade::class);
$this->app->singleton('cart', function () {
return new cart();
return new Cart();
});
$this->app->bind('cart', 'Webkul\Cart\Cart');
}
}

View File

@ -0,0 +1,32 @@
<?php
namespace Webkul\Cart\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
use View;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Register bindings in the container.
*
* @return void
*/
public function boot()
{
//using the class based composers...
View::composer(['shop::layouts.header.index'], 'Webkul\Cart\Http\ViewComposers\CartComposer');
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}

View File

@ -16,7 +16,7 @@ class CartRepository extends Repository
/**
* Specify Model class name
*
* @return mixed
* @return Mixed
*/
function model()
@ -26,7 +26,7 @@ class CartRepository extends Repository
/**
* @param array $data
* @return mixed
* @return Mixed
*/
public function create(array $data)
@ -40,7 +40,7 @@ class CartRepository extends Repository
* @param array $data
* @param $id
* @param string $attribute
* @return mixed
* @return Mixed
*/
public function update(array $data, $id, $attribute = "id")
@ -61,18 +61,43 @@ class CartRepository extends Repository
* Method to attach
* associations
*
* @return Eloquent
* @return Mixed
*/
public function attach($cart_id, $product_id, $quantity) {
$this->model->findOrFail($cart_id)->with_products()->attach($cart_id, ['product_id' => $product_id, 'cart_id' => $cart_id, 'quantity' => $quantity]);
return $this->model->findOrFail($cart_id)->with_products()->attach($cart_id, ['product_id' => $product_id, 'cart_id' => $cart_id, 'quantity' => $quantity]);
}
/**
* Method to detach
* associations
* This will update the
* quantity of product
* for the customer,
* in case of merge.
*
* @return Eloquent
* @return Mixed
*/
public function updateRelatedForMerge($pivot, $column, $value) {
$cart_product = $this->model->findOrFail($pivot['cart_id']);
return $cart_product->with_products()->updateExistingPivot($pivot['product_id'], array($column => $value));
}
/**
* Method to detach
* associations.
*
* Use this only with
* guest cart only.
*
* @return Mixed
*/
public function detachAndDeleteParent($cart_id) {
$cart = $this->model->find($cart_id);
//apply strict check for verifying guest ownership on this record.
$cart->with_products()->detach();
return $this->model->destroy($cart_id);
}
}

View File

@ -23,6 +23,7 @@ class CreateCustomerAddressesTable extends Migration
$table->string('state');
$table->string('city');
$table->integer('postcode');
$table->string('phone');
$table->timestamps();
});
}

View File

@ -1,6 +1,6 @@
<?php
namespace Webkul\Shipping\Carrier;
namespace Webkul\Shipping\Carriers;
use Webkul\Shipping\Contracts\AbstractShipping;
use Config;
@ -11,13 +11,8 @@ use Config;
*/
class FlatRate extends AbstractShipping
{
public function calculate()
{
$all = Config::get('carrier');
return $all;
return [];
}
}

View File

@ -12,6 +12,4 @@ abstract class AbstractShipping
abstract public function calculate();
}
?>

View File

@ -1,31 +0,0 @@
<?php
namespace Webkul\Shipping\Helper;
use Webkul\Shipping\Carrier\FlatRate;
/**
* Class Rate.
*
*/
class Rate extends FlatRate
{
public function collectRates()
{
$data = $this->calculate();
$rates =[];
foreach($data as $rate){
foreach($rate as $flat){
$rates[$flat['name']] = $flat['price'];
}
}
return $rates;
}
}

View File

@ -0,0 +1,29 @@
<?php
namespace Webkul\Shipping\Helper;
use Illuminate\Support\Facades\Config;
/**
* Class Rate.
*
*/
class Rate
{
public function collectRates()
{
$rates = [];
$shippingMethods = Config::get('carriers');
foreach($shippingMethods as $shippingMethod) {
$object = new $shippingMethod['class'];
if($rate = $object->calculate()) {
$rates[] = $rate;
}
}
return $rates;
}
}

View File

@ -15,14 +15,6 @@ class ShippingServiceProvider extends ServiceProvider
*/
public function boot(Router $router)
{
// $router->aliasMiddleware('customer', RedirectIfNotCustomer::class);
// $this->loadMigrationsFrom(__DIR__ . '/../Database/migrations');
// include __DIR__ . '/../Http/routes.php';
// $this->loadViewsFrom(__DIR__ . '/../Resources/views', 'shipping');
}
/**

View File

@ -11,7 +11,7 @@ Route::group(['middleware' => ['web']], function () {
]);
Route::get('/checkout', 'Webkul\Cart\Http\Controllers\CheckoutController@index')->defaults('_config', [
'view' => 'shop::customers.checkout.index'
'view' => 'shop::checkout.onepage'
])->name('shop.checkout');
/* dummy routes ends here */
@ -27,15 +27,8 @@ Route::group(['middleware' => ['web']], function () {
Route::post('product/remove/{id}', 'Webkul\Cart\Http\Controllers\CartController@remove')->name('cart.remove');
// Route::post('product/customer/cart/add/{id}', 'Webkul\Cart\Http\Controllers\CartController@add')->name('cart.customer.add');
// Route::post('product/customer/cart/remove/{id}', 'Webkul\Cart\Http\Controllers\CartController@remove')->name('cart.customer.remove');
Route::get('product/customer/cart/merge', 'Webkul\Cart\Http\Controllers\CartController@handleMerge')->name('cart.merge');
//Routes for product cart ends
// Product Review routes
Route::get('/reviews/{slug}', 'Webkul\Shop\Http\Controllers\ReviewController@show')->defaults('_config', [
'view' => 'shop::products.reviews.index'
@ -53,13 +46,6 @@ Route::group(['middleware' => ['web']], function () {
'redirect' => 'admin.reviews.index'
])->name('admin.reviews.store');
// Route::post('/reviews/create/{slug}', 'Webkul\Core\Http\Controllers\ReviewController@store')->defaults('_config', [
// 'redirect' => 'admin.reviews.index'
// ])->name('admin.reviews.store');
// Route::view('/products/{slug}', 'shop::store.product.details.index');
Route::view('/cart', 'shop::store.product.view.cart.index');
//customer routes starts here
Route::prefix('customer')->group(function () {
@ -90,12 +76,6 @@ Route::group(['middleware' => ['web']], function () {
'redirect' => 'customer.session.index'
])->name('customer.session.destroy');
Route::view('/cart', 'shop::store.product.cart.cart.index')->name('customer.cart');
Route::view('/product', 'shop::store.product.details.home.index')->name('customer.product');
Route::view('/product/review', 'shop::store.product.review.index')->name('customer.product.review');
//customer account
Route::prefix('account')->group(function () {

View File

@ -1,13 +1,16 @@
window.jQuery = window.$ = $ = require("jquery");
window.Vue = require("vue");
window.VeeValidate = require("vee-validate");
window.axios = require("axios");
Vue.use(VeeValidate);
Vue.prototype.$http = axios
Vue.component("category-nav", require("./components/category-nav.vue"));
Vue.component("category-item", require("./components/category-item.vue"));
Vue.component("image-slider", require("./components/image-slider.vue"));
Vue.component("vue-slider", require("vue-slider-component"));
Vue.component("cart-dropdown", require("./components/cart-dropdown.vue"));
$(document).ready(function () {
@ -50,6 +53,7 @@ $(document).ready(function () {
const flashes = this.$refs.flashes;
flashMessages.forEach(function (flash) {
console.log(flash);
flashes.addFlash(flash);
}, this);
},

View File

@ -0,0 +1,156 @@
<template>
<div>
<ul class="cart-dropdown" @click="dropOrHide">
<li class="cart-summary">
<span class="icon cart-icon"></span>
<span class="cart"><span class="cart-count" v-if="totalitems > 0">{{ totalitems }}</span>Products</span>
<span class="icon arrow-down-icon"></span>
</li>
</ul>
<div class="dropdown-cart" :class="{ show: toggle }">
<div class="dropdown-header">
<p class="heading">Cart Subtotal - $80</p>
<i class="icon icon-menu-close" @click="dropOrHide"></i>
</div>
<div class="dropdown-content">
<div class="item">
<div class="item-image">
<img />
</div>
<div class="item-details">
<div class="item-name">Some Item Name</div>
<div class="item-price">$ Some Price</div>
<div class="item-qty">Some Quantity</div>
</div>
</div>
</div>
<div class="dropdown-footer">
<a href="/">View Shopping Cart</a>
<button class="btn btn-primary btn-lg">CHECKOUT</button>
</div>
</div>
</div>
</template>
<script>
// define the item component
export default {
props: {
items: Array,
},
data(){
return {
toggle: true,
totalitems: 0,
cart_items: []
};
},
computed: {
makeDropdown() {
}
},
mounted: function() {
if(this.items != undefined)
this.initializeDropdown();
},
methods: {
dropOrHide: function() {
if(this.toggle == false) {
this.toggle = true;
} else {
this.toggle = false;
}
},
initializeDropdown: function() {
this.totalitems = this.items.length;
}
}
}
</script>
<style>
.show {
display: none;
}
.dropdown-cart {
position: absolute;
background: #FFFFFF;
border: 1px solid #E8E8E8;
box-shadow: 1px 3px 6px 0 rgba(0,0,0,0.40);
padding: 20px;
border-radius: 1px;
right: 10%;
top: 75px;
width: 387px;
z-index: 5;
}
.dropdown-cart > .dropdown-header {
width: 100%;
}
.dropdown-cart > .dropdown-header p{
display: inline;
line-height: 25px;
}
.dropdown-cart > .dropdown-header i{
cursor: pointer;
float: right;
height: 22px;
width: 22px;
}
.dropdown-content {
padding-top: 10px;
padding-bottom: 10px;
}
.dropdown-content .item{
display: flex;
flex-direction: row;
border-bottom: 1px solid #E8E8E8;
}
.dropdown-content .item img{
height: 75px;
width: 75px;
margin-right: 8px;
}
.item-details .item-name {
font-size: 16px;
font-weight: bold;
margin-bottom: 10px;
}
.item-details .item-price {
margin-bottom: 10px;
}
.item-details .item-qty {
margin-bottom: 10px;
}
.dropdown-footer {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
}
.dropdown-footer button {
border-radius: 0px;
}
</style>

View File

@ -29,7 +29,6 @@ export default {
computed: {
haveChildren() {
console.log(this.item);
return this.item.children.length ? true : false;
}
}

View File

@ -22,6 +22,7 @@ body {
.header {
margin-top: 16px;
margin-bottom: 21px;
user-select: none;
.header-top {
margin-bottom: 16px;
@ -294,7 +295,6 @@ body {
.nav li li:hover > a:first-child:nth-last-child(2):before {
right: 10px;
}
}
}
@ -311,7 +311,7 @@ body {
.header-top {
margin-bottom: 16px;
display: flex;
max-width: 92%;
// max-width: 92%;
width: 100%;
margin-left: auto;
margin-right: auto;
@ -483,7 +483,7 @@ body {
.header-top {
margin-bottom: 16px;
display: flex;
max-width: 92%;
// max-width: 92%;
width: 100%;
margin-left: auto;
margin-right: auto;
@ -1228,7 +1228,6 @@ section.slider-block {
}
}
.product-price {
font-size: 16px;
margin-bottom: 14px;
@ -3202,87 +3201,95 @@ section.cart {
}
}
// responsive order css end here
// checkout starts here
.checkout-process{
display: flex;
flex-direction: row;
width: 100%;
margin-top:3%;
margin-top: 20px;
margin-bottom: 20px;
.left-side {
width: 67%;
margin-right: 8%;
height: 100px;
.col-main {
width: 65%;
padding-right: 40px;
.checkout-menu {
ul.checkout-steps {
width: 100%;
display: inline-flex;
justify-content: space-between;
width: 100%;
padding-bottom: 15px;
border-bottom: 1px solid #E8E8E8;;
ul.checkout-detail {
height: 60px;
display: inline-flex;
justify-content: space-between;
width: 100%;
padding: 5px;
li {
height: 48px;
display:flex;
li {
.decorator {
height: 48px;
width: 48px;
border: 1px solid black;
border-radius: 50%;
display: inline-flex;
border: 1px solid #E8E8E8;
.wrapper {
display:flex;
img {
margin: auto;
}
}
.decorator {
height: 48px;
width: 48px;
border: 1px solid black;
border-radius: 50%;
display: inline-flex;
border: 1px solid #E8E8E8;
img {
margin: auto;
}
}
span {
margin-left: 7px;
margin-top: auto;
margin-bottom: auto;
font-size: 16px;
}
.decorator.active {
border: 1px solid blue;
}
span {
margin-left: 7px;
margin-top: auto;
margin-bottom: auto;
font-size: 16px;
}
&.active {
color: #2650EF;
.decorator {
border: 1px solid #2650EF;
}
}
}
}
.horizontal-rule {
margin-top: 1%;
.step-content {
padding-top: 20px;
.form-header {
width: 100%;
height: 1px;
vertical-align: middle;
background: #e8e8e8;
display: inline-block;
h1 {
float: left;
}
.btn {
float: right;
}
}
.form-container {
border-bottom: 1px solid #E8E8E8;
padding-top: 20px;
padding-bottom: 20px;
}
}
}
.right-side {
height: 300px;
width: 300px;
.col-right {
width: 35%;
padding-left: 40px;
.purchase-detail {
margin-top:22px;
margin-left:18px;
.order-summary {
.price {
span{
span {
margin-left: 3px;
font-size: 16px;
color: #242424;
@ -3290,7 +3297,6 @@ section.cart {
}
}
.item-detail {
margin-top:12px;
@ -3301,8 +3307,9 @@ section.cart {
font-size: 16px;
color: #242424;
}
.right {
float:right;
float: right;
font-size: 16px;
color: #242424;
}
@ -3318,7 +3325,7 @@ section.cart {
}
.payble-amount {
margin-top:12px;
margin-top: 12px;
span {
margin-left: 3px;
@ -3329,6 +3336,7 @@ section.cart {
color: #242424;
font-weight: bold;
}
.right {
float:right;
@ -3339,68 +3347,6 @@ section.cart {
}
}
}
}
.order-info{
width: 67%;
margin-right: 6%;
height: 1350px;
margin-top: -190px;
.order-guest {
.order-text{
font-size: 24px;
color: #242424;
letter-spacing: -0.58px;
font-weight: bold;
}
}
.sign-in {
float:right;
}
.control-group {
margin-top:30px;
label {
font-size:14px;
}
.control {
width:600px;
}
span {
color:red;
}
}
.different-billing-addr {
margin-top: 5%;
span {
font-size: 16px;
color: #242424;
letter-spacing: -0.38px;
}
}
.horizontal-rule {
margin-top: 6%;
width: 100%;
height: 1px;
vertical-align: middle;
background: #e8e8e8;
}
.countinue-button {
margin-top: 3%;
}
}
// checkout ends here
@ -3408,10 +3354,9 @@ section.cart {
// responsive checkout start here
@media all and (max-width: 480px) {
.checkout-process{
width: 100%;
margin-top:3%;
margin-top: 3%;
.left-side {
width: 100%;
@ -3430,12 +3375,11 @@ section.cart {
height: 48px;
.wrapper {
display:flex;
display: flex;
span {
display: none;
}
}
}
@ -3456,7 +3400,7 @@ section.cart {
}
.right-side {
display:none;
display: none;
}
}
@ -3566,96 +3510,11 @@ section.cart {
}
}
}
// responsive checkout end here
// sign of checkout starts here
.signin-form{
width: 67%;
margin-right: 6%;
height: 520px;
margin-top: -190px;
.signin-guest {
.signin-text{
font-size: 24px;
color: #242424;
letter-spacing: -0.58px;
font-weight: bold;
}
}
.order-button {
float:right;
background: #0031F0;
font-size: 14px;
color: #FFFFFF;
letter-spacing: -0.26px;
text-align: center;
height: 38px;
width: 153px;
border: none;
}
.control-group {
margin-top:30px;
label {
font-size:14px;
}
.control {
width:600px;
}
span {
color:red;
}
}
.forgot-pass {
span {
font-size: 16px;
color: #0031F0;
letter-spacing: -0.38px;
}
}
.horizontal-rule {
margin-top: 6%;
width: 100%;
height: 1px;
vertical-align: middle;
background: #e8e8e8;
}
.countinue-button {
margin-top: 3%;
button {
background: #0031F0;
font-size: 14px;
color: #FFFFFF;
letter-spacing: -0.26px;
text-align: center;
height: 38px;
width: 137px;
border: none;
}
}
}
// sign checkout end here
//shipment start here
.ship-method {
width: 67%;
margin-right: 6%;
@ -3731,11 +3590,9 @@ section.cart {
}
}
}
//shipment end here
// payment method start here
.payment-method {
width: 67%;
margin-right: 6%;
@ -3823,12 +3680,10 @@ section.cart {
}
}
}
// payment method end here
// complete page start here
.complete-page{
width:880px;
height: 1050px;
@ -4184,12 +4039,10 @@ section.cart {
}
}
}
// complete page end here
// review page start here
section.review {
font-size: 16px;
color: $product-font-color;

View File

@ -3,7 +3,7 @@
background-size: cover;
}
.dropdown-right-icon{
.dropdown-right-icon {
background-image:URL('../images/icon-dropdown-left.svg');
width: 8px;
height: 8px;
@ -11,6 +11,14 @@
margin-bottom: 2px;
}
.icon-menu-close {
background-image:URL('../images/icon-menu-close.svg');
width: 8px;
height: 8px;
margin-left:auto;
margin-bottom: 2px;
}
.grid-view-icon {
background-image:URL('../images/icon-grid-view.svg');
width: 24px;

View File

@ -6,6 +6,7 @@ return [
'account_exists' => 'Already have an account',
'title' => 'Sign In'
],
'signup-form' => [
'title' => 'Sign Up',
'firstname' => 'First Name',
@ -19,10 +20,12 @@ return [
'conditions' => 'Conditions',
'using' => 'by using this website'
],
'login-text' => [
'no_account' => 'Don\'t have account',
'title' => 'Sign In',
],
'login-form' => [
'title' => 'Sign Up',
'email' => 'E-Mail',
@ -53,5 +56,35 @@ return [
'reviews-title' => 'Ratings & Reviews',
'write-review-btn' => 'Write Review',
'choose-option' => 'Choose an option'
],
'checkout' => [
'cart' => [
],
'onepage' => [
'title' => 'Checkout',
'information' => 'Information',
'shipping' => 'Shipping',
'payment' => 'Payment',
'complete' => 'Complete',
'billing-address' => 'Billing Address',
'sign-in' => 'Sign In',
'first-name' => 'First Name',
'last-name' => 'Last Name',
'email' => 'Email',
'address1' => 'Address',
'address2' => 'Address 2',
'city' => 'City',
'state' => 'State',
'postcode' => 'Zip/Postcode',
'phone' => 'Telephone',
'country' => 'Country',
'order-summary' => 'Order Summary',
'shipping-address' => 'Shipping Address',
'use_for_shipping' => 'Ship to this address',
'continue' => 'Continue'
]
]
];

View File

@ -0,0 +1,121 @@
@extends('shop::layouts.master')
@section('page_title')
{{ __('shop::app.checkout.onepage.title') }}
@stop
@section('content-wrapper')
<checkout></checkout>
@endsection
@push('scripts')
<script type="text/x-template" id="checkout-template">
<div id="checkout" class="checkout-process">
<div class="col-main">
<ul class="checkout-steps">
<li class="active">
<div class="decorator">
<img src="{{ bagisto_asset('images/address.svg') }}" />
</div>
<span>{{ __('shop::app.checkout.onepage.information') }}</span>
</li>
<li>
<div class="decorator">
<img src="{{ bagisto_asset('images/shipping.svg') }}" />
</div>
<span>{{ __('shop::app.checkout.onepage.shipping') }}</span>
</li>
<li>
<div class="decorator">
<img src="{{ bagisto_asset('images/payment.svg') }}" />
</div>
<span>{{ __('shop::app.checkout.onepage.payment') }}</span>
</li>
<li>
<div class="decorator">
<img src="{{ bagisto_asset('images/finish.svg') }}" />
</div>
<span>{{ __('shop::app.checkout.onepage.complete') }}</span>
</li>
</ul>
<div class="step-content information">
@include('shop::checkout.onepage.customer-info')
<div class="button-group">
<button type="button" class="btn btn-lg btn-primary" @click="validateForm('address-form')">
{{ __('shop::app.checkout.onepage.continue') }}
</button>
</div>
</div>
</div>
<div class="step-content shipping">
</div>
<div class="step-content payment">
</div>
<div class="step-content review">
</div>
@include('shop::checkout.onepage.summary')
</div>
</script>
<script>
Vue.component('checkout', {
template: '#checkout-template',
inject: ['$validator'],
data: () => ({
billing: {
use_for_shipping: true
},
shipping: {},
}),
created () {
},
methods: {
validateForm: function (scope) {
this.$validator.validateAll(scope).then((result) => {
if(result) {
this.saveAddress()
}
});
},
saveAddress () {
// this.$http.get('https://api.coindesk.com/v1/bpi/currentprice.json')
// .then(function(response) {
// console.log(response)
// })
}
}
})
</script>
@endpush

View File

@ -0,0 +1,278 @@
<form data-vv-scope="address-form">
<div class="form-container">
<div class="form-header">
<h1>{{ __('shop::app.checkout.onepage.billing-address') }}</h1>
<a href="{{ route('customer.session.index') }}" class="btn btn-lg btn-primary">
{{ __('shop::app.checkout.onepage.sign-in') }}
</a>
</div>
<div class="control-group" :class="[errors.has('address-form.billing[first_name]') ? 'has-error' : '']">
<label for="billing[first_name]" class="required">
{{ __('shop::app.checkout.onepage.first-name') }}
</label>
<input type="text" v-validate="'required'" class="control" id="billing[first_name]" name="billing[first_name]" v-model="billing.first_name"/>
<span class="control-error" v-if="errors.has('address-form.billing[first_name]')">
@{{ errors.first('address-form.billing[first_name]') }}
</span>
</div>
<div class="control-group" :class="[errors.has('address-form.billing[last_name]') ? 'has-error' : '']">
<label for="billing[last_name]" class="required">
{{ __('shop::app.checkout.onepage.last-name') }}
</label>
<input type="text" v-validate="'required'" class="control" id="billing[last_name]" name="billing[last_name]" v-model="billing.last_name"/>
<span class="control-error" v-if="errors.has('address-form.billing[last_name]')">
@{{ errors.first('address-form.billing[last_name]') }}
</span>
</div>
<div class="control-group" :class="[errors.has('address-form.billing[email]') ? 'has-error' : '']">
<label for="billing[email]" class="required">
{{ __('shop::app.checkout.onepage.email') }}
</label>
<input type="text" v-validate="'required'" class="control" id="billing[email]" name="billing[email]" v-model="billing.email"/>
<span class="control-error" v-if="errors.has('address-form.billing[email]')">
@{{ errors.first('address-form.billing[email]') }}
</span>
</div>
<div class="control-group" :class="[errors.has('address-form.billing[address1]') ? 'has-error' : '']">
<label for="billing[address1]" class="required">
{{ __('shop::app.checkout.onepage.address1') }}
</label>
<input type="text" v-validate="'required'" class="control" id="billing[address1]" name="billing[address1]" v-model="billing.address1"/>
<span class="control-error" v-if="errors.has('address-form.billing[address1]')">
@{{ errors.first('address-form.billing[address1]') }}
</span>
</div>
<div class="control-group">
<label for="billing[address2]">
{{ __('shop::app.checkout.onepage.address2') }}
</label>
<input type="text" class="control" id="billing[address2]" name="billing[address2]" v-model="billing.address2"/>
</div>
<div class="control-group" :class="[errors.has('address-form.billing[city]') ? 'has-error' : '']">
<label for="billing[city]" class="required">
{{ __('shop::app.checkout.onepage.city') }}
</label>
<input type="text" v-validate="'required'" class="control" id="billing[city]" name="billing[city]" v-model="billing.city"/>
<span class="control-error" v-if="errors.has('address-form.billing[city]')">
@{{ errors.first('address-form.billing[city]') }}
</span>
</div>
<div class="control-group" :class="[errors.has('address-form.billing[state]') ? 'has-error' : '']">
<label for="billing[state]" class="required">
{{ __('shop::app.checkout.onepage.state') }}
</label>
<input type="text" v-validate="'required'" class="control" id="billing[state]" name="billing[state]" v-model="billing.state"/>
<span class="control-error" v-if="errors.has('address-form.billing[state]')">
@{{ errors.first('address-form.billing[state]') }}
</span>
</div>
<div class="control-group" :class="[errors.has('address-form.billing[postcode]') ? 'has-error' : '']">
<label for="billing[postcode]" class="required">
{{ __('shop::app.checkout.onepage.postcode') }}
</label>
<input type="text" v-validate="'required'" class="control" id="billing[postcode]" name="billing[postcode]" v-model="billing.postcode"/>
<span class="control-error" v-if="errors.has('address-form.billing[postcode]')">
@{{ errors.first('address-form.billing[postcode]') }}
</span>
</div>
<div class="control-group" :class="[errors.has('address-form.billing[phone]') ? 'has-error' : '']">
<label for="billing[phone]" class="required">
{{ __('shop::app.checkout.onepage.phone') }}
</label>
<input type="text" v-validate="'required'" class="control" id="billing[phone]" name="billing[phone]" v-model="billing.phone"/>
<span class="control-error" v-if="errors.has('address-form.billing[phone]')">
@{{ errors.first('address-form.billing[phone]') }}
</span>
</div>
<div class="control-group" :class="[errors.has('address-form.billing[country]') ? 'has-error' : '']">
<label for="billing[country]" class="required">
{{ __('shop::app.checkout.onepage.country') }}
</label>
<select type="text" v-validate="'required'" class="control" id="billing[country]" name="billing[country]" v-model="billing.country">
<option value=""></option>
@foreach (country()->all() as $code => $country)
<option value="{{ $country}}">{{ $country }}</option>
@endforeach
</select>
<span class="control-error" v-if="errors.has('address-form.billing[country]')">
@{{ errors.first('address-form.billing[country]') }}
</span>
</div>
<div class="control-group">
<span class="checkbox">
<input type="checkbox" id="billing[use_for_shipping]" name="billing[use_for_shipping]" v-model="billing.use_for_shipping"/>
<label class="checkbox-view" for="billing[use_for_shipping]"></label>
{{ __('shop::app.checkout.onepage.use_for_shipping') }}
</span>
</div>
</div>
<div class="form-container" v-if="!billing.use_for_shipping">
<div class="form-header">
<h1>{{ __('shop::app.checkout.onepage.shipping-address') }}</h1>
</div>
<div class="control-group" :class="[errors.has('address-form.shipping[first_name]') ? 'has-error' : '']">
<label for="shipping[first_name]" class="required">
{{ __('shop::app.checkout.onepage.first-name') }}
</label>
<input type="text" v-validate="'required'" class="control" id="shipping[first_name]" name="shipping[first_name]" v-model="shipping.first_name"/>
<span class="control-error" v-if="errors.has('address-form.shipping[first_name]')">
@{{ errors.first('address-form.shipping[first_name]') }}
</span>
</div>
<div class="control-group" :class="[errors.has('address-form.shipping[last_name]') ? 'has-error' : '']">
<label for="shipping[last_name]" class="required">
{{ __('shop::app.checkout.onepage.last-name') }}
</label>
<input type="text" v-validate="'required'" class="control" id="shipping[last_name]" name="shipping[last_name]" v-model="shipping.last_name"/>
<span class="control-error" v-if="errors.has('address-form.shipping[last_name]')">
@{{ errors.first('address-form.shipping[last_name]') }}
</span>
</div>
<div class="control-group" :class="[errors.has('address-form.shipping[email]') ? 'has-error' : '']">
<label for="shipping[email]" class="required">
{{ __('shop::app.checkout.onepage.email') }}
</label>
<input type="text" v-validate="'required'" class="control" id="shipping[email]" name="shipping[email]" v-model="shipping.email"/>
<span class="control-error" v-if="errors.has('address-form.shipping[email]')">
@{{ errors.first('address-form.shipping[email]') }}
</span>
</div>
<div class="control-group" :class="[errors.has('address-form.shipping[address1]') ? 'has-error' : '']">
<label for="shipping[address1]" class="required">
{{ __('shop::app.checkout.onepage.address1') }}
</label>
<input type="text" v-validate="'required'" class="control" id="shipping[address1]" name="shipping[address1]" v-model="shipping.address1"/>
<span class="control-error" v-if="errors.has('address-form.shipping[address1]')">
@{{ errors.first('address-form.shipping[address1]') }}
</span>
</div>
<div class="control-group">
<label for="shipping[address2]">
{{ __('shop::app.checkout.onepage.address2') }}
</label>
<input type="text" class="control" id="shipping[address2]" name="shipping[address2]" v-model="shipping.address2"/>
</div>
<div class="control-group" :class="[errors.has('address-form.shipping[city]') ? 'has-error' : '']">
<label for="shipping[city]" class="required">
{{ __('shop::app.checkout.onepage.city') }}
</label>
<input type="text" v-validate="'required'" class="control" id="shipping[city]" name="shipping[city]" v-model="shipping.city"/>
<span class="control-error" v-if="errors.has('address-form.shipping[city]')">
@{{ errors.first('address-form.shipping[city]') }}
</span>
</div>
<div class="control-group" :class="[errors.has('address-form.shipping[state]') ? 'has-error' : '']">
<label for="shipping[state]" class="required">
{{ __('shop::app.checkout.onepage.state') }}
</label>
<input type="text" v-validate="'required'" class="control" id="shipping[state]" name="shipping[state]" v-model="shipping.state"/>
<span class="control-error" v-if="errors.has('address-form.shipping[state]')">
@{{ errors.first('address-form.shipping[state]') }}
</span>
</div>
<div class="control-group" :class="[errors.has('address-form.shipping[postcode]') ? 'has-error' : '']">
<label for="shipping[postcode]" class="required">
{{ __('shop::app.checkout.onepage.postcode') }}
</label>
<input type="text" v-validate="'required'" class="control" id="shipping[postcode]" name="shipping[postcode]" v-model="shipping.postcode"/>
<span class="control-error" v-if="errors.has('address-form.shipping[postcode]')">
@{{ errors.first('address-form.shipping[postcode]') }}
</span>
</div>
<div class="control-group" :class="[errors.has('address-form.shipping[phone]') ? 'has-error' : '']">
<label for="shipping[phone]" class="required">
{{ __('shop::app.checkout.onepage.phone') }}
</label>
<input type="text" v-validate="'required'" class="control" id="shipping[phone]" name="shipping[phone]" v-model="shipping.phone"/>
<span class="control-error" v-if="errors.has('address-form.shipping[phone]')">
@{{ errors.first('address-form.shipping[phone]') }}
</span>
</div>
<div class="control-group" :class="[errors.has('address-form.shipping[country]') ? 'has-error' : '']">
<label for="shipping[country]" class="required">
{{ __('shop::app.checkout.onepage.country') }}
</label>
<select type="text" v-validate="'required'" class="control" id="shipping[country]" name="shipping[country]" v-model="shipping.country">
<option value=""></option>
@foreach (country()->all() as $code => $country)
<option value="{{ $country}}">{{ $country }}</option>
@endforeach
</select>
<span class="control-error" v-if="errors.has('address-form.shipping[country]')">
@{{ errors.first('address-form.shipping[country]') }}
</span>
</div>
</div>
</form>

View File

@ -0,0 +1,37 @@
<div class="col-right">
<div class="order-summary">
<div class="price">
<span>{{ __('shop::app.checkout.onepage.order-summary') }}</span>
</div>
<div class="item-detail">
<span>
<label>2 Items Price</label>
<label class="right">$ 2,506.00</label>
</span>
</div>
<div class="item-detail">
<span>
<label>Delivery Charges</label>
<label class="right">$ 40.00</label>
</span>
</div>
<div class="item-detail">
<span>
<label>Coupan Discount</label>
<label class="right">$ 25.00</label>
</span>
</div>
<div class="horizontal-rule">
</div>
<div class="payble-amount">
<span>
<label>Amount Payble</label>
<label class="right">$ 2571.00</label>
</span>
</div>
</div>
</div>

View File

@ -1,37 +1,3 @@
<div class="right-side">
<div class="purchase-detail">
<div class="price">
<span>Price Detail</span>
</div>
<div class="item-detail">
<span>
<label>2 Items Price</label>
<label class="right">$ 2,506.00</label>
</span>
</div>
<div class="item-detail">
<span>
<label>Delivery Charges</label>
<label class="right">$ 40.00</label>
</span>
</div>
<div class="item-detail">
<span>
<label>Coupan Discount</label>
<label class="right">$ 25.00</label>
</span>
</div>
<div class="horizontal-rule">
</div>
<div class="payble-amount">
<span>
<label>Amount Payble</label>
<label class="right">$ 2571.00</label>
</span>
</div>
</div>
</div>

View File

@ -45,15 +45,12 @@
}else{
this.isGuest=true;
this.disabled=1;
console.log(this.disabled);
}
} ,
methods: {
count () {
this.isShipMethod=true;
console.log(this.isShipMethod)
}
}

View File

@ -1,7 +1,5 @@
<div class="header" id="header">
<div class="header-top">
<div class="left-content">
<ul class="logo-container">
@ -57,6 +55,7 @@
<ul>
<li><a href="{{ route('customer.session.index') }}">Sign In</a></li>
<li><a href="{{ route('customer.register.index') }}">Sign Up</a></li>
</ul>
@ -66,18 +65,20 @@
@endguest
@auth('customer')
<div class="dropdown-list bottom-right" style="display: none;">
<div class="dropdown-container">
<label>Account</label>
<ul>
<li><a href="{{ route('customer.account.index') }}">Account</a></li>
<li><a href="{{ route('customer.profile.index') }}">Profile</a></li>
<li><a href="{{ route('customer.address.index') }}">Address</a></li>
<li><a href="{{ route('customer.wishlist.index') }}">Wishlist</a></li>
<li><a href="{{ route('customer.cart') }}">Cart</a></li>
{{-- <li><a href="{{ route('customer.cart') }}">Cart</a></li> --}}
<li><a href="{{ route('customer.orders.index') }}">Orders</a></li>
<li><a href="{{ route('customer.session.destroy') }}">Logout</a></li>
</ul>
@ -90,21 +91,7 @@
</ul>
<ul class="cart-dropdown">
<li class="cart-summary">
<span class="icon cart-icon"></span>
<span class="cart"><span class="cart-count">5</span>Products</span>
<span class="icon arrow-down-icon"></span>
</li>
</ul>
<cart-dropdown @if(isset($cart)) :items='@json($cart)' @endif></cart-dropdown>
{{-- Meant for responsive views only --}}
<ul class="ham-dropdown-container">
@ -138,13 +125,13 @@
</div>
<div class="suggestion">
<span> designer sarees </span>
<span>Designer sarees</span>
</div>
<div class="suggestion">
<span> India patter sarees </span>
<span>India patter sarees</span>
</div>
<div class="suggestion">
<span> Border Sarees </span>
<span>Border Sarees</span>
</div>
</div>
@ -155,93 +142,7 @@
</div>
@push('scripts')
<script>
window.onload = function() {
var sort = document.getElementById("sortable");
var search = document.getElementById("search");
sort.addEventListener("click", myFunction);
search.addEventListener("click", myFunction);
// function for changing icon for responsive header
function myFunction(){
let className = document.getElementById(this.id).className;
let slider = document.getElementsByClassName("slider-block");
let feature = document.getElementsByClassName("featured-products");
let newUpdate = document.getElementsByClassName("news-update");
for (let i=0 ; i < slider.length ; i++){
slider[i].style.display="none";
}
for (let i=0 ; i < feature.length ; i++){
feature[i].style.display="none";
}
for (let i=0 ; i < newUpdate.length ; i++){
newUpdate[i].style.display="none";
}
if( className == 'icon search-icon') {
search.classList.remove('icon', 'search-icon');
search.classList.add('icon', 'cross-icon');
sort.classList.remove('icon', 'cross-icon');
sort.classList.remove('icon', 'sortable-icon');
sort.classList.add('icon', 'sortable-icon');
document.getElementsByClassName("header-bottom")[0].style.display="none";
document.getElementsByClassName("search-suggestion")[0].style.display="block";
}else if ( className == 'icon sortable-icon'){
sort.classList.remove('icon', 'sortable-icon');
sort.classList.add('icon', 'cross-icon');
search.classList.remove('icon', 'cross-icon');
search.classList.remove('icon', 'search-icon');
search.classList.add('icon', 'search-icon');
document.getElementsByClassName("header-bottom")[0].style.display="block";
document.getElementsByClassName("search-suggestion")[0].style.display="none";
} else {
sort.classList.remove('icon', 'cross-icon');
search.classList.remove('icon', 'cross-icon');
sort.classList.remove('icon', 'sortable-icon');
search.classList.remove('icon', 'search-icon');
sort.classList.add('icon', 'sortable-icon');
search.classList.add('icon', 'search-icon');
document.getElementsByClassName("header-bottom")[0].style.display="none";
document.getElementsByClassName("search-suggestion")[0].style.display="none";
let slider = document.getElementsByClassName("slider-block");
let feature = document.getElementsByClassName("featured-products");
let newUpdate = document.getElementsByClassName("news-update");
for (let i=0 ; i < slider.length ; i++){this.id
slider[i].style.display="block";
}
for (let i=0 ; i < feature.length ; i++){
feature[i].style.display="block";
}
for (let i=0 ; i < newUpdate.length ; i++){
newUpdate[i].style.display="block";
}
}
}
}
</script>
@endpush

View File

@ -2,6 +2,6 @@
@include ('shop::products.add-to-cart', ['product' => $product])
<span><img src="{{ bagisto_asset('images/wishlist.svg') }}" /></span>
<span class="wishlist"><img src="{{ bagisto_asset('images/wishlist.svg') }}" /></span>
</div>

View File

@ -133,7 +133,6 @@
for(var key in percentage){
width= percentage[key] * 1.58;
let id =key + 'star';
console.log(id);
document.getElementById(key).style.width = width + "px";
document.getElementById(key).style.height = 4 + "px";
document.getElementById(id).innerHTML = i + '\xa0\xa0' + "star";

View File

@ -1,5 +1,10 @@
@extends('shop::layouts.master')
@section('page_title')
{{ $product->name }}
@stop
@section('content-wrapper')
<section class="product-detail">
<div class="category-breadcrumbs">
@ -8,7 +13,6 @@
</div>
<div class="layouter">
{{-- {{ dd(session()->getId()) }} --}}
<form method="POST" action="{{ route('cart.add', $product->id) }}">
@csrf()

View File

@ -2,7 +2,20 @@
@inject ('configurableOptionHelper', 'Webkul\Product\Product\ConfigurableOption')
<product-options></product-options>
<product-options>
<!--<div class="attribute control-group has-error">
<label class="reqiured">Color</label>
<select name="super_attribute[104]" id="attribute_104" class="control" data-vv-id="1" aria-required="true" aria-invalid="true">
<option value="">Choose an option</option>
</select>
</div>
<div class="attribute control-group">
<label class="reqiured">Size</label>
<select name="super_attribute[105]" disabled="disabled" id="attribute_105" class="control" data-vv-id="2" aria-required="true" aria-invalid="false">
</select>
</div>-->
</product-options>
@push('scripts')

View File

@ -65,7 +65,6 @@
},
created () {
console.log(this.images[0])
this.changeImage(this.images[0])
this.prepareThumbs()

View File

@ -5,7 +5,7 @@
class='alert-wrapper'
>
<flash
v-for='(flash, index) in flashes'
v-for='(flash) in flashes'
:key='flash.uid'
:flash="flash"
@onRemoveFlash="removeFlash($event)"

View File

@ -452,6 +452,11 @@ h2 {
}
}
.button-group {
margin-top: 20px;
margin-bottom: 20px;
}
.alert-wrapper {
width: 300px;
top: 10px;

View File

@ -105,13 +105,13 @@
<th class="grid_head" data-column-name="{{ $column->alias }}" data-column-label="{{ $column->label }}">{!! $column->sorting() !!}</th>
@endif
@endforeach
@if(isset($attribute_columns))
{{-- @if(isset($attribute_columns))
@foreach($attribute_columns as $key => $value)
<th>
{{ $value }}
</th>
@endforeach
@endif
@endif --}}
<th>
Actions
</th>
@ -131,11 +131,11 @@
<td class="">{!! $column->render($result) !!}</td>
@endforeach
@if(isset($attribute_columns))
{{-- @if(isset($attribute_columns))
@foreach ($attribute_columns as $atc)
<td>{{ $result->{$atc} }}</td>
@endforeach
@endif
@endif --}}
<td class="action">
@foreach($actions as $action)

View File

@ -14,7 +14,7 @@ mix.js(
],
"js/ui.js"
)
// .copy(__dirname + "/src/Resources/assets/images", publicPath + "/images")
.copy(__dirname + "/src/Resources/assets/images", publicPath + "/images")
.sass(__dirname + "/src/Resources/assets/sass/app.scss", "css/ui.css")
.options({
processCssUrls: false

View File

@ -11,6 +11,14 @@
margin-bottom: 2px;
}
.icon-menu-close {
background-image: URL("../images/icon-menu-close.svg");
width: 8px;
height: 8px;
margin-left: auto;
margin-bottom: 2px;
}
.grid-view-icon {
background-image: URL("../images/icon-grid-view.svg");
width: 24px;
@ -64,6 +72,10 @@ body {
.header {
margin-top: 16px;
margin-bottom: 21px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.header .header-top {
@ -404,7 +416,6 @@ body {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
max-width: 92%;
width: 100%;
margin-left: auto;
margin-right: auto;
@ -557,7 +568,6 @@ body {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
max-width: 92%;
width: 100%;
margin-left: auto;
margin-right: auto;
@ -2996,21 +3006,17 @@ section.cart .cart-content .right-side .coupon-section .after-coupon-amount .amo
-ms-flex-direction: row;
flex-direction: row;
width: 100%;
margin-top: 3%;
margin-top: 20px;
margin-bottom: 20px;
}
.checkout-process .left-side {
width: 67%;
margin-right: 8%;
height: 100px;
.checkout-process .col-main {
width: 65%;
padding-right: 40px;
}
.checkout-process .left-side .checkout-menu {
.checkout-process .col-main ul.checkout-steps {
width: 100%;
}
.checkout-process .left-side .checkout-menu ul.checkout-detail {
height: 60px;
display: -webkit-inline-box;
display: -ms-inline-flexbox;
display: inline-flex;
@ -3018,20 +3024,18 @@ section.cart .cart-content .right-side .coupon-section .after-coupon-amount .amo
-ms-flex-pack: justify;
justify-content: space-between;
width: 100%;
padding: 5px;
padding-bottom: 15px;
border-bottom: 1px solid #E8E8E8;
}
.checkout-process .left-side .checkout-menu ul.checkout-detail li {
.checkout-process .col-main ul.checkout-steps li {
height: 48px;
}
.checkout-process .left-side .checkout-menu ul.checkout-detail li .wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
.checkout-process .left-side .checkout-menu ul.checkout-detail li .wrapper .decorator {
.checkout-process .col-main ul.checkout-steps li .decorator {
height: 48px;
width: 48px;
border: 1px solid black;
@ -3042,66 +3046,80 @@ section.cart .cart-content .right-side .coupon-section .after-coupon-amount .amo
border: 1px solid #E8E8E8;
}
.checkout-process .left-side .checkout-menu ul.checkout-detail li .wrapper .decorator img {
.checkout-process .col-main ul.checkout-steps li .decorator img {
margin: auto;
}
.checkout-process .left-side .checkout-menu ul.checkout-detail li .wrapper .decorator.active {
border: 1px solid blue;
}
.checkout-process .left-side .checkout-menu ul.checkout-detail li .wrapper span {
.checkout-process .col-main ul.checkout-steps li span {
margin-left: 7px;
margin-top: auto;
margin-bottom: auto;
font-size: 16px;
}
.checkout-process .left-side .checkout-menu .horizontal-rule {
margin-top: 1%;
.checkout-process .col-main ul.checkout-steps li.active {
color: #2650EF;
}
.checkout-process .col-main ul.checkout-steps li.active .decorator {
border: 1px solid #2650EF;
}
.checkout-process .col-main .step-content {
padding-top: 20px;
}
.checkout-process .col-main .step-content .form-header {
width: 100%;
height: 1px;
vertical-align: middle;
background: #e8e8e8;
display: inline-block;
}
.checkout-process .right-side {
height: 300px;
width: 300px;
.checkout-process .col-main .step-content .form-header h1 {
float: left;
}
.checkout-process .right-side .purchase-detail {
margin-top: 22px;
margin-left: 18px;
.checkout-process .col-main .step-content .form-header .btn {
float: right;
}
.checkout-process .right-side .purchase-detail .price span {
.checkout-process .col-main .step-content .form-container {
border-bottom: 1px solid #E8E8E8;
padding-top: 20px;
padding-bottom: 20px;
}
.checkout-process .col-right {
width: 35%;
padding-left: 40px;
}
.checkout-process .col-right .order-summary .price span {
margin-left: 3px;
font-size: 16px;
color: #242424;
font-weight: bold;
}
.checkout-process .right-side .purchase-detail .item-detail {
.checkout-process .col-right .order-summary .item-detail {
margin-top: 12px;
}
.checkout-process .right-side .purchase-detail .item-detail span {
.checkout-process .col-right .order-summary .item-detail span {
margin-left: 3px;
}
.checkout-process .right-side .purchase-detail .item-detail span label {
.checkout-process .col-right .order-summary .item-detail span label {
font-size: 16px;
color: #242424;
}
.checkout-process .right-side .purchase-detail .item-detail span .right {
.checkout-process .col-right .order-summary .item-detail span .right {
float: right;
font-size: 16px;
color: #242424;
}
.checkout-process .right-side .purchase-detail .horizontal-rule {
.checkout-process .col-right .order-summary .horizontal-rule {
margin-top: 6%;
width: 100%;
height: 1px;
@ -3109,83 +3127,27 @@ section.cart .cart-content .right-side .coupon-section .after-coupon-amount .amo
background: #e8e8e8;
}
.checkout-process .right-side .purchase-detail .payble-amount {
.checkout-process .col-right .order-summary .payble-amount {
margin-top: 12px;
}
.checkout-process .right-side .purchase-detail .payble-amount span {
.checkout-process .col-right .order-summary .payble-amount span {
margin-left: 3px;
font-weight: bold;
}
.checkout-process .right-side .purchase-detail .payble-amount span label {
.checkout-process .col-right .order-summary .payble-amount span label {
font-size: 16px;
color: #242424;
font-weight: bold;
}
.checkout-process .right-side .purchase-detail .payble-amount span .right {
.checkout-process .col-right .order-summary .payble-amount span .right {
float: right;
font-size: 16px;
color: #242424;
}
.order-info {
width: 67%;
margin-right: 6%;
height: 1350px;
margin-top: -190px;
}
.order-info .order-guest .order-text {
font-size: 24px;
color: #242424;
letter-spacing: -0.58px;
font-weight: bold;
}
.order-info .sign-in {
float: right;
}
.order-info .control-group {
margin-top: 30px;
}
.order-info .control-group label {
font-size: 14px;
}
.order-info .control-group .control {
width: 600px;
}
.order-info .control-group span {
color: red;
}
.order-info .different-billing-addr {
margin-top: 5%;
}
.order-info .different-billing-addr span {
font-size: 16px;
color: #242424;
letter-spacing: -0.38px;
}
.order-info .horizontal-rule {
margin-top: 6%;
width: 100%;
height: 1px;
vertical-align: middle;
background: #e8e8e8;
}
.order-info .countinue-button {
margin-top: 3%;
}
@media all and (max-width: 480px) {
.checkout-process {
width: 100%;
@ -3312,77 +3274,6 @@ section.cart .cart-content .right-side .coupon-section .after-coupon-amount .amo
}
}
.signin-form {
width: 67%;
margin-right: 6%;
height: 520px;
margin-top: -190px;
}
.signin-form .signin-guest .signin-text {
font-size: 24px;
color: #242424;
letter-spacing: -0.58px;
font-weight: bold;
}
.signin-form .order-button {
float: right;
background: #0031F0;
font-size: 14px;
color: #FFFFFF;
letter-spacing: -0.26px;
text-align: center;
height: 38px;
width: 153px;
border: none;
}
.signin-form .control-group {
margin-top: 30px;
}
.signin-form .control-group label {
font-size: 14px;
}
.signin-form .control-group .control {
width: 600px;
}
.signin-form .control-group span {
color: red;
}
.signin-form .forgot-pass span {
font-size: 16px;
color: #0031F0;
letter-spacing: -0.38px;
}
.signin-form .horizontal-rule {
margin-top: 6%;
width: 100%;
height: 1px;
vertical-align: middle;
background: #e8e8e8;
}
.signin-form .countinue-button {
margin-top: 3%;
}
.signin-form .countinue-button button {
background: #0031F0;
font-size: 14px;
color: #FFFFFF;
letter-spacing: -0.26px;
text-align: center;
height: 38px;
width: 137px;
border: none;
}
.ship-method {
width: 67%;
margin-right: 6%;

File diff suppressed because it is too large Load Diff

View File

@ -73,7 +73,7 @@
@else
<a href="{{ route('login') }}">Login</a>
<a href="{{ route('register') }}">Register</a>
@endauth
@endauthexample-component
</div>
@endif