diff --git a/src/lib/ldb/staff/staff-ldb.svelte b/src/lib/ldb/staff/staff-ldb.svelte index 099845b..b54ae9a 100644 --- a/src/lib/ldb/staff/staff-ldb.svelte +++ b/src/lib/ldb/staff/staff-ldb.svelte @@ -3,63 +3,93 @@ export let title = 'Loading...'; import { onMount } from 'svelte'; import AlertBar from '$lib/ldb/nrcc/alert-bar.svelte'; - //import ServiceRow from './service-row.svelte'; import StaffTrainDetail from '$lib/ldb/staff/train-detail.svelte'; - import Reason from '$lib/raw-fetchers/reason.svelte'; import Loading from '$lib/navigation/loading.svelte'; - import Nav from '$lib/navigation/nav.svelte'; import { uuid } from '$lib/stores/uuid'; - import Error from '../../../routes/+error.svelte'; import Island from '$lib/islands/island.svelte'; + import TableGenerator from './table/table-generator.svelte'; - let requestedStation; + let requestedStation = ''; $: requestedStation = station; let jsonData = {}; - let services = [], - busServices = [], - ferryServices = []; - let dataAge = null; + /** + * @type {string | any[]} + */ + let trainServices = []; + /** + * @type {string | any[]} + */ + let busServices = []; + /** + * @type {string | any[]} + */ + let ferryServices = []; + let dataAge = new Date(0); let isLoading = true; let isErr = false; - let errMsg; - let alerts = []; + let errMsg = ''; + let alerts = ['']; let detail = { show: false, rid: '', uid: '', headcode: '' }; $: { + // @ts-ignore if (jsonData?.GetBoardResult?.generatedAt) { + // @ts-ignore dataAge = new Date(jsonData.GetBoardResult.generatedAt); } + // @ts-ignore if (jsonData?.GetBoardResult?.trainServices?.service) { - services = jsonData.GetBoardResult.trainServices.service; + // @ts-ignore + trainServices = ensureArray((trainServices = jsonData.GetBoardResult.trainServices.service)); } else { - services = []; + trainServices = []; } + // @ts-ignore if (jsonData?.GetBoardResult?.busServices?.service) { - busServices = jsonData.GetBoardResult.busServices.service; + // @ts-ignore + busServices = ensureArray((busServices = jsonData.GetBoardResult.busServices.service)); } else { busServices = []; } + // @ts-ignore if (jsonData?.GetBoardResult?.ferryServices?.service) { - ferryServices = jsonData.GetBoardResult.ferryServices.service; + // @ts-ignore + ensureArray((ferryServices = jsonData.GetBoardResult.ferryServices.service)); } else { ferryServices = []; } + // @ts-ignore if (jsonData?.GetBoardResult?.locationName) { + // @ts-ignore title = jsonData.GetBoardResult.locationName; } else { title = 'Loading Board'; } + // @ts-ignore if (jsonData?.GetBoardResult?.nrccMessages) { + // @ts-ignore alerts = processNrcc(jsonData.GetBoardResult?.nrccMessages?.message); + } else { + alerts = []; } } + /** + * @param {any} item + */ + function ensureArray(item) { + if (Array.isArray(item)) { + return item; + } + return [item]; + } + async function fetchData() { isLoading = true; // Set loading state try { @@ -89,148 +119,9 @@ } } - async function generateServiceData(service) { - const timeDetails = await parseTimes(service); - let serviceData = { - from: await parseLocation(service.origin), - to: await parseLocation(service.destination), - length: await getTrainLength(service), - platform: await parsePlatform(service?.platform || 'undefined'), - platformHidden: service?.platformIsHidden === 'true', - schArr: timeDetails.schArr, - expArr: timeDetails.expArr, - schDep: timeDetails.schDep, - expDep: timeDetails.expDep, - isEarlyArr: timeDetails.earArr, - isLateArr: timeDetails.delArr, - isEarlyDep: timeDetails.earDep, - isLateDep: timeDetails.delDep, - isCancelledDep: false, - isCancelled: Boolean(service?.isCancelled), - canArr: timeDetails.canArr, - canDep: timeDetails.canDep, - isDelayed: service?.arrivalType === 'Delayed', - isArrDelayed: service?.arrivalType === 'Delayed', - isDepDelayed: service?.departureType === 'Delayed', - isNonPublic: service?.isPassengerService === 'false' ? true : false - }; - return serviceData; - } - - async function getTrainLength(service) { - if (service?.length) { - return parseInt(service?.length); - } else if (service?.formation?.coaches) { - return service.formation.coaches.coach.length; - } - return null; - } - - async function parseLocation(location) { - if (!Array.isArray(location.location)) { - return location.location?.tiploc; - } - let locations = []; - for (const singleLocation of location?.location) { - locations.push(singleLocation?.tiploc); - } - return locations.join(' & '); - } - - async function parsePlatform(platform) { - if (!platform) { - return '-'; - } - if (platform === 'TBC' || platform == 'undefined') { - return '-'; - } - return { - number: platform - }; - } - - function parseTimes(service) { - let schArr = new Date(service?.sta); - let expArr = new Date(service?.eta || service?.ata); - let schDep = new Date(service?.std); - let expDep = new Date(service?.etd || service?.atd); - let isEarlyArr = false, - isDelayedArr = false, - isArr = false, - canArr = false; - let isEarlyDep = false, - isDelayedDep = false, - isDep = false, - canDep = false; - const timeDifferenceThreshold = 60 * 1000; // 60 seconds in milliseconds - if (expArr - schArr < -timeDifferenceThreshold) { - isEarlyArr = true; - isArr = true; - } else if (expArr - schArr > timeDifferenceThreshold) { - isDelayedArr = true; - isArr = true; - } - - if (expDep - schDep < -timeDifferenceThreshold) { - isEarlyDep = true; - isDep = true; - } else if (expDep - schDep > timeDifferenceThreshold) { - isDelayedDep = true; - isDep = true; - } - let parsedExpArr; - if (expArr instanceof Date && !isNaN(expArr)) { - if (!isEarlyArr && !isDelayedArr) { - parsedExpArr = 'RT'; - } else { - parsedExpArr = parseIndividualTime(expArr); - } - } else if (service.isCancelled === 'true') { - parsedExpArr = 'CANC'; - canArr = true; - } else { - parsedExpArr = '-'; - } - - let parsedExpDep; - if (expDep instanceof Date && !isNaN(expDep)) { - if (!isEarlyDep && !isDelayedDep) { - parsedExpDep = 'RT'; - } else { - parsedExpDep = parseIndividualTime(expDep); - } - } else if (service.isCancelled === 'true') { - parsedExpDep = 'CANC'; - canDep = true; - } else { - parsedExpDep = '-'; - } - return { - schArr: parseIndividualTime(schArr), - expArr: parsedExpArr, - schDep: parseIndividualTime(schDep), - expDep: parsedExpDep, - earArr: isEarlyArr, - delArr: isDelayedArr, - earDep: isEarlyDep, - delDep: isDelayedDep, - canArr: canArr, - canDep: canDep - }; - } - - function parseIndividualTime(input) { - const dt = new Date(input); - const output = dt.toLocaleTimeString([], { - hour: '2-digit', - minute: '2-digit' - }); - if (output !== 'Invalid Date') { - return output; - } - return '-'; - } - + /** + * @param {any} messages + */ function processNrcc(messages) { // Remove newlines and then

