resolve conflicts

This commit is contained in:
naresh verma 2019-10-21 13:38:29 +05:30
commit 2d2302c398
39 changed files with 905 additions and 40 deletions

View File

@ -62,7 +62,7 @@ Bagisto is using power of both of these frameworks and making best out of it out
### Requirements
* **OS**: Ubuntu 16.04 LTS or higher / Windows 7 or Higher (WAMP / XAMP).
* **OS**: Ubuntu 16.04 LTS or higher / Windows 7 or Higher (WampServer / XAMPP).
* **SERVER**: Apache 2 or NGINX.
* **RAM**: 3 GB or higher.
* **PHP**: 7.1.3 or higher.

View File

@ -7,6 +7,7 @@ use Webkul\Checkout\Repositories\CartRepository;
use Webkul\Checkout\Repositories\CartItemRepository;
use Webkul\API\Http\Resources\Checkout\Cart as CartResource;
use Cart;
use Webkul\Customer\Repositories\WishlistRepository;
/**
* Cart controller
@ -37,15 +38,24 @@ class CartController extends Controller
*/
protected $cartItemRepository;
/**
* WishlistRepository object
*
* @var Object
*/
protected $wishlistRepository;
/**
* Controller instance
*
* @param Webkul\Checkout\Repositories\CartRepository $cartRepository
* @param Webkul\Checkout\Repositories\CartItemRepository $cartItemRepository
* @param Webkul\Checkout\Repositories\WishlistRepository $wishlistRepository
*/
public function __construct(
CartRepository $cartRepository,
CartItemRepository $cartItemRepository
CartItemRepository $cartItemRepository,
WishlistRepository $wishlistRepository
)
{
$this->guard = request()->has('token') ? 'api' : 'customer';
@ -59,6 +69,8 @@ class CartController extends Controller
$this->cartRepository = $cartRepository;
$this->cartItemRepository = $cartItemRepository;
$this->wishlistRepository = $wishlistRepository;
}
/**
@ -97,6 +109,8 @@ class CartController extends Controller
], 400);
}
$this->wishlistRepository->deleteWhere(['product_id' => $id]);
Event::fire('checkout.cart.item.add.after', $result);
Cart::collectTotals();

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
{
"/js/admin.js": "/js/admin.js?id=d6734b45d4aa9b6502d9",
"/js/admin.js": "/js/admin.js?id=1a04ed2a8f0437dbe740",
"/css/admin.css": "/css/admin.css?id=c845e7c275d4df7fa03f"
}

View File

@ -106,6 +106,12 @@ return [
]
],
'channel_based' => true,
], [
'name' => 'admin_page_limit',
'title' => 'admin::app.admin.system.admin-page-limit',
'type' => 'text',
'validation' => 'required|numeric|max:2',
'channel_based' => true,
]
]
], [

View File

@ -0,0 +1,177 @@
<?php
namespace Webkul\Admin\DataGrids;
use DB;
use Webkul\Ui\DataGrid\DataGrid;
use Webkul\Customer\Repositories\CustomerRepository as Customer;
/**
* Address Data Grid class
*
* @author Vivek Sharma <viveksh047@webkul.com>
* @copyright 2019 Webkul Software Pvt Ltd (http://www.webkul.com)
*/
class AddressDataGrid extends DataGrid
{
/**
*
* @var integer
*/
public $index = 'address_id';
protected $sortOrder = 'desc'; //asc or desc
/**
* CustomerRepository object
*
* @var object
*/
protected $customer;
/**
* Create a new controller instance.
*
* @param Webkul\Customer\Repositories\CustomerRepository $customer
* @return void
*/
public function __construct(
Customer $customer
)
{
parent::__construct();
$this->customer = $customer;
}
public function prepareQueryBuilder()
{
$customer = $this->customer->find(request('id'));
$queryBuilder = DB::table('customer_addresses as ca')
->leftJoin('countries', 'ca.country', '=', 'countries.code')
->leftJoin('customers as c', 'ca.customer_id', '=', 'c.id')
->addSelect('ca.id as address_id', 'ca.address1', 'ca.country', DB::raw('countries.name as country_name'), 'ca.state', 'ca.city', 'ca.postcode', 'ca.phone', 'ca.default_address')
->where('c.id', $customer->id);
$queryBuilder = $queryBuilder->leftJoin('country_states', function($qb) {
$qb->on('ca.state', 'country_states.code')
->on('countries.id', 'country_states.country_id');
});
$queryBuilder
->groupBy('ca.id')
->addSelect(DB::raw('country_states.default_name as state_name'));
$this->addFilter('address_id', 'ca.id');
$this->addFilter('address1', 'ca.address1');
$this->addFilter('city', 'ca.city');
$this->addFilter('state_name', DB::raw('country_states.default_name'));
$this->addFilter('country_name', DB::raw('countries.name'));
$this->addFilter('postcode', 'ca.postcode');
$this->addFilter('default_address', 'ca.default_address');
$this->setQueryBuilder($queryBuilder);
}
public function addColumns()
{
$this->addColumn([
'index' => 'address_id',
'label' => trans('admin::app.customers.addresses.address-id'),
'type' => 'number',
'searchable' => true,
'sortable' => true,
'filterable' => true
]);
$this->addColumn([
'index' => 'address1',
'label' => trans('admin::app.customers.addresses.address-1'),
'type' => 'string',
'searchable' => true,
'sortable' => true,
'filterable' => true
]);
$this->addColumn([
'index' => 'city',
'label' => trans('admin::app.customers.addresses.city'),
'type' => 'string',
'searchable' => true,
'sortable' => true,
'filterable' => true
]);
$this->addColumn([
'index' => 'state_name',
'label' => trans('admin::app.customers.addresses.state-name'),
'type' => 'string',
'searchable' => true,
'sortable' => true,
'filterable' => true
]);
$this->addColumn([
'index' => 'country_name',
'label' => trans('admin::app.customers.addresses.country-name'),
'type' => 'string',
'searchable' => true,
'sortable' => true,
'filterable' => true
]);
$this->addColumn([
'index' => 'postcode',
'label' => trans('admin::app.customers.addresses.postcode'),
'type' => 'string',
'searchable' => true,
'sortable' => true,
'filterable' => true
]);
$this->addColumn([
'index' => 'default_address',
'label' => trans('admin::app.customers.addresses.default-address'),
'type' => 'boolean',
'sortable' => true,
'searchable' => false,
'closure' => true,
'wrapper' => function($row) {
if ($row->default_address == 1)
return '<span class="badge badge-md badge-success"">' . trans('admin::app.customers.addresses.yes') . '</span>';
else
return trans('admin::app.customers.addresses.dash');
}
]);
}
public function prepareActions()
{
$this->addAction([
'type' => 'Edit',
'method' => 'GET', //use post only for redirects only
'route' => 'admin.customer.addresses.edit',
'icon' => 'icon pencil-lg-icon'
]);
$this->addAction([
'type' => 'Delete',
'method' => 'POST',
'route' => 'admin.customer.addresses.delete',
'confirm_text' => trans('ui::app.datagrid.massaction.delete', ['resource' => 'address']),
'icon' => 'icon trash-icon'
]);
}
public function prepareMassActions()
{
$this->addMassAction([
'type' => 'delete',
'label' => trans('admin::app.customers.addresses.delete'),
'action' => route('admin.customer.addresses.massdelete', request('id')),
'method' => 'DELETE'
]);
}
}

