From dc25571c4d301fefcda96652276d4e72fb814bfc Mon Sep 17 00:00:00 2001 From: Conor McNamara Date: Mon, 27 Mar 2023 20:21:10 +0100 Subject: [PATCH 1/2] Extend operations handled by functions --- functions/index.js | 114 +++++++++++++++++++++++++++++++- src/components/TrainSidebar.vue | 44 ++++++------ src/pages/InsightsPage.vue | 24 ++----- src/pages/MapPage.vue | 7 +- 4 files changed, 142 insertions(+), 47 deletions(-) diff --git a/functions/index.js b/functions/index.js index 4973f3f..ecce8af 100644 --- a/functions/index.js +++ b/functions/index.js @@ -208,6 +208,49 @@ exports.postLiveTrainData = functions.https.onRequest((request, response) => { let jsonData = jsonObj.ArrayOfObjTrainPositions.objTrainPositions; return jsonData; } + + function getRunningOriginDestination(publicMessage) { + let startOrigin = publicMessage.indexOf("-") + 1 + let endOrigin = publicMessage.indexOf("to ") - 1; + let origin = publicMessage.substring(startOrigin, endOrigin); + let startDestination = endOrigin + 4; + let endDestination = publicMessage.indexOf("(") - 1; + let destination = publicMessage.substring(startDestination, endDestination); + return {origin: origin, destination: destination} + } + + function getTerminatedOriginDestination(publicMessage) { + let startOrigin = publicMessage.indexOf("-") + 1 + let endOrigin = publicMessage.indexOf("to ") - 1; + let origin = publicMessage.substring(startOrigin, endOrigin); + let startDestination = endOrigin + 4; + let endDestination = publicMessage.indexOf("("); + let destination = publicMessage.substring(startDestination, endDestination); + return {origin: origin, destination: destination} + } + + function getNotYetRunningOriginDestination(publicMessage) { + let startOrigin = publicMessage.indexOf(".") + 1 + let endOrigin = publicMessage.indexOf("to ") - 1; + let origin = publicMessage.substring(startOrigin, endOrigin); + let startDestination = endOrigin + 3; + let endDestination = publicMessage.indexOf(". E"); + let destination = publicMessage.substring(startDestination, endDestination); + return {origin: origin, destination: destination} + } + + function getOriginDestination(publicMessage, trainType) { + if (trainType == "R") return getRunningOriginDestination(publicMessage) + else if (trainType == "T") return getTerminatedOriginDestination(publicMessage) + else if (trainType == "N") return getNotYetRunningOriginDestination(publicMessage) + } + + function getPunctuality(publicMessage, trainType) { + if (trainType == "N") return + let start = publicMessage.indexOf("(") + 1 + let end = publicMessage.indexOf(")") + return publicMessage.substring(start, end) + } // helper function to write to the database function batchWriteDB(request, response, db, jsonData, trainTypeCode) { @@ -217,10 +260,22 @@ exports.postLiveTrainData = functions.https.onRequest((request, response) => { cors(request, response, () => { var batchWrite = db.batch(); - jsonData.forEach((doc) => { + jsonData.forEach((doc) => { // ignore trains with longitudes or latitudes equal zero if (!(doc["TrainLongitude"] == 0 || doc["TrainLatitude"] == 0)) { doc["TrainType"] = [trainTypeCode] + + // get the origin, destination and filter out \n from the public message + doc["PublicMessage"][0] = doc["PublicMessage"][0].replace(/\\n/g, ". "); + var originDestination = getOriginDestination(doc["PublicMessage"][0], doc["TrainStatus"][0]) + doc["Origin"] = [originDestination.origin] + doc["Destination"] = [originDestination.destination] + + // get the lateness if the train is running or terminated + if (doc["TrainStatus"][0] == "R" || doc["TrainStatus"][0] == "T") { + doc["Punctuality"] = [getPunctuality(doc["PublicMessage"][0], doc["TrainStatus"][0])] + } + var docID = db.collection('liveTrainData').doc(doc["TrainCode"][0]); batchWrite.set(docID, doc); } @@ -275,7 +330,7 @@ exports.postLiveTrainData = functions.https.onRequest((request, response) => { }) // scheduled version -exports.scheduledPostLiveTrainData = functions.pubsub.schedule('every 10 minutes').onRun(async (context) => { +exports.scheduledPostLiveTrainData = functions.pubsub.schedule('every 1 minutes').onRun(async (context) => { // helper function to parse train JSON objects function parseJSON(result) { let jsonStr = JSON.stringify(result); @@ -284,6 +339,49 @@ exports.scheduledPostLiveTrainData = functions.pubsub.schedule('every 10 minutes return jsonData; } + function getRunningOriginDestination(publicMessage) { + let startOrigin = publicMessage.indexOf("-") + 1 + let endOrigin = publicMessage.indexOf("to ") - 1; + let origin = publicMessage.substring(startOrigin, endOrigin); + let startDestination = endOrigin + 4; + let endDestination = publicMessage.indexOf("(") - 1; + let destination = publicMessage.substring(startDestination, endDestination); + return {origin: origin, destination: destination} + } + + function getTerminatedOriginDestination(publicMessage) { + let startOrigin = publicMessage.indexOf("-") + 1 + let endOrigin = publicMessage.indexOf("to ") - 1; + let origin = publicMessage.substring(startOrigin, endOrigin); + let startDestination = endOrigin + 4; + let endDestination = publicMessage.indexOf("("); + let destination = publicMessage.substring(startDestination, endDestination); + return {origin: origin, destination: destination} + } + + function getNotYetRunningOriginDestination(publicMessage) { + let startOrigin = publicMessage.indexOf(".") + 1 + let endOrigin = publicMessage.indexOf("to ") - 1; + let origin = publicMessage.substring(startOrigin, endOrigin); + let startDestination = endOrigin + 3; + let endDestination = publicMessage.indexOf(". E"); + let destination = publicMessage.substring(startDestination, endDestination); + return {origin: origin, destination: destination} + } + + function getOriginDestination(publicMessage, trainType) { + if (trainType == "R") return getRunningOriginDestination(publicMessage) + else if (trainType == "T") return getTerminatedOriginDestination(publicMessage) + else if (trainType == "N") return getNotYetRunningOriginDestination(publicMessage) + } + + function getPunctuality(publicMessage, trainType) { + if (trainType == "N") return + let start = publicMessage.indexOf("(") + 1 + let end = publicMessage.indexOf(")") + return publicMessage.substring(start, end) + } + // helper function to write to the database function batchWriteDB(db, jsonData, trainTypeCode) { if (!jsonData) return @@ -292,6 +390,18 @@ exports.scheduledPostLiveTrainData = functions.pubsub.schedule('every 10 minutes // ignore trains with longitudes or latitudes equal zero if (!(doc["TrainLongitude"] == 0 || doc["TrainLatitude"] == 0)) { doc["TrainType"] = [trainTypeCode] + + // get the origin, destination and filter out \n from the public message + doc["PublicMessage"][0] = doc["PublicMessage"][0].replace(/\\n/g, ". "); + var originDestination = getOriginDestination(doc["PublicMessage"][0], doc["TrainStatus"][0]) + doc["Origin"] = [originDestination.origin] + doc["Destination"] = [originDestination.destination] + + // get the lateness if the train is running or terminated + if (doc["TrainStatus"][0] == "R" || doc["TrainStatus"][0] == "T") { + doc["Punctuality"] = [getPunctuality(doc["PublicMessage"][0], doc["TrainStatus"][0])] + } + var docID = db.collection('liveTrainData').doc(doc["TrainCode"][0]); batchWrite.set(docID, doc); } diff --git a/src/components/TrainSidebar.vue b/src/components/TrainSidebar.vue index f752053..20d1359 100644 --- a/src/components/TrainSidebar.vue +++ b/src/components/TrainSidebar.vue @@ -3,7 +3,7 @@
X

Train Code: {{ store.selectedTrain["TrainCode"][0] }}

-

Origin:
{{ getOrigin(store.selectedTrain["PublicMessage"][0]) }}

+

Origin:
{{ store.selectedTrain["Origin"][0] }}

Late DART Icon On-Time DART Icon @@ -14,7 +14,7 @@ On-Time Train Icon Not Running Train Icon
-

Destination:
{{ getDestination(store.selectedTrain["PublicMessage"][0]) }}

+

Destination:
{{ store.selectedTrain["Destination"][0] }}

@@ -49,6 +49,13 @@

Direction:
{{ store.selectedTrain["Direction"][0] }}

+
+
+ +
+

Punctuality:
{{ store.selectedTrain["Punctuality"][0] }}

+
+
@@ -86,19 +93,6 @@ export default { return false; }, - getOrigin(publicMessage) { - let startOrigin = publicMessage.indexOf("-") + 1 - let endOrigin = publicMessage.indexOf("to ") - 1; - return publicMessage.substring(startOrigin, endOrigin); - }, - - getDestination(publicMessage) { - let endOrigin = publicMessage.indexOf("to "); - let startDestination = endOrigin + 3; - let endDestination = publicMessage.indexOf("(") - 1; - return publicMessage.substring(startDestination, endDestination); - }, - // method to determine whether or not a selected train is running isTrainRunning() { if (store.selectedTrain["TrainStatus"][0] == "R") { @@ -112,7 +106,7 @@ export default { // method that returns the type of train (either "Train" or "DART") getTrainType() { return store.selectedTrain["TrainType"][0]; - }, + } } } @@ -130,6 +124,7 @@ export default { background-color: rgb(214, 214, 214); box-shadow: 0 0 5px 2px rgb(190, 190, 190); } + #sidebarDiv{ position: absolute; height: 80%; @@ -137,11 +132,13 @@ export default { color: rgb(0, 0, 0); padding-top: 10px; } + .headerImage{ height: 100%; width: 100%; padding: 10px; } + #imageDiv{ background-color: rgb(230, 230, 230); border-radius: 50%; @@ -157,6 +154,7 @@ export default { right:10px; z-index: 5; } + #xButton:hover{ color:red; } @@ -168,6 +166,7 @@ export default { align-self: center; padding-top: 3%; } + #originDiv{ order:0; } @@ -178,8 +177,7 @@ export default { /* Sidebar Section Divs */ - -#typeDiv, #dateDiv, #positionDiv, #directionDiv, #publicMessageDiv{ +#typeDiv, #dateDiv, #positionDiv, #directionDiv, #publicMessageDiv, #punctualityDiv{ background-color: rgb(230, 230, 230); height: 12%; position: absolute; @@ -187,7 +185,7 @@ export default { width:100%; } -#typeIcon, #dateIcon, #positionIcon, #directionIcon, #publicMessageIcon{ +#typeIcon, #dateIcon, #positionIcon, #directionIcon, #publicMessageIcon, #punctualityIcon{ background-color: rgb(214, 214, 214); width:20%; height: 100%; @@ -201,7 +199,7 @@ export default { align-items: center; } -#typeP, #dateP, #longP, #latP, #directionP, #publicMessageP{ +#typeP, #dateP, #longP, #latP, #directionP, #publicMessageP, #punctualityP{ font-size: 16px; position: relative; bottom: 2px; @@ -226,6 +224,7 @@ export default { #typeImage{ width: 70%; } + #dateImage, #positionImage, #directionImage{ padding-top: 2px; padding-bottom: 2px; @@ -241,13 +240,12 @@ export default { #dateDiv{top: 60px;} #positionDiv{top: 110px;} #directionDiv{top: 160px;} +#punctualityDiv{top: 210px;} #publicMessageDiv{ - top:210px; + top:260px; height: 40%; } - - @media screen and (max-width: 850px) { .headerImage{ height: 100%; diff --git a/src/pages/InsightsPage.vue b/src/pages/InsightsPage.vue index ad1f849..3b7d4da 100644 --- a/src/pages/InsightsPage.vue +++ b/src/pages/InsightsPage.vue @@ -45,7 +45,8 @@
- + +
@@ -62,8 +63,8 @@ - - + + @@ -73,8 +74,8 @@ - - + +
{{ train.time }} mins late {{ train.time * -1}} mins early {{ this.rawData[train.jsonIndex]["TrainType"][0] }}{{ getOrigin(this.rawData[train.jsonIndex]["PublicMessage"][0]) }}{{ getDestination(this.rawData[train.jsonIndex]["PublicMessage"][0]) }}{{ this.rawData[train.jsonIndex]["Origin"][0] }}{{ this.rawData[train.jsonIndex]["Destination"][0] }}
{{ train.time }} mins late {{ train.time * -1}} mins early {{ this.rawData[train.jsonIndex]["TrainType"][0] }}{{ getOrigin(this.rawData[train.jsonIndex]["PublicMessage"][0]) }}{{ getDestination(this.rawData[train.jsonIndex]["PublicMessage"][0]) }}{{ this.rawData[train.jsonIndex]["Origin"][0] }}{{ this.rawData[train.jsonIndex]["Destination"][0] }}
@@ -158,19 +159,6 @@ export default { this.toast() }, - getOrigin(publicMessage) { - let startOrigin = publicMessage.indexOf("-") + 1 - let endOrigin = publicMessage.indexOf("to ") - 1; - return publicMessage.substring(startOrigin, endOrigin); - }, - - getDestination(publicMessage) { - let endOrigin = publicMessage.indexOf("to "); - let startDestination = endOrigin + 3; - let endDestination = publicMessage.indexOf("(") - 1; - return publicMessage.substring(startDestination, endDestination); - }, - postTrainAndStationData() { const functions = getFunctions(app); let host = window.location.hostname diff --git a/src/pages/MapPage.vue b/src/pages/MapPage.vue index e75c1e5..59eb804 100644 --- a/src/pages/MapPage.vue +++ b/src/pages/MapPage.vue @@ -434,8 +434,7 @@ export default { if (train["TrainType"][0] == "Train") insights["numTrains"] += 1; else if (train["TrainType"][0] == "DART") insights["numDarts"] += 1; - // filter out \n in public messages - train["PublicMessage"][0] = train["PublicMessage"][0].replace(/\\n/g, ". "); + let publicMessage = train["PublicMessage"][0]; currentMessages.push(publicMessage); @@ -662,8 +661,8 @@ export default { color: black; font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif; text-align: bottom; - font-size: 18px; - height: 4.2vh; + font-size: 16.5px; + height: 4vh; } /* Phone Screen CSS */ From 1f43a935a6eb4eebfaeb503dab7277c47a2b5149 Mon Sep 17 00:00:00 2001 From: Conor McNamara Date: Mon, 27 Mar 2023 20:40:56 +0100 Subject: [PATCH 2/2] Differentiate between late and early times from cloud functions --- functions/index.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/functions/index.js b/functions/index.js index ecce8af..b60b9d8 100644 --- a/functions/index.js +++ b/functions/index.js @@ -249,7 +249,13 @@ exports.postLiveTrainData = functions.https.onRequest((request, response) => { if (trainType == "N") return let start = publicMessage.indexOf("(") + 1 let end = publicMessage.indexOf(")") - return publicMessage.substring(start, end) + + // check if the train is early + if (publicMessage[start] != "-") { + return publicMessage.substring(start, end) + } + let endOfNum = publicMessage.indexOf(" mins") + return publicMessage.substring(start+1, endOfNum) + " mins early" } // helper function to write to the database @@ -379,7 +385,13 @@ exports.scheduledPostLiveTrainData = functions.pubsub.schedule('every 1 minutes' if (trainType == "N") return let start = publicMessage.indexOf("(") + 1 let end = publicMessage.indexOf(")") - return publicMessage.substring(start, end) + + // check if the train is early + if (publicMessage[start] != "-") { + return publicMessage.substring(start, end) + } + let endOfNum = publicMessage.indexOf(" mins") + return publicMessage.substring(start+1, endOfNum) + " mins early" } // helper function to write to the database