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