Add crud and validation for battery entity
This commit is contained in:
parent
3107e0d3e9
commit
e8d978dae4
13 changed files with 553 additions and 104 deletions
|
|
@ -289,6 +289,11 @@ vmfg_create_submit:
|
|||
controller: App\Controller\VehicleManufacturerController::createSubmit
|
||||
methods: [POST]
|
||||
|
||||
vmfg_vehicles:
|
||||
path: /vehicle-manufacturers/vehicles
|
||||
controller: App\Controller\VehicleManufacturerController::getVehicles
|
||||
methods: [POST]
|
||||
|
||||
vmfg_update:
|
||||
path: /vehicle-manufacturers/{id}
|
||||
controller: App\Controller\VehicleManufacturerController::update
|
||||
|
|
|
|||
|
|
@ -26,4 +26,14 @@ label.has-danger,
|
|||
|
||||
.flex-row > * + * {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.form-group-inner {
|
||||
padding-left: 0 !important;
|
||||
padding-right: 0 !important;
|
||||
}
|
||||
|
||||
.normal-font {
|
||||
font-size: inherit !important;
|
||||
font-weight: inherit !important;
|
||||
}
|
||||
|
|
@ -84,9 +84,9 @@ class BatteryController extends BaseController
|
|||
|
||||
// check if filter is present
|
||||
if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) {
|
||||
$query->where('mfg_name LIKE :filter')
|
||||
->orWhere('model_name LIKE :filter')
|
||||
->orWhere('size_name LIKE :filter')
|
||||
$query->where('mfg.name LIKE :filter')
|
||||
->orWhere('model.name LIKE :filter')
|
||||
->orWhere('size.name LIKE :filter')
|
||||
->orWhere('q.prod_code LIKE :filter')
|
||||
->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%');
|
||||
}
|
||||
|
|
@ -114,18 +114,19 @@ class BatteryController extends BaseController
|
|||
$rows = [];
|
||||
foreach ($obj_rows as $orow) {
|
||||
// add row data
|
||||
$row['mfg_name'] = $orow->getManufacturer()->getName();
|
||||
$row['model_name'] = $orow->getModel()->getName();
|
||||
$row['size_name'] = $orow->getSize()->getName();
|
||||
$row['prod_code'] = $orow->getProductCode();
|
||||
$row['sell_price'] = $orow->getSellingPrice();
|
||||
$row['warr_personal'] = $orow->getWarrantyPersonal();
|
||||
$row['warr_commercial'] = $orow->getWarrantyCommercial();
|
||||
$row['res_capacity'] = $orow->getReserveCapacity();
|
||||
$row['length'] = $orow->getLength();
|
||||
$row['width'] = $orow->getWidth();
|
||||
$row['height'] = $orow->getHeight();
|
||||
$row['total_height'] = $orow->getTotalHeight();
|
||||
$row['id'] = $orow[0]->getID();
|
||||
$row['mfg_name'] = $orow['mfg_name'];
|
||||
$row['model_name'] = $orow['model_name'];
|
||||
$row['size_name'] = $orow['size_name'];
|
||||
$row['prod_code'] = $orow[0]->getProductCode();
|
||||
$row['sell_price'] = $orow[0]->getSellingPrice();
|
||||
$row['warr_personal'] = $orow[0]->getWarrantyPersonal();
|
||||
$row['warr_commercial'] = $orow[0]->getWarrantyCommercial();
|
||||
$row['res_capacity'] = $orow[0]->getReserveCapacity();
|
||||
$row['length'] = $orow[0]->getLength();
|
||||
$row['width'] = $orow[0]->getWidth();
|
||||
$row['height'] = $orow[0]->getHeight();
|
||||
$row['total_height'] = $orow[0]->getTotalHeight();
|
||||
|
||||
// add row metadata
|
||||
$row['meta'] = [
|
||||
|
|
@ -176,22 +177,62 @@ class BatteryController extends BaseController
|
|||
$row = new Battery();
|
||||
|
||||
// set and save values
|
||||
$row->setID($req->request->get('id'))
|
||||
->setName($req->request->get('name'));
|
||||
$row->setProductCode($req->request->get('prod_code'))
|
||||
->setWarrantyPersonal($req->request->get('warr_personal'))
|
||||
->setWarrantyCommercial($req->request->get('warr_commercial'))
|
||||
->setReserveCapacity($req->request->get('res_capacity'))
|
||||
->setLength($req->request->get('length'))
|
||||
->setWidth($req->request->get('width'))
|
||||
->setHeight($req->request->get('height'))
|
||||
->setTotalHeight($req->request->get('total_height'))
|
||||
->setSellingPrice($req->request->get('sell_price'));
|
||||
|
||||
// acl attributes
|
||||
$acl_attribs = $req->request->get('acl');
|
||||
foreach ($acl_attribs as $acl_key)
|
||||
{
|
||||
$row->addACLAccess($acl_key);
|
||||
// initialize error list
|
||||
$error_array = [];
|
||||
|
||||
// custom validation for battery manufacturer
|
||||
$manufacturer = $em->getRepository(BatteryManufacturer::class)
|
||||
->find($req->request->get('manufacturer'));
|
||||
|
||||
if (empty($manufacturer))
|
||||
$error_array['manufacturer'] = 'Invalid manufacturer selected.';
|
||||
else
|
||||
$row->setManufacturer($manufacturer);
|
||||
|
||||
// custom validation for battery model
|
||||
$model = $em->getRepository(BatteryModel::class)
|
||||
->find($req->request->get('model'));
|
||||
|
||||
if (empty($model))
|
||||
$error_array['model'] = 'Invalid model selected.';
|
||||
else
|
||||
$row->setModel($model);
|
||||
|
||||
// custom validation for battery size
|
||||
$size = $em->getRepository(BatterySize::class)
|
||||
->find($req->request->get('size'));
|
||||
|
||||
if (empty($size))
|
||||
$error_array['size'] = 'Invalid size selected.';
|
||||
else
|
||||
$row->setSize($size);
|
||||
|
||||
// custom validation for vehicles
|
||||
$vehicles = $req->request->get('vehicles');
|
||||
|
||||
if (!empty($vehicles)) {
|
||||
foreach ($vehicles as $vehicle_id) {
|
||||
$vehicle = $em->getRepository(Vehicle::class)->find($vehicle_id);
|
||||
|
||||
if (!empty($vehicle)) {
|
||||
$row->addVehicle($vehicle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// validate
|
||||
$errors = $validator->validate($row);
|
||||
|
||||
// initialize error list
|
||||
$error_array = [];
|
||||
|
||||
// add errors to list
|
||||
foreach ($errors as $error) {
|
||||
$error_array[$error->getPropertyPath()] = $error->getMessage();
|
||||
|
|
@ -224,7 +265,7 @@ class BatteryController extends BaseController
|
|||
|
||||
// get row data
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
$row = $em->getRepository(Role::class)->find($id);
|
||||
$row = $em->getRepository(Battery::class)->find($id);
|
||||
|
||||
// make sure this row exists
|
||||
if (empty($row))
|
||||
|
|
@ -248,36 +289,70 @@ class BatteryController extends BaseController
|
|||
|
||||
// get row data
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
$row = $em->getRepository(Role::class)->find($id);
|
||||
$row = $em->getRepository(Battery::class)->find($id);
|
||||
|
||||
// make sure this row exists
|
||||
if (empty($row))
|
||||
throw $this->createNotFoundException('The item does not exist');
|
||||
|
||||
// set and save values
|
||||
$row->setID($req->request->get('id'))
|
||||
->setName($req->request->get('name'));
|
||||
$row->setProductCode($req->request->get('prod_code'))
|
||||
->setWarrantyPersonal($req->request->get('warr_personal'))
|
||||
->setWarrantyCommercial($req->request->get('warr_commercial'))
|
||||
->setReserveCapacity($req->request->get('res_capacity'))
|
||||
->setLength($req->request->get('length'))
|
||||
->setWidth($req->request->get('width'))
|
||||
->setHeight($req->request->get('height'))
|
||||
->setTotalHeight($req->request->get('total_height'))
|
||||
->setSellingPrice($req->request->get('sell_price'))
|
||||
->clearVehicles();
|
||||
|
||||
// don't update acl attributes for super user since they don't need it
|
||||
if (!$row->isSuperAdmin())
|
||||
{
|
||||
// clear first
|
||||
$row->clearACLAttributes();
|
||||
// initialize error list
|
||||
$error_array = [];
|
||||
|
||||
// then add
|
||||
$acl_attribs = $req->request->get('acl');
|
||||
foreach ($acl_attribs as $acl_key)
|
||||
{
|
||||
$row->addACLAccess($acl_key);
|
||||
// custom validation for battery manufacturer
|
||||
$manufacturer = $em->getRepository(BatteryManufacturer::class)
|
||||
->find($req->request->get('manufacturer'));
|
||||
|
||||
if (empty($manufacturer))
|
||||
$error_array['manufacturer'] = 'Invalid manufacturer selected.';
|
||||
else
|
||||
$row->setManufacturer($manufacturer);
|
||||
|
||||
// custom validation for battery model
|
||||
$model = $em->getRepository(BatteryModel::class)
|
||||
->find($req->request->get('model'));
|
||||
|
||||
if (empty($model))
|
||||
$error_array['model'] = 'Invalid model selected.';
|
||||
else
|
||||
$row->setModel($model);
|
||||
|
||||
// custom validation for battery size
|
||||
$size = $em->getRepository(BatterySize::class)
|
||||
->find($req->request->get('size'));
|
||||
|
||||
if (empty($size))
|
||||
$error_array['size'] = 'Invalid size selected.';
|
||||
else
|
||||
$row->setSize($size);
|
||||
|
||||
// custom validation for vehicles
|
||||
$vehicles = $req->request->get('vehicles');
|
||||
|
||||
if (!empty($vehicles)) {
|
||||
foreach ($vehicles as $vehicle_id) {
|
||||
$vehicle = $em->getRepository(Vehicle::class)->find($vehicle_id);
|
||||
|
||||
if (!empty($vehicle)) {
|
||||
$row->addVehicle($vehicle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// validate
|
||||
$errors = $validator->validate($row);
|
||||
|
||||
// initialize error list
|
||||
$error_array = [];
|
||||
|
||||
// add errors to list
|
||||
foreach ($errors as $error) {
|
||||
$error_array[$error->getPropertyPath()] = $error->getMessage();
|
||||
|
|
@ -309,7 +384,7 @@ class BatteryController extends BaseController
|
|||
|
||||
// get row data
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
$row = $em->getRepository(Role::class)->find($id);
|
||||
$row = $em->getRepository(Battery::class)->find($id);
|
||||
|
||||
if (empty($row))
|
||||
throw $this->createNotFoundException('The item does not exist');
|
||||
|
|
|
|||
|
|
@ -160,9 +160,9 @@ class VehicleController extends BaseController
|
|||
$row = new Vehicle();
|
||||
|
||||
// set and save values
|
||||
$row->setMake($req->request->get('make'));
|
||||
$row->setModelYearFrom($req->request->get('model_year_from'));
|
||||
$row->setModelYearTo($req->request->get('model_year_to'));
|
||||
$row->setMake($req->request->get('make'))
|
||||
->setModelYearFrom($req->request->get('model_year_from'))
|
||||
->setModelYearTo($req->request->get('model_year_to'));
|
||||
|
||||
// initialize error list
|
||||
$error_array = [];
|
||||
|
|
@ -173,16 +173,15 @@ class VehicleController extends BaseController
|
|||
|
||||
if (empty($manufacturer))
|
||||
$error_array['manufacturer'] = 'Invalid manufacturer selected.';
|
||||
else {
|
||||
else
|
||||
$row->setManufacturer($manufacturer);
|
||||
|
||||
// validate
|
||||
$errors = $validator->validate($row);
|
||||
// validate
|
||||
$errors = $validator->validate($row);
|
||||
|
||||
// add errors to list
|
||||
foreach ($errors as $error) {
|
||||
$error_array[$error->getPropertyPath()] = $error->getMessage();
|
||||
}
|
||||
// add errors to list
|
||||
foreach ($errors as $error) {
|
||||
$error_array[$error->getPropertyPath()] = $error->getMessage();
|
||||
}
|
||||
|
||||
// check if any errors were found
|
||||
|
|
@ -241,9 +240,9 @@ class VehicleController extends BaseController
|
|||
throw $this->createNotFoundException('The item does not exist');
|
||||
|
||||
// set and save values
|
||||
$row->setMake($req->request->get('make'));
|
||||
$row->setModelYearFrom($req->request->get('model_year_from'));
|
||||
$row->setModelYearTo($req->request->get('model_year_to'));
|
||||
$row->setMake($req->request->get('make'))
|
||||
->setModelYearFrom($req->request->get('model_year_from'))
|
||||
->setModelYearTo($req->request->get('model_year_to'));
|
||||
|
||||
// validate
|
||||
$errors = $validator->validate($row);
|
||||
|
|
|
|||
|
|
@ -257,7 +257,7 @@ class VehicleManufacturerController extends BaseController
|
|||
$response->send();
|
||||
}
|
||||
|
||||
public function getVehicles(Request $req, $id)
|
||||
public function getVehicles(Request $req)
|
||||
{
|
||||
if (!$this->isGranted('battery.add') && !$this->isGranted('battery.update')) {
|
||||
$exception = $this->createAccessDeniedException('No access.');
|
||||
|
|
@ -266,12 +266,27 @@ class VehicleManufacturerController extends BaseController
|
|||
|
||||
// get row data
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
$row = $em->getRepository(VehicleManufacturer::class)->find($id);
|
||||
$row = $em->getRepository(VehicleManufacturer::class)->find($req->request->get('id'));
|
||||
|
||||
if (empty($row))
|
||||
throw $this->createNotFoundException('The item does not exist');
|
||||
|
||||
// get vehicles
|
||||
return $row->getVehicles();
|
||||
// build vehicles array
|
||||
$vehicles = [];
|
||||
|
||||
foreach ($row->getVehicles() as $vehicle) {
|
||||
$vehicles[] = [
|
||||
'id' => $vehicle->getID(),
|
||||
'mfg_name' => $vehicle->getManufacturer()->getName(),
|
||||
'make' => $vehicle->getMake(),
|
||||
'model_year_from' => $vehicle->getModelYearFrom(),
|
||||
'model_year_to' => $vehicle->getModelYearTo()
|
||||
];
|
||||
}
|
||||
|
||||
// response
|
||||
return $this->json([
|
||||
'data' => $vehicles
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,10 +5,12 @@ namespace App\Entity;
|
|||
use Doctrine\ORM\Mapping as ORM;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Symfony\Component\Validator\Constraints as Assert;
|
||||
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
|
||||
|
||||
/**
|
||||
* @ORM\Entity
|
||||
* @ORM\Table(name="battery")
|
||||
* @UniqueEntity("prod_code")
|
||||
*/
|
||||
class Battery
|
||||
{
|
||||
|
|
@ -59,60 +61,69 @@ class Battery
|
|||
|
||||
// product code
|
||||
/**
|
||||
* @ORM\Column(type="string", length=80)
|
||||
* @ORM\Column(type="string", length=80, unique=true)
|
||||
* @Assert\NotBlank()
|
||||
*/
|
||||
protected $prod_code;
|
||||
|
||||
// warranty personal
|
||||
/**
|
||||
* @ORM\Column(type="smallint")
|
||||
* @Assert\NotBlank()
|
||||
*/
|
||||
protected $warr_personal;
|
||||
|
||||
// warranty commercial
|
||||
/**
|
||||
* @ORM\Column(type="smallint")
|
||||
* @Assert\NotBlank()
|
||||
*/
|
||||
protected $warr_commercial;
|
||||
|
||||
// reserve capacity
|
||||
/**
|
||||
* @ORM\Column(type="smallint")
|
||||
* @Assert\NotBlank()
|
||||
*/
|
||||
protected $res_capacity;
|
||||
|
||||
// length
|
||||
/**
|
||||
* @ORM\Column(type="smallint")
|
||||
* @Assert\NotBlank()
|
||||
*/
|
||||
protected $length;
|
||||
|
||||
// width
|
||||
/**
|
||||
* @ORM\Column(type="smallint")
|
||||
* @Assert\NotBlank()
|
||||
*/
|
||||
protected $width;
|
||||
|
||||
// height
|
||||
/**
|
||||
* @ORM\Column(type="smallint")
|
||||
* @Assert\NotBlank()
|
||||
*/
|
||||
protected $height;
|
||||
|
||||
// total height
|
||||
/**
|
||||
* @ORM\Column(type="smallint")
|
||||
* @Assert\NotBlank()
|
||||
*/
|
||||
protected $total_height;
|
||||
|
||||
// selling price
|
||||
/**
|
||||
* @ORM\Column(type="decimal", precision=7, scale=2)
|
||||
* @ORM\Column(type="decimal", precision=7, scale=2, nullable=true)
|
||||
*/
|
||||
protected $sell_price;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->vehicles = new ArrayCollection();
|
||||
$this->cust_vehicles = new ArrayCollection();
|
||||
}
|
||||
|
||||
|
|
@ -154,15 +165,21 @@ class Battery
|
|||
return $this->size;
|
||||
}
|
||||
|
||||
public function setVehicle($vehicle)
|
||||
public function addVehicle(Vehicle $vehicle)
|
||||
{
|
||||
$this->vehicle = $vehicle;
|
||||
$this->vehicles->add($vehicle);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getVehicle()
|
||||
public function clearVehicles()
|
||||
{
|
||||
return $this->vehicle;
|
||||
$this->vehicles->clear();
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getVehicles()
|
||||
{
|
||||
return $this->vehicles;
|
||||
}
|
||||
|
||||
public function setProductCode($prod_code)
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ class BatteryManufacturer
|
|||
// has to return set of strings because symfony is trying to move away from role objects
|
||||
$str_batteries = [];
|
||||
foreach ($this->batteries as $battery)
|
||||
$str_batteries[] = $this->getName() . " " . $battery->getModel()->getName() . " " . $battery->getSize()->getName();
|
||||
$str_batteries[] = $this->getProductCode();
|
||||
|
||||
return $str_batteries;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ class BatteryModel
|
|||
// has to return set of strings because symfony is trying to move away from role objects
|
||||
$str_batteries = [];
|
||||
foreach ($this->batteries as $battery)
|
||||
$str_batteries[] = $battery->getManufacturer()->getName() . " " . $battery->getModel()->getName() . " " . $this->getName();
|
||||
$str_batteries[] = $this->getProductCode();
|
||||
|
||||
return $str_batteries;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ class BatterySize
|
|||
// has to return set of strings because symfony is trying to move away from role objects
|
||||
$str_batteries = [];
|
||||
foreach ($this->batteries as $battery)
|
||||
$str_batteries[] = $battery->getManufacturer()->getName() . " " . $battery->getModel()->getName() . " " . $this->getName();
|
||||
$str_batteries[] = $this->getProductCode();
|
||||
|
||||
return $str_batteries;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ class Vehicle
|
|||
// has to return set of strings because symfony is trying to move away from role objects
|
||||
$str_batteries = [];
|
||||
foreach ($this->batteries as $battery)
|
||||
$str_batteries[] = $battery->getManufacturer()->getName() . " " . $battery->getModel()->getName() . " " . $battery->getSize()->getName();
|
||||
$str_batteries[] = $this->getProductCode();
|
||||
|
||||
return $str_batteries;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,11 +68,6 @@ class VehicleManufacturer
|
|||
|
||||
public function getVehicles()
|
||||
{
|
||||
// has to return set of strings because symfony is trying to move away from role objects
|
||||
$str_vehicles = [];
|
||||
foreach ($this->vehicles as $vehicle)
|
||||
$str_vehicles[$vehicle->getID()] = $vehicle->getMake() . " " . $vehicle->getYearFrom() . "-" . $vehicle->getYearTo();
|
||||
|
||||
return $str_vehicles;
|
||||
return $this->vehicles;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,30 +32,194 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<form id="row-form" class="m-form m-form--fit m-form--label-align-right m-form--group-seperator-dashed" method="post" action="{{ row is defined ? url('role_update_submit', {'id': row.getId()}) : url('role_create_submit') }}">
|
||||
<form id="row-form" class="m-form m-form--fit m-form--label-align-right" method="post" action="{{ row is defined ? url('battery_update_submit', {'id': row.getId()}) : url('battery_create_submit') }}">
|
||||
<div class="m-portlet__body">
|
||||
<div class="form-group m-form__group row no-border">
|
||||
<label class="col-lg-1 col-form-label" data-field="manufacturer">
|
||||
Manufacturer:
|
||||
</label>
|
||||
<div class="col-lg-9">
|
||||
<select class="form-control m-input" id="manufacturer" name="manufacturer">
|
||||
<option value=""></option>
|
||||
{% for manufacturer in manufacturers %}
|
||||
<option value="{{ manufacturer.getID() }}"{{ row is defined and manufacturer.getID() == row.getManufacturer().getID() ? ' selected' }}>{{ manufacturer.getName() }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<div class="m-form__section m-form__section--first">
|
||||
<div class="m-form__heading">
|
||||
<h3 class="m-form__heading-title">
|
||||
Product Information
|
||||
</h3>
|
||||
</div>
|
||||
<label class="col-lg-1 col-form-label" data-field="model">
|
||||
Model:
|
||||
</label>
|
||||
<div class="col-lg-9">
|
||||
<select class="form-control m-input" id="model" name="model">
|
||||
<option value=""></option>
|
||||
{% for model in models %}
|
||||
<option value="{{ model.getID() }}"{{ row is defined and model.getID() == row.getModel().getID() ? ' selected' }}>{{ model.getName() }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<div class="form-group m-form__group row">
|
||||
<label class="col-lg-1 col-form-label" data-field="prod_code">
|
||||
Product Code:
|
||||
</label>
|
||||
<div class="col-lg-3">
|
||||
<input type="text" name="prod_code" class="form-control m-input" value="{{ row is defined ? row.getProductCode() }}">
|
||||
<div class="form-control-feedback hide" data-field="prod_code"></div>
|
||||
<span class="m-form__help">Unique identifier for this product</span>
|
||||
</div>
|
||||
<label class="col-lg-1 col-form-label" data-field="sell_price">
|
||||
Selling Price:
|
||||
</label>
|
||||
<div class="col-lg-3">
|
||||
<input type="text" name="sell_price" class="form-control m-input" value="{{ row is defined ? row.getSellingPrice() }}">
|
||||
<div class="form-control-feedback hide" data-field="sell_price"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group m-form__group row">
|
||||
<label class="col-lg-1 col-form-label" data-field="manufacturer">
|
||||
Manufacturer:
|
||||
</label>
|
||||
<div class="col-lg-3">
|
||||
<select class="form-control m-input" id="manufacturer" name="manufacturer">
|
||||
<option value=""></option>
|
||||
{% for manufacturer in bmfgs %}
|
||||
<option value="{{ manufacturer.getID() }}"{{ row is defined and manufacturer.getID() == row.getManufacturer().getID() ? ' selected' }}>{{ manufacturer.getName() }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<div class="form-control-feedback hide" data-field="manufacturer"></div>
|
||||
</div>
|
||||
<label class="col-lg-1 col-form-label" data-field="model">
|
||||
Model:
|
||||
</label>
|
||||
<div class="col-lg-3">
|
||||
<select class="form-control m-input" id="model" name="model">
|
||||
<option value=""></option>
|
||||
{% for model in models %}
|
||||
<option value="{{ model.getID() }}"{{ row is defined and model.getID() == row.getModel().getID() ? ' selected' }}>{{ model.getName() }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<div class="form-control-feedback hide" data-field="model"></div>
|
||||
</div>
|
||||
<label class="col-lg-1 col-form-label" data-field="size">
|
||||
Size:
|
||||
</label>
|
||||
<div class="col-lg-3">
|
||||
<select class="form-control m-input" id="size" name="size">
|
||||
<option value=""></option>
|
||||
{% for size in sizes %}
|
||||
<option value="{{ size.getID() }}"{{ row is defined and size.getID() == row.getSize().getID() ? ' selected' }}>{{ size.getName() }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<div class="form-control-feedback hide" data-field="size"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="m-form__seperator m-form__seperator--dashed"></div>
|
||||
<div class="m-form__section">
|
||||
<div class="m-form__heading">
|
||||
<h3 class="m-form__heading-title">
|
||||
Warranty
|
||||
</h3>
|
||||
</div>
|
||||
<div class="form-group m-form__group row">
|
||||
<label class="col-lg-1 col-form-label" data-field="warr_personal">
|
||||
Personal:
|
||||
</label>
|
||||
<div class="col-lg-3">
|
||||
<input type="number" name="warr_personal" class="form-control m-input" value="{{ row is defined ? row.getWarrantyPersonal() }}">
|
||||
<div class="form-control-feedback hide" data-field="warr_personal"></div>
|
||||
<span class="m-form__help">In months</span>
|
||||
</div>
|
||||
<label class="col-lg-1 col-form-label" data-field="warr_commercial">
|
||||
Commercial:
|
||||
</label>
|
||||
<div class="col-lg-3">
|
||||
<input type="number" name="warr_commercial" class="form-control m-input" value="{{ row is defined ? row.getWarrantyCommercial() }}">
|
||||
<div class="form-control-feedback hide" data-field="warr_commercial"></div>
|
||||
<span class="m-form__help">In months</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="m-form__section">
|
||||
<div class="m-form__heading">
|
||||
<h3 class="m-form__heading-title">
|
||||
Specifications
|
||||
</h3>
|
||||
</div>
|
||||
<div class="form-group m-form__group row">
|
||||
<label class="col-lg-1 col-form-label" data-field="length">
|
||||
Length:
|
||||
</label>
|
||||
<div class="col-lg-3">
|
||||
<input type="number" name="length" class="form-control m-input" value="{{ row is defined ? row.getLength() }}">
|
||||
<div class="form-control-feedback hide" data-field="length"></div>
|
||||
<span class="m-form__help">In millimeters (mm)</span>
|
||||
</div>
|
||||
<label class="col-lg-1 col-form-label" data-field="width">
|
||||
Width:
|
||||
</label>
|
||||
<div class="col-lg-3">
|
||||
<input type="number" name="width" class="form-control m-input" value="{{ row is defined ? row.getWidth() }}">
|
||||
<div class="form-control-feedback hide" data-field="width"></div>
|
||||
<span class="m-form__help">In millimeters (mm)</span>
|
||||
</div>
|
||||
<label class="col-lg-1 col-form-label" data-field="height">
|
||||
Height:
|
||||
</label>
|
||||
<div class="col-lg-3">
|
||||
<input type="number" name="height" class="form-control m-input" value="{{ row is defined ? row.getHeight() }}">
|
||||
<div class="form-control-feedback hide" data-field="height"></div>
|
||||
<span class="m-form__help">In millimeters (mm)</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group m-form__group row">
|
||||
<label class="col-lg-1 col-form-label" data-field="total_height">
|
||||
Total Height:
|
||||
</label>
|
||||
<div class="col-lg-3">
|
||||
<input type="number" name="total_height" class="form-control m-input" value="{{ row is defined ? row.getTotalHeight() }}">
|
||||
<div class="form-control-feedback hide" data-field="total_height"></div>
|
||||
<span class="m-form__help">In millimeters (mm)</span>
|
||||
</div>
|
||||
<label class="col-lg-1 col-form-label" data-field="res_capacity">
|
||||
Reserve Capacity
|
||||
</label>
|
||||
<div class="col-lg-3">
|
||||
<input type="number" name="res_capacity" class="form-control m-input" value="{{ row is defined ? row.getReserveCapacity() }}">
|
||||
<div class="form-control-feedback hide" data-field="res_capacity"></div>
|
||||
<span class="m-form__help">In minutes</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="m-form__section m-form__section--last normal-font">
|
||||
<div class="form-group m-form__group row">
|
||||
<div class="col-lg-12">
|
||||
<div class="form-group m-form__group row form-group-inner">
|
||||
<div class="col-lg-12">
|
||||
<div class="m-portlet m-portlet--success m-portlet--head-solid-bg">
|
||||
<div class="m-portlet__head">
|
||||
<div class="m-portlet__head-caption">
|
||||
<div class="m-portlet__head-title">
|
||||
<h3 class="m-portlet__head-text">
|
||||
Vehicle Compatibility
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="m-portlet__body">
|
||||
<div class="form-group m-form__group row form-group-inner">
|
||||
<div class="col-lg-12">
|
||||
<div id="data-vehicles"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group m-form__group row form-group-inner">
|
||||
<label class="col-lg-1 col-form-label" data-field="vehicle_list">
|
||||
Add Vehicle:
|
||||
</label>
|
||||
<div class="col-lg-3">
|
||||
<select name="vehicle_list" class="form-control m-input" id="vmfg">
|
||||
<option value="">Select a manufacturer</option>
|
||||
{% for manufacturer in vmfgs %}
|
||||
<option value="{{ manufacturer.getID() }}">{{ manufacturer.getName() }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-lg-3">
|
||||
<select name="vehicle_list" class="form-control m-input" id="vehicle" disabled>
|
||||
<option value="">Select a manufacturer first</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-lg-3">
|
||||
<button type="button" class="btn btn-primary" id="btn-add-vehicle" disabled>Add to List</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -64,7 +228,7 @@
|
|||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<button type="submit" class="btn btn-success">Submit</button>
|
||||
<a href="{{ url('role_list') }}" class="btn btn-secondary">Cancel</a>
|
||||
<a href="{{ url('battery_list') }}" class="btn btn-secondary">Cancel</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -81,13 +245,23 @@
|
|||
$(function() {
|
||||
$("#row-form").submit(function(e) {
|
||||
var form = $(this);
|
||||
var formdata = form.serialize();
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
// add vehicle data
|
||||
vdata = '';
|
||||
$.each(vehicleRows, function(index, vehicle) {
|
||||
vdata += "&vehicles%5B%5D=" + vehicle.id;
|
||||
});
|
||||
|
||||
// append to form data
|
||||
formdata += vdata;
|
||||
|
||||
$.ajax({
|
||||
method: "POST",
|
||||
url: form.prop('action'),
|
||||
data: form.serialize()
|
||||
data: formdata
|
||||
}).done(function(response) {
|
||||
// remove all error classes
|
||||
removeErrors();
|
||||
|
|
@ -96,7 +270,7 @@
|
|||
text: 'Your changes have been saved!',
|
||||
type: 'success',
|
||||
onClose: function() {
|
||||
window.location.href = "{{ url('role_list') }}";
|
||||
window.location.href = "{{ url('battery_list') }}";
|
||||
}
|
||||
});
|
||||
}).fail(function(response) {
|
||||
|
|
@ -141,6 +315,160 @@
|
|||
$("[data-field]").removeClass('has-danger');
|
||||
$(".form-control-feedback[data-field]").addClass('hide');
|
||||
}
|
||||
|
||||
// initialize vehicle arrays
|
||||
var mfgVehicles = [];
|
||||
var vehicleRows = [];
|
||||
var vehicleIds = [];
|
||||
|
||||
{% if row is defined %}
|
||||
{% for vehicle in row.getVehicles() %}
|
||||
vrow = {
|
||||
id: "{{ vehicle.getID() }}",
|
||||
mfg_name: "{{ vehicle.getManufacturer().getName() }}",
|
||||
make: "{{ vehicle.getMake() }}",
|
||||
model_year_from: "{{ vehicle.getModelYearFrom() }}",
|
||||
model_year_to: "{{ vehicle.getModelYearTo() }}"
|
||||
};
|
||||
|
||||
vehicleRows.push(vrow);
|
||||
vehicleIds.push("{{ vehicle.getID() }}");
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
// update vehicle list when changing manufacturer
|
||||
$("#vmfg").change(function() {
|
||||
var id = $(this).val();
|
||||
var vehiclefield = $("#vehicle");
|
||||
var btn = $("#btn-add-vehicle");
|
||||
|
||||
// no id specified
|
||||
if (!id) {
|
||||
vehiclefield.html('<option value="">Select a manufacturer first</option>').prop('disabled', true);
|
||||
btn.prop('disabled', true);
|
||||
return true;
|
||||
}
|
||||
|
||||
mfgVehicles = [];
|
||||
|
||||
// get vehicles for this manufacturer
|
||||
$.ajax({
|
||||
method: "POST",
|
||||
url: "{{ url('vmfg_vehicles') }}",
|
||||
data: {id: id}
|
||||
}).done(function(response) {
|
||||
if (response.data) {
|
||||
var html = '';
|
||||
|
||||
$.each(response.data, function(index, vehicle) {
|
||||
html += '<option value="' + vehicle.id + '" data-index="' + index + '">' + vehicle.make + ' ' + vehicle.model_year_from + '-' + vehicle.model_year_to + '</option>';
|
||||
});
|
||||
|
||||
vehiclefield.html(html).prop('disabled', false);
|
||||
btn.prop('disabled', false);
|
||||
mfgVehicles = response.data;
|
||||
} else {
|
||||
vehiclefield.html('<option value="">No vehicles found</option>').prop('disabled', true);
|
||||
btn.prop('disabled', true);
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
// add a vehicle to the table
|
||||
$("#btn-add-vehicle").click(function() {
|
||||
var id = $("#vehicle").val();
|
||||
var index = $("#vehicle").find(":selected").data('index');
|
||||
|
||||
if (vehicleIds.indexOf(id) !== -1) {
|
||||
swal({
|
||||
title: 'Whoops',
|
||||
text: 'This vehicle is already on the list.',
|
||||
type: 'warning'
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// add vehicle to arrays
|
||||
vehicleIds.push(id);
|
||||
vehicleRows.push(mfgVehicles[index]);
|
||||
|
||||
// refresh the data table
|
||||
table.originalDataSet = vehicleRows;
|
||||
table.reload();
|
||||
});
|
||||
|
||||
// remove vehicle from table
|
||||
$(document).on('click', '.btn-delete', function(e) {
|
||||
var btn = $(this);
|
||||
var id = $(this).data('id');
|
||||
|
||||
$.each(vehicleRows, function(index, vehicle) {
|
||||
if (vehicle.id == id) {
|
||||
vehicleRows.splice(index, 1);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
// remove from vehicle ids
|
||||
vehicleIds.splice(vehicleIds.indexOf(id), 1);
|
||||
|
||||
// reload table
|
||||
table.row(btn.parents('tr')).remove();
|
||||
table.originalDataSet = vehicleRows;
|
||||
table.reload();
|
||||
});
|
||||
|
||||
// data table
|
||||
var options = {
|
||||
data: {
|
||||
type: 'local',
|
||||
source: vehicleRows,
|
||||
saveState: {
|
||||
cookie: false,
|
||||
webstorage: false
|
||||
}
|
||||
},
|
||||
layout: {
|
||||
scroll: true
|
||||
},
|
||||
columns: [
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID',
|
||||
width: 30
|
||||
},
|
||||
{
|
||||
field: 'mfg_name',
|
||||
title: 'Manufacturer'
|
||||
},
|
||||
{
|
||||
field: 'make',
|
||||
title: 'Make'
|
||||
},
|
||||
{
|
||||
field: 'model_year_from',
|
||||
title: 'Year',
|
||||
template: function (data) {
|
||||
return data.model_year_from + ' - ' + data.model_year_to;
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'Actions',
|
||||
width: 70,
|
||||
title: 'Actions',
|
||||
sortable: false,
|
||||
overflow: 'visible',
|
||||
locked: {right: 'xl'},
|
||||
template: function (row, index, datatable) {
|
||||
return '<button data-id="' + row.id + '" type="button" class="m-portlet__nav-link btn m-btn m-btn--hover-danger m-btn--icon m-btn--icon-only m-btn--pill btn-delete" title="Delete"><i class="la la-trash"></i></button>';
|
||||
},
|
||||
}
|
||||
],
|
||||
pagination: false
|
||||
};
|
||||
|
||||
var table = $("#data-vehicles").mDatatable(options);
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
|
|
|||
|
|
@ -78,13 +78,18 @@
|
|||
scroll: true
|
||||
},
|
||||
columns: [
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID',
|
||||
width: 30
|
||||
},
|
||||
{
|
||||
field: 'mfg_name',
|
||||
title: 'Manufacturer',
|
||||
width: 150
|
||||
},
|
||||
{
|
||||
field: 'mdl_name',
|
||||
field: 'model_name',
|
||||
title: 'Model',
|
||||
width: 150
|
||||
},
|
||||
|
|
@ -143,11 +148,11 @@
|
|||
var actions = '';
|
||||
|
||||
if (row.meta.update_url != '') {
|
||||
actions += '<a href="' + row.meta.update_url + '" class="m-portlet__nav-link btn m-btn m-btn--hover-accent m-btn--icon m-btn--icon-only m-btn--pill btn-edit" data-id="' + row.username + '" title="Edit"><i class="la la-edit"></i></a>';
|
||||
actions += '<a href="' + row.meta.update_url + '" class="m-portlet__nav-link btn m-btn m-btn--hover-accent m-btn--icon m-btn--icon-only m-btn--pill btn-edit" data-id="' + row.prod_code + '" title="Edit"><i class="la la-edit"></i></a>';
|
||||
}
|
||||
|
||||
if (row.meta.delete_url != '') {
|
||||
actions += '<a href="' + row.meta.delete_url + '" class="m-portlet__nav-link btn m-btn m-btn--hover-danger m-btn--icon m-btn--icon-only m-btn--pill btn-delete" data-id="' + row.username + '" title="Delete"><i class="la la-trash"></i></a>';
|
||||
actions += '<a href="' + row.meta.delete_url + '" class="m-portlet__nav-link btn m-btn m-btn--hover-danger m-btn--icon m-btn--icon-only m-btn--pill btn-delete" data-id="' + row.prod_code + '" title="Delete"><i class="la la-trash"></i></a>';
|
||||
}
|
||||
|
||||
return actions;
|
||||
|
|
|
|||
Loading…
Reference in a new issue