Merge branch 'fixFuckingProjectSign' into 'develop'

Poultries Ajax call to fetch distribution info

See merge request service-web-lab/tracabilite-loue!9
This commit is contained in:
Jérémy Munsch 2022-10-21 08:20:48 +00:00
commit 96b231f7d9
7 changed files with 101 additions and 29 deletions

View file

@ -3,8 +3,10 @@
namespace App\Http\Controllers\Fo;
use App\Http\Controllers\Controller;
use App\Http\Requests\Fo\Ajax\GetDistributionRequest;
use App\Http\Requests\Fo\SearchPoultryTraceaRequest;
use App\Models\TraceaPoultry;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Session;
@ -68,19 +70,34 @@ class TraceaPoultryController extends Controller
\redirect()->route('poultry.search')->throwResponse();
}
$distributionPicture = $this->getDistributionPicture($traceaPoultry->sign);
// ! Test that food and mep are available
if (!$traceaPoultry->mep or !$traceaPoultry->food) {
return \view('front.poultry.unavailable');
}
return view('front.poultry.show', compact(
'traceaPoultry',
'distributionPicture'
'traceaPoultry'
));
}
/**
* Get Distribution Info
*
* @param \App\Http\Requests\Fo\Ajax\GetDistributionRequest $request
* @return \Illuminate\Http\JsonResponse
*/
public function getDistribution(GetDistributionRequest $request): JsonResponse
{
/** @var \App\Models\TraceaPoultry */
$traceaPoultry = TraceaPoultry::where('order_num', $request->ordernum)
->where('external_code_lot', $request->codelot)->firstOrFail();
return \response()->json([
'exp_date' => $traceaPoultry->exp_date,
'sign' => $traceaPoultry->sign,
'picture' => $this->getDistributionPicture($traceaPoultry->sign)
]);
}
/**
* Get distribution sign picture name if exists.
*

View file

@ -0,0 +1,31 @@
<?php
namespace App\Http\Requests\Fo\Ajax;
use Illuminate\Foundation\Http\FormRequest;
class GetDistributionRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return boolean
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'codelot' => 'required|numeric|digits:10',
'ordernum' => 'required|numeric|digits:6',
];
}
}

View file

@ -7,8 +7,8 @@ require('./alert');
import IMask from 'imask'
document.addEventListener('DOMContentLoaded', () => {
let maskInputs = document.getElementsByClassName('inputMask')
for (let maskInput of maskInputs) {
const maskInputs = document.getElementsByClassName('inputMask')
for (const maskInput of maskInputs) {
if (maskInput.dataset.mask) {
maskInput.imask = IMask(maskInput, {
mask: maskInput.dataset.mask.indexOf('|') !== -1 ?

View file

@ -1,12 +1,16 @@
import Glider from '@lighting-beetle/glider-js'
import axios from 'axios'
document.addEventListener('DOMContentLoaded', () => {
let labelSlider = document.querySelector('.container.poultryShow .glider-container.labels > .glider'),
const labelSlider = document.querySelector('.container.poultryShow .glider-container.labels > .glider'),
linksSlider = document.querySelector('.container.poultryShow .glider-container.links > .glider'),
orderNum = document.getElementById('order_num'),
orderVal = document.getElementById('order_val'),
orderInvalid = document.getElementById('order_num_invalid'),
orderExp = document.getElementById('order_exp')
orderExp = document.getElementById('order_exp'),
distriSign = document.getElementById('distriSign'),
distriPicture = document.getElementById('distriPicture'),
distriDate = document.getElementById('distriDate');
if (labelSlider) {
new Glider(labelSlider, {
slidesToShow: 1,
@ -43,7 +47,8 @@ document.addEventListener('DOMContentLoaded', () => {
]
})
}
if (orderNum && orderVal && orderExp && orderInvalid) {
// * Distribution
if (orderNum && orderVal && orderExp && orderInvalid && distriPicture && distriDate) {
orderVal.addEventListener('click', (e) => {
e.preventDefault()
@ -57,17 +62,32 @@ document.addEventListener('DOMContentLoaded', () => {
behavior: "smooth"
})
}
if (orderNum.imask.value.slice(0, -5) !== orderNum.dataset.orderNumber) {
orderInvalid.classList.add('d-block')
orderExp.classList.add('d-none')
orderNum.imask.masked.reset()
scrollToIdWithOffset('order_num_invalid', 50)
return;
}
orderInvalid.classList.remove('d-block')
orderExp.classList.remove('d-none')
orderNum.imask.masked.reset()
scrollToIdWithOffset(orderExp.id, 50)
axios.get(
`/tracabilite/volaille/distribution?codelot=${orderNum.dataset.codeLot}&ordernum=${orderNum.imask.value.slice(0, -5)}`
).then((response) => {
const date = new Date(response.data.exp_date);
distriDate.textContent = new Intl.DateTimeFormat('fr-FR', { dateStyle: 'full'}).format(date);
distriSign.querySelector('span').textContent = response.data.sign;
if (response.data.picture) {
distriPicture.querySelector('img').classList.remove('d-none');
distriPicture.querySelector('img').src = `/assets/images/signs/${response.data.picture}`;
} else {
distriPicture.querySelector('img').classList.add('d-none');
}
orderInvalid.classList.remove('d-block');
orderExp.classList.remove('d-none');
orderNum.imask.masked.reset();
scrollToIdWithOffset(orderExp.id, 50);
}).catch((e) => {
orderInvalid.classList.add('d-block');
orderExp.classList.add('d-none');
orderNum.imask.masked.reset();
scrollToIdWithOffset('order_num_invalid', 50);
});
})
} else {
throw new Error('Missing Dom elements');
}
})

View file

@ -21,7 +21,12 @@
<div class="col text-center">
<div class="d-flex flex-column">
<div class="text-center">
<input id="order_num" name="order_num" type="text" class="commandInput inputMask" pattern="^[0-9]{6}\/[0-9]{3}[A-Z]$" data-mask="000000/000a" length="10" placeholder="{{ __('123456/123A') }}" title="{{ __('Saisissez le numéro de commande tel qu\'indiqué sur l\'image ci-dessous') }}" data-order-number="{{ str_pad($traceaPoultry->order_num, 6, '0', STR_PAD_LEFT) }}">
<input
id="order_num" name="order_num" type="text"
class="commandInput inputMask" pattern="^[0-9]{6}\/[0-9]{3}[A-Z]$"
data-mask="000000/000a" length="10" placeholder="{{ __('123456/123A') }}"
title="{{ __('Saisissez le numéro de commande tel qu\'indiqué sur l\'image ci-dessous') }}"
data-code-lot="{{ $traceaPoultry->external_code_lot }}">
@include('back.modules.input-error', ['inputName' => 'order_num'])
<div id="order_num_invalid" class="invalid-feedback">{{ __('Numéro de commande invalide') }}</div>
</div>
@ -51,16 +56,14 @@
<span class="h5 fw-bold text-light">{{ __('Date') }}</span>
</div>
<div class="text-center mt-1">
<span class="fw-bold textDistriResult text-uppercase">{{ $date }}</span>
<span id="distriDate" class="fw-bold textDistriResult text-uppercase">{{ $date }}</span>
</div>
@if($distributionPicture)
<div class="text-center mt-3">
<span class="h5 fw-bold text-light">{{ $sign }}</span>
<div id="distriSign" class="text-center mt-3">
<span class="h5 fw-bold text-light"></span>
</div>
<div class="text-center mt-1">
<img class="img-fluid signPicture" src="{{ asset("assets/images/signs/$distributionPicture") }}" alt="{{ $sign }}">
<div id="distriPicture" class="text-center mt-1">
<img class="img-fluid signPicture" src="">
</div>
@endif
</div>
</div>
</div>

View file

@ -153,7 +153,6 @@ nous avions dit que nous fonctionnions comme cela lors d'une réunion en décemb
</div>
<div class="container-fluid g-2 poultryShow subpart">
@include('front.poultry.parts.distribution', [
'distributionPicture' => $distributionPicture,
'sign' => $traceaPoultry->sign,
'date' => sprintf('%s %s', $traceaPoultry->exp_date->formatLocalized('%A'), $traceaPoultry->exp_date->format('d/m/Y'))
])

View file

@ -22,6 +22,8 @@ Route::name('poultry.')->group(function () {
Route::view('/', 'front.poultry.search')->name('search');
Route::post('/', [TraceaPoultryController::class, 'searchSubmit'])->name('searchSubmit');
Route::get('tracabilite/volaille', [TraceaPoultryController::class, 'show'])->name('show');
Route::get('tracabilite/volaille/distribution', [TraceaPoultryController::class, 'getDistribution'])
->name('distribution');
Route::get('tracabilite/volaille/info', [InfoController::class, 'poultry'])->name('infos');
Route::get(
'tracabilite/volaille/info/des-poulets-libres-par-nature',