From a450f5ada887d29bc61175544b1a45fe4ebcc77f Mon Sep 17 00:00:00 2001 From: Ramon Gutierrez Date: Tue, 16 Jan 2018 02:25:40 +0800 Subject: [PATCH] Initial commit for customer crud forms --- config/routes/battery.yaml | 5 + public/assets/css/style.css | 8 + .../BatteryManufacturerController.php | 33 + src/Controller/CustomerController.php | 117 +++- src/Entity/BatteryManufacturer.php | 7 +- src/Entity/CustomerVehicle.php | 3 +- src/Entity/MobileNumber.php | 12 +- templates/battery/form.html.twig | 14 +- templates/customer/form.html.twig | 581 +++++++++++++++--- 9 files changed, 668 insertions(+), 112 deletions(-) diff --git a/config/routes/battery.yaml b/config/routes/battery.yaml index 00045f0a..7fa4c9e2 100644 --- a/config/routes/battery.yaml +++ b/config/routes/battery.yaml @@ -55,6 +55,11 @@ bmfg_create_submit: controller: App\Controller\BatteryManufacturerController::addSubmit methods: [POST] +bmfg_batteries: + path: /battery-manufacturers/batteries + controller: App\Controller\BatteryManufacturerController::getBatteries + methods: [POST] + bmfg_update: path: /battery-manufacturers/{id} controller: App\Controller\BatteryManufacturerController::updateForm diff --git a/public/assets/css/style.css b/public/assets/css/style.css index 6bedb575..a67f0745 100644 --- a/public/assets/css/style.css +++ b/public/assets/css/style.css @@ -36,4 +36,12 @@ label.has-danger, .normal-font { font-size: inherit !important; font-weight: inherit !important; +} + +.block-switch { + display: block; +} + +.switch-label { + margin: 6px 0 0 8px; } \ No newline at end of file diff --git a/src/Controller/BatteryManufacturerController.php b/src/Controller/BatteryManufacturerController.php index 1f791198..e0836c5d 100644 --- a/src/Controller/BatteryManufacturerController.php +++ b/src/Controller/BatteryManufacturerController.php @@ -266,6 +266,39 @@ class BatteryManufacturerController extends BaseController $response->send(); } + public function getBatteries(Request $req) + { + if (!$this->isGranted('customer.add') && !$this->isGranted('customer.update')) { + $exception = $this->createAccessDeniedException('No access.'); + throw $exception; + } + + // get row data + $em = $this->getDoctrine()->getManager(); + $row = $em->getRepository(BatteryManufacturer::class)->find($req->request->get('id')); + + if (empty($row)) + throw $this->createNotFoundException('The item does not exist'); + + // build batteries array + $batteries = []; + + foreach ($row->getBatteries() as $battery) { + $batteries[] = [ + 'id' => $battery->getID(), + 'mfg_name' => $battery->getManufacturer()->getName(), + 'model_name' => $battery->getModel()->getName(), + 'size_name' => $battery->getSize()->getName(), + 'prod_code' => $battery->getProductCode() + ]; + } + + // response + return $this->json([ + 'data' => $batteries + ]); + } + // check if datatable filter is present and append to query protected function setQueryFilters($datatable, &$query) { if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) { diff --git a/src/Controller/CustomerController.php b/src/Controller/CustomerController.php index 7a496ae0..bc2d9ffc 100644 --- a/src/Controller/CustomerController.php +++ b/src/Controller/CustomerController.php @@ -5,8 +5,11 @@ namespace App\Controller; use App\Ramcar\BaseController; use App\Entity\Customer; use App\Entity\CustomerVehicle; +use App\Entity\MobileNumber; use App\Entity\Vehicle; use App\Entity\VehicleManufacturer; +use App\Entity\Battery; +use App\Entity\BatteryManufacturer; use Doctrine\ORM\Query; use Symfony\Component\HttpFoundation\Request; @@ -16,6 +19,8 @@ use Symfony\Component\Validator\Validator\ValidatorInterface; use App\Menu\Generator as MenuGenerator; use App\Access\Generator as ACLGenerator; +use DateTime; + class CustomerController extends BaseController { protected $acl_gen; @@ -134,6 +139,7 @@ class CustomerController extends BaseController $em = $this->getDoctrine()->getManager(); // get parent associations + $params['bmfgs'] = $em->getRepository(BatteryManufacturer::class)->findAll(); $params['vmfgs'] = $em->getRepository(VehicleManufacturer::class)->findAll(); // response @@ -149,25 +155,119 @@ class CustomerController extends BaseController $row = new Customer(); // set and save values - $row->setName($req->request->get('name')); + $row->setFirstName($req->request->get('first_name')) + ->setLastName($req->request->get('last_name')) + ->setConfirmed(false); + + // initialize error lists + $error_array = []; + $nerror_array = []; + $verror_array = []; + + // custom validation for mobile numbers + $numbers = json_decode($req->request->get('mobile_numbers')); + + if (!empty($numbers)) { + foreach ($numbers as $key => $number) { + $mobile_number = new MobileNumber(); + $mobile_number->setID($number->id) + ->setDateRegistered(DateTime::createFromFormat("d M Y - h:i A", $number->date_registered)); + + if (!empty($number->date_confirmed)) { + $mobile_number->setDateConfirmed(DateTime::createFromFormat("d M Y - h:i A", $number->date_confirmed)) + ->setConfirmed(); + } else { + $mobile_number->setConfirmed(false); + } + + $nerrors = $validator->validate($mobile_number); + + // add errors to list + foreach ($nerrors as $error) { + if (!isset($nerror_array[$key])) + $nerror_array[$key] = []; + + $nerror_array[$key][$error->getPropertyPath()] = $error->getMessage(); + } + + // add to entity + if (!$nerrors) { + $row->addMobileNumber($mobile_number); + } + } + } + + // custom validation for vehicles + $vehicles = json_decode($req->request->get('vehicles')); + + if (!empty($vehicles)) { + foreach ($vehicles as $vehicle) { + // check if vehicle exists + $vobj = $em->getRepository(Vehicle::class)->find($vehicle->vehicle); + + if (empty($vobj)) { + $verror_array[$vehicle->index]['vehicle'] = 'Invalid vehicle specified.'; + } else { + $cust_vehicle = new CustomerVehicle(); + $cust_vehicle->setVehicle($vobj) + ->setPlateNumber($vehicle->plate_number) + ->setModelYear($vehicle->model_year) + ->setColor($vehicle->color) + ->setStatusCondition($vehicle->status_condition) + ->setFuelType($vehicle->fuel_type) + ->setActive($vehicle->flag_active); + + // if specified, check if battery exists + if (isset($vehicle->battery)) { + // check if battery exists + $bobj = $em->getRepository(Battery::class)->find($vehicle->battery); + + if (empty($bobj)) { + $verror_array[$vehicle->index]['battery'] = 'Invalid battery specified.'; + } else { + $cust_vehicle->setHasMotoliteBattery(true) + ->setCurrentBattery($bobj) + ->setWarrantyCode($vehicle->warranty_code) + ->setWarrantyExpiration(DateTime::createFromFormat("d M Y", $vehicle->warranty_expiration)); + } + } else { + $cust_vehicle->setHasMotoliteBattery(false); + } + + $verrors = $validator->validate($cust_vehicle); + + // add errors to list + foreach ($nerrors as $error) { + if (!isset($nerror_array[$key])) + $verror_array[$vehicle->index] = []; + + $verror_array[$vehicle->index][$error->getPropertyPath()] = $error->getMessage(); + } + + // add to entity + if (empty($verror_array[$vehicle->index])) { + $row->addVehicle($cust_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(); } // check if any errors were found - if (!empty($error_array)) { + if (!empty($error_array) || !empty($nerror_array) || !empty($verror_array)) { // return validation failure response return $this->json([ 'success' => false, - 'errors' => $error_array + 'errors' => $error_array, + 'nerrors' => $nerror_array, + 'verrors' => $verror_array ], 422); } else { // validated! save the entity @@ -196,8 +296,11 @@ class CustomerController extends BaseController if (empty($row)) throw $this->createNotFoundException('The item does not exist'); + // get parent associations + $params['bmfgs'] = $em->getRepository(BatteryManufacturer::class)->findAll(); + $params['vmfgs'] = $em->getRepository(VehicleManufacturer::class)->findAll(); + $params['obj'] = $row; - $params['values'] = []; // response return $this->render('customer/form.html.twig', $params); diff --git a/src/Entity/BatteryManufacturer.php b/src/Entity/BatteryManufacturer.php index 2d6bd21e..ddeaada4 100644 --- a/src/Entity/BatteryManufacturer.php +++ b/src/Entity/BatteryManufacturer.php @@ -68,11 +68,6 @@ class BatteryManufacturer public function getBatteries() { - // 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->getProductCode(); - - return $str_batteries; + return $this->batteries; } } diff --git a/src/Entity/CustomerVehicle.php b/src/Entity/CustomerVehicle.php index fe1ab9bd..cba7b11b 100644 --- a/src/Entity/CustomerVehicle.php +++ b/src/Entity/CustomerVehicle.php @@ -30,7 +30,6 @@ class CustomerVehicle /** * @ORM\ManyToOne(targetEntity="Customer", inversedBy="vehicles") * @ORM\JoinColumn(name="customer_id", referencedColumnName="id") - * @Assert\NotBlank() */ protected $customer; @@ -214,7 +213,7 @@ class CustomerVehicle return $this->warranty_expiration; } - public function setCurrentBattery($curr_battery) + public function setCurrentBattery(Battery $curr_battery) { $this->curr_battery = $curr_battery; return $this; diff --git a/src/Entity/MobileNumber.php b/src/Entity/MobileNumber.php index 7ddef1ab..ea402acc 100644 --- a/src/Entity/MobileNumber.php +++ b/src/Entity/MobileNumber.php @@ -28,7 +28,6 @@ class MobileNumber /** * @ORM\ManyToOne(targetEntity="Customer", inversedBy="numbers") * @ORM\JoinColumn(name="customer_id", referencedColumnName="id") - * @Assert\NotBlank() */ protected $customer; @@ -117,4 +116,15 @@ class MobileNumber { return $this->date_confirmed; } + + public function setConfirmed($flag_confirmed = true) + { + $this->flag_confirmed = $flag_confirmed; + return $this; + } + + public function isConfirmed() + { + return $this->flag_confirmed; + } } diff --git a/templates/battery/form.html.twig b/templates/battery/form.html.twig index 32da2479..8e2a791e 100644 --- a/templates/battery/form.html.twig +++ b/templates/battery/form.html.twig @@ -195,7 +195,7 @@ Add Vehicle:
- {% for manufacturer in vmfgs %} @@ -328,12 +328,12 @@ // update vehicle list when changing manufacturer $("#vmfg").change(function() { var id = $(this).val(); - var vehiclefield = $("#vehicle"); + var field = $("#vehicle"); var btn = $("#btn-add-vehicle"); // no id specified if (!id) { - vehiclefield.html('').prop('disabled', true); + field.html('').prop('disabled', true); btn.prop('disabled', true); return true; } @@ -346,18 +346,18 @@ url: "{{ url('vmfg_vehicles') }}", data: {id: id} }).done(function(response) { - if (response.data) { + if (response.data.length > 0) { var html = ''; $.each(response.data, function(index, vehicle) { - html += ''; + html += ''; }); - vehiclefield.html(html).prop('disabled', false); + field.html(html).prop('disabled', false); btn.prop('disabled', false); mfgVehicles = response.data; } else { - vehiclefield.html('').prop('disabled', true); + field.html('').prop('disabled', true); btn.prop('disabled', true); } }) diff --git a/templates/customer/form.html.twig b/templates/customer/form.html.twig index 020bf319..31d18576 100644 --- a/templates/customer/form.html.twig +++ b/templates/customer/form.html.twig @@ -77,7 +77,7 @@ Use the format 63xxxxxxxxxx
-
+
@@ -95,7 +95,10 @@
-
+
+
+ +
@@ -115,6 +118,164 @@ + {% endblock %} {% block scripts %} @@ -122,13 +283,26 @@ $(function() { $("#row-form").submit(function(e) { var form = $(this); + var formdata = form.serializeArray(); e.preventDefault(); + // add mobile number data + formdata.push({ + name: 'mobile_numbers', + value: JSON.stringify(numberRows) + }); + + // add vehicle data + formdata.push({ + name: 'vehicles', + value: JSON.stringify(vehicleRows) + }); + $.ajax({ method: "POST", url: form.prop('action'), - data: form.serialize() + data: formdata }).done(function(response) { // remove all error classes removeErrors(); @@ -184,14 +358,25 @@ } // datetimepicker - $(".date").datetimepicker({ + $(".dtp").datetimepicker({ format: "dd M yyyy - HH:ii P", showMeridian: true, todayHighlight: true, autoclose: true, pickerPosition: 'top-left', bootcssVer: 3, - todayBtn: true + todayBtn: true, + clearBtn: true + }); + + // datepicker + $(".dp").datepicker({ + format: "dd M yyyy", + todayHighlight: true, + autoclose: true, + pickerPosition: 'top-left', + bootcssVer: 3, + clearBtn: true }); // input mask @@ -200,12 +385,16 @@ placeholder: "" }); + $("#vehicle-year").inputmask("mask", { + mask: "9999", + placeholder: "" + }); + // initialize arrays var numberRows = []; var numberIds = []; var mfgVehicles = []; var vehicleRows = []; - var vehicleIds = []; {% for number in obj.getMobileNumbers() %} nrow = { @@ -224,44 +413,27 @@ vrow = { id: "{{ cv.getID() }}", - mfg_name: "{{ vehicle.getManufacturer().getName() }}", - make: "{{ vehicle.getMake() }}", - model_year: "{{ cv.getModelYear() }}", + index: moment().unix(), + battery: "{{ battery.getID() }}", + bmfg: "{{ battery.getManufacturer().getID() }}", color: "{{ cv.getColor() }}", - status_condition: "{{ cv.getStatusCondition() }}", - fuel_type: "{{ cv.getFuelType() }}", - warranty_code: "{{ cv.getWarrantyCode() }}", - warranty_expiration: "{{ cv.getWarrantyExpiration() ? cv.getWarrantyExpiration()|date('d M Y') }}", - curr_battery_id: "{{ battery.getID() }}", - curr_battery_prod_code: "{{ battery.getProductCode() }}", - curr_battery_manufacturer: "{{ battery.getManufacturer().getName() }}", + flag_active: {{ cv.isActive() }}, flag_motolite_battery: {{ cv.hasMotoliteBattery() }}, - flag_active: {{ cv.isActive() }} + fuel_type: "{{ cv.getFuelType() }}", + mfg_name: "{{ vehicle.getManufacturer().getName() }}", + model_year: "{{ cv.getModelYear() }}", + plate_number: "{{ cv.getPlateNumber() }}", + status_condition: "{{ cv.getStatusCondition() }}", + vehicle: "{{ vehicle.getID() }}", + vehicle_label: "{{ vehicle.getMake() ~ ' (' ~ vehicle.getModelYearStart() ~ ' ' ~ vehicle.getModelYearEnd() ~ ')' }}", + vmfg: "{{ vehicle.getManufacturer().getID() }}", + warranty_code: "{{ cv.getWarrantyCode() }}", + warranty_expiration: "{{ cv.getWarrantyExpiration() ? cv.getWarrantyExpiration()|date('d M Y') }}" }; vehicleRows.push(vrow); - vehicleIds.push("{{ cv.getID() }}"); {% endfor %} - vrow = { - id: "123", - mfg_name: "Mitsubishi", - make: "Lancer", - model_year: "1996", - color: "Red", - status_condition: "New", - fuel_type: "Gas", - warranty_code: "12345", - warranty_expiration: "15 Jan 2018", - curr_battery_id: "11", - curr_battery_prod_code: "TESTBATT", - curr_battery_manufacturer: "Motolite", - flag_motolite_battery: 1, - flag_active: 1 - }; - - vehicleRows.push(vrow); - // add a mobile number to the table $("#btn-add-mobile-number").click(function() { var id = $("#mobile-number").val(); @@ -335,7 +507,7 @@ vehicleTable.reload(); }); - // remove mobile number from table + // remove item from table $(document).on('click', '.btn-delete', function(e) { var btn = $(this); var id = $(this).data('id'); @@ -346,23 +518,21 @@ if (table.parent().prop('id') == 'data-mobile-numbers') { rowArray = numberRows; - rowIds = numberIds; dt = numberTable; + + // remove from ids + numberIds.splice(numberIds.indexOf(id), 1); } else { rowArray = vehicleRows; - rowIds = vehicleIds; dt = vehicleTable; } $.each(rowArray, function(index, row) { if (row.id == id) { - rowArray.splice(index, 1); + delete rowArray.splice(index, 1); return false; } }); - - // remove from ids - rowIds.splice(rowIds.indexOf(id), 1); // reload table dt.row(btn.parents('tr')).remove(); @@ -370,6 +540,254 @@ dt.reload(); }); + // display create vehicle form + $("#add-vehicle").click(function() { + $("#vehicle-form").data('mode', 'create'); + $("#vehicle-form-title").html("Add Vehicle"); + $("#vehicle-form-modal").modal('show'); + }); + + // find vehicle row by index + function findVehicleRow(index) { + for (var i = 0, len = vehicleRows.length; i < len; i++) { + if (vehicleRows[i].index === index) { + return { + row: vehicleRows[i], + index: i + }; + } + } + + return false; + } + + // display edit vehicle form + $(document).on("click", ".btn-edit-vehicle", function() { + var form = $("#vehicle-form"); + var tr = $(this).closest('tr'); + var index = parseInt(tr.find("[name='index']").val()); + var rowData = findVehicleRow(index); + + if (!rowData) { + return; + } + + row = rowData.row; + + // set form mode + form.data('mode', 'update'); + $("#vehicle-form-title").html("Edit Vehicle"); + + // set index + $("#row-index").val(row.index); + + // set text/select field values manually + form.find("input[type='text'], select").each(function() { + var rowval = row[$(this).prop('name')]; + + if (typeof rowval !== 'undefined') { + $(this).val(rowval); + } + }); + + // set entity ids + $("#vehicle").data('id', row.vehicle); + $("#battery").data('id', row.battery); + $("#cv-id").val(row.id); + + // set select box values + $("#vmfg").val(row.vmfg).change(); + + if (row.battery) { + $("#flag-motolite-battery").prop('checked', true).change(); + $("#bmfg").val(row.bmfg).change(); + } + + $("#flag-active").prop('checked', row.flag_active); + + // show modal + $("#vehicle-form-modal").modal('show'); + }); + + // update vehicle list when changing manufacturer + $("#vmfg").change(function() { + var id = $(this).val(); + var field = $("#vehicle"); + + // no id specified + if (!id) { + field.html('').prop('disabled', true); + return true; + } + + // get vehicles for this manufacturer + $.ajax({ + method: "POST", + url: "{{ url('vmfg_vehicles') }}", + data: {id: id} + }).done(function(response) { + if (response.data.length > 0) { + var html = ''; + + $.each(response.data, function(index, vehicle) { + html += ''; + }); + + field.html(html).prop('disabled', false); + } else { + field.html('').prop('disabled', true); + } + }) + }); + + // update battery list when changing manufacturer + $("#bmfg").change(function() { + var id = $(this).val(); + var field = $("#battery"); + + // no id specified + if (!id) { + field.html('').prop('disabled', true); + return true; + } + + // get vehicles for this manufacturer + $.ajax({ + method: "POST", + url: "{{ url('bmfg_batteries') }}", + data: {id: id} + }).done(function(response) { + if (response.data.length > 0) { + var html = ''; + + $.each(response.data, function(index, battery) { + html += ''; + }); + + field.html(html).prop('disabled', false); + } else { + field.html('').prop('disabled', true); + } + }) + }); + + // toggle motolite battery area + $("#flag-motolite-battery").change(function() { + var currBatteryRows = $(".curr_battery_row"); + + if ($(this).prop('checked') == true) { + currBatteryRows.removeClass('hide').find("[name='battery']").data('required', 1); + } else { + currBatteryRows.addClass('hide').find("[name='battery']").data('required', 0); + } + }); + + // save vehicle form + $("#vehicle-form").submit(function(e) { + var form = $(this); + var mode = form.data('mode'); + + // get all fields, including disabled ones + var disabled = form.find(":input:disabled").prop('disabled', false); + var fields = form.serializeArray().map(function(x){this[x.name] = x.value; return this;}.bind({}))[0]; + disabled.prop('disabled', true); + + e.preventDefault(); + + var errors = 0; + var firstfield = false; + + // remove all error classes first + removeErrors(); + + // check for required fields + $.each(fields, function(field, value) { + var formfield = form.find("[name='" + field + "']"); + var label = form.find("label[data-field='" + field + "']"); + var msgbox = form.find(".form-control-feedback[data-field='" + field + "']"); + var required = formfield.data('required'); + + if (required === 1 && !value) { + errors++; + + // add error classes to bad fields + formfield.addClass('form-control-danger'); + label.addClass('has-danger'); + msgbox.html("This value should not be blank.").addClass('has-danger').removeClass('hide'); + + // check if this field comes first in DOM + var domfield = formfield.get(0); + + if (!firstfield || (firstfield && firstfield.compareDocumentPosition(domfield) === 2)) { + firstfield = domfield; + } + } + }); + + // errors were found + if (errors > 0) { + // focus on first bad field + firstfield.focus(); + + // scroll to above that field to make it visible + $('html, body').animate({ + scrollTop: $(firstfield).offset().top - 200 + }, 100); + + return false; + } + + // build table row + var row = fields; + row.mfg_name = $("#vmfg option:selected").text(); + row.vehicle_label = $("#vehicle option:selected").text(); + row.flag_active = row.flag_active == 1 ? true : false; + + // add optional field + if (typeof fields.flag_motolite_battery === 'undefined') { + row.flag_motolite_battery = false; + row.battery_label = ""; + } else { + row.flag_motolite_battery = true; + row.battery_label = $("#battery option:selected").text(); + } + + if (mode == 'create') { + // set an index + row.index = moment().unix(); + + // save to table + vehicleRows.push(row); + } else { + // get vehicle row by index + row.index = parseInt(row.index); + rowData = findVehicleRow(row.index); + vehicleRows[rowData.index] = row; + } + + // refresh the data table + vehicleTable.originalDataSet = vehicleRows; + vehicleTable.reload(); + + // close modal + $("#vehicle-form-modal").modal('hide'); + }); + + // reset vehicle form status on close + $("#vehicle-form-modal").on('hidden.bs.modal', function(e) { + $("#flag-motolite-battery").prop('checked', false).change(); + $("#flag-active").prop('checked', true); + $("#vehicle-form").find("input[type='text'], select").val("").change(); + removeErrors(); + }); + + // remove all error classes on vehicle form + function removeErrors() { + $(".form-control-danger").removeClass('form-control-danger'); + $("[data-field]").removeClass('has-danger'); + $(".form-control-feedback[data-field]").addClass('hide'); + } + // mobile numbers data table var numberOptions = { data: { @@ -431,27 +849,26 @@ title: 'Manufacturer' }, { - field: 'make', - title: 'Make' + field: 'vehicle_label', + title: 'Vehicle', + width: 150 }, { field: 'model_year', - title: 'Year', - template: function (row, index, datatable) { - return '' - } + title: 'Year' + }, + { + field: 'plate_number', + title: 'Plate No.' }, { field: 'color', title: 'Color', - template: function (row, index, datatable) { - return '' - } + width: 70 }, { field: 'status_condition', - title: 'Status', - width: 50 + title: 'Cond.' }, { field: 'fuel_type', @@ -459,48 +876,29 @@ }, { field: 'warranty_code', - title: 'Warranty Code', - template: function (row, index, datatable) { - return '' - } + title: 'Wty. Code' }, { field: 'warranty_expiration', - title: 'Warranty Expiration', - width: 150, - template: function (row, index, datatable) { - return '' - } + title: 'Wty. Exp.', + width: 80 }, { - field: 'curr_battery', - title: 'Current Battery', - template: function (row, index, datatable) { - return row.curr_battery_manufacturer + ' ' + row.curr_battery_prod_code; - } - }, - { - field: 'flag_motolite_battery', - title: 'Using Motolite battery?', - template: function (row, index, datatable) { - html = ''; - return html; - } + field: 'battery_label', + title: 'Battery', + width: 150 }, { field: 'flag_active', - title: 'Is the vehicle active?', + title: 'Status', template: function (row, index, datatable) { - html = ''; - return html; + if (row.flag_active === true) { + tag = 'Active'; + } else { + tag = 'Inactive'; + } + + return tag; } }, { @@ -510,7 +908,12 @@ sortable: false, overflow: 'visible', template: function (row, index, datatable) { - return ''; + html = ''; + + html += '' + + ''; + + return html; }, } ],