Merge branch 'devel' of dev.sourcefabric.org:airtime into devel

This commit is contained in:
Rudi Grinberg 2012-09-10 17:43:10 -04:00
commit 332e8fef76
6 changed files with 991 additions and 741 deletions

View File

@ -337,6 +337,7 @@ class ApiController extends Zend_Controller_Action
$this->_helper->viewRenderer->setNoRender(true);
$data = Application_Model_Schedule::getSchedule();
header("Content-Type: application/json");
echo json_encode($data, JSON_FORCE_OBJECT);
}

View File

@ -31,12 +31,6 @@ class Application_Model_Preference
$result = Application_Common_Database::prepareAndExecute($sql, $paramMap, 'column');
if ($value == "") {
$value = "NULL";
} else {
$value = "$value";
}
$paramMap = array();
if ($result == 1) {
// result found

View File

@ -262,7 +262,6 @@ class Application_Model_Webstream implements Application_Model_LibraryEditable
private static function getPlsUrl($url)
{
$content = self::getUrlData($url);
$ini = parse_ini_string($content, true);
if ($ini !== false && isset($ini["playlist"]) && isset($ini["playlist"]["File1"])) {

View File

@ -479,14 +479,13 @@ var AIRTIME = (function(AIRTIME) {
"fnServerData": function ( sSource, aoData, fnCallback ) {
var type;
aoData.push( { name: "format", value: "json"} );
//push whether to search files/playlists or all.
type = $("#library_display_type").find("select").val();
type = (type === undefined) ? 0 : type;
aoData.push( { name: "type", value: type} );
$.ajax( {
"dataType": 'json',
"type": "POST",
@ -970,3 +969,145 @@ function addQtipToSCIcons(){
}
});
}
/*
* This function is called from dataTables.columnFilter.js
*/
function validateAdvancedSearch(divs) {
var valid = true,
fieldName,
fields,
searchTerm = Array(),
searchTermType,
regExpr,
timeRegEx = "\\d{2}[:]([0-5]){1}([0-9]){1}[:]([0-5]){1}([0-9]){1}([.]\\d{1,6})?",
dateRegEx = "\\d{4}[-]\\d{2}[-]\\d{2}?",
integerRegEx = "^\\d+$",
numericRegEx = "^\\d+[.]?\\d*$";
searchTerm[0] = "";
searchTerm[1] = "";
$.each(divs, function(i, div){
fieldName = $(div).children(':nth-child(2)').attr('id');
fields = $(div).children().find('input');
searchTermType = validationTypes[fieldName];
$.each(fields, function(i, field){
searchTerm[i] = $(field).val();
if (searchTerm[i] !== "") {
if (searchTermType === "l") {
regExpr = new RegExp("^" +timeRegEx+ "$");
} else if (searchTermType === "t") {
var pieces = searchTerm[i].split(" ");
if (pieces.length === 2) {
regExpr = new RegExp("^" +dateRegEx+ " " +timeRegEx+ "$");
} else if (pieces.length === 1) {
regExpr = new RegExp("^" +dateRegEx+ "$");
}
} else if (searchTermType === "i") {
regExpr = new RegExp(integerRegEx);
} else if (searchTermType === "n") {
regExpr = new RegExp(numericRegEx);
if (searchTerm[i].charAt(0) === "-") {
searchTerm[i] = searchTerm[i].substr(1);
}
}
//string fields do not need validation
if (searchTermType !== "s") {
valid = regExpr.test(searchTerm[i]);
}
addRemoveValidationIcons(valid, $(field));
/* Empty fields should not have valid/invalid indicator
* Range values are considered valid even if only the
* 'From' value is provided. Therefore, if the 'To' value
* is empty but the 'From' value is not empty we need to
* keep the validation icon on screen.
*/
} else if (searchTerm[0] === "" && searchTerm[1] !== "" ||
searchTerm[0] === "" && searchTerm[1] === ""){
if ($(field).closest('div').children(':last-child').hasClass('checked-icon') ||
$(field).closest('div').children(':last-child').hasClass('not-available-icon')) {
$(field).closest('div').children(':last-child').remove();
}
}
if (!valid) {
return false;
}
});
if (!valid) {
return false;
}
});
return valid;
}
function addRemoveValidationIcons(valid, field) {
var validIndicator = "<span class='checked-icon'></span>",
invalidIndicator = "<span class='not-available-icon'></span>";
if (valid) {
if (!field.closest('div').children(':last-child').hasClass('checked-icon')) {
//remove invalid icon before adding valid icon
if (field.closest('div').children(':last-child').hasClass('not-available-icon')) {
field.closest('div').children(':last-child').remove();
}
field.closest('div').append(validIndicator);
}
} else {
if (!field.closest('div').children(':last-child').hasClass('not-available-icon')) {
//remove valid icon before adding invalid icon
if (field.closest('div').children(':last-child').hasClass('checked-icon')) {
field.closest('div').children(':last-child').remove();
}
field.closest('div').append(invalidIndicator);
}
}
}
/* Validation types:
* s => string
* i => integer
* n => numeric (positive/negative, whole/decimals)
* t => timestamp
* l => length
*/
var validationTypes = {
"album_title" : "s",
"artist_name" : "s",
"bit_rate" : "i",
"bpm" : "i",
"comments" : "s",
"composer" : "s",
"conductor" : "s",
"copyright" : "s",
"utime" : "t",
"mtime" : "t",
"lptime" : "t",
"disc_number" : "i",
"genre" : "s",
"isrc_number" : "s",
"label" : "s",
"language" : "s",
"length" : "l",
"lyricist" : "s",
"mood" : "s",
"name" : "s",
"orchestra" : "s",
"owner_id" : "i",
"rating" : "i",
"replay_gain" : "n",
"sample_rate" : "i",
"track_title" : "s",
"track_number" : "i",
"info_url" : "s",
"year" : "i"
};

View File

@ -0,0 +1,108 @@
Before you overwrite dataTables.columnFilter.js, note that we have changed a few lines
in this file.
Running a diff between the original column filter plugin (dataTables.columnFilter_orig.js) and
our modified one (dataTables.columnFilter.js):
denise@denise-DX4860:~/airtime/airtime_mvc/public/js/datatables/plugin$ diff -u dataTables.columnFilter_orig.js dataTables.columnFilter.js
--- dataTables.columnFilter_orig.js 2012-09-10 14:26:30.041095663 -0400
+++ dataTables.columnFilter.js 2012-09-10 17:04:21.017464447 -0400
@@ -103,7 +103,8 @@
label = label.replace(/(^\s*)|(\s*$)/g, "");
var currentFilter = oTable.fnSettings().aoPreSearchCols[i].sSearch;
var search_init = 'search_init ';
- var inputvalue = label;
+ //var inputvalue = label;
+ var inputvalue = '';
if (currentFilter != '' && currentFilter != '^') {
if (bIsNumber && currentFilter.charAt(0) == '^')
inputvalue = currentFilter.substr(1); //ignore trailing ^
@@ -133,29 +134,32 @@
});
} else {
input.keyup(function () {
- if (oTable.fnSettings().oFeatures.bServerSide && iFilterLength != 0) {
- //If filter length is set in the server-side processing mode
- //Check has the user entered at least iFilterLength new characters
-
- var currentFilter = oTable.fnSettings().aoPreSearchCols[index].sSearch;
- var iLastFilterLength = $(this).data("dt-iLastFilterLength");
- if (typeof iLastFilterLength == "undefined")
- iLastFilterLength = 0;
- var iCurrentFilterLength = this.value.length;
- if (Math.abs(iCurrentFilterLength - iLastFilterLength) < iFilterLength
- //&& currentFilter.length == 0 //Why this?
- ) {
- //Cancel the filtering
- return;
- }
- else {
- //Remember the current filter length
- $(this).data("dt-iLastFilterLength", iCurrentFilterLength);
+ var advSearchFields = $("div#advanced_search").children(':visible');
+ if(validateAdvancedSearch(advSearchFields)){
+ if (oTable.fnSettings().oFeatures.bServerSide && iFilterLength != 0) {
+ //If filter length is set in the server-side processing mode
+ //Check has the user entered at least iFilterLength new characters
+
+ var currentFilter = oTable.fnSettings().aoPreSearchCols[index].sSearch;
+ var iLastFilterLength = $(this).data("dt-iLastFilterLength");
+ if (typeof iLastFilterLength == "undefined")
+ iLastFilterLength = 0;
+ var iCurrentFilterLength = this.value.length;
+ if (Math.abs(iCurrentFilterLength - iLastFilterLength) < iFilterLength
+ //&& currentFilter.length == 0 //Why this?
+ ) {
+ //Cancel the filtering
+ return;
+ }
+ else {
+ //Remember the current filter length
+ $(this).data("dt-iLastFilterLength", iCurrentFilterLength);
+ }
}
+ /* Filter on the column (the index) of this element */
+ oTable.fnFilter(this.value, _fnColumnIndex(index), regex, smart); //Issue 37
+ fnOnFiltered();
}
- /* Filter on the column (the index) of this element */
- oTable.fnFilter(this.value, _fnColumnIndex(index), regex, smart); //Issue 37
- fnOnFiltered();
});
}
@@ -168,7 +172,8 @@
input.blur(function () {
if (this.value == "") {
$(this).addClass("search_init");
- this.value = asInitVals[index];
+ //this.value = asInitVals[index];
+ this.value = "";
}
});
}
@@ -228,14 +233,16 @@
$('#' + sFromId + ',#' + sToId, th).keyup(function () {
-
- var iMin = document.getElementById(sFromId).value * 1;
- var iMax = document.getElementById(sToId).value * 1;
- if (iMin != 0 && iMax != 0 && iMin > iMax)
- return;
-
- oTable.fnDraw();
- fnOnFiltered();
+ var advSearchFields = $("div#advanced_search").children(':visible');
+ if(validateAdvancedSearch(advSearchFields)){
+ var iMin = document.getElementById(sFromId).value * 1;
+ var iMax = document.getElementById(sToId).value * 1;
+ if (iMin != 0 && iMax != 0 && iMin > iMax)
+ return;
+
+ oTable.fnDraw();
+ fnOnFiltered();
+ }
});