Revert "SAAS-1061 - implement podcast list view skeleton; small bugfixes"

This reverts commit 0fcf6a8dac.
This commit is contained in:
Duncan Sommerville 2015-09-14 18:29:43 -04:00
parent 0fcf6a8dac
commit 893d60ed44
16 changed files with 439 additions and 512 deletions

View File

@ -31,7 +31,6 @@ require_once "Auth.php";
require_once "interface/OAuth2.php"; require_once "interface/OAuth2.php";
require_once "TaskManager.php"; require_once "TaskManager.php";
require_once "UsabilityHints.php"; require_once "UsabilityHints.php";
require_once "MediaType.php";
require_once __DIR__.'/models/formatters/LengthFormatter.php'; require_once __DIR__.'/models/formatters/LengthFormatter.php';
require_once __DIR__.'/services/CeleryService.php'; require_once __DIR__.'/services/CeleryService.php';
require_once __DIR__.'/services/SoundcloudService.php'; require_once __DIR__.'/services/SoundcloudService.php';

View File

@ -36,8 +36,6 @@ set_include_path(implode(PATH_SEPARATOR, array(
))); )));
set_include_path(APPLICATION_PATH . 'common' . PATH_SEPARATOR . get_include_path()); set_include_path(APPLICATION_PATH . 'common' . PATH_SEPARATOR . get_include_path());
set_include_path(APPLICATION_PATH . 'common/enum' . PATH_SEPARATOR . get_include_path());
set_include_path(APPLICATION_PATH . 'common/interface' . PATH_SEPARATOR . get_include_path());
//Propel classes. //Propel classes.
set_include_path(APPLICATION_PATH . 'models' . PATH_SEPARATOR . get_include_path()); set_include_path(APPLICATION_PATH . 'models' . PATH_SEPARATOR . get_include_path());

View File

@ -1,47 +0,0 @@
<?php
/**
* Basic enumeration implementation; from http://stackoverflow.com/questions/254514/php-and-enumerations
*
* Class Enum
*/
abstract class Enum {
const __default = NULL;
private static $constCacheArray = NULL;
private function __construct() {}
private static function getConstants() {
if (self::$constCacheArray == NULL) {
self::$constCacheArray = [];
}
$calledClass = get_called_class();
if (!array_key_exists($calledClass, self::$constCacheArray)) {
$reflect = new ReflectionClass($calledClass);
self::$constCacheArray[$calledClass] = $reflect->getConstants();
}
return self::$constCacheArray[$calledClass];
}
public static function isValidName($name, $strict = false) {
$constants = self::getConstants();
if ($strict) {
return array_key_exists($name, $constants);
}
$keys = array_map('strtolower', array_keys($constants));
return in_array(strtolower($name), $keys);
}
public static function isValidValue($value) {
$values = array_values(self::getConstants());
return in_array($value, $values, $strict = true);
}
public static function getDefault() {
return static::__default;
}
}

View File

@ -1,14 +0,0 @@
<?php
require_once "Enum.php";
final class MediaType extends Enum {
const __default = self::FILE;
const FILE = 1;
const PLAYLIST = 2;
const BLOCK = 3;
const WEBSTREAM = 4;
const PODCAST = 5;
}

View File

@ -66,21 +66,22 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
<a href="#"><?php echo _("Webstream") ?></a> <a href="#"><?php echo _("Webstream") ?></a>
</li> </li>
</ul> </ul>
<a href="/plupload"> <a href="/Plupload">
<button id="add_media_btn" class="btn btn-small dashboard-btn btn-new"> <button id="add_media_btn" class="btn btn-small dashboard-btn btn-new">
<span><?php echo _("Upload") ?></span> <span><?php echo _("Upload") ?></span>
</button> </button>
</a> </a>
</div> </div>
<div class="media_type_selector top-link" data-selection-id="1">
<div class="media_type_selector top-link" data-selection-id="<?php echo MediaType::getDefault(); ?>"> <a href="/showbuilder#"><i class='icon-home icon-white'></i><?php echo _("Dashboard") ?></a></div>
<a href="/showbuilder#"> <div class="media_type_selector dashboard_sub_nav" data-selection-id="1">
<i class='icon-home icon-white'></i> <a href="/showbuilder#tracks"><i class='icon-music icon-white'></i><?php echo _("Tracks") ?></a></div>
<?php echo _("Dashboard") ?> <div class="media_type_selector dashboard_sub_nav" data-selection-id="2">
</a> <a href="/showbuilder#playlists"><i class='icon-list icon-white'></i><?php echo _("Playlists") ?></a></div>
</div> <div class="media_type_selector dashboard_sub_nav" data-selection-id="3">
<?php $subnavPrefix = "/showbuilder"; require_once APPLICATION_PATH . "views/scripts/partialviews/dashboard-sub-nav.php"; ?> <a href="/showbuilder#smart-blocks"><i class='icon-time icon-white'></i><?php echo _("Smart Blocks") ?></a></div>
<div class="media_type_selector dashboard_sub_nav" data-selection-id="4">
<a href="/showbuilder#webstreams"><i class='icon-random icon-white'></i><?php echo _("Webstreams") ?></a></div>
<hr style="margin-left: 5px; margin-right: 5px"> <hr style="margin-left: 5px; margin-right: 5px">
<div id="nav"> <div id="nav">
<?php echo $this->navigation()->menu(); ?> <?php echo $this->navigation()->menu(); ?>
@ -89,6 +90,7 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
<?php <?php
$partitions = Application_Model_Systemstatus::GetDiskInfo(); $partitions = Application_Model_Systemstatus::GetDiskInfo();
$status = new StdClass; $status = new StdClass;
$partitions = $partitions;
$disk = $partitions[0]; $disk = $partitions[0];
$used = $disk->totalSpace-$disk->totalFreeSpace; $used = $disk->totalSpace-$disk->totalFreeSpace;
$total = $disk->totalSpace; $total = $disk->totalSpace;

View File

