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

This commit is contained in:
Martin Konecny 2012-09-10 17:40:19 -04:00
commit 726cadf5ce
2 changed files with 882 additions and 734 deletions

View File

@ -479,7 +479,6 @@ var AIRTIME = (function(AIRTIME) {
"fnServerData": function ( sSource, aoData, fnCallback ) { "fnServerData": function ( sSource, aoData, fnCallback ) {
var type; var type;
aoData.push( { name: "format", value: "json"} ); aoData.push( { name: "format", value: "json"} );
//push whether to search files/playlists or all. //push whether to search files/playlists or all.
@ -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

@ -1,4 +1,4 @@
/* /*
* File: jquery.dataTables.columnFilter.js * File: jquery.dataTables.columnFilter.js
* Version: 1.4.8. * Version: 1.4.8.
* Author: Jovan Popovic * Author: Jovan Popovic
@ -103,7 +103,8 @@
label = label.replace(/(^\s*)|(\s*$)/g, ""); label = label.replace(/(^\s*)|(\s*$)/g, "");
var currentFilter = oTable.fnSettings().aoPreSearchCols[i].sSearch; var currentFilter = oTable.fnSettings().aoPreSearchCols[i].sSearch;
var search_init = 'search_init '; var search_init = 'search_init ';
var inputvalue = label; //var inputvalue = label;
var inputvalue = '';
if (currentFilter != '' && currentFilter != '^') { if (currentFilter != '' && currentFilter != '^') {
if (bIsNumber && currentFilter.charAt(0) == '^') if (bIsNumber && currentFilter.charAt(0) == '^')
inputvalue = currentFilter.substr(1); //ignore trailing ^ inputvalue = currentFilter.substr(1); //ignore trailing ^
@ -133,29 +134,32 @@
}); });
} else { } else {
input.keyup(function () { input.keyup(function () {
if (oTable.fnSettings().oFeatures.bServerSide && iFilterLength != 0) { var advSearchFields = $("div#advanced_search").children(':visible');
//If filter length is set in the server-side processing mode if(validateAdvancedSearch(advSearchFields)){
//Check has the user entered at least iFilterLength new characters 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 currentFilter = oTable.fnSettings().aoPreSearchCols[index].sSearch;
var iLastFilterLength = $(this).data("dt-iLastFilterLength"); var iLastFilterLength = $(this).data("dt-iLastFilterLength");
if (typeof iLastFilterLength == "undefined") if (typeof iLastFilterLength == "undefined")
iLastFilterLength = 0; iLastFilterLength = 0;
var iCurrentFilterLength = this.value.length; var iCurrentFilterLength = this.value.length;
if (Math.abs(iCurrentFilterLength - iLastFilterLength) < iFilterLength if (Math.abs(iCurrentFilterLength - iLastFilterLength) < iFilterLength
//&& currentFilter.length == 0 //Why this? //&& currentFilter.length == 0 //Why this?
) { ) {
//Cancel the filtering //Cancel the filtering
return; return;
} }
else { else {
//Remember the current filter length //Remember the current filter length
$(this).data("dt-iLastFilterLength", iCurrentFilterLength); $(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,14 +172,15 @@
input.blur(function () { input.blur(function () {
if (this.value == "") { if (this.value == "") {
$(this).addClass("search_init"); $(this).addClass("search_init");
this.value = asInitVals[index]; //this.value = asInitVals[index];
this.value = "";
} }
}); });
} }
function fnCreateRangeInput(oTable) { function fnCreateRangeInput(oTable) {
//var currentFilter = oTable.fnSettings().aoPreSearchCols[i].sSearch; //var currentFilter = oTable.fnSettings().aoPreSearchCols[i].sSearch;
th.html(_fnRangeLabelPart(0)); th.html(_fnRangeLabelPart(0));
var sFromId = oTable.attr("id") + '_range_from_' + i; var sFromId = oTable.attr("id") + '_range_from_' + i;
var from = $('<input type="text" class="number_range_filter" id="' + sFromId + '" rel="' + i + '"/>'); var from = $('<input type="text" class="number_range_filter" id="' + sFromId + '" rel="' + i + '"/>');
@ -194,48 +199,50 @@
//------------start range filtering function //------------start range filtering function
/* Custom filtering function which will filter data in column four between two values /* Custom filtering function which will filter data in column four between two values
* Author: Allan Jardine, Modified by Jovan Popovic * Author: Allan Jardine, Modified by Jovan Popovic
*/ */
//$.fn.dataTableExt.afnFiltering.push( //$.fn.dataTableExt.afnFiltering.push(
oTable.dataTableExt.afnFiltering.push( oTable.dataTableExt.afnFiltering.push(
function (oSettings, aData, iDataIndex) { function (oSettings, aData, iDataIndex) {
if (oTable.attr("id") != oSettings.sTableId) if (oTable.attr("id") != oSettings.sTableId)
return true; return true;
// Try to handle missing nodes more gracefully // Try to handle missing nodes more gracefully
if (document.getElementById(sFromId) == null) if (document.getElementById(sFromId) == null)
return true; return true;
var iMin = document.getElementById(sFromId).value * 1; var iMin = document.getElementById(sFromId).value * 1;
var iMax = document.getElementById(sToId).value * 1; var iMax = document.getElementById(sToId).value * 1;
var iValue = aData[_fnColumnIndex(index)] == "-" ? 0 : aData[_fnColumnIndex(index)] * 1; var iValue = aData[_fnColumnIndex(index)] == "-" ? 0 : aData[_fnColumnIndex(index)] * 1;
if (iMin == "" && iMax == "") { if (iMin == "" && iMax == "") {
return true; return true;
} }
else if (iMin == "" && iValue <= iMax) { else if (iMin == "" && iValue <= iMax) {
return true; return true;
} }
else if (iMin <= iValue && "" == iMax) { else if (iMin <= iValue && "" == iMax) {
return true; return true;
} }
else if (iMin <= iValue && iValue <= iMax) { else if (iMin <= iValue && iValue <= iMax) {
return true; return true;
} }
return false; return false;
} }
); );
//------------end range filtering function //------------end range filtering function
$('#' + sFromId + ',#' + sToId, th).keyup(function () { $('#' + sFromId + ',#' + sToId, th).keyup(function () {
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;
var iMin = document.getElementById(sFromId).value * 1; oTable.fnDraw();
var iMax = document.getElementById(sToId).value * 1; fnOnFiltered();
if (iMin != 0 && iMax != 0 && iMin > iMax) }
return;
oTable.fnDraw();
fnOnFiltered();
}); });
@ -263,41 +270,41 @@
//$.fn.dataTableExt.afnFiltering.push( //$.fn.dataTableExt.afnFiltering.push(
oTable.dataTableExt.afnFiltering.push( oTable.dataTableExt.afnFiltering.push(
function (oSettings, aData, iDataIndex) { function (oSettings, aData, iDataIndex) {
if (oTable.attr("id") != oSettings.sTableId) if (oTable.attr("id") != oSettings.sTableId)
return true; return true;
var dStartDate = from.datepicker("getDate"); var dStartDate = from.datepicker("getDate");
var dEndDate = to.datepicker("getDate"); var dEndDate = to.datepicker("getDate");
if (dStartDate == null && dEndDate == null) { if (dStartDate == null && dEndDate == null) {
return true; return true;
} }
var dCellDate = null; var dCellDate = null;
try { try {
if (aData[_fnColumnIndex(index)] == null || aData[_fnColumnIndex(index)] == "") if (aData[_fnColumnIndex(index)] == null || aData[_fnColumnIndex(index)] == "")
return false; return false;
dCellDate = $.datepicker.parseDate($.datepicker.regional[""].dateFormat, aData[_fnColumnIndex(index)]); dCellDate = $.datepicker.parseDate($.datepicker.regional[""].dateFormat, aData[_fnColumnIndex(index)]);
} catch (ex) { } catch (ex) {
return false; return false;
} }
if (dCellDate == null) if (dCellDate == null)
return false; return false;
if (dStartDate == null && dCellDate <= dEndDate) { if (dStartDate == null && dCellDate <= dEndDate) {
return true; return true;
} }
else if (dStartDate <= dCellDate && dEndDate == null) { else if (dStartDate <= dCellDate && dEndDate == null) {
return true; return true;
} }
else if (dStartDate <= dCellDate && dCellDate <= dEndDate) { else if (dStartDate <= dCellDate && dCellDate <= dEndDate) {
return true; return true;
} }
return false; return false;
} }
); );
//------------end date range filtering function //------------end date range filtering function
@ -423,8 +430,8 @@
var checkToggleDiv = uniqueId + "-flt-toggle"; var checkToggleDiv = uniqueId + "-flt-toggle";
r += '<button id="' + buttonId + '" class="checkbox_filter" > ' + labelBtn + '</button>'; //filter button witch open dialog r += '<button id="' + buttonId + '" class="checkbox_filter" > ' + labelBtn + '</button>'; //filter button witch open dialog
r += '<div id="' + checkToggleDiv + '" ' r += '<div id="' + checkToggleDiv + '" '
+ 'title="' + label + '" ' + 'title="' + label + '" '
+ 'class="toggle-check ui-widget-content ui-corner-all" style="width: ' + (divWidthToggle) + '%; " >'; //dialog div + 'class="toggle-check ui-widget-content ui-corner-all" style="width: ' + (divWidthToggle) + '%; " >'; //dialog div
//r+= '<div align="center" style="margin-top: 5px; "> <button id="'+buttonId+'Reset" class="checkbox_filter" > reset </button> </div>'; //reset button and its div //r+= '<div align="center" style="margin-top: 5px; "> <button id="'+buttonId+'Reset" class="checkbox_filter" > reset </button> </div>'; //reset button and its div
r += divRowDef; r += divRowDef;
@ -452,7 +459,7 @@
//search = search + ' ' + $(this).val(); //search = search + ' ' + $(this).val();
//concatenation for selected checks in or //concatenation for selected checks in or
if ((index == 0 && resSize == 1) if ((index == 0 && resSize == 1)
|| (index != 0 && index == resSize - 1)) { || (index != 0 && index == resSize - 1)) {
or = ''; or = '';
} }
//trim //trim
@ -497,11 +504,11 @@
return false; return false;
} }
}, },
{ {
text: "Close", text: "Close",
click: function () { $(this).dialog("close"); } click: function () { $(this).dialog("close"); }
} }
] ]
}); });