View File

@ -9,6 +9,7 @@ use DB;
* CustomerDataGrid class
*
* @author Prashant Singh <prashant.singh852@webkul.com> @prashant-webkul
* @author Vivek Sharma <viveksh047@webkul.com> @viveksh-webkul
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
*/
class CustomerDataGrid extends DataGrid
@ -23,11 +24,13 @@ class CustomerDataGrid extends DataGrid
{
$queryBuilder = DB::table('customers')
->leftJoin('customer_groups', 'customers.customer_group_id', '=', 'customer_groups.id')
->addSelect('customers.id as customer_id', 'customers.email', 'customer_groups.name', 'status')
->addSelect('customers.id as customer_id', 'customers.email', 'customer_groups.name', 'customers.phone', 'customers.gender', 'status')
->addSelect(DB::raw('CONCAT(customers.first_name, " ", customers.last_name) as full_name'));
$this->addFilter('customer_id', 'customers.id');
$this->addFilter('full_name', DB::raw('CONCAT(customers.first_name, " ", customers.last_name)'));
$this->addFilter('phone', 'customers.phone');
$this->addFilter('gender', 'customers.gender');
$this->setQueryBuilder($queryBuilder);
}
@ -70,6 +73,38 @@ class CustomerDataGrid extends DataGrid
'filterable' => true
]);
$this->addColumn([
'index' => 'phone',
'label' => trans('admin::app.datagrid.phone'),
'type' => 'number',
'searchable' => true,
'sortable' => true,
'filterable' => false,
'closure' => true,
'wrapper' => function ($row) {
if (! $row->phone)
return '-';
else
return $row->phone;
}
]);
$this->addColumn([
'index' => 'gender',
'label' => trans('admin::app.datagrid.gender'),
'type' => 'string',
'searchable' => false,
'sortable' => true,
'filterable' => false,
'closure' => true,
'wrapper' => function ($row) {
if (! $row->gender)
return '-';
else
return $row->gender;
}
]);
$this->addColumn([
'index' => 'status',
'label' => trans('admin::app.datagrid.status'),
@ -77,11 +112,12 @@ class CustomerDataGrid extends DataGrid
'searchable' => false,
'sortable' => true,
'filterable' => true,
'closure' => true,
'wrapper' => function ($row) {
if ($row->status == 1) {
return 'Activated';
return '<span class="badge badge-md badge-success">Activated</span>';
} else {
return 'Blocked';
return '<span class="badge badge-md badge-danger">Blocked</span>';
}
}
]);
@ -95,6 +131,13 @@ class CustomerDataGrid extends DataGrid
'title' => trans('admin::app.customers.customers.edit-help-title')
]);
$this->addAction([
'type' => 'Edit',
'method' => 'GET', //use post only for redirects only
'route' => 'admin.customer.addresses.index',
'icon' => 'icon list-icon'
]);
$this->addAction([
'method' => 'POST', // use GET request only for redirect purposes
'route' => 'admin.customer.delete',

View File

@ -61,7 +61,7 @@ class Handler extends ExceptionHandler
private function isAdminUri()
{
return strpos($_SERVER['REQUEST_URI'], 'admin') !== false ? true : false;
return strpos(\Illuminate\Support\Facades\Request::path(), 'admin') !== false ? true : false;
}
private function response($path, $statusCode)

View File

@ -0,0 +1,189 @@
<?php
namespace Webkul\Admin\Http\Controllers\Customer;
use Webkul\Admin\Http\Controllers\Controller;
use Webkul\Customer\Repositories\CustomerRepository as Customer;
use Webkul\Customer\Repositories\CustomerAddressRepository as CustomerAddress;
/**
* Customer's Address controller
*
* @author Vivek Sharma <viveksh047@webkul.com>
* @copyright 2019 Webkul Software Pvt Ltd (http://www.webkul.com)
*/
class AddressController extends Controller
{
/**
* Contains route related configuration
*
* @var array
*/
protected $_config;
/**
* Customer Repository object
*
* @var object
*/
protected $customer;
/**
* CustomerAddress Repository object
*
* @var object
*/
protected $customerAddress;
/**
* Create a new controller instance.
*
* @param Webkul\Customer\Repositories\CustomerAddressRepository $customerAddress
* @return void
*/
public function __construct(
Customer $customer,
CustomerAddress $customerAddress
)
{
$this->customer = $customer;
$this->customerAddress = $customerAddress;
$this->_config = request('_config');
}
/**
* Method to populate the seller order page which will be populated.
*
* @return Mixed
*/
public function index($id)
{
$customer = $this->customer->find($id);
return view($this->_config['view'], compact('customer'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create($id)
{
$customer = $this->customer->find($id);
return view($this->_config['view'], compact('customer'));
}
/**
* Store a newly created resource in storage.
*
* @return \Illuminate\Http\Response
*/
public function store()
{
request()->merge(['address1' => implode(PHP_EOL, array_filter(request()->input('address1')))]);
$data = collect(request()->input())->except('_token')->toArray();
$this->validate(request(), [
'address1' => 'string|required',
'country' => 'string|required',
'state' => 'string|required',
'city' => 'string|required',
'postcode' => 'required',
'phone' => 'required'
]);
if ( $this->customerAddress->create($data) ) {
session()->flash('success', trans('admin::app.customers.addresses.success-create'));
return redirect()->route('admin.customer.addresses.index', ['id' => $data['customer_id']]);
} else {
session()->flash('success', trans('admin::app.customers.addresses.error-create'));
return redirect()->back();
}
}
/**
* Display a listing of the resource.
*
* @return Mixed
*/
public function edit($id)
{
$address = $this->customerAddress->find($id);
return view($this->_config['view'], compact('address'));
}
/**
* Edit's the premade resource of customer called
* Address.
*
* @return redirect
*/
public function update($id)
{
request()->merge(['address1' => implode(PHP_EOL, array_filter(request()->input('address1')))]);
$this->validate(request(), [
'address1' => 'string|required',
'country' => 'string|required',
'state' => 'string|required',
'city' => 'string|required',
'postcode' => 'required',
'phone' => 'required'
]);
$data = collect(request()->input())->except('_token')->toArray();
$address = $this->customerAddress->find($id);
if ( $address ) {
$this->customerAddress->update($data, $id);
session()->flash('success', trans('admin::app.customers.addresses.success-update'));
return redirect()->route('admin.customer.addresses.index', ['id' => $address->customer_id]);
}
return redirect()->route($this->_config['redirect']);
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
$this->customerAddress->delete($id);
session()->flash('success', trans('admin::app.customers.addresses.success-delete'));
return redirect()->back();
}
/**
* Mass Delete the customer's addresses
*
* @return response
*/
public function massDestroy($id)
{
$addressIds = explode(',', request()->input('indexes'));
foreach ($addressIds as $addressId) {
$this->customerAddress->delete($addressId);
}
session()->flash('success', trans('admin::app.customers.addresses.success-mass-delete'));
return redirect()->route($this->_config['redirect'], ['id' => $id]);
}
}

View File

@ -14,7 +14,7 @@ use Excel;
class ExportController extends Controller
{
protected $exportableGrids = [
'OrderDataGrid', 'OrderInvoicesDataGrid', 'OrderShipmentsDataGrid', 'CustomerDataGrid', 'TaxRateDataGrid', 'ProductDataGrid', 'CMSPageDataGrid'
'OrderDataGrid', 'OrderInvoicesDataGrid', 'OrderShipmentsDataGrid', 'OrderRefundDataGrid', 'CustomerDataGrid', 'TaxRateDataGrid', 'ProductDataGrid', 'CMSPageDataGrid'
];
/**

View File

@ -82,6 +82,36 @@ Route::group(['middleware' => ['web']], function () {
'view' => 'admin::customers.reviews.index'
])->name('admin.customer.review.index');
//Customer's addresses routes
Route::get('customers/{id}/addresses', 'Webkul\Admin\Http\Controllers\Customer\AddressController@index')->defaults('_config', [
'view' => 'admin::customers.addresses.index'
])->name('admin.customer.addresses.index');
Route::get('customers/{id}/addresses/create', 'Webkul\Admin\Http\Controllers\Customer\AddressController@create')->defaults('_config',[
'view' => 'admin::customers.addresses.create'
])->name('admin.customer.addresses.create');
Route::post('customers/{id}/addresses/create', 'Webkul\Admin\Http\Controllers\Customer\AddressController@store')->defaults('_config',[
'redirect' => 'admin.customer.addresses.index'
])->name('admin.customer.addresses.store');
Route::get('customers/addresses/edit/{id}', 'Webkul\Admin\Http\Controllers\Customer\AddressController@edit')->defaults('_config',[
'view' => 'admin::customers.addresses.edit'
])->name('admin.customer.addresses.edit');
Route::put('customers/addresses/edit/{id}', 'Webkul\Admin\Http\Controllers\Customer\AddressController@update')->defaults('_config', [
'redirect' => 'admin.customer.addresses.index'
])->name('admin.customer.addresses.update');
Route::post('customers/addresses/delete/{id}', 'Webkul\Admin\Http\Controllers\Customer\AddressController@destroy')->defaults('_config', [
'redirect' => 'admin.customer.addresses.index'
])->name('admin.customer.addresses.delete');
//mass destroy
Route::post('customers/{id}/addresses', 'Webkul\Admin\Http\Controllers\Customer\AddressController@massDestroy')->defaults('_config', [
'redirect' => 'admin.customer.addresses.index'
])->name('admin.customer.addresses.massdelete');
// Configuration routes
Route::get('configuration/{slug?}/{slug2?}', 'Webkul\Admin\Http\Controllers\ConfigurationController@index')->defaults('_config', [
'view' => 'admin::configuration.index'

View File

@ -844,7 +844,8 @@ return [
'create-root-failure' => 'الفئة مع الاسم الجذر موجود',
'cancel-success' => ':name canceled successfully.',
'cancel-error' => ':name can not be canceled.',
'already-taken' => 'The :name has already been taken.'
'already-taken' => 'The :name has already been taken.',
'order-pending' => 'لا يمكن حذف الحساب لأن بعض الطلبات (الطلبات) معلقة أو قيد المعالجة.'
],
'footer' => [
@ -896,6 +897,7 @@ return [
'footer-content' => 'Footer Text',
'locale-options' => 'Unit Options',
'weight-unit' => 'Weight Unit',
'admin-page-limit' => 'العناصر الافتراضية لكل صفحة (المشرف)',
'design' => 'Design',
'admin-logo' => 'Admin Logo',
'logo-image' => 'Logo Image',

View File

@ -161,6 +161,8 @@ return [
'hostname' => 'Hostname',
'email' => 'Email',
'group' => 'Group',
'phone' => 'Phone',
'gender' => 'Gender',
'title' => 'Title',
'layout' => 'Layout',
'url-key' => 'URL Key',
@ -849,6 +851,35 @@ return [
'yes' => 'Yes'
],
'addresses' => [
'title' => ':customer_name\'s Addresses List',
'create-title' => 'Create Customer\'s Address',
'edit-title' => 'Update Customer\'s Address',
'title-orders' => ':customer_name\'s Orders List',
'address-list' => 'Address\'s List',
'order-list' => 'Order\'s List',
'address-id' => 'Address ID',
'address-1' => 'Address 1',
'city' => 'City',
'state-name' => 'State',
'country-name' => 'Country',
'postcode' => 'Post Code',
'default-address' => 'Default Address',
'yes' => 'Yes',
'not-approved' => 'Not Approved',
'no' => 'No',
'dash' => '-',
'delete' => 'Delete',
'create-btn-title' => 'Add Address',
'save-btn-title' => 'Save Address',
'general' => 'General',
'success-create' => 'Success: Customer address created successfully.',
'success-update' => 'Success: Customer address updated successfully.',
'success-delete' => 'Success: Customer address deleted successfully.',
'success-mass-delete' => 'Success: selected addresses deleted successfully.',
'error-create' => 'Error: Customer address not created.',
],
'note' => [
'title' => 'Add Note',
'save-note' => 'Save Note',
@ -1132,7 +1163,8 @@ return [
'create-root-failure' => 'Category with name root already exists',
'cancel-success' => ':name canceled successfully.',
'cancel-error' => ':name can not be canceled.',
'already-taken' => 'The :name has already been taken.'
'already-taken' => 'The :name has already been taken.',
'order-pending' => 'Cannot delete account because some Order(s) are pending or processing state.'
],
'footer' => [
@ -1185,6 +1217,7 @@ return [
'footer-toggle' => 'Toggle footer',
'locale-options' => 'Unit Options',
'weight-unit' => 'Weight Unit',
'admin-page-limit' => 'Default Items Per Page (Admin)',
'design' => 'Design',
'admin-logo' => 'Admin Logo',
'logo-image' => 'Logo Image',

View File

@ -0,0 +1,91 @@
@extends('admin::layouts.content')
@section('page_title')
{{ __('admin::app.customers.addresses.create-title') }}
@stop
@section('content-wrapper')
<div class="content full-page">
{!! view_render_event('admin.customer.addresses.create.before') !!}
<form method="POST" action="{{ route('admin.customer.addresses.store', ['id' => $customer->id]) }}" @submit.prevent="onSubmit">
<div class="page-header">
<div class="page-title">
<h1>
<i class="icon angle-left-icon back-link" onclick="history.length > 1 ? history.go(-1) : window.location = '{{ url('/admin/dashboard') }}';"></i>
{{ __('admin::app.customers.addresses.create-title') }}
</h1>
</div>
<div class="page-action">
<button type="submit" class="btn btn-lg btn-primary">
{{ __('admin::app.customers.addresses.save-btn-title') }}
</button>
</div>
</div>
<div class="page-content">
<div class="form-container">
@csrf()
<input type="hidden" name="customer_id" value="{{ $customer->id }}">
<accordian :title="'{{ __('admin::app.customers.addresses.general') }}'" :active="true">
<div slot="body">
<div class="control-group" :class="[errors.has('address1[]') ? 'has-error' : '']">
<label for="address_0" class="required">{{ __('shop::app.customer.account.address.edit.street-address') }}</label>
<input type="text" class="control" name="address1[]" id="address_0" v-validate="'required'" value="{{ old('address1') }}" data-vv-as="&quot;{{ __('shop::app.customer.account.address.create.street-address') }}&quot;">
<span class="control-error" v-if="errors.has('address1[]')">@{{ errors.first('address1[]') }}</span>
</div>
@if (core()->getConfigData('customer.settings.address.street_lines') && core()->getConfigData('customer.settings.address.street_lines') > 1)
<div class="control-group" style="margin-top: -25px;">
@for ($i = 1; $i < core()->getConfigData('customer.settings.address.street_lines'); $i++)
<input type="text" class="control" name="address1[{{ $i }}]" id="address_{{ $i }}">
@endfor
</div>
@endif
<div class="control-group" :class="[errors.has('city') ? 'has-error' : '']">
<label for="city" class="required">{{ __('shop::app.customer.account.address.create.city') }}</label>
<input type="text" class="control" name="city" v-validate="'required|alpha_spaces'" value="{{ old('city') }}" data-vv-as="&quot;{{ __('shop::app.customer.account.address.create.city') }}&quot;">
<span class="control-error" v-if="errors.has('city')">@{{ errors.first('city') }}</span>
</div>
@include ('shop::customers.account.address.country-state', ['countryCode' => old('country') ?? '', 'stateCode' => old('state') ?? ''])
<div class="control-group" :class="[errors.has('postcode') ? 'has-error' : '']">
<label for="postcode" class="required">{{ __('shop::app.customer.account.address.create.postcode') }}</label>
<input type="text" class="control" name="postcode" v-validate="'required'" value="{{ old('postcode') }}" data-vv-as="&quot;{{ __('shop::app.customer.account.address.create.postcode') }}&quot;">
<span class="control-error" v-if="errors.has('postcode')">@{{ errors.first('postcode') }}</span>
</div>
<div class="control-group" :class="[errors.has('phone') ? 'has-error' : '']">
<label for="phone" class="required">{{ __('shop::app.customer.account.address.create.phone') }}</label>
<input type="text" class="control" name="phone" v-validate="'required'" value="{{ old('phone') }}" data-vv-as="&quot;{{ __('shop::app.customer.account.address.create.phone') }}&quot;">
<span class="control-error" v-if="errors.has('phone')">@{{ errors.first('phone') }}</span>
</div>
<div class="control-group">
<span class="checkbox">
<input type="checkbox" class="control" id="default_address" name="default_address" {{ old('default_address') ? 'checked' : '' }} >
<label class="checkbox-view" for="default_address"></label>
{{ __('admin::app.customers.addresses.default-address') }}
</span>
</div>
</div>
</div>
</accordian>
</div>
</div>
</form>
{!! view_render_event('admin.customer.addresses.create.after') !!}
</div>
@stop

View File

@ -0,0 +1,88 @@
@extends('admin::layouts.content')
@section('page_title')
{{ __('admin::app.customers.addresses.edit-title') }}
@stop
@section('content-wrapper')
<div class="content full-page">
{!! view_render_event('admin.customer.addresses.edit.before', ['address' => $address]) !!}
<form method="post" action="{{ route('admin.customer.addresses.update', $address->id) }}" @submit.prevent="onSubmit">
<div class="page-header">
<div class="page-title">
<h1>{{ __('admin::app.customers.addresses.edit-title') }}</h1>
</div>
<div class="page-action">
<button type="submit" class="btn btn-primary btn-lg">
{{ __('admin::app.customers.addresses.save-btn-title') }}
</button>
</div>
</div>
<div class="page-content">
@csrf()
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="customer_id" value="{{ $address->customer_id }}">
<accordian :title="'{{ __('admin::app.customers.addresses.general') }}'" :active="true">
<div slot="body">
<?php $addresses = explode(PHP_EOL, $address->address1); ?>
<div class="control-group" :class="[errors.has('address1[]') ? 'has-error' : '']">
<label for="address_0" class="required">{{ __('shop::app.customer.account.address.edit.street-address') }}</label>
<input type="text" class="control" name="address1[]" id="address_0" v-validate="'required'" value="{{ isset($addresses[0]) ? $addresses[0] : '' }}" data-vv-as="&quot;{{ __('shop::app.customer.account.address.create.street-address') }}&quot;">
<span class="control-error" v-if="errors.has('address1[]')">@{{ errors.first('address1[]') }}</span>
</div>
@if (core()->getConfigData('customer.settings.address.street_lines') && core()->getConfigData('customer.settings.address.street_lines') > 1)
<div class="control-group" style="margin-top: -25px;">
@for ($i = 1; $i < core()->getConfigData('customer.settings.address.street_lines'); $i++)
<input type="text" class="control" name="address1[{{ $i }}]" id="address_{{ $i }}" value="{{ isset($addresses[$i]) ? $addresses[$i] : '' }}">
@endfor
</div>
@endif
<div class="control-group" :class="[errors.has('city') ? 'has-error' : '']">
<label for="city" class="required">{{ __('shop::app.customer.account.address.create.city') }}</label>
<input type="text" class="control" name="city" v-validate="'required|alpha_spaces'" value="{{ $address->city }}" data-vv-as="&quot;{{ __('shop::app.customer.account.address.create.city') }}&quot;">
<span class="control-error" v-if="errors.has('city')">@{{ errors.first('city') }}</span>
</div>
@include ('shop::customers.account.address.country-state', ['countryCode' => old('country') ?? $address->country, 'stateCode' => old('state') ?? $address->state])
<div class="control-group" :class="[errors.has('postcode') ? 'has-error' : '']">
<label for="postcode" class="required">{{ __('shop::app.customer.account.address.create.postcode') }}</label>
<input type="text" class="control" name="postcode" v-validate="'required'" value="{{ $address->postcode }}" data-vv-as="&quot;{{ __('shop::app.customer.account.address.create.postcode') }}&quot;">
<span class="control-error" v-if="errors.has('postcode')">@{{ errors.first('postcode') }}</span>
</div>
<div class="control-group" :class="[errors.has('phone') ? 'has-error' : '']">
<label for="phone" class="required">{{ __('shop::app.customer.account.address.create.phone') }}</label>
<input type="text" class="control" name="phone" v-validate="'required'" value="{{ $address->phone }}" data-vv-as="&quot;{{ __('shop::app.customer.account.address.create.phone') }}&quot;">
<span class="control-error" v-if="errors.has('phone')">@{{ errors.first('phone') }}</span>
</div>
<div class="control-group">
<span class="checkbox">
<input type="checkbox" class="control" id="default_address" name="default_address" {{ $address->default_address ? 'checked' : '' }} >
<label class="checkbox-view" for="default_address"></label>
{{ __('admin::app.customers.addresses.default-address') }}
</span>
</div>
</div>
</div>
</accordian>
</form>
{!! view_render_event('admin.customer.addresses.edit.after', ['address' => $address]) !!}
</div>
@stop

View File

@ -0,0 +1,31 @@
@extends('admin::layouts.content')
@section('page_title')
{{ __('admin::app.customers.addresses.title', ['customer_name' => $customer->first_name . ' ' . $customer->last_name]) }}
@stop
@section('content')
<div class="content">
<div class="page-header">
<div class="page-title">
<h1>{{ __('admin::app.customers.addresses.title', ['customer_name' => $customer->first_name . ' ' . $customer->last_name]) }}</h1>
</div>
<div class="page-action">
<a href="{{ route('admin.customer.addresses.create', ['id' => $customer->id]) }}" class="btn btn-lg btn-primary">
{{ __('admin::app.customers.addresses.create-btn-title') }}
</a>
</div>
</div>
{!! view_render_event('bagisto.admin.customer.addresses.list.before') !!}
<div class="page-content">
{!! app('Webkul\Admin\DataGrids\AddressDataGrid')->render() !!}
</div>
{!! view_render_event('bagisto.admin.customer.addresses.list.after') !!}
</div>
@stop

View File

@ -0,0 +1,35 @@
@extends('address::admin.layouts.content')
@section('page_title')
{{ __('address::app.admin.addresses.title-orders', ['customer_name' => $customer->first_name . ' ' . $customer->last_name]) }}
@stop
@section('content')
<div class="content">
<div class="page-header">
<div class="page-title">
<h1>
<i class="icon angle-left-icon back-link" onclick="history.length > 1 ? history.go(-1) : window.location = '{{ url('/admin/dashboard') }}';"></i>
{{ __('address::app.admin.addresses.title-orders', ['customer_name' => $customer->first_name . ' ' . $customer->last_name]) }}
</h1>
</div>
</div>
<div class="page-content">
<div class="tabs">
<ul>
<li><a href="{{ route('admin.address.addresses.index', ['id' => $customer->id]) }}">{{ __('address::app.admin.addresses.address-list') }}</a></li>
<li class="active"><a href="{{ route('admin.address.orders.index', ['id' => $customer->id]) }}">{{ __('address::app.admin.addresses.order-list') }}</a></li>
</ul>
</div>
{!! app('Webkul\Address\DataGrids\Admin\OrderDataGrid')->render() !!}
</div>
</div>
@stop

View File

@ -78,9 +78,9 @@
<div class="brand-logo">
@if (core()->getConfigData('general.design.admin_logo.logo_image'))
<img src="{{ \Illuminate\Support\Facades\Storage::url(core()->getConfigData('general.design.admin_logo.logo_image')) }}" alt="Bagisto" style="height: 40px; width: 110px;"/>
<img src="{{ \Illuminate\Support\Facades\Storage::url(core()->getConfigData('general.design.admin_logo.logo_image')) }}" alt="{{ config('app.name') }}" style="height: 40px; width: 110px;"/>
@else
<img src="{{ asset('vendor/webkul/ui/assets/images/logo.png') }}" alt="Bagisto"/>
<img src="{{ asset('vendor/webkul/ui/assets/images/logo.png') }}" alt="{{ config('app.name') }}"/>
@endif
</div>

View File

@ -3,9 +3,9 @@
<div class="brand-logo">
<a href="{{ route('admin.dashboard.index') }}">
@if (core()->getConfigData('general.design.admin_logo.logo_image'))
<img src="{{ \Illuminate\Support\Facades\Storage::url(core()->getConfigData('general.design.admin_logo.logo_image')) }}" alt="Bagisto" style="height: 40px; width: 110px;"/>
<img src="{{ \Illuminate\Support\Facades\Storage::url(core()->getConfigData('general.design.admin_logo.logo_image')) }}" alt="{{ config('app.name') }}" style="height: 40px; width: 110px;"/>
@else
<img src="{{ asset('vendor/webkul/ui/assets/images/logo.png') }}" alt="Bagisto"/>
<img src="{{ asset('vendor/webkul/ui/assets/images/logo.png') }}" alt="{{ config('app.name') }}"/>
@endif
</a>
</div>

View File

@ -142,7 +142,6 @@ class CustomerController extends Controller
$orders = $customerRepository->all_orders->whereIn('status', ['pending', 'processing'])->first();
if ( $orders ) {
session()->flash('error', trans('admin::app.response.order-pending'));
return redirect()->route($this->_config['redirect']);
@ -160,7 +159,7 @@ class CustomerController extends Controller
session()->flash('error', trans('shop::app.customer.account.address.delete.wrong-password'));
}
return redirect()->route($this->_config['redirect']);
return redirect()->route('customer.session.index');
} catch(\Exception $e) {
session()->flash('error', trans('admin::app.response.delete-failed', ['name' => 'Customer']));

View File

@ -3,6 +3,7 @@
namespace Webkul\Customer\Repositories;
use Webkul\Core\Eloquent\Repository;
use Illuminate\Support\Facades\Event;
/**
* Customer Reposotory
@ -23,4 +24,64 @@ class CustomerAddressRepository extends Repository
{
return 'Webkul\Customer\Contracts\CustomerAddress';
}
/**
* @param array $data
* @return mixed
*/
public function create(array $data)
{
Event::fire('customer.addresses.create.before');
if ( isset($data['default_address']) ) {
$data['default_address'] = 1;
} else {
$data['default_address'] = 0;
}
$default_address = $this->findWhere(['customer_id' => $data['customer_id'], 'default_address' => 1])->first();
if ( isset($default_address->id) && $data['default_address'] ) {
$default_address->update(['default_address' => 0]);
}
$address = $this->model->create($data);
Event::fire('customer.addresses.create.after', $address);
return $address;
}
/**
* @param array $data
* @param $id
* @return mixed
*/
public function update(array $data, $id)
{
$address = $this->find($id);
Event::fire('customer.addresses.update.before', $id);
if (isset($data['default_address']) ) {
$data['default_address'] = 1;
} else {
$data['default_address'] = 0;
}
$default_address = $this->findWhere(['customer_id' => $address->customer_id, 'default_address' => 1])->first();
if ( isset($default_address->id) && $data['default_address'] ) {
if ( $default_address->id != $address->id ) {
$default_address->update(['default_address' => 0]);
}
$address->update($data);
} else {
$address->update($data);
}
Event::fire('customer.addresses.update.after', $id);
return $address;
}
}

View File

@ -61,7 +61,7 @@ class Handler extends ExceptionHandler
private function isSopUri()
{
return strpos($_SERVER['REQUEST_URI'], 'shop') !== false ? true : false;
return strpos(\Illuminate\Support\Facades\Request::path(), 'shop') !== false ? true : false;
}
private function response($path, $statusCode)

View File

@ -20,7 +20,7 @@ return [
],
'home' => [
'page-title' => 'Bagisto - Home',
'page-title' => config('app.name') . ' - Home',
'featured-products' => 'Featured Products',
'new-products' => 'New Products',
'verify-email' => 'Verify your email account',
@ -61,14 +61,14 @@ return [
'subscribed' => 'You are now subscribed to subscription emails.',
'not-subscribed' => 'You can not be subscribed to subscription emails, please try again later.',
'already' => 'You are already subscribed to our subscription list.',
'unsubscribed' => 'You are unsubscribed from subscription mails0',
'unsubscribed' => 'You are unsubscribed from subscription mails.',
'already-unsub' => 'You are already unsubscribed.',
'not-subscribed' => 'Error! Mail can not be sent currently, please try again later.'
],
'search' => [
'no-results' => 'No Results Found',
'page-title' => 'Bagisto - Search',
'page-title' => config('app.name') . ' - Search',
'found-results' => 'Search Results Found',
'found-result' => 'Search Result Found'
],
@ -609,7 +609,7 @@ return [
'username-email' => 'UserName/Email',
'subject' => 'New Customer Registration',
'password' => 'Password',
'summary' => 'Your account has been created in bagisto.
'summary' => 'Your account has been created.
Your account details are below: ',
'thanks' => 'Thanks!',
],
@ -618,13 +618,13 @@ return [
'subject' => 'New Customer Registration',
'customer-registration' => 'Customer Registered Successfully',
'dear' => 'Dear :customer_name',
'greeting' => 'Welcome and thank you for registering at Bagisto!',
'greeting' => 'Welcome and thank you for registering with us!',
'summary' => 'Your account has now been created successfully and you can login using your email address and password credentials. Upon logging in, you will be able to access other services including reviewing past orders, wishlists and editing your account information.',
'thanks' => 'Thanks!',
],
'verification' => [
'heading' => 'Bagisto - Email Verification',
'heading' => config('app.name') . ' - Email Verification',
'subject' => 'Verification Mail',
'verify' => 'Verify Your Account',
'summary' => 'This is the mail to verify that the email address you entered is yours.
@ -633,9 +633,9 @@ return [
'subscription' => [
'subject' => 'Subscription Email',
'greeting' => ' Welcome to Bagisto - Email Subscription',
'greeting' => ' Welcome to ' . config('app.name') . ' - Email Subscription',
'unsubscribe' => 'Unsubscribe',
'summary' => 'Thanks for putting me into your inbox. Its been a while since youve read Bagisto email, and we dont want to overwhelm your inbox. If you still do not want to receive
'summary' => 'Thanks for putting me into your inbox. Its been a while since youve read ' . config('app.name') . ' email, and we dont want to overwhelm your inbox. If you still do not want to receive
the latest email marketing news then for sure click the button below.'
]
]

View File

@ -18,7 +18,7 @@ return [
],
'home' => [
'page-title' => 'Bagisto - Inicio',
'page-title' => config('app.name') . ' - Inicio',
'featured-products' => 'Productos Destacados',
'new-products' => 'Nuevos Productos',
'verify-email' => 'Verifica tu cuenta de correo',

View File

@ -60,7 +60,7 @@ return [
'subscribed' => 'شما هم اکنون در ایمیل های اشتراک مشترک شده اید',
'not-subscribed' => 'شما نمی توانید به عضویت در ایمیل مشترک شوید ، پس از مدتی دوباره امتحان کنید',
'already' => 'شما قبلاً در لیست اشتراک های ما مشترک شده اید',
'unsubscribed' => 'شما از نامه های اشتراک Bagisto مشترک نیستید',
'unsubscribed' => 'شما از نامه های اشتراک مشترکاً مشترک نیستید',
'already-unsub' => 'شما قبلاً لغو اشتراک شده اید',
'not-subscribed' => 'خطا! نامه ارسال نمی شود در حال حاضر ، لطفا بعدا دوباره امتحان کنید'
],

View File

@ -16,7 +16,7 @@ return [
],
'home' => [
'page-title' => 'Bagisto - Home',
'page-title' => config('app.name') . ' - Home',
'featured-products' => 'Produtos em Destaque',
'new-products' => 'Novos Produtos',
'verify-email' => 'Verifique sua Conta de E-mail',

View File

@ -3,7 +3,7 @@
<div>
<div style="text-align: center;">
<a href="{{ config('app.url') }}">
<img src="{{ bagisto_asset('images/logo.svg') }}">
@include ('shop::emails.layouts.logo')
</a>
</div>

View File

@ -1,5 +1,5 @@
@if (core()->getConfigData('general.design.admin_logo.logo_image'))
<img src="{{ \Illuminate\Support\Facades\Storage::url(core()->getConfigData('general.design.admin_logo.logo_image')) }}" alt="Bagisto" style="height: 40px; width: 110px;"/>
<img src="{{ \Illuminate\Support\Facades\Storage::url(core()->getConfigData('general.design.admin_logo.logo_image')) }}" alt="{{ config('app.name') }}" style="height: 40px; width: 110px;"/>
@else
<img src="{{ bagisto_asset('images/logo.svg') }}">
@endif

View File

@ -42,7 +42,7 @@
@endif
<?php
$query = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY);
$query = parse_url(\Illuminate\Support\Facades\Request::path(), PHP_URL_QUERY);
$searchTerm = explode("&", $query);
foreach($searchTerm as $term){

View File

@ -29,7 +29,7 @@
</div>
<?php
$query = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY);
$query = parse_url(\Illuminate\Support\Facades\Request::path(), PHP_URL_QUERY);
$searchTerm = explode("&", $query);
foreach($searchTerm as $term){

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 51.1 (57501) - http://www.bohemiancoding.com/sketch -->
<title>Listing</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Listing" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="Group-2" transform="translate(6.000000, 4.000000)" stroke="#8E8E8E" stroke-width="2">
<g id="Group">
<path d="M5.41666667,1.66666667 L13,1.66666667" id="Path-6"></path>
<path d="M0,1.66666667 L1.08333333,1.66666667" id="Path-6-Copy"></path>
</g>
<g id="Group-Copy" transform="translate(0.000000, 4.000000)">
<path d="M5.41666667,1.66666667 L13,1.66666667" id="Path-6"></path>
<path d="M0,1.66666667 L1.08333333,1.66666667" id="Path-6-Copy"></path>
</g>
<g id="Group-Copy-2" transform="translate(0.000000, 8.000000)">
<path d="M5.41666667,1.66666667 L13,1.66666667" id="Path-6"></path>
<path d="M0,1.66666667 L1.08333333,1.66666667" id="Path-6-Copy"></path>
</g>
<g id="Group-Copy-3" transform="translate(0.000000, 12.000000)">
<path d="M5.41666667,1.66666667 L13,1.66666667" id="Path-6"></path>
<path d="M0,1.66666667 L1.08333333,1.66666667" id="Path-6-Copy"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
{
"/js/ui.js": "/js/ui.js?id=62a1f3ccf04e55a10ae8",
"/css/ui.css": "/css/ui.css?id=485e4b6533049df9136b"
"/js/ui.js": "/js/ui.js?id=1eae825cea6916507733",
"/css/ui.css": "/css/ui.css?id=b61e212bdad67ef040f5"
}

View File

@ -142,6 +142,8 @@ abstract class DataGrid
public function __construct()
{
$this->invoker = $this;
$this->itemsPerPage = core()->getConfigData('general.general.locale_options.admin_page_limit') ?: $this->itemsPerPage;
}
/**

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 51.1 (57501) - http://www.bohemiancoding.com/sketch -->
<title>Listing</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Listing" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="Group-2" transform="translate(6.000000, 4.000000)" stroke="#8E8E8E" stroke-width="2">
<g id="Group">
<path d="M5.41666667,1.66666667 L13,1.66666667" id="Path-6"></path>
<path d="M0,1.66666667 L1.08333333,1.66666667" id="Path-6-Copy"></path>
</g>
<g id="Group-Copy" transform="translate(0.000000, 4.000000)">
<path d="M5.41666667,1.66666667 L13,1.66666667" id="Path-6"></path>
<path d="M0,1.66666667 L1.08333333,1.66666667" id="Path-6-Copy"></path>
</g>
<g id="Group-Copy-2" transform="translate(0.000000, 8.000000)">
<path d="M5.41666667,1.66666667 L13,1.66666667" id="Path-6"></path>
<path d="M0,1.66666667 L1.08333333,1.66666667" id="Path-6-Copy"></path>
</g>
<g id="Group-Copy-3" transform="translate(0.000000, 12.000000)">
<path d="M5.41666667,1.66666667 L13,1.66666667" id="Path-6"></path>
<path d="M0,1.66666667 L1.08333333,1.66666667" id="Path-6-Copy"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -448,7 +448,11 @@ h5 {
vertical-align: top;
&.actions {
.action {
display: inline-flex;
}
.icon {
cursor: pointer;
vertical-align: middle;

View File

@ -236,6 +236,12 @@
height: 24px;
}
.list-icon {
background-image: url("../images/Icon-Listing.svg");
width: 24px;
height: 24px;
}
.active {
.dashboard-icon {
background-image: url("../images/Icon-Dashboard-Active.svg");

View File

@ -76,7 +76,7 @@
<span> Click the below button to run following : </span>
</div>
<div class="message">
<span>Database Migartion </span>
<span>Database Migration </span>
</div>
<div class="message">
<span> Database Seeder </span>
@ -224,4 +224,4 @@
});
});
</script>
</script>