@ -805,17 +805,21 @@ SQL;
$unionTable = "({$plTable} UNION {$blTable} UNION {$fileTable} UNION {$streamTable}) AS RESULTS"; $unionTable = "({$plTable} UNION {$blTable} UNION {$fileTable} UNION {$streamTable}) AS RESULTS";
//choose which table we need to select data from. //choose which table we need to select data from.
// TODO : use constants instead of numbers -- RG
switch ($type) { switch ($type) {
case MediaType::FILE: case 0:
$fromTable = $unionTable;
break;
case 1:
$fromTable = $fileTable." AS File"; //need an alias for the table if it's standalone. $fromTable = $fileTable." AS File"; //need an alias for the table if it's standalone.
break; break;
case MediaType::PLAYLIST: case 2:
$fromTable = $plTable." AS Playlist"; //need an alias for the table if it's standalone. $fromTable = $plTable." AS Playlist"; //need an alias for the table if it's standalone.
break; break;
case MediaType::BLOCK: case 3:
$fromTable = $blTable." AS Block"; //need an alias for the table if it's standalone. $fromTable = $blTable." AS Block"; //need an alias for the table if it's standalone.
break; break;
case MediaType::WEBSTREAM: case 4:
$fromTable = $streamTable." AS StreamTable"; //need an alias for the table if it's standalone. $fromTable = $streamTable." AS StreamTable"; //need an alias for the table if it's standalone.
break; break;
default: default:

View File

@ -1,30 +0,0 @@
<div class="media_type_selector dashboard_sub_nav" data-selection-id="<?php echo MediaType::FILE ?>">
<a href="<?php echo $subnavPrefix; ?>#tracks">
<i class='icon-music icon-white'></i>
<span class="selector-name"><?php echo _("Tracks") ?></span>
</a>
</div>
<div class="media_type_selector dashboard_sub_nav" data-selection-id="<?php echo MediaType::PLAYLIST ?>">
<a href="<?php echo $subnavPrefix; ?>#playlists">
<i class='icon-list icon-white'></i>
<span class="selector-name"><?php echo _("Playlists") ?></span>
</a>
</div>
<div class="media_type_selector dashboard_sub_nav" data-selection-id="<?php echo MediaType::BLOCK ?>">
<a href="<?php echo $subnavPrefix; ?>#smart-blocks">
<i class='icon-time icon-white'></i>
<span class="selector-name"><?php echo _("Smart Blocks") ?></span>
</a>
</div>
<div class="media_type_selector dashboard_sub_nav" data-selection-id="<?php echo MediaType::WEBSTREAM ?>">
<a href="<?php echo $subnavPrefix; ?>#webstreams">
<i class='icon-random icon-white'></i>
<span class="selector-name"><?php echo _("Webstreams") ?></span>
</a>
</div>
<div class="media_type_selector dashboard_sub_nav" data-selection-id="<?php echo MediaType::PODCAST ?>">
<a href="<?php echo $subnavPrefix; ?>#podcasts">
<i class='icon-headphones icon-white'></i>
<span class="selector-name"><?php echo _("Podcasts") ?></span>
</a>
</div>

View File

@ -1,7 +1,30 @@
<div><!-- jQuery UI changes the styling on the outermost div; use a blank div so as not to break the .wrapper styling--> <div><!-- jQuery UI changes the styling on the outermost div; use a blank div so as not to break the .wrapper styling-->
<div class="wrapper"> <div class="wrapper">
<div id="media_selector_wrapper"> <div id="media_selector_wrapper">
<?php $subnavPrefix = ""; require_once APPLICATION_PATH . "views/scripts/partialviews/dashboard-sub-nav.php"; ?> <div class="media_type_selector dashboard_sub_nav" data-selection-id="1">
<a href="#tracks">
<i class='icon-music icon-white'></i>
<span class="selector-name"><?php echo _("Tracks") ?></span>
</a>
</div>
<div class="media_type_selector dashboard_sub_nav" data-selection-id="2">
<a href="#playlists">
<i class='icon-list icon-white'></i>
<span class="selector-name"><?php echo _("Playlists") ?></span>
</a>
</div>
<div class="media_type_selector dashboard_sub_nav" data-selection-id="3">
<a href="#smart-blocks">
<i class='icon-time icon-white'></i>
<span class="selector-name"><?php echo _("Smart Blocks") ?></span>
</a>
</div>
<div class="media_type_selector dashboard_sub_nav" data-selection-id="4">
<a href="#webstreams">
<i class='icon-random icon-white'></i>
<span class="selector-name"><?php echo _("Webstreams") ?></span>
</a>
</div>
</div> </div>
<?php echo $this->csrf ?> <?php echo $this->csrf ?>

View File

@ -15,7 +15,6 @@
</div> </div>
<div class="outer-datatable-wrapper"> <div class="outer-datatable-wrapper">
<table id="library_display" cellpadding="0" cellspacing="0" class="datatable"></table> <table id="library_display" cellpadding="0" cellspacing="0" class="datatable"></table>
<table id="podcast_table" cellpadding="0" cellspacing="0" class="datatable"></table>
</div> </div>
</div> </div>

View File

@ -0,0 +1,28 @@
{
"1": {
"media": "tracks",
"icon": "icon-music",
"subtext": "Click 'Upload' to add some now.",
"href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/add-media/"
},
"2": {
"media": "playlists",
"icon": "icon-list",
"subtext": "Click 'New' to create one now.",
"href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/library/"
},
"3": {
"media": "smart blocks",
"icon": "icon-time",
"subtext": "Click 'New' to create one now.",
"href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/library/"
},
"4": {
"media": "webstreams",
"icon": "icon-random",
"subtext": "Click 'New' to create one now.",
"href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/library/"
},
"unauthorized": "You don't have permission to view the library."
}

View File

@ -716,15 +716,3 @@ th.library_checkbox {
background-color: #FF5D1A !important; background-color: #FF5D1A !important;
height: 38px !important; height: 38px !important;
} }
/* ~~~~~~~~~~~~~~~~
Podcasts
~~~~~~~~~~~~~~~~ */
#podcast_table {
display: none;
}
/* ~~~~~~~~~~~~~~~~
END Podcasts
~~~~~~~~~~~~~~~~ */

View File

