editing in progress
This commit is contained in:
parent
c744d88f23
commit
29c8570ade
8 changed files with 551 additions and 338 deletions
|
@ -6,8 +6,11 @@ class PlayouthistoryController extends Zend_Controller_Action
|
|||
{
|
||||
$ajaxContext = $this->_helper->getHelper('AjaxContext');
|
||||
$ajaxContext
|
||||
->addActionContext('playout-history-feed', 'json')
|
||||
->addActionContext('aggregate-history-feed', 'json')
|
||||
->addActionContext('item-history-feed', 'json')
|
||||
->addActionContext('edit-aggregate-item', 'json')
|
||||
->addActionContext('edit-list-item', 'json')
|
||||
->addActionContext('update-aggregate-item', 'json')
|
||||
->initContext();
|
||||
}
|
||||
|
||||
|
@ -58,7 +61,7 @@ class PlayouthistoryController extends Zend_Controller_Action
|
|||
$this->view->headLink()->appendStylesheet($baseUrl.'css/playouthistory.css?'.$CC_CONFIG['airtime_version']);
|
||||
}
|
||||
|
||||
public function playoutHistoryFeedAction()
|
||||
public function aggregateHistoryFeedAction()
|
||||
{
|
||||
$request = $this->getRequest();
|
||||
$current_time = time();
|
||||
|
@ -73,32 +76,70 @@ class PlayouthistoryController extends Zend_Controller_Action
|
|||
|
||||
$historyService = new Application_Service_HistoryService();
|
||||
$r = $historyService->getAggregateView($startsDT, $endsDT, $params);
|
||||
|
||||
|
||||
$this->view->sEcho = $r["sEcho"];
|
||||
$this->view->iTotalDisplayRecords = $r["iTotalDisplayRecords"];
|
||||
$this->view->iTotalRecords = $r["iTotalRecords"];
|
||||
$this->view->history = $r["history"];
|
||||
}
|
||||
|
||||
|
||||
public function itemHistoryFeedAction()
|
||||
{
|
||||
$request = $this->getRequest();
|
||||
$current_time = time();
|
||||
|
||||
$params = $request->getParams();
|
||||
|
||||
$starts_epoch = $request->getParam("start", $current_time - (60*60*24));
|
||||
$ends_epoch = $request->getParam("end", $current_time);
|
||||
|
||||
$startsDT = DateTime::createFromFormat("U", $starts_epoch, new DateTimeZone("UTC"));
|
||||
$endsDT = DateTime::createFromFormat("U", $ends_epoch, new DateTimeZone("UTC"));
|
||||
|
||||
$historyService = new Application_Service_HistoryService();
|
||||
$r = $historyService->getListView($startsDT, $endsDT, $params);
|
||||
|
||||
$this->view->sEcho = $r["sEcho"];
|
||||
$this->view->iTotalDisplayRecords = $r["iTotalDisplayRecords"];
|
||||
$this->view->iTotalRecords = $r["iTotalRecords"];
|
||||
$this->view->history = $r["history"];
|
||||
}
|
||||
|
||||
public function editAggregateItemAction()
|
||||
{
|
||||
$file_id = $this->_getParam('id');
|
||||
|
||||
|
||||
$historyService = new Application_Service_HistoryService();
|
||||
$form = $historyService->makeHistoryFileForm($file_id);
|
||||
|
||||
|
||||
$this->view->form = $form;
|
||||
$this->view->dialog = $this->view->render('form/edit-history-file.phtml');
|
||||
|
||||
|
||||
unset($this->view->form);
|
||||
}
|
||||
|
||||
public function editListItemAction()
|
||||
{
|
||||
$file_id = $this->_getParam('id');
|
||||
|
||||
$historyService = new Application_Service_HistoryService();
|
||||
$form = $historyService->makeHistoryFileForm($file_id);
|
||||
|
||||
$this->view->form = $form;
|
||||
$this->view->dialog = $this->view->render('form/edit-history-file.phtml');
|
||||
|
||||
unset($this->view->form);
|
||||
}
|
||||
|
||||
public function updateAggregateItemAction()
|
||||
{
|
||||
$file_id = $this->_getParam('id');
|
||||
|
||||
$historyService = new Application_Service_HistoryService();
|
||||
$historyService->editPlayedFile($file_id);
|
||||
}
|
||||
$request = $this->getRequest();
|
||||
$params = $request->getPost();
|
||||
Logging::info($params);
|
||||
|
||||
$historyService = new Application_Service_HistoryService();
|
||||
$json = $historyService->editPlayedFile($params);
|
||||
|
||||
$this->view->data = $json;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
class Application_Form_EditHistoryFile extends Zend_Form
|
||||
{
|
||||
public function init() {
|
||||
|
||||
|
||||
/*
|
||||
$this->setDecorators(
|
||||
array(
|
||||
|
@ -11,12 +11,17 @@ class Application_Form_EditHistoryFile extends Zend_Form
|
|||
)
|
||||
);
|
||||
*/
|
||||
|
||||
|
||||
$this->setMethod('post');
|
||||
|
||||
|
||||
$this->addElement('hidden', 'file_id');
|
||||
|
||||
|
||||
|
||||
$file_id = new Zend_Form_Element_Hidden('his_file_id');
|
||||
$file_id->setValidators(array(
|
||||
new Zend_Validate_Int()
|
||||
));
|
||||
$this->addElement($file_id);
|
||||
|
||||
|
||||
/* Title form element */
|
||||
$title = new Zend_Form_Element_Text('his_file_title');
|
||||
$title->setLabel(_('Title:'));
|
||||
|
@ -24,7 +29,7 @@ class Application_Form_EditHistoryFile extends Zend_Form
|
|||
$title->addFilter('StringTrim');
|
||||
//$title->setDecorators(array('viewHelper'));
|
||||
$this->addElement($title);
|
||||
|
||||
|
||||
/* Creator form element */
|
||||
$creator = new Zend_Form_Element_Text('his_file_creator');
|
||||
$creator->setLabel(_('Creator:'));
|
||||
|
@ -32,7 +37,7 @@ class Application_Form_EditHistoryFile extends Zend_Form
|
|||
$creator->addFilter('StringTrim');
|
||||
//$creator->setDecorators(array('viewHelper'));
|
||||
$this->addElement($creator);
|
||||
|
||||
|
||||
/* Composer form element */
|
||||
$composer = new Zend_Form_Element_Text('his_file_composer');
|
||||
$composer->setLabel(_('Composer:'));
|
||||
|
@ -40,7 +45,7 @@ class Application_Form_EditHistoryFile extends Zend_Form
|
|||
$composer->addFilter('StringTrim');
|
||||
//$composer->setDecorators(array('viewHelper'));
|
||||
$this->addElement($composer);
|
||||
|
||||
|
||||
/* Copyright form element */
|
||||
$copyright = new Zend_Form_Element_Text('his_file_copyright');
|
||||
$copyright->setLabel(_('Copyright:'));
|
||||
|
@ -48,33 +53,33 @@ class Application_Form_EditHistoryFile extends Zend_Form
|
|||
$copyright->addFilter('StringTrim');
|
||||
//$copyright->setDecorators(array('viewHelper'));
|
||||
$this->addElement($copyright);
|
||||
|
||||
|
||||
// Add the submit button
|
||||
$this->addElement('button', 'his_file_save', array(
|
||||
'ignore' => true,
|
||||
'class' => 'btn',
|
||||
'class' => 'btn his_file_save',
|
||||
'label' => _('Save'),
|
||||
'decorators' => array(
|
||||
'ViewHelper'
|
||||
)
|
||||
));
|
||||
|
||||
|
||||
// Add the cancel button
|
||||
$this->addElement('button', 'his_file_cancel', array(
|
||||
'ignore' => true,
|
||||
'class' => 'btn',
|
||||
'class' => 'btn his_file_cancel',
|
||||
'label' => _('Cancel'),
|
||||
'decorators' => array(
|
||||
'ViewHelper'
|
||||
)
|
||||
));
|
||||
|
||||
|
||||
$this->addDisplayGroup(
|
||||
array(
|
||||
'his_file_save',
|
||||
'his_file_save',
|
||||
'his_file_cancel'
|
||||
),
|
||||
'submitButtons',
|
||||
),
|
||||
'submitButtons',
|
||||
array(
|
||||
'decorators' => array(
|
||||
'FormElements',
|
||||
|
|
|
@ -58,43 +58,6 @@ class Application_Model_Datatables
|
|||
public static function findEntries($con, $displayColumns, $fromTable,
|
||||
$data, $dataProp = "aaData")
|
||||
{
|
||||
$librarySetting =
|
||||
Application_Model_Preference::getCurrentLibraryTableColumnMap();
|
||||
//$displayColumns[] = 'owner';
|
||||
|
||||
// map that maps original column position to db name
|
||||
$current2dbname = array();
|
||||
// array of search terms
|
||||
$orig2searchTerm = array();
|
||||
foreach ($data as $key => $d) {
|
||||
if (strstr($key, "mDataProp_")) {
|
||||
list($dump, $index) = explode("_", $key);
|
||||
$current2dbname[$index] = $d;
|
||||
} elseif (strstr($key, "sSearch_")) {
|
||||
list($dump, $index) = explode("_", $key);
|
||||
$orig2searchTerm[$index] = $d;
|
||||
}
|
||||
}
|
||||
|
||||
// map that maps dbname to searchTerm
|
||||
$dbname2searchTerm = array();
|
||||
foreach ($current2dbname as $currentPos => $dbname) {
|
||||
$new_index = $librarySetting($currentPos);
|
||||
// TODO : Fix this retarded hack later. Just a band aid for
|
||||
// now at least we print some warnings so that we don't
|
||||
// forget about this -- cc-4462
|
||||
if ( array_key_exists($new_index, $orig2searchTerm) ) {
|
||||
$dbname2searchTerm[$dbname] = $orig2searchTerm[$new_index];
|
||||
} else {
|
||||
Logging::warn("Trying to reorder to unknown index
|
||||
printing as much debugging as possible...");
|
||||
$debug = array(
|
||||
'$new_index' => $new_index,
|
||||
'$currentPos' => $currentPos,
|
||||
'$orig2searchTerm' => $orig2searchTerm);
|
||||
Logging::warn($debug);
|
||||
}
|
||||
}
|
||||
|
||||
$where = array();
|
||||
/* Holds the parameters for binding after the statement has been
|
||||
|
@ -102,6 +65,45 @@ class Application_Model_Datatables
|
|||
$params = array();
|
||||
|
||||
if (isset($data['advSearch']) && $data['advSearch'] === 'true') {
|
||||
|
||||
$librarySetting =
|
||||
Application_Model_Preference::getCurrentLibraryTableColumnMap();
|
||||
//$displayColumns[] = 'owner';
|
||||
|
||||
// map that maps original column position to db name
|
||||
$current2dbname = array();
|
||||
// array of search terms
|
||||
$orig2searchTerm = array();
|
||||
foreach ($data as $key => $d) {
|
||||
if (strstr($key, "mDataProp_")) {
|
||||
list($dump, $index) = explode("_", $key);
|
||||
$current2dbname[$index] = $d;
|
||||
} elseif (strstr($key, "sSearch_")) {
|
||||
list($dump, $index) = explode("_", $key);
|
||||
$orig2searchTerm[$index] = $d;
|
||||
}
|
||||
}
|
||||
|
||||
// map that maps dbname to searchTerm
|
||||
$dbname2searchTerm = array();
|
||||
foreach ($current2dbname as $currentPos => $dbname) {
|
||||
$new_index = $librarySetting($currentPos);
|
||||
// TODO : Fix this retarded hack later. Just a band aid for
|
||||
// now at least we print some warnings so that we don't
|
||||
// forget about this -- cc-4462
|
||||
if ( array_key_exists($new_index, $orig2searchTerm) ) {
|
||||
$dbname2searchTerm[$dbname] = $orig2searchTerm[$new_index];
|
||||
} else {
|
||||
Logging::warn("Trying to reorder to unknown index
|
||||
printing as much debugging as possible...");
|
||||
$debug = array(
|
||||
'$new_index' => $new_index,
|
||||
'$currentPos' => $currentPos,
|
||||
'$orig2searchTerm' => $orig2searchTerm);
|
||||
Logging::warn($debug);
|
||||
}
|
||||
}
|
||||
|
||||
$advancedWhere = self::buildWhereClauseForAdvancedSearch($dbname2searchTerm);
|
||||
if (!empty($advancedWhere['clause'])) {
|
||||
$where[] = join(" AND ", $advancedWhere['clause']);
|
||||
|
@ -119,7 +121,6 @@ class Application_Model_Datatables
|
|||
$sql = $selectorCount." FROM ".$fromTable;
|
||||
$sqlTotalRows = $sql;
|
||||
|
||||
|
||||
if (isset($searchTerms)) {
|
||||
$searchCols = array();
|
||||
for ($i = 0; $i < $data["iColumns"]; $i++) {
|
||||
|
@ -164,57 +165,47 @@ class Application_Model_Datatables
|
|||
|
||||
$sql = $selectorRows." FROM ".$fromTable." WHERE ".$where." ORDER BY ".$orderby;
|
||||
|
||||
//limit the results returned.
|
||||
if ($displayLength !== -1) {
|
||||
$sql .= " OFFSET ".$data["iDisplayStart"]." LIMIT ".$displayLength;
|
||||
}
|
||||
} else {
|
||||
$sql = $selectorRows." FROM ".$fromTable." ORDER BY ".$orderby;
|
||||
|
||||
//limit the results returned.
|
||||
if ($displayLength !== -1) {
|
||||
$sql .= " OFFSET ".$data["iDisplayStart"]." LIMIT ".$displayLength;
|
||||
}
|
||||
}
|
||||
else {
|
||||
$sql = $selectorRows." FROM ".$fromTable." ORDER BY ".$orderby;
|
||||
}
|
||||
|
||||
//limit the results returned.
|
||||
if ($displayLength !== -1) {
|
||||
$sql .= " OFFSET ".$data["iDisplayStart"]." LIMIT ".$displayLength;
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
|
||||
Logging::info($sqlTotalRows);
|
||||
|
||||
$r = $con->query($sqlTotalRows);
|
||||
$totalRows = $r->fetchColumn(0);
|
||||
|
||||
if (isset($sqlTotalDisplayRows)) {
|
||||
Logging::info("sql is set");
|
||||
Logging::info($sqlTotalDisplayRows);
|
||||
$totalDisplayRows = Application_Common_Database::prepareAndExecute($sqlTotalDisplayRows, $params, 'column');
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
Logging::info("sql is not set.");
|
||||
$totalDisplayRows = $totalRows;
|
||||
}
|
||||
|
||||
//TODO
|
||||
if ($needToBind) {
|
||||
$results = Application_Common_Database::prepareAndExecute($sql, $params);
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
$stmt = $con->query($sql);
|
||||
$stmt->setFetchMode(PDO::FETCH_ASSOC);
|
||||
$results = $stmt->fetchAll();
|
||||
}
|
||||
|
||||
// we need to go over all items and fix length for playlist
|
||||
// in case the playlist contains dynamic block
|
||||
foreach ($results as &$r) {
|
||||
//this function is also called for Manage Users so in
|
||||
//this case there will be no 'ftype'
|
||||
if (isset($r['ftype'])) {
|
||||
if ($r['ftype'] == 'playlist') {
|
||||
$pl = new Application_Model_Playlist($r['id']);
|
||||
$r['length'] = $pl->getLength();
|
||||
} elseif ($r['ftype'] == "block") {
|
||||
$bl = new Application_Model_Block($r['id']);
|
||||
$r['bl_type'] = $bl->isStatic() ? 'static' : 'dynamic';
|
||||
$r['length'] = $bl->getLength();
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
Logging::debug($e->getMessage());
|
||||
}
|
||||
catch (Exception $e) {
|
||||
Logging::info($e->getMessage());
|
||||
}
|
||||
|
||||
return array(
|
||||
"sEcho" => intval($data["sEcho"]),
|
||||
"iTotalDisplayRecords" => intval($totalDisplayRows),
|
||||
|
|
|
@ -778,6 +778,18 @@ SQL;
|
|||
foreach ($results['aaData'] as &$row) {
|
||||
$row['id'] = intval($row['id']);
|
||||
|
||||
//taken from Datatables.php, needs to be cleaned up there.
|
||||
if (isset($r['ftype'])) {
|
||||
if ($r['ftype'] == 'playlist') {
|
||||
$pl = new Application_Model_Playlist($r['id']);
|
||||
$r['length'] = $pl->getLength();
|
||||
} elseif ($r['ftype'] == "block") {
|
||||
$bl = new Application_Model_Block($r['id']);
|
||||
$r['bl_type'] = $bl->isStatic() ? 'static' : 'dynamic';
|
||||
$r['length'] = $bl->getLength();
|
||||
}
|
||||
}
|
||||
|
||||
if ($row['ftype'] === "audioclip") {
|
||||
|
||||
$cuein_formatter = new LengthFormatter($row["cuein"]);
|
||||
|
|
|
@ -6,7 +6,7 @@ class Application_Service_HistoryService
|
|||
{
|
||||
private $con;
|
||||
private $timezone;
|
||||
|
||||
|
||||
private $mDataPropMap = array (
|
||||
"artist" => "artist_name",
|
||||
"title" => "track_title",
|
||||
|
@ -14,131 +14,200 @@ class Application_Service_HistoryService
|
|||
"length" => "length",
|
||||
"composer" => "composer",
|
||||
"copyright" => "copyright",
|
||||
"starts" => "starts",
|
||||
"ends" => "ends"
|
||||
);
|
||||
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->con = isset($con) ? $con : Propel::getConnection(CcPlayoutHistoryPeer::DATABASE_NAME);
|
||||
$this->timezone = date_default_timezone_get();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* map front end mDataProp labels to proper column names for searching etc.
|
||||
*/
|
||||
private function translateColumns($opts)
|
||||
{
|
||||
for ($i = 0; $i < $opts["iColumns"]; $i++) {
|
||||
|
||||
|
||||
if ($opts["bSearchable_{$i}"] === "true") {
|
||||
$opts["mDataProp_{$i}"] = $this->mDataPropMap[$opts["mDataProp_{$i}"]];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public function getListView($startDT, $endDT, $opts)
|
||||
{
|
||||
$this->translateColumns($opts);
|
||||
|
||||
$select = array (
|
||||
"file.track_title as title",
|
||||
"file.artist_name as artist",
|
||||
"playout.starts",
|
||||
"playout.ends",
|
||||
"playout.history_id"
|
||||
);
|
||||
|
||||
$start = $startDT->format("Y-m-d H:i:s");
|
||||
$end = $endDT->format("Y-m-d H:i:s");
|
||||
|
||||
$historyTable = "(
|
||||
select history.starts as starts, history.ends as ends,
|
||||
history.id as history_id, history.file_id as file_id
|
||||
from cc_playout_history as history
|
||||
where history.starts >= '{$start}' and history.starts < '{$end}'
|
||||
) AS playout
|
||||
left join cc_files as file on (file.id = playout.file_id)";
|
||||
|
||||
$results = Application_Model_Datatables::findEntries($this->con, $select, $historyTable, $opts, "history");
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
public function getAggregateView($startDT, $endDT, $opts)
|
||||
{
|
||||
$this->translateColumns($opts);
|
||||
|
||||
|
||||
$select = array (
|
||||
"file.track_title as title",
|
||||
"file.artist_name as artist",
|
||||
"playout.played",
|
||||
"playout.played as played",
|
||||
"playout.file_id",
|
||||
"file.composer",
|
||||
"file.copyright",
|
||||
"file.length"
|
||||
"file.composer as composer",
|
||||
"file.copyright as copyright",
|
||||
"file.length as length"
|
||||
);
|
||||
|
||||
|
||||
$start = $startDT->format("Y-m-d H:i:s");
|
||||
$end = $endDT->format("Y-m-d H:i:s");
|
||||
|
||||
$end = $endDT->format("Y-m-d H:i:s");
|
||||
|
||||
$historyTable = "(
|
||||
select count(history.file_id) as played, history.file_id as file_id
|
||||
from cc_playout_history as history
|
||||
where history.starts >= '{$start}' and history.starts < '{$end}'
|
||||
group by history.file_id
|
||||
) AS playout
|
||||
) AS playout
|
||||
left join cc_files as file on (file.id = playout.file_id)";
|
||||
|
||||
|
||||
$results = Application_Model_Datatables::findEntries($this->con, $select, $historyTable, $opts, "history");
|
||||
|
||||
|
||||
foreach ($results["history"] as &$row) {
|
||||
$formatter = new LengthFormatter($row['length']);
|
||||
$row['length'] = $formatter->format();
|
||||
}
|
||||
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
|
||||
public function insertPlayedItem($schedId) {
|
||||
|
||||
|
||||
$this->con->beginTransaction();
|
||||
|
||||
|
||||
try {
|
||||
|
||||
|
||||
$item = CcScheduleQuery::create()->findPK($schedId, $this->con);
|
||||
|
||||
|
||||
//TODO figure out how to combine these all into 1 query.
|
||||
$showInstance = $item->getCcShowInstances($this->con);
|
||||
$show = $showInstance->getCcShow($this->con);
|
||||
|
||||
|
||||
$fileId = $item->getDbFileId();
|
||||
|
||||
|
||||
//don't add webstreams
|
||||
if (isset($fileId)) {
|
||||
|
||||
|
||||
//$starts = $item->getDbStarts(null);
|
||||
//$ends = $item->getDbEnds(null);
|
||||
|
||||
|
||||
$metadata = array();
|
||||
//$metadata["date"] = $starts->format('Y-m-d');
|
||||
//$metadata["start"] = $starts->format('H:i:s');
|
||||
//$metadata["end"] = $ends->format('H:i:s');
|
||||
$metadata["showname"] = $show->getDbName();
|
||||
|
||||
|
||||
$history = new CcPlayoutHistory();
|
||||
$history->setDbFileId($fileId);
|
||||
$history->setDbStarts($item->getDbStarts(null));
|
||||
$history->setDbEnds($item->getDbEnds(null));
|
||||
|
||||
|
||||
foreach ($metadata as $key => $val) {
|
||||
$meta = new CcPlayoutHistoryMetaData();
|
||||
$meta->setDbKey($key);
|
||||
$meta->setDbValue($val);
|
||||
|
||||
|
||||
$history->addCcPlayoutHistoryMetaData($meta);
|
||||
}
|
||||
|
||||
|
||||
$history->save($this->con);
|
||||
}
|
||||
|
||||
|
||||
$this->con->commit();
|
||||
}
|
||||
}
|
||||
catch (Exception $e) {
|
||||
$this->con->rollback();
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
public function makeHistoryItemForm() {
|
||||
|
||||
|
||||
/* id is an id in cc_playout_history */
|
||||
public function makeHistoryItemForm($id) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* id is an id in cc_files */
|
||||
public function makeHistoryFileForm($id) {
|
||||
|
||||
$form = new Application_Form_EditHistoryFile();
|
||||
|
||||
return $form;
|
||||
|
||||
try {
|
||||
$form = new Application_Form_EditHistoryFile();
|
||||
|
||||
$file = Application_Model_StoredFile::RecallById($id, $this->con);
|
||||
$md = $file->getDbColMetadata();
|
||||
|
||||
$form->populate(array(
|
||||
'his_file_id' => $id,
|
||||
'his_file_title' => $md[MDATA_KEY_TITLE],
|
||||
'his_file_creator' => $md[MDATA_KEY_CREATOR],
|
||||
'his_file_composer' => $md[MDATA_KEY_COMPOSER],
|
||||
'his_file_copyright' => $md[MDATA_KEY_COPYRIGHT]
|
||||
));
|
||||
|
||||
return $form;
|
||||
}
|
||||
catch (Exception $e) {
|
||||
Logging::debug($e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* id is an id in cc_playout_history */
|
||||
public function editPlayedItem($id) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* id is an id in cc_files */
|
||||
public function editPlayedFile($id) {
|
||||
|
||||
public function editPlayedFile($data) {
|
||||
|
||||
$form = new Application_Form_EditHistoryFile();
|
||||
|
||||
$json = $form->processAjax($data);
|
||||
Logging::info($json);
|
||||
|
||||
if ($form->isValid($data)) {
|
||||
|
||||
$id = $data["his_file_id"];
|
||||
$file = Application_Model_StoredFile::RecallById($id, $this->con);
|
||||
|
||||
$md = array(
|
||||
MDATA_KEY_TITLE => $data['his_file_title'],
|
||||
MDATA_KEY_CREATOR => $data['his_file_creator'],
|
||||
MDATA_KEY_COMPOSER => $data['his_file_composer'],
|
||||
MDATA_KEY_COPYRIGHT => $data['his_file_copyright']
|
||||
);
|
||||
|
||||
$file->setDbColMetadata($md);
|
||||
}
|
||||
|
||||
return $json;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,3 +1,3 @@
|
|||
<div class="ui-widget ui-widget-content block-shadow simple-formblock clearfix padded-strong" id="edit-history-file">
|
||||
<?php echo $this->form; ?>
|
||||
<?php echo $this->form; ?>
|
||||
</div>
|
|
@ -1,4 +1,18 @@
|
|||
<div id="history_content" class="ui-widget ui-widget-content block-shadow alpha-block padded">
|
||||
<?php echo $this->date_form; ?>
|
||||
<table id="history_table" cellpadding="0" cellspacing="0" class="datatable"></table>
|
||||
<?php echo $this->date_form; ?>
|
||||
|
||||
|
||||
<div id="his-tabs">
|
||||
<ul>
|
||||
<li><a href="#his-tabs-1"><?php echo _("Aggregate"); ?></a></li>
|
||||
<li><a href="#his-tabs-2"><?php echo _("List"); ?></a></li>
|
||||
</ul>
|
||||
<div id="his-tabs-1">
|
||||
<table id="history_table_aggregate" cellpadding="0" cellspacing="0" class="datatable"></table>
|
||||
</div>
|
||||
<div id="his-tabs-2">
|
||||
<table id="history_table_list" cellpadding="0" cellspacing="0" class="datatable"></table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
|
@ -1,35 +1,3 @@
|
|||
function getFileName(ext){
|
||||
var filename = $("#his_date_start").val()+"_"+$("#his_time_start").val()+"m--"+$("#his_date_end").val()+"_"+$("#his_time_end").val()+"m";
|
||||
filename = filename.replace(/:/g,"h");
|
||||
|
||||
if (ext == "pdf"){
|
||||
filename = filename+".pdf";
|
||||
}
|
||||
else {
|
||||
filename = filename+".csv";
|
||||
}
|
||||
return filename;
|
||||
}
|
||||
|
||||
function setFlashFileName( nButton, oConfig, oFlash ) {
|
||||
var filename = getFileName(oConfig.sExtends);
|
||||
oFlash.setFileName( filename );
|
||||
|
||||
if (oConfig.sExtends == "pdf") {
|
||||
this.fnSetText( oFlash,
|
||||
"title:"+ this.fnGetTitle(oConfig) +"\n"+
|
||||
"message:"+ oConfig.sPdfMessage +"\n"+
|
||||
"colWidth:"+ this.fnCalcColRatios(oConfig) +"\n"+
|
||||
"orientation:"+ oConfig.sPdfOrientation +"\n"+
|
||||
"size:"+ oConfig.sPdfSize +"\n"+
|
||||
"--/TableToolsOpts--\n" +
|
||||
this.fnGetTableData(oConfig));
|
||||
}
|
||||
else {
|
||||
this.fnSetText(oFlash, this.fnGetTableData(oConfig));
|
||||
}
|
||||
}
|
||||
|
||||
var AIRTIME = (function(AIRTIME) {
|
||||
var mod;
|
||||
|
||||
|
@ -38,33 +6,97 @@ var AIRTIME = (function(AIRTIME) {
|
|||
}
|
||||
mod = AIRTIME.history;
|
||||
|
||||
mod.historyTable = function() {
|
||||
var oTable,
|
||||
historyContentDiv = $("#history_content"),
|
||||
historyTableDiv = historyContentDiv.find("#history_table"),
|
||||
tableHeight = historyContentDiv.height() - 200,
|
||||
fnServerData;
|
||||
|
||||
fnServerData = function ( sSource, aoData, fnCallback ) {
|
||||
|
||||
if (fnServerData.hasOwnProperty("start")) {
|
||||
aoData.push( { name: "start", value: fnServerData.start} );
|
||||
}
|
||||
if (fnServerData.hasOwnProperty("end")) {
|
||||
aoData.push( { name: "end", value: fnServerData.end} );
|
||||
}
|
||||
|
||||
aoData.push( { name: "format", value: "json"} );
|
||||
|
||||
$.ajax( {
|
||||
"dataType": 'json',
|
||||
"type": "GET",
|
||||
"url": sSource,
|
||||
"data": aoData,
|
||||
"success": fnCallback
|
||||
} );
|
||||
},
|
||||
var $historyContentDiv;
|
||||
|
||||
var oTableTools = {
|
||||
"sSwfPath": baseUrl+"js/datatables/plugin/TableTools/swf/copy_cvs_xls_pdf.swf",
|
||||
"aButtons": [
|
||||
{
|
||||
"sExtends": "copy",
|
||||
"fnComplete": function(nButton, oConfig, oFlash, text) {
|
||||
var lines = text.split('\n').length,
|
||||
len = this.s.dt.nTFoot === null ? lines-1 : lines-2,
|
||||
plural = (len==1) ? "" : "s";
|
||||
alert(sprintf($.i18n._('Copied %s row%s to the clipboard'), len, plural));
|
||||
}
|
||||
},
|
||||
{
|
||||
"sExtends": "csv",
|
||||
"fnClick": setFlashFileName
|
||||
},
|
||||
{
|
||||
"sExtends": "pdf",
|
||||
"fnClick": setFlashFileName
|
||||
},
|
||||
{
|
||||
"sExtends": "print",
|
||||
"sInfo" : sprintf($.i18n._("%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished."), "<h6>", "</h6><p>")
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
var lengthMenu = [[50, 100, 500, -1], [50, 100, 500, $.i18n._("All")]];
|
||||
|
||||
var sDom = 'lf<"dt-process-rel"r><"H"T><"dataTables_scrolling"t><"F"ip>';
|
||||
|
||||
function getFileName(ext){
|
||||
var filename = $("#his_date_start").val()+"_"+$("#his_time_start").val()+"m--"+$("#his_date_end").val()+"_"+$("#his_time_end").val()+"m";
|
||||
filename = filename.replace(/:/g,"h");
|
||||
|
||||
if (ext == "pdf"){
|
||||
filename = filename+".pdf";
|
||||
}
|
||||
else {
|
||||
filename = filename+".csv";
|
||||
}
|
||||
return filename;
|
||||
}
|
||||
|
||||
function setFlashFileName( nButton, oConfig, oFlash ) {
|
||||
var filename = getFileName(oConfig.sExtends);
|
||||
oFlash.setFileName( filename );
|
||||
|
||||
if (oConfig.sExtends == "pdf") {
|
||||
this.fnSetText( oFlash,
|
||||
"title:"+ this.fnGetTitle(oConfig) +"\n"+
|
||||
"message:"+ oConfig.sPdfMessage +"\n"+
|
||||
"colWidth:"+ this.fnCalcColRatios(oConfig) +"\n"+
|
||||
"orientation:"+ oConfig.sPdfOrientation +"\n"+
|
||||
"size:"+ oConfig.sPdfSize +"\n"+
|
||||
"--/TableToolsOpts--\n" +
|
||||
this.fnGetTableData(oConfig));
|
||||
}
|
||||
else {
|
||||
this.fnSetText(oFlash, this.fnGetTableData(oConfig));
|
||||
}
|
||||
}
|
||||
|
||||
/* This callback can be used for all history tables */
|
||||
function fnServerData( sSource, aoData, fnCallback ) {
|
||||
|
||||
if (fnServerData.hasOwnProperty("start")) {
|
||||
aoData.push( { name: "start", value: fnServerData.start} );
|
||||
}
|
||||
if (fnServerData.hasOwnProperty("end")) {
|
||||
aoData.push( { name: "end", value: fnServerData.end} );
|
||||
}
|
||||
|
||||
aoData.push( { name: "format", value: "json"} );
|
||||
|
||||
$.ajax( {
|
||||
"dataType": 'json',
|
||||
"type": "GET",
|
||||
"url": sSource,
|
||||
"data": aoData,
|
||||
"success": fnCallback
|
||||
} );
|
||||
}
|
||||
|
||||
function aggregateHistoryTable() {
|
||||
var oTable,
|
||||
$historyTableDiv = $historyContentDiv.find("#history_table_aggregate"),
|
||||
fnRowCallback;
|
||||
|
||||
fnRowCallback = function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) {
|
||||
var url = baseUrl+"Playouthistory/edit-aggregate-item/format/json/id/"+aData.file_id,
|
||||
$link = $("<a/>", {
|
||||
|
@ -75,7 +107,7 @@ var AIRTIME = (function(AIRTIME) {
|
|||
$('td.his_edit', nRow).html($link);
|
||||
};
|
||||
|
||||
oTable = historyTableDiv.dataTable( {
|
||||
oTable = $historyTableDiv.dataTable( {
|
||||
|
||||
"aoColumns": [
|
||||
{"sTitle": $.i18n._("Title"), "mDataProp": "title", "sClass": "his_title"}, /* Title */
|
||||
|
@ -89,150 +121,199 @@ var AIRTIME = (function(AIRTIME) {
|
|||
|
||||
"bProcessing": true,
|
||||
"bServerSide": true,
|
||||
"sAjaxSource": baseUrl+"Playouthistory/playout-history-feed",
|
||||
"sAjaxSource": baseUrl+"playouthistory/aggregate-history-feed",
|
||||
"sAjaxDataProp": "history",
|
||||
|
||||
"fnServerData": fnServerData,
|
||||
|
||||
"fnRowCallback": fnRowCallback,
|
||||
|
||||
"oLanguage": datatables_dict,
|
||||
|
||||
"aLengthMenu": [[50, 100, 500, -1], [50, 100, 500, $.i18n._("All")]],
|
||||
"aLengthMenu": lengthMenu,
|
||||
"iDisplayLength": 50,
|
||||
|
||||
"sPaginationType": "full_numbers",
|
||||
"bJQueryUI": true,
|
||||
"bAutoWidth": true,
|
||||
|
||||
"sDom": 'lf<"dt-process-rel"r><"H"T><"dataTables_scrolling"t><"F"ip>',
|
||||
|
||||
"oTableTools": {
|
||||
"sSwfPath": baseUrl+"js/datatables/plugin/TableTools/swf/copy_cvs_xls_pdf.swf",
|
||||
"aButtons": [
|
||||
{
|
||||
"sExtends": "copy",
|
||||
"fnComplete": function(nButton, oConfig, oFlash, text) {
|
||||
var lines = text.split('\n').length,
|
||||
len = this.s.dt.nTFoot === null ? lines-1 : lines-2,
|
||||
plural = (len==1) ? "" : "s";
|
||||
alert(sprintf($.i18n._('Copied %s row%s to the clipboard'), len, plural));
|
||||
}
|
||||
},
|
||||
{
|
||||
"sExtends": "csv",
|
||||
"fnClick": setFlashFileName
|
||||
},
|
||||
{
|
||||
"sExtends": "pdf",
|
||||
"fnClick": setFlashFileName
|
||||
},
|
||||
{
|
||||
"sExtends": "print",
|
||||
"sInfo" : sprintf($.i18n._("%sPrint view%sPlease use your browser's print function to print this table. Press escape when finished."), "<h6>", "</h6><p>")
|
||||
}
|
||||
]
|
||||
}
|
||||
"sDom": sDom,
|
||||
"oTableTools": oTableTools
|
||||
});
|
||||
oTable.fnSetFilteringDelay(350);
|
||||
|
||||
historyContentDiv.find(".dataTables_scrolling").css("max-height", tableHeight);
|
||||
|
||||
|
||||
return oTable;
|
||||
}
|
||||
|
||||
function itemHistoryTable() {
|
||||
var oTable,
|
||||
$historyTableDiv = $historyContentDiv.find("#history_table_list"),
|
||||
fnRowCallback;
|
||||
|
||||
fnRowCallback = function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) {
|
||||
var url = baseUrl+"playouthistory/edit-list-item/format/json/id/"+aData.history_id,
|
||||
$link = $("<a/>", {
|
||||
"href": url,
|
||||
"text": $.i18n._("Edit")
|
||||
});
|
||||
|
||||
$('td.his_edit', nRow).html($link);
|
||||
};
|
||||
|
||||
oTable = $historyTableDiv.dataTable( {
|
||||
|
||||
"aoColumns": [
|
||||
{"sTitle": $.i18n._("Start"), "mDataProp": "starts", "sClass": "his_starts"}, /* Starts */
|
||||
{"sTitle": $.i18n._("End"), "mDataProp": "ends", "sClass": "his_ends"}, /* Ends */
|
||||
{"sTitle": $.i18n._("Title"), "mDataProp": "title", "sClass": "his_title"}, /* Title */
|
||||
{"sTitle": $.i18n._("Creator"), "mDataProp": "artist", "sClass": "his_artist"}, /* Creator */
|
||||
{"sTitle" : $.i18n._("Admin"), "mDataProp": "history_id", "bSearchable" : false, "sClass": "his_edit"}, /* id of history item */
|
||||
],
|
||||
|
||||
"bProcessing": true,
|
||||
"bServerSide": true,
|
||||
"sAjaxSource": baseUrl+"playouthistory/item-history-feed",
|
||||
"sAjaxDataProp": "history",
|
||||
"fnServerData": fnServerData,
|
||||
"fnRowCallback": fnRowCallback,
|
||||
"oLanguage": datatables_dict,
|
||||
"aLengthMenu": lengthMenu,
|
||||
"iDisplayLength": 50,
|
||||
"sPaginationType": "full_numbers",
|
||||
"bJQueryUI": true,
|
||||
"bAutoWidth": true,
|
||||
"sDom": sDom,
|
||||
"oTableTools": oTableTools
|
||||
});
|
||||
oTable.fnSetFilteringDelay(350);
|
||||
|
||||
return oTable;
|
||||
}
|
||||
|
||||
mod.onReady = function() {
|
||||
|
||||
var viewport = AIRTIME.utilities.findViewportDimensions(),
|
||||
widgetHeight = viewport.height - 185,
|
||||
screenWidth = Math.floor(viewport.width - 110),
|
||||
oBaseDatePickerSettings,
|
||||
oBaseTimePickerSettings,
|
||||
oTable,
|
||||
dateStartId = "#his_date_start",
|
||||
timeStartId = "#his_time_start",
|
||||
dateEndId = "#his_date_end",
|
||||
timeEndId = "#his_time_end",
|
||||
$hisDialogEl;
|
||||
|
||||
$historyContentDiv = $("#history_content");
|
||||
|
||||
function removeHistoryDialog() {
|
||||
$hisDialogEl.dialog("destroy");
|
||||
$hisDialogEl.remove();
|
||||
}
|
||||
|
||||
function makeHistoryDialog(html) {
|
||||
$hisDialogEl = $(html);
|
||||
|
||||
$hisDialogEl.dialog({
|
||||
title: $.i18n._("Edit History Record"),
|
||||
modal: true,
|
||||
close: function() {
|
||||
removeHistoryDialog();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
* Icon hover states for search.
|
||||
*/
|
||||
$historyContentDiv.on("mouseenter", ".his-timerange .ui-button", function(ev) {
|
||||
$(this).addClass("ui-state-hover");
|
||||
});
|
||||
$historyContentDiv.on("mouseleave", ".his-timerange .ui-button", function(ev) {
|
||||
$(this).removeClass("ui-state-hover");
|
||||
});
|
||||
|
||||
$historyContentDiv
|
||||
.height(widgetHeight)
|
||||
.width(screenWidth);
|
||||
|
||||
oBaseDatePickerSettings = {
|
||||
dateFormat: 'yy-mm-dd',
|
||||
//i18n_months, i18n_days_short are in common.js
|
||||
monthNames: i18n_months,
|
||||
dayNamesMin: i18n_days_short,
|
||||
onSelect: function(sDate, oDatePicker) {
|
||||
$(this).datepicker( "setDate", sDate );
|
||||
}
|
||||
};
|
||||
|
||||
oBaseTimePickerSettings = {
|
||||
showPeriodLabels: false,
|
||||
showCloseButton: true,
|
||||
closeButtonText: $.i18n._("Done"),
|
||||
showLeadingZero: false,
|
||||
defaultTime: '0:00',
|
||||
hourText: $.i18n._("Hour"),
|
||||
minuteText: $.i18n._("Minute")
|
||||
};
|
||||
|
||||
oTable = aggregateHistoryTable();
|
||||
itemHistoryTable();
|
||||
|
||||
$historyContentDiv.find(dateStartId).datepicker(oBaseDatePickerSettings);
|
||||
$historyContentDiv.find(timeStartId).timepicker(oBaseTimePickerSettings);
|
||||
$historyContentDiv.find(dateEndId).datepicker(oBaseDatePickerSettings);
|
||||
$historyContentDiv.find(timeEndId).timepicker(oBaseTimePickerSettings);
|
||||
|
||||
$historyContentDiv.on("click", "td.his_edit", function(e) {
|
||||
var url = e.target.href;
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
$.get(url, function(json) {
|
||||
|
||||
makeHistoryDialog(json.dialog);
|
||||
|
||||
}, "json");
|
||||
});
|
||||
|
||||
$('body').on("click", ".his_file_save", function(e) {
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
var $form = $(this).parents("form");
|
||||
var data = $form.serializeArray();
|
||||
|
||||
var url = baseUrl+"Playouthistory/update-aggregate-item/format/json";
|
||||
|
||||
$.post(url, data, function(json) {
|
||||
|
||||
//TODO put errors on form.
|
||||
if (json.data !== "true") {
|
||||
//makeHistoryDialog(json.dialog);
|
||||
}
|
||||
else {
|
||||
removeHistoryDialog();
|
||||
oTable.fnDraw();
|
||||
}
|
||||
|
||||
}, "json");
|
||||
|
||||
});
|
||||
|
||||
$historyContentDiv.find("#his_submit").click(function(ev){
|
||||
var fn,
|
||||
oRange;
|
||||
|
||||
oRange = AIRTIME.utilities.fnGetScheduleRange(dateStartId, timeStartId, dateEndId, timeEndId);
|
||||
|
||||
fn = oTable.fnSettings().fnServerData;
|
||||
fn.start = oRange.start;
|
||||
fn.end = oRange.end;
|
||||
|
||||
oTable.fnDraw();
|
||||
});
|
||||
|
||||
$historyContentDiv.find("#his-tabs").tabs();
|
||||
|
||||
};
|
||||
|
||||
return AIRTIME;
|
||||
|
||||
}(AIRTIME || {}));
|
||||
|
||||
$(document).ready(function(){
|
||||
|
||||
var viewport = AIRTIME.utilities.findViewportDimensions(),
|
||||
history_content = $("#history_content"),
|
||||
widgetHeight = viewport.height - 185,
|
||||
screenWidth = Math.floor(viewport.width - 110),
|
||||
oBaseDatePickerSettings,
|
||||
oBaseTimePickerSettings,
|
||||
oTable,
|
||||
dateStartId = "#his_date_start",
|
||||
timeStartId = "#his_time_start",
|
||||
dateEndId = "#his_date_end",
|
||||
timeEndId = "#his_time_end";
|
||||
|
||||
/*
|
||||
* Icon hover states for search.
|
||||
*/
|
||||
history_content.on("mouseenter", ".his-timerange .ui-button", function(ev) {
|
||||
$(this).addClass("ui-state-hover");
|
||||
});
|
||||
history_content.on("mouseleave", ".his-timerange .ui-button", function(ev) {
|
||||
$(this).removeClass("ui-state-hover");
|
||||
});
|
||||
|
||||
history_content
|
||||
.height(widgetHeight)
|
||||
.width(screenWidth);
|
||||
|
||||
oBaseDatePickerSettings = {
|
||||
dateFormat: 'yy-mm-dd',
|
||||
//i18n_months, i18n_days_short are in common.js
|
||||
monthNames: i18n_months,
|
||||
dayNamesMin: i18n_days_short,
|
||||
onSelect: function(sDate, oDatePicker) {
|
||||
$(this).datepicker( "setDate", sDate );
|
||||
}
|
||||
};
|
||||
|
||||
oBaseTimePickerSettings = {
|
||||
showPeriodLabels: false,
|
||||
showCloseButton: true,
|
||||
closeButtonText: $.i18n._("Done"),
|
||||
showLeadingZero: false,
|
||||
defaultTime: '0:00',
|
||||
hourText: $.i18n._("Hour"),
|
||||
minuteText: $.i18n._("Minute")
|
||||
};
|
||||
|
||||
oTable = AIRTIME.history.historyTable();
|
||||
|
||||
history_content.find(dateStartId).datepicker(oBaseDatePickerSettings);
|
||||
history_content.find(timeStartId).timepicker(oBaseTimePickerSettings);
|
||||
history_content.find(dateEndId).datepicker(oBaseDatePickerSettings);
|
||||
history_content.find(timeEndId).timepicker(oBaseTimePickerSettings);
|
||||
|
||||
history_content.on("click", "td.his_edit", function(e) {
|
||||
var url = e.target.href;
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
$.get(url, function(json) {
|
||||
var dialog = $(json.dialog);
|
||||
|
||||
dialog.dialog({
|
||||
autoOpen: false,
|
||||
title: $.i18n._("Edit History Record"),
|
||||
//width: 460,
|
||||
//height: 660,
|
||||
modal: true
|
||||
//close: closeDialogLibrary
|
||||
});
|
||||
|
||||
dialog.dialog('open');
|
||||
|
||||
}, "json");
|
||||
});
|
||||
|
||||
history_content.find("#his_submit").click(function(ev){
|
||||
var fn,
|
||||
oRange;
|
||||
|
||||
oRange = AIRTIME.utilities.fnGetScheduleRange(dateStartId, timeStartId, dateEndId, timeEndId);
|
||||
|
||||
fn = oTable.fnSettings().fnServerData;
|
||||
fn.start = oRange.start;
|
||||
fn.end = oRange.end;
|
||||
|
||||
oTable.fnDraw();
|
||||
});
|
||||
|
||||
});
|
||||
$(document).ready(AIRTIME.history.onReady);
|
Loading…
Add table
Add a link
Reference in a new issue