+ {sortByStationOrder(places, orderingRouteId, reverse).map((place) => {
+ const signIdsAtPlace = place.screens
+ .filter(
+ (screen) =>
+ fp.intersection(routeIds, screen.route_ids).length > 0,
+ )
+ .map((screen) => screen.id);
+ return (
+
+
{
+ if (evt.target.checked) {
+ onChange(fp.union(signIdsAtPlace, value));
+ } else {
+ onChange(fp.without(signIdsAtPlace, value));
+ }
+ }}
+ checked={value.some((signId) =>
+ signIdsAtPlace.includes(signId),
+ )}
+ />
+
+ );
+ })}
+
+ >
+ );
+};
+
+export default RouteColumn;
diff --git a/assets/js/components/Dashboard/NewPaMessage/SelectStationsPage.tsx b/assets/js/components/Dashboard/NewPaMessage/SelectStationsPage.tsx
new file mode 100644
index 00000000..b67d7f18
--- /dev/null
+++ b/assets/js/components/Dashboard/NewPaMessage/SelectStationsPage.tsx
@@ -0,0 +1,299 @@
+import React, { useMemo, useState } from "react";
+import { Button, Container, Form } from "react-bootstrap";
+import fp from "lodash/fp";
+import { useScreenplayContext } from "Hooks/useScreenplayContext";
+import type { Place } from "Models/place";
+import RouteColumn from "./RouteColumn";
+import { GREEN_LINE_ROUTES, SILVER_LINE_ROUTES } from "Constants/constants";
+import StationGroupCheckbox from "./StationGroupCheckbox";
+import SelectedStationsSummary from "./SelectedStationsSummary";
+import {
+ GL_CENTRAL_SUBWAY,
+ GL_D_BRANCH,
+ GL_E_BRANCH,
+ GLX,
+ ORANGE_NORTH,
+ ORANGE_SOUTH,
+ RED_ASHMONT_BRANCH,
+ RED_BRAINTREE_BRANCH,
+ RED_TRUNK,
+} from "./StationGroups";
+import { Page } from "./types";
+
+const usePlacesWithPaEss = () => {
+ const { places } = useScreenplayContext();
+ return useMemo(
+ () =>
+ places
+ .map((place) => ({
+ ...place,
+ screens: place.screens.filter((screen) => screen.type === "pa_ess"),
+ }))
+ .filter((place: Place) => place.screens.length > 0),
+ [places],
+ );
+};
+
+const BASE_ROUTE_NAME_TO_ROUTE_IDS: { [key: string]: string[] } = {
+ "Green-B": ["Green-B"],
+ "Green-C": ["Green-C"],
+ "Green-D": ["Green-D"],
+ "Green-E": ["Green-E"],
+ Red: ["Red"],
+ Orange: ["Orange"],
+ Blue: ["Blue"],
+ Mattapan: ["Mattapan"],
+ Silver: SILVER_LINE_ROUTES,
+};
+
+const ROUTE_TO_CLASS_NAMES_MAP: { [key: string]: string } = {
+ Red: "route-col--red",
+ Orange: "route-col--orange",
+ Blue: "route-col--blue",
+ Mattapan: "route-col--mattapan",
+ Silver: "route-col--silver",
+};
+
+interface Props {
+ navigateTo: (page: Page) => void;
+}
+
+const SelectStationsPage = ({ navigateTo }: Props) => {
+ const [signsIds, setSignsIds] = useState