self = $hooks->wrap($this); $this->ui = $ui; $this->uri = $uri; $this->t = $t; $this->request = $request; $this->settings = $hooks->wrap( $settings ); $this->newAcl = $hooks->wrap( $newAcl ); $this->widgetDayGrid = $hooks->wrap( $widgetDayGrid ); $this->shiftsDuration = $hooks->wrap( $shiftsDuration ); $this->calendarsQuery = $hooks->wrap( $calendarsQuery ); $this->calendarsPresenter = $hooks->wrap( $calendarsPresenter ); $this->employeesPresenter = $hooks->wrap( $employeesPresenter ); $this->widget = $hooks->wrap( $widget ); $this->common = $hooks->wrap( $common ); $this->shiftsCommon = $hooks->wrap( $shiftsCommon ); $this->allCombos = $this->newAcl->findAllCombos(); $this->allCombosShift = $this->newAcl->findAllCombosShift(); $this->allCombosTimeoff = $this->newAcl->findAllCombosTimeoff(); } public function renderDateLabel( $date ) { $slug = $this->request->getSlug(); $today = $this->t->setNow()->formatDateDb(); $this->t->setDateDb( $date ); $ret = $this->t->getWeekdayName() . ', ' . $this->t->formatDate(); return $ret; } public function render() { $shifts = $this->common->getShifts(); $params = $this->request->getParams(); $today = $this->t->setNow()->formatDateDb(); $startDate = $params['start']; $endDate = $startDate; if( static::$daysToShow > 1 ){ $endDate = $this->t->setDateDb( $startDate )->modify( '+' . (static::$daysToShow - 1) . ' days')->formatDateDb(); } $dayStart = $this->t->setDateDb( $startDate )->formatDateTimeDb(); $dayEnd = $this->t->setDateDb( $endDate )->modify( '+1 day')->formatDateTimeDb(); $disabledWeekdays = $this->settings->get( 'skip_weekdays', TRUE ); $this->t->setDateDb( $startDate ); $dates = array(); $rexDate = $startDate; while( $rexDate <= $endDate ){ if( $disabledWeekdays ){ $wkd = $this->t->getWeekday(); if( in_array($wkd, $disabledWeekdays) ){ $rexDate = $this->t->modify('+1 day')->formatDateDb(); continue; } } $dates[] = $rexDate; $rexDate = $this->t->modify('+1 day')->formatDateDb(); } $endDate = $startDate; $viewShifts = array(); $iknow = array('date'); $this->shiftsDuration->reset(); reset( $shifts ); foreach( $shifts as $shift ){ $this->shiftsDuration->add( $shift ); $start = $shift->getStart(); $end = $shift->getEnd(); $startDayTime = substr($start, 8, 4); $endDayTime = substr($end, 8, 4); $shiftAllDay = ( (0 == $startDayTime) && (0 == $endDayTime) ) ? TRUE : FALSE; $this->t->setDateTimeDb( $end )->modify('-1 second'); $shiftEndDate = $this->t->formatDateDb(); $this->t->setDateTimeDb( $start ); $shiftStartDate = $this->t->formatDateDb(); $rexDate = $shiftStartDate; while( $rexDate <= $shiftEndDate ){ if( in_array($rexDate, $dates) ){ if( ! array_key_exists($rexDate, $viewShifts) ){ $viewShifts[$rexDate] = array(); } $viewShifts[$rexDate][] = $shift; } if( ! $shiftAllDay ){ break; } $this->t->modify( '+1 day' ); $rexDate = $this->t->formatDateDb(); } } $iknow = array('date'); $rows = array(); foreach( $dates as $date ){ $row = array(); $cell = array(); $this->t->setDateDb( $date ); $dateView = $this->self->renderDateLabel( $date ); $cell[] = $dateView; $thisShifts = isset($viewShifts[$date]) ? $viewShifts[$date] : array(); if( $thisShifts ){ $gridView = $this->self->renderDay( $thisShifts, $iknow, $date ); $cell[] = $gridView; } $toParams = array( 'date' => $date ); if( array_key_exists('employee', $params) && (count($params['employee']) == 1) ){ if( ! in_array(-1, $params['employee']) ){ $toParams['employee'] = $params['employee'][0]; } } $links = array(); if( $this->allCombosShift ){ $label = '+' . ' ' . '__Shift__'; $thisTo = 'new/shift'; $thisTo = array( $thisTo, $toParams ); $link = $this->ui->makeAhref( $thisTo, $label ) ->tag('tab-link') ->tag('align', 'center') // ->addAttr('title', '__Add New__') ; if( $today > $date ){ $link->tag('muted', 3); } $links[] = $link; } if( $this->allCombosTimeoff ){ $label = '+' . ' ' . '__Time Off__'; $thisTo = 'new/timeoff'; $thisTo = array( $thisTo, $toParams ); $link = $this->ui->makeAhref( $thisTo, $label ) ->tag('tab-link') ->tag('align', 'center') // ->addAttr('title', '__Add New__') ; if( $today > $date ){ $link->tag('muted', 3); } $links[] = $link; } $links = $this->ui->makeList( $links )->gutter(0); $cell[] = $links; $cell = $this->ui->makeList( $cell ) ->gutter(1) ->tag('margin', 1) ; $row[] = $cell; $rows[] = $row; } $out = $this->ui->makeTable( NULL, $rows, FALSE ) ->gutter(0) // ->setBordered( $this->borderColor ) ; return $out; } public function renderByCalendar() { $calendars = $this->common->getCalendars(); $employees = $this->common->getEmployees(); $shifts = $this->common->getShifts(); // finalize calendars to include those that employee was removed from but still have shifts in $listCalendarId = array_keys( $calendars ); $dictCalendarId = array_combine( $listCalendarId, $listCalendarId ); foreach( $shifts as $shift ){ $calendar = $shift->getCalendar(); if( ! $calendar ) continue; $calendarId = $calendar->getId(); $dictCalendarId[ $calendarId ] = $calendarId; } if( count($dictCalendarId) > count($calendars) ){ $allCalendars = $this->common->findAllCalendars(); $calendars = array_intersect_key( $allCalendars, $dictCalendarId ); } // we can probably have archived calendars so if such calendars have no shifts then skip them $removeArchivedCalendars = array(); foreach( $calendars as $calendar ){ if( $calendar->isArchived() ){ $removeArchivedCalendars[ $calendar->getId() ] = $calendar->getId(); } } if( $removeArchivedCalendars ){ foreach( $shifts as $shift ){ $calendar = $shift->getCalendar(); $id = $calendar ? $calendar->getId() : 0; if( isset($removeArchivedCalendars[$id]) ){ unset( $removeArchivedCalendars[$id] ); } if( ! $removeArchivedCalendars ){ break; } } foreach( $removeArchivedCalendars as $id ){ unset( $calendars[$id] ); } reset( $shifts ); } $today = $this->t->setNow()->formatDateDb(); $disabledWeekdays = $this->settings->get( 'skip_weekdays', TRUE ); $params = $this->request->getParams(); $startDate = $params['start']; $endDate = $startDate; if( static::$daysToShow > 1 ){ $endDate = $this->t->setDateDb( $startDate )->modify( '+' . (static::$daysToShow - 1) . ' days')->formatDateDb(); } $dayStart = $this->t->setDateDb( $startDate )->formatDateTimeDb(); $dayEnd = $this->t->setDateDb( $endDate )->modify( '+1 day')->formatDateTimeDb(); $disabledWeekdays = $this->settings->get( 'skip_weekdays', TRUE ); $this->t->setDateDb( $startDate ); $dates = array(); $rexDate = $startDate; while( $rexDate <= $endDate ){ if( $disabledWeekdays ){ $wkd = $this->t->getWeekday(); if( in_array($wkd, $disabledWeekdays) ){ $rexDate = $this->t->modify('+1 day')->formatDateDb(); continue; } } $dates[] = $rexDate; $rexDate = $this->t->modify('+1 day')->formatDateDb(); } $viewCalendars = array(); foreach( $calendars as $calendar ){ $calendarId = $calendar->getId(); $label = $this->calendarsPresenter->presentTitle( $calendar ); $title = htmlspecialchars( $calendar->getTitle() ); $description = $calendar->getDescription(); if( strlen($description) ){ $description = htmlspecialchars( $description ); $title .= "\n" . $description; } $label = $this->ui->makeSpan( $label ) ->addAttr( 'title', $title ) ; $viewCalendars[ $calendarId ] = $label; } $viewShifts = array(); $iknow = array('calendar', 'date'); $hori = FALSE; $allEmployees = $this->common->findAllEmployees(); if( count($allEmployees) < 2 ){ $iknow[] = 'employee'; } $out = array(); reset( $dates ); foreach( $dates as $date ){ $thisOut = array(); $rows = array(); $this->t->setDateDb( $date ); $dateView = $this->self->renderDateLabel( $date ); $thisOut[] = $dateView; $viewShifts = array(); reset( $shifts ); foreach( $shifts as $shift ){ $start = $shift->getStart(); $end = $shift->getEnd(); $startDate = $this->t->setDateTimeDb( $start )->formatDateDb(); // echo "START '$startDate' VS '$date'
"; if( $startDate > $date ){ continue; } $endDate = $this->t->setDateTimeDb( $end )->formatDateDb(); // echo "END '$endDate' VS '$date'
"; if( $endDate < $date ){ continue; } // echo "'$startDate' - '$endDate' VS '$date' OK

"; $calendar = $shift->getCalendar(); $id = $calendar->getId(); if( ! array_key_exists($id, $viewShifts) ){ $viewShifts[$id] = array(); } $viewShifts[$id][] = $shift; } $header = array(); $header[] = NULL; $header[] = NULL; $dayStart = $this->t->setDateDb( $startDate )->formatDateTimeDb(); $dayEnd = $this->t->setDateDb( $startDate )->modify('+1 day')->formatDateTimeDb(); reset( $viewCalendars ); foreach( $viewCalendars as $id => $calendarView ){ $row = array(); $this->shiftsDuration->reset(); if( isset($viewShifts[$id]) ){ foreach( $viewShifts[$id] as $shift ){ $this->shiftsDuration->add( $shift ); } $outReport = $this->common->renderReport( $this->shiftsDuration, FALSE ); $outReport = $this->ui->makeSpan( $outReport ) ->tag('font-size', 2) ; $calendarView = $this->ui->makeList( array($calendarView, $outReport) ) ->gutter(1) ; } $calendarView = $this->ui->makeBlock( $calendarView ) ->tag('padding', 2) ->tag('nowrap') ; $row[] = $calendarView; $cell = array(); if( isset($viewShifts[$id]) ){ $gridView = $this->self->renderDay( $viewShifts[$id], $iknow, $date ); $cell[] = $gridView; } $thisCalendar = $calendars[$id]; if( $thisCalendar->isTimeoff() ){ $label = '+ ' . '__Time Off__'; } else { $label = '+ ' . '__Shift__'; } $to = 'new/calendar'; $toParams = array( 'calendar' => $id, 'date' => $date, ); if( array_key_exists('employee', $params) && (count($params['employee']) == 1) ){ if( ! in_array(-1, $params['employee']) ){ $toParams['employee'] = $params['employee'][0]; } } $to = array( $to, $toParams ); $addOk = FALSE; if( isset($toParams['employee']) ){ $testComboId = $id . '-' . $toParams['employee']; if( isset($this->allCombos[$testComboId]) ){ $addOk = TRUE; } } else { $testComboId = $id . '-'; reset( $this->allCombos ); foreach( $this->allCombos as $comboId ){ if( $testComboId == substr($comboId, 0, strlen($testComboId)) ){ $addOk = TRUE; break; } } } if( $addOk ){ $link = $this->ui->makeAhref( $to, $label ) ->tag('tab-link') ->tag('align', 'center') ; if( $today > $date ){ $link->tag('muted', 3); } $cell[] = $link; } $cell = $this->ui->makeList( $cell ) ->gutter(1) ->tag('margin', 1) ; $row[] = $cell; $rows[] = $row; } $thisOut[] = $this->ui->makeTable( $header, $rows, FALSE ) ->gutter(0) ->setBordered( $this->borderColor ) // ->setSegments( $weekSegments ) ->setLabelled( TRUE ) ; $thisOut = $this->ui->makeList( $thisOut ); $out[] = $thisOut; } $out = $this->ui->makeList( $out ); return $out; } public function renderByEmployee() { $calendars = $this->common->getCalendars(); $employees = $this->common->getEmployees(); $shifts = $this->common->getShifts(); // finalize employees to include those that employee was removed from but still have shifts in $listEmployeeId = array_keys( $employees ); $dictEmployeeId = array_combine( $listEmployeeId, $listEmployeeId ); foreach( $shifts as $shift ){ $employee = $shift->getEmployee(); if( ! $employee ) continue; $employeeId = $employee->getId(); $dictEmployeeId[ $employeeId ] = $employeeId; } if( count($dictEmployeeId) > count($employees) ){ $allEmployees = $this->common->findAllEmployees(); $employees = array_intersect_key( $allEmployees, $dictEmployeeId ); } // we can probably have archived employees so if such employees have no shifts then skip them $removeArchivedEmployees = array(); foreach( $employees as $employee ){ if( $employee->isArchived() ){ $removeArchivedEmployees[ $employee->getId() ] = $employee->getId(); } } if( $removeArchivedEmployees ){ foreach( $shifts as $shift ){ $employee = $shift->getEmployee(); $id = $employee ? $employee->getId() : 0; if( isset($removeArchivedEmployees[$id]) ){ unset( $removeArchivedEmployees[$id] ); } if( ! $removeArchivedEmployees ){ break; } } foreach( $removeArchivedEmployees as $id ){ unset( $employees[$id] ); } reset( $shifts ); } $today = $this->t->setNow()->formatDateDb(); $disabledWeekdays = $this->settings->get( 'skip_weekdays', TRUE ); $params = $this->request->getParams(); $startDate = $params['start']; $endDate = $startDate; if( static::$daysToShow > 1 ){ $endDate = $this->t->setDateDb( $startDate )->modify( '+' . (static::$daysToShow - 1) . ' days')->formatDateDb(); } $dayStart = $this->t->setDateDb( $startDate )->formatDateTimeDb(); $dayEnd = $this->t->setDateDb( $endDate )->modify( '+1 day')->formatDateTimeDb(); $disabledWeekdays = $this->settings->get( 'skip_weekdays', TRUE ); $this->t->setDateDb( $startDate ); $dates = array(); $rexDate = $startDate; while( $rexDate <= $endDate ){ if( $disabledWeekdays ){ $wkd = $this->t->getWeekday(); if( in_array($wkd, $disabledWeekdays) ){ $rexDate = $this->t->modify('+1 day')->formatDateDb(); continue; } } $dates[] = $rexDate; $rexDate = $this->t->modify('+1 day')->formatDateDb(); } $viewEmployees = array(); foreach( $employees as $employee ){ $label = $this->employeesPresenter->presentTitle( $employee ); $title = htmlspecialchars( $label ); $description = $employee->getDescription(); if( strlen($description) ){ $imgpos = strpos( $description, 'ui->makeList( array($label, $description) ); } else { $title .= "\n" . htmlspecialchars( $description ); } } $label = $this->ui->makeSpan( $label ) ->tag( 'font-size', 4 ) ->addAttr( 'title', $title ) ; $viewEmployees[ $employee->getId() ] = $label; } $viewShifts = array(); $iknow = array('employee', 'date'); $hori = FALSE; $out = array(); reset( $dates ); foreach( $dates as $date ){ $thisOut = array(); $thisOut = array(); $rows = array(); $this->t->setDateDb( $date ); $dateView = $this->self->renderDateLabel( $date ); $thisOut[] = $dateView; $viewShifts = array(); foreach( $shifts as $shift ){ $employee = $shift->getEmployee(); $id = $employee ? $employee->getId() : 0; if( ! array_key_exists($id, $viewShifts) ){ $viewShifts[$id] = array(); } $viewShifts[$id][] = $shift; } $header = array(); $header[] = NULL; $header[] = NULL; $rows = array(); foreach( $viewEmployees as $id => $employeeView ){ $row = array(); $this->shiftsDuration->reset(); if( isset($viewShifts[$id]) ){ $counted = 0; foreach( $viewShifts[$id] as $shift ){ $shiftCalendar = $shift->getCalendar(); // if( ! $shiftCalendar->isShift() ){ // continue; // } $this->shiftsDuration->add( $shift ); $counted++; } if( $counted ){ $outReport = $this->common->renderReport( $this->shiftsDuration, FALSE ); $outReport = $this->ui->makeSpan( $outReport ) ->tag('font-size', 2) ; $employeeView = $this->ui->makeList( array($employeeView, $outReport) ) ->gutter(1) ; } } $thisShifts = isset( $view_shifts[$id] ) ? $view_shifts[$id] : array(); $employeeView = $this->common->employeeRowLabel( $employeeView, $id, 'day', $dates, $thisShifts ); $employeeView = $this->ui->makeBlock( $employeeView ) ->tag('padding', 2) ->tag('nowrap') ; $row[] = $employeeView; $cell = array(); if( isset($viewShifts[$id]) ){ $gridView = $this->self->renderDay( $viewShifts[$id], $iknow, $date ); $cell[] = $gridView; } $toParams = array( 'employee' => $id, 'date' => $date ); $links = array(); $comboId = 0 . '-' . $id; if( isset($this->allCombosShift[$comboId]) ){ $label = '+' . ' ' . '__Shift__'; $thisTo = 'new/shift'; $thisTo = array( $thisTo, $toParams ); $link = $this->ui->makeAhref( $thisTo, $label ) ->tag('tab-link') ->tag('align', 'center') // ->addAttr('title', '__Add New__') ; if( $today > $date ){ $link->tag('muted', 3); } $links[] = $link; } if( isset($this->allCombosTimeoff[$comboId]) ){ $label = '+' . ' ' . '__Time Off__'; $thisTo = 'new/timeoff'; $thisTo = array( $thisTo, $toParams ); $link = $this->ui->makeAhref( $thisTo, $label ) ->tag('tab-link') ->tag('align', 'center') // ->addAttr('title', '__Add New__') ; if( $today > $date ){ $link->tag('muted', 3); } $links[] = $link; } $links = $this->ui->makeList( $links )->gutter(0); $cell[] = $links; $cell = $this->ui->makeList( $cell ) ->gutter(1) ->tag('margin', 1) ; $row[] = $cell; $rows[] = $row; } /* append calendars summary */ $appendCalendars = $this->settings->get('datetime_summary_by_calendar'); if( $appendCalendars && $shifts ){ $calendarIds = array(); foreach( $shifts as $shift ){ $calendar = $shift->getCalendar(); $calendarId = $calendar ? $calendar->getId() : 0; if( ! $calendarId ) continue; $calendarIds[ $calendarId ] = $calendarId; } $calendars = $this->calendarsQuery->findManyById( $calendarIds ); $shiftsByCalendar = $shiftsByDate = array(); foreach( $shifts as $shift ){ $thisCalendar = $shift->getCalendar(); if( ! $thisCalendar ) continue; $shiftId = $shift->getId(); $thisCalendarId = $thisCalendar->getId(); $shiftsByCalendar[ $thisCalendarId ][ $shiftId ] = $shift; $start = $shift->getStart(); $end = $shift->getEnd(); $startDayTime = substr($start, 8, 4); $endDayTime = substr($end, 8, 4); $shiftAllDay = ( (0 == $startDayTime) && (0 == $endDayTime) ) ? TRUE : FALSE; $this->t->setDateTimeDb( $end )->modify('-1 second'); $shiftEndDate = $this->t->formatDateDb(); $this->t->setDateTimeDb( $start ); $shiftStartDate = $this->t->formatDateDb(); $rexDate = $shiftStartDate; while( $rexDate <= $shiftEndDate ){ if( in_array($rexDate, $dates) ){ $shiftsByDate[ $rexDate ][ $shiftId ] = $shift; } if( ! $shiftAllDay ){ break; } $this->t->modify( '+1 day' ); $rexDate = $this->t->formatDateDb(); } } foreach( $calendars as $calendarId => $calendar ){ $row = array(); $calendarView = $this->calendarsPresenter->presentTitle( $calendar ); $title = htmlspecialchars( $calendar->getTitle() ); $calendarView = $this->ui->makeSpan( $calendarView ) ->addAttr( 'title', $title ) ; $this->shiftsDuration->reset(); foreach( $shiftsByCalendar[$calendarId] as $shift ){ $this->shiftsDuration->add( $shift ); } $outReport = $this->common->renderReport( $this->shiftsDuration, FALSE ); $outReport = $this->ui->makeSpan( $outReport ) ->tag('font-size', 2) ; $calendarView = $this->ui->makeList( array($calendarView, $outReport) ) ->gutter(1) ; $calendarView = $this->ui->makeBlock( $calendarView ) ->tag('padding', 2) ->tag('nowrap') ; $row[] = $calendarView; foreach( $dates as $date ){ $cell = ''; if( isset($shiftsByDate[$date]) ){ $thisShifts = array_intersect_key( $shiftsByDate[$date], $shiftsByCalendar[$calendarId] ); if( $thisShifts ){ $this->shiftsDuration->reset(); foreach( $thisShifts as $shift ){ $this->shiftsDuration->add( $shift ); } $outReport = $this->common->renderReport( $this->shiftsDuration, FALSE ); $outReport = $this->ui->makeSpan( $outReport ) ->tag('font-size', 2) ; $outReport = $this->ui->makeBlock( $outReport ) ->tag('align', 'center') ; $cell = $outReport; } } $row[] = $cell; } $rows[] = $row; } } $thisOut[] = $this->ui->makeTable( $header, $rows, FALSE ) ->gutter(0) ->setBordered( $this->borderColor ) // ->setSegments( $weekSegments ) ->setLabelled( TRUE ) ; $thisOut = $this->ui->makeList( $thisOut ); $out[] = $thisOut; } $out = $this->ui->makeList( $out ); return $out; } public function renderDay( $shifts, $iknow, $startDate = NULL ) { $hori = FALSE; $params = $this->request->getParams(); $hideui = $params['hideui']; $noZoom = in_array('shiftdetails', $hideui); if( array_key_exists('employee', $params) && (count($params['employee']) == 1) ){ if( ! in_array(-1, $params['employee']) ){ $iknow[] = 'employee'; } } if( array_key_exists('calendar', $params) && (count($params['calendar']) == 1) ){ $iknow[] = 'calendar'; } if( NULL === $startDate ){ $startDate = $params['start']; } $this->t->setDateDb( $startDate ); $minTime = $this->settings->get('datetime_min_time'); if( $minTime ){ $this->t->modify('+' . $minTime . ' seconds'); } $dayStart = $this->t->formatDateTimeDb(); $this->t->setDateDb( $startDate ); $maxTime = $this->settings->get('datetime_max_time'); if( $maxTime ){ $this->t->modify('+' . $maxTime . ' seconds'); } else { $this->t->modify('+1 day'); } $dayEnd = $this->t->formatDateTimeDb(); // echo "DAY END $dayEnd
"; // exit; // check if we need to extend ranges to show overtime shifts if( $shifts ){ $this->t->setDateDb( $startDate )->modify('+1 day'); $minCheckEnd = $this->t->formatDateTimeDb(); $this->t->modify('+1 day'); $maxCheckEnd = $this->t->formatDateTimeDb(); foreach( $shifts as $shift ){ $thisStart = $shift->getStart(); $thisEnd = $shift->getEnd(); // if( ($thisStart < $dayEnd) && ($thisEnd > $minCheckEnd) && ($thisEnd < $maxCheckEnd) ){ if( ($thisEnd > $minCheckEnd) && ($thisEnd < $maxCheckEnd) ){ if( $thisEnd > $dayEnd ){ $dayEnd = $thisEnd; } } } } $grid = $this->widgetDayGrid ->reset() ; $grid->setRange( $dayStart, $dayEnd ); // groups? $groups = array(); $groupedShifts = array(); reset( $shifts ); foreach( $shifts as $shift ){ if( ! $shift->isOpen() ){ continue; } $groupId = $shift->getGroupingId(); if( ! isset($groups[$groupId]) ){ $groups[ $groupId ] = $shift->getId(); $groupedShifts[ $shift->getId() ] = array( $shift->getId() => $shift ); } else { $mainShiftId = $groups[ $groupId ]; $groupedShifts[ $mainShiftId ][ $shift->getId() ] = $shift; $groupedShifts[ $shift->getId() ] = 0; } } reset( $shifts ); foreach( $shifts as $shift ){ $id = $shift->getId(); if( isset($groupedShifts[$id]) && (! $groupedShifts[$id]) ){ continue; } $groupedQty = NULL; if( isset($groupedShifts[$id]) && (count($groupedShifts[$id]) > 1) ){ $groupedQty = count($groupedShifts[$id]); } $thisView = $this->widget->render( $shift, $iknow, $hori, $noZoom, $groupedQty ); $shiftId = $shift->getId(); $buildMenuFromShifts = isset($groupedShifts[$id]) ? $groupedShifts[$id] : array( $shift ); $menu = $this->shiftsCommon->bulkMenu( $buildMenuFromShifts ); if( $menu ){ $thisView = $this->ui->makeCollection( array($thisView, $menu) ); } $thisView = $this->ui->makeBlock( $thisView ) ->tag('block') ->addAttr('class', 'sh4-shift-widget') ->addAttr('style', 'padding-right: 1px;') ; $grid ->add( $shift->getStart(), $shift->getEnd(), $thisView ) ; } $return = $grid->render(); return $return; } }