Merge branch 'master' of https://github.com/bagisto/bagisto into sarga-v1

 Conflicts:
	public/installer/Seeder.php
This commit is contained in:
merdan 2022-04-13 18:46:20 +05:00
commit 0e819f43fe
102 changed files with 1140 additions and 595 deletions

View File

@ -66,7 +66,7 @@ jobs:
run: set -e && php artisan db:seed --env=testing
- name: Vendor Publish
run: set -e && php artisan vendor:publish --all --force --env=testing
run: set -e && php artisan bagisto:publish --force --env=testing
- name: Execute Unit Tests
run: set -e && vendor/bin/codecept run unit

8
composer.lock generated
View File

@ -153,12 +153,12 @@
"source": {
"type": "git",
"url": "https://github.com/bagisto/rest-api.git",
"reference": "03d7284867327c9db2412260e9113982fa7c07f1"
"reference": "8f679061530ca31d85bff7fff0a19a3e4368216e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/bagisto/rest-api/zipball/03d7284867327c9db2412260e9113982fa7c07f1",
"reference": "03d7284867327c9db2412260e9113982fa7c07f1",
"url": "https://api.github.com/repos/bagisto/rest-api/zipball/8f679061530ca31d85bff7fff0a19a3e4368216e",
"reference": "8f679061530ca31d85bff7fff0a19a3e4368216e",
"shasum": ""
},
"default-branch": true,
@ -189,7 +189,7 @@
"issues": "https://github.com/bagisto/rest-api/issues",
"source": "https://github.com/bagisto/rest-api/tree/master"
},
"time": "2022-01-21T11:21:50+00:00"
"time": "2022-04-07T09:23:21+00:00"
},
{
"name": "bagistobrasil/bagisto-product-social-share",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
{
"/js/admin.js": "/js/admin.js?id=1dddbb0d655216b79be5",
"/css/admin.css": "/css/admin.css?id=d35081df99f6ce2df4ff"
"/js/admin.js": "/js/admin.js?id=fecd2e4463e43c5595a5",
"/css/admin.css": "/css/admin.css?id=932732d5f00ca02d5043"
}

View File

@ -105,6 +105,7 @@ class ProductDataGrid extends DataGrid
'products.type as product_type',
'product_flat.status',
'product_flat.price',
'product_flat.url_key',
'attribute_families.name as attribute_family',
DB::raw('SUM(' . DB::getTablePrefix() . 'product_inventories.qty) as quantity')
);
@ -166,6 +167,13 @@ class ProductDataGrid extends DataGrid
'searchable' => true,
'sortable' => true,
'filterable' => true,
'closure' => function ($row) {
if (! empty($row->url_key)) {
return "<a href='" . route('shop.productOrCategory.index', $row->url_key) . "' target='_blank'>" . $row->product_name . "</a>";
}
return $row->product_name;
},
]);
$this->addColumn([

View File

@ -1,48 +0,0 @@
<?php
namespace Webkul\Admin\Http\Middleware;
use Closure;
use Webkul\Core\Repositories\LocaleRepository;
class Locale
{
/**
* Create a new middleware instance.
*
* @param \Webkul\Core\Repositories\LocaleRepository $localeRepository
*/
public function __construct(protected LocaleRepository $localeRepository)
{
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$locale = request()->get('admin_locale');
if ($locale) {
if ($this->localeRepository->findOneByField('code', $locale)) {
app()->setLocale($locale);
session()->put('admin_locale', $locale);
}
} else {
if ($locale = session()->get('admin_locale')) {
app()->setLocale($locale);
} else {
app()->setLocale(app()->getLocale());
}
}
unset($request['admin_locale']);
return $next($request);
}
}

View File

@ -28,8 +28,6 @@ class AdminServiceProvider extends ServiceProvider
$this->registerACL();
$router->aliasMiddleware('admin_locale', Locale::class);
$this->app->register(EventServiceProvider::class);
}

View File

@ -769,6 +769,7 @@ body {
color: $read-all-text-color;
background: none;
border: none;
cursor: pointer;
}
#notif-title {

View File

@ -286,6 +286,9 @@ return [
'confirm-password' => 'تأكيد كلمة المرور',
'back-link-title' => 'العودة للتوقيع',
'submit-btn-title' => 'بريد إلكتروني كلمة مرور إعادة تعيين وصلة',
'passwords' => [
'throttled' => 'تحذير: لقد طلبت إعادة تعيين كلمة المرور مؤخرًا ، يرجى التحقق من بريدك الإلكتروني.',
]
],
'reset-password' => [
@ -685,6 +688,8 @@ return [
'name' => 'اسم',
'groups' => 'المجموعات',
'add-group-title' => 'أضف المجموعة',
'edit-group-title' => 'Edit Group',
'update-group-title' => 'Update Group',
'position' => 'موضع',
'attribute-code' => 'الشفرة',
'type' => 'النوع',

View File

@ -286,6 +286,9 @@ return [
'confirm-password' => 'Passwort bestätigen',
'back-link-title' => 'Zurück zur Anmeldung',
'submit-btn-title' => 'E-Mail zum Zurücksetzen des Passworts senden',
'passwords' => [
'throttled' => 'Warnung: Sie haben das Zurücksetzen des Passworts kürzlich angefordert, bitte überprüfen Sie Ihre E-Mails.',
]
],
'reset-password' =>
[
@ -676,6 +679,8 @@ return [
'name' => 'Name',
'groups' => 'Gruppen',
'add-group-title' => 'Gruppe hinzufügen',
'edit-group-title' => 'Edit Group',
'update-group-title' => 'Update Group',
'position' => 'Position',
'attribute-code' => 'Code',
'type' => 'Typ',

View File

@ -288,6 +288,9 @@ return [
'confirm-password' => 'Confirm Password',
'back-link-title' => 'Back to Sign In',
'submit-btn-title' => 'Send Password Reset Email',
'passwords' => [
'throttled' => 'Warning: You have requested password reset recently, please check your email.',
]
],
'reset-password' => [
@ -688,6 +691,8 @@ return [
'name' => 'Name',
'groups' => 'Groups',
'add-group-title' => 'Add Group',
'edit-group-title' => 'Edit Group',
'update-group-title' => 'Update Group',
'position' => 'Position',
'attribute-code' => 'Code',
'type' => 'Type',

View File

@ -690,6 +690,8 @@ return [
'name' => 'Nombre',
'groups' => 'Grupos',
'add-group-title' => 'Agregar grupo',
'edit-group-title' => 'Edit Group',
'update-group-title' => 'Update Group',
'position' => 'Posición',
'attribute-code' => 'Código',
'type' => 'Tipo',

View File

@ -673,6 +673,8 @@ return [
'name' => 'نام',
'groups' => 'گروه ها',
'add-group-title' => 'افزودن گروه',
'edit-group-title' => 'Edit Group',
'update-group-title' => 'Update Group',
'position' => 'موقعیت',
'attribute-code' => 'کد',
'type' => 'نوع',

View File

@ -288,6 +288,9 @@ return [
'confirm-password' => 'Confirmez le mot de passe',
'back-link-title' => 'Retour à la connexion',
'submit-btn-title' => 'Envoyer un e-mail de réinitialisation du mot de passe',
'passwords' => [
'throttled' => 'Avertissement : Vous avez récemment demandé la réinitialisation de votre mot de passe, veuillez vérifier votre messagerie.',
]
],
'reset-password' => [
@ -689,6 +692,8 @@ return [
'name' => 'Nom',
'groups' => 'Groupes',
'add-group-title' => 'Ajouter un groupe',
'edit-group-title' => 'Edit Group',
'update-group-title' => 'Update Group',
'position' => 'Positionner',
'attribute-code' => 'Code',
'type' => 'Taper',

View File

@ -688,6 +688,8 @@ return [
'name' => 'नाम',
'groups' => 'समूह',
'add-group-title' => 'समूह जोड़ें',
'edit-group-title' => 'Edit Group',
'update-group-title' => 'Update Group',
'position' => 'स्थान',
'attribute-code' => 'कोड',
'type' => 'प्रकार',

View File

@ -283,6 +283,9 @@ return [
'confirm-password' => 'Conferma Password',
'back-link-title' => 'Torna a Login',
'submit-btn-title' => 'Invia Email Recupera Password',
'passwords' => [
'throttled' => 'Avvertenza: hai richiesto di recente la reimpostazione della password, controlla la tua email.',
]
],
'reset-password' => [
@ -673,6 +676,8 @@ return [
'name' => 'Nome',
'groups' => 'Gruppi',
'add-group-title' => 'Aggiungi Gruppo',
'edit-group-title' => 'Edit Group',
'update-group-title' => 'Update Group',
'position' => 'Posizione',
'attribute-code' => 'Codice',
'type' => 'Tipo',

View File

@ -672,6 +672,8 @@ return [
'name' => 'Naam',
'groups' => 'Groepen',
'add-group-title' => 'Add Group',
'edit-group-title' => 'Edit Group',
'update-group-title' => 'Update Group',
'position' => 'Position',
'attribute-code' => 'Code',
'type' => 'Type',

View File

@ -672,6 +672,8 @@ return [
'name' => 'Nazwa',
'groups' => 'Grupy',
'add-group-title' => 'Dodaj grupę',
'edit-group-title' => 'Edit Group',
'update-group-title' => 'Update Group',
'position' => 'Pozycja',
'attribute-code' => 'Kod',
'type' => 'Rodzaj',

View File

@ -671,6 +671,8 @@ return [
'name' => 'Nome',
'groups' => 'Grupos',
'add-group-title' => 'Add Grupo',
'edit-group-title' => 'Edit Group',
'update-group-title' => 'Update Group',
'position' => 'Posição',
'attribute-code' => 'Código',
'type' => 'Tipo',

View File

@ -678,6 +678,8 @@ return [
'name' => 'Tanımı',
'groups' => 'Gruplar',
'add-group-title' => 'Grup Ekle',
'edit-group-title' => 'Edit Group',
'update-group-title' => 'Update Group',
'position' => 'Konum',
'attribute-code' => 'Nitelik Kodu',
'type' => 'Tipi',

View File

@ -673,6 +673,8 @@ return [
'name' => '名称',
'groups' => '客户群',
'add-group-title' => '添加群',
'edit-group-title' => 'Edit Group',
'update-group-title' => 'Update Group',
'position' => '位置',
'attribute-code' => '代码',
'type' => '类型',

View File

@ -370,6 +370,12 @@
} else {
$('#enable_wysiwyg').parents('.control-group').addClass('hide');
}
if (['text'].indexOf($(e.target).val()) > -1) {
$('#validation').parents('.control-group').removeClass('hide');
} else {
$('#validation').parents('.control-group').addClass('hide');
}
})
});

View File

@ -184,25 +184,27 @@
<input type="hidden" name="is_unique" value="{{ $attribute->is_unique }}"/>
</div>
<div class="control-group">
<?php $selectedValidation = old('validation') ?: $attribute->validation ?>
<label for="validation">{{ __('admin::app.catalog.attributes.input_validation') }}</label>
<select class="control" id="validation" name="validation" {{ ! $attribute->is_user_defined ? 'disabled' : '' }}>
<option value=""></option>
<option value="numeric" {{ $selectedValidation == 'numeric' ? 'selected' : '' }}>
{{ __('admin::app.catalog.attributes.number') }}
</option>
<option value="decimal" {{ $selectedValidation == 'decimal' ? 'selected' : '' }}>
{{ __('admin::app.catalog.attributes.decimal') }}
</option>
<option value="email" {{ $selectedValidation == 'email' ? 'selected' : '' }}>
{{ __('admin::app.catalog.attributes.email') }}
</option>
<option value="url" {{ $selectedValidation == 'url' ? 'selected' : '' }}>
{{ __('admin::app.catalog.attributes.url') }}
</option>
</select>
</div>
@if ($attribute->type == 'text')
<div class="control-group">
<?php $selectedValidation = old('validation') ?: $attribute->validation ?>
<label for="validation">{{ __('admin::app.catalog.attributes.input_validation') }}</label>
<select class="control" id="validation" name="validation" {{ ! $attribute->is_user_defined ? 'disabled' : '' }}>
<option value=""></option>
<option value="numeric" {{ $selectedValidation == 'numeric' ? 'selected' : '' }}>
{{ __('admin::app.catalog.attributes.number') }}
</option>
<option value="decimal" {{ $selectedValidation == 'decimal' ? 'selected' : '' }}>
{{ __('admin::app.catalog.attributes.decimal') }}
</option>
<option value="email" {{ $selectedValidation == 'email' ? 'selected' : '' }}>
{{ __('admin::app.catalog.attributes.email') }}
</option>
<option value="url" {{ $selectedValidation == 'url' ? 'selected' : '' }}>
{{ __('admin::app.catalog.attributes.url') }}
</option>
</select>
</div>
@endif
{!! view_render_event('bagisto.admin.catalog.attribute.edit_form_accordian.validations.controls.after', ['attribute' => $attribute]) !!}
</div>

View File

@ -61,10 +61,6 @@
<accordian title="{{ __('admin::app.catalog.families.groups') }}" :active="true">
<div slot="body">
<button type="button" style="margin-bottom : 20px" class="btn btn-md btn-primary" @click="showModal('addGroup')">
{{ __('admin::app.catalog.families.add-group-title') }}
</button>
{!! view_render_event('bagisto.admin.catalog.family.create_form_accordian.groups.controls.before') !!}
<group-list></group-list>
@ -81,63 +77,108 @@
</form>
</div>
<modal id="addGroup" :is-open="modalIds.addGroup">
<h3 slot="header">{{ __('admin::app.catalog.families.add-group-title') }}</h3>
<div slot="body">
<group-form></group-form>
</div>
</modal>
@stop
@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')">
<div class="page-content">
<div class="form-container">
@csrf()
<div class="control-group" :class="[errors.has('add-group-form.groupName') ? 'has-error' : '']">
<label for="groupName" class="required">{{ __('admin::app.catalog.families.name') }}</label>
<input type="text" v-validate="'required'" v-model="group.groupName" class="control" id="groupName" name="groupName" data-vv-as="&quot;{{ __('admin::app.catalog.families.name') }}&quot;"/>
<span class="control-error" v-if="errors.has('add-group-form.groupName')">@{{ errors.first('add-group-form.groupName') }}</span>
</div>
<div class="control-group" :class="[errors.has('add-group-form.position') ? 'has-error' : '']">
<label for="position" class="required">{{ __('admin::app.catalog.families.position') }}</label>
<input type="text" v-validate="'required|numeric'" v-model="group.position" class="control" id="position" name="position" data-vv-as="&quot;{{ __('admin::app.catalog.families.position') }}&quot;"/>
<span class="control-error" v-if="errors.has('add-group-form.position')">@{{ errors.first('add-group-form.position') }}</span>
</div>
<button type="submit" class="btn btn-lg btn-primary">
{{ __('admin::app.catalog.families.add-group-title') }}
</button>
</div>
</div>
</form>
</script>
<script type="text/x-template" id="group-list-template">
<div>
<group-item v-for='(group, index) in groups' :group="group" :custom_attributes="custom_attributes" :key="index" :index="index" @onRemoveGroup="removeGroup($event)" @onAttributeAdd="addAttributes(index, $event)" @onAttributeRemove="removeAttribute(index, $event)"></group-item>
<button type="button" style="margin-bottom : 20px" class="btn btn-md btn-primary" @click="$root.showModal('addGroupForm')">
{{ __('admin::app.catalog.families.add-group-title') }}
</button>
<modal id="addGroupForm" :is-open="$root.modalIds.addGroupForm">
<h3 slot="header">{{ __('admin::app.catalog.families.add-group-title') }}</h3>
<div slot="body">
<form method="POST" data-vv-scope="add-group-form" @submit.prevent="addGroup('add-group-form')">
<div class="page-content">
<div class="form-container">
@csrf()
<div class="control-group" :class="[errors.has('add-group-form.name') ? 'has-error' : '']">
<label for="name" class="required">{{ __('admin::app.catalog.families.name') }}</label>
<input type="text" v-validate="'required'" v-model="group.name" class="control" id="name" name="name" data-vv-as="&quot;{{ __('admin::app.catalog.families.name') }}&quot;"/>
<span class="control-error" v-if="errors.has('add-group-form.name')">@{{ errors.first('add-group-form.name') }}</span>
</div>
<div class="control-group" :class="[errors.has('add-group-form.position') ? 'has-error' : '']">
<label for="position" class="required">{{ __('admin::app.catalog.families.position') }}</label>
<input type="text" v-validate="'required|numeric'" v-model="group.position" class="control" id="position" name="position" data-vv-as="&quot;{{ __('admin::app.catalog.families.position') }}&quot;"/>
<span class="control-error" v-if="errors.has('add-group-form.position')">@{{ errors.first('add-group-form.position') }}</span>
</div>
<button type="submit" class="btn btn-lg btn-primary">
{{ __('admin::app.catalog.families.add-group-title') }}
</button>
</div>
</div>
</form>
</div>
</modal>
<modal id="editGroupForm" :is-open="$root.modalIds.editGroupForm">
<h3 slot="header">{{ __('admin::app.catalog.families.edit-group-title') }}</h3>
<div slot="body">
<form method="POST" data-vv-scope="edit-group-form" @submit.prevent="updateGroup('edit-group-form')">
<div class="page-content">
<div class="form-container">
<div class="control-group" :class="[errors.has('edit-group-form.name') ? 'has-error' : '']">
<label for="name" class="required">{{ __('admin::app.catalog.families.name') }}</label>
<input type="text" v-validate="'required'" v-model="editGroup.name" class="control" id="name" name="name" data-vv-as="&quot;{{ __('admin::app.catalog.families.name') }}&quot;"/>
<span class="control-error" v-if="errors.has('edit-group-form.name')">@{{ errors.first('edit-group-form.name') }}</span>
</div>
<div class="control-group" :class="[errors.has('edit-group-form.position') ? 'has-error' : '']">
<label for="position" class="required">{{ __('admin::app.catalog.families.position') }}</label>
<input type="text" v-validate="'required|numeric'" v-model="editGroup.position" class="control" id="position" name="position" data-vv-as="&quot;{{ __('admin::app.catalog.families.position') }}&quot;"/>
<span class="control-error" v-if="errors.has('edit-group-form.position')">@{{ errors.first('edit-group-form.position') }}</span>
</div>
<button type="submit" class="btn btn-lg btn-primary">
{{ __('admin::app.catalog.families.update-group-title') }}
</button>
</div>
</div>
</form>
</div>
</modal>
<group-item
v-for='(group, index) in groups'
:group="group"
:custom_attributes="custom_attributes"
:key="index"
:index="index"
@onRemoveGroup="removeGroup($event)"
@onEditGroup="openEditGroupModal($event)"
@onAttributeAdd="addAttributes(index, $event)"
@onAttributeRemove="removeAttribute(index, $event)"
></group-item>
</div>
</script>
<script type="text/x-template" id="group-item-template">
<accordian :title="group.groupName" :active="true">
<accordian :title="group.name" :active="true">
<div slot="header">
<i class="icon expand-icon left"></i>
<h1>@{{ group.name ? group.name : group.groupName }}</h1>
<h1>@{{ group.name }}</h1>
<i class="icon trash-icon" @click="removeGroup()" v-if="group.is_user_defined"></i>
<span class="icon pencil-lg-icon" @click="editGroup()"></span>
</div>
<div slot="body">
<input type="hidden" :name="[groupInputName + '[name]']" :value="group.name ? group.name : group.groupName"/>
<input type="hidden" :name="[groupInputName + '[name]']" :value="group.name"/>
<input type="hidden" :name="[groupInputName + '[position]']" :value="group.position"/>
<input type="hidden" :name="[groupInputName + '[is_user_defined]']" :value="group.is_user_defined"/>
@ -201,71 +242,28 @@
var groups = @json($attributeFamily ? $attributeFamily->attribute_groups : []);
var custom_attributes = @json($custom_attributes);
Vue.component('group-form', {
data: function () {
return {
group: {
'groupName': '',
'position': '',
'is_user_defined': 1,
'custom_attributes': []
}
}
},
template: '#group-form-template',
methods: {
addGroup: function (formScope) {
var this_this = this;
this.$validator.validateAll(formScope).then(function (result) {
if (result) {
var filteredGroups = groups.filter(function(group) {
return this_this.group.groupName.trim() === (group.name ? group.name.trim() : group.groupName.trim())
})
if (filteredGroups.length) {
const field = this.$validator.fields.find({ name: 'groupName', scope: 'add-group-form' });
if (field) {
this.$validator.errors.add({
id: field.id,
field: 'groupName',
msg: "{{ __('admin::app.catalog.families.group-exist-error') }}",
scope: 'add-group-form',
});
}
} else {
groups.push(this_this.group);
groups = this_this.sortGroups();
this.group = {'groupName': '', 'position': '', 'is_user_defined': 1, 'custom_attributes': []};
this_this.$parent.closeModal();
}
}
});
},
sortGroups: function () {
return groups.sort(function(a, b) {
return a.position - b.position;
});
}
}
});
Vue.component('group-list', {
template: '#group-list-template',
data: function() {
return {
group: {
'name': '',
'position': '',
'is_user_defined': 1,
'custom_attributes': []
},
editGroup: {
'name': '',
'position': '',
'is_user_defined': 1,
'custom_attributes': []
},
groups: groups,
custom_attributes: custom_attributes
}
},
@ -286,6 +284,88 @@
},
methods: {
addGroup: function (formScope) {
var self = this;
this.$validator.validateAll(formScope).then(function (result) {
if (result) {
var filteredGroups = groups.filter(function(group) {
return self.group.name.trim() === group.name.trim()
})
if (filteredGroups.length) {
const field = self.$validator.fields.find({ name: 'name', scope: 'add-group-form' });
if (field) {
self.$validator.errors.add({
id: field.id,
field: 'name',
msg: "{{ __('admin::app.catalog.families.group-exist-error') }}",
scope: 'add-group-form',
});
}
} else {
groups.push(self.group);
groups = self.sortGroups();
this.group = {'name': '', 'position': '', 'is_user_defined': 1, 'custom_attributes': []};
self.$set(self.$root.modalIds, 'addGroupForm', false);
}
}
});
},
updateGroup: function(formScope) {
var self = this;
this.$validator.validateAll(formScope).then(function (result) {
if (result) {
var filteredGroups = groups.filter(function(group) {
return self.editGroup.name.trim() === group.name.trim()
})
if (filteredGroups.length > 1) {
const field = self.$validator.fields.find({ name: 'name', scope: 'edit-group-form' });
if (field) {
self.$validator.errors.add({
id: field.id,
field: 'name',
msg: "{{ __('admin::app.catalog.families.group-exist-error') }}",
scope: 'edit-group-form',
});
}
} else {
let index = groups.indexOf(self.editGroup)
groups[index] = self.editGroup;
groups = self.sortGroups();
this.editGroup = {'name': '', 'position': '', 'is_user_defined': 1, 'custom_attributes': []};
self.$set(self.$root.modalIds, 'editGroupForm', false);
}
}
});
},
sortGroups: function () {
return groups.sort(function(a, b) {
return a.position - b.position;
});
},
openEditGroupModal: function (group) {
this.editGroup = group;
this.$root.showModal('editGroupForm')
},
removeGroup: function (group) {
group.custom_attributes.forEach(function(attribute) {
this.custom_attributes.push(attribute);
@ -342,6 +422,10 @@
},
methods: {
editGroup: function() {
this.$emit('onEditGroup', this.group)
},
removeGroup: function () {
this.$emit('onRemoveGroup', this.group)
},

View File

@ -64,10 +64,6 @@
{!! view_render_event('bagisto.admin.catalog.family.edit_form_accordian.groups.controls.before', ['attributeFamily' => $attributeFamily]) !!}
<button type="button" style="margin-bottom : 20px" class="btn btn-md btn-primary" @click="showModal('addGroup')">
{{ __('admin::app.catalog.families.add-group-title') }}
</button>
<group-list></group-list>
{!! view_render_event('bagisto.admin.catalog.family.edit_form_accordian.groups.controls.before', ['attributeFamily' => $attributeFamily]) !!}
@ -81,63 +77,106 @@
</form>
</div>
<modal id="addGroup" :is-open="modalIds.addGroup">
<h3 slot="header">{{ __('admin::app.catalog.families.add-group-title') }}</h3>
<div slot="body">
<group-form></group-form>
</div>
</modal>
@stop
@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')">
<div class="page-content">
<div class="form-container">
@csrf()
<div class="control-group" :class="[errors.has('add-group-form.groupName') ? 'has-error' : '']">
<label for="groupName" class="required">{{ __('admin::app.catalog.families.name') }}</label>
<input type="text" v-validate="'required'" v-model="group.groupName" class="control" id="groupName" name="groupName" data-vv-as="&quot;{{ __('admin::app.catalog.families.name') }}&quot;"/>
<span class="control-error" v-if="errors.has('add-group-form.groupName')">@{{ errors.first('add-group-form.groupName') }}</span>
</div>
<div class="control-group" :class="[errors.has('add-group-form.position') ? 'has-error' : '']">
<label for="position" class="required">{{ __('admin::app.catalog.families.position') }}</label>
<input type="text" v-validate="'required|numeric'" v-model="group.position" class="control" id="position" name="position" data-vv-as="&quot;{{ __('admin::app.catalog.families.position') }}&quot;"/>
<span class="control-error" v-if="errors.has('add-group-form.position')">@{{ errors.first('add-group-form.position') }}</span>
</div>
<button type="submit" class="btn btn-lg btn-primary">
{{ __('admin::app.catalog.families.add-group-title') }}
</button>
</div>
</div>
</form>
</script>
<script type="text/x-template" id="group-list-template">
<div style="margin-top: 20px">
<group-item v-for='(group, index) in groups' :group="group" :custom_attributes="custom_attributes" :key="index" :index="index" @onRemoveGroup="removeGroup($event)" @onAttributeAdd="addAttributes(index, $event)" @onAttributeRemove="removeAttribute(index, $event)"></group-item>
<button type="button" style="margin-bottom : 20px" class="btn btn-md btn-primary" @click="showModal('addGroupForm')">
{{ __('admin::app.catalog.families.add-group-title') }}
</button>
<modal id="addGroupForm" :is-open="$root.modalIds.addGroupForm">
<h3 slot="header">{{ __('admin::app.catalog.families.add-group-title') }}</h3>
<div slot="body">
<form method="POST" data-vv-scope="add-group-form" @submit.prevent="addGroup('add-group-form')">
<div class="page-content">
<div class="form-container">
<div class="control-group" :class="[errors.has('add-group-form.name') ? 'has-error' : '']">
<label for="name" class="required">{{ __('admin::app.catalog.families.name') }}</label>
<input type="text" v-validate="'required'" v-model="group.name" class="control" id="name" name="name" data-vv-as="&quot;{{ __('admin::app.catalog.families.name') }}&quot;"/>
<span class="control-error" v-if="errors.has('add-group-form.name')">@{{ errors.first('add-group-form.name') }}</span>
</div>
<div class="control-group" :class="[errors.has('add-group-form.position') ? 'has-error' : '']">
<label for="position" class="required">{{ __('admin::app.catalog.families.position') }}</label>
<input type="text" v-validate="'required|numeric'" v-model="group.position" class="control" id="position" name="position" data-vv-as="&quot;{{ __('admin::app.catalog.families.position') }}&quot;"/>
<span class="control-error" v-if="errors.has('add-group-form.position')">@{{ errors.first('add-group-form.position') }}</span>
</div>
<button type="submit" class="btn btn-lg btn-primary">
{{ __('admin::app.catalog.families.add-group-title') }}
</button>
</div>
</div>
</form>
</div>
</modal>
<modal id="editGroupForm" :is-open="$root.modalIds.editGroupForm">
<h3 slot="header">{{ __('admin::app.catalog.families.edit-group-title') }}</h3>
<div slot="body">
<form method="POST" data-vv-scope="edit-group-form" @submit.prevent="updateGroup('edit-group-form')">
<div class="page-content">
<div class="form-container">
<div class="control-group" :class="[errors.has('edit-group-form.name') ? 'has-error' : '']">
<label for="name" class="required">{{ __('admin::app.catalog.families.name') }}</label>
<input type="text" v-validate="'required'" v-model="editGroup.name" class="control" id="name" name="name" data-vv-as="&quot;{{ __('admin::app.catalog.families.name') }}&quot;"/>
<span class="control-error" v-if="errors.has('edit-group-form.name')">@{{ errors.first('edit-group-form.name') }}</span>
</div>
<div class="control-group" :class="[errors.has('edit-group-form.position') ? 'has-error' : '']">
<label for="position" class="required">{{ __('admin::app.catalog.families.position') }}</label>
<input type="text" v-validate="'required|numeric'" v-model="editGroup.position" class="control" id="position" name="position" data-vv-as="&quot;{{ __('admin::app.catalog.families.position') }}&quot;"/>
<span class="control-error" v-if="errors.has('edit-group-form.position')">@{{ errors.first('edit-group-form.position') }}</span>
</div>
<button type="submit" class="btn btn-lg btn-primary">
{{ __('admin::app.catalog.families.update-group-title') }}
</button>
</div>
</div>
</form>
</div>
</modal>
<group-item
v-for='(group, index) in groups'
:group="group"
:custom_attributes="custom_attributes"
:key="index"
:index="index"
@onRemoveGroup="removeGroup($event)"
@onEditGroup="openEditGroupModal($event)"
@onAttributeAdd="addAttributes(index, $event)"
@onAttributeRemove="removeAttribute(index, $event)"
></group-item>
</div>
</script>
<script type="text/x-template" id="group-item-template">
<accordian :title="group.groupName" :active="true">
<accordian :title="group.name" :active="true">
<div slot="header">
<i class="icon expand-icon left"></i>
<h1>@{{ group.name ? group.name : group.groupName }}</h1>
<h1>@{{ group.name }}</h1>
<i class="icon trash-icon" @click="removeGroup()" v-if="group.is_user_defined"></i>
<span class="icon pencil-lg-icon" @click="editGroup()"></span>
</div>
<div slot="body">
<input type="hidden" :name="[groupInputName + '[name]']" :value="group.name ? group.name : group.groupName"/>
<input type="hidden" :name="[groupInputName + '[name]']" :value="group.name"/>
<input type="hidden":name="[groupInputName + '[position]']" :value="group.position"/>
<div class="table" v-if="group.custom_attributes.length" style="margin-bottom: 20px;">
@ -200,70 +239,27 @@
var groups = @json($attributeFamily->attribute_groups);
var custom_attributes = @json($custom_attributes);
Vue.component('group-form', {
data: function() {
return {
group: {
'groupName': '',
'position': '',
'custom_attributes': []
}
}
},
template: '#group-form-template',
methods: {
addGroup: function (formScope) {
var this_this = this;
this.$validator.validateAll(formScope).then(function (result) {
if (result) {
var filteredGroups = groups.filter(function(group) {
return this_this.group.groupName.trim() === (group.name ? group.name.trim() : group.groupName.trim())
})
if (filteredGroups.length) {
const field = this.$validator.fields.find({ name: 'groupName', scope: 'add-group-form' });
if (field) {
this.$validator.errors.add({
id: field.id,
field: 'groupName',
msg: "{{ __('admin::app.catalog.families.group-exist-error') }}",
scope: 'add-group-form',
});
}
} else {
groups.push(this_this.group);
groups = this_this.sortGroups();
this.group = {'groupName': '', 'position': '', 'is_user_defined': 1, 'custom_attributes': []};
this_this.$parent.closeModal();
}
}
});
},
sortGroups: function () {
return groups.sort(function(a, b) {
return a.position - b.position;
});
}
}
});
Vue.component('group-list', {
template: '#group-list-template',
data: function() {
return {
group: {
'name': '',
'position': '',
'custom_attributes': []
},
editGroup: {
'name': '',
'position': '',
'is_user_defined': 1,
'custom_attributes': []
},
groups: groups,
custom_attributes: custom_attributes
}
},
@ -286,6 +282,88 @@
},
methods: {
addGroup: function (formScope) {
var this_this = this;
this.$validator.validateAll(formScope).then(function (result) {
if (result) {
var filteredGroups = groups.filter(function(group) {
return this_this.group.name.trim() === group.name.trim()
})
if (filteredGroups.length) {
const field = this.$validator.fields.find({ name: 'name', scope: 'add-group-form' });
if (field) {
this.$validator.errors.add({
id: field.id,
field: 'name',
msg: "{{ __('admin::app.catalog.families.group-exist-error') }}",
scope: 'add-group-form',
});
}
} else {
groups.push(this_this.group);
groups = this_this.sortGroups();
this.group = {'name': '', 'position': '', 'is_user_defined': 1, 'custom_attributes': []};
self.$set(self.$root.modalIds, 'addGroupForm', false);
}
}
});
},
updateGroup: function(formScope) {
var self = this;
this.$validator.validateAll(formScope).then(function (result) {
if (result) {
var filteredGroups = groups.filter(function(group) {
return self.editGroup.name.trim() === group.name.trim()
})
if (filteredGroups.length > 1) {
const field = self.$validator.fields.find({ name: 'name', scope: 'edit-group-form' });
if (field) {
self.$validator.errors.add({
id: field.id,
field: 'name',
msg: "{{ __('admin::app.catalog.families.group-exist-error') }}",
scope: 'edit-group-form',
});
}
} else {
let index = groups.indexOf(self.editGroup)
groups[index] = self.editGroup;
groups = self.sortGroups();
this.editGroup = {'name': '', 'position': '', 'is_user_defined': 1, 'custom_attributes': []};
self.$set(self.$root.modalIds, 'editGroupForm', false);
}
}
});
},
sortGroups: function () {
return groups.sort(function(a, b) {
return a.position - b.position;
});
},
openEditGroupModal: function (group) {
this.editGroup = group;
this.$root.showModal('editGroupForm')
},
removeGroup: function (group) {
group.custom_attributes.forEach(function(attribute) {
this.custom_attributes.push(attribute);
@ -347,6 +425,10 @@
},
methods: {
editGroup: function() {
this.$emit('onEditGroup', this.group)
},
removeGroup: function () {
this.$emit('onRemoveGroup', this.group)
},

View File

@ -32,6 +32,7 @@
v-for='(image, index) in items'
:key='image.id'
:image="image"
class="draggable"
@onRemoveImage="removeImage($event)"
@onImageSelected="imageSelected($event)">
</product-image-item>

View File

@ -67,7 +67,7 @@
<div class="control-group">
<label for="name" >{{ __('admin::app.customers.reviews.comment') }}</label>
<textarea class="control" disabled> {{ $review->comment }}</textarea>
<textarea class="control" disabled v-text='"{{ $review->comment }}"'> </textarea>
</div>
@if (count($review->images) > 0)

View File

@ -28,52 +28,54 @@
<div class="title">
{{ __('admin::app.dashboard.total-customers') }}
</div>
<a href="{{ route('admin.customer.index') }}">
<div class="data">
{{ $statistics['total_customers']['current'] }}
<div class="data">
{{ $statistics['total_customers']['current'] }}
<span class="progress">
@if ($statistics['total_customers']['progress'] < 0)
<span class="icon graph-down-icon"></span>
{{ __('admin::app.dashboard.decreased', [
'progress' => -number_format($statistics['total_customers']['progress'], 1)
])
}}
@else
<span class="icon graph-up-icon"></span>
{{ __('admin::app.dashboard.increased', [
'progress' => number_format($statistics['total_customers']['progress'], 1)
])
}}
@endif
</span>
</div>
<span class="progress">
@if ($statistics['total_customers']['progress'] < 0)
<span class="icon graph-down-icon"></span>
{{ __('admin::app.dashboard.decreased', [
'progress' => -number_format($statistics['total_customers']['progress'], 1)
])
}}
@else
<span class="icon graph-up-icon"></span>
{{ __('admin::app.dashboard.increased', [
'progress' => number_format($statistics['total_customers']['progress'], 1)
])
}}
@endif
</span>
</div>
</a>
</div>
<div class="dashboard-card">
<div class="title">
{{ __('admin::app.dashboard.total-orders') }}
</div>
<a href="{{ route('admin.sales.orders.index') }}">
<div class="data">
{{ $statistics['total_orders']['current'] }}
<div class="data">
{{ $statistics['total_orders']['current'] }}
<span class="progress">
@if ($statistics['total_orders']['progress'] < 0)
<span class="icon graph-down-icon"></span>
{{ __('admin::app.dashboard.decreased', [
'progress' => -number_format($statistics['total_orders']['progress'], 1)
])
}}
@else
<span class="icon graph-up-icon"></span>
{{ __('admin::app.dashboard.increased', [
'progress' => number_format($statistics['total_orders']['progress'], 1)
])
}}
@endif
</span>
</div>
<span class="progress">
@if ($statistics['total_orders']['progress'] < 0)
<span class="icon graph-down-icon"></span>
{{ __('admin::app.dashboard.decreased', [
'progress' => -number_format($statistics['total_orders']['progress'], 1)
])
}}
@else
<span class="icon graph-up-icon"></span>
{{ __('admin::app.dashboard.increased', [
'progress' => number_format($statistics['total_orders']['progress'], 1)
])
}}
@endif
</span>
</div>
</a>
</div>
<div class="dashboard-card">

View File

@ -9,10 +9,6 @@
$tree->items = core()->sortItems($tree->items);
$config = $tree;
$allLocales = core()->getAllLocales()->pluck('name', 'code');
$currentLocaleCode = core()->getRequestedLocaleCode('admin_locale');
@endphp
<mobile-nav></mobile-nav>
@ -30,7 +26,7 @@
<div class="profile-info-icon">
<span style="">{{ substr(auth()->guard('admin')->user()->name, 0, 1) }}</span>
</div>
<div class="profile-info-desc">
<div class="name">
{{ auth()->guard('admin')->user()->name }}
@ -46,7 +42,7 @@
</div>
</div>
<div class="nav-items">
<div class="nav-items">
@foreach ($menu->items as $menuItem)
<div class="nav-item {{ $menu->getActive($menuItem) }}">
<a class="nav-tab-name" href="{{ $menuItem['key'] == 'dashboard' ? $menuItem['url'] : '#' }}">
@ -68,7 +64,7 @@
</a>
</li>
@endforeach
</ul>
</ul>
@endif
@else
<ul>
@ -78,28 +74,11 @@
<span style="margin-left:47px">{{ isset($item['name']) ? trans($item['name']) : '' }}</span>
</a>
</li>
@endforeach
</ul>
@endif
@endforeach
</ul>
@endif
</div>
@endforeach
<div class="nav-item">
<a class="nav-tab-name">
<span class="icon-menu icon locale-icon"
style="margin-right:10px; display: inline-block;vertical-align: middle;transform: scale(0.8);"></span>
<span class="menu-label"> {{ __('admin::app.datagrid.locale') }} {{ $allLocales[$currentLocaleCode] }}</span>
<span class="icon arrow-icon"></span>
</a>
<ul>
@foreach ($allLocales as $code => $name)
<li class="navbar-child">
<a href="{{ url()->current() . '?' . http_build_query(array_merge(request()->all(), ['admin_locale' => $code])) }}">
<span style="margin-left:47px"> {{ $name }}</span>
</a>
</li>
@endforeach
</ul>
</div>
<div class="nav-item">
<a class="nav-tab-name">
<span class="icon-menu icon accounts-icon"
@ -107,9 +86,9 @@
<span class="menu-label">{{ __('admin::app.layouts.account-title') }}</span>
<span class="icon arrow-icon"></span>
</a>
<ul>
<li class="navbar-child">
<a>
<ul>
<li class="navbar-child">
<a>
<span style="display:flex;justify-content:space-between;height:20px">
<div style="margin-top:12px;margin-left:47px">
<span>{{ __('admin::app.layouts.mode') }}</span>
@ -117,10 +96,10 @@
<dark style="margin-left:13%"></dark>
</span>
</a>
</li>
<li class="navbar-child">
<a href="{{ route('admin.account.edit') }}">
<a href="{{ route('admin.account.edit') }}">
<span style="margin-left:47px">{{ __('admin::app.layouts.my-account') }}</span>
</a>
</li>
@ -128,10 +107,10 @@
<a href="{{ route('admin.session.destroy') }}">
<span style="margin-left:47px">{{ __('admin::app.layouts.logout') }}</span>
</a>
</li>
</ul>
</div>
</div>
</li>
</ul>
</div>
</div>
</div>
</script>
@ -149,10 +128,10 @@
mounted(){
const nav = document.querySelector(".nav-container");
if (nav) {
const toggle = nav.querySelector(".nav-toggle");
if (toggle) {
toggle.addEventListener("click", () => {
if (nav.classList.contains("is-active")) {
@ -162,7 +141,7 @@
nav.classList.add("is-active");
}
});
nav.addEventListener("blur", () => {
nav.classList.remove("is-active");
});
@ -177,7 +156,7 @@
navItem.parentElement.children[1].classList.toggle("display-block");
navItem.children[2].classList.toggle("rotate-arrow-icon");
}
});
});
},

View File

@ -11,8 +11,6 @@
$config = $tree;
$allLocales = core()->getAllLocales()->pluck('name', 'code');
$currentLocaleCode = core()->getRequestedLocaleCode('admin_locale');
@endphp
<div class="navbar-left" v-bind:class="{'open': isMenuOpen}">
@ -26,10 +24,10 @@
<span class="menu-label">{{ trans($menuItem['name']) }}</span>
@if(count($menuItem['children']) || $menuItem['key'] == 'configuration' )
<span
<span
class="icon arrow-icon {{ $menu->getActive($menuItem) == 'active' ? 'rotate-arrow-icon' : '' }} {{ ( core()->getCurrentLocale() && core()->getCurrentLocale()->direction == 'rtl' ) ? 'arrow-icon-right' :'arrow-icon-left' }}"
></span>
@endif
</a>
@if ($menuItem['key'] != 'configuration')
@ -48,7 +46,7 @@
<ul class="sub-menubar">
@foreach ($config->items as $key => $item)
<li class="sub-menu-item {{ $item['key'] == request()->route('slug') ? 'active' : '' }}">
<a href="{{ route('admin.configuration.index', $item['key']) }}">
<a href="{{ route('admin.configuration.index', $item['key']) }}">
<span class="menu-label"> {{ isset($item['name']) ? trans($item['name']) : '' }}</span>
</a>
</li>

View File

@ -7,8 +7,6 @@
'processing' => trans('admin::app.notification.order-status-messages.processing')
];
$allLocales = core()->getAllLocales()->pluck('name', 'code');
$currentLocaleCode = core()->getRequestedLocaleCode('admin_locale');
@endphp
<div class="navbar-top">
@ -64,29 +62,6 @@
</notification>
<div class="profile-info">
<div class="dropdown-toggle">
<i class="icon locale-icon"></i>
</div>
<div class="dropdown-list bottom-right">
<div class="dropdown-container">
<ul>
@foreach ($allLocales as $code => $name)
<li>
<a href="{{ url()->current() . '?' . http_build_query(array_merge(request()->all(), ['admin_locale' => $code])) }}"
style="{{ $code == $currentLocaleCode ? 'color:blue' : '' }}">
{{ $name }}
</a>
</li>
@endforeach
</ul>
</div>
</div>
</div>
<div class="profile-info">
<div class="dropdown-toggle">
<div style="display: inline-block; vertical-align: middle;">
@ -110,7 +85,7 @@
<span class="role">
{{ auth()->guard('admin')->user()->role['name'] }}
</span>
</div>
</div>
</div>
</div>
<i class="icon arrow-down-icon active"></i>

View File

@ -9,7 +9,7 @@ use Webkul\User\Http\Controllers\SessionController;
/**
* Auth routes.
*/
Route::group(['middleware' => ['web', 'admin_locale'], 'prefix' => config('app.admin_url')], function () {
Route::group(['middleware' => ['web'], 'prefix' => config('app.admin_url')], function () {
/**
* Redirect route.
*/

View File

@ -9,7 +9,7 @@ use Webkul\Product\Http\Controllers\ProductController;
/**
* Catalog routes.
*/
Route::group(['middleware' => ['web', 'admin', 'admin_locale'], 'prefix' => config('app.admin_url')], function () {
Route::group(['middleware' => ['web', 'admin'], 'prefix' => config('app.admin_url')], function () {
Route::prefix('catalog')->group(function () {
/**
* Sync route.

View File

@ -6,7 +6,7 @@ use Webkul\CMS\Http\Controllers\Admin\PageController;
/**
* CMS routes.
*/
Route::group(['middleware' => ['web', 'admin', 'admin_locale'], 'prefix' => config('app.admin_url')], function () {
Route::group(['middleware' => ['web', 'admin'], 'prefix' => config('app.admin_url')], function () {
Route::prefix('cms')->group(function () {
Route::get('/', [PageController::class, 'index'])->defaults('_config', [
'view' => 'admin::cms.index',
@ -36,4 +36,4 @@ Route::group(['middleware' => ['web', 'admin', 'admin_locale'], 'prefix' => conf
'redirect' => 'admin.cms.index',
])->name('admin.cms.mass-delete');
});
});
});

View File

@ -6,7 +6,7 @@ use Webkul\Admin\Http\Controllers\ConfigurationController;
/**
* Configuration routes.
*/
Route::group(['middleware' => ['web', 'admin', 'admin_locale'], 'prefix' => config('app.admin_url')], function () {
Route::group(['middleware' => ['web', 'admin'], 'prefix' => config('app.admin_url')], function () {
Route::get('configuration/{slug?}/{slug2?}', [ConfigurationController::class, 'index'])->defaults('_config', [
'view' => 'admin::configuration.index',
])->name('admin.configuration.index');

View File

@ -9,7 +9,7 @@ use Webkul\Product\Http\Controllers\ReviewController;
/**
* Customers routes.
*/
Route::group(['middleware' => ['web', 'admin', 'admin_locale'], 'prefix' => config('app.admin_url')], function () {
Route::group(['middleware' => ['web', 'admin'], 'prefix' => config('app.admin_url')], function () {
/**
* Customer management routes.
*/

View File

@ -13,7 +13,7 @@ use Webkul\Sitemap\Http\Controllers\Admin\SitemapController;
/**
* Marketing routes.
*/
Route::group(['middleware' => ['web', 'admin', 'admin_locale'], 'prefix' => config('app.admin_url')], function () {
Route::group(['middleware' => ['web', 'admin'], 'prefix' => config('app.admin_url')], function () {
Route::prefix('promotions')->group(function () {
/**
* Cart rules routes.
@ -173,7 +173,6 @@ Route::group(['middleware' => ['web', 'admin', 'admin_locale'], 'prefix' => conf
'redirect' => 'admin.customers.subscribers.index',
])->name('admin.customers.subscribers.update');
/**
* Cart rules routes.
*/

View File

@ -6,7 +6,7 @@ use Webkul\Notification\Http\Controllers\Admin\NotificationController;
/**
* Notification routes.
*/
Route::group(['middleware' => ['web', 'admin', 'admin_locale'], 'prefix' => config('app.admin_url')], function () {
Route::group(['middleware' => ['web', 'admin'], 'prefix' => config('app.admin_url')], function () {
Route::get('notifications', [NotificationController::class, 'index'])->defaults('_config', [
'view' => 'admin::notifications.index',
])->name('admin.notification.index');

View File

@ -10,7 +10,7 @@ use Webkul\User\Http\Controllers\SessionController;
/**
* Extra routes.
*/
Route::group(['middleware' => ['web', 'admin', 'admin_locale'], 'prefix' => config('app.admin_url')], function () {
Route::group(['middleware' => ['web', 'admin'], 'prefix' => config('app.admin_url')], function () {
/**
* Tinymce file upload handler.
*/

View File

@ -10,7 +10,7 @@ use Webkul\Admin\Http\Controllers\Sales\TransactionController;
/**
* Sales routes.
*/
Route::group(['middleware' => ['web', 'admin', 'admin_locale'], 'prefix' => config('app.admin_url')], function () {
Route::group(['middleware' => ['web', 'admin'], 'prefix' => config('app.admin_url')], function () {
Route::prefix('sales')->group(function () {
/**
* Orders routes.

View File

@ -16,7 +16,7 @@ use Webkul\User\Http\Controllers\UserController;
/**
* Settings routes.
*/
Route::group(['middleware' => ['web', 'admin', 'admin_locale'], 'prefix' => config('app.admin_url')], function () {
Route::group(['middleware' => ['web', 'admin'], 'prefix' => config('app.admin_url')], function () {
/**
* Roles routes.
*/

View File

@ -3,7 +3,7 @@
/**
* Sales routes.
*/
Route::group(['middleware' => ['web', 'admin', 'admin_locale'], 'prefix' => config('app.admin_url')], function () {
Route::group(['middleware' => ['web', 'admin'], 'prefix' => config('app.admin_url')], function () {
Route::prefix('sales')->group(function () {
/**
* Booking routes.
@ -14,4 +14,4 @@ Route::group(['middleware' => ['web', 'admin', 'admin_locale'], 'prefix' => conf
Route::get('/bookings/get', [Webkul\BookingProduct\Http\Controllers\Admin\BookingController::class, 'get'])->name('admin.sales.bookings.get');
});
});
});

View File

@ -101,6 +101,7 @@ return [
'book-an-appointment' => 'حجز موعد',
'date' => 'تاريخ',
'slot' => 'فتحة',
'no-slots-available' => 'No slots available',
'rent-an-item' => 'استئجار عنصر',
'choose-rent-option' => 'اختر خيار الإيجار',
'daily-basis' => 'الأساس اليومي',

View File

@ -101,6 +101,7 @@ return [
'book-an-appointment' => 'Book an Appointment',
'date' => 'Date',
'slot' => 'Slot',
'no-slots-available' => 'No slots available',
'rent-an-item' => 'Rent an Item',
'choose-rent-option' => 'Choose Rent Option',
'daily-basis' => 'Daily Basis',

View File

@ -101,6 +101,7 @@ return [
'book-an-appointment' => 'Reservar una Cita',
'date' => 'Fecha',
'slot' => 'Horario',
'no-slots-available' => 'No slots available',
'rent-an-item' => 'Alquilar un Artículo',
'choose-rent-option' => 'Elija la Opción de Alquiler',
'daily-basis' => 'Diariamente',

View File

@ -101,6 +101,7 @@ return [
'book-an-appointment' => 'قرار ملاقات را رزرو کنید',
'date' => 'تاریخ',
'slot' => 'اسلات',
'no-slots-available' => 'No slots available',
'rent-an-item' => 'اجاره یک مورد',
'choose-rent-option' => 'گزینه اجاره را انتخاب کنید',
'daily-basis' => 'به صورت روزانه',

View File

@ -101,6 +101,7 @@ return [
'book-an-appointment' => 'एक अपॉइंटमेंट बुक करें',
'date' => 'तारीख',
'slot' => 'स्लॉट',
'no-slots-available' => 'No slots available',
'rent-an-item' => 'एक वस्तु किराए पर लें',
'choose-rent-option' => 'किराया विकल्प चुनें',
'daily-basis' => 'दैनिक आधार पर',

View File

@ -21,6 +21,7 @@ return [
'same-slot-all-days' => 'Stesso Slot tutti i giorni',
'slot-has-quantity' => 'Slot ha quantità',
'slots' => 'Slot',
'no-slots-available' => 'No slots available',
'from' => 'Da',
'to' => 'A',
'qty' => 'Qtà',

View File

@ -101,6 +101,7 @@ return [
'book-an-appointment' => 'Een afspraak maken',
'date' => 'Datum',
'slot' => 'Sleuf',
'no-slots-available' => 'No slots available',
'rent-an-item' => 'Huur een item',
'choose-rent-option' => 'Kies Huuroptie',
'daily-basis' => 'Dagelijks',

View File

@ -101,6 +101,7 @@ return [
'book-an-appointment' => 'Marque uma consulta',
'date' => 'Date',
'slot' => 'Slot',
'no-slots-available' => 'No slots available',
'rent-an-item' => 'Alugar um item',
'choose-rent-option' => 'Escolha a opção de aluguel',
'daily-basis' => 'Diariamente',

View File

@ -101,6 +101,7 @@ return [
'book-an-appointment' => 'Randevu Al',
'date' => 'Tarih',
'slot' => 'Slot',
'no-slots-available' => 'No slots available',
'rent-an-item' => 'Eşya Kiralama',
'choose-rent-option' => 'Kiralama Seçeneğini Seçin',
'daily-basis' => 'Günlük Bazında',

View File

@ -101,6 +101,7 @@ return [
'book-an-appointment' => '预约',
'date' => '日期',
'slot' => '插槽',
'no-slots-available' => 'No slots available',
'rent-an-item' => '租一个项目',
'choose-rent-option' => '选择租金选项',
'daily-basis' => '每日基础',

View File

@ -18,6 +18,8 @@
<div class="control-group slots" :class="[errors.has('booking[slot]') ? 'has-error' : '']">
<select v-validate="'required'" name="booking[slot]" class="control" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.slot') }}&quot;">
<option v-for="slot in slots" :value="slot.timestamp">@{{ slot.from + ' - ' + slot.to }}</option>
<option value="" v-if="! slots.length">{{ __('bookingproduct::app.shop.products.no-slots-available') }}</option>
</select>
<span class="control-error" v-if="errors.has('booking[slot]')">@{{ errors.first('booking[slot]') }}</span>

View File

@ -18,6 +18,8 @@
<div class="form-group slots" :class="[errors.has('booking[slot]') ? 'has-error' : '']">
<select v-validate="'required'" name="booking[slot]" class="form-style" data-vv-as="&quot;{{ __('bookingproduct::app.shop.products.slot') }}&quot;">
<option v-for="slot in slots" :value="slot.timestamp">@{{ slot.from + ' - ' + slot.to }}</option>
<option value="" v-if="! slots.length">{{ __('bookingproduct::app.shop.products.no-slots-available') }}</option>
</select>
<span class="control-error" v-if="errors.has('booking[slot]')">@{{ errors.first('booking[slot]') }}</span>

View File

@ -0,0 +1,114 @@
<?php
namespace Webkul\Core\Console\Commands;
use Illuminate\Console\Command;
class BagistoPublish extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'bagisto:publish { --force : Overwrite any existing files }';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Publish the available assets';
/**
* List of providers.
*
* @var array
*/
protected $providers = [
/**
* Package providers.
*/
[
'name' => 'DB Blade Compiler',
'provider' => \Flynsarmy\DbBladeCompiler\DbBladeCompilerServiceProvider::class,
],
/**
* Bagisto providers.
*/
[
'name' => 'Admin',
'provider' => \Webkul\Admin\Providers\AdminServiceProvider::class,
],
[
'name' => 'UI',
'provider' => \Webkul\Ui\Providers\UiServiceProvider::class,
],
[
'name' => 'Core',
'provider' => \Webkul\Core\Providers\CoreServiceProvider::class,
],
[
'name' => 'Shop',
'provider' => \Webkul\Shop\Providers\ShopServiceProvider::class,
],
[
'name' => 'Product',
'provider' => \Webkul\Product\Providers\ProductServiceProvider::class,
],
[
'name' => 'Velocity',
'provider' => \Webkul\Velocity\Providers\VelocityServiceProvider::class,
],
[
'name' => 'Booking Product',
'provider' => \Webkul\BookingProduct\Providers\BookingProductServiceProvider::class,
],
[
'name' => 'Social',
'provider' => \Webkul\SocialLogin\Providers\SocialLoginServiceProvider::class,
],
];
/**
* Execute the console command.
*
* @return void
*/
public function handle()
{
$this->publishAllPackages();
}
/**
* Publish all packages.
*
* @return void
*/
public function publishAllPackages(): void
{
collect($this->providers)->each(function ($provider) {
$this->publishPackage($provider);
});
}
/**
* Publish package.
*
* @param array $provider
* @return void
*/
public function publishPackage(array $provider): void
{
$this->line('');
$this->line('-----------------------------------------');
$this->info('Publishing ' . $provider['name']);
$this->line('-----------------------------------------');
$this->call('vendor:publish', [
'--provider' => $provider['provider'],
'--force' => $this->option('force'),
]);
}
}

View File

@ -53,9 +53,9 @@ class Install extends Command
$result = $this->call('db:seed');
$this->info($result);
// running `php artisan vendor:publish --all`
// running `php artisan bagisto:publish --force`
$this->warn('Step: Publishing assets and configurations...');
$result = $this->call('vendor:publish', ['--all' => true, '--force' => true]);
$result = $this->call('bagisto:publish', ['--force' => true]);
$this->info($result);
// running `php artisan storage:link`

View File

@ -68,8 +68,7 @@ class Core
protected LocaleRepository $localeRepository,
protected CustomerGroupRepository $customerGroupRepository,
protected CoreConfigRepository $coreConfigRepository
)
{
) {
}
/**
@ -246,7 +245,7 @@ class Core
return $data = [
'channel' => $channel,
'locales' => $channel->locales()->orderBy('name')->get()
'locales' => $channel->locales()->orderBy('name')->get(),
];
}
@ -598,11 +597,13 @@ class Core
/**
* Return currency symbol from currency code.
*
* @param float $price
* @param string|\Webkul\Core\Contracts\Currency $currency
* @return string
*/
public function currencySymbol($code)
public function currencySymbol($currency)
{
$code = $currency instanceof \Webkul\Core\Contracts\Currency ? $currency->code : $currency;
$formatter = new \NumberFormatter(app()->getLocale() . '@currency=' . $code, \NumberFormatter::CURRENCY);
return $formatter->getSymbol(\NumberFormatter::CURRENCY_SYMBOL);
@ -1206,7 +1207,7 @@ class Core
* @param array $array2
* @return array
*/
protected function arrayMerge(array &$array1, array &$array2)
protected function arrayMerge(array&$array1, array&$array2)
{
$merged = $array1;

View File

@ -103,6 +103,7 @@ class CoreServiceProvider extends ServiceProvider
{
if ($this->app->runningInConsole()) {
$this->commands([
\Webkul\Core\Console\Commands\BagistoPublish::class,
\Webkul\Core\Console\Commands\BagistoVersion::class,
\Webkul\Core\Console\Commands\Install::class,
\Webkul\Core\Console\Commands\ExchangeRateUpdate::class,

View File

@ -125,13 +125,14 @@ class WishlistController extends Controller
$updateCounts = $this->currentCustomer->wishlist_items()->update(['shared' => $data['shared']]);
if ($updateCounts && $updateCounts > 0) {
session()->flash('success', __('shop::app.customer.account.wishlist.update-message'));
return redirect()->back();
return response()->json([
'isWishlistShared' => $this->currentCustomer->isWishlistShared(),
'wishlistSharedLink' => $this->currentCustomer->getWishlistSharedLink()
]);
}
}
return redirect()->back();
return response()->json([], 400);
}
/**

View File

@ -674,12 +674,12 @@ abstract class AbstractType
{
return [
'regular_price' => [
'price' => core()->convertPrice($this->evaluatePrice($this->product->price)),
'formated_price' => core()->currency($this->evaluatePrice($this->product->price)),
'price' => core()->convertPrice($this->evaluatePrice($regularPrice = $this->product->price)),
'formated_price' => core()->currency($this->evaluatePrice($regularPrice)),
],
'final_price' => [
'price' => core()->convertPrice($this->evaluatePrice($this->getMinimalPrice())),
'formated_price' => core()->currency($this->evaluatePrice($this->getMinimalPrice())),
'price' => core()->convertPrice($this->evaluatePrice($minimalPrice = $this->getMinimalPrice())),
'formated_price' => core()->currency($this->evaluatePrice($minimalPrice)),
],
];
}

View File

@ -340,23 +340,23 @@ class Bundle extends AbstractType
return [
'from' => [
'regular_price' => [
'price' => core()->convertPrice($this->evaluatePrice($this->getRegularMinimalPrice())),
'formated_price' => core()->currency($this->evaluatePrice($this->getRegularMinimalPrice())),
'price' => core()->convertPrice($this->evaluatePrice($regularMinimalPrice = $this->getRegularMinimalPrice())),
'formated_price' => core()->currency($this->evaluatePrice($regularMinimalPrice)),
],
'final_price' => [
'price' => core()->convertPrice($this->evaluatePrice($this->getMinimalPrice())),
'formated_price' => core()->currency($this->evaluatePrice($this->getMinimalPrice())),
'price' => core()->convertPrice($this->evaluatePrice($minimalPrice = $this->getMinimalPrice())),
'formated_price' => core()->currency($this->evaluatePrice($minimalPrice)),
],
],
'to' => [
'regular_price' => [
'price' => core()->convertPrice($this->evaluatePrice($this->getRegularMaximamPrice())),
'formated_price' => core()->currency($this->evaluatePrice($this->getRegularMaximamPrice())),
'price' => core()->convertPrice($this->evaluatePrice($regularMaximumPrice = $this->getRegularMaximamPrice())),
'formated_price' => core()->currency($this->evaluatePrice($regularMaximumPrice)),
],
'final_price' => [
'price' => core()->convertPrice($this->evaluatePrice($this->getMaximamPrice())),
'formated_price' => core()->currency($this->evaluatePrice($this->getMaximamPrice())),
'price' => core()->convertPrice($this->evaluatePrice($maximumPrice = $this->getMaximamPrice())),
'formated_price' => core()->currency($this->evaluatePrice($maximumPrice)),
],
],
];

View File

@ -555,14 +555,16 @@ class Configurable extends AbstractType
*/
public function getProductPrices()
{
$haveOffer = $this->haveOffer();
return [
'regular_price' => [
'formated_price' => $this->haveOffer()
? core()->currency($this->evaluatePrice($this->getOfferPrice()))
: core()->currency($this->evaluatePrice($this->getMinimalPrice())),
'price' => $this->haveOffer()
? $this->evaluatePrice($this->getOfferPrice())
: $this->evaluatePrice($this->getMinimalPrice()),
'formated_price' => $haveOffer
? core()->currency($this->evaluatePrice($offerPrice = $this->getOfferPrice()))
: core()->currency($this->evaluatePrice($minimalPrice = $this->getMinimalPrice())),
'price' => $haveOffer
? $this->evaluatePrice($offerPrice)
: $this->evaluatePrice($minimalPrice),
],
];
}

View File

@ -74,9 +74,13 @@ class OrderRepository extends Repository
$order->payment()->create($data['payment']);
if (isset($data['shipping_address'])) {
unset($data['shipping_address']['customer_id']);
$order->addresses()->create($data['shipping_address']);
}
unset($data['billing_address']['customer_id']);
$order->addresses()->create($data['billing_address']);
foreach ($data['items'] as $item) {

View File

@ -104,8 +104,8 @@ return [
'confirm-remove-all' => 'Are you sure you want to delete all compare items?',
'already_added' => 'تمت إضافة العنصر بالفعل لمقارنة القائمة',
'empty-text' => 'ليس لديك أي عناصر في قائمة المقارنة الخاصة بك',
'product_image' => 'Product Image',
'actions' => 'Actions',
'product_image' => 'صورة المنتج',
'actions' => 'أجراءات',
],
'signup-text' => [
@ -368,19 +368,20 @@ return [
'remove-fail' => 'لا يمكن حذف العنصر من قائمة الأماني ، الرجاء المحاولة لاحقا',
'empty' => 'ليس لديك أي عناصر في قائمة الأمنيات',
'remove-all-success' => 'كل الأشياء من قائمة أمانيك قد أزيلت',
'save' => 'Save',
'share' => 'Share',
'share-wishlist' => 'Share Wishlist',
'wishlist-sharing' => 'Wishlist Sharing',
'shared-link' => 'Shared Link',
'visibility' => 'Visibility',
'public' => 'Public',
'private' => 'Private',
'enable' => 'Enable',
'disable' => 'Disable',
'customer-name' => ':name\'s Shared Wishlist',
'enable-wishlist-info' => 'Enable wishlist sharing to get the link.',
'update-message' => 'Shared wishlist settings updated successfully',
'save' => 'يحفظ',
'share' => 'شارك',
'share-wishlist' => 'مشاركة قائمة الرغبات',
'wishlist-sharing' => 'تقاسم قائمة الرغبات',
'shared-link' => 'رابط مشترك',
'copy' => 'ينسخ',
'visibility' => 'الرؤية',
'public' => 'عام',
'private' => 'نشر',
'enable' => 'ممكن',
'disable' => 'إبطال',
'customer-name' => ':name\'س قائمة الرغبات المشتركة',
'enable-wishlist-info' => 'قم بتمكين مشاركة قائمة الرغبات للحصول على الرابط.',
'update-message' => 'تم تحديث إعدادات قائمة الرغبات المشتركة بنجاح',
],
'downloadable_products' => [
@ -395,7 +396,7 @@ return [
'remaining-downloads' => 'التنزيلات المتبقية',
'unlimited' => 'غير محدود',
'download-error' => 'انتهت صلاحية رابط التنزيل.',
'payment-error' => 'Payment has not been done for this download.',
'payment-error' => 'لم يتم السداد لهذا التحميل.',
],
'review' => [
@ -472,9 +473,9 @@ return [
'available-for-order' => 'متوفر لطلب الشراء',
'settings' => 'Settings',
'compare_options' => 'قارن الخيارات',
'wishlist-options' => 'Wishlist Options',
'offers' => 'Buy :qty for :price each and save :discount%',
'tax-inclusive' => 'Inclusive of all taxes',
'wishlist-options' => 'خيارات قائمة الرغبات',
'offers' => 'Buy :qty ل :price كل وحفظ :discount%',
'tax-inclusive' => 'شاملة لجميع الضرائب',
],
// 'reviews' => [
@ -532,11 +533,11 @@ return [
'expired' => 'This event has been expired.',
],
'minimum-order-message' => 'الحد الأدنى لمبلغ الطلب هو :amount',
'suspended-account-message' => 'Your account has been suspended.',
'check-shipping-address' => 'Please check shipping address.',
'check-billing-address' => 'Please check billing address.',
'specify-shipping-method' => 'Please specify shipping method.',
'specify-payment-method' => 'Please specify payment method.',
'suspended-account-message' => 'تم تعليق حسابك.',
'check-shipping-address' => 'يرجى التحقق من عنوان الشحن.',
'check-billing-address' => 'يرجى التحقق من عنوان الفواتير.',
'specify-shipping-method' => 'الرجاء تحديد طريقة الشحن.',
'specify-payment-method' => 'الرجاء تحديد طريقة الدفع.',
],
'onepage' => [
@ -679,10 +680,10 @@ return [
'subject' => '#:order_id فاتورة لطلبك',
'summary' => 'موجز الفاتورة',
'reminder' => [
'subject' => 'Invoice reminder',
'your-invoice-is-overdue' => 'Your invoice :invoice is overdue by :time.',
'please-make-your-payment-as-soon-as-possible' => 'Please make your payment as soon as possible.',
'if-you-ve-already-paid-just-disregard-this-email' => 'If you\'ve already paid, just disregard this email.',
'subject' => 'تذكير الفاتورة',
'your-invoice-is-overdue' => 'فاتورتك :invoice فات موعده :time.',
'please-make-your-payment-as-soon-as-possible' => 'يرجى إجراء الدفع في أسرع وقت ممكن.',
'if-you-ve-already-paid-just-disregard-this-email' => 'إذا كنت قد دفعت بالفعل ، فقط تجاهل هذا البريد الإلكتروني.',
],
],

View File

@ -376,6 +376,7 @@ return [
'share-wishlist' => 'ইচ্ছা তালিকা ভাগ করুন',
'wishlist-sharing' => 'ইচ্ছা তালিকা শেয়ারিং',
'shared-link' => 'শেয়ারড লিংক',
'copy' => 'Copy',
'visibility' => 'দৃশ্যমানতা',
'public' => 'পাবলিক',
'private' => 'ব্যক্তিগত',

View File

@ -371,6 +371,7 @@ return [
'share-wishlist' => 'Share Wishlist',
'wishlist-sharing' => 'Wishlist Sharing',
'shared-link' => 'Shared Link',
'copy' => 'Copy',
'visibility' => 'Visibility',
'public' => 'Public',
'private' => 'Private',

View File

@ -376,6 +376,7 @@ return [
'share-wishlist' => 'Share Wishlist',
'wishlist-sharing' => 'Wishlist Sharing',
'shared-link' => 'Shared Link',
'copy' => 'Copy',
'visibility' => 'Visibility',
'public' => 'Public',
'private' => 'Private',

View File

@ -374,6 +374,7 @@ return [
'share-wishlist' => 'Share Wishlist',
'wishlist-sharing' => 'Wishlist Sharing',
'shared-link' => 'Shared Link',
'copy' => 'Copy',
'visibility' => 'Visibility',
'public' => 'Public',
'private' => 'Private',

View File

@ -370,6 +370,7 @@ return [
'share-wishlist' => 'Share Wishlist',
'wishlist-sharing' => 'Wishlist Sharing',
'shared-link' => 'Shared Link',
'copy' => 'Copy',
'visibility' => 'Visibility',
'public' => 'Public',
'private' => 'Private',

View File

@ -372,6 +372,7 @@ return [
'share-wishlist' => 'Share Wishlist',
'wishlist-sharing' => 'Wishlist Sharing',
'shared-link' => 'Shared Link',
'copy' => 'Copy',
'visibility' => 'Visibility',
'public' => 'Public',
'private' => 'Private',

View File

@ -375,6 +375,7 @@ return [
'share-wishlist' => 'שתף משאלות',
'wishlist-sharing' => 'שיתוף רשימת המשאלות',
'shared-link' => 'קישור משותף',
'copy' => 'Copy',
'visibility' => 'רְאוּת',
'public' => 'פּוּמְבֵּי',
'private' => 'פְּרָטִי',

View File

@ -375,6 +375,7 @@ return [
'share-wishlist' => 'शेयर विशलिस्ट',
'wishlist-sharing' => 'विशलिस्ट शेयरिंग',
'shared-link' => 'साझा लिंक',
'copy' => 'Copy',
'visibility' => 'दृश्यता',
'public' => 'जनता',
'private' => 'निजी',

View File

@ -372,6 +372,7 @@ return [
'share-wishlist' => 'Share Wishlist',
'wishlist-sharing' => 'Wishlist Sharing',
'shared-link' => 'Shared Link',
'copy' => 'Copy',
'visibility' => 'Visibility',
'public' => 'Public',
'private' => 'Private',

View File

@ -352,6 +352,7 @@ return [
'share-wishlist' => 'Share Wishlist',
'wishlist-sharing' => 'Wishlist Sharing',
'shared-link' => 'Shared Link',
'copy' => 'Copy',
'visibility' => 'Visibility',
'public' => 'Public',
'private' => 'Private',

View File

@ -378,6 +378,7 @@ return [
'share-wishlist' => 'Share Wishlist',
'wishlist-sharing' => 'Wishlist Sharing',
'shared-link' => 'Shared Link',
'copy' => 'Copy',
'visibility' => 'Visibility',
'public' => 'Public',
'private' => 'Private',

View File

@ -372,6 +372,7 @@ return [
'share-wishlist' => 'Share Wishlist',
'wishlist-sharing' => 'Wishlist Sharing',
'shared-link' => 'Shared Link',
'copy' => 'Copy',
'visibility' => 'Visibility',
'public' => 'Public',
'private' => 'Private',

View File

@ -366,6 +366,7 @@ return [
'share-wishlist' => 'Share Wishlist',
'wishlist-sharing' => 'Wishlist Sharing',
'shared-link' => 'Shared Link',
'copy' => 'Copy',
'visibility' => 'Visibility',
'public' => 'Public',
'private' => 'Private',

View File

@ -374,6 +374,7 @@ return [
'share-wishlist' => '«Поделиться списком желаний»',
'wishlist-sharing' => '«Обмен списком желаний»',
'shared-link' => '«Общая ссылка»',
'copy' => 'Copy',
'visibility' => '«Видимость»',
'public' => '«Общественный»',
'private' => 'Частный',

View File

@ -376,6 +376,7 @@ return [
'share-wishlist' => 'පැතුම් ලැයිස්තුව බෙදාගන්න',
'wishlist-sharing' => 'පැතුම් ලැයිස්තු බෙදාගැනීම',
'shared-link' => 'බෙදාගත් සබැඳිය',
'copy' => 'Copy',
'visibility' => 'දෘෂ්‍යතාව',
'public' => 'මහජන',
'private' => 'පුද්ගලික',

View File

@ -371,6 +371,7 @@ return [
'share-wishlist' => 'Share Wishlist',
'wishlist-sharing' => 'Wishlist Sharing',
'shared-link' => 'Shared Link',
'copy' => 'Copy',
'visibility' => 'Visibility',
'public' => 'Public',
'private' => 'Private',

View File

@ -375,6 +375,7 @@ return [
'share-wishlist' => '分享愿望清单',
'wishlist-sharing' => '愿望清单分享',
'shared-link' => '已共享链接',
'copy' => 'Copy',
'visibility' => '可见度',
'public' => '公开的',
'private' => '私有的',

View File

@ -84,7 +84,7 @@
{!! view_render_event('bagisto.shop.checkout.cart-mini.item.quantity.before', ['item' => $item]) !!}
<div class="item-qty">Quantity - {{ $item->quantity }}</div>
<div class="item-qty">Quantity : {{ $item->quantity }}</div>
{!! view_render_event('bagisto.shop.checkout.cart-mini.item.quantity.after', ['item' => $item]) !!}

View File

@ -9,7 +9,17 @@
<div class="order-success-content" style="min-height: 300px;">
<h1>{{ __('shop::app.checkout.success.thanks') }}</h1>
<p>{{ __('shop::app.checkout.success.order-id-info', ['order_id' => $order->increment_id]) }}</p>
<p>
@if (auth()->guard('customer')->user())
{!!
__('shop::app.checkout.success.order-id-info', [
'order_id' => '<a href="' . route('customer.orders.view', $order->id) . '">' . $order->increment_id . '</a>'
])
!!}
@else
{{ __('shop::app.checkout.success.order-id-info', ['order_id' => $order->increment_id]) }}
@endif
</p>
<p>{{ __('shop::app.checkout.success.info') }}</p>

View File

@ -66,51 +66,8 @@
{{ __('shop::app.customer.account.wishlist.share-wishlist') }}
</h3>
<i class="rango-close"></i>
<div slot="body">
<form method="POST" action="{{ route('customer.wishlist.share') }}">
@csrf
<div class="control-group">
<label for="shared" class="required">{{ __('shop::app.customer.account.wishlist.wishlist-sharing') }}</label>
<select name="shared" class="control">
<option value="0" {{ $isWishlistShared ? '' : 'selected="selected"' }}>{{ __('shop::app.customer.account.wishlist.disable') }}</option>
<option value="1" {{ $isWishlistShared ? 'selected="selected"' : '' }}>{{ __('shop::app.customer.account.wishlist.enable') }}</option>
</select>
</div>
<div class="control-group">
<label class="required">{{ __('shop::app.customer.account.wishlist.visibility') }}</label>
<div class="mt-5">
@if ($isWishlistShared)
<span class="badge badge-sm badge-success">{{ __('shop::app.customer.account.wishlist.public') }}</span>
@else
<span class="badge badge-sm badge-danger">{{ __('shop::app.customer.account.wishlist.private') }}</span>
@endif
</div>
</div>
<div class="control-group">
<label class="required">{{ __('shop::app.customer.account.wishlist.shared-link') }}</label>
<div>
@if ($isWishlistShared)
<a href="{{ $wishlistSharedLink ?? 'javascript:void(0);' }}" target="_blank">{{ $wishlistSharedLink }}</a>
@else
<p>{{ __('shop::app.customer.account.wishlist.enable-wishlist-info') }}</p>
@endif
</div>
</div>
<div class="page-action">
<button type="submit" class="btn btn-lg btn-primary mt-10 pull-right">
{{ __('shop::app.customer.account.wishlist.save') }}
</button>
</div>
</form>
<share-component></share-component>
</div>
</modal>
</div>
@ -122,6 +79,65 @@
@push('scripts')
@if ($isSharingEnabled)
<script type="text/x-template" id="share-component-template">
<form method="POST">
@csrf
<div class="control-group">
<label for="shared" class="required">{{ __('shop::app.customer.account.wishlist.wishlist-sharing') }}</label>
<select name="shared" class="control" @change="shareWishlist($event.target.value)">
<option value="0" :selected="! isWishlistShared">{{ __('shop::app.customer.account.wishlist.disable') }}</option>
<option value="1" :selected="isWishlistShared">{{ __('shop::app.customer.account.wishlist.enable') }}</option>
</select>
</div>
<div class="control-group">
<label class="required">{{ __('shop::app.customer.account.wishlist.visibility') }}</label>
<div style="margin-top: 10px; margin-bottom: 5px;">
<span class="badge badge-sm badge-success" v-if="isWishlistShared">
{{ __('shop::app.customer.account.wishlist.public') }}
</span>
<span class="badge badge-sm badge-danger" v-else>
{{ __('shop::app.customer.account.wishlist.private') }}
</span>
</div>
</div>
<div class="control-group">
<label class="required">{{ __('shop::app.customer.account.wishlist.shared-link') }}</label>
<div style="margin-top: 10px; margin-bottom: 5px;">
<div class="input-group" v-if="isWishlistShared">
<input
type="text"
class="control"
v-model="wishlistSharedLink"
v-on:focus="$event.target.select()"
ref="sharedLink"
/>
<div class="input-group-append">
<button
class="btn btn-primary btn-md"
type="button"
@click="copyToClipboard"
>
{{ __('shop::app.customer.account.wishlist.copy') }}
</button>
</div>
</div>
<p class="alert alert-danger" v-else>
{{ __('shop::app.customer.account.wishlist.enable-wishlist-info') }}
</p>
</div>
</div>
</form>
</script>
<script>
/**
* Show share wishlist modal.
@ -131,6 +147,50 @@
window.app.showModal('shareWishlist');
}
Vue.component('share-component', {
template: '#share-component-template',
inject: ['$validator'],
data: function () {
return {
isWishlistShared: parseInt("{{ $isWishlistShared }}"),
wishlistSharedLink: "{{ $wishlistSharedLink }}",
}
},
methods: {
shareWishlist: function(val) {
var self = this;
this.$root.showLoader();
this.$http.post("{{ route('customer.wishlist.share') }}", {
shared: val
})
.then(function(response) {
self.$root.hideLoader();
self.isWishlistShared = response.data.isWishlistShared;
self.wishlistSharedLink = response.data.wishlistSharedLink;
})
.catch(function (error) {
self.$root.hideLoader();
window.location.reload();
})
},
copyToClipboard: function() {
this.$refs.sharedLink.focus();
document.execCommand('copy');
}
}
});
</script>
@endif

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
{
"/js/ui.js": "/js/ui.js?id=4dc59bc61e8f3eff9489",
"/css/ui.css": "/css/ui.css?id=c8a7ade09358a1d61a4a"
"/js/ui.js": "/js/ui.js?id=a2b05e91c1d8facc7948",
"/css/ui.css": "/css/ui.css?id=243871695aaf4bd7cf12"
}

View File

@ -23,6 +23,8 @@
<script>
export default {
inject: ['$validator'],
props: {
title: String,
id: String,

View File

@ -19,6 +19,8 @@
export default {
props: ['id', 'isOpen'],
inject: ['$validator'],
created () {
this.closeModal();
},

View File

@ -21,9 +21,9 @@
var body = document.querySelector("body");
if (this.isOpen) {
body.classList.add("modal-open");
body.classList.add("loader-open");
} else {
body.classList.remove("modal-open");
body.classList.remove("loader-open");
}
}
}

View File

@ -377,7 +377,7 @@ h5 {
}
a:hover {
color: $brand-color;
color: $brand-color !important;
}
.checkbox {
@ -865,6 +865,68 @@ h5 {
display: inline-block;
}
}
&.input-group {
margin-bottom: 0;
}
.input-group {
position: relative;
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
-webkit-box-align: stretch;
-ms-flex-align: stretch;
align-items: stretch;
width: 100%;
.input-group-append,
.input-group-prepend {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
> .control {
margin: 0;
position: relative;
-webkit-box-flex: 1;
-ms-flex: 1 1 auto;
flex: 1 1 auto;
width: 1% !important;
&:not(:first-child) {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
&:not(:last-child) {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
}
.input-group-prepend {
margin-right: -1px;
.control,
.btn {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
}
.input-group-append {
margin-left: -1px;
.control,
.btn {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
}
}
}
.table {
@ -1203,6 +1265,10 @@ modal {
overflow: hidden;
}
.loader-open {
overflow: hidden;
}
.modal-overlay {
display: none;
overflow-y: auto;
@ -1220,6 +1286,10 @@ modal {
display: block;
}
.loader-open .loader-overlay {
display: block;
}
.modal-container {
background: $white-color;
top: 100px;
@ -1372,6 +1442,10 @@ modal {
margin-bottom: 20px;
float: left;
&.draggable {
cursor: pointer;
}
img.preview {
width: 100%;
height: 100%;
@ -1425,7 +1499,7 @@ modal {
.overlay-loader {
position: fixed;
z-index: 11;
z-index: 10000;
top: 50%;
left: 50%;
margin-top: -24px;

View File

@ -260,14 +260,14 @@
</span>
</span>
</div>
<div class="records-count-container">
<span class="datagrid-count">
{{ $results['records']->total() }} {{ __('admin::app.admin.system.records-found') }}
</span>
</div>
</div>
</div>
<div class="table-responsive">
<table class="table">
@include('ui::datagrid.partials.mass-action-header')
@ -276,7 +276,7 @@
@include('ui::datagrid.body', ['records' => $results['records'], 'actions' => $results['actions'], 'index' => $results['index'], 'columns' => $results['columns'],'enableMassActions' => $results['enableMassActions'], 'enableActions' => $results['enableActions'], 'norecords' => $results['norecords']])
</table>
</div>
</div>
</div>
</script>
@ -810,7 +810,7 @@
break;
}
if (obj.column !== undefined && obj.column !== 'admin_locale' && obj.val !== undefined) {
if (obj.column !== undefined && obj.val !== undefined) {
this.filters.push(obj);
}

File diff suppressed because one or more lines are too long

View File

@ -4,7 +4,7 @@
"/js/velocity.js": "/js/velocity.js?id=f655ac65cbd1aa549cba57f77b9a4344",
"/js/manifest.js": "/js/manifest.js?id=e069a8f952a02ea0f290bcca8fab930e",
"/js/components.js": "/js/components.js?id=13ebf112e40292178d2386143e9d75cd",
"/css/velocity.css": "/css/velocity.css?id=63b696d9af02aa4e86927bc29a63da5f",
"/css/velocity.css": "/css/velocity.css?id=f88138dcc11381f1d2bea6f3a5aa8fe8",
"/css/velocity-admin.css": "/css/velocity-admin.css?id=b67a82956e53163b5e3ff45a44f9778f",
"/images/icon-calendar.svg": "/images/icon-calendar.svg?id=870d0f733a58377422766f3152e15486",
"/images/icon-camera.svg": "/images/icon-camera.svg?id=b2fd2f9e17e1ccee96e29f6c6cec91e8",

View File

@ -197,6 +197,12 @@ body {
right: 20px;
}
}
.currency-icon {
~ .select-icon-container {
right: 7px;
}
}
}
.category-list-container {
@ -299,6 +305,10 @@ body {
}
}
.account-action {
float: left !important;
}
.sidebar {
border-left: 1px solid $border-general;

View File

@ -10,7 +10,15 @@
<h1 class="row col-12">{{ __('shop::app.checkout.success.thanks') }}</h1>
<p class="row col-12">
{{ __('shop::app.checkout.success.order-id-info', ['order_id' => $order->increment_id]) }}
@if (auth()->guard('customer')->user())
{!!
__('shop::app.checkout.success.order-id-info', [
'order_id' => '<a href="' . route('customer.orders.view', $order->id) . '">' . $order->increment_id . '</a>'
])
!!}
@else
{{ __('shop::app.checkout.success.order-id-info', ['order_id' => $order->increment_id]) }}
@endif
</p>
<p class="row col-12">

View File

@ -70,62 +70,7 @@
<i class="rango-close"></i>
<div slot="body">
<form method="POST" action="{{ route('customer.wishlist.share') }}">
@csrf
<div class="row">
<div class="col-12">
<label class="mandatory">
{{ __('shop::app.customer.account.wishlist.wishlist-sharing') }}
</label>
<select name="shared" class="form-control">
<option value="0" {{ $isWishlistShared ? '' : 'selected="selected"' }}>{{ __('shop::app.customer.account.wishlist.disable') }}</option>
<option value="1" {{ $isWishlistShared ? 'selected="selected"' : '' }}>{{ __('shop::app.customer.account.wishlist.enable') }}</option>
</select>
</div>
</div>
<div class="row mt-2">
<div class="col-12">
<label class="mandatory">
{{ __('shop::app.customer.account.wishlist.visibility') }}
</label>
<div>
@if ($isWishlistShared)
<span class="badge badge-success">{{ __('shop::app.customer.account.wishlist.public') }}</span>
@else
<span class="badge badge-danger">{{ __('shop::app.customer.account.wishlist.private') }}</span>
@endif
</div>
</div>
</div>
<div class="row mt-2">
<div class="col-12">
<label class="mandatory">
{{ __('shop::app.customer.account.wishlist.shared-link') }}
</label>
<div>
@if ($isWishlistShared)
<a href="{{ $wishlistSharedLink ?? 'javascript:void(0);' }}" target="_blank">{{ $wishlistSharedLink }}</a>
@else
<p class="alert alert-danger">{{ __('shop::app.customer.account.wishlist.enable-wishlist-info') }}</p>
@endif
</div>
</div>
</div>
<div class="row mt-2">
<div class="col-12">
<button type="submit" class="theme-btn float-right">
{{ __('shop::app.customer.account.wishlist.save') }}
</button>
</div>
</div>
</form>
<share-component></share-component>
</div>
</modal>
</div>
@ -136,6 +81,70 @@
@push('scripts')
@if($isSharingEnabled)
<script type="text/x-template" id="share-component-template">
<form method="POST">
@csrf
<div class="form-group">
<label class="label-style mandatory">
{{ __('shop::app.customer.account.wishlist.wishlist-sharing') }}
</label>
<select name="shared" class="form-control" @change="shareWishlist($event.target.value)">
<option value="0" :selected="! isWishlistShared">{{ __('shop::app.customer.account.wishlist.disable') }}</option>
<option value="1" :selected="isWishlistShared">{{ __('shop::app.customer.account.wishlist.enable') }}</option>
</select>
</div>
<div class="form-group">
<label class="label-style mandatory">
{{ __('shop::app.customer.account.wishlist.visibility') }}
</label>
<div>
<span class="badge badge-success" v-if="isWishlistShared">
{{ __('shop::app.customer.account.wishlist.public') }}
</span>
<span class="badge badge-danger" v-else>
{{ __('shop::app.customer.account.wishlist.private') }}
</span>
</div>
</div>
<div class="form-group">
<label class="label-style mandatory">
{{ __('shop::app.customer.account.wishlist.shared-link') }}
</label>
<div class="input-group" v-if="isWishlistShared">
<input
type="text"
class="form-control"
v-model="wishlistSharedLink"
v-on:focus="$event.target.select()"
ref="sharedLink"
/>
<div class="input-group-append">
<button
class="btn btn-outline-secondary theme-btn"
style="padding: 6px 20px"
type="button"
@click="copyToClipboard"
>
{{ __('shop::app.customer.account.wishlist.copy') }}
</button>
</div>
</div>
<p class="alert alert-danger" v-else>
{{ __('shop::app.customer.account.wishlist.enable-wishlist-info') }}
</p>
</div>
</form>
</script>
<script>
/**
* Show share wishlist modal.
@ -145,6 +154,50 @@
window.app.showModal('shareWishlist');
}
Vue.component('share-component', {
template: '#share-component-template',
inject: ['$validator'],
data: function () {
return {
isWishlistShared: parseInt("{{ $isWishlistShared }}"),
wishlistSharedLink: "{{ $wishlistSharedLink }}",
}
},
methods: {
shareWishlist: function(val) {
var self = this;
this.$root.showLoader();
this.$http.post("{{ route('customer.wishlist.share') }}", {
shared: val
})
.then(function(response) {
self.$root.hideLoader();
self.isWishlistShared = response.data.isWishlistShared;
self.wishlistSharedLink = response.data.wishlistSharedLink;
})
.catch(function (error) {
self.$root.hideLoader();
window.location.reload();
})
},
copyToClipboard: function() {
this.$refs.sharedLink.focus();
document.execCommand('copy');
}
}
});
</script>
@endif

View File

@ -65,6 +65,10 @@
@if (core()->getCurrentChannel()->currencies->count() > 1)
<div class="d-inline-block">
<div class="dropdown">
<span class="currency-icon">
{{ core()->getCurrentCurrency()->symbol }}
</span>
<select
class="btn btn-link dropdown-toggle control locale-switcher styled-select"
onchange="window.location.href = this.value" aria-label="Locale">

View File

@ -4,47 +4,47 @@ use Illuminate\Support\Facades\Route;
use Webkul\Velocity\Http\Controllers\Admin\ConfigurationController;
use Webkul\Velocity\Http\Controllers\Admin\ContentController;
Route::group(['middleware' => ['web', 'admin_locale']], function () {
Route::group(['middleware' => ['web']], function () {
Route::prefix(config('app.admin_url') . '/velocity')->group(function () {
Route::group(['middleware' => ['admin']], function () {
Route::get('/content', [ContentController::class, 'index'])->defaults('_config', [
'view' => 'velocity::admin.content.index'
'view' => 'velocity::admin.content.index',
])->name('velocity.admin.content.index');
Route::get('/content/search', [ContentController::class, 'search'])->name('velocity.admin.content.search');
Route::get('/content/create', [ContentController::class, 'create'])->defaults('_config', [
'view' => 'velocity::admin.content.create'
'view' => 'velocity::admin.content.create',
])->name('velocity.admin.content.create');
Route::post('/content/create', [ContentController::class, 'store'])->defaults('_config', [
'redirect' => 'velocity.admin.content.index'
'redirect' => 'velocity.admin.content.index',
])->name('velocity.admin.content.store');
Route::get('/content/edit/{id}', [ContentController::class, 'edit'])->defaults('_config', [
'view' => 'velocity::admin.content.edit'
'view' => 'velocity::admin.content.edit',
])->name('velocity.admin.content.edit');
Route::put('/content/edit/{id}', [ContentController::class, 'update'])->defaults('_config', [
'redirect' => 'velocity.admin.content.index'
'redirect' => 'velocity.admin.content.index',
])->name('velocity.admin.content.update');
Route::post('/content/delete/{id}', [ContentController::class, 'destroy'])->name('velocity.admin.content.delete');
Route::post('/content/masssdelete', [ContentController::class, 'massDestroy'])->defaults('_config', [
'redirect' => 'velocity.admin.content.index'
'redirect' => 'velocity.admin.content.index',
])->name('velocity.admin.content.mass-delete');
Route::post('/content/masss-update', [ContentController::class, 'massUpdate'])->defaults('_config', [
'redirect' => 'velocity.admin.content.index'
'redirect' => 'velocity.admin.content.index',
])->name('velocity.admin.content.mass-update');
Route::get('/meta-data', [ConfigurationController::class, 'renderMetaData'])->defaults('_config', [
'view' => 'velocity::admin.meta-info.meta-data'
'view' => 'velocity::admin.meta-info.meta-data',
])->name('velocity.admin.meta-data');
Route::post('/meta-data/{id}', [ConfigurationController::class, 'storeMetaData'])->defaults('_config', [
'redirect' => 'velocity.admin.meta-data'
'redirect' => 'velocity.admin.meta-data',
])->name('velocity.admin.store.meta-data');
});
});

Some files were not shown because too many files have changed in this diff Show More