@ -3598,7 +3598,7 @@ button.btn-icon-text > i.icon-white {
.media_type_selector a { .media_type_selector a {
text-decoration: none; text-decoration: none;
color: #cecece; color: #cecece;
padding: 10px 0 10px 10px; padding: 10px 10px 10px 10px;
display: block; display: block;
} }

View File

@ -80,20 +80,22 @@ var AIRTIME = (function(AIRTIME) {
var libEmpty = $('#library_empty'); var libEmpty = $('#library_empty');
if (emptyRow.length > 0) { if (emptyRow.length > 0) {
emptyRow.hide(); emptyRow.hide();
var mediaType = parseInt($('.media_type_selector.selected').data('selection-id')), var mediaType = parseInt($('.media_type_selector.selected').attr('data-selection-id')),
img = $('#library_empty_image'); img = $('#library_empty_image');
// Remove all classes for when we change between empty media types // Remove all classes for when we change between empty media types
img.removeClass(function() { img.removeClass(function() {
return $( this ).attr( "class" ); return $( this ).attr( "class" );
}); });
// TODO: once the new manual pages are added, change links!
var opts = AIRTIME.library.placeholder(mediaType); $.getJSON( "ajax/library_placeholders.json", function( data ) {
img.addClass("icon-white " + opts.icon); var opts = data[mediaType];
$('#library_empty_text').html( img.addClass("icon-white " + opts.icon);
$.i18n._("You haven't added any " + opts.media + ".") $('#library_empty_text').html(
+ "<br/>" + $.i18n._(opts.subtext) $.i18n._("You haven't added any " + opts.media + ".")
+ "<br/><a target='_blank' href='" + opts.href + "'>" + $.i18n._("Learn about " + opts.media) + "</a>" + "<br/>" + $.i18n._(opts.subtext)
); + "<br/><a target='_blank' href='" + opts.href + "'>" + $.i18n._("Learn about " + opts.media) + "</a>"
);
});
libEmpty.show(); libEmpty.show();
} else { } else {
@ -331,13 +333,13 @@ var AIRTIME = (function(AIRTIME) {
return; return;
} }
var selection = $(".media_type_selector.selected").data("selection-id"); var selection = $(".media_type_selector.selected").attr("data-selection-id");
if (selection == AIRTIME.library.MediaTypeEnum.PLAYLIST) { if (selection == 2) {
AIRTIME.playlist.fnNew(); AIRTIME.playlist.fnNew();
} else if (selection == AIRTIME.library.MediaTypeEnum.BLOCK) { } else if (selection == 3) {
AIRTIME.playlist.fnNewBlock(); AIRTIME.playlist.fnNewBlock();
} else if (selection == AIRTIME.library.MediaTypeEnum.WEBSTREAM) { } else if (selection == 4) {
AIRTIME.playlist.fnWsNew(); AIRTIME.playlist.fnWsNew();
} }
}); });

View File

@ -58,67 +58,6 @@ var AIRTIME = (function(AIRTIME) {
} }
mod = AIRTIME.library; mod = AIRTIME.library;
/* ############################################
CONFIGURATION
############################################ */
mod.MediaTypeEnum = Object.freeze({
DEFAULT: 1,
FILE: 1,
PLAYLIST: 2,
BLOCK: 3,
WEBSTREAM: 4,
PODCAST: 5
});
// TODO: once the new manual pages are added, change links!
mod.placeholder = function(mediaType) {
switch (mediaType) {
// TODO: remove duplication in a nice way?
case MediaTypeEnum.FILE:
return {
"media": "tracks",
"icon": "icon-music",
"subtext": "Click 'Upload' to add some now.",
"href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/add-media/"
};
case MediaTypeEnum.PLAYLIST:
return {
"media": "playlists",
"icon": "icon-list",
"subtext": "Click 'New' to create one now.",
"href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/library/"
};
case MediaTypeEnum.BLOCK:
return {
"media": "smart blocks",
"icon": "icon-time",
"subtext": "Click 'New' to create one now.",
"href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/library/"
};
case MediaTypeEnum.WEBSTREAM:
return {
"media": "webstreams",
"icon": "icon-random",
"subtext": "Click 'New' to create one now.",
"href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/library/"
};
case MediaTypeEnum.PODCAST:
return {
"media": "podcasts",
"icon": "icon-headphones",
"subtext": "Click 'Add' to create one now.",
"href": "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters/library/"
};
default:
break;
}
};
/* ############################################
END CONFIGURATION
############################################ */
mod.getChosenItemsLength = function(){ mod.getChosenItemsLength = function(){
var cItem, var cItem,
selected, selected,
@ -259,10 +198,10 @@ var AIRTIME = (function(AIRTIME) {
}; };
mod.checkNewButton = function() { mod.checkNewButton = function() {
var selected = $(".media_type_selector.selected").data("selection-id"), var selected = $(".media_type_selector.selected").attr("data-selection-id"),
check = false; check = false;
if (selected != AIRTIME.library.MediaTypeEnum.FILE) { if (selected != 1) {
check = true; check = true;
} }
@ -515,262 +454,7 @@ var AIRTIME = (function(AIRTIME) {
var colReorderMap = new Array(); var colReorderMap = new Array();
$libTable = $("#library_display"); $libTable = $libContent.find("table");
/* ############################################
DATATABLES
############################################ */
mod.libraryDataTable = $libTable.dataTable({
// put hidden columns at the top to insure they can never be visible
// on the table through column reordering.
//IMPORTANT: WHEN ADDING A NEW COLUMN PLEASE CONSULT WITH THE WIKI
// https://wiki.sourcefabric.org/display/CC/Adding+a+new+library+datatable+column
"aoColumns": [
/* ftype */ {"sTitle": "", "mDataProp": "ftype", "bSearchable": false, "bVisible": false},
/* Checkbox */ {"sTitle": "", "mDataProp": "checkbox", "bSortable": false, "bSearchable": false, "sWidth": "16px", "sClass": "library_checkbox"},
/* Type */ {"sTitle": "", "mDataProp": "image", "bSortable": false, "bSearchable": false, "sWidth": "16px", "sClass": "library_type", "iDataSort": 0},
/* Is Scheduled */ {"sTitle": $.i18n._("Scheduled"), "mDataProp": "is_scheduled", "bVisible": false, "bSearchable": false, "sWidth": "90px", "sClass": "library_is_scheduled"},
///* Is Playlist */ { "sTitle" : $.i18n._("Playlist / Block") , "mDataProp" : "is_playlist" , "bSearchable" : false , "sWidth" : "110px" , "sClass" : "library_is_playlist"} ,
/* Title */ {"sTitle": $.i18n._("Title"), "mDataProp": "track_title", "sClass": "library_title", "sWidth": "170px"},
/* Creator */ {"sTitle": $.i18n._("Creator"), "mDataProp": "artist_name", "sClass": "library_creator", "sWidth": "160px"},
/* Album */ {"sTitle": $.i18n._("Album"), "mDataProp": "album_title", "sClass": "library_album", "sWidth": "150px"},
/* Bit Rate */ {"sTitle": $.i18n._("Bit Rate"), "mDataProp": "bit_rate", "bVisible": false, "sClass": "library_bitrate", "sWidth": "80px"},
/* BPM */ {"sTitle": $.i18n._("BPM"), "mDataProp": "bpm", "bVisible": false, "sClass": "library_bpm", "sWidth": "50px"},
/* Composer */ {"sTitle": $.i18n._("Composer"), "mDataProp": "composer", "bVisible": false, "sClass": "library_composer", "sWidth": "150px"},
/* Conductor */ {"sTitle": $.i18n._("Conductor"), "mDataProp": "conductor", "bVisible": false, "sClass": "library_conductor", "sWidth": "125px"},
/* Copyright */ {"sTitle": $.i18n._("Copyright"), "mDataProp": "copyright", "bVisible": false, "sClass": "library_copyright", "sWidth": "125px"},
/* Cue In */ {"sTitle": $.i18n._("Cue In"), "mDataProp": "cuein", "bVisible": false, "sClass": "library_length", "sWidth": "80px"},
/* Cue Out */ {"sTitle": $.i18n._("Cue Out"), "mDataProp": "cueout", "bVisible": false, "sClass": "library_length", "sWidth": "80px"},
/* Encoded */ {"sTitle": $.i18n._("Encoded By"), "mDataProp": "encoded_by", "bVisible": false, "sClass": "library_encoded", "sWidth": "150px"},
/* Genre */ {"sTitle": $.i18n._("Genre"), "mDataProp": "genre", "bVisible": false, "sClass": "library_genre", "sWidth": "100px"},
/* ISRC Number */ {"sTitle": $.i18n._("ISRC"), "mDataProp": "isrc_number", "bVisible": false, "sClass": "library_isrc", "sWidth": "150px"},
/* Label */ {"sTitle": $.i18n._("Label"), "mDataProp": "label", "bVisible": false, "sClass": "library_label", "sWidth": "125px"},
/* Language */ {"sTitle": $.i18n._("Language"), "mDataProp": "language", "bVisible": false, "sClass": "library_language", "sWidth": "125px"},
/* Last Modified */ {"sTitle": $.i18n._("Last Modified"), "mDataProp": "mtime", "bVisible": false, "sClass": "library_modified_time", "sWidth": "155px"},
/* Last Played */ {"sTitle": $.i18n._("Last Played"), "mDataProp": "lptime", "bVisible": false, "sClass": "library_modified_time", "sWidth": "155px"},
/* Length */ {"sTitle": $.i18n._("Length"), "mDataProp": "length", "sClass": "library_length", "sWidth": "80px"},
/* Mime */ {"sTitle": $.i18n._("Mime"), "mDataProp": "mime", "bVisible": false, "sClass": "library_mime", "sWidth": "80px"},
/* Mood */ {"sTitle": $.i18n._("Mood"), "mDataProp": "mood", "bVisible": false, "sClass": "library_mood", "sWidth": "70px"},
/* Owner */ {"sTitle": $.i18n._("Owner"), "mDataProp": "owner_id", "bVisible": false, "sClass": "library_language", "sWidth": "125px"},
/* Replay Gain */ {"sTitle": $.i18n._("Replay Gain"), "mDataProp": "replay_gain", "bVisible": false, "sClass": "library_replay_gain", "sWidth": "125px"},
/* Sample Rate */ {"sTitle": $.i18n._("Sample Rate"), "mDataProp": "sample_rate", "bVisible": false, "sClass": "library_sr", "sWidth": "125px"},
/* Track Number */ {"sTitle": $.i18n._("Track Number"), "mDataProp": "track_number", "bVisible": false, "sClass": "library_track", "sWidth": "125px"},
/* Upload Time */ {"sTitle": $.i18n._("Uploaded"), "mDataProp": "utime", "bVisible": false, "sClass": "library_upload_time", "sWidth": "155px"},
/* Website */ {"sTitle": $.i18n._("Website"), "mDataProp": "info_url", "bVisible": false, "sClass": "library_url", "sWidth": "150px"},
/* Year */ {"sTitle": $.i18n._("Year"), "mDataProp": "year", "bVisible": false, "sClass": "library_year", "sWidth": "60px"},
/* Context Menu */ {"sTitle": "", "mDataProp": "options", "bSortable": false, "bSearchable": false, "sWidth": "20px", "sClass": "library_actions"}
],
"bProcessing": true,
"bServerSide": true,
"aLengthMenu": [25, 50, 100],
"bStateSave": true,
"fnStateSaveParams": function (oSettings, oData) {
// remove oData components we don't want to save.
delete oData.oSearch;
delete oData.aoSearchCols;
},
"fnStateSave": function (oSettings, oData) {
localStorage.setItem('datatables-library', JSON.stringify(oData));
// Sadly, this is necessary because we need to unscramble the colReorder map on the backend
$.ajax({
url: baseUrl + "usersettings/set-library-datatable",
type: "POST",
data: {settings: oData, format: "json"},
dataType: "json"
});
colReorderMap = oData.ColReorder;
},
"fnStateLoad": function fnLibStateLoad(oSettings) {
var settings = JSON.parse(localStorage.getItem('datatables-library'));
// Hacky; always set the visibility of the last column (actions buttons) to true
if (settings && settings.abVisCols) settings.abVisCols[settings.abVisCols.length - 1] = true;
try {
return settings;
} catch (e) {
return null;
}
},
"fnStateLoadParams": function (oSettings, oData) {
var i,
length,
a = oData.abVisCols;
if (a) {
// putting serialized data back into the correct js type to make
// sure everything works properly.
for (i = 0, length = a.length; i < length; i++) {
if (typeof(a[i]) === "string") {
a[i] = (a[i] === "true");
}
}
}
a = oData.ColReorder;
if (a) {
for (i = 0, length = a.length; i < length; i++) {
if (typeof(a[i]) === "string") {
a[i] = parseInt(a[i], 10);
}
}
}
oData.iEnd = parseInt(oData.iEnd, 10);
oData.iLength = parseInt(oData.iLength, 10);
oData.iStart = parseInt(oData.iStart, 10);
oData.iCreate = parseInt(oData.iCreate, 10);
},
"sAjaxSource": baseUrl + "Library/contents-feed",
"sAjaxDataProp": "files",
"fnServerData": function (sSource, aoData, fnCallback) {
/*
* The real validation check is done in
* dataTables.columnFilter.js We also need to check it here
* because datatable is redrawn everytime an action is performed
* in the Library page. In order for datatable to redraw the
* advanced search fields MUST all be valid.
*/
var advSearchFields = $("div#advanced_search").children(':visible');
var advSearchValid = validateAdvancedSearch(advSearchFields);
var type;
aoData.push({name: "format", value: "json"});
aoData.push({name: "advSearch", value: advSearchValid});
// push whether to search files/playlists or all.
type = $(".media_type_selector.selected").data("selection-id");
type = (type === undefined) ? AIRTIME.library.MediaTypeEnum.DEFAULT : type;
aoData.push({name: "type", value: type});
//getUsabilityHint();
$.ajax({
"dataType": 'json',
"type": "POST",
"url": sSource,
"data": aoData,
"success": fnCallback,
"error": handleAjaxError
}).done(function (data) {
if (data.iTotalRecords > data.iTotalDisplayRecords) {
$('#filter_message').text(
$.i18n._("Filtering out ") + (data.iTotalRecords - data.iTotalDisplayRecords)
+ $.i18n._(" of ") + data.iTotalRecords
+ $.i18n._(" records")
);
$('#library_empty').hide();
$('#library_display').find('tr:has(td.dataTables_empty)').show();
} else {
$('#filter_message').text("");
}
$('#library_content').find('.dataTables_filter input[type="text"]')
.css('padding-right', $('#advanced-options').find('button').outerWidth());
});
},
"fnRowCallback": AIRTIME.library.fnRowCallback,
"fnCreatedRow": function (nRow, aData, iDataIndex) {
// add checkbox
$(nRow).find('td.library_checkbox').html("<input type='checkbox' name='cb_" + aData.id + "'>");
$(nRow).find('td.library_actions')
.text("...")
.on('click', function (e) {
$(this).contextMenu({x: $(e.target).offset().left, y: $(e.target).offset().top})
}).html("<div class='library_actions_btn'>...</div>");
// add audio preview image/button
if (aData.ftype === "audioclip") {
$(nRow).find('td.library_type').html('<img title="' + $.i18n._("Track preview") + '" src="' + baseUrl + 'css/images/icon_audioclip.png">');
} else if (aData.ftype === "playlist") {
$(nRow).find('td.library_type').html('<img title="' + $.i18n._("Playlist preview") + '" src="' + baseUrl + 'css/images/icon_playlist.png">');
} else if (aData.ftype === "block") {
$(nRow).find('td.library_type').html('<img title="' + $.i18n._("Smart Block") + '" src="' + baseUrl + 'css/images/icon_smart-block.png">');
} else if (aData.ftype === "stream") {
$(nRow).find('td.library_type').html('<img title="' + $.i18n._("Webstream preview") + '" src="' + baseUrl + 'css/images/icon_webstream.png">');
}
if (aData.is_scheduled) {
$(nRow).find("td.library_is_scheduled").html('<span class="small-icon is_scheduled"></span>');
} else if (!aData.is_scheduled) {
$(nRow).find("td.library_is_scheduled").html('');
}
if (aData.is_playlist) {
$(nRow).find("td.library_is_playlist").html('<span class="small-icon is_playlist"></span>');
} else if (!aData.is_playlist) {
$(nRow).find("td.library_is_playlist").html('');
}
// add the play function to the library_type td
$(nRow).find('td.library_type').click(function () {
if (aData.ftype === 'playlist' && aData.length !== '0.0') {
open_playlist_preview(aData.audioFile, 0);
} else if (aData.ftype === 'audioclip') {
if (isAudioSupported(aData.mime)) {
open_audio_preview(aData.ftype, aData.id);
}
} else if (aData.ftype == 'stream') {
if (isAudioSupported(aData.mime)) {
open_audio_preview(aData.ftype, aData.id);
}
} else if (aData.ftype == 'block' && aData.bl_type == 'static') {
open_block_preview(aData.audioFile, 0);
}
return false;
});
},
// remove any selected nodes before the draw.
"fnPreDrawCallback": function (oSettings) {
// make sure any dragging helpers are removed or else they'll be
// stranded on the screen.
$("#draggingContainer").remove();
},
"fnDrawCallback": AIRTIME.library.fnDrawCallback,
"aaSorting": [[5, 'asc']],
"sPaginationType": "full_numbers",
"bJQueryUI": true,
"bAutoWidth": false,
"oLanguage": getLibraryDatatableStrings(),
// z = ColResize, R = ColReorder, C = ColVis
"sDom": 'Rf<"dt-process-rel"r><"H"<"library_toolbar"C>><"dataTables_scrolling"t<"#library_empty"<"#library_empty_image"><"#library_empty_text">>><"F"lip>>',
"oColVis": {
"sAlign": "right",
"aiExclude": [0, 1, 2, 31],
"sSize": "css",
"fnStateChange": setFilterElement,
"buttonText": $.i18n._("Columns"),
"iOverlayFade": 0
},
"oColReorder": {
"iFixedColumnsRight": 1,
"iFixedColumns": 3
},
"bScrollCollapse": false
});
/* TODO: implement podcast datatable
* mod.podcastDataTable = $("#podcast_table").dataTable({});
*/
mod.podcastDataTable = mod.libraryDataTable;
/* ############################################
END DATATABLES
############################################ */
function getTableHeight() { function getTableHeight() {
return $libContent.height() - 175; return $libContent.height() - 175;
@ -842,8 +526,8 @@ var AIRTIME = (function(AIRTIME) {
function getLibraryDatatableStrings() { function getLibraryDatatableStrings() {
//Set up the datatables string translation table with different strings depending on //Set up the datatables string translation table with different strings depending on
//whether you're viewing files, playlists, smart blocks, etc. //whether you're viewing files, playlists, smart blocks, etc.
var type = parseInt($(".media_type_selector.selected").data("selection-id")); var type = parseInt($(".media_type_selector.selected").attr("data-selection-id"));
type = (type === undefined) ? AIRTIME.library.MediaTypeEnum.DEFAULT : type; type = (type === undefined) ? 1 : type;
//FIXME: The code that calls this function doesn't work as intended because you can't //FIXME: The code that calls this function doesn't work as intended because you can't
// change the oLanguage property of a datatable dynamically. :( // change the oLanguage property of a datatable dynamically. :(
@ -886,19 +570,255 @@ var AIRTIME = (function(AIRTIME) {
if (r.status === 403) { if (r.status === 403) {
// Hide the processing div // Hide the processing div
$("#library_display_wrapper").find(".dt-process-rel").hide(); $("#library_display_wrapper").find(".dt-process-rel").hide();
$('#library_empty_text').text($.i18n._("You don't have permission to view the library.")); $.getJSON( "ajax/library_placeholders.json", function( data ) {
$('#library_empty_text').text($.i18n._(data.unauthorized));
}) ;
$('#library_empty').show(); $('#library_empty').show();
} }
} }
var selected = $("a[href$='"+location.hash+"']"); oTable = $libTable.dataTable( {
if (selected.parent().data("selection-id") == AIRTIME.library.MediaTypeEnum.PODCAST) {
$("#library_display_wrapper").hide(); // put hidden columns at the top to insure they can never be visible
oTable = mod.podcastDataTable.show(); // on the table through column reordering.
} else {
oTable = mod.libraryDataTable; //IMPORTANT: WHEN ADDING A NEW COLUMN PLEASE CONSULT WITH THE WIKI
} // https://wiki.sourcefabric.org/display/CC/Adding+a+new+library+datatable+column
"aoColumns": [
/* ftype */ { "sTitle" : "" , "mDataProp" : "ftype" , "bSearchable" : false , "bVisible" : false },
/* Checkbox */ { "sTitle" : "" , "mDataProp" : "checkbox" , "bSortable" : false , "bSearchable" : false , "sWidth" : "16px" , "sClass" : "library_checkbox" },
/* Type */ { "sTitle" : "" , "mDataProp" : "image" , "bSortable" : false , "bSearchable" : false , "sWidth" : "16px" , "sClass" : "library_type" , "iDataSort" : 0 },
/* Is Scheduled */ { "sTitle" : $.i18n._("Scheduled") , "mDataProp" : "is_scheduled" , "bVisible" : false , "bSearchable" : false , "sWidth" : "90px" , "sClass" : "library_is_scheduled" },
///* Is Playlist */ { "sTitle" : $.i18n._("Playlist / Block") , "mDataProp" : "is_playlist" , "bSearchable" : false , "sWidth" : "110px" , "sClass" : "library_is_playlist"} ,
/* Title */ { "sTitle" : $.i18n._("Title") , "mDataProp" : "track_title" , "sClass" : "library_title" , "sWidth" : "170px" },
/* Creator */ { "sTitle" : $.i18n._("Creator") , "mDataProp" : "artist_name" , "sClass" : "library_creator" , "sWidth" : "160px" },
/* Album */ { "sTitle" : $.i18n._("Album") , "mDataProp" : "album_title" , "sClass" : "library_album" , "sWidth" : "150px" },
/* Bit Rate */ { "sTitle" : $.i18n._("Bit Rate") , "mDataProp" : "bit_rate" , "bVisible" : false , "sClass" : "library_bitrate" , "sWidth" : "80px" },
/* BPM */ { "sTitle" : $.i18n._("BPM") , "mDataProp" : "bpm" , "bVisible" : false , "sClass" : "library_bpm" , "sWidth" : "50px" },
/* Composer */ { "sTitle" : $.i18n._("Composer") , "mDataProp" : "composer" , "bVisible" : false , "sClass" : "library_composer" , "sWidth" : "150px" },
/* Conductor */ { "sTitle" : $.i18n._("Conductor") , "mDataProp" : "conductor" , "bVisible" : false , "sClass" : "library_conductor" , "sWidth" : "125px" },
/* Copyright */ { "sTitle" : $.i18n._("Copyright") , "mDataProp" : "copyright" , "bVisible" : false , "sClass" : "library_copyright" , "sWidth" : "125px" },
/* Cue In */ { "sTitle" : $.i18n._("Cue In") , "mDataProp" : "cuein" , "bVisible" : false , "sClass" : "library_length" , "sWidth" : "80px" },
/* Cue Out */ { "sTitle" : $.i18n._("Cue Out") , "mDataProp" : "cueout" , "bVisible" : false , "sClass" : "library_length" , "sWidth" : "80px" },
/* Encoded */ { "sTitle" : $.i18n._("Encoded By") , "mDataProp" : "encoded_by" , "bVisible" : false , "sClass" : "library_encoded" , "sWidth" : "150px" },
/* Genre */ { "sTitle" : $.i18n._("Genre") , "mDataProp" : "genre" , "bVisible" : false , "sClass" : "library_genre" , "sWidth" : "100px" },
/* ISRC Number */ { "sTitle" : $.i18n._("ISRC") , "mDataProp" : "isrc_number" , "bVisible" : false , "sClass" : "library_isrc" , "sWidth" : "150px" },
/* Label */ { "sTitle" : $.i18n._("Label") , "mDataProp" : "label" , "bVisible" : false , "sClass" : "library_label" , "sWidth" : "125px" },
/* Language */ { "sTitle" : $.i18n._("Language") , "mDataProp" : "language" , "bVisible" : false , "sClass" : "library_language" , "sWidth" : "125px" },
/* Last Modified */ { "sTitle" : $.i18n._("Last Modified") , "mDataProp" : "mtime" , "bVisible" : false , "sClass" : "library_modified_time" , "sWidth" : "155px" },
/* Last Played */ { "sTitle" : $.i18n._("Last Played") , "mDataProp" : "lptime" , "bVisible" : false , "sClass" : "library_modified_time" , "sWidth" : "155px" },
/* Length */ { "sTitle" : $.i18n._("Length") , "mDataProp" : "length" , "sClass" : "library_length" , "sWidth" : "80px" },
/* Mime */ { "sTitle" : $.i18n._("Mime") , "mDataProp" : "mime" , "bVisible" : false , "sClass" : "library_mime" , "sWidth" : "80px" },
/* Mood */ { "sTitle" : $.i18n._("Mood") , "mDataProp" : "mood" , "bVisible" : false , "sClass" : "library_mood" , "sWidth" : "70px" },
/* Owner */ { "sTitle" : $.i18n._("Owner") , "mDataProp" : "owner_id" , "bVisible" : false , "sClass" : "library_language" , "sWidth" : "125px" },
/* Replay Gain */ { "sTitle" : $.i18n._("Replay Gain") , "mDataProp" : "replay_gain" , "bVisible" : false , "sClass" : "library_replay_gain" , "sWidth" : "125px" },
/* Sample Rate */ { "sTitle" : $.i18n._("Sample Rate") , "mDataProp" : "sample_rate" , "bVisible" : false , "sClass" : "library_sr" , "sWidth" : "125px" },
/* Track Number */ { "sTitle" : $.i18n._("Track Number") , "mDataProp" : "track_number" , "bVisible" : false , "sClass" : "library_track" , "sWidth" : "125px" },
/* Upload Time */ { "sTitle" : $.i18n._("Uploaded") , "mDataProp" : "utime" , "bVisible" : false , "sClass" : "library_upload_time" , "sWidth" : "155px" },
/* Website */ { "sTitle" : $.i18n._("Website") , "mDataProp" : "info_url" , "bVisible" : false , "sClass" : "library_url" , "sWidth" : "150px" },
/* Year */ { "sTitle" : $.i18n._("Year") , "mDataProp" : "year" , "bVisible" : false , "sClass" : "library_year" , "sWidth" : "60px" },
/* Context Menu */ { "sTitle" : "" , "mDataProp" : "options" , "bSortable" : false , "bSearchable" : false , "sWidth" : "20px", "sClass" : "library_actions" }
],
"bProcessing": true,
"bServerSide": true,
"aLengthMenu": [25, 50, 100],
"bStateSave": true,
"fnStateSaveParams": function (oSettings, oData) {
// remove oData components we don't want to save.
delete oData.oSearch;
delete oData.aoSearchCols;
},
"fnStateSave": function (oSettings, oData) {
localStorage.setItem('datatables-library', JSON.stringify(oData));
// Sadly, this is necessary because we need to unscramble the colReorder map on the backend
$.ajax({
url: baseUrl + "usersettings/set-library-datatable",
type: "POST",
data: {settings: oData, format: "json"},
dataType: "json"
});
colReorderMap = oData.ColReorder;
},
"fnStateLoad": function fnLibStateLoad(oSettings) {
var settings = JSON.parse(localStorage.getItem('datatables-library'));
// Hacky; always set the visibility of the last column (actions buttons) to true
if (settings && settings.abVisCols) settings.abVisCols[settings.abVisCols.length - 1] = true;
try {
return settings;
} catch (e) {
return null;
}
},
"fnStateLoadParams": function (oSettings, oData) {
var i,
length,
a = oData.abVisCols;
if (a) {
// putting serialized data back into the correct js type to make
// sure everything works properly.
for (i = 0, length = a.length; i < length; i++) {
if (typeof(a[i]) === "string") {
a[i] = (a[i] === "true");
}
}
}
a = oData.ColReorder;
if (a) {
for (i = 0, length = a.length; i < length; i++) {
if (typeof(a[i]) === "string") {
a[i] = parseInt(a[i], 10);
}
}
}
oData.iEnd = parseInt(oData.iEnd, 10);
oData.iLength = parseInt(oData.iLength, 10);
oData.iStart = parseInt(oData.iStart, 10);
oData.iCreate = parseInt(oData.iCreate, 10);
},
"sAjaxSource": baseUrl+"Library/contents-feed",
"sAjaxDataProp": "files",
"fnServerData": function ( sSource, aoData, fnCallback ) {
/*
* The real validation check is done in
* dataTables.columnFilter.js We also need to check it here
* because datatable is redrawn everytime an action is performed
* in the Library page. In order for datatable to redraw the
* advanced search fields MUST all be valid.
*/
var advSearchFields = $("div#advanced_search").children(':visible');
var advSearchValid = validateAdvancedSearch(advSearchFields);
var type;
aoData.push( { name: "format", value: "json"} );
aoData.push( { name: "advSearch", value: advSearchValid} );
// push whether to search files/playlists or all.
type = $(".media_type_selector.selected").attr("data-selection-id");
type = (type === undefined) ? 1 : type;
aoData.push( { name: "type", value: type} );
//getUsabilityHint();
$.ajax({
"dataType": 'json',
"type": "POST",
"url": sSource,
"data": aoData,
"success": fnCallback,
"error": handleAjaxError
}).done(function(data) {
if (data.iTotalRecords > data.iTotalDisplayRecords) {
$('#filter_message').text(
$.i18n._("Filtering out ") + (data.iTotalRecords - data.iTotalDisplayRecords)
+ $.i18n._(" of ") + data.iTotalRecords
+ $.i18n._(" records")
);
$('#library_empty').hide();
$('#library_display').find('tr:has(td.dataTables_empty)').show();
} else {
$('#filter_message').text("");
}
$('#library_content').find('.dataTables_filter input[type="text"]')
.css('padding-right', $('#advanced-options').find('button').outerWidth());
});
},
"fnRowCallback": AIRTIME.library.fnRowCallback,
"fnCreatedRow": function( nRow, aData, iDataIndex ) {
// add checkbox
$(nRow).find('td.library_checkbox').html("<input type='checkbox' name='cb_"+aData.id+"'>");
$(nRow).find('td.library_actions')
.text("...")
.on('click', function(e) {
$(this).contextMenu({x: $(e.target).offset().left, y: $(e.target).offset().top})
}).html("<div class='library_actions_btn'>...</div>");
// add audio preview image/button
if (aData.ftype === "audioclip") {
$(nRow).find('td.library_type').html('<img title="'+$.i18n._("Track preview")+'" src="'+baseUrl+'css/images/icon_audioclip.png">');
} else if (aData.ftype === "playlist") {
$(nRow).find('td.library_type').html('<img title="'+$.i18n._("Playlist preview")+'" src="'+baseUrl+'css/images/icon_playlist.png">');
} else if (aData.ftype === "block") {
$(nRow).find('td.library_type').html('<img title="'+$.i18n._("Smart Block")+'" src="'+baseUrl+'css/images/icon_smart-block.png">');
} else if (aData.ftype === "stream") {
$(nRow).find('td.library_type').html('<img title="'+$.i18n._("Webstream preview")+'" src="'+baseUrl+'css/images/icon_webstream.png">');
}
if (aData.is_scheduled) {
$(nRow).find("td.library_is_scheduled").html('<span class="small-icon is_scheduled"></span>');
} else if (!aData.is_scheduled) {
$(nRow).find("td.library_is_scheduled").html('');
}
if (aData.is_playlist) {
$(nRow).find("td.library_is_playlist").html('<span class="small-icon is_playlist"></span>');
} else if (!aData.is_playlist) {
$(nRow).find("td.library_is_playlist").html('');
}
// add the play function to the library_type td
$(nRow).find('td.library_type').click(function(){
if (aData.ftype === 'playlist' && aData.length !== '0.0'){
open_playlist_preview(aData.audioFile, 0);
} else if (aData.ftype === 'audioclip') {
if (isAudioSupported(aData.mime)) {
open_audio_preview(aData.ftype, aData.id);
}
} else if (aData.ftype == 'stream') {
if (isAudioSupported(aData.mime)) {
open_audio_preview(aData.ftype, aData.id);
}
} else if (aData.ftype == 'block' && aData.bl_type == 'static') {
open_block_preview(aData.audioFile, 0);
}
return false;
});
},
// remove any selected nodes before the draw.
"fnPreDrawCallback": function( oSettings ) {
// make sure any dragging helpers are removed or else they'll be
// stranded on the screen.
$("#draggingContainer").remove();
},
"fnDrawCallback": AIRTIME.library.fnDrawCallback,
"aaSorting": [[5, 'asc']],
"sPaginationType": "full_numbers",
"bJQueryUI": true,
"bAutoWidth": false,
"oLanguage": getLibraryDatatableStrings(),
// z = ColResize, R = ColReorder, C = ColVis
"sDom": 'Rf<"dt-process-rel"r><"H"<"library_toolbar"C>><"dataTables_scrolling"t<"#library_empty"<"#library_empty_image"><"#library_empty_text">>><"F"lip>>',
"oColVis": {
"sAlign": "right",
"aiExclude": [0, 1, 2, 31],
"sSize": "css",
"fnStateChange": setFilterElement,
"buttonText": $.i18n._("Columns"),
"iOverlayFade": 0
},
"oColReorder": {
"iFixedColumnsRight": 1,
"iFixedColumns": 3
},
"bScrollCollapse": false
});
setColumnFilter(oTable); setColumnFilter(oTable);
oTable.fnSetFilteringDelay(350); oTable.fnSetFilteringDelay(350);

View File

@ -37,13 +37,90 @@ $(document).ready(function () {
self.recentUploadsTable.fnDraw(); //Only works because we're using bServerSide self.recentUploadsTable.fnDraw(); //Only works because we're using bServerSide
//In DataTables 1.10 and greater, we can use .fnAjaxReload() //In DataTables 1.10 and greater, we can use .fnAjaxReload()
}); });
this.on("complete", function() {
this.on("queuecomplete", function() {
uploadProgress = false; uploadProgress = false;
}); });
} }
}; };
/*
var uploader = new plupload.Uploader({
runtimes: 'html5, flash, html4',
browse_button: 'pickfiles',
container: $("#container"),
url : baseUrl+'rest/media',
filters : [
{title: "Audio Files", extensions: "ogg,mp3,oga,flac,wav,m4a,mp4,opus,aac,oga,mp1,mp2,wma,au"}
],
multipart_params : {
"csrf_token" : $("#csrf").attr('value')
},
init: {
PostInit: function() {
document.getElementById('filelist').innerHTML = '';
document.getElementById('uploadfiles').onclick = function() {
uploader.start();
return false;
};
},
FilesAdded: function(up, files) {
plupload.each(files, function(file) {
document.getElementById('filelist').innerHTML += '<div id="' + file.id + '">' + file.name + ' (' + plupload.formatSize(file.size) + ') <b></b></div>';
});
},
UploadProgress: function(up, file) {
document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>";
},
Error: function(up, err) {
document.getElementById('console').innerHTML += "\nError #" + err.code + ": " + err.message;
}
}
});
uploader.init();
*/
/*
$("#plupload_files").pluploadQueue({
// General settings
runtimes : 'gears, html5, html4',
url : baseUrl+'rest/media',
//chunk_size : '5mb', //Disabling chunking since we're using the File Upload REST API now
unique_names : 'true',
multiple_queues : 'true',
filters : [
{title: "Audio Files", extensions: "ogg,mp3,oga,flac,wav,m4a,mp4,opus,aac,oga,mp1,mp2,wma,au"}
],
multipart_params : {
"csrf_token" : $("#csrf").attr('value'),
}
});
uploader = $("#plupload_files").pluploadQueue();
uploader.bind('FileUploaded', function(up, file, json)
{
//Refresh the upload table:
self.recentUploadsTable.fnDraw(); //Only works because we're using bServerSide
//In DataTables 1.10 and greater, we can use .fnAjaxReload()
});
var uploadProgress = false;
uploader.bind('QueueChanged', function(){
uploadProgress = (uploader.files.length > 0);
});
uploader.bind('UploadComplete', function(){
uploadProgress = false;
});*/
$(window).bind('beforeunload', function () { $(window).bind('beforeunload', function () {
if (uploadProgress) { if (uploadProgress) {
return sprintf($.i18n._("You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?"), return sprintf($.i18n._("You are currently uploading files. %sGoing to another screen will cancel the upload process. %sAre you sure you want to leave the page?"),
@ -96,11 +173,11 @@ $(document).ready(function () {
}); });
self.setupRecentUploadsTable = function () { self.setupRecentUploadsTable = function () {
return $("#recent_uploads_table").dataTable({ recentUploadsTable = $("#recent_uploads_table").dataTable({
"bJQueryUI": true, "bJQueryUI": true,
"bProcessing": false, "bProcessing": false,
"bServerSide": true, "bServerSide": true,
"sAjaxSource": '/plupload/recent-uploads/format/json', "sAjaxSource": '/Plupload/recent-uploads/format/json',
"sAjaxDataProp": 'files', "sAjaxDataProp": 'files',
"bSearchable": false, "bSearchable": false,
"bInfo": true, "bInfo": true,
@ -144,13 +221,11 @@ $(document).ready(function () {
areAnyFileImportsPending = true; areAnyFileImportsPending = true;
} }
} }
if (areAnyFileImportsPending) { if (areAnyFileImportsPending) {
//alert("pending uploads, starting refresh on timer"); //alert("pending uploads, starting refresh on timer");
self.startRefreshingRecentUploads(); self.startRefreshingRecentUploads();
} else if (self.isRecentUploadsRefreshTimerActive) { } else {
self.stopRefreshingRecentUploads(); self.stopRefreshingRecentUploads();
self.recentUploadsTable.fnDraw();
} }
// Update usability hint - in common.js // Update usability hint - in common.js
@ -164,7 +239,7 @@ $(document).ready(function () {
var sw = $(this)[0].scrollWidth, iw = $(this).innerWidth(); var sw = $(this)[0].scrollWidth, iw = $(this).innerWidth();
if (sw > iw) { if (sw > iw) {
$(this).stop().animate({ $(this).stop().animate({
textIndent: "-" + (sw - iw) + "px" textIndent: "-" + (sw + 2 - iw) + "px"
}, sw * 8); }, sw * 8);
} }
}, },
@ -176,41 +251,37 @@ $(document).ready(function () {
); );
} }
}); });
return recentUploadsTable;
}; };
self.isRecentUploadsRefreshTimerActive = false;
self.startRefreshingRecentUploads = function () { self.startRefreshingRecentUploads = function () {
if (!self.isRecentUploadsRefreshTimerActive) { //Prevent multiple timers from running if (self.isRecentUploadsRefreshTimerActive()) { //Prevent multiple timers from running
self.recentUploadsRefreshTimer = setInterval(function() { return;
self.recentUploadsTable.fnDraw();
}, 3000);
self.isRecentUploadsRefreshTimerActive = true;
} }
self.recentUploadsRefreshTimer = setInterval("self.recentUploadsTable.fnDraw()", 3000);
};
self.isRecentUploadsRefreshTimerActive = function () {
return (self.recentUploadsRefreshTimer != null);
}; };
self.stopRefreshingRecentUploads = function () { self.stopRefreshingRecentUploads = function () {
clearInterval(self.recentUploadsRefreshTimer); clearInterval(self.recentUploadsRefreshTimer);
self.isRecentUploadsRefreshTimerActive = false; self.recentUploadsRefreshTimer = null;
}; };
$("#upload_status_all").click(function () { $("#upload_status_all").click(function () {
if (self.uploadFilter !== "all") { self.uploadFilter = "all";
self.uploadFilter = "all"; self.recentUploadsTable.fnPageChange(0).fnDraw();
self.recentUploadsTable.fnPageChange(0).fnDraw();
}
}); });
$("#upload_status_pending").click(function () { $("#upload_status_pending").click(function () {
if (self.uploadFilter !== "pending") { self.uploadFilter = "pending";
self.uploadFilter = "pending"; self.recentUploadsTable.fnPageChange(0).fnDraw();
self.recentUploadsTable.fnPageChange(0).fnDraw();
}
}); });
$("#upload_status_failed").click(function () { $("#upload_status_failed").click(function () {
if (self.uploadFilter !== "failed") { self.uploadFilter = "failed";
self.uploadFilter = "failed"; self.recentUploadsTable.fnPageChange(0).fnDraw();
self.recentUploadsTable.fnPageChange(0).fnDraw();
}
}); });
//Create the recent uploads table. //Create the recent uploads table.

View File

@ -137,24 +137,8 @@ AIRTIME = (function(AIRTIME) {
}); });
$(window).on('hashchange', function() { $(window).on('hashchange', function() {
var selected = $("a[href$='"+location.hash+"']"), var selected = $("a[href$='"+location.hash+"']");
dashboardLink = $(".media_type_selector:first"), var dashboardLink = $(".media_type_selector:first");
t;
if (selected.parent().data("selection-id") == AIRTIME.library.MediaTypeEnum.PODCAST) {
$("#library_display_wrapper").hide();
$("#podcast_table").show();
t = AIRTIME.library.podcastDataTable;
} else {
if (typeof oTable === 'undefined') {
oTable = AIRTIME.library.libraryDataTable;
}
$("#library_display_wrapper").show();
$("#podcast_table").hide();
t = oTable;
}
dashboardLink.find("a").attr("href", selected.attr("href")); dashboardLink.find("a").attr("href", selected.attr("href"));
AIRTIME.library.selectNone(); AIRTIME.library.selectNone();
@ -162,7 +146,7 @@ AIRTIME = (function(AIRTIME) {
$(this).removeClass("selected"); $(this).removeClass("selected");
}); });
selected.parent().addClass("selected"); selected.parent().addClass("selected");
t.fnDraw(); oTable.fnDraw();
$("#library_filter").text(selected.text()); $("#library_filter").text(selected.text());
// Highlight the dashboard link // Highlight the dashboard link
dashboardLink.addClass("highlight"); dashboardLink.addClass("highlight");