From 8513e563f6486f822625db88e70611f2932d6fc7 Mon Sep 17 00:00:00 2001 From: Ramon Gutierrez Date: Sun, 18 Feb 2018 16:33:57 +0800 Subject: [PATCH 1/3] Add dayofweek namevalue #8 --- src/Ramcar/DayOfWeek.php | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/Ramcar/DayOfWeek.php diff --git a/src/Ramcar/DayOfWeek.php b/src/Ramcar/DayOfWeek.php new file mode 100644 index 00000000..086783b8 --- /dev/null +++ b/src/Ramcar/DayOfWeek.php @@ -0,0 +1,24 @@ + 'Monday', + '2' => 'Tuesday', + '3' => 'Wednesday', + '4' => 'Thursday', + '5' => 'Friday', + '6' => 'Saturday', + '7' => 'Sunday' + ]; +} From 3c27cf53bf229ec5bada9b0d9478e9bf8eead21f Mon Sep 17 00:00:00 2001 From: Ramon Gutierrez Date: Sun, 18 Feb 2018 16:34:09 +0800 Subject: [PATCH 2/3] Add riderschedule entity #8 --- src/Entity/Rider.php | 42 ++++++++++ src/Entity/RiderSchedule.php | 144 +++++++++++++++++++++++++++++++++++ 2 files changed, 186 insertions(+) create mode 100644 src/Entity/RiderSchedule.php diff --git a/src/Entity/Rider.php b/src/Entity/Rider.php index a99e8bae..d6bdb173 100644 --- a/src/Entity/Rider.php +++ b/src/Entity/Rider.php @@ -6,6 +6,7 @@ use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Criteria; /** * @ORM\Entity @@ -24,12 +25,14 @@ class Rider // first name /** * @ORM\Column(type="string", length=50, nullable=true) + * @Assert\NotBlank() */ protected $first_name; // last name /** * @ORM\Column(type="string", length=50, nullable=true) + * @Assert\NotBlank() */ protected $last_name; @@ -71,9 +74,16 @@ class Rider */ protected $curr_rating; + // day schedules for rider + /** + * @ORM\OneToMany(targetEntity="RiderSchedule", mappedBy="rider", cascade={"persist"}) + */ + protected $schedules; + public function __construct() { $this->job_orders = new ArrayCollection(); + $this->schedules = new ArrayCollection(); $this->curr_rating = 0; } @@ -169,4 +179,36 @@ class Rider { return $this->curr_rating; } + + public function addSchedule(RiderSchedule $schedule) + { + $this->schedules->add($schedule); + return $this; + } + + public function clearSchedules() + { + $this->schedules->clear(); + return $this; + } + + public function removeSchedule(RiderSchedule $schedule) + { + $this->schedules->removeElement($schedule); + return $this; + } + + public function getSchedules() + { + return $this->schedules; + } + + public function getScheduleForDay($day_of_week) + { + $criteria = Criteria::create(); + $criteria->where(Criteria::expr()->eq('day_of_week', $day_of_week)) + ->getFirstResult(1); + + return $this->schedules->matching($criteria)[0]; + } } diff --git a/src/Entity/RiderSchedule.php b/src/Entity/RiderSchedule.php new file mode 100644 index 00000000..d805af05 --- /dev/null +++ b/src/Entity/RiderSchedule.php @@ -0,0 +1,144 @@ +time_start = new DateTime(); + $this->time_end = new DateTime(); + $this->break_start = new DateTime(); + $this->break_end = new DateTime(); + } + + public function getID() + { + return $this->id; + } + + public function setRider(Rider $rider) + { + $this->rider = $rider; + return $this; + } + + public function getRider() + { + return $this->rider; + } + + public function setDayOfWeek($day) + { + $this->day_of_week = $day; + return $this; + } + + public function getDayOfWeek() + { + return $this->day_of_week; + } + + public function setTimeStart($time) + { + $this->time_start = $this->parseTime($time); + return $this; + } + + public function getTimeStart() + { + return $this->time_start; + } + + public function setTimeEnd($time) + { + $this->time_end = $this->parseTime($time); + return $this; + } + + public function getTimeEnd() + { + return $this->time_end; + } + + public function setBreakStart($time) + { + $this->break_start = $this->parseTime($time); + return $this; + } + + public function getBreakStart() + { + return $this->break_start; + } + + public function setBreakEnd($time) + { + $this->break_end = $this->parseTime($time); + return $this; + } + + public function getBreakEnd() + { + return $this->break_end; + } + + protected function parseTime($string, $format = 'g:i A') + { + return DateTime::createFromFormat($format, $string) ?? null; + } +} From a4ae8f472675298e31baa2a50ce0d795be43d2c7 Mon Sep 17 00:00:00 2001 From: Ramon Gutierrez Date: Sun, 18 Feb 2018 16:34:30 +0800 Subject: [PATCH 3/3] 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 + "']");