From a4ae8f472675298e31baa2a50ce0d795be43d2c7 Mon Sep 17 00:00:00 2001 From: Ramon Gutierrez Date: Sun, 18 Feb 2018 16:34:30 +0800 Subject: [PATCH] Add rider schedule entry to rider form #8 --- public/assets/css/style.css | 6 +- src/Controller/RiderController.php | 130 ++++++++++++++-- templates/rider/form.html.twig | 235 +++++++++++++++++++++-------- 3 files changed, 293 insertions(+), 78 deletions(-) diff --git a/public/assets/css/style.css b/public/assets/css/style.css index b0166679..da72ceac 100644 --- a/public/assets/css/style.css +++ b/public/assets/css/style.css @@ -99,7 +99,8 @@ span.has-danger, font-weight: 300 !important; } -.table-compact th { +.table-compact th, +.table th { font-size: 0.9rem !important; background-color: #F4F3F8; color: #575962; @@ -109,7 +110,8 @@ span.has-danger, background-color: #F7F6FA; } -.table-compact td { +.table-compact td, +.table td { font-size: 0.9rem !important; } diff --git a/src/Controller/RiderController.php b/src/Controller/RiderController.php index 58925058..5ab07b04 100644 --- a/src/Controller/RiderController.php +++ b/src/Controller/RiderController.php @@ -3,7 +3,9 @@ namespace App\Controller; use App\Ramcar\BaseController; +use App\Ramcar\DayOfWeek; use App\Entity\Rider; +use App\Entity\RiderSchedule; use App\Entity\Hub; use App\Service\FileUploader; @@ -13,6 +15,8 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; +use DateTime; + class RiderController extends BaseController { public function index() @@ -134,6 +138,7 @@ class RiderController extends BaseController // get parent associations $params['hubs'] = $em->getRepository(Hub::class)->findAll(); + $params['days_of_week'] = DayOfWeek::getCollection(); // response return $this->render('rider/form.html.twig', $params); @@ -143,12 +148,17 @@ class RiderController extends BaseController { $this->denyAccessUnlessGranted('rider.add', null, 'No access.'); + /* + error_log(print_r($req->request->all(), true)); + throw $this->createNotFoundException('The item does not exist'); + */ + // create new row $em = $this->getDoctrine()->getManager(); - $row = new Rider(); + $obj = new Rider(); // set and save values - $row->setFirstName($req->request->get('first_name')) + $obj->setFirstName($req->request->get('first_name')) ->setLastName($req->request->get('last_name')) ->setContactNumber($req->request->get('contact_no')) ->setPlateNumber($req->request->get('plate_number')) @@ -167,17 +177,55 @@ class RiderController extends BaseController if (empty($hub)) $error_array['hub'] = 'Invalid hub selected.'; else - $row->setHub($hub); + $obj->setHub($hub); } // validate - $errors = $validator->validate($row); + $errors = $validator->validate($obj); // add errors to list foreach ($errors as $error) { $error_array[$error->getPropertyPath()] = $error->getMessage(); } + // save schedules + $days_of_week = DayOfWeek::getCollection(); + + $time_start_input = $req->request->get('time_start'); + $time_end_input = $req->request->get('time_end'); + $break_start_input = $req->request->get('break_start'); + $break_end_input = $req->request->get('break_end'); + $has_schedule = $req->request->get('has_schedule'); + + foreach ($days_of_week as $key => $day) { + if (in_array($key, $has_schedule)) { + $serror_array = []; + + $sobj = new RiderSchedule(); + + $sobj->setDayOfWeek($key) + ->setTimeStart($time_start_input[$key]) + ->setTimeEnd($time_end_input[$key]) + ->setBreakStart($break_start_input[$key]) + ->setBreakEnd($break_end_input[$key]) + ->setRider($obj); + + // validate + $errors = $validator->validate($sobj); + + // add errors to list + foreach ($errors as $error) { + $serror_array[$error->getPropertyPath() . "_" . $key] = $error->getMessage(); + } + + if (empty($serror_array)) { + $obj->addSchedule($sobj); + } else { + $error_array = array_merge($error_array, $serror_array); + } + } + } + // check if any errors were found if (!empty($error_array)) { // return validation failure response @@ -187,7 +235,7 @@ class RiderController extends BaseController ], 422); } else { // validated! save the entity - $em->persist($row); + $em->persist($obj); $em->flush(); // return successful response @@ -216,6 +264,7 @@ class RiderController extends BaseController // get parent associations $params['hubs'] = $em->getRepository(Hub::class)->findAll(); + $params['days_of_week'] = DayOfWeek::getCollection(); $params['obj'] = $row; @@ -229,14 +278,14 @@ class RiderController extends BaseController // get row data $em = $this->getDoctrine()->getManager(); - $row = $em->getRepository(Rider::class)->find($id); + $obj = $em->getRepository(Rider::class)->find($id); // make sure this row exists - if (empty($row)) + if (empty($obj)) throw $this->createNotFoundException('The item does not exist'); // set and save values - $row->setFirstName($req->request->get('first_name')) + $obj->setFirstName($req->request->get('first_name')) ->setLastName($req->request->get('last_name')) ->setContactNumber($req->request->get('contact_no')) ->setPlateNumber($req->request->get('plate_number')) @@ -255,19 +304,78 @@ class RiderController extends BaseController if (empty($hub)) $error_array['hub'] = 'Invalid hub selected.'; else - $row->setHub($hub); + $obj->setHub($hub); } else { - $row->clearHub(); + $obj->clearHub(); } // validate - $errors = $validator->validate($row); + $errors = $validator->validate($obj); // add errors to list foreach ($errors as $error) { $error_array[$error->getPropertyPath()] = $error->getMessage(); } + // save schedules + $days_of_week = DayOfWeek::getCollection(); + + $time_start_input = $req->request->get('time_start'); + $time_end_input = $req->request->get('time_end'); + $break_start_input = $req->request->get('break_start'); + $break_end_input = $req->request->get('break_end'); + $has_schedule = $req->request->get('has_schedule'); + + foreach ($days_of_week as $key => $day) { + if (in_array($key, $has_schedule)) { + $serror_array = []; + + $sobj = $em->getRepository(RiderSchedule::class)->findOneBy([ + 'rider' => $obj, + 'day_of_week' => $key + ]); + + // create new schedule row if not found + if (empty($sobj)) { + $sobj = new RiderSchedule(); + $sobj->setDayOfWeek($key) + ->setRider($obj); + } + + $sobj->setTimeStart($time_start_input[$key]) + ->setTimeEnd($time_end_input[$key]) + ->setBreakStart($break_start_input[$key]) + ->setBreakEnd($break_end_input[$key]); + + // validate + $errors = $validator->validate($sobj); + + // add errors to list + foreach ($errors as $error) { + $serror_array[$error->getPropertyPath() . "_" . $key] = $error->getMessage(); + } + + if (empty($serror_array)) { + if (empty($sobj->getID())) + $obj->addSchedule($sobj); + } else { + $error_array = array_merge($error_array, $serror_array); + } + } + } + + // cleanup + // delete all schedules not in list + $schedules = $obj->getSchedules(); + foreach ($schedules as $schedule) + { + if (!in_array($schedule->getDayOfWeek(), $has_schedule)) + { + $obj->removeSchedule($schedule); + $em->remove($schedule); + } + } + // check if any errors were found if (!empty($error_array)) { // return validation failure response diff --git a/templates/rider/form.html.twig b/templates/rider/form.html.twig index 9be98694..fa3956d7 100644 --- a/templates/rider/form.html.twig +++ b/templates/rider/form.html.twig @@ -32,74 +32,154 @@ -
+
-
-
- - - +
+
+

+ Rider Details +

-
- - - -
-
-
-
- - - -
-
- - - -
-
-
-
- - - -
-
-
-
- -
-
-

- Drop files here or click to upload. -

- - Upload only valid PNG, GIF, or JPEG images - -
-
- {% if mode == 'update' and obj.getImageFile %} - Leave blank for unchanged - {% endif %} - -
- {% if mode == 'update' %} +
- -
+ + +
- {% endif %} +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+
+ + + +
+
+
+
+ +
+
+

+ Drop files here or click to upload. +

+ + Upload only valid PNG, GIF, or JPEG images + +
+
+ {% if mode == 'update' and obj.getImageFile %} + Leave blank for unchanged + {% endif %} + +
+ {% if mode == 'update' %} +
+ +
+
+ {% endif %} +
+
+
+
+
+

+ Schedule +

+
+
+
+ + + + + + + + + + + + + {% for key, day in days_of_week %} + + + + + + + + {% endfor %} + +
DayTime StartTime EndBreak StartBreak End
+
+ +
+
{{ day }} +
+ + + + +
+ +
+
+ + + + +
+ +
+
+ + + + +
+ +
+
+ + + + +
+ +
+
+
@@ -148,6 +228,31 @@ }; $(function() { + // schedule checkboxes + $(".day-has-schedule").change(function() { + var fields = $(this).closest('tr').find('input[type="text"]'); + var checked = $(this).prop('checked'); + + if (checked) { + fields.prop('disabled', false); + } else { + fields.prop('disabled', true).val(""); + } + }).change(); + + // timepickers + $('.timepicker .m-input').timepicker({ + format: "HH:ii P", + minuteStep: 1, + showMeridian: true, + snapToStep: true, + bootcssVer: 3, + todayHighlight: true, + autoclose: true, + defaultTime: '', + showInputs: false + }); + $("#row-form").submit(function(e) { var form = $(this); @@ -178,7 +283,7 @@ // display errors contextually $.each(errors, function(field, msg) { - var formfield = $("[name='" + field + "']"); + var formfield = $("[name='" + field + "'], [data-name='" + field + "']"); var label = $("label[data-field='" + field + "']"); var msgbox = $(".form-control-feedback[data-field='" + field + "']");