tags from input and append to array let arrMessages; @@ -247,7 +138,7 @@ return processedMessages; } - async function showDetails(rid, uid, tid) { + function showDetail(rid='', uid='', tid='') { detail = { rid: rid, uid: uid, @@ -286,339 +177,45 @@ {#if alerts.length} {/if} - - - - - - - - - - - - - - - - - {#if !services.length} - - {:else} - {#each services as service} - {#await generateServiceData(service)} - - - - {:then serviceStats} - - - - - - - - - - - - - - {:catch} - - - - {/await} - {/each} - {/if} -
Updated: {dataAge.toLocaleTimeString()} - Staff Boards under development
- ArrivalDeparture
IDFromToPlatSchExpSchExp
No Scheduled Train Services
Loading...
{service.trainid}{serviceStats.from}{serviceStats.to}{serviceStats.platform.number || '-'}{serviceStats.schArr}{serviceStats.isArrDelayed ? 'LATE' : serviceStats.expArr}{serviceStats.schDep}{serviceStats.isDepDelayed ? 'LATE' : serviceStats.expDep}
- {service.operator} - {#if serviceStats.length} | {serviceStats.length} carriages{/if} -
- {#if service.cancelReason} - -
- {/if} - {#if service?.delayReason && !service.isCancelled} - - {/if} -
Unable to load service
- {#if busServices.length} -
- Bus services
- - - - - - - - - - - - - - - - {#each busServices as service} - {#await generateServiceData(service)} - - - - {:then serviceStats} - - - - - - - - - - - - - - {:catch} - - - - {/await} - {/each} -
- ArrivalDeparture
IDFromToPlatSchExpSchExp
Loading...
{service.trainid}{serviceStats.from}{serviceStats.to}{serviceStats.platform.number || '-'}{serviceStats.schArr}{serviceStats.isArrDelayed ? 'LATE' : serviceStats.expArr}{serviceStats.schDep}{serviceStats.isDepDelayed ? 'LATE' : serviceStats.expDep}
- {service.operator} - {#if serviceStats.length} | {serviceStats.length} carriages{/if} -
- {#if service.cancelReason} - - {/if} - {#if service?.delayReason && !service.isCancelled} - - {/if} -
Unable to load service
+

Data from: {dataAge.toLocaleString([])}

+ {#if trainServices && trainServices.length} + + {:else} +

There are no scheduled train services in the next two hours

{/if} - {#if ferryServices.length} -
- Bus services
- - - - - - - - - - - - - - - - {#each ferryServices as service} - {#await generateServiceData(service)} - - - - {:then serviceStats} - - - - - - - - - - - - - - {:catch} - - - - {/await} - {/each} -
- ArrivalDeparture
IDFromToPlatSchExpSchExp
Loading...
{service.trainid}{serviceStats.from}{serviceStats.to}{serviceStats.platform.number || '-'}{serviceStats.schArr}{serviceStats.isArrDelayed ? 'LATE' : serviceStats.expArr}{serviceStats.schDep}{serviceStats.isDepDelayed ? 'LATE' : serviceStats.expDep}
- {service.operator} - {#if serviceStats.length} | {serviceStats.length} carriages{/if} -
- {#if service.cancelReason} - - {/if} - {#if service?.delayReason && !service.isCancelled} - - {/if} -
Unable to load service
+ {#if busServices && busServices.length} + + +
+ Bus Services + + {/if} + {#if ferryServices && ferryServices.length} + +
+ Ferry Services + {/if} {/if} -