Fix sort by hub issue for rider list + add hub selection to outlets
This commit is contained in:
parent
161778cfef
commit
d86b9f33a0
7 changed files with 136 additions and 42 deletions
|
|
@ -4,6 +4,7 @@ namespace App\Controller;
|
|||
|
||||
use App\Ramcar\BaseController;
|
||||
use App\Entity\Outlet;
|
||||
use App\Entity\Hub;
|
||||
|
||||
use Doctrine\ORM\Query;
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
|
|
@ -39,8 +40,12 @@ class OutletController extends BaseController
|
|||
$datatable = $req->request->get('datatable');
|
||||
|
||||
// count total records
|
||||
$tquery = $qb->select('COUNT(q)');
|
||||
$tquery = $qb->select('COUNT(q)')
|
||||
->leftJoin('q.hub', 'hub');
|
||||
|
||||
// add filters to count query
|
||||
$this->setQueryFilters($datatable, $tquery);
|
||||
|
||||
$total = $tquery->getQuery()
|
||||
->getSingleScalarResult();
|
||||
|
||||
|
|
@ -61,13 +66,20 @@ class OutletController extends BaseController
|
|||
];
|
||||
|
||||
// build query
|
||||
$query = $qb->select('q');
|
||||
$query = $qb->select('q')
|
||||
->addSelect('hub.name as hub_name');
|
||||
|
||||
$this->setQueryFilters($datatable, $query);
|
||||
|
||||
// check if sorting is present, otherwise use default
|
||||
if (isset($datatable['sort']['field']) && !empty($datatable['sort']['field'])) {
|
||||
$prefix = '';
|
||||
|
||||
if (!in_array($datatable['sort']['field'], ['hub_name']))
|
||||
$prefix = 'q.';
|
||||
|
||||
$order = $datatable['sort']['sort'] ?? 'asc';
|
||||
$query->orderBy('q.' . $datatable['sort']['field'], $order);
|
||||
$query->orderBy($prefix . $datatable['sort']['field'], $order);
|
||||
} else {
|
||||
$query->orderBy('q.id', 'asc');
|
||||
}
|
||||
|
|
@ -82,12 +94,13 @@ class OutletController extends BaseController
|
|||
$rows = [];
|
||||
foreach ($obj_rows as $orow) {
|
||||
// add row data
|
||||
$row['id'] = $orow->getID();
|
||||
$row['name'] = $orow->getName();
|
||||
$row['address'] = $orow->getAddress();
|
||||
$row['contact_nums'] = $orow->getContactNumbers();
|
||||
$row['time_open'] = $orow->getTimeOpen()->format('g:i A');
|
||||
$row['time_close'] = $orow->getTimeClose()->format('g:i A');
|
||||
$row['id'] = $orow[0]->getID();
|
||||
$row['name'] = $orow[0]->getName();
|
||||
$row['address'] = $orow[0]->getAddress();
|
||||
$row['contact_nums'] = $orow[0]->getContactNumbers();
|
||||
$row['time_open'] = $orow[0]->getTimeOpen()->format('g:i A');
|
||||
$row['time_close'] = $orow[0]->getTimeClose()->format('g:i A');
|
||||
$row['hub_name'] = $orow['hub_name'];
|
||||
|
||||
// add row metadata
|
||||
$row['meta'] = [
|
||||
|
|
@ -119,6 +132,11 @@ class OutletController extends BaseController
|
|||
$params['obj'] = new Outlet();
|
||||
$params['mode'] = 'create';
|
||||
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
|
||||
// get parent associations
|
||||
$params['hubs'] = $em->getRepository(Hub::class)->findAll();
|
||||
|
||||
// response
|
||||
return $this->render('outlet/form.html.twig', $params);
|
||||
}
|
||||
|
|
@ -145,7 +163,8 @@ class OutletController extends BaseController
|
|||
protected function setQueryFilters($datatable, QueryBuilder $query)
|
||||
{
|
||||
if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) {
|
||||
$query->where('q.name LIKE :filter')
|
||||
$query->where('hub.name LIKE :filter')
|
||||
->orWhere('q.name LIKE :filter')
|
||||
->orWhere('q.address LIKE :filter')
|
||||
->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%');
|
||||
}
|
||||
|
|
@ -155,8 +174,6 @@ class OutletController extends BaseController
|
|||
{
|
||||
$this->denyAccessUnlessGranted('outlet.add', null, 'No access.');
|
||||
|
||||
error_log($req->request->get('time_open'));
|
||||
|
||||
// create new object
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
$obj = new Outlet();
|
||||
|
|
@ -164,6 +181,19 @@ class OutletController extends BaseController
|
|||
// initialize error list
|
||||
$error_array = [];
|
||||
|
||||
// custom validation for associations
|
||||
$hub_id = $req->request->get('hub');
|
||||
|
||||
if ($hub_id) {
|
||||
$hub = $em->getRepository(Hub::class)
|
||||
->find($hub_id);
|
||||
|
||||
if (empty($hub))
|
||||
$error_array['hub'] = 'Invalid hub selected.';
|
||||
else
|
||||
$obj->setHub($hub);
|
||||
}
|
||||
|
||||
// check if lat and lng are provided
|
||||
if (empty($req->request->get('coord_lng')) || empty($req->request->get('coord_lat')))
|
||||
{
|
||||
|
|
@ -185,7 +215,6 @@ class OutletController extends BaseController
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// check if any errors were found
|
||||
if (!empty($error_array))
|
||||
{
|
||||
|
|
@ -220,6 +249,11 @@ class OutletController extends BaseController
|
|||
if (empty($obj))
|
||||
throw $this->createNotFoundException('The item does not exist');
|
||||
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
|
||||
// get parent associations
|
||||
$params['hubs'] = $em->getRepository(Hub::class)->findAll();
|
||||
|
||||
$params['obj'] = $obj;
|
||||
$params['mode'] = 'update';
|
||||
|
||||
|
|
@ -247,6 +281,21 @@ class OutletController extends BaseController
|
|||
// initialize error list
|
||||
$error_array = [];
|
||||
|
||||
// custom validation for associations
|
||||
$hub_id = $req->request->get('hub');
|
||||
|
||||
if ($hub_id) {
|
||||
$hub = $em->getRepository(Hub::class)
|
||||
->find($hub_id);
|
||||
|
||||
if (empty($hub))
|
||||
$error_array['hub'] = 'Invalid hub selected.';
|
||||
else
|
||||
$obj->setHub($hub);
|
||||
} else {
|
||||
$obj->clearHub();
|
||||
}
|
||||
|
||||
// add errors to list
|
||||
foreach ($errors as $error) {
|
||||
$error_array[$error->getPropertyPath()] = $error->getMessage();
|
||||
|
|
|
|||
|
|
@ -71,8 +71,13 @@ class RiderController extends BaseController
|
|||
|
||||
// check if sorting is present, otherwise use default
|
||||
if (isset($datatable['sort']['field']) && !empty($datatable['sort']['field'])) {
|
||||
$prefix = '';
|
||||
|
||||
if (!in_array($datatable['sort']['field'], ['hub_name']))
|
||||
$prefix = 'q.';
|
||||
|
||||
$order = $datatable['sort']['sort'] ?? 'asc';
|
||||
$query->orderBy('q.' . $datatable['sort']['field'], $order);
|
||||
$query->orderBy($prefix . $datatable['sort']['field'], $order);
|
||||
} else {
|
||||
$query->orderBy('q.id', 'asc');
|
||||
}
|
||||
|
|
@ -82,7 +87,6 @@ class RiderController extends BaseController
|
|||
->setMaxResults($perpage)
|
||||
->getQuery()
|
||||
->getResult();
|
||||
// Query::HYDRATE_ARRAY);
|
||||
|
||||
// process rows
|
||||
$rows = [];
|
||||
|
|
@ -94,7 +98,7 @@ class RiderController extends BaseController
|
|||
$row['last_name'] = $orow[0]->getLastName();
|
||||
$row['plate_number'] = $orow[0]->getPlateNumber();
|
||||
$row['contact_num'] = $orow[0]->getContactNumber();
|
||||
$row['hub'] = $orow['hub_name'];
|
||||
$row['hub_name'] = $orow['hub_name'];
|
||||
|
||||
// add row metadata
|
||||
$row['meta'] = [
|
||||
|
|
@ -327,6 +331,7 @@ class RiderController extends BaseController
|
|||
->orWhere('q.first_name LIKE :filter')
|
||||
->orWhere('q.last_name LIKE :filter')
|
||||
->orWhere('q.contact_num LIKE :filter')
|
||||
->orWhere('q.plate_number LIKE :filter')
|
||||
->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -67,6 +67,12 @@ class Hub
|
|||
*/
|
||||
protected $riders;
|
||||
|
||||
// outlets under this hub
|
||||
/**
|
||||
* @ORM\OneToMany(targetEntity="Outlet", mappedBy="hub")
|
||||
*/
|
||||
protected $outlets;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->riders = new ArrayCollection();
|
||||
|
|
@ -150,4 +156,9 @@ class Hub
|
|||
{
|
||||
return $this->riders;
|
||||
}
|
||||
|
||||
public function getOutlets()
|
||||
{
|
||||
return $this->outlets;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -71,7 +71,11 @@ class Outlet
|
|||
*/
|
||||
protected $job_orders;
|
||||
|
||||
|
||||
/**
|
||||
* @ORM\ManyToOne(targetEntity="Hub", inversedBy="outlets")
|
||||
* @ORM\JoinColumn(name="hub_id", referencedColumnName="id")
|
||||
*/
|
||||
protected $hub;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
|
|
@ -150,4 +154,21 @@ class Outlet
|
|||
{
|
||||
return $this->time_close;
|
||||
}
|
||||
|
||||
public function setHub(Hub $hub)
|
||||
{
|
||||
$this->hub = $hub;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getHub()
|
||||
{
|
||||
return $this->hub;
|
||||
}
|
||||
|
||||
public function clearHub()
|
||||
{
|
||||
$this->hub = null;
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,35 +36,24 @@
|
|||
|
||||
<div class="m-portlet__body">
|
||||
<div class="form-group m-form__group row no-border">
|
||||
<div class="col-lg-8">
|
||||
<div class="col-lg-3">
|
||||
<label for="name" data-field="name">
|
||||
Name
|
||||
</label>
|
||||
<input type="text" name="name" class="form-control m-input" value="{{ obj.getName() }}">
|
||||
<div class="form-control-feedback hide" data-field="name"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group m-form__group row no-border">
|
||||
<div class="col-lg-8">
|
||||
<label for="address" data-field="address">
|
||||
Address
|
||||
</label>
|
||||
<textarea class="form-control m-input" id="address" rows="3" name="address">{{ obj.getAddress }}</textarea>
|
||||
<div class="form-control-feedback hide" data-field="address"></div>
|
||||
<div class="col-lg-3">
|
||||
<label data-field="hub">Hub:</label>
|
||||
<select class="form-control m-input" id="hub" name="hub">
|
||||
<option value=""></option>
|
||||
{% for hub in hubs %}
|
||||
<option value="{{ hub.getID() }}"{{ obj.getHub() and hub.getID() == obj.getHub().getID() ? ' selected' }}>{{ hub.getName() }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<div class="form-control-feedback hide" data-field="hub"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group m-form__group row">
|
||||
<div class="col-lg-8">
|
||||
<label for="contact_nums" data-field="contact_nums">
|
||||
Contact Numbers
|
||||
</label>
|
||||
<textarea class="form-control m-input" id="contact_nums" rows="3" name="contact_nums">{{ obj.getContactNumbers }}</textarea>
|
||||
<div class="form-control-feedback hide" data-field="contact_nums"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group m-form__group row">
|
||||
<div class="col-lg-4">
|
||||
<div class="col-lg-3">
|
||||
<label for="time_open">
|
||||
Time Open
|
||||
</label>
|
||||
|
|
@ -76,7 +65,7 @@
|
|||
</div>
|
||||
<div class="form-control-feedback hide" data-field="time_open"></div>
|
||||
</div>
|
||||
<div class="col-lg-4">
|
||||
<div class="col-lg-3">
|
||||
<label for="time_close">
|
||||
Time Close
|
||||
</label>
|
||||
|
|
@ -89,7 +78,22 @@
|
|||
<div class="form-control-feedback hide" data-field="time_close"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group m-form__group row no-border">
|
||||
<div class="col-lg-6">
|
||||
<label for="address" data-field="address">
|
||||
Address
|
||||
</label>
|
||||
<textarea class="form-control m-input" id="address" rows="4" name="address">{{ obj.getAddress }}</textarea>
|
||||
<div class="form-control-feedback hide" data-field="address"></div>
|
||||
</div>
|
||||
<div class="col-lg-6">
|
||||
<label for="contact_nums" data-field="contact_nums">
|
||||
Contact Numbers
|
||||
</label>
|
||||
<textarea class="form-control m-input" id="contact_nums" rows="4" name="contact_nums">{{ obj.getContactNumbers }}</textarea>
|
||||
<div class="form-control-feedback hide" data-field="contact_nums"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group m-form__group row">
|
||||
<div class="col-lg-12">
|
||||
<label data-field="coordinates">
|
||||
|
|
|
|||
|
|
@ -92,6 +92,10 @@
|
|||
field: 'contact_nums',
|
||||
title: 'Contact Numbers'
|
||||
},
|
||||
{
|
||||
field: 'hub_name',
|
||||
title: 'Hub'
|
||||
},
|
||||
{
|
||||
field: 'time_open',
|
||||
title: 'Time Open'
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@
|
|||
title: 'Plate Number'
|
||||
},
|
||||
{
|
||||
field: 'hub',
|
||||
field: 'hub_name',
|
||||
title: 'Hub'
|
||||
},
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue