CC-3174 : Show builder

creating a scheduling system to work with the new timeline in mind using propel.
This commit is contained in:
Naomi Aro 2012-01-27 21:06:04 +01:00
parent f5761fd03c
commit 3f3117cf0e
8 changed files with 175 additions and 27 deletions

View File

@ -29,6 +29,13 @@ $pages = array(
'action' => 'index', 'action' => 'index',
'resource' => 'library' 'resource' => 'library'
), ),
array(
'label' => 'Show Builder',
'module' => 'default',
'controller' => 'Showbuilder',
'action' => 'index',
'resource' => 'showbuilder'
),
array( array(
'label' => 'Calendar', 'label' => 'Calendar',
'module' => 'default', 'module' => 'default',

View File

@ -232,8 +232,8 @@ class LibraryController extends Zend_Controller_Action
public function contentsAction() public function contentsAction()
{ {
$post = $this->getRequest()->getPost(); $params = $this->getRequest()->getParams();
$datatables = Application_Model_StoredFile::searchFilesForPlaylistBuilder($post); $datatables = Application_Model_StoredFile::searchFilesForPlaylistBuilder($params);
//format clip lengh to 1 decimal //format clip lengh to 1 decimal
foreach($datatables["aaData"] as &$data){ foreach($datatables["aaData"] as &$data){

View File

@ -26,13 +26,8 @@ class ShowbuilderController extends Zend_Controller_Action
$request = $this->getRequest(); $request = $this->getRequest();
$baseUrl = $request->getBaseUrl(); $baseUrl = $request->getBaseUrl();
$this->view->headScript()->appendFile($baseUrl.'/js/timepicker/jquery.ui.timepicker.js','text/javascript');
$this->view->headScript()->appendScript("var serverTimezoneOffset = ".date("Z")."; //in seconds"); $this->view->headScript()->appendScript("var serverTimezoneOffset = ".date("Z")."; //in seconds");
//$this->view->headScript()->appendFile($baseUrl.'/js/datatables/js/jquery.dataTables.js','text/javascript'); $this->view->headScript()->appendFile($baseUrl.'/js/timepicker/jquery.ui.timepicker.js','text/javascript');
//$this->view->headScript()->appendFile($baseUrl.'/js/datatables/plugin/dataTables.ColVis.js','text/javascript');
//$this->view->headScript()->appendFile($baseUrl.'/js/datatables/plugin/dataTables.ColReorder.js','text/javascript');
$this->view->headScript()->appendFile($baseUrl.'/js/datatables/plugin/dataTables.FixedHeader.js','text/javascript');
$this->view->headScript()->appendFile($baseUrl.'/js/airtime/showbuilder/builder.js','text/javascript'); $this->view->headScript()->appendFile($baseUrl.'/js/airtime/showbuilder/builder.js','text/javascript');
$this->view->headLink()->appendStylesheet($baseUrl.'/css/jquery.ui.timepicker.css'); $this->view->headLink()->appendStylesheet($baseUrl.'/css/jquery.ui.timepicker.css');
@ -64,12 +59,44 @@ class ShowbuilderController extends Zend_Controller_Action
$request = $this->getRequest(); $request = $this->getRequest();
$show_instance_id = $request->getParam("sid", 0); $instance = $request->getParam("instance", null);
$scheduled_item_id = $request->getParam("time", 0); $id = $request->getParam("id", null);
$scheduled_start = $request->getParam("start", 0); $starts_epoch = $request->getParam("start", null);
$file_id = $request->getParam("file", null);
//snap to previous/next default. $startDT = DateTime::createFromFormat("U", $starts_epoch, new DateTimeZone("UTC"));
$scheduled_type = $request->getParam("type", 0);
//invalid request
if (is_null($start)) {
return;
}
//updating a scheduled item.
if (isset($id)) {
$schedItem = CcScheduleQuery::create()->findPK($id);
$duration = $schedItem->getDbEnds('U') - $schedItem->getDbStarts('U');
$endDT = DateTime::createFromFormat("U", $starts_epoch + $duration, new DateTimeZone("UTC"));
$oldInstance = $schedItem->getDbInstanceId();
if ($instance === $oldInstance) {
CcScheduleQuery::create()
->filterByDbInstanceId($oldInstance)
->find();
}
//file was dragged out of the show into another show or scheduled not within a show.
else {
}
}
else {
$schedItem = new CcSchedule();
}
$schedItem->setDbStarts($startDT);
$schedItem->setDbEnds($endDT);
$schedItem->save();
} }
} }

View File

@ -0,0 +1,70 @@
<?php
class Application_Model_Scheduler {
private $propSched;
public function __construct($id = null) {
if (is_null($id)) {
$this->propSched = new CcSchedule();
}
else {
$this->propSched = CcScheduleQuery::create()->findPK($id);
}
}
/*
public function findScheduledItems($starts, $ends) {
CcScheduleQuery::create()
->filterByDbStarts(array('min' => $starts->format('Y-m-d H:i:s'), 'max' => $ends->format('Y-m-d H:i:s')))
->find();
}
*/
public function addScheduledItem($starts, $duration, $adjustSched = true) {
}
/*
* @param DateTime $starts
*/
public function updateScheduledItem($p_newStarts, $p_adjustSched = true) {
$origStarts = $this->propSched->getDbStarts(null);
$diff = $origStarts->diff($p_newStarts);
//item is scheduled further in future
if ($diff->format("%R") === "+") {
CcScheduleQuery::create()
->filterByDbStarts($this->propSched->getDbStarts(), Criteria::GREATER_THAN)
->filterByDbId($this->propSched->getDbId(), Criteria::NOT_EQUAL)
->find();
}
//item has been scheduled earlier
else {
CcScheduleQuery::create()
->filterByDbStarts($this->propSched->getDbStarts(), Criteria::GREATER_THAN)
->filterByDbId($this->propSched->getDbId(), Criteria::NOT_EQUAL)
->find();
}
}
public function removeScheduledItem($adjustSched = true) {
if ($adjustSched === true) {
$duration = $this->propSched->getDbEnds('U') - $this->propSched->getDbStarts('U');
CcScheduleQuery::create()
->filterByDbInstanceId()
->filterByDbStarts()
->find();
}
$this->propSched->delete();
}
}

View File

@ -14,7 +14,9 @@ class Application_Model_ShowBuilder {
"id" => "", "id" => "",
"instance" => "", "instance" => "",
"starts" => "", "starts" => "",
"startsUnix" => null,
"ends" => "", "ends" => "",
"endsUnix" => null,
"runtime" => "", "runtime" => "",
"title" => "", "title" => "",
"creator" => "", "creator" => "",
@ -73,7 +75,10 @@ class Application_Model_ShowBuilder {
$row["header"] = true; $row["header"] = true;
$row["starts"] = $showStartDT->format("Y-m-d H:i"); $row["starts"] = $showStartDT->format("Y-m-d H:i");
$row["startsUnix"] = $showStartDT->format("U");
$row["ends"] = $showEndDT->format("Y-m-d H:i"); $row["ends"] = $showEndDT->format("Y-m-d H:i");
$row["endsUnix"] = $showEndDT->format("U");
$row["duration"] = $showEndDT->format("U") - $showStartDT->format("U");
$row["title"] = $p_item["show_name"]; $row["title"] = $p_item["show_name"];
return $row; return $row;
@ -94,7 +99,10 @@ class Application_Model_ShowBuilder {
$row["id"] = $p_item["sched_id"]; $row["id"] = $p_item["sched_id"];
$row["instance"] = $p_item["si_id"]; $row["instance"] = $p_item["si_id"];
$row["starts"] = $schedStartDT->format("H:i:s"); $row["starts"] = $schedStartDT->format("H:i:s");
$row["startsUnix"] = $schedStartDT->format("U");
$row["ends"] = $schedEndDT->format("H:i:s"); $row["ends"] = $schedEndDT->format("H:i:s");
$row["endsUnix"] = $schedEndDT->format("U");
$row["duration"] = $schedEndDT->format("U") - $schedStartDT->format("U");
$row["runtime"] = $this->formatDuration($runtime); $row["runtime"] = $this->formatDuration($runtime);
$row["title"] = $p_item["file_track_title"]; $row["title"] = $p_item["file_track_title"];
$row["creator"] = $p_item["file_artist_name"]; $row["creator"] = $p_item["file_artist_name"];

View File

@ -804,6 +804,8 @@ class Application_Model_StoredFile {
$sql = $selectorRows." FROM ".$fromTable." ORDER BY ".$orderby." OFFSET ".$data["iDisplayStart"]." LIMIT ".$data["iDisplayLength"]; $sql = $selectorRows." FROM ".$fromTable." ORDER BY ".$orderby." OFFSET ".$data["iDisplayStart"]." LIMIT ".$data["iDisplayLength"];
} }
Logging::log($sql);
$results = $CC_DBC->getAll($sql); $results = $CC_DBC->getAll($sql);
if(!isset($totalDisplayRows)) { if(!isset($totalDisplayRows)) {

View File

@ -273,7 +273,7 @@ function saveNumEntriesSetting() {
* Use user preference for number of entries to show * Use user preference for number of entries to show
*/ */
function getNumEntriesPreference(data) { function getNumEntriesPreference(data) {
return parseInt(data.libraryInit.numEntries); return parseInt(data.libraryInit.numEntries, 10);
} }
function groupAdd() { function groupAdd() {
@ -457,11 +457,12 @@ function createDataTable(data) {
dTable = $('#library_display').dataTable( { dTable = $('#library_display').dataTable( {
"bProcessing": true, "bProcessing": true,
"bServerSide": true, "bServerSide": true,
"sAjaxSource": "/Library/contents/format/json", "sAjaxSource": "/Library/contents",
"fnServerData": function ( sSource, aoData, testCallback ) { "fnServerData": function ( sSource, aoData, testCallback ) {
aoData.push( { name: "format", value: "json"} );
$.ajax( { $.ajax( {
"dataType": 'json', "dataType": 'json',
"type": "POST", "type": "GET",
"url": sSource, "url": sSource,
"data": aoData, "data": aoData,
"success": testCallback "success": testCallback
@ -490,7 +491,7 @@ function createDataTable(data) {
"sSearch": "" "sSearch": ""
}, },
"iDisplayLength": getNumEntriesPreference(data), "iDisplayLength": getNumEntriesPreference(data),
"bStateSave": true,
// R = ColReorder, C = ColVis, see datatables doc for others // R = ColReorder, C = ColVis, see datatables doc for others
"sDom": 'Rlfr<"H"C<"library_toolbar">>t<"F"ip>', "sDom": 'Rlfr<"H"C<"library_toolbar">>t<"F"ip>',
"oColVis": { "oColVis": {
@ -499,10 +500,6 @@ function createDataTable(data) {
"aiExclude": [0, 1, 2], "aiExclude": [0, 1, 2],
"sSize": "css", "sSize": "css",
"bShowAll": true "bShowAll": true
},
"oColReorder": {
"aiOrder": [ 0, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], /* code this */
"iFixedColumns": 3
} }
}); });
dTable.fnSetFilteringDelay(350); dTable.fnSetFilteringDelay(350);

View File

@ -138,6 +138,9 @@ var fnShowBuilderRowCallback = function ( nRow, aData, iDisplayIndex, iDisplayIn
fnPrepareSeparatorRow, fnPrepareSeparatorRow,
node; node;
//save some info for reordering purposes.
$(nRow).data({aData: aData});
fnPrepareSeparatorRow = function(sRowContent, sClass) { fnPrepareSeparatorRow = function(sRowContent, sClass) {
node = nRow.children[1]; node = nRow.children[1];
@ -167,6 +170,12 @@ var fnShowBuilderRowCallback = function ( nRow, aData, iDisplayIndex, iDisplayIn
sSeparatorHTML = '<span>Show Footer</span>'; sSeparatorHTML = '<span>Show Footer</span>';
fnPrepareSeparatorRow(sSeparatorHTML, "show-builder-footer"); fnPrepareSeparatorRow(sSeparatorHTML, "show-builder-footer");
} }
else if (aData.empty === true) {
}
else {
$(nRow).attr("id", "sched_"+aData.id);
}
return nRow; return nRow;
}; };
@ -197,7 +206,7 @@ $(document).ready(function() {
oTable = $('#show_builder_table').dataTable( { oTable = $('#show_builder_table').dataTable( {
"aoColumns": [ "aoColumns": [
/* checkbox */ {"mDataProp": "checkbox", "sTitle": "<input type='checkbox' name='sb_all'>", "sWidth": "25px"}, /* checkbox */ {"mDataProp": "checkbox", "sTitle": "<input type='checkbox' name='sb_all'>", "sWidth": "25px"},
// /* scheduled id */{"mDataProp": "id", "sTitle": "id", "bVisible": false, "sWidth": "1px"}, // /* scheduled id */{"mDataProp": "id", "sTitle": "id"},
// /* instance */{"mDataProp": "instance", "sTitle": "si_id"}, // /* instance */{"mDataProp": "instance", "sTitle": "si_id"},
/* starts */{"mDataProp": "starts", "sTitle": "Airtime"}, /* starts */{"mDataProp": "starts", "sTitle": "Airtime"},
/* ends */{"mDataProp": "ends", "sTitle": "Off Air"}, /* ends */{"mDataProp": "ends", "sTitle": "Off Air"},
@ -215,6 +224,7 @@ $(document).ready(function() {
"bProcessing": true, "bProcessing": true,
"bServerSide": true, "bServerSide": true,
"bInfo": false, "bInfo": false,
"bAutoWidth": false,
"fnServerData": fnServerData, "fnServerData": fnServerData,
"fnRowCallback": fnShowBuilderRowCallback, "fnRowCallback": fnShowBuilderRowCallback,
@ -235,8 +245,6 @@ $(document).ready(function() {
"sAjaxSource": "/showbuilder/builder-feed" "sAjaxSource": "/showbuilder/builder-feed"
}); });
//new FixedHeader( oTable );
new FixedColumns( oTable );
$( "#show_builder_datepicker_start" ).datepicker(oBaseDatePickerSettings); $( "#show_builder_datepicker_start" ).datepicker(oBaseDatePickerSettings);
@ -263,10 +271,39 @@ $(document).ready(function() {
$( "#show_builder_table" ).sortable({ $( "#show_builder_table" ).sortable({
placeholder: "placeholder show-builder-placeholder", placeholder: "placeholder show-builder-placeholder",
items: 'tr', forceHelperSize: true,
cancel: ".show-builder-header .show-builder-footer", forcePlaceholderSize: true,
items: 'tr:not(.show-builder-header):not(.show-builder-footer)',
//cancel: ".show-builder-header .show-builder-footer",
receive: function(event, ui) { receive: function(event, ui) {
var x; var x;
},
update: function(event, ui) {
var oItemData = ui.item.data("aData"),
oPrevData = ui.item.prev().data("aData"),
oRequestData = {format: "json"};
//if prev item is a footer, item is not scheduled into a show.
if (oPrevData.footer === false) {
oRequestData.instance = oPrevData.instance;
}
//set the start time appropriately
if (oPrevData.header === true) {
oRequestData.start = oPrevData.startsUnix;
}
else {
oRequestData.start = oPrevData.endsUnix;
}
oRequestData.id = oItemData.id;
oRequestData.duration = oItemData.duration;
/*
$.post("/showbuilder/schedule", oRequestData, function(json){
var x;
});
*/
} }
}); });