From f565c2c37347616fc6ec25845e232e167e1e43ed Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zo=C3=AB=20Bijl?= <5457769+ZoeBijl@users.noreply.github.com>
Date: Thu, 6 Jun 2024 01:30:03 +0200
Subject: [PATCH] fix: prevent NaN dates
* fix: filter NaN dates in getRouteAnalysisImportantDates
* feat: move getAirlineCode and getServerName to helper.js
* chore: change arrow function to method
* feat: move formatDate to helpers.js as formatDateString
fix: check if date is provided, else return
* feat: move formatWeekDate to helpers.js as formatDateStringWeek
* feat: move getDateDiff to helpers.js
---
extension/content_dashboard.js | 80 +++++++++++---------------------
extension/helpers.js | 85 +++++++++++++++++++++++++++++++++-
2 files changed, 112 insertions(+), 53 deletions(-)
diff --git a/extension/content_dashboard.js b/extension/content_dashboard.js
index 5999865..d46caa9 100644
--- a/extension/content_dashboard.js
+++ b/extension/content_dashboard.js
@@ -4,8 +4,8 @@
var settings,airline,server,todayDate;
$(function(){
todayDate = (getDate('today',0));
- airline = getAirlineCode();
- server = getServerName();
+ airline = AES.getAirlineCode();
+ server = AES.getServerName();
chrome.storage.local.get(['settings'], function(result) {
settings = result.settings;
@@ -798,12 +798,12 @@ function updateRouteAnalysisCollumns(data,dates,routeIndex){
if(dates.analysis){
//Analysis date
- $(rowId+' .aes-analysisDate').text(formatDate(dates.analysis));
+ $(rowId+' .aes-analysisDate').text(AES.formatDateString(dates.analysis));
//Pricing date
if(dates.pricing){
- $(rowId+' .aes-pricingDate').text(formatDate(dates.pricing));
+ $(rowId+' .aes-pricingDate').text(AES.formatDateString(dates.pricing));
}
//Pax Load
@@ -822,7 +822,7 @@ function updateRouteAnalysisCollumns(data,dates,routeIndex){
if(dates.analysisOneBefore){
//Previous analysis date
- $(rowId+' .aes-analysisPreDate').text(formatDate(dates.analysisOneBefore));
+ $(rowId+' .aes-analysisPreDate').text(AES.formatDateString(dates.analysisOneBefore));
//Pax Load Delta
$(rowId+' .aes-paxLoadDelta').html(displayRouteAnalysisLoadDelta(data.date[dates.analysis].data,data.date[dates.analysisOneBefore].data,'pax'));
@@ -877,7 +877,7 @@ function updateRouteAnalysisCollumns(data,dates,routeIndex){
outDates = getInvPricingAnalaysisPricingDate(dataOut.date);
if(outDates.analysis){
- $('#aes-row-invPricing-'+origin+dest+'-analysis',tbody).text(formatDate(outDates.analysis));
+ $('#aes-row-invPricing-'+origin+dest+'-analysis',tbody).text(AES.formatDateString(outDates.analysis));
outIndex = dataOut.date[outDates.analysis].routeIndex;
let td = $('#aes-row-invPricing-'+origin+dest+'-OWindex',tbody);
td.html(displayIndex(outIndex));
@@ -887,7 +887,7 @@ function updateRouteAnalysisCollumns(data,dates,routeIndex){
}
}
if(outDates.pricing){
- $('#aes-row-invPricing-'+origin+dest+'-pricing',tbody).text(formatDate(outDates.pricing));
+ $('#aes-row-invPricing-'+origin+dest+'-pricing',tbody).text(AES.formatDateString(outDates.pricing));
}
}
@@ -1011,12 +1011,14 @@ function getRouteAnalysisImportantDates(dates){
pricingOneBefore:0
}
let analysisDates = [];
- let pricingDates = []
- for(let date in dates) {
- if(dates[date].pricingUpdated){
- pricingDates.push(date);
- }
- analysisDates.push(date);
+ let pricingDates = []
+ for(let date in dates) {
+ if (Number.isInteger(parseInt(date))) {
+ if(dates[date].pricingUpdated){
+ pricingDates.push(date);
+ }
+ analysisDates.push(date);
+ }
}
analysisDates.reverse();
pricingDates.reverse();
@@ -1169,7 +1171,7 @@ function displayCompetitorMonitoringAirlinesTable(div){
if(dates.length){
data.airlineCode = value.tab0[dates[0]].code;
data.airlineName = value.tab0[dates[0]].displayName;
- data.overviewDate = formatDate(dates[0]);
+ data.overviewDate = AES.formatDateString(dates[0]);
data.overviewRating = value.tab0[dates[0]].rating;
data.overviewTotalPax = value.tab0[dates[0]].pax;
data.overviewTotalCargo = value.tab0[dates[0]].cargo;
@@ -1178,7 +1180,7 @@ function displayCompetitorMonitoringAirlinesTable(div){
data.overviewStaff = value.tab0[dates[0]].employees;
//If previous date exists
if(dates[1]){
- data.overviewPreDate = formatDate(dates[1]);
+ data.overviewPreDate = AES.formatDateString(dates[1]);
data.overviewRatingDelta = getDelta(getRatingNr(data.overviewRating),getRatingNr(value.tab0[dates[1]].rating));
data.overviewTotalPaxDelta = getDelta(data.overviewTotalPax,value.tab0[dates[1]].pax);
data.overviewTotalCargoDelta = getDelta(data.overviewTotalCargo,value.tab0[dates[1]].cargo);
@@ -1194,7 +1196,7 @@ function displayCompetitorMonitoringAirlinesTable(div){
}
dates.sort(function(a, b){return b-a});
if(dates.length){
- data.fafWeek = formatWeekDate(value.tab2[dates[0]].week);
+ data.fafWeek = AES.formatDateStringWeek(value.tab2[dates[0]].week);
data.fafAirportsServed = value.tab2[dates[0]].airportsServed;
data.fafOperatedFlights = value.tab2[dates[0]].operatedFlights;
data.fafSeatsOffered = value.tab2[dates[0]].seatsOffered;
@@ -1203,7 +1205,7 @@ function displayCompetitorMonitoringAirlinesTable(div){
data.faffko = value.tab2[dates[0]].fko;
//If previous date exists
if(dates[1]){
- data.fafWeekPre = formatWeekDate(value.tab2[dates[1]].week);
+ data.fafWeekPre = AES.formatDateStringWeek(value.tab2[dates[1]].week);
data.fafAirportsServedDelta = getDelta(data.fafAirportsServed,value.tab2[dates[1]].airportsServed);
data.fafOperatedFlightsDelta = getDelta(data.fafOperatedFlights,value.tab2[dates[1]].operatedFlights);
data.fafSeatsOfferedDelta = getDelta(data.fafSeatsOffered,value.tab2[dates[1]].seatsOffered);
@@ -1222,7 +1224,7 @@ function displayCompetitorMonitoringAirlinesTable(div){
if(dates.length){
let hubs = {};
//For display
- data.scheduleDate = formatDate(dates[0]);
+ data.scheduleDate = AES.formatDateString(dates[0]);
//For table
data.scheduleDateUse = dates[0];
data.scheduleCargoFreq = 0;
@@ -1265,7 +1267,7 @@ function displayCompetitorMonitoringAirlinesTable(div){
//Previous schedule data
if(dates[1]){
- data.scheduleDatePre = formatDate(dates[1]);
+ data.scheduleDatePre = AES.formatDateString(dates[1]);
data.scheduleCargoFreqPre = 0;
data.schedulePAXFreqPre = 0;
data.scheduleFltNrPre = 0;
@@ -2185,7 +2187,7 @@ function displayAircraftProfitability(){
profit.finishedFlights=value.profit.finishedFlights;
profit.profitFlights=value.profit.profitFlights;
profit.profit=value.profit.profit;
- profit.dateProfit=formatDate(value.profit.date)+' '+value.profit.time;
+ profit.dateProfit=AES.formatDateString(value.profit.date)+' '+value.profit.time;
}
data.push({
aircraftId:value.aircraftId,
@@ -2196,7 +2198,7 @@ function displayAircraftProfitability(){
note:value.note,
age:value.age,
maintenance:value.maintanance,
- dateAircraft:formatDate(value.date)+' '+value.time,
+ dateAircraft:AES.formatDateString(value.date)+' '+value.time,
totalFlights:profit.totalFlights,
finishedFlights:profit.finishedFlights,
profitFlights:profit.profitFlights,
@@ -2691,8 +2693,8 @@ function generalAddScheduleRow(tbody){
let scheduleData = result[scheduleKey];
if(scheduleData){
let lastUpdate = getDate('schedule',scheduleData.date);
- let diff = getDateDiff(todayDate.date,lastUpdate);
- let span = $('').text('Last schedule extract '+formatDate(lastUpdate)+' ('+diff+' days ago). Extract new schedule if there are new routes.');
+ let diff = AES.getDateDiff([todayDate.date, lastUpdate]);
+ let span = $('').text('Last schedule extract '+AES.formatDateString(lastUpdate)+' ('+diff+' days ago). Extract new schedule if there are new routes.');
if(diff >= 0 && diff < 7){
span.addClass('good');
} else {
@@ -2738,8 +2740,8 @@ function generalAddPersonelManagementRow(tbody){
let personelManagementData = result[key];
if(personelManagementData){
let lastUpdate = personelManagementData.date;
- let diff = getDateDiff(todayDate.date,lastUpdate);
- let span = $('').text('Last personnel salary update: '+formatDate(lastUpdate)+' ('+diff+' days ago).');
+ let diff = AES.getDateDiff([todayDate.date, lastUpdate]);
+ let span = $('').text('Last personnel salary update: '+AES.formatDateString(lastUpdate)+' ('+diff+' days ago).');
if(diff >= 0 && diff < 7){
span.addClass('good');
} else {
@@ -2876,30 +2878,4 @@ function getDate(type, scheduleData){
default:
return 0;
}
-}
-function getDateDiff(date1,date2){
- //Returns day differnece between date1 - date2
- let d1 = new Date(formatDate(date1)+'T12:00:00Z');
- let d2 = new Date(formatDate(date2)+'T12:00:00Z');
- let diff = Math.round((d1 - d2)/(1000 * 60 * 60 * 24));
- return diff;
-}
-function getAirlineCode(){
- //code
- let airline = $("#enterprise-dashboard table tr:eq(1) td").text();
- //name
- let name = $("#as-navbar-main-collapse ul li:eq(0) a:eq(0)").text().trim().replace(/[^A-Za-z0-9]/g, '');
- return {code:airline,name:name};
-}
-function getServerName(){
- let server = window.location.hostname
- server = server.split('.');
- return server[0];
-}
-function formatDate(date){
- return date.substring(0, 4)+'-'+date.substring(4, 6)+'-'+date.substring(6, 8);
-}
-function formatWeekDate(date){
- let a = date.toString();
- return a.substring(0, 2)+'/'+a.substring(2, 6);
-}
+}
diff --git a/extension/helpers.js b/extension/helpers.js
index a272f3a..fd9bc06 100644
--- a/extension/helpers.js
+++ b/extension/helpers.js
@@ -1,12 +1,38 @@
/** Shared logic */
class AES {
+ /**
+ * Returns the airline name and code from the dashboard
+ * @returns {object} {name: string, code: string}
+ */
+ static getAirlineCode() {
+ const factsTable = document.querySelector(".facts table")
+ const nameElement = factsTable.querySelector("tr:nth-child(1) td:last-child")
+ const codeElement = factsTable.querySelector("tr:nth-child(2) td:last-child")
+
+ return {
+ name: nameElement.innerText,
+ code: codeElement.innerText
+ }
+ }
+
+ /**
+ * Returns the server name
+ * @returns {string} server name
+ */
+ static getServerName() {
+ const hostname = window.location.hostname
+ const servername = hostname.split(".")[0]
+
+ return servername
+ }
+
/**
* Formats a currency value local standards
* @param {integer} currency value
* @param {string} alignment: "right" | "left"
* @returns {HTMLElement} span with formatted value
*/
- static formatCurrency = (value, alignment) => {
+ static formatCurrency(value, alignment) {
let container = document.createElement("span")
let formattedValue = Intl.NumberFormat().format(value)
let indicatorEl = document.createElement("span")
@@ -39,4 +65,61 @@ class AES {
return container
}
+
+ /**
+ * Formats a date string to human readable format
+ * @param {string} "20240524"
+ * @returns {string} "2024-05-24" | "error: invalid format for AES.formatDateString"
+ */
+ static formatDateString(date) {
+ if (!date) {
+ return
+ }
+
+ const correctLength = date.length === 8
+ const isInteger = Number.isInteger(parseInt(date))
+ let result = "error: invalid format for AES.formatDateString"
+
+ if (correctLength && isInteger) {
+ const year = date.substring(0, 4)
+ const month = date.substring(4, 6)
+ const day = date.substring(6, 8)
+ result = `${year}-${month}-${day}`
+ }
+
+ return result
+ }
+ /**
+ * Returns a formatted date (week) string
+ * @param {string} "212024"
+ * @returns {string} "21/2014 | "error: invalid format for AES.formatDateStringWeek"
+ */
+ static formatDateStringWeek(date) {
+ const correctLength = date.toString().length === 6
+ const isInteger = Number.isInteger(parseInt(date))
+ let result = "error: invalid format for AES.formatDateStringWeek"
+
+ if (correctLength && isInteger) {
+ const DateAsString = date.toString()
+ const week = DateAsString.substring(0, 2)
+ const year = DateAsString.substring(2, 6)
+
+ result = `${week}/${year}`
+ }
+
+ return result
+ }
+
+ /**
+ * Returns the difference between dates in days
+ * @param {array} ["20240520", "20240524"]
+ * @returns {integer} 4
+ */
+ static getDateDiff(dates) {
+ let dateA = new Date(`${this.formatDateString(dates[0])}T12:00:00Z`)
+ let dateB = new Date(`${this.formatDateString(dates[1])}T12:00:00Z`)
+ let result = Math.round((dateA - dateB)/(1000 * 60 * 60 * 24))
+
+ return result
+ }
}