CC-3174 : Show builder
creating a scheduling system to work with the new timeline in mind using propel.
This commit is contained in:
parent
f5761fd03c
commit
3f3117cf0e
|
@ -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',
|
||||||
|
@ -67,7 +74,7 @@ $pages = array(
|
||||||
'action' => 'stream-setting'
|
'action' => 'stream-setting'
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'label' =>
|
'label' =>
|
||||||
Application_Model_Preference::GetPlanLevel() == 'disabled'?'Support Settings':'Station Information Settings',
|
Application_Model_Preference::GetPlanLevel() == 'disabled'?'Support Settings':'Station Information Settings',
|
||||||
'module' => 'default',
|
'module' => 'default',
|
||||||
'controller' => 'Preference',
|
'controller' => 'Preference',
|
||||||
|
|
|
@ -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){
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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"];
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
});
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue