/**
* @namespace javascripts.dashboard.utils
*/
/**
* Get the success and fail line values for the given context
*
* @function targetLineValues
* @memberof javascripts.dashboard.utils
*/
export function targetLineValues(context) {
if (context === "production") return { successLineValue: 40, failLineValue: 50 }
if (context === "deploy-preview") return { successLineValue: 45, failLineValue: 55 }
if (context === "cms") return { successLineValue: 35, failLineValue: 45 }
if (context === "lcp") return { successLineValue: 2500, failLineValue: 4000 }
if (context === "fid") return { successLineValue: 100, failLineValue: 300 }
if (context === "cls") return { successLineValue: 0.1, failLineValue: 0.25 }
}
/**
* Get the minimum axis value for the given context
*
* @function minAxisValues
* @memberof javascripts.dashboard.utils
*/
export function minAxisValues(context) {
if (context === "production") return 60
if (context === "deploy-preview") return 60
if (context === "cms") return 60
if (context === "lcp") return 5000
if (context === "fid") return 400
if (context === "cls") return 0.4
}
/**
* Get the x axis legend text for the given context
*
* @function axisTextValues
* @memberof javascripts.dashboard.utils
*/
export function axisTextValues(context) {
if (context === "production") return "Build number"
if (context === "deploy-preview") return "Build number"
if (context === "cms") return "Build number"
if (context === "lcp") return "Day"
if (context === "fid") return "Day"
if (context === "cls") return "Day"
}
/**
* Get the y axis unit of measurment in the tooltip for the given context
*
* @function axisMeasurementValues
* @memberof javascripts.dashboard.utils
*/
export function axisMeasurementValues(context) {
if (context === "production") return " s"
if (context === "deploy-preview") return " s"
if (context === "cms") return " s"
if (context === "lcp") return " ms"
if (context === "fid") return " ms"
if (context === "cls") return ""
}
/**
* Allow clicks on the given context
*
* @function allowClicks
* @memberof javascripts.dashboard.utils
*/
export function allowClicks(context) {
if (context === "production") return true
if (context === "deploy-preview") return true
if (context === "cms") return true
if (context === "lcp") return false
if (context === "fid") return false
if (context === "cls") return false
}
/**
* Return all objects that have the key value within the given percentile
*
* @function metricsInPercentile
* @memberof javascripts.dashboard.utils
*/
export function metricsInPercentile(data, key, percentile) {
const selectedValues = data.map((object) => object[key])
const sortedValues = sortNumberArray(selectedValues)
const percentileLimit = percentileValue(sortedValues, percentile)
return data.filter((object) => object[key] <= percentileLimit )
}
/**
* Sort the numbers from smallest to largest
*
* @function sortNumberArray
* @memberof javascripts.dashboard.utils
*/
function sortNumberArray(arr) {
return arr.sort((a, b) => a - b)
}
/**
* Get the value for the given percentile
*
* @function percentileValue
* @memberof javascripts.dashboard.utils
*/
function percentileValue(arr, p) {
if (arr.length === 0) return 0;
if (typeof p !== "number") throw new TypeError("p must be a number");
if (p <= 0) return arr[0];
if (p >= 1) return arr[arr.length - 1];
let index = (arr.length - 1) * p,
lower = Math.floor(index),
upper = lower + 1,
weight = index % 1
if (upper >= arr.length) return arr[lower];
return arr[lower] * (1 - weight) + arr[upper] * weight;
}
export function percentage(total, value) {
return Math.round(
(((value / total) * 100) + Number.EPSILON) * 10
) / 10
}