Files
gtav-src/tools_ng/web/release/stats/js/report_presets.js
T
2025-09-29 00:52:08 +02:00

655 lines
20 KiB
JavaScript
Executable File

/*
POST EXAMPLE
{
"Name":"Build 303 PS3 Multi Local",
"Parameters":
[
{"Key":"platforms", "Value":"PS3"},
{"Key":"locations", "Value": ""},
{"Key":"age-min", "Value": "0"},
{"Key":"age-max", "Value": "100"},
{"Key":"gamers", "Value": ""},
{"Key":"game-types", "Value":"Multiplayer"},
{"Key":"date-from", "Value":"03/12/2012"},
{"Key":"date-to", "Value":"08/12/2012"},
{"Key":"builds", "Value":"303"},
{"Key":"dates-builds", "Value":"build-field"},
]}
*/
// set true for disabled filter
var headerAndFilters = {
headerType: "header-sc", // social club filtering header
disabledFields: // disables header fields
[
false, // platforms
false, // locations
false, // age
false, // gamers
false, // game-types
false, // dates+builds
],
};
function initPage(admin) {
// Hide the header is enabled
var localHeaderNavSettings = retrieveHeaderAndNavSettings();
if (localHeaderNavSettings.header) {
localHeaderNavSettings.header = false;
storeLocalHeaderAndNavSettings(localHeaderNavSettings);
}
$("#content-body")
.append(
$("<div>")
.attr("id", "presets")
.append(
$("<div>")
.attr("id", "presets-title")
.append(
$("<div>")
.addClass("left")
//.text("Report Presets")
)
.append(
$("<div>")
.addClass("right")
.text("")
)
)
.append(
$("<div>").attr("id", "presets-list")
)
);
if (admin) {
initHeaderAndFilters(headerAndFilters);
enablePresetSaving();
}
else
initHeaderAndFilters(null);
generatePresetsList(admin);
}
function generatePresetsList(admin) {
block();
$.ajax({
url: config.restHost + config.reportsPresets,
type: "GET",
dataType: "json",
cache: false,
success: function(presets, textStatus, jqXHR) {
if (admin)
populatePresetsAdminTable(presets);
else
populatePresetsTable(presets);
},
error: function (xhr, ajaxOptions, thrownError) {
console.error(this.url + "\n" + ajaxOptions + " " + xhr.status + " " + thrownError);
},
complete: function() {
unBlock();
}
});
}
function populatePresetsTable(presets) {
$("#presets-list").empty();
$("#presets-list").append(
$("<table>").append(
$("<tr>")
.append(
$("<th>").text("Name")
)
//.append(
// $("<th>").text("Platforms")
//)
.append(
$("<th>").text("Dates")
)
.append(
$("<th>").text("Builds")
)
)
);
$.each(presets.sort(function(a, b) {return (a.Id > b.Id) ? -1 : 1}), function(i, preset) {
$("#presets-list table").append(
$("<tr>")
.append(
$("<td>")
.text(preset.Name)
.attr("title", "Click to Select a Report Preset")
.addClass("hand")
.click(function() {
showReport(preset)
})
)
//.append(
// $("<td>")
// .text(function() {
// var platforms = preset.Parameters.filter(function(d) {return (d.Key == "platforms")});
// return ((platforms.length > 0) ? platforms[0].Value : "");
// })
// .attr("title", "Click to Select a Report Preset")
// .addClass("hand")
// .click(function() {
// showReport(preset)
// })
//)
.append(
$("<td>")
.text(function() {
var date_from = preset.Parameters.filter(function(d) {return (d.Key == "date-from")});
date_from = ((date_from.length > 0) ? date_from[0].Value : "");
var date_to = preset.Parameters.filter(function(d) {return (d.Key == "date-to")});
date_to = ((date_to.length > 0) ? date_to[0].Value : "");
return (date_from + " - " + date_to);
})
.attr("title", "Click to Select a Report Preset")
.addClass("hand")
.click(function() {
showReport(preset)
})
)
.append(
$("<td>")
.text(function() {
var builds = preset.Parameters.filter(function(d) {return (d.Key == "builds")});
return ((builds.length > 0) ? builds[0].Value : "");
})
.attr("title", "Click to Select a Report Preset")
.addClass("hand")
.click(function() {
showReport(preset)}
)
)
)
});
}
function populatePresetsAdminTable(presets) {
$("#presets-list").empty();
$("#presets-list").append(
$("<table>").append(
$("<tr>")
.append(
$("<th>").text("Name")
)
.append(
$("<th>").text("Dates")
)
.append(
$("<th>").text("Builds")
)
.append(
$("<th>")
.addClass("delete")
.text("Cache")
)
.append(
$("<th>")
.addClass("delete")
.text("Force")
)
.append(
$("<th>")
.addClass("delete")
.text("Delete")
)
)
);
$.each(presets.sort(function(a, b) {return (a.Id > b.Id) ? -1 : 1}), function(i, preset) {
$("#presets-list table").append(
$("<tr>")
.append(
$("<td>")
.html(preset.Name)
.attr("title", "Click to Select a Report Preset")
.addClass("hand")
.click(function() {
showReport(preset)
})
)
.append(
$("<td>")
.text(function() {
var date_from = preset.Parameters.filter(function(d) {return (d.Key == "date-from")});
date_from = ((date_from.length > 0) ? date_from[0].Value : "");
var date_to = preset.Parameters.filter(function(d) {return (d.Key == "date-to")});
date_to = ((date_to.length > 0) ? date_to[0].Value : "");
return (date_from + " - " + date_to);
})
.attr("title", "Click to Select a Report Preset")
.addClass("hand")
.click(function() {
showReport(preset)
})
)
.append(
$("<td>")
.text(function() {
var builds = preset.Parameters.filter(function(d) {return (d.Key == "builds")});
return ((builds.length > 0) ? builds[0].Value : "");
})
.attr("title", "Click to Select a Report Preset")
.addClass("hand")
.click(function() {
showReport(preset)}
)
)
.append(
$("<td>")
.html("C")
.attr("title", "Click to Cache this Preset")
.addClass("hand")
//.addClass("delete")
.click(function() {
performAllPresetRequests($(this), preset);
})
)
.append(
$("<td>")
.html("F")
.attr("title", "Click to Force Recache this Preset")
.addClass("hand")
//.addClass("delete")
.click(function() {
performAllPresetRequests($(this), preset, true);
})
)
.append(
$("<td>")
.html("")
.attr("title", "Click to Delete this Preset")
.addClass("hand")
.addClass("delete")
.click(function() {
deletePreset(preset.Id)}
)
)
)
});
}
// Saves the selected report and moves to the first page
function showReport(preset) {
// Save the report's settings as local selected values
var localPrefs = {};
$.each(preset.Parameters, function(i, parameter) {
// If the element is select, split the string to an array
/*
if (parameter.Key == "platforms" || parameter.Key == "locations"
|| parameter.Key == "sc-users" || parameter.Key == "gamertags"
|| parameter.Key == "game-types" || parameter.Key == "builds") {
localPrefs[parameter.Key] = parameter.Value.split(",");
}
else {
localPrefs[parameter.Key] = parameter.Value;
}
*/
if (parameter.Key == "radio-checked") {
if (parameter.Value == "dates-field")
localPrefs["dates-builds"] = "1";
else if (parameter.Value == "builds-field")
localPrefs["dates-builds"] = "2";
return;
}
localPrefs[parameter.Key] = parameter.Value.split(",");
//console.log(parameter.Key);
//console.log(localPrefs[parameter.Key]);
});
//console.log(localPrefs);
// Temporary hack for presets with no time
//console.log(localPrefs["date-from"]);
if (localPrefs["date-from"] && localPrefs["date-from"][0].length == 10)
localPrefs["date-from"][0] += " 00:00";
if (localPrefs["date-to"] && localPrefs["date-to"][0].length == 10)
localPrefs["date-to"][0] += " 00:00";
// Date grouping to Daily and xp-upper to 900000
localPrefs["date-grouping"] = ["Daily"];
localPrefs["upper-xp"] = [900000];
// force UTC
localPrefs["utc-force"] = true;
var headerStoreName = (config.headerOptions[headerAndFilters.headerType].storeName) ?
config.headerOptions[headerAndFilters.headerType].storeName
: headerAndFilters.headerType;
storeLocalObject(config.restHost + headerStoreName, localPrefs);
//console.log(retrieveLocalObject(config.restHost + "_" + headerAndFilters.headerType));
// Find the menu's next item and navigate there
//var nextItemUrl = $("#nav-ul li a.active").parent().next().find("a").attr("href");
var nextItemUrl = $("#nav-ul li").first().next().children("a").attr("href");
if (nextItemUrl == "#")
nextItemUrl = "total_playing_time.html";
$(location).attr("href", nextItemUrl);
}
function enablePresetSaving() {
$("#presets-title div.right")
.append(
$("<span>")
.append(
$("<input>")
.attr("id", "preset-name")
.attr("type", "text")
.val("")
.change(savePreset)
)
)
.append(
$("<span>")
.html("Save Current Settings as a Preset")
.attr("title", "Save Current Settings as a Preset")
.addClass("hand")
.addClass("add")
.click(savePreset)
)
}
function savePreset() {
var name = $("#preset-name").val();
if (!name)
return;
var headerStoreName = (config.headerOptions[headerAndFilters.headerType].storeName) ?
config.headerOptions[headerAndFilters.headerType].storeName
: headerAndFilters.headerType;
var localPrefs = retrieveLocalObject(config.restHost + headerStoreName);
var presetData = {
"Name": name,
"Parameters" :
[
{"Key": "platforms", "Value": (localPrefs["platforms"]) ? localPrefs["platforms"].join(",") : ""},
{"Key": "locations", "Value": (localPrefs["locations"]) ? localPrefs["locations"].join(",") : ""},
{"Key": "age-min", "Value": (localPrefs["age-min"]) ? localPrefs["age-min"].join(",") : ""},
{"Key": "age-max", "Value": (localPrefs["age-max"]) ? localPrefs["age-max"].join(",") : ""},
//{"Key": "sc-users", "Value": (localPrefs["sc-users"]) ? localPrefs["sc-users"] : []},
//{"Key": "gamertags", "Value": (localPrefs["gamertags"]) ? localPrefs["gamertags"] : []},
{"Key": "game-types", "Value": (localPrefs["game-types"]) ? localPrefs["game-types"].join(",") : ""},
{
"Key": "date-from",
"Value": ((localPrefs["date-from"])
? ( localPrefs["date-from"].join ? localPrefs["date-from"].join(",") : localPrefs["date-from"] )
: "")
},
{
"Key": "date-to",
"Value": ((localPrefs["date-to"])
? ( localPrefs["date-to"].join ? localPrefs["date-to"].join(",") : localPrefs["date-to"] )
: "")
},
//{"Key": "date-to", "Value": (localPrefs["date-to"]) ? localPrefs["date-to"].join(",") : ""},
{"Key": "builds", "Value": (localPrefs["builds"]) ? localPrefs["builds"].join(",") : ""},
{"Key": "dates-builds", "Value": (localPrefs["dates-builds"]) ? localPrefs["dates-builds"].join(",") : ""},
]
}
//console.log(presetData);
block();
$.ajax({
url: config.restHost + config.reportsPresets,
type: "POST",
dataType: "json",
contentType: "application/json",
data: JSON.stringify(presetData),
success: function(response, textStatus, jqXHR) {
Sexy.alert("Preset Saved Successfully!");
},
error: function (xhr, ajaxOptions, thrownError) {
Sexy.alert("Save Failed! Check the Console for more Info");
console.error(this.url + "\n" + ajaxOptions + " " + xhr.status + " " + thrownError);
},
complete: function() {
generatePresetsList(true);
$("#preset-name").val("");
unBlock();
}
});
}
function deletePreset(reportId) {
block();
$.ajax({
url: config.restHost + config.reportsPresets + "/" + reportId,
type: "DELETE",
success: function(response, textStatus, jqXHR) {
Sexy.alert("Preset Deleted Successfully!");
},
error: function (xhr, ajaxOptions, thrownError) {
Sexy.alert("Delete Failed! Check the Console for more Info");
console.error(this.url + "\n" + ajaxOptions + " " + xhr.status + " " + thrownError);
},
complete: function() {
generatePresetsList(true);
unBlock();
}
});
}
function performAllPresetRequests(element, preset, force) {
var forceUrlSuffix = "";
if (force)
forceUrlSuffix = config.reportForceSuffix;
element.addClass("caching");
var endpointObjects = [];
var globalParamValues = {
ElementKeyName: "Name",
ElementValueName: "Value",
Pairs: {},
}
$.each(preset.Parameters, function(i, parameter) {
if (parameter.Key == "platforms")
globalParamValues.Pairs["PlatformNames"] = parameter.Value;
else if (parameter.Key == "locations")
globalParamValues.Pairs["CountryCodes"] = parameter.Value;
else if (parameter.Key == "age-min")
globalParamValues.Pairs["AgeMin"] = (parameter.Value) ? parameter.Value : null;
else if (parameter.Key == "age-max")
globalParamValues.Pairs["AgeMax"] = (parameter.Value) ? parameter.Value : null;
else if (parameter.Key == "sc-users")
globalParamValues.Pairs["SocialClubUserNames"] = parameter.Value;
else if (parameter.Key == "gamertags")
globalParamValues.Pairs["GamerHandlePlatformPairs"] = parameter.Value;
else if (parameter.Key == "game-types")
globalParamValues.Pairs["GameTypeNames"] = parameter.Value;
else if (parameter.Key == "date-from") {
if (parameter.Value.length == 10)
parameter.Value += " 00:00";
globalParamValues.Pairs["StartDate"] = new Date(config.dateInputUTCFormat.parse(parameter.Value)).toISOString();
}
else if (parameter.Key == "date-to") {
if (parameter.Value.length == 10)
parameter.Value += " 00:00";
globalParamValues.Pairs["EndDate"] = new Date(config.dateInputUTCFormat.parse(parameter.Value)).toISOString();
}
else if (parameter.Key == "builds")
globalParamValues.Pairs["BuildIdentifiers"] = parameter.Value;
//else if (parameter.Key == "radio-checked")
// globalParamValues.Pairs["radio-checked"] = parameter.Value;
else if (parameter.Key == "dates-builds") {
if (parameter.Value == 1)
globalParamValues.Pairs["BuildIdentifiers"] = null; // dates only - disable builds
else if (parameter.Value == 2) {
globalParamValues.Pairs["StartDate"] = null; // builds only - disable dates
globalParamValues.Pairs["EndDate"] = null;
}
}
globalParamValues.Pairs["IncludeDebug"] = false;
globalParamValues.Pairs["Grouping"] = "Daily";
globalParamValues.Pairs["GroupByType"] = false;
});
//console.log(globalParamValues);
// navigationItems is read from stats-config.js imported in the html file
$.each(navigationItems, function(i, navItem) {
if (navItem.subItems.length > 0) {
$.each(navItem.subItems, function(i, subItem) {
populateEndpoints(subItem);
});
}
else
populateEndpoints(navItem);
});
var req = new ReportRequest(null, "json", null, config.restHost + config.reportsQueryAsync);
req.sendMultipleAsyncRequest(endpointObjects, function() {
Sexy.alert("Caching of '" + preset.Name + "' has finished");
element.removeClass("caching");
});
function populateEndpoints(item) {
if (item.config == null)
return;
else {
// Load the script code synchronously
$.ajaxSetup({async: false});
$.getScript(item.config, function() {
// If it's a profile stat
if (item.profile) {
endpointObjects = endpointObjects.concat(constructProfileStatEndpoints(reportOptions));
}
else if (item.tableau) {
// Do nothing for Tableau reports
}
// If it's a capture stat report
else if (item.capture) {
/* DISABLED
var pValues = $.extend(true, {}, globalParamValues);
var latestBuild = pValues.Pairs["BuildIdentifiers"].split(",")[0];
var availableBuilds = $.map($("#build option"), function(e) { return ((e.value <= latestBuild) ? e.value : null) });
var reportBuilds = availableBuilds.splice(0, reportOptions.graphHistory);
var pValuesArray = [];
$.each(reportBuilds, function(i, build) {
pValuesArray.push({
ElementKeyName: "Name",
ElementValueName: "Value",
Pairs: {
"BuildIdentifier": build,
}
});
});
//console.log(pValuesArray);
endpointObjects.push({
restUrl: config.restHost + reportOptions.restEndpoint,
restAsyncUrl: config.restHost + reportOptions.restEndpointAsync + forceUrlSuffix,
pValues: pValuesArray,
});
*/
}
// Else it's a telemetry stat, apply the global param values
else {
// Deep copy the globalParams object
var pValues = $.extend(true, {}, globalParamValues);
if (pValues.Pairs["radio-checked"] == "builds-field") {
pValues.Pairs["StartDate"] = null;
pValues.Pairs["EndDate"] = null;
}
else if (pValues.Pairs["radio-checked"] == "dates-field") {
pValues.Pairs["BuildIdentifiers"] = null;
}
endpointObjects.push({
restUrl: config.restHost + reportOptions.restEndpoint,
restAsyncUrl: config.restHost + reportOptions.restEndpointAsync + forceUrlSuffix,
pValues: [pValues],
});
}
});
// End of load the script code synchronously
$.ajaxSetup({async: true});
}
}
function constructProfileStatEndpoints(reportOptions) {
var profileEndpointObjects = [];
var gameTypeArray = (globalParamValues.Pairs["GameTypeNames"]) ?
globalParamValues.Pairs["GameTypeNames"].split(",") :
config.gameTypes;
var profStats = new ProfileStats();
$.each(reportOptions.availableCharts, function(i, chart) {
if (!chart.divided) {
var pValuesArray = [];
$.each(chart.types, function(i, type) {
// Deep copy the globalParams object
var pValues = $.extend(true, {}, globalParamValues);
var statNames = profStats.constructStatNames(chart, type, gameTypeArray);
// Add the extra combined profile stat params
pValues.Pairs["StatNames"] = statNames.join(",");
pValues.Pairs["BucketSize"] = chart.bucketSize;
pValuesArray.push(pValues);
});
//console.log(reportOptions.restEndpoint);
var endpointObject = {
restUrl: config.restHost + reportOptions.restEndpoint,
restAsyncUrl: config.restHost + reportOptions.restEndpointAsync + forceUrlSuffix,
pValues: pValuesArray,
}
profileEndpointObjects.push(endpointObject);
}
else {// if chart.divided
var numeratorStatNames = profStats.constructStatNames(chart, chart.types[0], gameTypeArray);
var denominatorStatNames = profStats.constructStatNames(chart, chart.types[1], gameTypeArray);
// Deep copy the globalParams object
var pValues = $.extend(true, {}, globalParamValues);
// Add the extra divided profile stat params
pValues.Pairs["NumeratorStatNames"] = numeratorStatNames.join(",");
pValues.Pairs["DenominatorStatNames"] = denominatorStatNames.join(",");
pValues.Pairs["BucketSize"] = chart.bucketSize;
var endpointObject = {
restUrl: config.restHost + config.profileStatsDividedDiff,
restAsyncUrl: config.restHost + config.profileStatsDividedDiffAsync + forceUrlSuffix,
pValues: [pValues],
}
profileEndpointObjects.push(endpointObject);
}
});
return profileEndpointObjects;
}
//console.log(endpoindObjects);
}