CC-3620 : Calendar -> Unresponsive script warning when trying to add 300 ogg files

improving speed of js rendering,
datatables config is loaded from localstorage,
removed aggregate propel behaviour on cc_show_instances time_filled.
This commit is contained in:
Naomi Aro 2012-04-16 16:33:32 +02:00
parent ef908ee894
commit c96c60dc5a
16 changed files with 210 additions and 235 deletions

View File

@ -680,7 +680,10 @@ class ScheduleController extends Zend_Controller_Action
$this->view->entries = 5; $this->view->entries = 5;
} }
public function getFormAction(){ public function getFormAction() {
$user = Application_Model_User::GetCurrentUser();
if($user->isUserType(UTYPE_ADMIN, UTYPE_PROGRAM_MANAGER)){ if($user->isUserType(UTYPE_ADMIN, UTYPE_PROGRAM_MANAGER)){
Application_Model_Schedule::createNewFormSections($this->view); Application_Model_Schedule::createNewFormSections($this->view);
$this->view->form = $this->view->render('schedule/add-show-form.phtml'); $this->view->form = $this->view->render('schedule/add-show-form.phtml');

View File

@ -23,6 +23,24 @@ class ShowbuilderController extends Zend_Controller_Action
$request = $this->getRequest(); $request = $this->getRequest();
$baseUrl = $request->getBaseUrl(); $baseUrl = $request->getBaseUrl();
$data = Application_Model_Preference::GetValue("library_datatable", true);
if ($data != "") {
$libraryTable = json_encode(unserialize($data));
$this->view->headScript()->appendScript("localStorage.setItem( 'datatables-library', JSON.stringify($libraryTable) );");
}
else {
$this->view->headScript()->appendScript("localStorage.setItem( 'datatables-library', '' );");
}
$data = Application_Model_Preference::GetValue("timeline_datatable", true);
if ($data != "") {
$timelineTable = json_encode(unserialize($data));
$this->view->headScript()->appendScript("localStorage.setItem( 'datatables-timeline', JSON.stringify($timelineTable) );");
}
else {
$this->view->headScript()->appendScript("localStorage.setItem( 'datatables-timeline', '' );");
}
$this->view->headScript()->appendFile($baseUrl.'/js/contextmenu/jquery.contextMenu.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'/js/contextmenu/jquery.contextMenu.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
$this->view->headScript()->appendFile($baseUrl.'/js/datatables/js/jquery.dataTables.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'/js/datatables/js/jquery.dataTables.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
$this->view->headScript()->appendFile($baseUrl.'/js/datatables/plugin/dataTables.pluginAPI.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'/js/datatables/plugin/dataTables.pluginAPI.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
@ -239,6 +257,8 @@ class ShowbuilderController extends Zend_Controller_Action
public function builderFeedAction() { public function builderFeedAction() {
$start = microtime(true);
$request = $this->getRequest(); $request = $this->getRequest();
$current_time = time(); $current_time = time();
@ -257,6 +277,11 @@ class ShowbuilderController extends Zend_Controller_Action
$this->view->schedule = $showBuilder->GetItems(); $this->view->schedule = $showBuilder->GetItems();
$this->view->timestamp = $current_time; $this->view->timestamp = $current_time;
$end = microtime(true);
Logging::debug("getting builder feed info took:");
Logging::debug(floatval($end) - floatval($start));
} }
public function scheduleAddAction() { public function scheduleAddAction() {

View File

@ -53,19 +53,33 @@ class UsersettingsController extends Zend_Controller_Action
public function setTimelineDatatableAction() { public function setTimelineDatatableAction() {
$start = microtime(true);
$request = $this->getRequest(); $request = $this->getRequest();
$settings = $request->getParam("settings"); $settings = $request->getParam("settings");
$data = serialize($settings); $data = serialize($settings);
Application_Model_Preference::SetValue("timeline_datatable", $data, true); Application_Model_Preference::SetValue("timeline_datatable", $data, true);
$end = microtime(true);
Logging::debug("saving timeline datatables info took:");
Logging::debug(floatval($end) - floatval($start));
} }
public function getTimelineDatatableAction() { public function getTimelineDatatableAction() {
$start = microtime(true);
$data = Application_Model_Preference::GetValue("timeline_datatable", true); $data = Application_Model_Preference::GetValue("timeline_datatable", true);
if ($data != "") { if ($data != "") {
$this->view->settings = unserialize($data); $this->view->settings = unserialize($data);
} }
$end = microtime(true);
Logging::debug("getting timeline datatables info took:");
Logging::debug(floatval($end) - floatval($start));
} }
public function remindmeAction() public function remindmeAction()

View File

@ -272,6 +272,8 @@ class Application_Model_Schedule {
} }
$sql .= " ORDER BY si.starts, sched.starts;"; $sql .= " ORDER BY si.starts, sched.starts;";
Logging::debug($sql);
$rows = $CC_DBC->GetAll($sql); $rows = $CC_DBC->GetAll($sql);
return $rows; return $rows;

View File

@ -1,5 +1,7 @@
<?php <?php
require_once 'Log.php';
class Application_Model_Scheduler { class Application_Model_Scheduler {
private $con; private $con;
@ -251,11 +253,12 @@ class Application_Model_Scheduler {
$itemEndDT = $this->findEndTime($itemStartDT, $item->getDbClipLength()); $itemEndDT = $this->findEndTime($itemStartDT, $item->getDbClipLength());
$item->setDbStarts($itemStartDT) $item->setDbStarts($itemStartDT)
->setDbEnds($itemEndDT) ->setDbEnds($itemEndDT);
->save($this->con);
$itemStartDT = $itemEndDT; $itemStartDT = $itemEndDT;
} }
$schedule->save($this->con);
} }
/* /*
@ -277,6 +280,8 @@ class Application_Model_Scheduler {
} }
} }
$startProfile = microtime(true);
foreach ($scheduleItems as $schedule) { foreach ($scheduleItems as $schedule) {
$id = intval($schedule["id"]); $id = intval($schedule["id"]);
@ -301,12 +306,19 @@ class Application_Model_Scheduler {
} }
if ($adjustSched === true) { if ($adjustSched === true) {
$pstart = microtime(true);
$followingSchedItems = CcScheduleQuery::create() $followingSchedItems = CcScheduleQuery::create()
->filterByDBStarts($nextStartDT->format("Y-m-d H:i:s.u"), Criteria::GREATER_EQUAL) ->filterByDBStarts($nextStartDT->format("Y-m-d H:i:s.u"), Criteria::GREATER_EQUAL)
->filterByDbInstanceId($instance->getDbId()) ->filterByDbInstanceId($instance->getDbId())
->filterByDbId($excludeIds, Criteria::NOT_IN) ->filterByDbId($excludeIds, Criteria::NOT_IN)
->orderByDbStarts() ->orderByDbStarts()
->find($this->con); ->find($this->con);
$pend = microtime(true);
Logging::debug("finding all following items.");
Logging::debug(floatval($pend) - floatval($pstart));
} }
foreach($schedFiles as $file) { foreach($schedFiles as $file) {
@ -337,34 +349,55 @@ class Application_Model_Scheduler {
} }
if ($adjustSched === true) { if ($adjustSched === true) {
$pstart = microtime(true);
//recalculate the start/end times after the inserted items. //recalculate the start/end times after the inserted items.
foreach ($followingSchedItems as $item) { foreach ($followingSchedItems as $item) {
$endTimeDT = $this->findEndTime($nextStartDT, $item->getDbClipLength()); $endTimeDT = $this->findEndTime($nextStartDT, $item->getDbClipLength());
$item->setDbStarts($nextStartDT); $item->setDbStarts($nextStartDT);
$item->setDbEnds($endTimeDT); $item->setDbEnds($endTimeDT);
$item->save($this->con); $item->save($this->con);
$nextStartDT = $endTimeDT;
$nextStartDT = $endTimeDT;
} }
$pend = microtime(true);
Logging::debug("adjusting all following items.");
Logging::debug(floatval($pend) - floatval($pstart));
} }
} }
$endProfile = microtime(true);
Logging::debug("finished adding scheduled items.");
Logging::debug(floatval($endProfile) - floatval($startProfile));
//update the status flag in cc_schedule. //update the status flag in cc_schedule.
$instances = CcShowInstancesQuery::create() $instances = CcShowInstancesQuery::create()
->filterByPrimaryKeys($affectedShowInstances) ->filterByPrimaryKeys($affectedShowInstances)
->find($this->con); ->find($this->con);
$startProfile = microtime(true);
foreach ($instances as $instance) { foreach ($instances as $instance) {
$instance->updateScheduleStatus($this->con); $instance->updateScheduleStatus($this->con);
} }
$endProfile = microtime(true);
Logging::debug("updating show instances status.");
Logging::debug(floatval($endProfile) - floatval($startProfile));
$startProfile = microtime(true);
//update the last scheduled timestamp. //update the last scheduled timestamp.
CcShowInstancesQuery::create() CcShowInstancesQuery::create()
->filterByPrimaryKeys($affectedShowInstances) ->filterByPrimaryKeys($affectedShowInstances)
->update(array('DbLastScheduled' => new DateTime("now", new DateTimeZone("UTC"))), $this->con); ->update(array('DbLastScheduled' => new DateTime("now", new DateTimeZone("UTC"))), $this->con);
$endProfile = microtime(true);
Logging::debug("updating last scheduled timestamp.");
Logging::debug(floatval($endProfile) - floatval($startProfile));
} }
catch (Exception $e) { catch (Exception $e) {
Logging::debug($e->getMessage()); Logging::debug($e->getMessage());
@ -407,12 +440,19 @@ class Application_Model_Scheduler {
*/ */
public function moveItem($selectedItems, $afterItems, $adjustSched = true) { public function moveItem($selectedItems, $afterItems, $adjustSched = true) {
$startProfile = microtime(true);
$this->con->beginTransaction(); $this->con->beginTransaction();
$this->con->useDebug(true);
try { try {
$this->validateRequest($selectedItems); $this->validateRequest($selectedItems);
$this->validateRequest($afterItems); $this->validateRequest($afterItems);
$endProfile = microtime(true);
Logging::debug("validating move request took:");
Logging::debug(floatval($endProfile) - floatval($startProfile));
$afterInstance = CcShowInstancesQuery::create()->findPK($afterItems[0]["instance"], $this->con); $afterInstance = CcShowInstancesQuery::create()->findPK($afterItems[0]["instance"], $this->con);
@ -450,10 +490,33 @@ class Application_Model_Scheduler {
//calculate times excluding the to be moved items. //calculate times excluding the to be moved items.
foreach ($modifiedMap as $instance => $schedIds) { foreach ($modifiedMap as $instance => $schedIds) {
$startProfile = microtime(true);
$this->removeGaps($instance, $schedIds); $this->removeGaps($instance, $schedIds);
$endProfile = microtime(true);
Logging::debug("removing gaps from instance $instance:");
Logging::debug(floatval($endProfile) - floatval($startProfile));
} }
$startProfile = microtime(true);
$this->insertAfter($afterItems, $movedData, $adjustSched); $this->insertAfter($afterItems, $movedData, $adjustSched);
$endProfile = microtime(true);
Logging::debug("inserting after removing gaps.");
Logging::debug(floatval($endProfile) - floatval($startProfile));
$afterInstanceId = $afterInstance->getDbId();
$modified = array_keys($modifiedMap);
//need to adjust shows we have moved items from.
foreach($modified as $instanceId) {
$instance = CcShowInstancesQuery::create()->findPK($instanceId, $this->con);
$instance->updateScheduleStatus($this->con);
}
$this->con->useDebug(false);
$this->con->commit(); $this->con->commit();
Application_Model_RabbitMq::PushSchedule(); Application_Model_RabbitMq::PushSchedule();

View File

@ -110,6 +110,8 @@ class CcShowInstances extends BaseCcShowInstances {
//post save hook to update the cc_schedule status column for the tracks in the show. //post save hook to update the cc_schedule status column for the tracks in the show.
public function updateScheduleStatus(PropelPDO $con) { public function updateScheduleStatus(PropelPDO $con) {
$this->updateDbTimeFilled($con);
//scheduled track is in the show //scheduled track is in the show
CcScheduleQuery::create() CcScheduleQuery::create()
@ -134,6 +136,32 @@ class CcShowInstances extends BaseCcShowInstances {
->update(array('DbPlayoutStatus' => 0), $con); ->update(array('DbPlayoutStatus' => 0), $con);
} }
/**
* Computes the value of the aggregate column time_filled
*
* @param PropelPDO $con A connection object
*
* @return mixed The scalar result from the aggregate query
*/
public function computeDbTimeFilled(PropelPDO $con)
{
$stmt = $con->prepare('SELECT SUM(clip_length) FROM "cc_schedule" WHERE cc_schedule.INSTANCE_ID = :p1');
$stmt->bindValue(':p1', $this->getDbId());
$stmt->execute();
return $stmt->fetchColumn();
}
/**
* Updates the aggregate column time_filled
*
* @param PropelPDO $con A connection object
*/
public function updateDbTimeFilled(PropelPDO $con)
{
$this->setDbTimeFilled($this->computeDbTimeFilled($con));
$this->save($con);
}
public function preInsert(PropelPDO $con = null) { public function preInsert(PropelPDO $con = null) {
$now = new DateTime("now", new DateTimeZone("UTC")); $now = new DateTime("now", new DateTimeZone("UTC"));
$this->setDbCreated($now); $this->setDbCreated($now);

View File

@ -62,17 +62,4 @@ class CcScheduleTableMap extends TableMap {
$this->addRelation('CcFiles', 'CcFiles', RelationMap::MANY_TO_ONE, array('file_id' => 'id', ), 'CASCADE', null); $this->addRelation('CcFiles', 'CcFiles', RelationMap::MANY_TO_ONE, array('file_id' => 'id', ), 'CASCADE', null);
} // buildRelations() } // buildRelations()
/**
*
* Gets the list of behaviors registered for this table
*
* @return array Associative array (name => parameters) of behaviors
*/
public function getBehaviors()
{
return array(
'aggregate_column_relation' => array('foreign_table' => 'cc_show_instances', 'update_method' => 'updateDbTimeFilled', ),
);
} // getBehaviors()
} // CcScheduleTableMap } // CcScheduleTableMap

View File

@ -65,17 +65,4 @@ class CcShowInstancesTableMap extends TableMap {
$this->addRelation('CcSchedule', 'CcSchedule', RelationMap::ONE_TO_MANY, array('id' => 'instance_id', ), 'CASCADE', null); $this->addRelation('CcSchedule', 'CcSchedule', RelationMap::ONE_TO_MANY, array('id' => 'instance_id', ), 'CASCADE', null);
} // buildRelations() } // buildRelations()
/**
*
* Gets the list of behaviors registered for this table
*
* @return array Associative array (name => parameters) of behaviors
*/
public function getBehaviors()
{
return array(
'aggregate_column' => array('name' => 'time_filled', 'expression' => 'SUM(clip_length)', 'foreign_table' => 'cc_schedule', ),
);
} // getBehaviors()
} // CcShowInstancesTableMap } // CcShowInstancesTableMap

View File

@ -127,9 +127,6 @@ abstract class BaseCcSchedule extends BaseObject implements Persistent
*/ */
protected $alreadyInValidation = false; protected $alreadyInValidation = false;
// aggregate_column_relation behavior
protected $oldCcShowInstances;
/** /**
* Applies default values to this object. * Applies default values to this object.
* This method should be called from the object's constructor (or * This method should be called from the object's constructor (or
@ -966,8 +963,6 @@ abstract class BaseCcSchedule extends BaseObject implements Persistent
$this->postUpdate($con); $this->postUpdate($con);
} }
$this->postSave($con); $this->postSave($con);
// aggregate_column_relation behavior
$this->updateRelatedCcShowInstances($con);
CcSchedulePeer::addInstanceToPool($this); CcSchedulePeer::addInstanceToPool($this);
} else { } else {
$affectedRows = 0; $affectedRows = 0;
@ -1491,10 +1486,6 @@ abstract class BaseCcSchedule extends BaseObject implements Persistent
*/ */
public function setCcShowInstances(CcShowInstances $v = null) public function setCcShowInstances(CcShowInstances $v = null)
{ {
// aggregate_column_relation behavior
if (null !== $this->aCcShowInstances && $v !== $this->aCcShowInstances) {
$this->oldCcShowInstances = $this->aCcShowInstances;
}
if ($v === null) { if ($v === null) {
$this->setDbInstanceId(NULL); $this->setDbInstanceId(NULL);
} else { } else {
@ -1628,24 +1619,6 @@ abstract class BaseCcSchedule extends BaseObject implements Persistent
$this->aCcFiles = null; $this->aCcFiles = null;
} }
// aggregate_column_relation behavior
/**
* Update the aggregate column in the related CcShowInstances object
*
* @param PropelPDO $con A connection object
*/
protected function updateRelatedCcShowInstances(PropelPDO $con)
{
if ($ccShowInstances = $this->getCcShowInstances()) {
$ccShowInstances->updateDbTimeFilled($con);
}
if ($this->oldCcShowInstances) {
$this->oldCcShowInstances->updateDbTimeFilled($con);
$this->oldCcShowInstances = null;
}
}
/** /**
* Catches calls to virtual methods * Catches calls to virtual methods
*/ */

View File

@ -642,90 +642,4 @@ abstract class BaseCcScheduleQuery extends ModelCriteria
return $this; return $this;
} }
/**
* Code to execute before every DELETE statement
*
* @param PropelPDO $con The connection object used by the query
*/
protected function basePreDelete(PropelPDO $con)
{
// aggregate_column_relation behavior
$this->findRelatedCcShowInstancess($con);
return $this->preDelete($con);
}
/**
* Code to execute after every DELETE statement
*
* @param int $affectedRows the number of deleted rows
* @param PropelPDO $con The connection object used by the query
*/
protected function basePostDelete($affectedRows, PropelPDO $con)
{
// aggregate_column_relation behavior
$this->updateRelatedCcShowInstancess($con);
return $this->postDelete($affectedRows, $con);
}
/**
* Code to execute before every UPDATE statement
*
* @param array $values The associatiove array of columns and values for the update
* @param PropelPDO $con The connection object used by the query
* @param boolean $forceIndividualSaves If false (default), the resulting call is a BasePeer::doUpdate(), ortherwise it is a series of save() calls on all the found objects
*/
protected function basePreUpdate(&$values, PropelPDO $con, $forceIndividualSaves = false)
{
// aggregate_column_relation behavior
$this->findRelatedCcShowInstancess($con);
return $this->preUpdate($values, $con, $forceIndividualSaves);
}
/**
* Code to execute after every UPDATE statement
*
* @param int $affectedRows the number of udated rows
* @param PropelPDO $con The connection object used by the query
*/
protected function basePostUpdate($affectedRows, PropelPDO $con)
{
// aggregate_column_relation behavior
$this->updateRelatedCcShowInstancess($con);
return $this->postUpdate($affectedRows, $con);
}
// aggregate_column_relation behavior
/**
* Finds the related CcShowInstances objects and keep them for later
*
* @param PropelPDO $con A connection object
*/
protected function findRelatedCcShowInstancess($con)
{
$criteria = clone $this;
if ($this->useAliasInSQL) {
$alias = $this->getModelAlias();
$criteria->removeAlias($alias);
} else {
$alias = '';
}
$this->ccShowInstancess = CcShowInstancesQuery::create()
->joinCcSchedule($alias)
->mergeWith($criteria)
->find($con);
}
protected function updateRelatedCcShowInstancess($con)
{
foreach ($this->ccShowInstancess as $ccShowInstances) {
$ccShowInstances->updateDbTimeFilled($con);
}
$this->ccShowInstancess = array();
}
} // BaseCcScheduleQuery } // BaseCcScheduleQuery

View File

@ -2049,34 +2049,6 @@ abstract class BaseCcShowInstances extends BaseObject implements Persistent
$this->aCcFiles = null; $this->aCcFiles = null;
} }
// aggregate_column behavior
/**
* Computes the value of the aggregate column time_filled
*
* @param PropelPDO $con A connection object
*
* @return mixed The scalar result from the aggregate query
*/
public function computeDbTimeFilled(PropelPDO $con)
{
$stmt = $con->prepare('SELECT SUM(clip_length) FROM "cc_schedule" WHERE cc_schedule.INSTANCE_ID = :p1');
$stmt->bindValue(':p1', $this->getDbId());
$stmt->execute();
return $stmt->fetchColumn();
}
/**
* Updates the aggregate column time_filled
*
* @param PropelPDO $con A connection object
*/
public function updateDbTimeFilled(PropelPDO $con)
{
$this->setDbTimeFilled($this->computeDbTimeFilled($con));
$this->save($con);
}
/** /**
* Catches calls to virtual methods * Catches calls to virtual methods
*/ */

View File

@ -168,11 +168,6 @@
instances can be regenerated if we edit the show, which is unwanted behaviour. This column serves instances can be regenerated if we edit the show, which is unwanted behaviour. This column serves
to ensure that we don't regenerate the instance. --> to ensure that we don't regenerate the instance. -->
<column name="modified_instance" phpName="DbModifiedInstance" type="BOOLEAN" required="true" defaultValue="false" /> <column name="modified_instance" phpName="DbModifiedInstance" type="BOOLEAN" required="true" defaultValue="false" />
<behavior name="aggregate_column">
<parameter name="name" value="time_filled" />
<parameter name="foreign_table" value="cc_schedule" />
<parameter name="expression" value="SUM(clip_length)" />
</behavior>
<foreign-key foreignTable="cc_show" name="cc_show_fkey" onDelete="CASCADE"> <foreign-key foreignTable="cc_show" name="cc_show_fkey" onDelete="CASCADE">
<reference local="show_id" foreign="id"/> <reference local="show_id" foreign="id"/>
</foreign-key> </foreign-key>

View File

@ -34,7 +34,7 @@ var AIRTIME = (function(AIRTIME){
.data("screen", "timeline"); .data("screen", "timeline");
}; };
mod.fnDrawCallback = function() { mod.fnDrawCallback = function fnLibDrawCallback() {
$('#library_display tr:not(:first)').draggable({ $('#library_display tr:not(:first)').draggable({
helper: function(){ helper: function(){

View File

@ -118,28 +118,21 @@ var AIRTIME = (function(AIRTIME) {
}, },
"fnStateSave": function (oSettings, oData) { "fnStateSave": function (oSettings, oData) {
$.ajax({ localStorage.setItem('datatables-library', JSON.stringify(oData));
url: "/usersettings/set-library-datatable",
type: "POST", $.ajax({
data: {settings : oData, format: "json"}, url: "/usersettings/set-library-datatable",
dataType: "json" type: "POST",
}); data: {settings : oData, format: "json"},
dataType: "json"
});
}, },
"fnStateLoad": function (oSettings) { "fnStateLoad": function fnLibStateLoad(oSettings) {
var o; var settings = localStorage.getItem('datatables-library');
$.ajax({ if (settings !== "") {
url: "/usersettings/get-library-datatable", return JSON.parse(settings);
type: "GET", }
data: {format: "json"},
dataType: "json",
async: false,
success: function(json){
o = json.settings;
}
});
return o;
}, },
"fnStateLoadParams": function (oSettings, oData) { "fnStateLoadParams": function (oSettings, oData) {
var i, var i,
@ -148,13 +141,17 @@ var AIRTIME = (function(AIRTIME) {
//putting serialized data back into the correct js type to make //putting serialized data back into the correct js type to make
//sure everything works properly. //sure everything works properly.
for (i = 0, length = a.length; i < length; i++) { for (i = 0, length = a.length; i < length; i++) {
a[i] = (a[i] === "true") ? true : false; if (typeof(a[i]) === "string") {
a[i] = (a[i] === "true") ? true : false;
}
} }
a = oData.ColReorder; a = oData.ColReorder;
for (i = 0, length = a.length; i < length; i++) { for (i = 0, length = a.length; i < length; i++) {
a[i] = parseInt(a[i], 10); if (typeof(a[i]) === "string") {
a[i] = parseInt(a[i], 10);
}
} }
oData.iEnd = parseInt(oData.iEnd, 10); oData.iEnd = parseInt(oData.iEnd, 10);
@ -516,7 +513,7 @@ var AIRTIME = (function(AIRTIME) {
return AIRTIME; return AIRTIME;
}(AIRTIME || {})); }(AIRTIME || {}));
function checkImportStatus(){ function checkImportStatus(){
$.getJSON('/Preference/is-import-in-progress', function(data){ $.getJSON('/Preference/is-import-in-progress', function(data){
var div = $('#import_status'); var div = $('#import_status');

View File

@ -177,8 +177,10 @@ var AIRTIME = (function(AIRTIME){
delete oData.oSearch; delete oData.oSearch;
delete oData.aoSearchCols; delete oData.aoSearchCols;
}, },
"fnStateSave": function (oSettings, oData) { "fnStateSave": function fnStateSave(oSettings, oData) {
localStorage.setItem('datatables-timeline', JSON.stringify(oData));
$.ajax({ $.ajax({
url: "/usersettings/set-timeline-datatable", url: "/usersettings/set-timeline-datatable",
type: "POST", type: "POST",
@ -186,21 +188,12 @@ var AIRTIME = (function(AIRTIME){
dataType: "json" dataType: "json"
}); });
}, },
"fnStateLoad": function (oSettings) { "fnStateLoad": function fnBuilderStateLoad(oSettings) {
var o; var settings = localStorage.getItem('datatables-timeline');
$.ajax({ if (settings !== "") {
url: "/usersettings/get-timeline-datatable", return JSON.parse(settings);
type: "GET", }
data: {format: "json"},
dataType: "json",
async: false,
success: function(json){
o = json.settings;
}
});
return o;
}, },
"fnStateLoadParams": function (oSettings, oData) { "fnStateLoadParams": function (oSettings, oData) {
var i, var i,
@ -210,19 +203,23 @@ var AIRTIME = (function(AIRTIME){
//putting serialized data back into the correct js type to make //putting serialized data back into the correct js type to make
//sure everything works properly. //sure everything works properly.
for (i = 0, length = a.length; i < length; i++) { for (i = 0, length = a.length; i < length; i++) {
a[i] = (a[i] === "true") ? true : false; if (typeof(a[i]) === "string") {
a[i] = (a[i] === "true") ? true : false;
}
} }
a = oData.ColReorder; a = oData.ColReorder;
for (i = 0, length = a.length; i < length; i++) { for (i = 0, length = a.length; i < length; i++) {
a[i] = parseInt(a[i], 10); if (typeof(a[i]) === "string") {
a[i] = parseInt(a[i], 10);
}
} }
oData.iCreate = parseInt(oData.iCreate, 10); oData.iCreate = parseInt(oData.iCreate, 10);
}, },
"fnServerData": AIRTIME.showbuilder.fnServerData, "fnServerData": AIRTIME.showbuilder.fnServerData,
"fnRowCallback": function ( nRow, aData, iDisplayIndex, iDisplayIndexFull ) { "fnRowCallback": function fnRowCallback( nRow, aData, iDisplayIndex, iDisplayIndexFull ) {
var i, var i,
sSeparatorHTML, sSeparatorHTML,
fnPrepareSeparatorRow, fnPrepareSeparatorRow,
@ -233,7 +230,7 @@ var AIRTIME = (function(AIRTIME){
$nRow = $(nRow), $nRow = $(nRow),
$image; $image;
fnPrepareSeparatorRow = function(sRowContent, sClass, iNodeIndex) { fnPrepareSeparatorRow = function fnPrepareSeparatorRow(sRowContent, sClass, iNodeIndex) {
node = nRow.children[iNodeIndex]; node = nRow.children[iNodeIndex];
node.innerHTML = sRowContent; node.innerHTML = sRowContent;
@ -413,7 +410,7 @@ var AIRTIME = (function(AIRTIME){
//disable cancelling current show. //disable cancelling current show.
AIRTIME.button.disableButton("sb-button-cancel"); AIRTIME.button.disableButton("sb-button-cancel");
}, },
"fnDrawCallback": function(oSettings, json) { "fnDrawCallback": function fnBuilderDrawCallback(oSettings, json) {
var wrapperDiv, var wrapperDiv,
markerDiv, markerDiv,
$td, $td,
@ -421,26 +418,40 @@ var AIRTIME = (function(AIRTIME){
aData, aData,
elements, elements,
i, length, temp, i, length, temp,
$cursorRows; $cursorRows,
$table = $(this),
$parent = $table.parent(),
//use this array to cache DOM heights then we can detach the table to manipulate it to increase speed.
heights = [];
clearTimeout(AIRTIME.showbuilder.timeout); clearTimeout(AIRTIME.showbuilder.timeout);
//only create the cursor arrows if the library is on the page. //only create the cursor arrows if the library is on the page.
if ($lib.length > 0 && $lib.filter(":visible").length > 0) { if ($lib.length > 0 && $lib.filter(":visible").length > 0) {
$cursorRows = $sbTable.find("tbody tr.sb-future.sb-allowed:not(.sb-header, .sb-empty)");
$cursorRows = $sbTable.find("tbody tr:not(.sb-header, .sb-empty, .sb-now-playing, .sb-past, .sb-not-allowed)"); //need to get heights of tds while elements are still in the DOM.
for (i = 0, length = $cursorRows.length; i < length; i++) {
$td = $($cursorRows.get(i)).find("td:first");
heights.push($td.height());
}
//create cursor arrows. //detach the table to increase speed.
$cursorRows.each(function(i, el) { $table.detach();
$td = $(el).find("td:first");
for (i = 0, length = $cursorRows.length; i < length; i++) {
$td = $($cursorRows.get(i)).find("td:first");
if ($td.hasClass("dataTables_empty")) { if ($td.hasClass("dataTables_empty")) {
$parent.append($table);
return false; return false;
} }
wrapperDiv = $("<div />", { wrapperDiv = $("<div />", {
"class": "innerWrapper", "class": "innerWrapper",
"css": { "css": {
"height": $td.height() "height": heights[i]
} }
}); });
markerDiv = $("<div />", { markerDiv = $("<div />", {
@ -448,7 +459,7 @@ var AIRTIME = (function(AIRTIME){
}); });
$td.append(markerDiv).wrapInner(wrapperDiv); $td.append(markerDiv).wrapInner(wrapperDiv);
}); }
//if there is only 1 cursor on the page highlight it by default. //if there is only 1 cursor on the page highlight it by default.
if ($cursorRows.length === 1) { if ($cursorRows.length === 1) {
@ -457,6 +468,8 @@ var AIRTIME = (function(AIRTIME){
$cursorRows.addClass("cursor-selected-row"); $cursorRows.addClass("cursor-selected-row");
} }
} }
$parent.append($table);
} }
//order of importance of elements for setting the next timeout. //order of importance of elements for setting the next timeout.

View File

@ -206,6 +206,7 @@ AIRTIME = (function(AIRTIME) {
} }
}); });
/*
//check if the timeline viewed needs updating. //check if the timeline viewed needs updating.
setInterval(function(){ setInterval(function(){
var data = {}, var data = {},
@ -237,6 +238,7 @@ AIRTIME = (function(AIRTIME) {
} ); } );
}, 5 * 1000); //need refresh in milliseconds }, 5 * 1000); //need refresh in milliseconds
*/
}; };
mod.onResize = function() { mod.onResize = function() {