From 0e381fd51302ec2d1914bbdd8c6ab88c40e44bcb Mon Sep 17 00:00:00 2001 From: Devin Matte Date: Sun, 18 Jun 2023 20:31:17 -0400 Subject: [PATCH 01/12] Using replace instead of push to fix back nav (#685) --- common/utils/router.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/utils/router.tsx b/common/utils/router.tsx index 605a2fbf1..83e41e4ba 100644 --- a/common/utils/router.tsx +++ b/common/utils/router.tsx @@ -120,7 +120,7 @@ export const useUpdateQuery = () => { if (!isEqual(router.query, newQuery)) { const query = pickBy(newQuery, (attr) => attr !== undefined); - router.push({ pathname: router.pathname, query }, undefined, { shallow: true }); + router.replace({ pathname: router.pathname, query }, undefined, { shallow: true }); } }, [router] From 0848c2ee7a06fcf22db858033f037fb438fc3347 Mon Sep 17 00:00:00 2001 From: Patrick Cleary Date: Thu, 22 Jun 2023 13:17:41 -0400 Subject: [PATCH 02/12] V4/svg header bug (#689) * Fix disappearing heeader * lint --- .../controls/MobileControlPanel.tsx | 2 +- modules/navigation/DesktopSideNavBar.tsx | 4 +- modules/navigation/MobileNavHeader.tsx | 62 +++++++----------- public/TMLogo.png | Bin 0 -> 36132 bytes 4 files changed, 28 insertions(+), 40 deletions(-) create mode 100644 public/TMLogo.png diff --git a/common/components/controls/MobileControlPanel.tsx b/common/components/controls/MobileControlPanel.tsx index 343fafc56..080bc18a9 100644 --- a/common/components/controls/MobileControlPanel.tsx +++ b/common/components/controls/MobileControlPanel.tsx @@ -55,7 +55,7 @@ export const MobileControlPanel: React.FC = ({ return (
diff --git a/modules/navigation/DesktopSideNavBar.tsx b/modules/navigation/DesktopSideNavBar.tsx index 362f64397..93e7f374d 100644 --- a/modules/navigation/DesktopSideNavBar.tsx +++ b/modules/navigation/DesktopSideNavBar.tsx @@ -1,7 +1,7 @@ import React from 'react'; import Link from 'next/link'; -import TmLogoSvg from '../../public/tm-logo-big.svg'; +import Image from 'next/image'; import { DonateButton } from '../../common/components/buttons/DonateButton'; import { SideNavigation } from './SideNavigation'; @@ -11,7 +11,7 @@ export const SideNavBar = () => {
- + TransitMatters Logo
diff --git a/modules/navigation/MobileNavHeader.tsx b/modules/navigation/MobileNavHeader.tsx index 4a6ba766b..f0a591906 100644 --- a/modules/navigation/MobileNavHeader.tsx +++ b/modules/navigation/MobileNavHeader.tsx @@ -1,9 +1,9 @@ import React, { Fragment, useState } from 'react'; -import { Dialog, Transition } from '@headlessui/react'; +import { Transition } from '@headlessui/react'; import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline'; import Link from 'next/link'; -import TmLogoSvg from '../../public/tm-logo-big.svg'; +import Image from 'next/image'; import { DonateButton } from '../../common/components/buttons/DonateButton'; import { SideNavigation } from './SideNavigation'; @@ -14,28 +14,10 @@ export const MobileNavHeader = () => { <>
- +
- -
- setSidebarOpen(false)} - > - - - - -
+
@@ -75,25 +57,31 @@ export const MobileNavHeader = () => {

- -
+
+
-
-
- - - +
+ setSidebarOpen(false)} + > + TransitMatters Logo + - -
+ )} +
diff --git a/public/TMLogo.png b/public/TMLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..877fee6ed623f36f0ad9bf2d2329164c3700f3f8 GIT binary patch literal 36132 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

