This commit is contained in:
ludo
2024-03-03 22:52:00 +01:00
parent 44391e817c
commit e4e2126ada
18 changed files with 465 additions and 353 deletions

View File

@@ -17,9 +17,19 @@ class CustomerAddressesDataTable extends DataTable
public function query(CustomerAddress $model)
{
$model = self::filterByCustomer($model);
return $this->buildQuery($model);
}
public static function filterByCustomer($model, $customerId = false)
{
$customerId = $customerId ? $customerId : self::isFilteredByField('customer_id');
return $customerId ? $model->byCustomer($customerId) : $model;
}
protected function getColumns()
{
return [

View File

@@ -0,0 +1,26 @@
<?php
namespace App\Http\Controllers\Admin\Core\Mail;
use App\Datatables\Admin\Core\Mail\MailLogsDataTable;
use App\Repositories\Core\Mail\MailLogs;
class MailLogController extends Controller
{
public function __construct()
{
// $this->middleware('ability:admin');
}
public function index(MailLogsDataTable $dataTable)
{
return $dataTable->render('admin.Core.Mail.MailLog.index', $data ?? []);
}
public function show($id)
{
$data['message'] = MailLogs::getParsed($id);
return view('admin.Core.Mail.MailLog.modal', $data);
}
}

View File

@@ -10,7 +10,7 @@ class CustomerAddressController extends Controller
{
public function index(CustomerAddressesDataTable $dataTable)
{
return $dataTable->render('Admin.Shop.Customers.list');
return $dataTable->render('Admin.Shop.CustomerAddresses.list');
}
public function create()

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Http\Controllers\Admin\Shop;
use App\Http\Controllers\Controller;
use App\Repositories\Shop\Dashboards;
use Illuminate\Http\Request;
class DashboardController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function index(Request $request)
{
$data = $request->all();
$data = Dashboards::getStats($data);
dump($data);
return view('Admin.Shop.Dashboard.index', $data);
}
}

View File

@@ -0,0 +1,75 @@
<?php
namespace App\Http\Controllers\Admin\Shop;
use App\Datatables\Shop\PriceListValuesDataTable;
use App\Http\Controllers\Controller;
use App\Repositories\Shop\Packages;
use App\Repositories\Shop\PriceListValueCategories;
use App\Repositories\Shop\PriceListValues;
use App\Repositories\Shop\Taxes;
use App\Repositories\Shop\Unities;
use Illuminate\Http\Request;
class PriceListValueController extends Controller
{
public function index(PriceListValuesDataTable $dataTable)
{
$data['categories'] = PriceListValueCategories::getOptions();
return $dataTable->render('Admin.Shop.PriceListValues.list', $data);
}
public function create()
{
$data['unities'] = Unities::getOptions();
$data['taxes_options'] = Taxes::getOptions();
$data['categories'] = PriceListValueCategories::getOptions();
return view('Admin.Shop.PriceListValues.create', $data);
}
public function edit($id)
{
$data['generic'] = PriceListValues::getFull($id)->toArray();
$data['packages'] = Packages::getSelectByFamily($data['generic']['category']['article_family_id']);
$data['unities'] = ($data['packages']['id'] ?? false) ? Unities::getSelectByPackage($data['packages']['id']) : [];
$data['taxes_options'] = Taxes::getOptions();
$data['categories'] = PriceListValueCategories::getOptions();
return view('Admin.Shop.PriceListValues.edit', $data);
}
public function store(Request $request)
{
$ret = PriceListValues::store($request->all());
return redirect()->route('Admin.Shop.PriceListValues.index');
}
public function show($id)
{
$data = PriceListValues::get($id);
return view('Admin.Shop.PriceListValues.view', $data);
}
public function destroy($id)
{
return PriceListValues::destroy($id);
}
public function getPrice($id)
{
$data['generic'] = PriceListValues::getFull($id);
return view('Admin.Shop.PriceListValues.partials.table-prices', $data);
}
public function addPrice($index)
{
$data['index'] = $index;
return view('Admin.Shop.PriceListValues.partials.row_price', $data);
}
}

View File

@@ -3,24 +3,35 @@
namespace App\Http\Controllers\Shop\Auth;
use App\Http\Controllers\Controller;
use App\Http\Requests\Shop\RegisterCustomer;
use App\Repositories\Shop\CustomerAddresses;
use App\Repositories\Shop\Customers;
use Illuminate\Foundation\Auth\EmailVerificationRequest;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Sebastienheyd\Boilerplate\Rules\Password;
class RegisterController extends Controller
{
protected $redirectTo;
public function showRegistrationForm()
public function showRegistrationForm(Request $request)
{
return view('Shop.auth.register');
return view('Shop.auth.register', ['customer' => $request->old()]);
}
public function register(Request $request)
public function register(RegisterCustomer $request)
{
$validatedData = $request->validateWithBag('Errors', [
'last_name' => 'required|max:255',
'first_name' => 'required|max:255',
'email' => 'required|email|max:255|unique:shop_customers,email,NULL,id,deleted_at,NULL',
'password' => ['required', 'confirmed', new Password()],
]);
$user = $this->create($request->all());
$this->guard()->login($user);
@@ -34,7 +45,7 @@ class RegisterController extends Controller
return $request->wantsJson()
? new JsonResponse([], 201)
: redirect($this->redirectPath());
: redirect('home');
}
public function emailVerify()

View File

@@ -10,7 +10,6 @@ use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
use LangleyFoxall\LaravelNISTPasswordRules\PasswordRules;
use Laratrust\Traits\LaratrustUserTrait;
class Users
@@ -113,32 +112,6 @@ class Users
return $user ? $user->hasRole($role) : false;
}
public static function hasPermission($permission, $user = false)
{
if (self::isAdmin()) {
return true;
}
$user = $user ? $user : self::getUser();
$permissions = self::getPermissions($user);
return $user ? self::checkPermission($permissions, $permission) : false;
}
public static function checkPermission($permissions, $permission)
{
if (! strpos($permission, '*')) {
return in_array($permission, $permissions);
}
$permission = str_replace('*', '', $permission);
foreach ($permissions as $item) {
if (stripos($item, $permission) !== false) {
return true;
}
}
return false;
}
public static function getRoles($user = false)
{
$user = $user ? $user : self::getUser();
@@ -146,33 +119,6 @@ class Users
return $user ? $user->roles->pluck('name')->toArray() : false;
}
public static function getRolesToEdit()
{
return Roles::getListByRights();
}
public static function getPermissions($user = false)
{
$user = $user ? $user : self::getUser();
return $user ? $user->allPermissions()->pluck('name')->toArray() : false;
}
public static function getByTeam($id)
{
return User::byTeam($id)->get();
}
public static function getByUniqueTeam($id)
{
return User::byTeam($id)->byUniqueTeam()->get();
}
public static function destroyByUniqueTeam($id)
{
return User::byTeam($id)->byUniqueTeam()->delete();
}
public static function getAvatar($user_id)
{
$avatar = self::get($user_id)->avatar;
@@ -224,11 +170,6 @@ class Users
return User::find($id)->update(['password' => $password]);
}
public static function validate($username, $field = 'current_password')
{
return PasswordRules::changePassword($username, $field);
}
public static function getModel()
{
return User::query();

View File

@@ -1,6 +1,11 @@
@component('components.card')
<x-card>
@include('components.datatable', [
'route' => route('Admin.Shop.CustomerAddresses.index'),
'model' => 'customer_addresses',
'with_print' => false,
'with_filters' => false,
])
@endcomponent
<x-layout.modal title="Filtres" id="modal-customer_addresses-filters">
@include('Admin.Shop.CustomerAddresses.partials.filters', ['model' => 'customer_addresses'])
</x-layout.modal>
</x-card>

View File

@@ -0,0 +1,3 @@
<form id="{{ $model }}-filters">
<input type="text" name="customer_id" value="{{ $customer['id'] ?? false }}">
</form>

View File

@@ -1,8 +1,7 @@
f{{ Form::open(['route' => 'Admin.Shop.Customers.store', 'id' => 'customer-form', 'autocomplete' => 'off']) }}
<input type="hidden" name="id" value="{{ $customer['id'] ?? false }}">
<div class="row">
<div class="col-6">
{{ Form::open(['route' => 'Admin.Shop.Customers.store', 'id' => 'customer-form', 'autocomplete' => 'off']) }}
<input type="hidden" name="id" value="{{ $customer['id'] ?? false }}">
<x-card>
<div class="row mb-3">
<div class="col-6">
@@ -113,13 +112,13 @@ f{{ Form::open(['route' => 'Admin.Shop.Customers.store', 'id' => 'customer-form'
</div>
</x-card>
</div>
</form>
<div class="col-6">
<x-layout.box-collapse title='Adresses' id='form-customer-address'>
@include('Admin.Shop.CustomerAddresses.list', ['dataTable' => $customer_addresses])
</x-layout.box-collapse>
</div>
</div>
</form>
<x-save />

View File

@@ -10,6 +10,7 @@
'route' => route('Admin.Shop.Customers.index'),
'model' => 'customers',
'with_filters' => true,
'with_print' => false,
])
<x-layout.modal title="Filtres" id="modal-customers-filters">
@include('Admin.Shop.Customers.partials.filters', ['model' => 'customers'])

View File

@@ -1,9 +1,20 @@
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div class="row">
<div class="col-6">
@include('components.form.input', [
'name' => 'first_name',
'value' => $customer['first_name'] ?? '',
'label' => 'Prénom',
'required' => true,
])
</div>
<div class="col-6">
@@ -11,6 +22,7 @@
'name' => 'last_name',
'value' => $customer['last_name'] ?? '',
'label' => 'Nom',
'required' => true,
])
</div>
</div>

View File

@@ -1,5 +1,5 @@
{!! Form::open(['route' => 'Shop.register.post', 'method' => 'post', 'autocomplete'=> 'off']) !!}
<div class="row green">
{!! Form::open(['route' => 'Shop.register.post', 'method' => 'post', 'autocomplete' => 'off']) !!}
<div class="row green">
<div class="col-12">
<x-card title='Créez votre compte' class='mt-3 mb-3'>
@@ -8,16 +8,24 @@
<div class="row">
<div class="col-6">
<div class="form-group {{ $errors->has('password') ? 'has-error' : '' }}">
<label>Mot de passe</label>
{{ Form::password('password', ['class' => 'form-control', 'placeholder' => __('boilerplate::auth.fields.password'), 'required']) }}
{!! $errors->first('password','<p class="text-danger"><strong>:message</strong></p>') !!}
<label>Mot de passe *</label>
{{ Form::password('password', [
'class' => 'form-control',
'placeholder' => __('boilerplate::auth.fields.password'),
'required',
]) }}
{!! $errors->first('password', '<p class="text-danger"><strong>:message</strong></p>') !!}
</div>
</div>
<div class="col-6">
<label>Confirmation du mot de passe</label>
<label>Confirmation du mot de passe *</label>
<div class="form-group {{ $errors->has('password_confirmation') ? 'has-error' : '' }}">
{{ Form::password('password_confirmation', ['class' => 'form-control', 'placeholder' => __('boilerplate::auth.fields.password_confirm'), 'required']) }}
{!! $errors->first('password_confirmation','<p class="text-danger"><strong>:message</strong></p>') !!}
{{ Form::password('password_confirmation', [
'class' => 'form-control',
'placeholder' => __('boilerplate::auth.fields.password_confirm'),
'required',
]) }}
{!! $errors->first('password_confirmation', '<p class="text-danger"><strong>:message</strong></p>') !!}
</div>
</div>
</div>
@@ -36,7 +44,7 @@
<div class="col-12">
@include('Shop.Customers.partials.address', [
'label' => 'Adresse de livraison',
'prefix' => 'delivery_'
'prefix' => 'delivery_',
])
</div>
</div>
@@ -52,7 +60,7 @@
</div>
</div>
</div>
</div>
</form>
@push('js')

View File

@@ -20,7 +20,12 @@
@if (isset($left_buttons))
@foreach ($left_buttons as $button)
@include('components.form.button', ['class' => $button['class'] ?? null, 'icon' => $button['icon'] ?? null, 'txt' => $button['txt'] ?? null, 'id' => $button['id'] ?? null ])
@include('components.form.button', [
'class' => $button['class'] ?? null,
'icon' => $button['icon'] ?? null,
'txt' => $button['txt'] ?? null,
'id' => $button['id'] ?? null,
])
@endforeach
@endif

View File

@@ -11,7 +11,12 @@
<div class="col-lg-2 col-md-1 col-6 text-right">
@if (isset($right_buttons))
@foreach ($right_buttons as $button)
@include('components.form.button', ['class' => $button['class'] ?? null, 'icon' => $button['icon'] ?? null, 'txt' => $button['txt'] ?? null, 'id' => $button['id'] ?? null ])
@include('components.form.button', [
'class' => $button['class'] ?? null,
'icon' => $button['icon'] ?? null,
'txt' => $button['txt'] ?? null,
'id' => $button['id'] ?? null,
])
@endforeach
@endif
@@ -19,7 +24,7 @@
{!! $right_content !!}
@endif
@if (!(isset($with_add) && (!$with_add)))
@if (!(isset($with_add) && !$with_add))
@include('components.datatables.buttons.add')
@endif
</div>

View File

@@ -1,12 +1,10 @@
<script>
$('#{{ $model }}-table').on( 'draw.dt', function () {
$('#{{ $model }}-table').on('draw.dt', function() {
var table = getDatatable("{{ $model }}");
$('#{{ $model }}-table .btn-edit').off('click').click(function(e) {
e.preventDefault();
// var id = table.row(this).id();
var id = $(this).data('id');
@if (isset($edit_callback))
{{ $edit_callback }}
@@ -18,7 +16,6 @@
$('#{{ $model }}-table .btn-show').off('click').click(function(e) {
e.preventDefault();
// var id = table.row(this).id();
var id = $(this).data('id');
@if (isset($show_callback))
{{ $show_callback }}
@@ -28,20 +25,20 @@
@endif
});
$('#{{ $model }}-table .btn-del').off('click').click(function (e) {
$('#{{ $model }}-table .btn-del').off('click').click(function(e) {
e.preventDefault();
// var id = table.row(this).id();
var id = $(this).data('id');
bootbox.confirm("{{ __('fg.confirmdelete') }}", function (result) {
bootbox.confirm("{{ __('fg.confirmdelete') }}", function(result) {
if (result === false) return;
$.ajax({
url: '{{ $route }}' + '/destroy/' + id,
method: 'delete',
headers: {'X-CSRF-TOKEN': '{{ csrf_token() }}'},
success: function(){
// line.remove();
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
},
success: function() {
@if (isset($delete_callback))
{{ $delete_callback }}
@else
@@ -56,23 +53,5 @@
{{ $callback ?? '' }}
var state = table.state.loaded();
// console.log('state');
// console.log(state);
if ( state ) {
/*
table.columns().eq( 0 ).each( function ( colIdx ) {
var colSearch = state.columns[colIdx].search;
if ( colSearch.search ) {
$('.search-input-text').eq(colIdx).val( colSearch.search );
}
});
*/
}
});
// datatablesHelper.getDatatableLength('{{ $model }}', 34);
</script>

View File

@@ -1,21 +1,30 @@
@include('components.form.label')
@if (($disabled ?? false) || ($readonly ?? false))
@include('components.form.input', ['type' => 'hidden', 'label' => false, 'disabled' => false, 'readonly' => false])
@include('components.form.input', [
'type' => 'hidden',
'label' => false,
'disabled' => false,
'readonly' => false,
])
@endif
<input type="{{ $type ?? 'text'}}" name="{{ $name }}" id="{{ $id_name ?? str_slug($name,'-') }}" class="form-control {{ $class ?? ''}}" value="{{ $value ?? null}}"
@if ($required ?? false) required @endif
@if ($disabled ?? false) disabled @endif
@if ($readonly ?? false) readonly @endif
@if ($autofocus ?? false) autofocus @endif
@if ($size ?? false) size="{{ $size }}" @endif
@if ($autocomplete ?? false) autocomplete="{{ $autocomplete }}" @endif
@if ($minlength ?? false) minlength={{ $minlength }} @endif
@if ($maxlength ?? false) maxlength={{ $maxlength }} @endif
@if ($formid ?? false) form="{{ $formid }}" @endif
@if ($mask ?? false) data-inputmask="'mask': '{{ $mask }}'" @endif
@if ($pattern ?? false) pattern="{{ $pattern }}" @endif
@if ($placeholder ?? false) placeholder="{{ $placeholder }}" @endif
@if ($step ?? false) step="{{ $step }}" @endif
{!! $meta ?? '' !!} >
<input type="{{ $type ?? 'text' }}" name="{{ $name }}" id="{{ $id_name ?? str_slug($name, '-') }}"
class="form-control {{ $class ?? '' }}" value="{{ $value ?? (old($name) ?? '') }}"
@if ($required ?? false) required @endif @if ($disabled ?? false) disabled @endif
@if ($readonly ?? false) readonly @endif @if ($autofocus ?? false) autofocus @endif
@if ($size ?? false) size="{{ $size }}" @endif
@if ($autocomplete ?? false) autocomplete="{{ $autocomplete }}" @endif
@if ($minlength ?? false) minlength={{ $minlength }} @endif
@if ($maxlength ?? false) maxlength={{ $maxlength }} @endif
@if ($formid ?? false) form="{{ $formid }}" @endif
@if ($mask ?? false) data-inputmask="'mask': '{{ $mask }}'" @endif
@if ($pattern ?? false) pattern="{{ $pattern }}" @endif
@if ($placeholder ?? false) placeholder="{{ $placeholder }}" @endif
@if ($step ?? false) step="{{ $step }}" @endif {!! $meta ?? '' !!}>
@error($name)
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror

View File

@@ -1,4 +1,4 @@
@if(!defined('LOAD_DATATABLES'))
@if (!defined('LOAD_DATATABLES'))
@push('css')
<link rel="stylesheet" href="{{ asset('assets/plugins/datatables.min.css') }}">
@endpush
@@ -9,21 +9,21 @@
<script src="{{ asset('vendor/datatables/buttons.server-side.js') }}"></script>
<script>
$.extend( true, $.fn.dataTable.defaults, {
$.extend(true, $.fn.dataTable.defaults, {
language: {
url: "/assets/plugins/datatables_lang/{{ \App::getLocale() }}.json"
},
});
function removeAccents ( data ) {
if ( data.normalize ) {
return data +' '+ data.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
function removeAccents(data) {
if (data.normalize) {
return data + ' ' + data.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
}
return data;
}
function reloadDatatable(name) {
getDatatable(name).ajax.reload(null,false);
getDatatable(name).ajax.reload(null, false);
// getDatatable(name).columns.adjust().draw();
}
@@ -99,7 +99,7 @@
for (item of tab) {
if (item.value) {
var selector2 = selector + ' input[name="' + item.name + '"]';
var isHidden = ( $(selector2).attr('type') == 'hidden' );
var isHidden = ($(selector2).attr('type') == 'hidden');
if (!isHidden) hasValue = true;
}
}
@@ -109,15 +109,14 @@
(function() {
var searchType = jQuery.fn.DataTable.ext.type.search;
searchType.string = function ( data ) {
return ! data ? '' : typeof data === 'string' ? removeAccents( data ) : data;
searchType.string = function(data) {
return !data ? '' : typeof data === 'string' ? removeAccents(data) : data;
};
searchType.html = function ( data ) {
return ! data ? '' : typeof data === 'string' ? removeAccents( data.replace( /<.*?>/g, '' ) ) : data;
searchType.html = function(data) {
return !data ? '' : typeof data === 'string' ? removeAccents(data.replace(/<.*?>/g, '')) : data;
};
});
</script>
@endpush