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->viewWeek = $hooks->wrap( $viewWeek ); $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(); $this->slimView = $this->settings->get( 'datetime_month_slim_view' ) ? true : false; } public function render() { $slug = $this->request->getSlug(); $today = $this->t->setNow()->formatDateDb(); $disabledWeekdays = $this->settings->get( 'skip_weekdays', TRUE ); $shifts = $this->common->getShifts(); $params = $this->request->getParams(); $startDate = $params['start']; $startDate = $this->t->setDateDb( $startDate )->setStartMonth()->formatDateDb(); $endDate = $this->t->modify('+1 month')->modify('-1 day')->formatDateDb(); $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(); } $viewShifts = array(); $iknow = array('date'); $allCalendars = $this->common->findAllCalendars(); if( count($allCalendars) <= 1 ) $iknow[] = 'calendar'; $this->shiftsDuration->reset(); 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(); } } $daysInWeek = $this->settings->get('datetime_days_in_week'); if (!$daysInWeek) $daysInWeek = 7; $this->t->setDateDb( $startDate ); $monthMatrix = $this->t->getMonthMatrix($disabledWeekdays, $daysInWeek); $rows = array(); foreach( $monthMatrix as $week => $days ){ $row = array(); foreach( $days as $date ){ if( ! $date ){ $row[] = NULL; continue; } $cell = array(); $dateView = $this->common->renderDateLabel( $date ); $cell[] = $dateView; if( isset($viewShifts[$date]) ){ $shiftsView = $this->viewWeek->renderDay( $viewShifts[$date], $iknow ); $cell[] = $shiftsView; } $to = 'new'; $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 ) // ->setSegments( $weekSegments ) ; return $out; } public function renderByCalendar() { $slug = $this->request->getSlug(); $today = $this->t->setNow()->formatDateDb(); $disabledWeekdays = $this->settings->get( 'skip_weekdays', TRUE ); $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 ); } $params = $this->request->getParams(); $startDate = $params['start']; $startDate = $this->t->setDateDb( $startDate )->setStartMonth()->formatDateDb(); $endDate = $this->t->modify('+1 month')->modify('-1 day')->formatDateDb(); $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 ){ $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[ $calendar->getId() ] = $label; } $viewShifts = array(); $iknow = array('calendar', 'date'); foreach( $shifts as $shift ){ $calendar = $shift->getCalendar(); $id = $calendar ? $calendar->getId() : 0; if( ! array_key_exists($id, $viewShifts) ){ $viewShifts[$id] = array(); } $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[$id]) ){ $viewShifts[$id][$rexDate] = array(); } $viewShifts[$id][$rexDate][] = $shift; } if( ! $shiftAllDay ){ break; } $this->t->modify( '+1 day' ); $rexDate = $this->t->formatDateDb(); } } $header = array(); $header[] = NULL; $weekStartsOn = $this->t->getWeekStartsOn(); $weekSegments = array(); $this->t->setDateDb( $startDate ); $monthMatrix = $this->t->getMonthMatrix( $disabledWeekdays ); foreach( $monthMatrix as $week => $days ){ $wdi = 0; foreach( $days as $date ){ if( ! $date ){ continue; } $dateView = $this->common->renderDateLabelGrouped( $date ); $header[] = $dateView; if( ! $wdi ){ $weekSegments[] = count($header); } $wdi++; } } // while( count($header) < 32 ){ // $header[] = NULL; // } $rows = array(); // link templates to speed things up $toParams = array( 'calendar' => '{CID}', 'date' => '{DATE}' ); $thisTo = 'new/calendar'; $thisTo = array( $thisTo, $toParams ); $thisHref = $this->uri->makeUrl( $thisTo ); $linkTemplateShift = '+'; $linkTemplateShiftMuted = '+'; $isPrintView = $this->request->isPrintView(); foreach( $viewCalendars as $id => $calendarView ){ $row = array(); $this->shiftsDuration->reset(); if( isset($viewShifts[$id]) ){ foreach( $viewShifts[$id] as $date => $dateShifts ){ foreach( $dateShifts 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', array('x1', 'y2')) ->tag('nowrap') ; $row[] = $calendarView; $countDates = count( $dates ); foreach( $dates as $date ){ $cell = array(); if( isset($viewShifts[$id][$date]) ){ if( $countDates <= 10 ){ $shiftsView = $this->viewWeek->renderDay( $viewShifts[$id][$date], $iknow ); } else { $shiftsView = $this->self->renderDay( $viewShifts[$id][$date], $iknow ); } $cell[] = $shiftsView; } $label = '+'; $to = 'new'; $toParams = array( 'date' => $date, 'calendar' => $id, ); 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( $isPrintView ) $addOk = false; if( $addOk ){ /* $link = $this->ui->makeAhref( $to, $label ) ->tag('tab-link') ->tag('align', 'center') ->addAttr('title', '__Add New__') ; if( $today > $date ){ $link->tag('muted', 3); } */ if( $today > $date ){ $link = str_replace( array('{CID}', '{DATE}'), array($id, $date), $linkTemplateShiftMuted ); } else { $link = str_replace( array('{CID}', '{DATE}'), array($id, $date), $linkTemplateShift ); } $cell[] = $link; } $cell = $this->ui->makeList( $cell ) ->gutter(1) ->tag('margin', '05') ; $row[] = $cell; } // while( count($row) < 32 ){ // $row[] = NULL; // } $rows[] = $row; } $out = $this->ui->makeTable( $header, $rows, FALSE ) ->gutter(0) ->setBordered( $this->borderColor ) ->setSegments( $weekSegments ) ->setLabelled( TRUE ) ; if( ! $this->slimView ){ $out->forceColWidth( '6rem' ); $out->forceRowHeaderWidth( '10rem' ); } return $out; } public function renderByEmployee() { $slug = $this->request->getSlug(); $today = $this->t->setNow()->formatDateDb(); $disabledWeekdays = $this->settings->get( 'skip_weekdays', TRUE ); $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 ); } $params = $this->request->getParams(); $startDate = $params['start']; $startDate = $this->t->setDateDb( $startDate )->setStartMonth()->formatDateDb(); $endDate = $this->t->modify('+1 month')->modify('-1 day')->formatDateDb(); $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(); } $countDates = count( $dates ); $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'); $allCalendars = $this->common->findAllCalendars(); if( count($allCalendars) <= 1 ) $iknow[] = 'calendar'; foreach( $shifts as $shift ){ $employee = $shift->getEmployee(); $id = $employee ? $employee->getId() : 0; if( ! array_key_exists($id, $viewShifts) ){ $viewShifts[$id] = array(); } $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[$id]) ){ $viewShifts[$id][$rexDate] = array(); } $viewShifts[$id][$rexDate][] = $shift; } if( ! $shiftAllDay ){ break; } $this->t->modify( '+1 day' ); $rexDate = $this->t->formatDateDb(); } } $header = array(); $header[] = null; $weekStartsOn = $this->t->getWeekStartsOn(); $weekSegments = array(); $this->t->setDateDb( $startDate ); $monthMatrix = $this->t->getMonthMatrix( $disabledWeekdays ); foreach( $monthMatrix as $week => $days ){ $wdi = 0; foreach( $days as $date ){ if( ! $date ){ continue; } $dateView = $this->common->renderDateLabelGrouped( $date ); $header[] = $dateView; if( ! $wdi ){ $weekSegments[] = count($header); } $wdi++; } } // while( count($header) < 32 ){ // $header[] = NULL; // } $rows = array(); // link templates to speed things up $toParams = array( 'employee' => '{EID}', 'date' => '{DATE}' ); $thisTo = 'new'; $thisTo = array( $thisTo, $toParams ); $thisHref = $this->uri->makeUrl( $thisTo ); $linkTemplateShift = '+'; $linkTemplateShiftMuted = '+'; $isPrintView = $this->request->isPrintView(); foreach( $viewEmployees as $id => $employeeView ){ $row = array(); $this->shiftsDuration->reset(); if( isset($viewShifts[$id]) ){ $counted = 0; foreach( $viewShifts[$id] as $date => $dateShifts ){ foreach( $dateShifts as $shift ){ $shiftCalendar = $shift->getCalendar(); // if( $shiftCalendar->isTimeoff() ){ // 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, 'month', $dates, $thisShifts ); $employeeView = $this->ui->makeBlock( $employeeView ) ->tag('padding', array('x1', 'y2')) ->tag('nowrap') ; $row[] = $employeeView; foreach( $dates as $date ){ $cell = array(); if( isset($viewShifts[$id][$date]) ){ if( $this->slimView ){ $shiftsView = $this->self->renderDay( $viewShifts[$id][$date], $iknow ); } else { $shiftsView = $this->viewWeek->renderDay( $viewShifts[$id][$date], $iknow ); } $cell[] = $shiftsView; } $comboId = 0 . '-' . $id; if( isset($this->allCombos[$comboId]) ){ /* $label = '+'; $to = 'new'; $toParams = array( 'date' => $date, 'employee' => $id, ); $to = array( $to, $toParams ); $link = $this->ui->makeAhref( $to, $label ) ->tag('tab-link') ->tag('align', 'center') ->addAttr('title', '__Add New__') ; if( $today > $date ){ $link->tag('muted', 3); } */ if( $today > $date ){ $link = str_replace( array('{EID}', '{DATE}'), array($id, $date), $linkTemplateShiftMuted ); } else { $link = str_replace( array('{EID}', '{DATE}'), array($id, $date), $linkTemplateShift ); } if( ! $isPrintView ){ $cell[] = $link; } } $cell = $this->ui->makeList( $cell ) ->gutter(1) ->tag('margin', '05') ; $row[] = $cell; } // while( count($row) < 32 ){ // $row[] = NULL; // } $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, true ); $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; } } $out = $this->ui->makeTable( $header, $rows, false ) ->gutter(0) ->setBordered( $this->borderColor ) ->setSegments( $weekSegments ) ->setLabelled( true ) ; if( ! $this->slimView ){ $out->forceColWidth( '6rem' ); $out->forceRowHeaderWidth( '10rem' ); } return $out; } public function renderDay( $shifts, $iknow ) { $return = NULL; if( ! $shifts ){ return $return; } $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'; } // 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; } } $return = array(); 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->renderCompact( $shift, $iknow, $groupedQty ); if( ! $noZoom ){ $to = 'shifts/' . $id; $thisView = $this->ui->makeAhref( $to, $thisView ) ->tag('unstyled-link') ->tag('block') ->tag('print') ->addAttr('class', 'sh4-widget-loader') ; } $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') ; $return[] = $thisView; } $return = $this->ui->makeList( $return ) ->gutter(1) ; return $return; } }