CC-3451 : Ability to delete the currently playing clip
This commit is contained in:
parent
275faa1881
commit
10e4ae781f
|
@ -111,7 +111,7 @@ class ShowbuilderController extends Zend_Controller_Action
|
||||||
$item = CcScheduleQuery::create()->findPK($id);
|
$item = CcScheduleQuery::create()->findPK($id);
|
||||||
$instance = $item->getCcShowInstances();
|
$instance = $item->getCcShowInstances();
|
||||||
|
|
||||||
if ($now < intval($item->getDbStarts("U")) && $user->canSchedule($instance->getDbShowId())) {
|
if ($now < intval($item->getDbEnds("U")) && $user->canSchedule($instance->getDbShowId())) {
|
||||||
$menu["del"] = array("name"=> "Delete", "icon" => "delete", "url" => "/showbuilder/schedule-remove");
|
$menu["del"] = array("name"=> "Delete", "icon" => "delete", "url" => "/showbuilder/schedule-remove");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -130,11 +130,11 @@ class Application_Model_Scheduler {
|
||||||
//fillers are for only storing a chunk of time space that has already passed.
|
//fillers are for only storing a chunk of time space that has already passed.
|
||||||
$filler = new CcSchedule();
|
$filler = new CcSchedule();
|
||||||
$filler->setDbStarts($DT)
|
$filler->setDbStarts($DT)
|
||||||
->setDbEnds($nowDT)
|
->setDbEnds($nowDT)
|
||||||
->setDbClipLength($cliplength)
|
->setDbClipLength($cliplength)
|
||||||
->setDbPlayoutStatus(-1)
|
->setDbPlayoutStatus(-1)
|
||||||
->setDbInstanceId($instance->getDbId())
|
->setDbInstanceId($instance->getDbId())
|
||||||
->save($this->con);
|
->save($this->con);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$nextDT = $DT;
|
$nextDT = $DT;
|
||||||
|
@ -425,6 +425,8 @@ class Application_Model_Scheduler {
|
||||||
|
|
||||||
$removedItems = CcScheduleQuery::create()->findPks(array_keys($scheduledIds));
|
$removedItems = CcScheduleQuery::create()->findPks(array_keys($scheduledIds));
|
||||||
|
|
||||||
|
//check to see if the current item is being deleted so we can truncate the record.
|
||||||
|
$currentItem = null;
|
||||||
//check to make sure all items selected are up to date
|
//check to make sure all items selected are up to date
|
||||||
foreach ($removedItems as $removedItem) {
|
foreach ($removedItems as $removedItem) {
|
||||||
$ts = $scheduledIds[$removedItem->getDbId()];
|
$ts = $scheduledIds[$removedItem->getDbId()];
|
||||||
|
@ -438,10 +440,25 @@ class Application_Model_Scheduler {
|
||||||
$show = $instance->getCcShow($this->con);
|
$show = $instance->getCcShow($this->con);
|
||||||
throw new OutDatedScheduleException("The show {$show->getDbName()} has been previously updated!");
|
throw new OutDatedScheduleException("The show {$show->getDbName()} has been previously updated!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//check to truncate the currently playing item instead of deleting it.
|
||||||
|
if ($removedItem->isCurrentItem()) {
|
||||||
|
$now = new DateTime("now", new DateTimeZone("UTC"));
|
||||||
|
|
||||||
|
$nEpoch = $now->format('U');
|
||||||
|
$sEpoch = $removedItem->getDbStarts('U');
|
||||||
|
$length = $nEpoch - $sEpoch;
|
||||||
|
$cliplength = Application_Model_Playlist::secondsToPlaylistTime($length);
|
||||||
|
|
||||||
|
$removedItem->setDbClipLength($cliplength);
|
||||||
|
$removedItem->setDbEnds($now);
|
||||||
|
$removedItem->save($this->con);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$removedItem->delete($this->con);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$removedItems->delete($this->con);
|
|
||||||
|
|
||||||
if ($adjustSched === true) {
|
if ($adjustSched === true) {
|
||||||
//get the show instances of the shows we must adjust times for.
|
//get the show instances of the shows we must adjust times for.
|
||||||
foreach ($removedItems as $item) {
|
foreach ($removedItems as $item) {
|
||||||
|
|
|
@ -62,20 +62,9 @@ class Application_Model_ShowBuilder {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
$showStartDT = new DateTime($p_item["si_starts"], new DateTimeZone("UTC"));
|
|
||||||
$showEndDT = new DateTime($p_item["si_ends"], new DateTimeZone("UTC"));
|
|
||||||
$schedStartDT = new DateTime($p_item["sched_starts"], new DateTimeZone("UTC"));
|
|
||||||
|
|
||||||
$showStartEpoch = intval($showStartDT->format('U'));
|
|
||||||
$showEndEpoch = intval($showEndDT->format('U'));
|
|
||||||
$schedStartEpoch = intval($schedStartDT->format('U'));
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ($this->user->canSchedule($p_item["show_id"]) == true) {
|
if ($this->user->canSchedule($p_item["show_id"]) == true) {
|
||||||
$row["allowed"] = true;
|
$row["allowed"] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getItemColor($p_item, &$row) {
|
private function getItemColor($p_item, &$row) {
|
||||||
|
|
|
@ -223,5 +223,18 @@ class CcSchedule extends BaseCcSchedule {
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
} // setDbEnds()
|
} // setDbEnds()
|
||||||
|
|
||||||
|
public function isCurrentItem() {
|
||||||
|
|
||||||
|
$epochNow = time();
|
||||||
|
$epochStart = intval($this->getDbStarts('U'));
|
||||||
|
$epochEnd = intval($this->getDbEnds('U'));
|
||||||
|
|
||||||
|
if ($epochStart < $epochNow && $epochEnd > $epochNow) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
} // CcSchedule
|
} // CcSchedule
|
||||||
|
|
|
@ -220,15 +220,109 @@ var AIRTIME = (function(AIRTIME){
|
||||||
r,g,b,a,
|
r,g,b,a,
|
||||||
$nRow = $(nRow);
|
$nRow = $(nRow);
|
||||||
|
|
||||||
//call the context menu so we can prevent the event from propagating.
|
fnPrepareSeparatorRow = function(sRowContent, sClass, iNodeIndex) {
|
||||||
$(nRow).find('td:not(.sb-checkbox)').click(function(e){
|
|
||||||
|
node = nRow.children[iNodeIndex];
|
||||||
$(this).contextMenu({x: e.pageX, y: e.pageY});
|
node.innerHTML = sRowContent;
|
||||||
|
node.setAttribute('colspan',100);
|
||||||
return false;
|
for (i = iNodeIndex + 1; i < nRow.children.length; i = i+1) {
|
||||||
});
|
node = nRow.children[i];
|
||||||
|
node.innerHTML = "";
|
||||||
|
node.setAttribute("style", "display : none");
|
||||||
|
}
|
||||||
|
|
||||||
|
$(nRow).addClass(sClass);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (aData.header === true) {
|
||||||
|
//remove the column classes from all tds.
|
||||||
|
$(nRow).find('td').removeClass();
|
||||||
|
|
||||||
|
node = nRow.children[0];
|
||||||
|
node.innerHTML = '';
|
||||||
|
cl = 'sb-header';
|
||||||
|
|
||||||
|
sSeparatorHTML = '<span class="show-title">'+aData.title+'</span>';
|
||||||
|
sSeparatorHTML += '<span class="push-right"><span class="show-time">'+aData.starts+'</span>-<span class="show-time">'+aData.ends+'</span></span>';
|
||||||
|
fnPrepareSeparatorRow(sSeparatorHTML, cl, 1);
|
||||||
|
}
|
||||||
|
else if (aData.footer === true) {
|
||||||
|
//remove the column classes from all tds.
|
||||||
|
$(nRow).find('td').removeClass();
|
||||||
|
|
||||||
|
node = nRow.children[0];
|
||||||
|
cl = 'sb-footer';
|
||||||
|
|
||||||
|
//check the show's content status.
|
||||||
|
if (aData.runtime > 0) {
|
||||||
|
node.innerHTML = '<span class="ui-icon ui-icon-check"></span>';
|
||||||
|
cl = cl + ' ui-state-highlight';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
node.innerHTML = '<span class="ui-icon ui-icon-notice"></span>';
|
||||||
|
cl = cl + ' ui-state-error';
|
||||||
|
}
|
||||||
|
|
||||||
|
sSeparatorHTML = '<span>'+aData.fRuntime+'</span>';
|
||||||
|
fnPrepareSeparatorRow(sSeparatorHTML, cl, 1);
|
||||||
|
}
|
||||||
|
else if (aData.empty === true) {
|
||||||
|
//remove the column classes from all tds.
|
||||||
|
$(nRow).find('td').removeClass();
|
||||||
|
|
||||||
|
node = nRow.children[0];
|
||||||
|
node.innerHTML = '';
|
||||||
|
|
||||||
|
sSeparatorHTML = '<span>Show Empty</span>';
|
||||||
|
cl = cl + " sb-empty odd";
|
||||||
|
|
||||||
|
fnPrepareSeparatorRow(sSeparatorHTML, cl, 1);
|
||||||
|
}
|
||||||
|
else if (aData.record === true) {
|
||||||
|
//remove the column classes from all tds.
|
||||||
|
$(nRow).find('td').removeClass();
|
||||||
|
|
||||||
|
node = nRow.children[0];
|
||||||
|
node.innerHTML = '';
|
||||||
|
|
||||||
|
sSeparatorHTML = '<span>Recording From Line In</span>';
|
||||||
|
cl = cl + " sb-record odd";
|
||||||
|
|
||||||
|
fnPrepareSeparatorRow(sSeparatorHTML, cl, 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
node = nRow.children[0];
|
||||||
|
if (aData.allowed === true && aData.scheduled >= 1) {
|
||||||
|
node.innerHTML = '<input type="checkbox" name="'+aData.id+'"></input>';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
node.innerHTML = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//save some info for reordering purposes.
|
//add the show colour to the leftmost td
|
||||||
|
if (aData.footer !== true) {
|
||||||
|
|
||||||
|
if ($nRow.hasClass('sb-header')) {
|
||||||
|
a = 1;
|
||||||
|
}
|
||||||
|
else if ($nRow.hasClass('odd')) {
|
||||||
|
a = 0.3;
|
||||||
|
}
|
||||||
|
else if ($nRow.hasClass('even')) {
|
||||||
|
a = 0.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
//convert from hex to rgb.
|
||||||
|
r = parseInt((aData.backgroundColor).substring(0,2), 16);
|
||||||
|
g = parseInt((aData.backgroundColor).substring(2,4), 16);
|
||||||
|
b = parseInt((aData.backgroundColor).substring(4,6), 16);
|
||||||
|
|
||||||
|
$nRow.find('td:first').css('background', 'rgba('+r+', '+g+', '+b+', '+a+')');
|
||||||
|
}
|
||||||
|
|
||||||
|
//save some info for reordering purposes.
|
||||||
$(nRow).data({"aData": aData});
|
$(nRow).data({"aData": aData});
|
||||||
|
|
||||||
if (aData.scheduled === 1) {
|
if (aData.scheduled === 1) {
|
||||||
|
@ -256,101 +350,19 @@ var AIRTIME = (function(AIRTIME){
|
||||||
$(nRow).addClass("sb-over");
|
$(nRow).addClass("sb-over");
|
||||||
}
|
}
|
||||||
|
|
||||||
fnPrepareSeparatorRow = function(sRowContent, sClass, iNodeIndex) {
|
//add the play function
|
||||||
|
$(nRow).find('td.sb-image').click(function(){
|
||||||
node = nRow.children[iNodeIndex];
|
|
||||||
node.innerHTML = sRowContent;
|
|
||||||
node.setAttribute('colspan',100);
|
|
||||||
for (i = iNodeIndex + 1; i < nRow.children.length; i = i+1) {
|
|
||||||
node = nRow.children[i];
|
|
||||||
node.innerHTML = "";
|
|
||||||
node.setAttribute("style", "display : none");
|
|
||||||
}
|
|
||||||
|
|
||||||
$(nRow).addClass(sClass);
|
|
||||||
};
|
|
||||||
|
|
||||||
//add the play function to the library_type td or the speaker
|
|
||||||
$(nRow).find('td.library_image').click(function(){
|
|
||||||
open_show_preview(aData.instance, iDisplayIndex);
|
open_show_preview(aData.instance, iDisplayIndex);
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (aData.header === true) {
|
//call the context menu so we can prevent the event from propagating.
|
||||||
node = nRow.children[0];
|
$(nRow).find('td:gt(1)').click(function(e){
|
||||||
node.innerHTML = '';
|
|
||||||
cl = 'sb-header';
|
$(this).contextMenu({x: e.pageX, y: e.pageY});
|
||||||
|
|
||||||
sSeparatorHTML = '<span class="show-title">'+aData.title+'</span>';
|
return false;
|
||||||
sSeparatorHTML += '<span class="push-right"><span class="show-time">'+aData.starts+'</span>-<span class="show-time">'+aData.ends+'</span></span>';
|
});
|
||||||
fnPrepareSeparatorRow(sSeparatorHTML, cl, 1);
|
|
||||||
}
|
|
||||||
else if (aData.footer === true) {
|
|
||||||
node = nRow.children[0];
|
|
||||||
cl = 'sb-footer';
|
|
||||||
|
|
||||||
//check the show's content status.
|
|
||||||
if (aData.runtime > 0) {
|
|
||||||
node.innerHTML = '<span class="ui-icon ui-icon-check"></span>';
|
|
||||||
cl = cl + ' ui-state-highlight';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
node.innerHTML = '<span class="ui-icon ui-icon-notice"></span>';
|
|
||||||
cl = cl + ' ui-state-error';
|
|
||||||
}
|
|
||||||
|
|
||||||
sSeparatorHTML = '<span>'+aData.fRuntime+'</span>';
|
|
||||||
fnPrepareSeparatorRow(sSeparatorHTML, cl, 1);
|
|
||||||
}
|
|
||||||
else if (aData.empty === true) {
|
|
||||||
node = nRow.children[0];
|
|
||||||
node.innerHTML = '';
|
|
||||||
|
|
||||||
sSeparatorHTML = '<span>Show Empty</span>';
|
|
||||||
cl = cl + " sb-empty odd";
|
|
||||||
|
|
||||||
fnPrepareSeparatorRow(sSeparatorHTML, cl, 1);
|
|
||||||
}
|
|
||||||
else if (aData.record === true) {
|
|
||||||
node = nRow.children[0];
|
|
||||||
node.innerHTML = '';
|
|
||||||
|
|
||||||
sSeparatorHTML = '<span>Recording From Line In</span>';
|
|
||||||
cl = cl + " sb-record odd";
|
|
||||||
|
|
||||||
fnPrepareSeparatorRow(sSeparatorHTML, cl, 1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
node = nRow.children[0];
|
|
||||||
if (aData.allowed === true && aData.scheduled === 2) {
|
|
||||||
node.innerHTML = '<input type="checkbox" name="'+aData.id+'"></input>';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
node.innerHTML = '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//add the show colour to the leftmost td
|
|
||||||
if (aData.footer !== true) {
|
|
||||||
|
|
||||||
if ($nRow.hasClass('sb-header')) {
|
|
||||||
a = 1;
|
|
||||||
}
|
|
||||||
else if ($nRow.hasClass('odd')) {
|
|
||||||
a = 0.3;
|
|
||||||
}
|
|
||||||
else if ($nRow.hasClass('even')) {
|
|
||||||
a = 0.4;
|
|
||||||
}
|
|
||||||
|
|
||||||
//convert from hex to rgb.
|
|
||||||
r = parseInt((aData.backgroundColor).substring(0,2), 16);
|
|
||||||
g = parseInt((aData.backgroundColor).substring(2,4), 16);
|
|
||||||
b = parseInt((aData.backgroundColor).substring(4,6), 16);
|
|
||||||
|
|
||||||
$nRow.find('td.sb-checkbox').css('background', 'rgba('+r+', '+g+', '+b+', '+a+')');
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"fnDrawCallback": function(oSettings, json) {
|
"fnDrawCallback": function(oSettings, json) {
|
||||||
var wrapperDiv,
|
var wrapperDiv,
|
||||||
|
@ -659,7 +671,8 @@ var AIRTIME = (function(AIRTIME){
|
||||||
|
|
||||||
return draggingContainer;
|
return draggingContainer;
|
||||||
},
|
},
|
||||||
items: 'tr:not(:first, :last, .sb-header, .sb-footer, .sb-not-allowed, .sb-past, .sb-now-playing)',
|
items: 'tr:not(:first, :last, .sb-header, .sb-not-allowed, .sb-past, .sb-now-playing)',
|
||||||
|
cancel: '.sb-footer',
|
||||||
receive: fnReceive,
|
receive: fnReceive,
|
||||||
update: fnUpdate,
|
update: fnUpdate,
|
||||||
start: function(event, ui) {
|
start: function(event, ui) {
|
||||||
|
@ -759,7 +772,7 @@ var AIRTIME = (function(AIRTIME){
|
||||||
|
|
||||||
//begin context menu initialization.
|
//begin context menu initialization.
|
||||||
$.contextMenu({
|
$.contextMenu({
|
||||||
selector: '#show_builder_table td:not(.sb-checkbox)',
|
selector: '.sb-content table tbody tr:not(.sb-empty, .sb-footer, .sb-header) td:not(.sb-checkbox, .sb-image)',
|
||||||
trigger: "left",
|
trigger: "left",
|
||||||
ignoreRightClick: true,
|
ignoreRightClick: true,
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue