/* eslint-disable react/display-name */ import React, { useState } from "react"; import styled from "styled-components"; import { alphabeticShortNameComparator, getMostReadableTextColor, getRouteSortOrderValue, makeMultiCriteriaSort, makeNumericValueComparator, makeStringValueComparator, makeTransitOperatorComparator, routeTypeComparator } from "./route"; import { routes } from "./__mocks__/fake-route-data.story.json"; import { fakeTransitOperators } from "./__mocks__/fake-transit-operators.story.json"; export default { title: "core-utils" }; const ColorBlock = styled.div<{ bg: string; fg: string }>` background: ${props => props.bg}; color: ${props => props.fg}; padding: 10px; `; const ColorBlockWrapper = styled.div` display: flex; flex-direction: row; gap: 10px; `; const ColorPair = ({ fg, bg }: { fg: string; bg: string }) => { return ( Provided color pair Corrected color pair ); }; export const RouteColorTester = { render: (): JSX.Element => { const [fg, setFg] = useState("#333333"); const [bg, setBg] = useState("#cbeb55"); return ( <> {/* eslint-disable-next-line jsx-a11y/label-has-associated-control */} {/* eslint-disable-next-line jsx-a11y/label-has-associated-control */} ); }, // Disable color contrast checking for the uncorrected color pairs parameters: { a11y: { config: { rules: [{ id: "color-contrast", reviewOnFail: true }] } }, storyshots: { disable: true } } }; // Route sort logic story: const Columns = styled.div` display: flex; flex-direction: row; position: relative; width: 100%; `; const StyledTable = styled.table` td, th { border: 1px solid black; padding: 2px; } tr { background-color: white; display: grid; grid-template-columns: 1fr 2fr 2fr 4fr 2fr 2fr; width: 75%; img { height: 30px; width: 30px; } } `; function makeRouteComparator(sortArray): (a: number, b: number) => number { return makeMultiCriteriaSort( ...(sortArray as Array<(a: any, b: any) => number>) ); } /** * This is based on the logic in the makeRouteComparator function in route.ts * If another route comparator is added to makeRouteComparator, this component * will need to be updated to reflect the new comparator. */ export const RouteSortingLogic = (): JSX.Element => { const [useOperatorComparator, setUseOperatorComparator] = useState(true); const [useSortOrderComparator, setUseSortOrderComparator] = useState(true); const [useRouteComparator, setUseRouteComparator] = useState(true); const [useAlphaSortName, setUseAlphaSortName] = useState(true); const [useNumericShortName, setUseNumericShortName] = useState(true); const [useStringShortName, setUseStringShortName] = useState(true); const [useStringLongName, setUseLongName] = useState(true); const transitOperatorComparator = useOperatorComparator ? makeTransitOperatorComparator(fakeTransitOperators) : null; const sortOrderComparator = useSortOrderComparator ? makeNumericValueComparator(obj => getRouteSortOrderValue(obj)) : null; const routeComparator = useRouteComparator ? routeTypeComparator : null; const alphaShortName = useAlphaSortName ? alphabeticShortNameComparator : null; const numericShortName = useNumericShortName ? makeNumericValueComparator(obj => parseInt(obj.shortName, 10)) : null; const stringShortName = useStringShortName ? makeStringValueComparator(obj => obj.shortName) : null; const stringLongName = useStringLongName ? makeStringValueComparator(obj => obj.longName || "") : null; const sortArray = [ transitOperatorComparator, sortOrderComparator, routeComparator, alphaShortName, numericShortName, stringShortName, stringLongName ].filter(x => x !== null); const sortedRoutes = Array.from(routes as Array).sort( makeRouteComparator(sortArray) ); return ( Logo Mode Short Name Long Name Agency Order Sort Order {sortedRoutes.map(r => { const operator = fakeTransitOperators.find( x => x.agencyId === r.agency?.id ); return ( {r.agency?.name {r.mode} {r.shortName} {r.longName} {operator?.order} {r.sortOrder} ); })}
); };