Theme manager completed
|
|
@ -36,7 +36,8 @@
|
|||
"webkul/laravel-category": "self.version",
|
||||
"webkul/laravel-channel": "self.version",
|
||||
"webkul/laravel-product": "self.version",
|
||||
"webkul/laravel-shop": "self.version"
|
||||
"webkul/laravel-shop": "self.version",
|
||||
"webkul/laravel-theme": "self.version"
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
|
|
@ -55,7 +56,8 @@
|
|||
"Webkul\\Customer\\": "packages/Webkul/Customer/src",
|
||||
"Webkul\\Channel\\": "packages/Webkul/Channel/src",
|
||||
"Webkul\\Inventory\\": "packages/Webkul/Inventory/src",
|
||||
"Webkul\\Product\\": "packages/Webkul/Product/src"
|
||||
"Webkul\\Product\\": "packages/Webkul/Product/src",
|
||||
"Webkul\\Theme\\": "packages/Webkul/Theme/src"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
|
|
|
|||
|
|
@ -186,7 +186,8 @@ return [
|
|||
Webkul\Inventory\Providers\InventoryServiceProvider::class,
|
||||
Webkul\Product\Providers\ProductServiceProvider::class,
|
||||
Webkul\Shop\Providers\ShopServiceProvider::class,
|
||||
Webkul\Customer\Providers\CustomerServiceProvider::class
|
||||
Webkul\Customer\Providers\CustomerServiceProvider::class,
|
||||
Webkul\Theme\Providers\ThemeServiceProvider::class
|
||||
],
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'default' => 'bliss',
|
||||
|
||||
'themes' => [
|
||||
'default' => [
|
||||
'views_path' => 'resources/themes/default/views',
|
||||
'assets_path' => 'public/themes/default/assets',
|
||||
'name' => 'Dafault'
|
||||
],
|
||||
|
||||
'bliss' => [
|
||||
'views_path' => 'resources/themes/bliss/views',
|
||||
'assets_path' => 'public/themes/bliss/assets',
|
||||
'name' => 'Bliss',
|
||||
'parent' => 'default'
|
||||
]
|
||||
]
|
||||
];
|
||||
|
|
@ -0,0 +1,151 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Admin\Datagrids;
|
||||
|
||||
use Illuminate\View\View;
|
||||
use Webkul\Ui\DataGrid\Facades\DataGrid;
|
||||
|
||||
class User
|
||||
{
|
||||
|
||||
/**
|
||||
* Create datagrid.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function createDatagrid()
|
||||
{
|
||||
|
||||
return DataGrid::make([
|
||||
'name' => 'Admins',
|
||||
'table' => 'admins as u',
|
||||
'select' => 'u.id',
|
||||
'perpage' => 5,
|
||||
'aliased' => true, //use this with false as default and true in case of joins
|
||||
|
||||
'massoperations' => [
|
||||
[
|
||||
'route' => route('admin.datagrid.delete'),
|
||||
'method' => 'DELETE',
|
||||
'label' => 'Delete',
|
||||
'type' => 'button',
|
||||
]
|
||||
],
|
||||
'actions' => [
|
||||
[
|
||||
'type' => 'Edit',
|
||||
'route' => route('admin.datagrid.delete'),
|
||||
'confirm_text' => 'Do you really want to do this?',
|
||||
'icon' => 'icon pencil-lg-icon',
|
||||
], [
|
||||
'type' => 'Delete',
|
||||
'route' => route('admin.datagrid.delete'),
|
||||
'confirm_text' => 'Do you really want to do this?',
|
||||
'icon' => 'icon trash-icon',
|
||||
],
|
||||
],
|
||||
'join' => [
|
||||
[
|
||||
'join' => 'leftjoin',
|
||||
'table' => 'roles as r',
|
||||
'primaryKey' => 'u.role_id',
|
||||
'condition' => '=',
|
||||
'secondaryKey' => 'r.id',
|
||||
]
|
||||
],
|
||||
|
||||
//use aliasing on secodary columns if join is performed
|
||||
'columns' => [
|
||||
[
|
||||
'name' => 'u.id',
|
||||
'alias' => 'ID',
|
||||
'type' => 'string',
|
||||
'label' => 'Admin ID',
|
||||
'sortable' => true,
|
||||
'wrapper' => function ($value, $object) {
|
||||
return '<a class="color-red">' . $object->ID . '</a>';
|
||||
},
|
||||
], [
|
||||
'name' => 'u.name',
|
||||
'alias' => 'Name',
|
||||
'type' => 'string',
|
||||
'label' => 'Name',
|
||||
'sortable' => true,
|
||||
'wrapper' => function ($value, $object) {
|
||||
return '<a class="color-red">' . $object->Name . '</a>';
|
||||
},
|
||||
], [
|
||||
'name' => 'u.email',
|
||||
'alias' => 'Email',
|
||||
'type' => 'string',
|
||||
'label' => 'E-Mail',
|
||||
'sortable' => true,
|
||||
], [
|
||||
'name' => 'r.name',
|
||||
'alias' => 'xa',
|
||||
'type' => 'string',
|
||||
'label' => 'Role Name',
|
||||
'sortable' => true,
|
||||
], [
|
||||
'name' => 'r.id',
|
||||
'alias' => 'xc',
|
||||
'type' => 'string',
|
||||
'label' => 'Role ID',
|
||||
'sortable' => true,
|
||||
]
|
||||
],
|
||||
//don't use aliasing in case of filters
|
||||
'filterable' => [
|
||||
[
|
||||
'column' => 'u.name',
|
||||
'alias' => 'Name',
|
||||
'type' => 'string',
|
||||
'label' => 'Name'
|
||||
], [
|
||||
'column' => 'u.email',
|
||||
'alias' => 'Email',
|
||||
'type' => 'string',
|
||||
'label' => 'Email'
|
||||
], [
|
||||
'column' => 'u.id',
|
||||
'alias' => 'ID',
|
||||
'type' => 'number',
|
||||
'label' => 'Admin ID'
|
||||
], [
|
||||
'column' => 'r.id',
|
||||
'alias' => 'Role_ID',
|
||||
'type' => 'number',
|
||||
'label' => 'Role ID'
|
||||
]
|
||||
],
|
||||
//don't use aliasing in case of searchables
|
||||
'searchable' => [
|
||||
[
|
||||
'column' => 'u.email',
|
||||
'type' => 'string',
|
||||
'label' => 'E-Mail'
|
||||
], [
|
||||
'column' => 'u.name',
|
||||
'type' => 'string',
|
||||
'label' => 'Name'
|
||||
]
|
||||
],
|
||||
'operators' => [
|
||||
'eq' => "=",
|
||||
'lt' => "<",
|
||||
'gt' => ">",
|
||||
'lte' => "<=",
|
||||
'gte' => ">=",
|
||||
'neqs' => "<>",
|
||||
'neqn' => "!=",
|
||||
'like' => "like",
|
||||
'nlike' => "not like",
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
return $this->createDatagrid()->render();
|
||||
}
|
||||
}
|
||||
|
|
@ -123,6 +123,12 @@ class EventServiceProvider extends ServiceProvider
|
|||
*/
|
||||
public function createProductFormAccordian()
|
||||
{
|
||||
Event::listen('admin.catalog.products.accordian.create', function() {
|
||||
return ProductFormAccordian::create(function($accordian) {
|
||||
Event::fire('admin.catalog.products.accordian.build', $accordian);
|
||||
});
|
||||
});
|
||||
|
||||
Event::listen('admin.catalog.products.accordian.build', function($accordian) {
|
||||
$accordian->add('inventories', 'Inventories', 'admin::catalog.products.accordians.inventories', 1);
|
||||
|
||||
|
|
|
|||
|
|
@ -164,7 +164,7 @@
|
|||
</div>
|
||||
@stop
|
||||
|
||||
@section('javascript')
|
||||
@push('scripts')
|
||||
<script type="text/x-template" id="options-template">
|
||||
<div>
|
||||
<div class="table">
|
||||
|
|
@ -283,4 +283,4 @@
|
|||
})
|
||||
});
|
||||
</script>
|
||||
@stop
|
||||
@endpush
|
||||
|
|
@ -220,7 +220,7 @@
|
|||
</div>
|
||||
@stop
|
||||
|
||||
@section('javascript')
|
||||
@push('scripts')
|
||||
<script type="text/x-template" id="options-template">
|
||||
<div>
|
||||
<div class="table">
|
||||
|
|
@ -352,4 +352,4 @@
|
|||
})
|
||||
});
|
||||
</script>
|
||||
@stop
|
||||
@endpush
|
||||
|
|
@ -111,8 +111,4 @@
|
|||
|
||||
</form>
|
||||
</div>
|
||||
@stop
|
||||
|
||||
@section('javascript')
|
||||
|
||||
@stop
|
||||
|
|
@ -68,7 +68,7 @@
|
|||
</modal>
|
||||
@stop
|
||||
|
||||
@section('javascript')
|
||||
@push('scripts')
|
||||
|
||||
<script type="text/x-template" id="group-form-template">
|
||||
<form method="POST" action="{{ route('admin.catalog.families.store') }}" data-vv-scope="add-group-form" @submit.prevent="addGroup('add-group-form')">
|
||||
|
|
@ -340,4 +340,4 @@
|
|||
}
|
||||
});
|
||||
</script>
|
||||
@stop
|
||||
@endpush
|
||||
|
|
@ -69,7 +69,7 @@
|
|||
</modal>
|
||||
@stop
|
||||
|
||||
@section('javascript')
|
||||
@push('scripts')
|
||||
|
||||
<script type="text/x-template" id="group-form-template">
|
||||
<form method="POST" action="{{ route('admin.catalog.families.store') }}" data-vv-scope="add-group-form" @submit.prevent="addGroup('add-group-form')">
|
||||
|
|
@ -342,4 +342,4 @@
|
|||
}
|
||||
});
|
||||
</script>
|
||||
@stop
|
||||
@endpush
|
||||
|
|
@ -37,7 +37,7 @@
|
|||
</div>
|
||||
</modal>
|
||||
|
||||
@section('javascript')
|
||||
@push('scripts')
|
||||
@parent
|
||||
|
||||
<script type="text/x-template" id="variant-form-template">
|
||||
|
|
@ -343,5 +343,5 @@
|
|||
|
||||
});
|
||||
</script>
|
||||
@stop
|
||||
@endpush
|
||||
@endif
|
||||
|
|
@ -131,7 +131,7 @@
|
|||
</div>
|
||||
@stop
|
||||
|
||||
@section('javascript')
|
||||
@push('scripts')
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$('.label .cross-icon').on('click', function(e) {
|
||||
|
|
@ -143,4 +143,4 @@
|
|||
})
|
||||
});
|
||||
</script>
|
||||
@stop
|
||||
@endpush
|
||||
|
|
@ -53,7 +53,7 @@
|
|||
|
||||
<input name="_method" type="hidden" value="PUT">
|
||||
|
||||
@foreach($product->attribute_family->attribute_groups as $attributeGroup)
|
||||
@foreach ($product->attribute_family->attribute_groups as $attributeGroup)
|
||||
@if(count($attributeGroup->custom_attributes))
|
||||
<accordian :title="'{{ __($attributeGroup->name) }}'" :active="true">
|
||||
<div slot="body">
|
||||
|
|
@ -119,11 +119,15 @@
|
|||
@endif
|
||||
@endforeach
|
||||
|
||||
@foreach($form_accordians->items as $accordian)
|
||||
|
||||
@include ($accordian['view'])
|
||||
@if ($form_accordians)
|
||||
|
||||
@endforeach
|
||||
@foreach ($form_accordians->items as $accordian)
|
||||
|
||||
@include ($accordian['view'])
|
||||
|
||||
@endforeach
|
||||
|
||||
@endif
|
||||
|
||||
</div>
|
||||
|
||||
|
|
@ -131,7 +135,7 @@
|
|||
</div>
|
||||
@stop
|
||||
|
||||
@section('javascript')
|
||||
@push('scripts')
|
||||
<script>
|
||||
|
||||
$(document).ready(function () {
|
||||
|
|
@ -143,4 +147,4 @@
|
|||
})
|
||||
});
|
||||
</script>
|
||||
@stop
|
||||
@endpush
|
||||
|
|
@ -52,7 +52,7 @@
|
|||
<script type="text/javascript" src="{{ asset('vendor/webkul/admin/assets/js/admin.js') }}"></script>
|
||||
<script type="text/javascript" src="{{ asset('vendor/webkul/ui/assets/js/ui.js') }}"></script>
|
||||
|
||||
@yield('javascript')
|
||||
@stack('scripts')
|
||||
|
||||
<div class="modal-overlay"></div>
|
||||
</body>
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@
|
|||
</div>
|
||||
@stop
|
||||
|
||||
@section('javascript')
|
||||
@push('scripts')
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$('#permission_type').on('change', function(e) {
|
||||
|
|
@ -73,4 +73,4 @@
|
|||
})
|
||||
});
|
||||
</script>
|
||||
@stop
|
||||
@endpush
|
||||
|
|
@ -62,7 +62,7 @@
|
|||
</div>
|
||||
@stop
|
||||
|
||||
@section('javascript')
|
||||
@push('scripts')
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$('#permission_type').on('change', function(e) {
|
||||
|
|
@ -75,4 +75,4 @@
|
|||
})
|
||||
});
|
||||
</script>
|
||||
@stop
|
||||
@endpush
|
||||
|
|
@ -6,6 +6,8 @@
|
|||
|
||||
@section('content')
|
||||
|
||||
@inject ('datagrid', 'Webkul\Admin\Datagrids\User')
|
||||
|
||||
<div class="content">
|
||||
<div class="page-header">
|
||||
<div class="page-title">
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ class AttributeFamilyTableSeeder extends Seeder
|
|||
"name" => "General",
|
||||
"is_user_defined" => 0,
|
||||
"position" => 1,
|
||||
"attributes" => [
|
||||
"custom_attributes" => [
|
||||
[
|
||||
'code' => 'sku',
|
||||
'position' => 1
|
||||
|
|
@ -48,7 +48,7 @@ class AttributeFamilyTableSeeder extends Seeder
|
|||
"name" => "Description",
|
||||
"is_user_defined" => 0,
|
||||
"position" => 2,
|
||||
"attributes" => [
|
||||
"custom_attributes" => [
|
||||
[
|
||||
'code' => 'short_description',
|
||||
'position' => 1
|
||||
|
|
@ -61,7 +61,7 @@ class AttributeFamilyTableSeeder extends Seeder
|
|||
"name" => "Meta Description",
|
||||
"is_user_defined" => 0,
|
||||
"position" => 3,
|
||||
"attributes" => [
|
||||
"custom_attributes" => [
|
||||
[
|
||||
'code' => 'meta_title',
|
||||
'position' => 1
|
||||
|
|
@ -77,7 +77,7 @@ class AttributeFamilyTableSeeder extends Seeder
|
|||
"name" => "Price",
|
||||
"is_user_defined" => 0,
|
||||
"position" => 4,
|
||||
"attributes" => [
|
||||
"custom_attributes" => [
|
||||
[
|
||||
'code' => 'price',
|
||||
'position' => 1
|
||||
|
|
@ -99,7 +99,7 @@ class AttributeFamilyTableSeeder extends Seeder
|
|||
"name" => "Shipping",
|
||||
"is_user_defined" => 0,
|
||||
"position" => 5,
|
||||
"attributes" => [
|
||||
"custom_attributes" => [
|
||||
[
|
||||
'code' => 'width',
|
||||
'position' => 1
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ class AttributeTableSeeder extends Seeder
|
|||
'is_required' => 1,
|
||||
'value_per_locale' => 0,
|
||||
'value_per_channel' => 0,
|
||||
'is_filterable' => 1,
|
||||
'is_filterable' => 0,
|
||||
'is_configurable' => 0,
|
||||
'is_user_defined' => 0
|
||||
], [
|
||||
|
|
@ -37,7 +37,7 @@ class AttributeTableSeeder extends Seeder
|
|||
'is_required' => 1,
|
||||
'value_per_locale' => 1,
|
||||
'value_per_channel' => 1,
|
||||
'is_filterable' => 1,
|
||||
'is_filterable' => 0,
|
||||
'is_configurable' => 0,
|
||||
'is_user_defined' => 0
|
||||
], [
|
||||
|
|
@ -258,7 +258,7 @@ class AttributeTableSeeder extends Seeder
|
|||
'name' => 'Width'
|
||||
],
|
||||
'type' => 'text',
|
||||
'validation' => 'number',
|
||||
'validation' => 'numeric',
|
||||
'position' => 18,
|
||||
'is_required' => 0,
|
||||
'value_per_locale' => 0,
|
||||
|
|
@ -273,7 +273,7 @@ class AttributeTableSeeder extends Seeder
|
|||
'name' => 'Height'
|
||||
],
|
||||
'type' => 'text',
|
||||
'validation' => 'number',
|
||||
'validation' => 'numeric',
|
||||
'position' => 19,
|
||||
'is_required' => 0,
|
||||
'value_per_locale' => 0,
|
||||
|
|
@ -288,7 +288,7 @@ class AttributeTableSeeder extends Seeder
|
|||
'name' => 'Depth'
|
||||
],
|
||||
'type' => 'text',
|
||||
'validation' => 'number',
|
||||
'validation' => 'numeric',
|
||||
'position' => 20,
|
||||
'is_required' => 0,
|
||||
'value_per_locale' => 0,
|
||||
|
|
@ -303,7 +303,7 @@ class AttributeTableSeeder extends Seeder
|
|||
'name' => 'Weight'
|
||||
],
|
||||
'type' => 'text',
|
||||
'validation' => 'number',
|
||||
'validation' => 'numeric',
|
||||
'position' => 21,
|
||||
'is_required' => 1,
|
||||
'value_per_locale' => 0,
|
||||
|
|
|
|||
|
|
@ -21,4 +21,23 @@ class Attribute extends TranslatableModel
|
|||
{
|
||||
return $this->hasMany(AttributeOption::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the options.
|
||||
*/
|
||||
public function filter_attributes()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Scope a query to only include popular users.
|
||||
*
|
||||
* @param \Illuminate\Database\Eloquent\Builder $query
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
public function scopeFilterableAttributes($query)
|
||||
{
|
||||
return $query->where('is_filterable', 1)->orderBy('position');
|
||||
}
|
||||
}
|
||||
|
|
@ -70,13 +70,14 @@ class AttributeFamilyRepository extends Repository
|
|||
unset($group['custom_attributes']);
|
||||
$attributeGroup = $family->attribute_groups()->create($group);
|
||||
|
||||
foreach ($custom_attributes as $attribute) {
|
||||
foreach ($custom_attributes as $key => $attribute) {
|
||||
if(isset($attribute['id'])) {
|
||||
$attributeGroup->custom_attributes()->attach($attribute['id']);
|
||||
$attributeModel = $this->attribute->find($attribute['id']);
|
||||
} else {
|
||||
$attributeModel = $this->attribute->findBy('code', $attribute['code']);
|
||||
$attributeGroup->custom_attributes()->save($attributeModel, ['position' => $attribute['position']]);
|
||||
}
|
||||
|
||||
$attributeGroup->custom_attributes()->save($attributeModel, ['position' => $key + 1]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -103,8 +104,9 @@ class AttributeFamilyRepository extends Repository
|
|||
$attributeGroup = $family->attribute_groups()->create($attributeGroupInputs);
|
||||
|
||||
if(isset($attributeGroupInputs['custom_attributes'])) {
|
||||
foreach ($attributeGroupInputs['custom_attributes'] as $attribute) {
|
||||
$attributeGroup->custom_attributes()->attach($attribute['id']);
|
||||
foreach ($attributeGroupInputs['custom_attributes'] as $key => $attribute) {
|
||||
$attributeModel = $this->attribute->find($attribute['id']);
|
||||
$attributeGroup->custom_attributes()->save($attributeModel, ['position' => $key + 1]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
|
@ -118,11 +120,12 @@ class AttributeFamilyRepository extends Repository
|
|||
$attributeIds = $attributeGroup->custom_attributes()->get()->pluck('id');
|
||||
|
||||
if(isset($attributeGroupInputs['custom_attributes'])) {
|
||||
foreach ($attributeGroupInputs['custom_attributes'] as $attribute) {
|
||||
foreach ($attributeGroupInputs['custom_attributes'] as $key => $attribute) {
|
||||
if(is_numeric($index = $attributeIds->search($attribute['id']))) {
|
||||
$attributeIds->forget($index);
|
||||
} else {
|
||||
$attributeGroup->custom_attributes()->attach($attribute['id']);
|
||||
$attributeModel = $this->attribute->find($attribute['id']);
|
||||
$attributeGroup->custom_attributes()->save($attributeModel, ['position' => $key + 1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,6 +50,8 @@ class AttributeRepository extends Repository
|
|||
*/
|
||||
public function create(array $data)
|
||||
{
|
||||
$data = $this->validateUserInput($data);
|
||||
|
||||
$options = isset($data['options']) ? $data['options'] : [];
|
||||
unset($data['options']);
|
||||
$attribute = $this->model->create($data);
|
||||
|
|
@ -71,6 +73,8 @@ class AttributeRepository extends Repository
|
|||
*/
|
||||
public function update(array $data, $id, $attribute = "id")
|
||||
{
|
||||
$data = $this->validateUserInput($data);
|
||||
|
||||
$attribute = $this->findOrFail($id);
|
||||
|
||||
$attribute->update($data);
|
||||
|
|
@ -99,4 +103,29 @@ class AttributeRepository extends Repository
|
|||
|
||||
return $attribute;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $data
|
||||
* @return array
|
||||
*/
|
||||
public function validateUserInput($data)
|
||||
{
|
||||
if($data['is_configurable']) {
|
||||
$data['value_per_channel'] = $data['value_per_locale'] = 0;
|
||||
}
|
||||
|
||||
if(!in_array($data['type'], ['select', 'multiselect', 'price'])) {
|
||||
$data['is_filterable'] = 0;
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getFilterAttributes()
|
||||
{
|
||||
return $this->model->filterableAttributes()->get();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Product\Http\Controllers;
|
||||
|
||||
use Illuminate\Foundation\Bus\DispatchesJobs;
|
||||
use Illuminate\Routing\Controller as BaseController;
|
||||
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||
|
||||
class Controller extends BaseController
|
||||
{
|
||||
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
|
||||
}
|
||||
|
|
@ -125,7 +125,7 @@ class ProductController extends Controller
|
|||
$this->validate(request(), [
|
||||
'type' => 'required',
|
||||
'attribute_family_id' => 'required',
|
||||
'sku' => ['required', 'unique:products,sku', new \Webkul\Core\Contracts\Validations\Code]
|
||||
'sku' => ['required', 'unique:products,sku', new \Webkul\Core\Contracts\Validations\Slug]
|
||||
]);
|
||||
|
||||
$product = $this->product->create(request()->all());
|
||||
|
|
|
|||
|
|
@ -1,24 +1,25 @@
|
|||
{
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "npm run development",
|
||||
"development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
|
||||
"watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
|
||||
"watch-poll": "cross-env npm run watch -- --watch-poll --progress",
|
||||
"hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
|
||||
"prod": "npm run production",
|
||||
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"axios": "^0.18",
|
||||
"cross-env": "^5.1.4",
|
||||
"laravel-mix": "^2.1",
|
||||
"laravel-mix-merge-manifest": "^0.1.1",
|
||||
"jquery": "^3.2",
|
||||
"vue": "^2.1.10"
|
||||
},
|
||||
"dependencies": {
|
||||
"vee-validate": "2.0.0-rc.26",
|
||||
"vue-flatpickr": "^2.3.0"
|
||||
}
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "npm run development",
|
||||
"development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
|
||||
"watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
|
||||
"watch-poll": "cross-env npm run watch -- --watch-poll --progress",
|
||||
"hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
|
||||
"prod": "npm run production",
|
||||
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"axios": "^0.18",
|
||||
"cross-env": "^5.1.4",
|
||||
"laravel-mix": "^2.1",
|
||||
"laravel-mix-merge-manifest": "^0.1.1",
|
||||
"jquery": "^3.2",
|
||||
"vue": "^2.1.10"
|
||||
},
|
||||
"dependencies": {
|
||||
"vee-validate": "2.0.0-rc.26",
|
||||
"vue-flatpickr": "^2.3.0",
|
||||
"vue-slider-component": "^2.7.5"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,12 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Shop\Http\Controllers;
|
||||
|
||||
use Illuminate\Foundation\Bus\DispatchesJobs;
|
||||
use Illuminate\Routing\Controller as BaseController;
|
||||
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||
|
||||
class Controller extends BaseController
|
||||
{
|
||||
use DispatchesJobs, ValidatesRequests;
|
||||
}
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Shop\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response;
|
||||
|
||||
/**
|
||||
* Product controller
|
||||
*
|
||||
* @author Jitendra Singh <jitendra@webkul.com>
|
||||
* @copyright 2018 Webkul Software Pvt Ltd (http://www.webkul.com)
|
||||
*/
|
||||
class ProductController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Contains route related configuration
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_config;
|
||||
|
||||
/**
|
||||
* Create a new controller instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->_config = request('_config');
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return view('shop::products.index');
|
||||
// return view($this->_config['view']);
|
||||
}
|
||||
}
|
||||
|
|
@ -2,10 +2,10 @@
|
|||
|
||||
Route::group(['middleware' => ['web']], function () {
|
||||
Route::get('/', 'Webkul\Shop\Http\Controllers\HomeController@index')->defaults('_config', [
|
||||
'view' => 'shop::store.home.index'
|
||||
]);
|
||||
});
|
||||
'view' => 'shop::store.home.index'
|
||||
]);
|
||||
|
||||
Route::group(['middleware' => ['web']], function () {
|
||||
Route::get('/foo', 'Webkul\Shop\Http\Controllers\HomeController@index1');
|
||||
});
|
||||
Route::get('/categories/{slug}', 'Webkul\Shop\Http\Controllers\ProductController@index')->defaults('_config', [
|
||||
'view' => 'shop::products.index'
|
||||
]);
|
||||
});
|
||||
|
|
@ -17,7 +17,7 @@ class ComposerServiceProvider extends ServiceProvider
|
|||
public function boot()
|
||||
{
|
||||
//using the class based composers...
|
||||
View::composer('shop::store.header.index', 'Webkul\Shop\Http\ViewComposers\Categories\CategoryComposer');
|
||||
View::composer('shop::layouts.header.index', 'Webkul\Shop\Http\ViewComposers\Categories\CategoryComposer');
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -8,8 +8,6 @@ use Illuminate\Routing\Router;
|
|||
use Illuminate\Support\Facades\Blade;
|
||||
use Webkul\Shop\Providers\ComposerServiceProvider;
|
||||
|
||||
// use Webkul\Shop\Providers\EventServiceProvider;
|
||||
|
||||
class ShopServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
|
|
@ -24,17 +22,11 @@ class ShopServiceProvider extends ServiceProvider
|
|||
$this->loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'shop');
|
||||
|
||||
$this->publishes([
|
||||
__DIR__ . '/../../publishable/assets' => public_path('vendor/webkul/shop/assets'),
|
||||
__DIR__ . '/../../publishable/assets' => public_path('themes/default/assets'),
|
||||
], 'public');
|
||||
|
||||
$this->loadViewsFrom(__DIR__ . '/../Resources/views', 'shop');
|
||||
|
||||
// $this->composeView();
|
||||
|
||||
Blade::directive('continue', function () {
|
||||
return "<?php continue; ?>";
|
||||
});
|
||||
|
||||
$this->app->register(ComposerServiceProvider::class);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="8px" height="8px" viewBox="0 0 8 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 50 (54983) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>icon-dropdown</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="icon-dropdown" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<polygon id="›" fill="#242424" transform="translate(4.000000, 4.514496) rotate(-270.000000) translate(-4.000000, -4.514496) " points="1.48080444 8.51449585 4.54690552 4.51449585 1.48080444 0.51449585 3.48550415 0.51449585 6.51919556 4.51449585 3.48550415 8.51449585"></polygon>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 743 B |
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="8px" height="8px" viewBox="0 0 8 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 50 (54983) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>icon-dropdown-up</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="icon-dropdown-up" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<polygon id="›" fill="#242424" transform="translate(4.000000, 3.519196) scale(1, -1) rotate(-270.000000) translate(-4.000000, -3.519196) " points="1.48080444 7.51919556 4.54690552 3.51919556 1.48080444 -0.480804443 3.48550415 -0.480804443 6.51919556 3.51919556 3.48550415 7.51919556"></polygon>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 766 B |
|
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 50 (54983) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>checkbox/selected copy</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="checkbox/selected-copy" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<rect id="Rectangle-4" fill="#FF6472" x="0" y="0" width="16" height="16"></rect>
|
||||
<polygon id="↘" fill="#FFFFFF" transform="translate(7.957703, 8.601837) rotate(-270.000000) translate(-7.957703, -8.601837) " points="11.5595398 10.1021423 7.70584106 13.5595398 6.31204224 11.8957825 8.58901978 9.87234497 4.35586548 5.13290405 5.86581421 3.64413452"></polygon>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 854 B |
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 50 (54983) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>checkbox/unselected</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="checkbox/unselected" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<rect id="Rectangle-4" stroke="#B9B9B9" x="0.5" y="0.5" width="15" height="15"></rect>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 566 B |
|
|
@ -9,6 +9,7 @@ Vue.use(VeeValidate);
|
|||
Vue.component("category-nav", require("./components/category-nav.vue"));
|
||||
Vue.component("category-item", require("./components/category-item.vue"));
|
||||
Vue.component("image-slider", require("./components/imageSlider.vue"));
|
||||
Vue.component("vue-slider", require("vue-slider-component"));
|
||||
|
||||
$(document).ready(function () {
|
||||
|
||||
|
|
|
|||
|
|
@ -1507,3 +1507,85 @@ body {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.layered-filter-wrapper {
|
||||
width: 20%;
|
||||
|
||||
.filter-title {
|
||||
border-bottom: 1px solid #E8E8E8;
|
||||
font-size: 16px;
|
||||
color: #242424;
|
||||
padding: 10px 0;
|
||||
}
|
||||
|
||||
.filter-attributes {
|
||||
.filter-attributes-item {
|
||||
border-bottom: 1px solid #E8E8E8;
|
||||
padding-bottom: 10px;
|
||||
|
||||
.filter-attributes-title {
|
||||
padding: 10px 40px 0 10px;
|
||||
font-size: 16px;
|
||||
color: #5E5E5E;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
|
||||
.icon {
|
||||
background-image: url('../images/arrow-down.svg') !important;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
position: absolute;
|
||||
right: 15px;
|
||||
top: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
.filter-attributes-content {
|
||||
padding: 10px;
|
||||
display: none;
|
||||
|
||||
ol.items {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
list-style: none none;
|
||||
|
||||
li.item {
|
||||
padding: 8px 0;
|
||||
font-size: 16px;
|
||||
color: #5E5E5E;
|
||||
|
||||
.checkbox {
|
||||
margin: 0;
|
||||
|
||||
.checkbox-view {
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
background-image: url("../images/checkbox.svg");
|
||||
}
|
||||
|
||||
input:checked + .checkbox-view {
|
||||
background-image: url("../images/checkbox-checked.svg");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.price-range-wrapper {
|
||||
margin-top: 21px;
|
||||
}
|
||||
}
|
||||
|
||||
&.active {
|
||||
.filter-attributes-content {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.filter-attributes-title .icon {
|
||||
background-image: url('../images//arrow-up.svg') !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -8,4 +8,4 @@
|
|||
height: 8px;
|
||||
margin-left:auto;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
}
|
||||
|
|
@ -31,4 +31,8 @@ return [
|
|||
'button_title' => 'Sign In'
|
||||
]
|
||||
],
|
||||
|
||||
'products' => [
|
||||
'layered-nav-title' => 'Shop By'
|
||||
]
|
||||
];
|
||||
|
|
@ -75,7 +75,8 @@
|
|||
@include('shop::store.header.nav-menu.navmenu')
|
||||
</div>
|
||||
</div>
|
||||
@section('javascript')
|
||||
|
||||
@push('scripts')
|
||||
<script>
|
||||
$(window).resize(function() {
|
||||
var w = $(document).width();
|
||||
|
|
@ -116,4 +117,4 @@
|
|||
/* Responsiveness script ends here */
|
||||
});
|
||||
</script>
|
||||
@endsection
|
||||
@endpush
|
||||
|
|
@ -2,28 +2,41 @@
|
|||
<html lang="{{ config('app.locale') }}">
|
||||
|
||||
<head>
|
||||
|
||||
<title>@yield('page_title')</title>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
<link rel="stylesheet" href="{{ asset('vendor/webkul/shop/assets/css/shop.css') }}">
|
||||
<link rel="stylesheet" href="{{ bagisto_asset('css/shop.css') }}">
|
||||
<link rel="stylesheet" href="{{ asset('vendor/webkul/ui/assets/css/ui.css') }}">
|
||||
|
||||
@yield('head')
|
||||
|
||||
@yield('css')
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div id="app">
|
||||
@include('shop::store.header.index')
|
||||
|
||||
@include('shop::layouts.header.index')
|
||||
|
||||
@yield('slider')
|
||||
|
||||
<div class="main-container-wrapper">
|
||||
|
||||
<div class="content-container">
|
||||
|
||||
@yield('content-wrapper')
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@include('shop::store.footer.index')
|
||||
|
||||
@include('shop::layouts.footer')
|
||||
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
|
@ -41,10 +54,12 @@
|
|||
window.serverErrors = @json($errors->getMessages());
|
||||
@endif
|
||||
</script>
|
||||
<script type="text/javascript" src="{{ asset('vendor/webkul/shop/assets/js/shop.js') }}"></script>
|
||||
|
||||
<script type="text/javascript" src="{{ bagisto_asset('js/shop.js') }}"></script>
|
||||
<script type="text/javascript" src="{{ asset('vendor/webkul/ui/assets/js/ui.js') }}"></script>
|
||||
@yield('javascript')
|
||||
|
||||
@stack('scripts')
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
@extends('shop::layouts.master')
|
||||
|
||||
@section('content-wrapper')
|
||||
|
||||
@include ('shop::products.layered-navigation')
|
||||
|
||||
@stop
|
||||
|
||||
@push('scripts')
|
||||
|
||||
@endpush
|
||||
|
|
@ -0,0 +1,139 @@
|
|||
@inject ('attributeRepository', 'Webkul\Attribute\Repositories\AttributeRepository')
|
||||
|
||||
<layered-navigation></layered-navigation>
|
||||
|
||||
@push('scripts')
|
||||
<script type="text/x-template" id="layered-navigation-template">
|
||||
<div class="layered-filter-wrapper">
|
||||
|
||||
<div class="filter-title">
|
||||
{{ __('shop::app.products.layered-nav-title') }}
|
||||
</div>
|
||||
|
||||
<div class="filter-content">
|
||||
|
||||
<div class="filter-attributes">
|
||||
|
||||
<filter-attribute-item v-for='(attribute, index) in attributes' :attribute="attribute" :key="index" :index="index" @onFilterAdded="addFilters(attribute.code, $event)"></filter-attribute-item>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script type="text/x-template" id="filter-attribute-item-template">
|
||||
<div class="filter-attributes-item" :class="[active ? 'active' : '']">
|
||||
|
||||
<div class="filter-attributes-title" @click="active = !active">
|
||||
@{{ attribute.name }}
|
||||
|
||||
<i class="icon" :class="[active ? 'arrow-up-icon' : 'arrow-down-icon']"></i>
|
||||
</div>
|
||||
|
||||
<div class="filter-attributes-content">
|
||||
|
||||
<ol class="items" v-if="attribute.type != 'price'">
|
||||
<li class="item" v-for='(option, index) in attribute.options'>
|
||||
|
||||
<span class="checkbox">
|
||||
<input type="checkbox" :id="option.id" :value="option.id" @change="addFilter($event)"/>
|
||||
<label class="checkbox-view" :for="option.id"></label>
|
||||
@{{ option.label }}
|
||||
</span>
|
||||
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<div class="price-range-wrapper" v-if="attribute.type == 'price'">
|
||||
<vue-slider
|
||||
ref="slider"
|
||||
v-model="sliderConfig.value"
|
||||
:process-style="sliderConfig.processStyle"
|
||||
:tooltip-style="sliderConfig.tooltipStyle"
|
||||
:max="sliderConfig.max"
|
||||
:lazy="true"
|
||||
@callback="priceRangeUpdated($event)"
|
||||
></vue-slider>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script>
|
||||
Vue.component('layered-navigation', {
|
||||
|
||||
template: '#layered-navigation-template',
|
||||
|
||||
data: () => ({
|
||||
attributes: @json($attributeRepository->getFilterAttributes()),
|
||||
appliedFilters: {}
|
||||
}),
|
||||
|
||||
methods: {
|
||||
addFilters (attributeCode, filters) {
|
||||
if(filters.length) {
|
||||
this.appliedFilters[attributeCode] = filters;
|
||||
} else {
|
||||
delete this.appliedFilters[attributeCode];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
Vue.component('filter-attribute-item', {
|
||||
|
||||
template: '#filter-attribute-item-template',
|
||||
|
||||
props: ['index', 'attribute'],
|
||||
|
||||
data: () => ({
|
||||
appliedFilters: [],
|
||||
active: false,
|
||||
sliderConfig: {
|
||||
value: [
|
||||
100,
|
||||
250
|
||||
],
|
||||
max: 500,
|
||||
processStyle: {
|
||||
"backgroundColor": "#FF6472"
|
||||
},
|
||||
tooltipStyle: {
|
||||
"backgroundColor": "#FF6472",
|
||||
"borderColor": "#FF6472"
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
created () {
|
||||
if(!this.index)
|
||||
this.active = true;
|
||||
},
|
||||
|
||||
methods: {
|
||||
addFilter (e) {
|
||||
if(event.target.checked) {
|
||||
this.appliedFilters.push(event.target.value);
|
||||
} else {
|
||||
let index = this.appliedFilters.indexOf(event.target.value)
|
||||
|
||||
this.appliedFilters.splice(index, 1)
|
||||
}
|
||||
|
||||
this.$emit('onFilterAdded', this.appliedFilters)
|
||||
},
|
||||
|
||||
priceRangeUpdated (value) {
|
||||
console.log(value)
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
@endpush
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
<title>Foo</title>
|
||||
<style>
|
||||
.container {
|
||||
box-sizing: border-box;
|
||||
max-width: 50%;
|
||||
border: 1px solid green;
|
||||
height: 95vh;
|
||||
}
|
||||
|
||||
.last-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, minmax(47.5%, 1fr));
|
||||
grid-gap: 5%;
|
||||
}
|
||||
|
||||
.block1 {
|
||||
display: block;
|
||||
box-sizing: border-box;
|
||||
background: pink;
|
||||
height: 95vh;
|
||||
}
|
||||
|
||||
.block2 {
|
||||
display: block;
|
||||
box-sizing: border-box;
|
||||
/* background: red; */
|
||||
height: 95vh;
|
||||
display: grid;
|
||||
grid-template-rows: 47.5% 47.5%;
|
||||
grid-row-gap: 5%;
|
||||
}
|
||||
|
||||
.sub-block1 {
|
||||
display: block;
|
||||
box-sizing: border-box;
|
||||
background: green;
|
||||
}
|
||||
|
||||
.sub-block2 {
|
||||
display: block;
|
||||
box-sizing: border-box;
|
||||
background: paleturquoise;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="last-grid">
|
||||
<div class="block1"></div>
|
||||
<div class="block2">
|
||||
<div class="sub-block1"></div>
|
||||
<div class="sub-block2"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
|
@ -2,16 +2,13 @@ const { mix } = require("laravel-mix");
|
|||
require("laravel-mix-merge-manifest");
|
||||
|
||||
// var publicPath = 'publishable/assets';
|
||||
var publicPath = "../../../public/vendor/webkul/shop/assets";
|
||||
var publicPath = "../../../public/themes/default/assets";
|
||||
|
||||
mix.setPublicPath(publicPath).mergeManifest();
|
||||
mix.disableNotifications();
|
||||
|
||||
mix.js([__dirname + "/src/Resources/assets/js/app.js"], "js/shop.js")
|
||||
// .copyDirectory(
|
||||
// __dirname + "/src/Resources/assets/images",
|
||||
// publicPath + "/images"
|
||||
// )
|
||||
.copy(__dirname + "/src/Resources/assets/images", publicPath + "/images")
|
||||
.sass(__dirname + "/src/Resources/assets/sass/app.scss", "css/shop.css")
|
||||
.options({
|
||||
processCssUrls: false
|
||||
|
|
|
|||
|
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"name": "webkul/laravel-theme",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Jitendra Singh",
|
||||
"email": "jitendra@webkul.com"
|
||||
}
|
||||
],
|
||||
"require": {},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Webkul\\Theme\\": "src/"
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"providers": [
|
||||
"Webkul\\Theme\\ThemeServiceProvider"
|
||||
],
|
||||
"aliases": {}
|
||||
}
|
||||
},
|
||||
"minimum-stability": "dev"
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Theme\Exceptions;
|
||||
|
||||
class ThemeAlreadyExists extends \Exception {
|
||||
|
||||
public function __construct($theme) {
|
||||
parent::__construct("Theme {$theme->name} already exists", 1);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
<?php namespace Webkul\Theme\Exceptions;
|
||||
|
||||
class ThemeNotFound extends \Exception {
|
||||
|
||||
public function __construct($themeName) {
|
||||
parent::__construct("Theme $themeName not Found", 1);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Theme\Facades;
|
||||
|
||||
use Illuminate\Support\Facades\Facade;
|
||||
|
||||
class Themes extends Facade
|
||||
{
|
||||
/**
|
||||
* Get the registered name of the component.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected static function getFacadeAccessor()
|
||||
{
|
||||
return 'themes';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
|
||||
use Webkul\Theme\Themes;
|
||||
|
||||
if (! function_exists('themes')) {
|
||||
function themes()
|
||||
{
|
||||
return new Themes;
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('bagisto_asset')) {
|
||||
function bagisto_asset($path, $secure = null)
|
||||
{
|
||||
return app()->make('themes')->url($path, $secure);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Theme\Providers;
|
||||
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Illuminate\Foundation\AliasLoader;
|
||||
use Webkul\Theme\Themes;
|
||||
use Webkul\Theme\Facades\Themes as ThemeFacade;
|
||||
|
||||
class ThemeServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Bootstrap services.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function boot()
|
||||
{
|
||||
include __DIR__ . '/../Http/helpers.php';
|
||||
}
|
||||
|
||||
/**
|
||||
* Register services.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register()
|
||||
{
|
||||
$this->app->singleton('themes', function () {
|
||||
return new Themes();
|
||||
});
|
||||
|
||||
$this->app->singleton('view.finder', function ($app) {
|
||||
return new \Webkul\Theme\ThemeViewFinder(
|
||||
$app['files'],
|
||||
$app['config']['view.paths'],
|
||||
null
|
||||
);
|
||||
});
|
||||
|
||||
$themes = $this->app->make('themes');
|
||||
|
||||
if (!$themes->current() && \Config::get('themes.default')) {
|
||||
$themes->set(\Config::get('themes.default'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,140 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Theme;
|
||||
|
||||
use Illuminate\Support\Facades\Config;
|
||||
use Webkul\Theme\Facades\Themes as Themes;
|
||||
|
||||
class Theme
|
||||
{
|
||||
/**
|
||||
* Contains theme code
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $code;
|
||||
|
||||
/**
|
||||
* Contains theme name
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $name;
|
||||
|
||||
/**
|
||||
* Contains theme views path
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $viewsPath;
|
||||
|
||||
/**
|
||||
* Contains theme assets path
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $assetsPath;
|
||||
|
||||
/**
|
||||
* Contains theme parent
|
||||
*
|
||||
* @var Theme
|
||||
*/
|
||||
public $parent;
|
||||
|
||||
/**
|
||||
* Create a new Theme instance.
|
||||
*
|
||||
* @param string $code
|
||||
* @param string $name
|
||||
* @param string $assetsPath
|
||||
* @param string $viewsPath
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($code, $name = null, $assetsPath = null, $viewsPath = null)
|
||||
{
|
||||
$this->code = $code;
|
||||
|
||||
$this->name = $name;
|
||||
|
||||
$this->assetsPath = $assetsPath === null ? $code : $assetsPath;
|
||||
|
||||
$this->viewsPath = $viewsPath === null ? $code : $viewsPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the parent
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setParent(Theme $parent)
|
||||
{
|
||||
$this->parent = $parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the parent
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getParent()
|
||||
{
|
||||
return $this->parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return all the possible view paths
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getViewPaths()
|
||||
{
|
||||
$paths = [];
|
||||
|
||||
$theme = $this;
|
||||
|
||||
do {
|
||||
if (substr($theme->viewsPath, 0, 1) === DIRECTORY_SEPARATOR) {
|
||||
$path = base_path(substr($theme->viewsPath, 1));
|
||||
} else {
|
||||
$path = $theme->viewsPath;
|
||||
}
|
||||
|
||||
if (!in_array($path, $paths)) {
|
||||
$paths[] = $path;
|
||||
}
|
||||
} while ($theme = $theme->parent);
|
||||
|
||||
return $paths;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert to asset url based on current theme
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function url($url, $secure = null)
|
||||
{
|
||||
$url = ltrim($url, '/');
|
||||
|
||||
if (preg_match('/^((http(s?):)?\/\/)/i', $url)) {
|
||||
return $url;
|
||||
}
|
||||
|
||||
if (preg_match('/^((http(s?):)?\/\/)/i', $this->assetsPath)) {
|
||||
return $this->assetsPath . '/' . $url;
|
||||
}
|
||||
|
||||
$fullUrl = str_replace("public/", "", $this->assetsPath) . '/' . $url;
|
||||
|
||||
if (file_exists(public_path($fullUrl))) {
|
||||
return asset($fullUrl, $secure);
|
||||
}
|
||||
|
||||
if ($parentTheme = $this->getParent()) {
|
||||
return $parentTheme->url($url);
|
||||
}
|
||||
|
||||
return asset($url, $secure);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Theme;
|
||||
|
||||
use Webkul\Theme\Facades\Themes;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\View\FileViewFinder;
|
||||
|
||||
class ThemeViewFinder extends FileViewFinder
|
||||
{
|
||||
/*
|
||||
* Override findNamespacedView() to add "resources/themes/theme_name/views/..." paths
|
||||
*
|
||||
* @param string $name
|
||||
* @return string
|
||||
*/
|
||||
protected function findNamespacedView($name)
|
||||
{
|
||||
// Extract the $view and the $namespace parts
|
||||
list($namespace, $view) = $this->parseNamespaceSegments($name);
|
||||
|
||||
$paths = $this->addThemeNamespacePaths($namespace);
|
||||
|
||||
// Find and return the view
|
||||
return $this->findInPaths($view, $paths);
|
||||
}
|
||||
|
||||
public function addThemeNamespacePaths($namespace)
|
||||
{
|
||||
if (!isset($this->hints[$namespace])) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$paths = $this->hints[$namespace];
|
||||
|
||||
$searchPaths = array_diff($this->paths, Themes::getLaravelViewPaths());
|
||||
|
||||
foreach (array_reverse($searchPaths) as $path) {
|
||||
$newPath = base_path() . '/' . $path;
|
||||
|
||||
$paths = Arr::prepend($paths, $newPath);
|
||||
|
||||
}
|
||||
|
||||
return $paths;
|
||||
}
|
||||
|
||||
/**
|
||||
* Override replaceNamespace() to add path for custom error pages "resources/themes/theme_name/views/errors/..."
|
||||
*
|
||||
* @param string $namespace
|
||||
* @param string|array $hints
|
||||
* @return void
|
||||
*/
|
||||
public function replaceNamespace($namespace, $hints)
|
||||
{
|
||||
$this->hints[$namespace] = (array) $hints;
|
||||
|
||||
// Overide Error Pages
|
||||
if ($namespace == 'errors' || $namespace == 'mails') {
|
||||
$searchPaths = array_diff($this->paths, Themes::getLaravelViewPaths());
|
||||
|
||||
$addPaths = array_map(function ($path) use ($namespace) {
|
||||
return base_path() . '/' . "$path/$namespace";
|
||||
}, $searchPaths);
|
||||
|
||||
$this->prependNamespace($namespace, $addPaths);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the array of paths where the views are being searched.
|
||||
*
|
||||
* @param array $paths
|
||||
*/
|
||||
public function setPaths($paths)
|
||||
{
|
||||
$this->paths = $paths;
|
||||
$this->flush();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,207 @@
|
|||
<?php
|
||||
|
||||
namespace Webkul\Theme;
|
||||
|
||||
use Illuminate\Support\Facades\Config;
|
||||
use Webkul\Theme\Theme;
|
||||
|
||||
class Themes
|
||||
{
|
||||
/**
|
||||
* Contains current activated theme code
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $activeTheme = null;
|
||||
|
||||
/**
|
||||
* Contains all themes
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $themes = [];
|
||||
|
||||
/**
|
||||
* Contains laravel default view paths
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $laravelViewsPath;
|
||||
|
||||
/**
|
||||
* Contains default theme code
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $defaultThemeCode = 'default';
|
||||
|
||||
|
||||
/**
|
||||
* Create a new Themes instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->laravelViewsPath = Config::get('view.paths');
|
||||
|
||||
$this->defaultThemeCode = Config::get('themes.default', null);
|
||||
|
||||
$this->loadThemes();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return list of registered themes
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function all()
|
||||
{
|
||||
return $this->themes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if specified exists
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function exists($themeName)
|
||||
{
|
||||
foreach ($this->themes as $theme) {
|
||||
if ($theme->code == $themeName) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Prepare all themes
|
||||
*
|
||||
* @return Theme
|
||||
*/
|
||||
public function loadThemes()
|
||||
{
|
||||
$parentThemes = [];
|
||||
$themes = config('themes.themes', []);
|
||||
|
||||
foreach ($themes as $code => $data) {
|
||||
$this->themes[] = new Theme(
|
||||
$code,
|
||||
isset($data['name']) ? $data['name'] : '',
|
||||
isset($data['assets_path']) ? $data['assets_path'] : '',
|
||||
isset($data['views_path']) ? $data['views_path'] : ''
|
||||
);
|
||||
|
||||
if (isset($data['parent']) && $data['parent']) {
|
||||
$parentThemes[$code] = $data['parent'];
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($parentThemes as $childCode => $parentCode) {
|
||||
$child = $this->find($childCode);
|
||||
|
||||
if ($this->exists($parentCode)) {
|
||||
$parent = $this->find($parentCode);
|
||||
} else {
|
||||
$parent = new Theme($parentCode);
|
||||
}
|
||||
|
||||
$child->setParent($parent);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable theme
|
||||
*
|
||||
* @return Theme
|
||||
*/
|
||||
public function set($themeName)
|
||||
{
|
||||
if ($this->exists($themeName)) {
|
||||
$theme = $this->find($themeName);
|
||||
} else {
|
||||
$theme = new Theme($themeName);
|
||||
}
|
||||
|
||||
$this->activeTheme = $theme;
|
||||
|
||||
$paths = $theme->getViewPaths();
|
||||
|
||||
foreach ($this->laravelViewsPath as $path) {
|
||||
if (!in_array($path, $paths)) {
|
||||
$paths[] = $path;
|
||||
}
|
||||
}
|
||||
|
||||
Config::set('view.paths', $paths);
|
||||
|
||||
$themeViewFinder = app('view.finder');
|
||||
$themeViewFinder->setPaths($paths);
|
||||
|
||||
return $theme;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get current theme
|
||||
*
|
||||
* @return Theme
|
||||
*/
|
||||
public function current()
|
||||
{
|
||||
return $this->activeTheme ? $this->activeTheme : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get current theme's name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return $this->current() ? $this->current()->name : '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a theme by it's name
|
||||
*
|
||||
* @return Theme
|
||||
*/
|
||||
public function find($themeName)
|
||||
{
|
||||
foreach ($this->themes as $theme) {
|
||||
if ($theme->code == $themeName) {
|
||||
return $theme;
|
||||
}
|
||||
}
|
||||
|
||||
throw new Exceptions\ThemeNotFound($themeName);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Original view paths defined in config.view.php
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getLaravelViewPaths()
|
||||
{
|
||||
return $this->laravelViewsPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return asset url of current theme
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function url($filename, $secure = null)
|
||||
{
|
||||
if (!$this->current()) {
|
||||
return asset($filename, $secure);
|
||||
}
|
||||
|
||||
return $this->current()->url($filename, $secure);
|
||||
}
|
||||
}
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
@include('ui::datagrid.table.default')
|
||||
|
||||
{{-- Section for datagrid javascript --}}
|
||||
@section('javascript')
|
||||
@push('scripts')
|
||||
<script type="text/javascript">
|
||||
var columns = @json($columns); //referential
|
||||
var allFilters1 = [];
|
||||
|
|
@ -399,6 +399,6 @@
|
|||
}
|
||||
}
|
||||
</script>
|
||||
@endsection
|
||||
@endpush
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
After Width: | Height: | Size: 851 KiB |
|
After Width: | Height: | Size: 278 KiB |
|
After Width: | Height: | Size: 320 KiB |
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="106px" height="16px" viewBox="0 0 106 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Star-5</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Star-5" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<polygon id="Star" fill="#242424" points="8.41169779 13.2668737 3.21298265 16 4.2058489 10.2111456 2.29816166e-14 6.11145618 5.81234022 5.26687371 8.41169779 0 11.0110554 5.26687371 16.8233956 6.11145618 12.6175467 10.2111456 13.6104129 16"></polygon>
|
||||
<polygon id="Star" fill="#242424" points="31.4116978 13.2668737 26.2129827 16 27.2058489 10.2111456 23 6.11145618 28.8123402 5.26687371 31.4116978 0 34.0110554 5.26687371 39.8233956 6.11145618 35.6175467 10.2111456 36.6104129 16"></polygon>
|
||||
<polygon id="Star" fill="#242424" points="53.4116978 13.2668737 48.2129827 16 49.2058489 10.2111456 45 6.11145618 50.8123402 5.26687371 53.4116978 0 56.0110554 5.26687371 61.8233956 6.11145618 57.6175467 10.2111456 58.6104129 16"></polygon>
|
||||
<polygon id="Star" fill="#242424" points="75.4116978 13.2668737 70.2129827 16 71.2058489 10.2111456 67 6.11145618 72.8123402 5.26687371 75.4116978 0 78.0110554 5.26687371 83.8233956 6.11145618 79.6175467 10.2111456 80.6104129 16"></polygon>
|
||||
<polygon id="Star" fill="#242424" points="97.4116978 13.2668737 92.2129827 16 93.2058489 10.2111456 89 6.11145618 94.8123402 5.26687371 97.4116978 0 100.011055 5.26687371 105.823396 6.11145618 101.617547 10.2111456 102.610413 16"></polygon>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>arrow-down</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="arrow-down" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<polygon id="Rectangle-2" fill="#A5A5A5" transform="translate(9.000000, 8.000000) rotate(-45.000000) translate(-9.000000, -8.000000) " points="6 5 12 11 6 11"></polygon>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 633 B |
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="8px" height="8px" viewBox="0 0 8 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 50 (54983) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>icon-dropdown</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="icon-dropdown" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<polygon id="›" fill="#242424" transform="translate(4.000000, 4.514496) rotate(-270.000000) translate(-4.000000, -4.514496) " points="1.48080444 8.51449585 4.54690552 4.51449585 1.48080444 0.51449585 3.48550415 0.51449585 6.51919556 4.51449585 3.48550415 8.51449585"></polygon>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 743 B |
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="48px" height="48px" viewBox="0 0 48 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 50 (54983) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>arrow-left-dark</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="arrow-left-dark" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="arrow" transform="translate(24.000000, 24.500000) scale(-1, 1) translate(-24.000000, -24.500000) translate(12.000000, 14.000000)" fill="#000000" fill-rule="nonzero">
|
||||
<path d="M23.249,11.786 L15.433,19.6 C15.0757568,19.9908753 14.5327035,20.1539647 14.0192179,20.0245859 C13.5057324,19.8952072 13.1047928,19.4942676 12.9754141,18.9807821 C12.8460353,18.4672965 13.0091247,17.9242432 13.4,17.567 L18.965,12 L1.5,12 C0.6715729,12 6.32202717e-08,11.3284271 6.32202717e-08,10.5 C6.32202717e-08,9.6715729 0.6715729,9.00000003 1.5,9 L18.965,9 L13.4,3.433 C13.0091247,3.07575678 12.8460353,2.53270346 12.9754141,2.01921793 C13.1047928,1.5057324 13.5057324,1.10479285 14.0192179,0.975414078 C14.5327035,0.846035307 15.0757568,1.00912465 15.433,1.4 L23.249,9.215 C23.9381714,9.93951416 24.0376587,10.793396 23.249,11.786 Z"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="48px" height="48px" viewBox="0 0 48 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 50 (54983) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>arrow-right-light</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="arrow-right-light" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="arrow" transform="translate(12.000000, 14.000000)" fill="#FFFFFF" fill-rule="nonzero">
|
||||
<path d="M23.249,11.786 L15.433,19.6 C15.0757568,19.9908753 14.5327035,20.1539647 14.0192179,20.0245859 C13.5057324,19.8952072 13.1047928,19.4942676 12.9754141,18.9807821 C12.8460353,18.4672965 13.0091247,17.9242432 13.4,17.567 L18.965,12 L1.5,12 C0.6715729,12 6.32202717e-08,11.3284271 6.32202717e-08,10.5 C6.32202717e-08,9.6715729 0.6715729,9.00000003 1.5,9 L18.965,9 L13.4,3.433 C13.0091247,3.07575678 12.8460353,2.53270346 12.9754141,2.01921793 C13.1047928,1.5057324 13.5057324,1.10479285 14.0192179,0.975414078 C14.5327035,0.846035307 15.0757568,1.00912465 15.433,1.4 L23.249,9.215 C23.9381714,9.93951416 24.0376587,10.793396 23.249,11.786 Z"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="8px" height="8px" viewBox="0 0 8 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 50 (54983) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>icon-dropdown-up</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="icon-dropdown-up" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<polygon id="›" fill="#242424" transform="translate(4.000000, 3.519196) scale(1, -1) rotate(-270.000000) translate(-4.000000, -3.519196) " points="1.48080444 7.51919556 4.54690552 3.51919556 1.48080444 -0.480804443 3.48550415 -0.480804443 6.51919556 3.51919556 3.48550415 7.51919556"></polygon>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 766 B |
|
After Width: | Height: | Size: 1.0 MiB |
|
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 50 (54983) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>checkbox/selected copy</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="checkbox/selected-copy" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<rect id="Rectangle-4" fill="#FF6472" x="0" y="0" width="16" height="16"></rect>
|
||||
<polygon id="↘" fill="#FFFFFF" transform="translate(7.957703, 8.601837) rotate(-270.000000) translate(-7.957703, -8.601837) " points="11.5595398 10.1021423 7.70584106 13.5595398 6.31204224 11.8957825 8.58901978 9.87234497 4.35586548 5.13290405 5.86581421 3.64413452"></polygon>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 854 B |
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 50 (54983) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>checkbox/unselected</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="checkbox/unselected" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<rect id="Rectangle-4" stroke="#B9B9B9" x="0.5" y="0.5" width="15" height="15"></rect>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 566 B |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 202 KiB |
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="8px" height="8px" viewBox="0 0 8 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 50 (54983) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>icon-dropdown-left</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="icon-dropdown-left" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<polygon id="›" fill="#242424" transform="translate(3.519196, 4.000000) scale(1, -1) translate(-3.519196, -4.000000) " points="1 8 4.06610107 4 1 0 3.00469971 0 6.03839111 4 3.00469971 8"></polygon>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 674 B |
|
|
@ -0,0 +1,13 @@
|
|||
<?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 50 (54983) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>icon-menu-close</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="icon-menu-close" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
|
||||
<g id="Group" transform="translate(5.000000, 5.000000)" stroke="#242424" stroke-width="3">
|
||||
<path d="M0.0685261796,14.2496556 L13.5678375,0.750344361" id="Line-2"></path>
|
||||
<path d="M0.0685261796,0.750344361 L13.5678375,14.2496556" id="Line-2"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 780 B |
|
|
@ -0,0 +1,20 @@
|
|||
<?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 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>icon-menu</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="icon-menu" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
|
||||
<g id="Group-2" transform="translate(4.000000, 5.000000)" stroke="#242424" stroke-width="3">
|
||||
<g id="Group" transform="translate(0.000000, 6.000000)">
|
||||
<path d="M1,1.5 L15,1.5" id="Line-2"></path>
|
||||
</g>
|
||||
<g id="Group-Copy">
|
||||
<path d="M1,1.5 L15,1.5" id="Line-2"></path>
|
||||
</g>
|
||||
<g id="Group-Copy-2" transform="translate(0.000000, 12.000000)">
|
||||
<path d="M1,1.5 L15,1.5" id="Line-2"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1002 B |
|
|
@ -0,0 +1,11 @@
|
|||
<?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 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>icon-search</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="icon-search" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<circle id="Oval-2" stroke="#242424" stroke-width="3" cx="10.5" cy="10.5" r="7"></circle>
|
||||
<path d="M15.5,15.5 L21.5,21.5" id="Line" stroke="#242424" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 694 B |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 4.7 KiB |
|
|
@ -0,0 +1,13 @@
|
|||
<?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 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>icon-offer</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="icon-offer" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<polygon id="Star" fill="#FF6472" points="12 21.8341033 8.29179607 23.8299999 6.46471607 20.0352146 2.29179607 19.4698579 3.04372246 15.325663 0 12.415 3.04372246 9.50433697 2.29179607 5.360142 6.46471607 4.79478531 8.29179607 1 12 2.99589665 15.7082039 1 17.5352839 4.79478531 21.7082039 5.360142 20.9562775 9.50433697 24 12.415 20.9562775 15.325663 21.7082039 19.4698579 17.5352839 20.0352146 15.7082039 23.8299999"></polygon>
|
||||
<text id="%" font-family="Montserrat-Regular, Montserrat" font-size="12" font-weight="normal" letter-spacing="-0.2879999" fill="#FFFFFF">
|
||||
<tspan x="7.8559999" y="17">%</tspan>
|
||||
</text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Wishlist</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Wishlist" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
|
||||
<path d="M15.9962711,26 C15.9962711,26 3.82641602,21.6804199 5.05062701,11.3846154 C5.38182072,8.59922485 8.45774362,6 11.3052808,6 C13.3974625,6 15.1753096,7.5626878 15.9962711,9.07692308 C16.9857769,7.57771184 18.5950798,6 20.6872614,6 C23.5347986,6 26.6121993,8.59909844 26.9419152,11.3846154 C28.2089844,22.0891113 15.9962711,26 15.9962711,26 Z" id="heart" stroke="#FF6472" stroke-width="3" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 905 B |
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Wishlist-Add</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Wishlist-Add" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
|
||||
<path d="M15.9962711,26 C15.9962711,26 3.82641602,21.6804199 5.05062701,11.3846154 C5.38182072,8.59922485 8.45774362,6 11.3052808,6 C13.3974625,6 15.1753096,7.5626878 15.9962711,9.07692308 C16.9857769,7.57771184 18.5950798,6 20.6872614,6 C23.5347986,6 26.6121993,8.59909844 26.9419152,11.3846154 C28.2089844,22.0891113 15.9962711,26 15.9962711,26 Z" id="heart" stroke="#FF6472" stroke-width="3" fill="#FF6472" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 928 B |
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"/js/shop.js": "/js/shop.js",
|
||||
"/css/shop.css": "/css/shop.css"
|
||||
}
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
@extends('test::layouts.master')
|
||||
|
||||
@section('content')
|
||||
<h1>Hello World</h1>
|
||||
|
||||
<p>
|
||||
This view is loaded from module: {!! config('test.name') !!}
|
||||
</p>
|
||||
@stop
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Module Test</title>
|
||||
|
||||
<!-- Laravel Mix - CSS File -->
|
||||
<!-- <link rel="stylesheet" href="{{ mix('css/test.css') }}"> -->
|
||||
|
||||
</head>
|
||||
<body>
|
||||
@yield('content')
|
||||
|
||||
<!-- Laravel Mix - JS File -->
|
||||
<!-- <script src="{{ mix('js/test.js') }}"></script> -->
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1 +0,0 @@
|
|||
From User Overridden Package
|
||||