Merge branch 'devel' of dev.sourcefabric.org:airtime into devel
This commit is contained in:
commit
332e8fef76
|
@ -337,6 +337,7 @@ class ApiController extends Zend_Controller_Action
|
||||||
$this->_helper->viewRenderer->setNoRender(true);
|
$this->_helper->viewRenderer->setNoRender(true);
|
||||||
|
|
||||||
$data = Application_Model_Schedule::getSchedule();
|
$data = Application_Model_Schedule::getSchedule();
|
||||||
|
header("Content-Type: application/json");
|
||||||
echo json_encode($data, JSON_FORCE_OBJECT);
|
echo json_encode($data, JSON_FORCE_OBJECT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,12 +31,6 @@ class Application_Model_Preference
|
||||||
|
|
||||||
$result = Application_Common_Database::prepareAndExecute($sql, $paramMap, 'column');
|
$result = Application_Common_Database::prepareAndExecute($sql, $paramMap, 'column');
|
||||||
|
|
||||||
if ($value == "") {
|
|
||||||
$value = "NULL";
|
|
||||||
} else {
|
|
||||||
$value = "$value";
|
|
||||||
}
|
|
||||||
|
|
||||||
$paramMap = array();
|
$paramMap = array();
|
||||||
if ($result == 1) {
|
if ($result == 1) {
|
||||||
// result found
|
// result found
|
||||||
|
|
|
@ -262,7 +262,6 @@ class Application_Model_Webstream implements Application_Model_LibraryEditable
|
||||||
private static function getPlsUrl($url)
|
private static function getPlsUrl($url)
|
||||||
{
|
{
|
||||||
$content = self::getUrlData($url);
|
$content = self::getUrlData($url);
|
||||||
|
|
||||||
$ini = parse_ini_string($content, true);
|
$ini = parse_ini_string($content, true);
|
||||||
|
|
||||||
if ($ini !== false && isset($ini["playlist"]) && isset($ini["playlist"]["File1"])) {
|
if ($ini !== false && isset($ini["playlist"]) && isset($ini["playlist"]["File1"])) {
|
||||||
|
|
|
@ -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"
|
||||||
|
};
|
||||||
|
|
|
@ -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();
|
||||||
|
+ }
|
||||||
|
});
|
||||||
|
|
||||||
|
|
|
@ -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,6 +134,8 @@
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
input.keyup(function () {
|
input.keyup(function () {
|
||||||
|
var advSearchFields = $("div#advanced_search").children(':visible');
|
||||||
|
if(validateAdvancedSearch(advSearchFields)){
|
||||||
if (oTable.fnSettings().oFeatures.bServerSide && iFilterLength != 0) {
|
if (oTable.fnSettings().oFeatures.bServerSide && iFilterLength != 0) {
|
||||||
//If filter length is set in the server-side processing mode
|
//If filter length is set in the server-side processing mode
|
||||||
//Check has the user entered at least iFilterLength new characters
|
//Check has the user entered at least iFilterLength new characters
|
||||||
|
@ -156,6 +159,7 @@
|
||||||
/* Filter on the column (the index) of this element */
|
/* Filter on the column (the index) of this element */
|
||||||
oTable.fnFilter(this.value, _fnColumnIndex(index), regex, smart); //Issue 37
|
oTable.fnFilter(this.value, _fnColumnIndex(index), regex, smart); //Issue 37
|
||||||
fnOnFiltered();
|
fnOnFiltered();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,7 +172,8 @@
|
||||||
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 = "";
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -228,7 +233,8 @@
|
||||||
|
|
||||||
|
|
||||||
$('#' + 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 iMin = document.getElementById(sFromId).value * 1;
|
||||||
var iMax = document.getElementById(sToId).value * 1;
|
var iMax = document.getElementById(sToId).value * 1;
|
||||||
if (iMin != 0 && iMax != 0 && iMin > iMax)
|
if (iMin != 0 && iMax != 0 && iMin > iMax)
|
||||||
|
@ -236,6 +242,7 @@
|
||||||
|
|
||||||
oTable.fnDraw();
|
oTable.fnDraw();
|
||||||
fnOnFiltered();
|
fnOnFiltered();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue