<?php 
namespace Jackbooted\Cron; 
 
use \Jackbooted\Forms\Request; 
use \Jackbooted\Forms\Response; 
use \Jackbooted\Html\JS; 
use \Jackbooted\Html\Lists; 
use \Jackbooted\Html\Tag; 
use \Jackbooted\Html\Validator; 
use \Jackbooted\Html\WebPage; 
use \Jackbooted\Html\Widget; 
/** 
 * @copyright Confidential and copyright (c) 2016 Jackbooted Software. All rights reserved. 
 * 
 * Written by Brett Dutton of Jackbooted Software 
 * brett at brettdutton dot com 
 * 
 * This software is written and distributed under the GNU General Public 
 * License which means that its source code is freely-distributed and 
 * available to the general public. 
 */ 
 
class SchedulerManager extends WebPage  { 
 
    /** 
     * @return string 
     */ 
    public static function hello () { 
        return  [ 0, 'Hello World' ]; 
    } 
 
    public function index () { 
        $schedulerList = Scheduler::getList ( true ); 
        $formName = 'SchedulerManager_index'; 
        $id = 'SchedulerManager_table'; 
 
        $js = "$().ready ( function () {\n"; 
 
        $valid = Validator::factory ( $formName ); 
 
        $html = Tag::table ( [ 'id' => $id ] ) . 
                  Tag::tr () . 
                    Tag::th () . 'Upd' .       Tag::_th () . 
                    Tag::th () . 'Del' .       Tag::_th () . 
                    Tag::th () . 'Command' .   Tag::_th () . 
                    Tag::th () . 'Start Date'. Tag::_th () . 
                    Tag::th () . 'Cron'  .     Tag::_th () . 
                    Tag::th () . 'Active'    . Tag::_th () . 
                    Tag::th () . 'Last Run'  . Tag::_th () . 
                  Tag::_tr (); 
 
        if ( count ( $schedulerList ) == 0 ) { 
            $html .= Tag::tr () . 
                       Tag::td (  [ 'colspan' => 20 ] )  . 
                         'No Scheduled Tasks' . 
                       Tag::_td () . 
                     Tag::_tr (); 
        } 
        else { 
            $js .= <<<JS 
                $('input[type=checkbox][name^=fldUpd]').shiftClick(); 
 
JS; 
            $rowIdx = 0; 
            foreach ( $schedulerList as $idx => $schedulerItem ) { 
                $row = '_' . $idx; 
 
                $valid->addExists ( 'fldCommand' . $row, 'Command must exist' ) 
                      ->addExists ( 'fldCron' . $row, 'Interval must exist' ); 
 
                $js .= <<<JS 
                    $( '#fldStartDate$row' ).datetimepicker({ 
                        dateFormat: 'yy-mm-dd', 
                        timeFormat: 'HH:mm' 
                    }); 
JS; 
                $lastRun = ( $schedulerItem->lastRun == '' ) ? '*Never*' : $schedulerItem->lastRun; 
 
                $html .= Tag::tr () . 
                           Tag::td () . 
                             Tag::checkBox( 'fldUpd[]', $idx, false,  [ 'id' => 'U' . $rowIdx ] ) . 
                           Tag::_td () . 
                           Tag::td () . 
                             Tag::linkButton ( '?' . Response::factory() 
                                                             ->set ( 'fldID', $idx ) 
                                                             ->action ( __CLASS__ . '->deleteItem()' ), 
                                               'Delete', 
                                                [ 'onClick' => "confirm('Are you sure?')" ] ) . 
                           Tag::_td () . 
                           Tag::td ( ['width' => '100%', 'nowrap' => 'nowrap' ]) . 
                             Tag::text ( 'fldCommand' . $row,   $schedulerItem->cmd, 
                                          [ 'style' => 'width:100%;', 
                                            'onChange' => "$('#U$rowIdx').attr('checked',true)" ] ) . 
                           Tag::_td () . 
                           Tag::td ( ['nowrap' => 'nowrap' ] ) . 
                             Tag::text ( 'fldStartDate' . $row, $schedulerItem->start, 
                                          [ 'id' => 'fldStartDate' . $row, 
                                            'size' => '18', 
                                            'onChange' => "$('#U$rowIdx').attr('checked',true)" ] ) . 
                           Tag::_td () . 
                           Tag::td ( ['nowrap' => 'nowrap' ] ) . 
                             Tag::text ( 'fldCron' . $row,  $schedulerItem->cron, 
                                          [ 'onChange' => "$('#U$rowIdx').attr('checked',true)" ]  ) . 
                           Tag::_td () . 
                           Tag::td ( ['nowrap' => 'nowrap' ] ) . 
                             Lists::select ( 'fldActive' . $row,  [ 'Yes', 'No' ], 
                                               [ 'default' => $schedulerItem->active, 
                                                 'onChange' => "$('#U$rowIdx').attr('checked',true)" ] ) . 
                           Tag::_td () . 
                           Tag::td ( ['nowrap' => 'nowrap' ] ) . $lastRun . Tag::_td () . 
                         Tag::_tr (); 
                $rowIdx ++; 
            } 
        } 
 
        $html .= Tag::_table (); 
        $js .= '});'; 
 
        return JS::libraryWithDependancies( JS::JQUERY_UI_DATETIME ) . 
               JS::library ( 'jquery.shiftclick.js' ) . 
               JS::javaScript( $js ) . 
               $valid->toHtml() . 
               Widget::styleTable ( '#' . $id ) . 
               Tag::form (  [ 'name' => $formName, 'onSubmit' => $valid->onSubmit() ] ) . 
                 $html . 
                 Response::factory()->action ( __CLASS__ . '->save()' )->toHidden() . 
                 Tag::submit ( 'Save' ) . 
                 Tag::linkButton ( '?' . Response::factory()->action ( __CLASS__ . '->newItem()' ), 'New Item' ) . 
               Tag::_form (); 
    } 
 
    public function save () { 
        foreach ( Request::get ( 'fldUpd',  [] ) as $id ) { 
            $data =  [ 'id'     => $id, 
                       'cmd'    => Request::get ( 'fldCommand_' . $id ), 
                       'start'  => Request::get ( 'fldStartDate_' . $id ), 
                       'cron'   => Request::get ( 'fldCron_' . $id ), 
                       'active' => Request::get ( 'fldActive_' . $id ) ]; 
            Scheduler::factory ( $data )->save (); 
        } 
 
        return Widget::popupWrapper ( 'Saved Item(s)' ) . 
               $this->index (); 
    } 
    public function deleteItem () { 
        $id = Request::get ( 'fldID' ); 
        Scheduler::factory (  [ 'id' => $id ] )->delete (); 
        return Widget::popupWrapper ( 'Deleted Item: ' . $id ) . 
               $this->index (); 
    } 
 
    public function newItem () { 
        $defaults =  [ 'cmd'      => __CLASS__ . '::hello();', 
                       'start'    => strftime ( '%Y-%m-%d %H:%M' ), 
                       'cron'     => '* * * * *', 
                       'active'   => 'No', 
                       'lastRun'  => '' ]; 
        Scheduler::factory ( $defaults )->save (); 
        return Widget::popupWrapper ( 'New Item Created' ) . 
               $this->index (); 
    } 
} 
 
 |