From 9f89e3e4de93320d872272c6c8732e92deadb80f Mon Sep 17 00:00:00 2001 From: Erica Bertolozzi Date: Fri, 11 Oct 2019 16:53:01 -0400 Subject: [PATCH 01/15] github in corner --- frontend/public/githublogo.png | Bin 0 -> 10402 bytes frontend/src/components/tabBar.vue | 17 +++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 frontend/public/githublogo.png diff --git a/frontend/public/githublogo.png b/frontend/public/githublogo.png new file mode 100644 index 0000000000000000000000000000000000000000..93c6a54e5403aafc064ff589074b7fb4d71e159a GIT binary patch literal 10402 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 + @@ -72,4 +84,9 @@ li { border-top: 1px solid $primary; color: $primary; } +github-link { + position: absolute; + height: 65%; + width: 65%; +} From cc28c290cdb41f7f3cafaf3808e9d0514b7fb6b8 Mon Sep 17 00:00:00 2001 From: Joseph Om Date: Tue, 8 Oct 2019 18:34:38 -0400 Subject: [PATCH 02/15] Set up routing to /tvpanel and add vue scaffold for the tvpanel --- api/api.go | 3 +++ frontend/src/components/tvpanel.vue | 12 ++++++++++++ frontend/src/index.ts | 6 ++++++ 3 files changed, 21 insertions(+) create mode 100644 frontend/src/components/tvpanel.vue diff --git a/api/api.go b/api/api.go index 002fd5324..88fa1c53e 100644 --- a/api/api.go +++ b/api/api.go @@ -118,6 +118,9 @@ func New(cfg Config, ms shuttletracker.ModelService, msg shuttletracker.MessageS }) }) + // TV panel display + r.Get("/tvpanel", api.IndexHandler) + // Fusion r.Mount("/fusion", api.fm.router(cli.casauth)) diff --git a/frontend/src/components/tvpanel.vue b/frontend/src/components/tvpanel.vue new file mode 100644 index 000000000..3d5d39a68 --- /dev/null +++ b/frontend/src/components/tvpanel.vue @@ -0,0 +1,12 @@ + + + + + diff --git a/frontend/src/index.ts b/frontend/src/index.ts index 17c1535b7..9afa24019 100644 --- a/frontend/src/index.ts +++ b/frontend/src/index.ts @@ -5,6 +5,7 @@ import about from './components/about.vue'; import schedules from '@/components/schedules.vue'; import settings from '@/components/settings.vue'; import etas from '@/components/etas.vue'; +import tvpanel from '@/components/tvpanel.vue'; import Resources from '@/resources'; Vue.use(Router); @@ -38,5 +39,10 @@ export default new Router({ name: 'settings', component: settings, }, + { + path: '/tvpanel', + name: 'tvpanel', + component: tvpanel, + }, ], }); From 48553f86dabcd2acdba92b86a2ac2d9c0999123e Mon Sep 17 00:00:00 2001 From: Joseph Om Date: Tue, 8 Oct 2019 18:41:43 -0400 Subject: [PATCH 03/15] Add TV Panel Wireframe to the assets folder --- .../tvpanel/assets/TV Panel Wireframe.png | Bin 0 -> 84894 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 frontend/src/components/tvpanel/assets/TV Panel Wireframe.png diff --git a/frontend/src/components/tvpanel/assets/TV Panel Wireframe.png b/frontend/src/components/tvpanel/assets/TV Panel Wireframe.png new file mode 100644 index 0000000000000000000000000000000000000000..66b21421e8e6ad5a2c0c2510e042e33480746a4e GIT binary patch literal 84894 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 Date: Tue, 8 Oct 2019 21:38:39 -0400 Subject: [PATCH 04/15] Only display the TabBar in the Public.vue component --- frontend/src/App.vue | 5 ----- frontend/src/components/Public.vue | 3 +++ 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 1d0df1586..563a8e518 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -5,23 +5,18 @@ - + diff --git a/frontend/src/components/tvpanel/Map.vue b/frontend/src/components/tvpanel/Map.vue new file mode 100644 index 000000000..515a41c6f --- /dev/null +++ b/frontend/src/components/tvpanel/Map.vue @@ -0,0 +1,259 @@ + + + + + From d006f30fd5f53eb0a7ac36d2ae1276587de47b5c Mon Sep 17 00:00:00 2001 From: Joseph Om Date: Tue, 8 Oct 2019 22:27:25 -0400 Subject: [PATCH 06/15] Add admin message functionality for the Map component --- frontend/src/components/tvpanel.vue | 1 + frontend/src/components/tvpanel/Map.vue | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/frontend/src/components/tvpanel.vue b/frontend/src/components/tvpanel.vue index b7515ac2f..382142310 100644 --- a/frontend/src/components/tvpanel.vue +++ b/frontend/src/components/tvpanel.vue @@ -9,6 +9,7 @@ import Vue from 'vue'; import Map from './tvpanel/Map.vue'; import Fusion from '@/fusion'; +import messagebox from './adminmessage.vue'; export default Vue.extend({ name: 'tvpanel', data() { diff --git a/frontend/src/components/tvpanel/Map.vue b/frontend/src/components/tvpanel/Map.vue index 515a41c6f..f86747a16 100644 --- a/frontend/src/components/tvpanel/Map.vue +++ b/frontend/src/components/tvpanel/Map.vue @@ -1,12 +1,16 @@ From 92d004232e61b0dfad200aa0c26bae0a7dae7873 Mon Sep 17 00:00:00 2001 From: Joseph Om Date: Tue, 8 Oct 2019 23:31:56 -0400 Subject: [PATCH 07/15] CSS adjustments for Map and add Header Component for Map --- frontend/src/components/tvpanel.vue | 11 ++-- frontend/src/components/tvpanel/Header.vue | 65 ++++++++++++++++++++++ frontend/src/components/tvpanel/Map.vue | 9 ++- 3 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 frontend/src/components/tvpanel/Header.vue diff --git a/frontend/src/components/tvpanel.vue b/frontend/src/components/tvpanel.vue index 382142310..21a6d1cb1 100644 --- a/frontend/src/components/tvpanel.vue +++ b/frontend/src/components/tvpanel.vue @@ -1,13 +1,14 @@ @@ -34,9 +36,4 @@ mounted() { height: 100%; } -.map { - position: relative; - height: 100%; - width: 70%; -} diff --git a/frontend/src/components/tvpanel/Header.vue b/frontend/src/components/tvpanel/Header.vue new file mode 100644 index 000000000..7a0067296 --- /dev/null +++ b/frontend/src/components/tvpanel/Header.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/frontend/src/components/tvpanel/Map.vue b/frontend/src/components/tvpanel/Map.vue index f86747a16..f30c04da3 100644 --- a/frontend/src/components/tvpanel/Map.vue +++ b/frontend/src/components/tvpanel/Map.vue @@ -8,7 +8,8 @@ diff --git a/frontend/src/components/tvpanel/ETAs.vue b/frontend/src/components/tvpanel/ETAs.vue new file mode 100644 index 000000000..f0721f882 --- /dev/null +++ b/frontend/src/components/tvpanel/ETAs.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/frontend/src/components/tvpanel/News.vue b/frontend/src/components/tvpanel/News.vue new file mode 100644 index 000000000..0513b51ed --- /dev/null +++ b/frontend/src/components/tvpanel/News.vue @@ -0,0 +1,33 @@ + + + + + From afd8fb754bb3f80c52f4c89c4b9b515363f81320 Mon Sep 17 00:00:00 2001 From: Zach Love Date: Fri, 18 Oct 2019 16:57:27 -0400 Subject: [PATCH 10/15] Placeholders for ETA and News data - Added placeholders and styling for ETAs and news articles. --- frontend/src/components/tvpanel/ETAs.vue | 11 +++++++++++ frontend/src/components/tvpanel/News.vue | 16 +++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/tvpanel/ETAs.vue b/frontend/src/components/tvpanel/ETAs.vue index f0721f882..7635e0dce 100644 --- a/frontend/src/components/tvpanel/ETAs.vue +++ b/frontend/src/components/tvpanel/ETAs.vue @@ -1,6 +1,11 @@ @@ -28,5 +33,11 @@ export default Vue.extend({ display: inline-block; border-bottom: 2px solid #4c4c4c; } + li { + border: 1px solid rgb(228, 228, 228); + border-radius: 3px; + margin: 10px; + padding: 10px; +} diff --git a/frontend/src/components/tvpanel/News.vue b/frontend/src/components/tvpanel/News.vue index 0513b51ed..d8030964c 100644 --- a/frontend/src/components/tvpanel/News.vue +++ b/frontend/src/components/tvpanel/News.vue @@ -1,6 +1,11 @@ @@ -19,15 +24,24 @@ export default Vue.extend({ #news { height: 50%; width: 100%; + text-align: center; + padding: 10px; border-top: 1.5px solid #F8F8F8; } #title { - margin-top: 20px; font-size: 50px; display: inline-block; + margin-bottom: 10px; border-bottom: 2px solid #4c4c4c; } +li { + border: 1px solid rgb(228, 228, 228); + border-radius: 3px; + margin: 10px; + padding: 10px; +} + From 2d4ddac4bd3abfb7c5fe47ae0ca1ce38c88a21b5 Mon Sep 17 00:00:00 2001 From: Erica Bertolozzi Date: Sun, 3 Nov 2019 23:12:45 -0500 Subject: [PATCH 11/15] Added the styles for the text color based on which shuttle's ETA is displayed (i.e. blue for West, green for East) to match the map --- frontend/src/components/tvpanel.vue | 82 +++++++++++++++++++++++- frontend/src/components/tvpanel/ETAs.vue | 76 ++++++++++++++++++++-- 2 files changed, 149 insertions(+), 9 deletions(-) diff --git a/frontend/src/components/tvpanel.vue b/frontend/src/components/tvpanel.vue index d6d8ec600..eefbc8a40 100644 --- a/frontend/src/components/tvpanel.vue +++ b/frontend/src/components/tvpanel.vue @@ -3,7 +3,7 @@
- +
@@ -15,21 +15,97 @@ import Map from './tvpanel/Map.vue'; import Header from './tvpanel/Header.vue'; import News from './tvpanel/News.vue'; import ETAs from './tvpanel/ETAs.vue'; -import Fusion from '@/fusion'; +import Fusion from '../fusion'; import messagebox from './adminmessage.vue'; +import AdminMessageUpdate from '../structures/adminMessageUpdate'; +import UserLocationService from '../structures/userlocation.service'; +import { Stop, StopSVG } from '../structures/stop'; +import ETA from '../structures/eta'; +import Route from '../structures/route'; export default Vue.extend({ name: 'tvpanel', data() { return{ fusion: new Fusion(), + currentETAInfo: null, }as { fusion: Fusion; + currentETAInfo: {} | null, }; }, mounted() { this.fusion.start(); }, - components: { + computed: { + message(): AdminMessageUpdate { + return this.$store.state.adminMessage; + }, + busButtonActive(): boolean { + return this.$store.getters.getBusButtonVisible; + }, + shouldShowETAMessage(): boolean { + return this.$store.state.settings.etasEnabled; + }, + reconnecting(): boolean { + return this.$store.state.fusionConnected === false; + }, + }, + methods: { + updateETA() { + // find nearest stop + const pos = UserLocationService.getInstance().getCurrentLocation(); + if (pos === undefined) { + this.currentETAInfo = null; + return; + } + const c = pos.coords as Coordinates; + + let minDistance = Infinity; + let closestStop: Stop | null = null; + for (const stop of this.$store.state.Stops) { + const d = Math.hypot(c.longitude - stop.longitude, c.latitude - stop.latitude); + if (d < minDistance) { + minDistance = d; + closestStop = stop; + } + } + if (closestStop === null) { + this.currentETAInfo = null; + return; + } + + // do we have an ETA for this stop? find the next soonest + let eta: ETA | null = null; + for (const e of this.$store.state.etas) { + if (e.stopID === closestStop.id) { + // is this the soonest? + if (eta === null || e.eta < eta.eta || e.arriving) { + eta = e; + } + } + } + if (eta === null) { + this.currentETAInfo = null; + return; + } + + // get associated route + let route: Route | null = null; + for (const r of this.$store.state.Routes) { + if (r.id === eta.routeID) { + route = r; + break; + } + } + if (route === null) { + this.currentETAInfo = null; + return; + } + + this.currentETAInfo = {eta, route, stop: closestStop}; + }, + }, +components: { Map, Header, News, diff --git a/frontend/src/components/tvpanel/ETAs.vue b/frontend/src/components/tvpanel/ETAs.vue index 7635e0dce..5a116d7a2 100644 --- a/frontend/src/components/tvpanel/ETAs.vue +++ b/frontend/src/components/tvpanel/ETAs.vue @@ -1,11 +1,14 @@ @@ -15,8 +18,62 @@ import Vue from 'vue'; export default Vue.extend({ - name: 'ETAs', + props: ['etaInfo', 'show'], + computed: { + message(): string | null { + if (this.etaInfo === null) { + return null; + } + const now = new Date(); + + let newMessage = `${this.etaInfo.route.name} shuttle arriving at ${this.etaInfo.stop.name}`; + // more than 1 min 30 sec? + if (this.etaInfo.eta.eta.getTime() - now.getTime() > 1.5 * 60 * 1000 && !this.etaInfo.eta.arriving) { + newMessage += ` in ${relativeTime(now, this.etaInfo.eta.eta)}`; + } + if (newMessage.substring(newMessage.length - 1) !== '.') { + newMessage += '.'; + } + + return newMessage; + }, + }, + methods: { + changeTextColor() { + /* Change the color of the text depending on if the + display is for the East or West shuttle */ + const liElems = document.getElementsByTagName('li'); + for (let i = 0; i < liElems.length; i++) { + const etaText = liElems[i].innerHTML; + const subStr = etaText.substring(0, 4); + liElems[i].style.fontWeight = 'bold'; + if (subStr === 'West') { + liElems[i].style.color = '#0080FF'; + } + if (subStr === 'East') { + liElems[i].style.color = '#71922b'; + } + } + }, + }, + // Allow this function to be called on page load + mounted() { + this.changeTextColor(); + }, }); + +function relativeTime(from: Date, to: Date): string { + const minuteMs = 60 * 1000; + const elapsed = to.getTime() - from.getTime(); + + // cap display at thirty min + if (elapsed < minuteMs * 30) { + return `${Math.round(elapsed / minuteMs)} minutes`; + } + + return 'a while'; +} + From 26e9a6781ef4ae73c28f03dfc39d53a5974b1a6b Mon Sep 17 00:00:00 2001 From: Zach Date: Tue, 29 Oct 2019 16:11:51 -0400 Subject: [PATCH 12/15] Updated README with macOS Catalina support --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e9ca6a957..28d37be27 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ More project documentation can be found on the [Repository Wiki](https://github. 12. Run `npm install` 13. Build the frontend using `npx vue-cli-service build --mode development` - _Note: if you are working on the frontend, you may instead use `npx vue-cli-service build --mode development --watch` in another terminal to continuously watch for changes and rebuild._ + - _Note 2: if you are running the newest version of macOS and see an error involving 64-bit support, try using node version 10.16.3._ 14. Go back up to the project root directory and build Shuttle Tracker by running `go build -o shuttletracker ./cmd/shuttletracker` 15. Start the app by running `./shuttletracker` 16. Add yourself as an administrator by using `./shuttletracker admins --add RCS_ID`, replacing `RCS_ID` with your RCS ID. See the "Administrators" section below for more information. From 19cc5e10490a99f787d13bb979bdede5bf43fcce Mon Sep 17 00:00:00 2001 From: Erica Bertolozzi Date: Tue, 19 Nov 2019 16:49:31 -0500 Subject: [PATCH 13/15] axios get request --- frontend/package-lock.json | 33 +++++++++++++++++++++--- frontend/package.json | 2 ++ frontend/src/components/tvpanel/ETAs.vue | 27 ++++++++++++++++--- go.mod | 2 ++ 4 files changed, 57 insertions(+), 7 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index a7ed57a77..05e9b0942 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -4648,6 +4648,30 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, + "axios": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", + "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + }, + "dependencies": { + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + } + } + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -6481,7 +6505,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -9226,6 +9249,11 @@ } } }, + "http": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/http/-/http-0.0.0.tgz", + "integrity": "sha1-huYybSnF0Dnen6xYSkVon5KfT3I=" + }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -11130,8 +11158,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multicast-dns": { "version": "6.2.3", diff --git a/frontend/package.json b/frontend/package.json index ebac8d616..a18f4c364 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -16,8 +16,10 @@ "@types/leaflet-routing-machine": "^3.2.1", "@types/webpack-env": "^1.13.9", "ajv": "^6.5.4", + "axios": "^0.19.0", "buefy": "^0.7.2", "bulma": "^0.7.2", + "http": "0.0.0", "leaflet": "^1.3.4", "leaflet-rotatedmarker": "^0.2.0", "leaflet-routing-machine": "^3.2.12", diff --git a/frontend/src/components/tvpanel/ETAs.vue b/frontend/src/components/tvpanel/ETAs.vue index 5a116d7a2..6b4513b9b 100644 --- a/frontend/src/components/tvpanel/ETAs.vue +++ b/frontend/src/components/tvpanel/ETAs.vue @@ -5,8 +5,8 @@
  • West Shuttle - XX:XX
  • East Shuttle - XX:XX
  • -
  • West Shuttle - XX:XX
  • East Shuttle - XX:XX
  • +
  • West Shuttle - XX:XX
@@ -16,9 +16,16 @@ // This component is the ETAs component for the tv panel import Vue from 'vue'; +import ETA from '@/structures/eta'; +import axios from 'axios'; export default Vue.extend({ props: ['etaInfo', 'show'], + data() { + return { + etas: [], + }; + }, computed: { message(): string | null { if (this.etaInfo === null) { @@ -55,10 +62,22 @@ export default Vue.extend({ } } }, + retrieveEtaData() { + axios.get('https://shuttles.rpi.edu/eta', { + headers: { + 'Access-Control-Allow-Origin': '*', + 'Content-Type': 'application/json', + 'mode': 'no-cors', + }, + }) + .then((res) => console.log(res.data)); + + }, }, // Allow this function to be called on page load mounted() { this.changeTextColor(); + this.retrieveEtaData(); }, }); @@ -93,14 +112,14 @@ function relativeTime(from: Date, to: Date): string { li { border: 1px solid rgb(228, 228, 228); border-radius: 3px; + font-size: 20px; margin: 10px; padding: 10px; } // West color = #0080FF // Weekend late night color = #9b59b6 -// East inclement weather color = #ff9900 -// West inclement weather color = #FF0 -// Arch East Campus color = #DCC308 ??? This looks fake +// East inclement weather color = #ff9900 +// West inclement weather color = #FF0 // East color = #96C03A diff --git a/go.mod b/go.mod index f0a19e304..364b82ac1 100644 --- a/go.mod +++ b/go.mod @@ -22,3 +22,5 @@ require ( gopkg.in/cas.v2 v2.1.0 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect ) + +go 1.13 From 8a5f9baf6ba83124454b3cf81e2fa55d4a6a9628 Mon Sep 17 00:00:00 2001 From: Joseph Om Date: Sun, 10 Nov 2019 02:49:46 -0500 Subject: [PATCH 14/15] Add Time Display Component --- frontend/src/components/tvpanel.vue | 92 +++---------------- frontend/src/components/tvpanel/ETAs.vue | 7 +- .../src/components/tvpanel/TimeDisplay.vue | 91 ++++++++++++++++++ 3 files changed, 107 insertions(+), 83 deletions(-) create mode 100644 frontend/src/components/tvpanel/TimeDisplay.vue diff --git a/frontend/src/components/tvpanel.vue b/frontend/src/components/tvpanel.vue index eefbc8a40..417efa7f1 100644 --- a/frontend/src/components/tvpanel.vue +++ b/frontend/src/components/tvpanel.vue @@ -3,7 +3,8 @@
- + +
@@ -15,7 +16,8 @@ import Map from './tvpanel/Map.vue'; import Header from './tvpanel/Header.vue'; import News from './tvpanel/News.vue'; import ETAs from './tvpanel/ETAs.vue'; -import Fusion from '../fusion'; +import TimeDisplay from './tvpanel/TimeDisplay.vue'; +import Fusion from '@/fusion'; import messagebox from './adminmessage.vue'; import AdminMessageUpdate from '../structures/adminMessageUpdate'; import UserLocationService from '../structures/userlocation.service'; @@ -25,91 +27,21 @@ import Route from '../structures/route'; export default Vue.extend({ name: 'tvpanel', data() { - return{ - fusion: new Fusion(), - currentETAInfo: null, - }as { + return{ + fusion: new Fusion(), + } as { fusion: Fusion; - currentETAInfo: {} | null, - }; -}, -mounted() { - this.fusion.start(); -}, - computed: { - message(): AdminMessageUpdate { - return this.$store.state.adminMessage; - }, - busButtonActive(): boolean { - return this.$store.getters.getBusButtonVisible; - }, - shouldShowETAMessage(): boolean { - return this.$store.state.settings.etasEnabled; - }, - reconnecting(): boolean { - return this.$store.state.fusionConnected === false; - }, + }; }, - methods: { - updateETA() { - // find nearest stop - const pos = UserLocationService.getInstance().getCurrentLocation(); - if (pos === undefined) { - this.currentETAInfo = null; - return; - } - const c = pos.coords as Coordinates; - - let minDistance = Infinity; - let closestStop: Stop | null = null; - for (const stop of this.$store.state.Stops) { - const d = Math.hypot(c.longitude - stop.longitude, c.latitude - stop.latitude); - if (d < minDistance) { - minDistance = d; - closestStop = stop; - } - } - if (closestStop === null) { - this.currentETAInfo = null; - return; - } - - // do we have an ETA for this stop? find the next soonest - let eta: ETA | null = null; - for (const e of this.$store.state.etas) { - if (e.stopID === closestStop.id) { - // is this the soonest? - if (eta === null || e.eta < eta.eta || e.arriving) { - eta = e; - } - } - } - if (eta === null) { - this.currentETAInfo = null; - return; - } - - // get associated route - let route: Route | null = null; - for (const r of this.$store.state.Routes) { - if (r.id === eta.routeID) { - route = r; - break; - } - } - if (route === null) { - this.currentETAInfo = null; - return; - } - - this.currentETAInfo = {eta, route, stop: closestStop}; - }, + mounted() { + this.fusion.start(); }, -components: { + components: { Map, Header, News, ETAs, + TimeDisplay, }, }); diff --git a/frontend/src/components/tvpanel/ETAs.vue b/frontend/src/components/tvpanel/ETAs.vue index 6b4513b9b..cb6cef2cd 100644 --- a/frontend/src/components/tvpanel/ETAs.vue +++ b/frontend/src/components/tvpanel/ETAs.vue @@ -97,12 +97,13 @@ function relativeTime(from: Date, to: Date): string { From 8a00a6b2c25be80f31f00826eca820e68f8f00d4 Mon Sep 17 00:00:00 2001 From: Joseph Date: Wed, 4 Dec 2019 15:39:07 -0500 Subject: [PATCH 15/15] Fix TimeDisplay error --- frontend/src/components/tvpanel/TimeDisplay.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/tvpanel/TimeDisplay.vue b/frontend/src/components/tvpanel/TimeDisplay.vue index abc64d1e7..f0954b86f 100644 --- a/frontend/src/components/tvpanel/TimeDisplay.vue +++ b/frontend/src/components/tvpanel/TimeDisplay.vue @@ -19,7 +19,7 @@ export default Vue.extend({ // Function to display the Current Time displayTime() { this.today = new Date(); - const hour = this.today.getHours(); + let hour = this.today.getHours(); const minutes = this.today.getMinutes(); let am_pm; // Format Hours