X|0*E2PaM)v3MDF?Cs3|%mAa;l3uPo691 z_btzvEGha)mEDtJ_2t`ME92&a=Grd6m*^CIAV=LeZ)vChLr&@E=ZWve-h_HzLO?qJ zoHJ0C_YZfp7{rO?;0-y_FRCcfIYQAc0%y*6?;+my(P16C9HWDW1#qe#B4>hwgp)(FO5y zL>?^F=koRhfvU`9d(wTkqg(l~v-YxqM13ubckifryXTjgm(2X55>3u2MIxvm*Jv}! zI|^9nG3IF||J*xHI<{%eQ%3&dOA4TbKq_~!V*Qt$s?SE|lVjTdZLX6YAN&f;9q&HH z0sefg%`u%gghsrbeoa1=VS3KVJmqr|7&8ia0Wi?3;)${(A=nM;lXq)a84^#{mcJI* zULU;Hx6$Yfy70mPfG=%!!))3B1l9B|EoFp8Mt%G+`EXtYT+BegLa!WkGXl>!L^|o|kP;*2#Nlht)kMI|iEywPsodpeTO0`n z2?JVSB{10r861a*ME#}6U2syXL_ft6C`%C2BwN{cP}K=yzJ%bz(1vr!h$coPt7bY~ za4r}ER=UXvQ^rfu1aN#0hOPVNZV%a@R9y&iKWdt(nhLiP1#qMYAEk-%9dYbR@jE5w*B_%Y%FzfIV!J@5`4p6e?uLnXDkvB!&Bq&=)}x*dOGc zsRMEuu5*dP^LYxQ2r#1O1KE=^O`-WCBpB9SajRrKg^8v|r_Vn&^u!T$+UeaUH#Md6 zP1Ebuz|h%@@N}Egwz+mGWE3tz^&O*PTBm^m%~{$fY*m8fs}g_C)ss5dqW5<1;|%)d zNK)%RrD4bEAPnPTV09wAuk_tB!vYg;N)GPc-Pc)#xX~`aS~@?E6|o5xd+zlkX>8_p zpBBQmKx#HiC}?KVNEl=gIIn;b8R#RMWmKA$u2tn_{jmb^15fwWo0_5o@i&@tE7;c= z*<1@F%f_!dw&bm{Z`zO8G%bt0=Tl&SUhtZeP?X|l&v_%t0D@yTVaf|H>wedkU0u@| zHPvU0o{oRES{5-hdalTYTm^`yQMC9(iV}3n^CSNF&wM5K`nFWjhmorJ#lXo=nP)VO zV)u}8(x7h7jI>9+1P?x>F%#F0Xu+%*gHMTGH<&CwW8Tn?@*67p9EY!$^Ju%)f>LS6!BpJ-IZqkR zwm|E`^+S{8Jn(H$v8SG)+UG6j@yAop4&!poLjM>Ts)`OTXF9$;_;PGph1HGV0Kre_ zfK_of>C3-Mhiw@u9p>{rT58W=4BEQ3`Ys|tq23=;)�_`6^z0$KTWE5#vnOZ5r_x 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 z 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 Q!v7qluBTS2a_`aq1AMDU(*OVf literal 0 HcmV?d00001 From 11ad7d12423d783ab9ffd23b19a6a2779fc03365 Mon Sep 17 00:00:00 2001 From: Seth Kaplan Date: Sat, 24 Jun 2023 11:47:47 -0400 Subject: [PATCH 03/12] Add date on widget for single day trips (#699) --- modules/dashboard/WidgetTitle.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/dashboard/WidgetTitle.tsx b/modules/dashboard/WidgetTitle.tsx index 8b6a62b7d..d77de2e12 100644 --- a/modules/dashboard/WidgetTitle.tsx +++ b/modules/dashboard/WidgetTitle.tsx @@ -25,7 +25,7 @@ export const WidgetTitle: React.FC = ({ const isMobile = !useBreakpoint('md'); const { query } = useDelimitatedRoute(); const date = getSelectedDates({ - startDate: query.startDate, + startDate: query.startDate ? query.startDate : query.date, endDate: query.endDate, view: query.view, }); From 9d5d0b5682c62f0db2f20fd82e17516d599d9c0c Mon Sep 17 00:00:00 2001 From: Preston Mueller Date: Sat, 24 Jun 2023 14:34:14 -0400 Subject: [PATCH 04/12] Sentence case text (#692) --- common/constants/dates.ts | 8 ++++---- common/constants/pages.ts | 10 +++++----- modules/dashboard/Today.tsx | 2 +- modules/landing/LineSelectionLanding.tsx | 2 +- modules/navigation/DesktopSideNavBar.tsx | 6 +++--- modules/ridership/RidershipDetails.tsx | 2 +- modules/ridership/RidershipGraph.tsx | 2 +- modules/ridership/RidershipWidget.tsx | 2 +- modules/service/ServiceGraph.tsx | 2 +- modules/slowzones/SlowZonesDetails.tsx | 2 +- modules/slowzones/SlowZonesWidget.tsx | 2 +- modules/slowzones/SystemSlowZonesDetails.tsx | 2 +- modules/speed/SpeedGraph.tsx | 2 +- modules/traveltimes/TravelTimesDetails.tsx | 8 ++++---- modules/tripexplorer/BusTripGraphs.tsx | 6 +++--- modules/tripexplorer/SubwayTripGraphs.tsx | 8 ++++---- 16 files changed, 33 insertions(+), 33 deletions(-) diff --git a/common/constants/dates.ts b/common/constants/dates.ts index c8e68ccbb..86b3e27ca 100644 --- a/common/constants/dates.ts +++ b/common/constants/dates.ts @@ -209,10 +209,10 @@ export const OVERVIEW_OPTIONS: { export type OverviewDatePresetKey = keyof typeof OverviewRangeTypes; export enum OverviewRangeTypes { - 'week' = 'Past Week', - 'month' = 'Past Month', - 'year' = 'Past Year', - 'all' = 'All Time', + 'week' = 'Past week', + 'month' = 'Past month', + 'year' = 'Past year', + 'all' = 'All time', } export const RANGE_DATE_KEYS = Object.fromEntries( diff --git a/common/constants/pages.ts b/common/constants/pages.ts index c21fa7eb6..2b61b8280 100644 --- a/common/constants/pages.ts +++ b/common/constants/pages.ts @@ -83,8 +83,8 @@ export const ALL_PAGES: PageMap = { multiTrips: { key: 'multiTrips', path: '/trips/multi', - name: 'Multi Day Trips', - title: 'Multi Day Trips', + name: 'Multi-day trips', + title: 'Multi-day trips', lines: ['line-red', 'line-blue', 'line-green', 'line-orange', 'line-bus'], icon: faCalendar, dateStoreSection: 'multiTrips', @@ -93,7 +93,7 @@ export const ALL_PAGES: PageMap = { overview: { key: 'overview', path: '/', - name: 'Line Overview', + name: 'Line overview', lines: ['line-red', 'line-blue', 'line-green', 'line-orange'], dateStoreSection: 'overview', icon: faTableColumns, @@ -121,7 +121,7 @@ export const ALL_PAGES: PageMap = { slowzones: { key: 'slowzones', path: '/slowzones', - name: 'Slow Zones', + name: 'Slow zones', lines: ['line-red', 'line-blue', 'line-orange'], icon: faWarning, dateStoreSection: 'line', @@ -131,7 +131,7 @@ export const ALL_PAGES: PageMap = { systemSlowzones: { key: 'systemSlowzones', path: '/slowzones', - name: 'Slow Zones', + name: 'Slow zones', lines: [], icon: faWarning, dateStoreSection: 'system', diff --git a/modules/dashboard/Today.tsx b/modules/dashboard/Today.tsx index 20a5334e2..e04efd674 100644 --- a/modules/dashboard/Today.tsx +++ b/modules/dashboard/Today.tsx @@ -25,7 +25,7 @@ export const Today: React.FC = ({ lineShort }) => {

{canShowSlowZonesMap && allSlow.data && speedRestrictions.data && ( - + { return (

Ready to learn more?

-

Select a Line or Bus to get more details.

+

Select a subway line or bus route to get started.

diff --git a/modules/navigation/DesktopSideNavBar.tsx b/modules/navigation/DesktopSideNavBar.tsx index 93e7f374d..277b43d7e 100644 --- a/modules/navigation/DesktopSideNavBar.tsx +++ b/modules/navigation/DesktopSideNavBar.tsx @@ -26,7 +26,7 @@ export const SideNavBar = () => { About - Join Us + Join us { href="https://github.com/transitmatters/t-performance-dash" className="text-white hover:text-blue-500" > - Source Code + Source code {' '} /{' '} - Attributions + attributions

diff --git a/modules/ridership/RidershipDetails.tsx b/modules/ridership/RidershipDetails.tsx index d61aeb1b6..735ff769b 100644 --- a/modules/ridership/RidershipDetails.tsx +++ b/modules/ridership/RidershipDetails.tsx @@ -33,7 +33,7 @@ export function RidershipDetails() { return ( - + {ridership.data && ridershipDataReady ? ( = ({ }, title: { display: true, - text: 'trips', + text: 'Trips', color: COLORS.design.subtitleGrey, }, }, diff --git a/modules/ridership/RidershipWidget.tsx b/modules/ridership/RidershipWidget.tsx index 2bf2983ec..66e2bc322 100644 --- a/modules/ridership/RidershipWidget.tsx +++ b/modules/ridership/RidershipWidget.tsx @@ -27,7 +27,7 @@ export const RidershipWidget: React.FC = () => { return ( - + {ridership.data && serviceReady ? ( = ({ }, title: { display: true, - text: 'trips', + text: 'Trips', color: COLORS.design.subtitleGrey, }, }, diff --git a/modules/slowzones/SlowZonesDetails.tsx b/modules/slowzones/SlowZonesDetails.tsx index a7e7b725d..56b2aece7 100644 --- a/modules/slowzones/SlowZonesDetails.tsx +++ b/modules/slowzones/SlowZonesDetails.tsx @@ -51,7 +51,7 @@ export function SlowZonesDetails() { } return ( - +
diff --git a/modules/slowzones/SlowZonesWidget.tsx b/modules/slowzones/SlowZonesWidget.tsx index ea77a0877..7e3f8841f 100644 --- a/modules/slowzones/SlowZonesWidget.tsx +++ b/modules/slowzones/SlowZonesWidget.tsx @@ -27,7 +27,7 @@ export const SlowZonesWidget: React.FC = () => { return ( <> - + {totalSlowTimeReady ? ( +
diff --git a/modules/speed/SpeedGraph.tsx b/modules/speed/SpeedGraph.tsx index 8aa76b6e1..c0744dedc 100644 --- a/modules/speed/SpeedGraph.tsx +++ b/modules/speed/SpeedGraph.tsx @@ -103,7 +103,7 @@ export const SpeedGraph: React.FC = ({ }, title: { display: true, - text: 'mph', + text: 'Miles per hour (mph)', color: COLORS.design.subtitleGrey, }, }, diff --git a/modules/traveltimes/TravelTimesDetails.tsx b/modules/traveltimes/TravelTimesDetails.tsx index c7193d3ae..bf25768c1 100644 --- a/modules/traveltimes/TravelTimesDetails.tsx +++ b/modules/traveltimes/TravelTimesDetails.tsx @@ -55,9 +55,9 @@ export function TravelTimesDetails() { const [peakTime, setPeakTime] = React.useState<'weekday' | 'weekend'>('weekday'); return ( - + - + {aggregate ? ( {aggregate && ( - + = ({ {aggregate ? ( <> - + = ({ ) : ( <> - + = ({ diff --git a/modules/tripexplorer/SubwayTripGraphs.tsx b/modules/tripexplorer/SubwayTripGraphs.tsx index 825e4346d..b388f62f8 100644 --- a/modules/tripexplorer/SubwayTripGraphs.tsx +++ b/modules/tripexplorer/SubwayTripGraphs.tsx @@ -48,7 +48,7 @@ export const SubwayTripGraphs: React.FC = ({ {aggregate ? ( <> - + = ({ /> - + = ({ pressFunction={setPeakTime} options={[ ['weekday', 'Weekday'], - ['weekend', 'Weekend/Holiday'], + ['weekend', 'Weekend/holiday'], ]} additionalDivClass="md:w-auto" additionalButtonClass="md:w-fit" @@ -108,7 +108,7 @@ export const SubwayTripGraphs: React.FC = ({ ) : ( <> - + Date: Sat, 24 Jun 2023 14:44:51 -0400 Subject: [PATCH 05/12] [v4] hide secrets in healthcheck output (#698) --- server/app.py | 5 ++++- server/chalicelib/secrets.py | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/server/app.py b/server/app.py index c89703bbe..43ac725df 100644 --- a/server/app.py +++ b/server/app.py @@ -66,7 +66,10 @@ def healthcheck(): if not check_bool: failed_checks[check] = "Check failed :(" except Exception as e: - failed_checks[check] = f"Check threw an exception: {e}" + e_str = str(e) + for secret in secrets.HEALTHCHECK_HIDE_SECRETS: + e_str.replace(secret, "HIDDEN") + failed_checks[check] = f"Check threw an exception: {e_str}" if len(failed_checks) == 0: return Response(body={"status": "pass"}, status_code=200) diff --git a/server/chalicelib/secrets.py b/server/chalicelib/secrets.py index db5ddc3c2..b42b3e3e7 100644 --- a/server/chalicelib/secrets.py +++ b/server/chalicelib/secrets.py @@ -2,3 +2,8 @@ MBTA_V2_API_KEY = os.environ.get("MBTA_V2_API_KEY", "") MBTA_V3_API_KEY = os.environ.get("MBTA_V3_API_KEY", "") + +HEALTHCHECK_HIDE_SECRETS = [ + MBTA_V2_API_KEY, + MBTA_V3_API_KEY +] From f7edb86f4c4fbf7744e382471eedd2ba17d2cb39 Mon Sep 17 00:00:00 2001 From: Preston Mueller Date: Sun, 25 Jun 2023 11:23:24 -0400 Subject: [PATCH 06/12] Forgot a few case adjustments (#703) --- modules/service/ServiceDetails.tsx | 4 ++-- modules/slowzones/SlowZonesDetails.tsx | 4 ++-- modules/slowzones/SystemSlowZonesDetails.tsx | 2 +- modules/slowzones/charts/TotalSlowTime.tsx | 2 +- modules/speed/SpeedDetailsWrapper.tsx | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/service/ServiceDetails.tsx b/modules/service/ServiceDetails.tsx index c3ca505e2..042619d0c 100644 --- a/modules/service/ServiceDetails.tsx +++ b/modules/service/ServiceDetails.tsx @@ -56,7 +56,7 @@ export function ServiceDetails() {
- + {serviceDataReady ? ( - + {serviceDataReady ? (
- +
{totalSlowTimeReady ? ( - +
{allSlow.data && speedRestrictions.data && canShowSlowZonesMap ? (
- +
{totalSlowTimeReady ? (
diff --git a/modules/slowzones/charts/TotalSlowTime.tsx b/modules/slowzones/charts/TotalSlowTime.tsx index 64fe326cc..9dece13de 100644 --- a/modules/slowzones/charts/TotalSlowTime.tsx +++ b/modules/slowzones/charts/TotalSlowTime.tsx @@ -160,7 +160,7 @@ export const TotalSlowTime: React.FC = ({ { id: 'customTitle', afterDraw: (chart) => { - if (showTitle) drawSimpleTitle(`Total Slow Time`, chart); + if (showTitle) drawSimpleTitle(`Total slow time`, chart); }, }, ChartjsPluginWatermark, diff --git a/modules/speed/SpeedDetailsWrapper.tsx b/modules/speed/SpeedDetailsWrapper.tsx index 7ddf4ebed..882369fb8 100644 --- a/modules/speed/SpeedDetailsWrapper.tsx +++ b/modules/speed/SpeedDetailsWrapper.tsx @@ -24,7 +24,7 @@ export const SpeedDetailsWrapper: React.FC = ({ return ( <> - + Date: Sun, 25 Jun 2023 11:38:54 -0400 Subject: [PATCH 07/12] fix point colors and consolidate radii (#701) --- modules/landing/utils.ts | 3 +-- modules/ridership/RidershipGraph.tsx | 5 ++--- modules/service/PercentageServiceGraph.tsx | 5 ++--- modules/service/ServiceGraph.tsx | 9 +++++---- modules/speed/SpeedGraph.tsx | 5 ++--- 5 files changed, 12 insertions(+), 15 deletions(-) diff --git a/modules/landing/utils.ts b/modules/landing/utils.ts index 62aaf265b..455cd14c1 100644 --- a/modules/landing/utils.ts +++ b/modules/landing/utils.ts @@ -11,10 +11,9 @@ const getDatasetOptions = (line: Line) => { return { borderColor: LINE_COLORS[line ?? 'default'], borderWidth: 6, - pointBackgroundColor: 'transparent', pointBorderWidth: 0, tension: 0.5, - pointHoverRadius: 8, + pointHoverRadius: 6, spanGaps: false, pointHoverBackgroundColor: LINE_COLORS[line ?? 'default'], }; diff --git a/modules/ridership/RidershipGraph.tsx b/modules/ridership/RidershipGraph.tsx index aa6122bc1..8c26ba008 100644 --- a/modules/ridership/RidershipGraph.tsx +++ b/modules/ridership/RidershipGraph.tsx @@ -61,11 +61,10 @@ export const RidershipGraph: React.FC = ({ label: `Riders`, borderColor: lineColor, backgroundColor: hexWithAlpha(lineColor, 0.8), - pointRadius: 8, - pointBackgroundColor: 'transparent', + pointRadius: 0, pointBorderWidth: 0, fill: true, - pointHoverRadius: 3, + pointHoverRadius: 6, pointHoverBackgroundColor: lineColor, data: data.map((datapoint) => datapoint.count), }, diff --git a/modules/service/PercentageServiceGraph.tsx b/modules/service/PercentageServiceGraph.tsx index 7f73e8011..e6643a84b 100644 --- a/modules/service/PercentageServiceGraph.tsx +++ b/modules/service/PercentageServiceGraph.tsx @@ -61,12 +61,11 @@ export const PercentageServiceGraph: React.FC = ({ { label: `% of ${comparison}`, borderColor: lineColor, - pointRadius: 8, - pointBackgroundColor: 'transparent', + pointRadius: 0, + pointHoverRadius: 6, pointBorderWidth: 0, stepped: true, fill: true, - pointHoverRadius: 3, pointHoverBackgroundColor: lineColor, backgroundColor: hexWithAlpha(lineColor, 0.8), data: compareToScheduled ? calculatedData.scheduled : calculatedData.baseline, diff --git a/modules/service/ServiceGraph.tsx b/modules/service/ServiceGraph.tsx index 7d03c4a11..1da913102 100644 --- a/modules/service/ServiceGraph.tsx +++ b/modules/service/ServiceGraph.tsx @@ -61,12 +61,11 @@ export const ServiceGraph: React.FC = ({ label: `Actual trips`, borderColor: lineColor, backgroundColor: hexWithAlpha(lineColor, 0.8), - pointRadius: 8, - pointBackgroundColor: 'transparent', + pointRadius: 0, pointBorderWidth: 0, stepped: true, fill: true, - pointHoverRadius: 3, + pointHoverRadius: 6, pointHoverBackgroundColor: lineColor, data: data.map((datapoint) => datapoint.value ? datapoint.count / 2 : Number.NaN @@ -76,8 +75,10 @@ export const ServiceGraph: React.FC = ({ label: `MBTA scheduled trips`, stepped: true, fill: true, - pointBackgroundColor: 'transparent', pointBorderWidth: 0, + pointRadius: 0, + pointHoverRadius: 6, + borderColor: lineColor, spanGaps: false, data: predictedData.counts.map((count, index) => diff --git a/modules/speed/SpeedGraph.tsx b/modules/speed/SpeedGraph.tsx index c0744dedc..a3d49287b 100644 --- a/modules/speed/SpeedGraph.tsx +++ b/modules/speed/SpeedGraph.tsx @@ -50,11 +50,10 @@ export const SpeedGraph: React.FC = ({ { label: `MPH`, borderColor: LINE_COLORS[line ?? 'default'], - pointRadius: 8, - pointBackgroundColor: 'transparent', + pointRadius: 0, pointBorderWidth: 0, stepped: true, - pointHoverRadius: 3, + pointHoverRadius: 6, spanGaps: false, pointHoverBackgroundColor: LINE_COLORS[line ?? 'default'], data: data.map((datapoint) => From fe1786a64177bef0a73dfe15cd2e24b7e43f4151 Mon Sep 17 00:00:00 2001 From: Patrick Cleary Date: Sun, 25 Jun 2023 11:39:03 -0400 Subject: [PATCH 08/12] bug/overview-date-overflow (#700) * bug/overview-date-overflow * fix point colors and consolidate radii * Revert "fix point colors and consolidate radii" This reverts commit 77dfe9c7f439f506d7b5323c710f9bf4dd9cebd8. --- common/components/general/ButtonGroup.tsx | 2 +- .../components/inputs/DateSelection/OverviewDateSelection.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/components/general/ButtonGroup.tsx b/common/components/general/ButtonGroup.tsx index d344caf8c..9e9fc7dff 100644 --- a/common/components/general/ButtonGroup.tsx +++ b/common/components/general/ButtonGroup.tsx @@ -56,7 +56,7 @@ export const ButtonGroup: ( } bg-white text-stone-900 hover:bg-opacity-70 hover:text-white` )} > - {option[1]} +

{option[1]}

)} diff --git a/common/components/inputs/DateSelection/OverviewDateSelection.tsx b/common/components/inputs/DateSelection/OverviewDateSelection.tsx index 64b41d40c..b5e1b9be6 100644 --- a/common/components/inputs/DateSelection/OverviewDateSelection.tsx +++ b/common/components/inputs/DateSelection/OverviewDateSelection.tsx @@ -25,7 +25,7 @@ export const OverviewDateSelection = () => { selectedIndex={selectedIndex} pressFunction={handlePresetSelection} options={Object.entries(OverviewRangeTypes)} - additionalButtonClass="w-fit text-xs sm:text-base" + additionalButtonClass="w-fit text-xs sm:text-base md:text-xs lg:text-sm" additionalDivClass="md:max-w-md h-10 md:h-7" isOverview /> From 881d9bb7eaec51dd38e1edc9c448ec2b5d293405 Mon Sep 17 00:00:00 2001 From: Patrick Cleary Date: Sun, 25 Jun 2023 11:44:51 -0400 Subject: [PATCH 09/12] small changes to landing chart (#696) * small changes to landing chart * lint --- modules/landing/charts/LandingPageChart.tsx | 8 +++++++- modules/landing/utils.ts | 9 ++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/modules/landing/charts/LandingPageChart.tsx b/modules/landing/charts/LandingPageChart.tsx index a1d350aa0..30109ad58 100644 --- a/modules/landing/charts/LandingPageChart.tsx +++ b/modules/landing/charts/LandingPageChart.tsx @@ -8,6 +8,8 @@ import { enUS } from 'date-fns/locale'; import { COLORS } from '../../../common/constants/colors'; import { THREE_MONTHS_AGO_STRING, TODAY_STRING } from '../../../common/constants/dates'; import { SPEED_RANGE_PARAM_MAP } from '../../speed/constants/speeds'; +import { HEAVY_RAIL_LINES } from '../../../common/types/lines'; +import { LINE_OBJECTS } from '../../../common/constants/lines'; interface LandingPageChartsProps { datasets: ChartDataset<'line'>[]; @@ -32,12 +34,16 @@ export const LandingPageChart: React.FC = ({ datasets, l maintainAspectRatio: false, interaction: { intersect: false, + mode: 'index', }, plugins: { tooltip: { position: 'nearest', callbacks: { - label: (value) => `${value.formattedValue}% of baseline`, + label: (value) => + `${value.formattedValue}% of baseline (${ + LINE_OBJECTS[HEAVY_RAIL_LINES[value.datasetIndex]].name + })`, ...callbacks, }, }, diff --git a/modules/landing/utils.ts b/modules/landing/utils.ts index 455cd14c1..14559740d 100644 --- a/modules/landing/utils.ts +++ b/modules/landing/utils.ts @@ -1,3 +1,4 @@ +import type { ChartDataset } from 'chart.js'; import { PEAK_COMPLETE_TRIP_TIMES, PEAK_RIDERSHIP, @@ -7,12 +8,14 @@ import { LINE_COLORS } from '../../common/constants/colors'; import type { RidershipCount, SpeedDataPoint } from '../../common/types/dataPoints'; import type { Line } from '../../common/types/lines'; -const getDatasetOptions = (line: Line) => { +const getDatasetOptions = (line: Line): Partial> => { return { + pointRadius: 4, borderColor: LINE_COLORS[line ?? 'default'], - borderWidth: 6, + borderWidth: 4, + pointBackgroundColor: LINE_COLORS[line ?? 'default'], pointBorderWidth: 0, - tension: 0.5, + tension: 0, pointHoverRadius: 6, spanGaps: false, pointHoverBackgroundColor: LINE_COLORS[line ?? 'default'], From d1b94cab65c7741b3b79ecb99a531bcdd98d81ca Mon Sep 17 00:00:00 2001 From: Patrick Cleary Date: Tue, 27 Jun 2023 17:22:44 -0400 Subject: [PATCH 10/12] fit hero animation into viewport (#704) --- modules/landing/Landing.tsx | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/modules/landing/Landing.tsx b/modules/landing/Landing.tsx index 41076bf59..9fb586d05 100644 --- a/modules/landing/Landing.tsx +++ b/modules/landing/Landing.tsx @@ -47,13 +47,7 @@ export function Landing() {
- -
-
From 4589d6a84dcead04be14b8dd763038c86ab3b789 Mon Sep 17 00:00:00 2001 From: Patrick Cleary Date: Tue, 27 Jun 2023 17:24:19 -0400 Subject: [PATCH 11/12] Fix service tooltip (#707) * change service delivered title * style fixes and fix a bug * lint --- common/types/basicWidgets.ts | 2 +- modules/dashboard/WidgetTitle.tsx | 2 +- modules/service/ServiceDetails.tsx | 2 +- modules/service/ServiceGraph.tsx | 4 +++- modules/service/ServiceGraphWrapper.tsx | 12 +++--------- 5 files changed, 9 insertions(+), 13 deletions(-) diff --git a/common/types/basicWidgets.ts b/common/types/basicWidgets.ts index 165eb4f10..2395440ff 100644 --- a/common/types/basicWidgets.ts +++ b/common/types/basicWidgets.ts @@ -126,7 +126,7 @@ export class PercentageWidgetValue extends BaseWidgetValue implements WidgetValu export class TripsWidgetValue extends BaseWidgetValue implements WidgetValueInterface { getUnits() { - return 'Daily trips'; + return 'Trips'; } getFormattedValue() { diff --git a/modules/dashboard/WidgetTitle.tsx b/modules/dashboard/WidgetTitle.tsx index d77de2e12..87a763cc7 100644 --- a/modules/dashboard/WidgetTitle.tsx +++ b/modules/dashboard/WidgetTitle.tsx @@ -30,7 +30,7 @@ export const WidgetTitle: React.FC = ({ view: query.view, }); return ( -
+

- + {serviceDataReady ? ( = ({ callbacks: { ...callbacks, label: (context) => { - return `${context.parsed.y} (${( + return `${context.datasetIndex === 0 ? 'Actual:' : 'Scheduled:'} ${ + context.parsed.y + } (${( (100 * context.parsed.y) / PEAK_SCHEDULED_SERVICE[line ?? 'DEFAULT'] ).toFixed(1)}% of baseline)`; diff --git a/modules/service/ServiceGraphWrapper.tsx b/modules/service/ServiceGraphWrapper.tsx index c708d5557..bcb8529dc 100644 --- a/modules/service/ServiceGraphWrapper.tsx +++ b/modules/service/ServiceGraphWrapper.tsx @@ -24,19 +24,13 @@ export const ServiceGraphWrapper: React.FC = ({ endDate, }) => { if (!data.some((datapoint) => datapoint.value !== null)) return ; - const { current, delta, average, peak } = getServiceWidgetValues(data, predictedData.counts); + const { average, peak } = getServiceWidgetValues(data, predictedData.counts); return ( - = ({ From dbee098f399deb281039a04c3edda0dd8f02f005 Mon Sep 17 00:00:00 2001 From: Patrick Cleary Date: Tue, 27 Jun 2023 17:42:36 -0400 Subject: [PATCH 12/12] Change time widget unit format (#708) * Change time widget unit format * show + sign rather than = on 0 increase of zones * capitalization --- .../internal/BasicWidgetDataLayout.tsx | 20 +----- .../widgets/internal/SimpleDeltaWidget.tsx | 67 ------------------- .../components/widgets/internal/UnitText.tsx | 7 ++ .../widgets/internal/WidgetForCarousel.tsx | 36 +--------- .../widgets/internal/WidgetText.tsx | 8 +++ .../{basicWidgets.ts => basicWidgets.tsx} | 55 +++++++++++---- common/utils/{time.ts => time.tsx} | 27 +++++++- modules/slowzones/SlowZonesDetails.tsx | 2 +- 8 files changed, 86 insertions(+), 136 deletions(-) create mode 100644 common/components/widgets/internal/UnitText.tsx create mode 100644 common/components/widgets/internal/WidgetText.tsx rename common/types/{basicWidgets.ts => basicWidgets.tsx} (78%) rename common/utils/{time.ts => time.tsx} (72%) diff --git a/common/components/widgets/internal/BasicWidgetDataLayout.tsx b/common/components/widgets/internal/BasicWidgetDataLayout.tsx index d41395800..1b3030f61 100644 --- a/common/components/widgets/internal/BasicWidgetDataLayout.tsx +++ b/common/components/widgets/internal/BasicWidgetDataLayout.tsx @@ -13,7 +13,6 @@ export type BasicWidgetDataLayoutProps = { widgetValue: WidgetValueInterface; sentimentDirection?: SentimentDirection; layoutKind?: LayoutKind; - isLarge?: boolean; }; export const BasicWidgetDataLayout: React.FC = ({ @@ -22,30 +21,15 @@ export const BasicWidgetDataLayout: React.FC = ({ widgetValue, layoutKind = 'total-and-delta', sentimentDirection = 'negativeOnIncrease', - isLarge = true, }) => { return ( <>
{widgetValue.value === undefined && }
-

- {title} -

+

{title}

-

- {widgetValue.getFormattedValue()} -

-

- {widgetValue.getUnits()} -

+ {widgetValue.getFormattedValue()}
{layoutKind !== 'no-delta' && ( diff --git a/common/components/widgets/internal/SimpleDeltaWidget.tsx b/common/components/widgets/internal/SimpleDeltaWidget.tsx index ee65b496b..e69de29bb 100644 --- a/common/components/widgets/internal/SimpleDeltaWidget.tsx +++ b/common/components/widgets/internal/SimpleDeltaWidget.tsx @@ -1,67 +0,0 @@ -import React from 'react'; -import classNames from 'classnames'; -import dayjs from 'dayjs'; -import type { WidgetValueInterface } from '../../../types/basicWidgets'; - -import { LoadingSpinner } from '../../graphics/LoadingSpinner'; -import { useDelimitatedRoute } from '../../../utils/router'; - -type SentimentDirection = 'positiveOnIncrease' | 'negativeOnIncrease'; - -export type BasicWidgetDataLayoutProps = { - widgetValue: WidgetValueInterface; - sentimentDirection?: SentimentDirection; -}; - -export const SimpleDeltaWidget: React.FC = ({ - widgetValue, - sentimentDirection = 'negativeOnIncrease', -}) => { - const { - query: { startDate, endDate }, - } = useDelimitatedRoute(); - const getDelta = () => { - const deltaValue = widgetValue.getFormattedDelta(); - const increase = widgetValue.delta ? widgetValue.delta > 0 : false; - const positiveSentiment = - (!increase && sentimentDirection === 'negativeOnIncrease') || - (increase && sentimentDirection === 'positiveOnIncrease'); - const bgColor = positiveSentiment ? 'bg-green-100' : 'bg-red-100'; - const textColor = positiveSentiment ? 'text-green-800' : 'text-red-800'; - return ( -
-
-
-

- {deltaValue} -

-
-

{widgetValue.getUnits()}

-
-
- ); - }; - - return ( - <> -
- {widgetValue.value === undefined && } -
-

- {dayjs(startDate).format('MMM D, YYYY')} - {dayjs(endDate).format('MMM D, YYYY')} -

-
{getDelta()}
-
-
-
- - ); -}; diff --git a/common/components/widgets/internal/UnitText.tsx b/common/components/widgets/internal/UnitText.tsx new file mode 100644 index 000000000..6165e828b --- /dev/null +++ b/common/components/widgets/internal/UnitText.tsx @@ -0,0 +1,7 @@ +import React from 'react'; +export interface UnitTextProps { + text: string; +} +export const UnitText: React.FC = ({ text }) => { + return {text}; +}; diff --git a/common/components/widgets/internal/WidgetForCarousel.tsx b/common/components/widgets/internal/WidgetForCarousel.tsx index b7001cb2e..ae9ef04d0 100644 --- a/common/components/widgets/internal/WidgetForCarousel.tsx +++ b/common/components/widgets/internal/WidgetForCarousel.tsx @@ -13,7 +13,6 @@ export type WidgetForCarouselProps = { widgetValue: WidgetValueInterface; sentimentDirection?: SentimentDirection; layoutKind?: LayoutKind; - isLarge?: boolean; }; export const WidgetForCarousel: React.FC = ({ @@ -21,7 +20,6 @@ export const WidgetForCarousel: React.FC = ({ widgetValue, layoutKind = 'total-and-delta', sentimentDirection = 'negativeOnIncrease', - isLarge = true, }) => { const isHorizontal = !useBreakpoint('lg'); @@ -32,22 +30,7 @@ export const WidgetForCarousel: React.FC = ({
-

- {widgetValue.getFormattedValue()} -

-

- {widgetValue.getUnits()} -

+ {widgetValue.getFormattedValue()}
{layoutKind !== 'no-delta' && ( @@ -71,22 +54,7 @@ export const WidgetForCarousel: React.FC = ({ {widgetValue.value === undefined && }
-

- {widgetValue.getFormattedValue()} -

-

- {widgetValue.getUnits()} -

+ {widgetValue.getFormattedValue()}
{layoutKind !== 'no-delta' && ( diff --git a/common/components/widgets/internal/WidgetText.tsx b/common/components/widgets/internal/WidgetText.tsx new file mode 100644 index 000000000..9434943f8 --- /dev/null +++ b/common/components/widgets/internal/WidgetText.tsx @@ -0,0 +1,8 @@ +import React from 'react'; + +export interface WidgetTextProps { + text: string; +} +export const WidgetText: React.FC = ({ text }) => { + return {text}; +}; diff --git a/common/types/basicWidgets.ts b/common/types/basicWidgets.tsx similarity index 78% rename from common/types/basicWidgets.ts rename to common/types/basicWidgets.tsx index 2395440ff..91995b2f9 100644 --- a/common/types/basicWidgets.ts +++ b/common/types/basicWidgets.tsx @@ -1,6 +1,9 @@ +import React from 'react'; import dayjs from 'dayjs'; import duration from 'dayjs/plugin/duration'; import { getFormattedTimeValue, getTimeUnit } from '../utils/time'; +import { WidgetText } from '../components/widgets/internal/WidgetText'; +import { UnitText } from '../components/widgets/internal/UnitText'; dayjs.extend(duration); export interface WidgetValueInterface { @@ -9,7 +12,7 @@ export interface WidgetValueInterface { readonly percentChange?: number; getUnits: () => string; - getFormattedValue: () => string; + getFormattedValue: () => React.ReactNode; getFormattedDelta: () => string; getFormattedPercentChange: () => string; } @@ -42,8 +45,7 @@ export class DeltaTimeWidgetValue extends BaseWidgetValue implements WidgetValue } getFormattedValue() { if (this.delta === undefined) return '...'; - const formattedValue = getFormattedTimeValue(this.delta); - return `${this.delta > 0 ? '+' : '-'}${formattedValue}`; + return getFormattedTimeValue(this.delta); } getFormattedDelta() { new Error('DeltaWidgets should use `getFormattedValue`'); @@ -53,11 +55,16 @@ export class DeltaTimeWidgetValue extends BaseWidgetValue implements WidgetValue export class DeltaZonesWidgetValue extends BaseWidgetValue implements WidgetValueInterface { getUnits() { - return 'Zones'; + return 'zones'; } getFormattedValue() { if (this.delta === undefined) return '...'; - return `${this.delta > 0 ? '+' : '-'}${Math.abs(this.delta)}`; + return ( +

+ = 0 ? '+' : '-'}${Math.abs(this.delta)}`} />{' '} + +

+ ); } getFormattedDelta() { new Error('DeltaWidgets should use `getFormattedValue`'); @@ -74,8 +81,7 @@ export class TimeWidgetValue extends BaseWidgetValue implements WidgetValueInter getFormattedValue() { if (this.value === undefined) return '...'; - const formattedValue = getFormattedTimeValue(this.value); - return formattedValue; + return getFormattedTimeValue(this.value); } getFormattedDelta() { @@ -96,11 +102,16 @@ export class TimeWidgetValue extends BaseWidgetValue implements WidgetValueInter export class SZWidgetValue extends BaseWidgetValue implements WidgetValueInterface { getUnits() { - return 'Zones'; + return 'zones'; } getFormattedValue() { if (typeof this.value === 'undefined') return '...'; - return Math.abs(this.value).toString(); + return ( +

+ {' '} + +

+ ); } getFormattedDelta() { if (typeof this.delta === 'undefined') return '...'; @@ -115,7 +126,12 @@ export class PercentageWidgetValue extends BaseWidgetValue implements WidgetValu getFormattedValue() { if (this.value === undefined) return '...'; - return Math.round(100 * this.value).toString(); + return ( +

+ {' '} + +

+ ); } getFormattedDelta() { @@ -131,7 +147,11 @@ export class TripsWidgetValue extends BaseWidgetValue implements WidgetValueInte getFormattedValue() { if (this.value === undefined) return '...'; - return Math.abs(this.value).toFixed(0); + return ( +

+ +

+ ); } getFormattedDelta() { @@ -147,7 +167,11 @@ export class MPHWidgetValue extends BaseWidgetValue implements WidgetValueInterf getFormattedValue() { if (typeof this.value === 'undefined') return '...'; - return this.value.toFixed(1); + return ( +

+ +

+ ); } getFormattedDelta() { if (typeof this.value === 'undefined' || typeof this.delta === 'undefined') return '...'; @@ -164,7 +188,12 @@ export class RidersWidgetValue extends BaseWidgetValue implements WidgetValueInt getFormattedValue() { if (this.value === undefined) return '...'; - return `${(this.value / 1000).toFixed(1)}k`; + return ( +

+ {' '} + +

+ ); } // TODO diff --git a/common/utils/time.ts b/common/utils/time.tsx similarity index 72% rename from common/utils/time.ts rename to common/utils/time.tsx index 68fcd7530..9cb712a6b 100644 --- a/common/utils/time.ts +++ b/common/utils/time.tsx @@ -1,4 +1,7 @@ +import React from 'react'; import dayjs from 'dayjs'; +import { WidgetText } from '../components/widgets/internal/WidgetText'; +import { UnitText } from '../components/widgets/internal/UnitText'; type StringifyTimeOptions = { truncateLeadingHoursZeros?: boolean; @@ -62,12 +65,30 @@ export const getTimeUnit = (value: number) => { export const getFormattedTimeValue = (value: number) => { const absValue = Math.abs(value); + const duration = dayjs.duration(absValue, 'seconds'); switch (true) { case absValue < 100: - return absValue.toFixed(0); + return ( +

+ + +

+ ); case absValue < 3600: - return dayjs.duration(absValue, 'seconds').format('m:ss'); + return ( +

+ + + +

+ ); default: - return dayjs.duration(absValue, 'seconds').format('H:mm'); + return ( +

+ + + +

+ ); } }; diff --git a/modules/slowzones/SlowZonesDetails.tsx b/modules/slowzones/SlowZonesDetails.tsx index ea2596166..80f4ce7ce 100644 --- a/modules/slowzones/SlowZonesDetails.tsx +++ b/modules/slowzones/SlowZonesDetails.tsx @@ -92,7 +92,7 @@ export function SlowZonesDetails() { {/* Not Using WidgetDiv here - removed the padding so the chart goes to the edge of the widget on mobile. */}
- +