diff --git a/__tests__/components/viewers/__snapshots__/nearby-view.js.snap b/__tests__/components/viewers/__snapshots__/nearby-view.js.snap index 8d323e3be..d4e5ae41b 100644 --- a/__tests__/components/viewers/__snapshots__/nearby-view.js.snap +++ b/__tests__/components/viewers/__snapshots__/nearby-view.js.snap @@ -45,7 +45,7 @@ exports[`components > viewers > nearby view renders nothing on a blank page 1`] className="nearby-view base-color-bg" >
viewers > nearby view renders nothing on a blank page 1`] } >
    viewers > nearby view renders proper scooter dates 1`] = ` className="nearby-view base-color-bg" >
    viewers > nearby view renders proper scooter dates 1`] = ` } >
      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 24, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6MDM1NDBhOWUtZTY1Ny00NTRlLWFlN2ItOGFkOWRhODZjZmVk", "lat": 47.6759, "lon": -122.3158, @@ -4163,6 +4164,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 24, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6MDM1NDBhOWUtZTY1Ny00NTRlLWFlN2ItOGFkOWRhODZjZmVk", "lat": 47.6759, "lon": -122.3158, @@ -4184,6 +4186,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 24, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6MDM1NDBhOWUtZTY1Ny00NTRlLWFlN2ItOGFkOWRhODZjZmVk", "lat": 47.6759, "lon": -122.3158, @@ -4202,6 +4205,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 24, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6MDM1NDBhOWUtZTY1Ny00NTRlLWFlN2ItOGFkOWRhODZjZmVk", "lat": 47.6759, "lon": -122.3158, @@ -4217,15 +4221,15 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 24, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6MDM1NDBhOWUtZTY1Ny00NTRlLWFlN2ItOGFkOWRhODZjZmVk", "lat": 47.6759, "lon": -122.3158, @@ -4267,6 +4272,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 24, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6MDM1NDBhOWUtZTY1Ny00NTRlLWFlN2ItOGFkOWRhODZjZmVk", "lat": 47.6759, "lon": -122.3158, @@ -4299,17 +4305,38 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `

      + + +

      + + components.NearbyView.distanceAway + +

      +
      +
      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 24, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6MDM1NDBhOWUtZTY1Ny00NTRlLWFlN2ItOGFkOWRhODZjZmVk", "lat": 47.6759, "lon": -122.3158, @@ -4548,6 +4576,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 26, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NjliMWJmZmEtMzk0Yi00Mzc0LWIwN2MtMzdlMTA2MjAzMWU5", "lat": 47.6758, "lon": -122.3157, @@ -4566,6 +4595,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 26, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NjliMWJmZmEtMzk0Yi00Mzc0LWIwN2MtMzdlMTA2MjAzMWU5", "lat": 47.6758, "lon": -122.3157, @@ -4587,6 +4617,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 26, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NjliMWJmZmEtMzk0Yi00Mzc0LWIwN2MtMzdlMTA2MjAzMWU5", "lat": 47.6758, "lon": -122.3157, @@ -4605,6 +4636,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 26, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NjliMWJmZmEtMzk0Yi00Mzc0LWIwN2MtMzdlMTA2MjAzMWU5", "lat": 47.6758, "lon": -122.3157, @@ -4620,15 +4652,15 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 26, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NjliMWJmZmEtMzk0Yi00Mzc0LWIwN2MtMzdlMTA2MjAzMWU5", "lat": 47.6758, "lon": -122.3157, @@ -4670,6 +4703,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 26, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NjliMWJmZmEtMzk0Yi00Mzc0LWIwN2MtMzdlMTA2MjAzMWU5", "lat": 47.6758, "lon": -122.3157, @@ -4702,17 +4736,38 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `

      + + +

      + + components.NearbyView.distanceAway + +

      +
      +
      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 26, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NjliMWJmZmEtMzk0Yi00Mzc0LWIwN2MtMzdlMTA2MjAzMWU5", "lat": 47.6758, "lon": -122.3157, @@ -4951,6 +5007,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 34, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6MWQzN2RiMGEtMWM2MC00ZTgyLWEwY2YtNmFkNmE4NTEyNmEw", "lat": 47.6759, "lon": -122.3159, @@ -4969,6 +5026,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 34, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6MWQzN2RiMGEtMWM2MC00ZTgyLWEwY2YtNmFkNmE4NTEyNmEw", "lat": 47.6759, "lon": -122.3159, @@ -4990,6 +5048,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 34, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6MWQzN2RiMGEtMWM2MC00ZTgyLWEwY2YtNmFkNmE4NTEyNmEw", "lat": 47.6759, "lon": -122.3159, @@ -5008,6 +5067,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 34, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6MWQzN2RiMGEtMWM2MC00ZTgyLWEwY2YtNmFkNmE4NTEyNmEw", "lat": 47.6759, "lon": -122.3159, @@ -5023,15 +5083,15 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 34, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6MWQzN2RiMGEtMWM2MC00ZTgyLWEwY2YtNmFkNmE4NTEyNmEw", "lat": 47.6759, "lon": -122.3159, @@ -5073,6 +5134,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 34, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6MWQzN2RiMGEtMWM2MC00ZTgyLWEwY2YtNmFkNmE4NTEyNmEw", "lat": 47.6759, "lon": -122.3159, @@ -5105,17 +5167,38 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `

      + + +

      + + components.NearbyView.distanceAway + +

      +
      +
      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 34, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6MWQzN2RiMGEtMWM2MC00ZTgyLWEwY2YtNmFkNmE4NTEyNmEw", "lat": 47.6759, "lon": -122.3159, @@ -5354,6 +5438,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36940", + "distance": 41, "gtfsId": "kcm:36940", "id": "U3RvcDprY206MzY5NDA", "lat": 47.6758881, @@ -5919,6 +6004,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36940", + "distance": 41, "gtfsId": "kcm:36940", "id": "U3RvcDprY206MzY5NDA", "lat": 47.6758881, @@ -6487,6 +6573,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36940", + "distance": 41, "gtfsId": "kcm:36940", "id": "U3RvcDprY206MzY5NDA", "lat": 47.6758881, @@ -7053,6 +7140,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36940", + "distance": 41, "gtfsId": "kcm:36940", "id": "U3RvcDprY206MzY5NDA", "lat": 47.6758881, @@ -7615,7 +7703,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >
      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36940", + "distance": 41, "gtfsId": "kcm:36940", "id": "U3RvcDprY206MzY5NDA", "lat": 47.6758881, @@ -8207,6 +8296,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36940", + "distance": 41, "gtfsId": "kcm:36940", "id": "U3RvcDprY206MzY5NDA", "lat": 47.6758881, @@ -8793,6 +8883,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36940", + "distance": 41, "gtfsId": "kcm:36940", "id": "U3RvcDprY206MzY5NDA", "lat": 47.6758881, @@ -9358,6 +9449,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36940", + "distance": 41, "gtfsId": "kcm:36940", "id": "U3RvcDprY206MzY5NDA", "lat": 47.6758881, @@ -9921,22 +10013,42 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

      Roosevelt Station - Bay 2

      + + +

      + + components.NearbyView.distanceAway + +

      +
      +
      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36940", + "distance": 41, "gtfsId": "kcm:36940", "id": "U3RvcDprY206MzY5NDA", "lat": 47.6758881, @@ -10617,6 +10730,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36940", + "distance": 41, "gtfsId": "kcm:36940", "id": "U3RvcDprY206MzY5NDA", "lat": 47.6758881, @@ -11366,7 +11480,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `
        viewers > nearby view renders proper scooter dates 1`] = ` roundedTop={false} >
      • viewers > nearby view renders proper scooter dates 1`] = ` title="45" > viewers > nearby view renders proper scooter dates 1`] = `

          viewers > nearby view renders proper scooter dates 1`] = ` > viewers > nearby view renders proper scooter dates 1`] = ` iconViewBox="0 0 448 512" > viewers > nearby view renders proper scooter dates 1`] = ` >

        1. viewers > nearby view renders proper scooter dates 1`] = ` title="62" > viewers > nearby view renders proper scooter dates 1`] = `

            viewers > nearby view renders proper scooter dates 1`] = ` > viewers > nearby view renders proper scooter dates 1`] = ` iconViewBox="0 0 448 512" > viewers > nearby view renders proper scooter dates 1`] = ` >

          1. viewers > nearby view renders proper scooter dates 1`] = ` title="79" > viewers > nearby view renders proper scooter dates 1`] = `

              viewers > nearby view renders proper scooter dates 1`] = ` > viewers > nearby view renders proper scooter dates 1`] = ` iconViewBox="0 0 448 512" > viewers > nearby view renders proper scooter dates 1`] = ` >

              viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": null, + "distance": 49, "gtfsId": "40:990003", "id": "U3RvcDo0MDo5OTAwMDM", "lat": 47.676107, @@ -15598,6 +15717,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": null, + "distance": 49, "gtfsId": "40:990003", "id": "U3RvcDo0MDo5OTAwMDM", "lat": 47.676107, @@ -15983,6 +16103,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": null, + "distance": 49, "gtfsId": "40:990003", "id": "U3RvcDo0MDo5OTAwMDM", "lat": 47.676107, @@ -16347,6 +16468,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": null, + "distance": 49, "gtfsId": "40:990003", "id": "U3RvcDo0MDo5OTAwMDM", "lat": 47.676107, @@ -16709,22 +16831,42 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

              Roosevelt

              + + +

              + + components.NearbyView.distanceAway + +

              +
              +
              viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": null, + "distance": 49, "gtfsId": "40:990003", "id": "U3RvcDo0MDo5OTAwMDM", "lat": 47.676107, @@ -17204,6 +17347,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": null, + "distance": 49, "gtfsId": "40:990003", "id": "U3RvcDo0MDo5OTAwMDM", "lat": 47.676107, @@ -17752,7 +17896,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `
                viewers > nearby view renders proper scooter dates 1`] = ` roundedTop={false} >
              • viewers > nearby view renders proper scooter dates 1`] = ` title="1 Line" > viewers > nearby view renders proper scooter dates 1`] = `

                  viewers > nearby view renders proper scooter dates 1`] = ` roundedTop={false} >

                1. viewers > nearby view renders proper scooter dates 1`] = ` title="1 Line" > viewers > nearby view renders proper scooter dates 1`] = `

                    viewers > nearby view renders proper scooter dates 1`] = ` roundedTop={false} >

                  1. viewers > nearby view renders proper scooter dates 1`] = ` title="1 Line" > viewers > nearby view renders proper scooter dates 1`] = `

                      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 52, "id": "UmVudGFsVmVoaWNsZTpiaXJkLXNlYXR0bGUtd2FzaGluZ3RvbjpjZTM4MDA4Ny1lMjU1LTQzYjgtYjM5ZC04MjY3Y2E3MmJjMGQ", "lat": 47.675873, "lon": -122.316137, @@ -19707,6 +19852,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 52, "id": "UmVudGFsVmVoaWNsZTpiaXJkLXNlYXR0bGUtd2FzaGluZ3RvbjpjZTM4MDA4Ny1lMjU1LTQzYjgtYjM5ZC04MjY3Y2E3MmJjMGQ", "lat": 47.675873, "lon": -122.316137, @@ -19728,6 +19874,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 52, "id": "UmVudGFsVmVoaWNsZTpiaXJkLXNlYXR0bGUtd2FzaGluZ3RvbjpjZTM4MDA4Ny1lMjU1LTQzYjgtYjM5ZC04MjY3Y2E3MmJjMGQ", "lat": 47.675873, "lon": -122.316137, @@ -19746,6 +19893,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 52, "id": "UmVudGFsVmVoaWNsZTpiaXJkLXNlYXR0bGUtd2FzaGluZ3RvbjpjZTM4MDA4Ny1lMjU1LTQzYjgtYjM5ZC04MjY3Y2E3MmJjMGQ", "lat": 47.675873, "lon": -122.316137, @@ -19761,15 +19909,15 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

                      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 52, "id": "UmVudGFsVmVoaWNsZTpiaXJkLXNlYXR0bGUtd2FzaGluZ3RvbjpjZTM4MDA4Ny1lMjU1LTQzYjgtYjM5ZC04MjY3Y2E3MmJjMGQ", "lat": 47.675873, "lon": -122.316137, @@ -19811,6 +19960,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 52, "id": "UmVudGFsVmVoaWNsZTpiaXJkLXNlYXR0bGUtd2FzaGluZ3RvbjpjZTM4MDA4Ny1lMjU1LTQzYjgtYjM5ZC04MjY3Y2E3MmJjMGQ", "lat": 47.675873, "lon": -122.316137, @@ -19843,17 +19993,38 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `

                      + + +

                      + + components.NearbyView.distanceAway + +

                      +
                      +
                      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 52, "id": "UmVudGFsVmVoaWNsZTpiaXJkLXNlYXR0bGUtd2FzaGluZ3RvbjpjZTM4MDA4Ny1lMjU1LTQzYjgtYjM5ZC04MjY3Y2E3MmJjMGQ", "lat": 47.675873, "lon": -122.316137, @@ -20092,6 +20264,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 57, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6ODQ4M2VmZGUtZDRkMC00NWZkLWI0YzItZWNhOTg4MDhjMDQ4", "lat": 47.6759, "lon": -122.3162, @@ -20110,6 +20283,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 57, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6ODQ4M2VmZGUtZDRkMC00NWZkLWI0YzItZWNhOTg4MDhjMDQ4", "lat": 47.6759, "lon": -122.3162, @@ -20131,6 +20305,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 57, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6ODQ4M2VmZGUtZDRkMC00NWZkLWI0YzItZWNhOTg4MDhjMDQ4", "lat": 47.6759, "lon": -122.3162, @@ -20149,6 +20324,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 57, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6ODQ4M2VmZGUtZDRkMC00NWZkLWI0YzItZWNhOTg4MDhjMDQ4", "lat": 47.6759, "lon": -122.3162, @@ -20164,15 +20340,15 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

                      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 57, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6ODQ4M2VmZGUtZDRkMC00NWZkLWI0YzItZWNhOTg4MDhjMDQ4", "lat": 47.6759, "lon": -122.3162, @@ -20214,6 +20391,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 57, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6ODQ4M2VmZGUtZDRkMC00NWZkLWI0YzItZWNhOTg4MDhjMDQ4", "lat": 47.6759, "lon": -122.3162, @@ -20246,17 +20424,38 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `

                      + + +

                      + + components.NearbyView.distanceAway + +

                      +
                      +
                      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 57, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6ODQ4M2VmZGUtZDRkMC00NWZkLWI0YzItZWNhOTg4MDhjMDQ4", "lat": 47.6759, "lon": -122.3162, @@ -20495,6 +20695,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 57, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6ZmUwZjM4ZjAtMjc3YS00MjQ4LTlkNzYtMTc4Y2UxZGQ0MDY0", "lat": 47.6759, "lon": -122.3162, @@ -20513,6 +20714,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 57, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6ZmUwZjM4ZjAtMjc3YS00MjQ4LTlkNzYtMTc4Y2UxZGQ0MDY0", "lat": 47.6759, "lon": -122.3162, @@ -20534,6 +20736,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 57, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6ZmUwZjM4ZjAtMjc3YS00MjQ4LTlkNzYtMTc4Y2UxZGQ0MDY0", "lat": 47.6759, "lon": -122.3162, @@ -20552,6 +20755,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 57, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6ZmUwZjM4ZjAtMjc3YS00MjQ4LTlkNzYtMTc4Y2UxZGQ0MDY0", "lat": 47.6759, "lon": -122.3162, @@ -20567,15 +20771,15 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

                      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 57, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6ZmUwZjM4ZjAtMjc3YS00MjQ4LTlkNzYtMTc4Y2UxZGQ0MDY0", "lat": 47.6759, "lon": -122.3162, @@ -20617,6 +20822,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 57, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6ZmUwZjM4ZjAtMjc3YS00MjQ4LTlkNzYtMTc4Y2UxZGQ0MDY0", "lat": 47.6759, "lon": -122.3162, @@ -20649,17 +20855,38 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `

                      + + +

                      + + components.NearbyView.distanceAway + +

                      +
                      +
                      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 57, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6ZmUwZjM4ZjAtMjc3YS00MjQ4LTlkNzYtMTc4Y2UxZGQ0MDY0", "lat": 47.6759, "lon": -122.3162, @@ -20898,6 +21126,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16430", + "distance": 92, "gtfsId": "kcm:16430", "id": "U3RvcDprY206MTY0MzA", "lat": 47.6757507, @@ -21540,6 +21769,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16430", + "distance": 92, "gtfsId": "kcm:16430", "id": "U3RvcDprY206MTY0MzA", "lat": 47.6757507, @@ -22185,6 +22415,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16430", + "distance": 92, "gtfsId": "kcm:16430", "id": "U3RvcDprY206MTY0MzA", "lat": 47.6757507, @@ -22828,6 +23059,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16430", + "distance": 92, "gtfsId": "kcm:16430", "id": "U3RvcDprY206MTY0MzA", "lat": 47.6757507, @@ -23467,7 +23699,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >
                      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16430", + "distance": 92, "gtfsId": "kcm:16430", "id": "U3RvcDprY206MTY0MzA", "lat": 47.6757507, @@ -24136,6 +24369,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16430", + "distance": 92, "gtfsId": "kcm:16430", "id": "U3RvcDprY206MTY0MzA", "lat": 47.6757507, @@ -24799,6 +25033,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16430", + "distance": 92, "gtfsId": "kcm:16430", "id": "U3RvcDprY206MTY0MzA", "lat": 47.6757507, @@ -25441,6 +25676,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16430", + "distance": 92, "gtfsId": "kcm:16430", "id": "U3RvcDprY206MTY0MzA", "lat": 47.6757507, @@ -26081,22 +26317,42 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

                      Roosevelt Station - Bay 1

                      + + +

                      + + components.NearbyView.distanceAway + +

                      +
                      +
                      viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16430", + "distance": 92, "gtfsId": "kcm:16430", "id": "U3RvcDprY206MTY0MzA", "lat": 47.6757507, @@ -26854,6 +27111,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16430", + "distance": 92, "gtfsId": "kcm:16430", "id": "U3RvcDprY206MTY0MzA", "lat": 47.6757507, @@ -27680,7 +27938,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `
                        viewers > nearby view renders proper scooter dates 1`] = ` roundedTop={false} >
                      • viewers > nearby view renders proper scooter dates 1`] = ` title="45" > viewers > nearby view renders proper scooter dates 1`] = `

                          viewers > nearby view renders proper scooter dates 1`] = ` > viewers > nearby view renders proper scooter dates 1`] = ` iconViewBox="0 0 448 512" > viewers > nearby view renders proper scooter dates 1`] = ` >

                        1. viewers > nearby view renders proper scooter dates 1`] = ` title="62" > viewers > nearby view renders proper scooter dates 1`] = `

                            viewers > nearby view renders proper scooter dates 1`] = ` > viewers > nearby view renders proper scooter dates 1`] = ` iconViewBox="0 0 448 512" > viewers > nearby view renders proper scooter dates 1`] = ` >

                          1. viewers > nearby view renders proper scooter dates 1`] = ` title="79" > viewers > nearby view renders proper scooter dates 1`] = `

                              viewers > nearby view renders proper scooter dates 1`] = ` roundedTop={false} >

                            1. viewers > nearby view renders proper scooter dates 1`] = ` title="988" > viewers > nearby view renders proper scooter dates 1`] = `

                                viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 115, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6YTg5MDZiYTctMmU2NC00ZDk4LWI0ZGYtNmJjNDBlZTVkYzc3", "lat": 47.675, "lon": -122.3157, @@ -30468,6 +30727,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 115, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6YTg5MDZiYTctMmU2NC00ZDk4LWI0ZGYtNmJjNDBlZTVkYzc3", "lat": 47.675, "lon": -122.3157, @@ -30489,6 +30749,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 115, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6YTg5MDZiYTctMmU2NC00ZDk4LWI0ZGYtNmJjNDBlZTVkYzc3", "lat": 47.675, "lon": -122.3157, @@ -30507,6 +30768,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 115, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6YTg5MDZiYTctMmU2NC00ZDk4LWI0ZGYtNmJjNDBlZTVkYzc3", "lat": 47.675, "lon": -122.3157, @@ -30522,15 +30784,15 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

                                viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 115, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6YTg5MDZiYTctMmU2NC00ZDk4LWI0ZGYtNmJjNDBlZTVkYzc3", "lat": 47.675, "lon": -122.3157, @@ -30572,6 +30835,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 115, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6YTg5MDZiYTctMmU2NC00ZDk4LWI0ZGYtNmJjNDBlZTVkYzc3", "lat": 47.675, "lon": -122.3157, @@ -30604,17 +30868,38 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `

                                + + +

                                + + components.NearbyView.distanceAway + +

                                +
                                +
                                viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 115, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6YTg5MDZiYTctMmU2NC00ZDk4LWI0ZGYtNmJjNDBlZTVkYzc3", "lat": 47.675, "lon": -122.3157, @@ -30853,6 +31139,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 118, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NTU0NzM5MWEtMzZmNS00YjNkLWI3NWItZmI2YWExY2JjMjdh", "lat": 47.6757, "lon": -122.3174, @@ -30871,6 +31158,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 118, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NTU0NzM5MWEtMzZmNS00YjNkLWI3NWItZmI2YWExY2JjMjdh", "lat": 47.6757, "lon": -122.3174, @@ -30892,6 +31180,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 118, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NTU0NzM5MWEtMzZmNS00YjNkLWI3NWItZmI2YWExY2JjMjdh", "lat": 47.6757, "lon": -122.3174, @@ -30910,6 +31199,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 118, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NTU0NzM5MWEtMzZmNS00YjNkLWI3NWItZmI2YWExY2JjMjdh", "lat": 47.6757, "lon": -122.3174, @@ -30925,15 +31215,15 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

                                viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 118, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NTU0NzM5MWEtMzZmNS00YjNkLWI3NWItZmI2YWExY2JjMjdh", "lat": 47.6757, "lon": -122.3174, @@ -30975,6 +31266,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 118, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NTU0NzM5MWEtMzZmNS00YjNkLWI3NWItZmI2YWExY2JjMjdh", "lat": 47.6757, "lon": -122.3174, @@ -31007,17 +31299,38 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `

                                + + +

                                + + components.NearbyView.distanceAway + +

                                +
                                +
                                viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 118, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NTU0NzM5MWEtMzZmNS00YjNkLWI3NWItZmI2YWExY2JjMjdh", "lat": 47.6757, "lon": -122.3174, @@ -31256,6 +31570,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 121, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NmMyNDRhZjEtZjJjOC00N2JhLWIzOTMtNDhkMGVhY2ZlMDFj", "lat": 47.6764, "lon": -122.3162, @@ -31274,6 +31589,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 121, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NmMyNDRhZjEtZjJjOC00N2JhLWIzOTMtNDhkMGVhY2ZlMDFj", "lat": 47.6764, "lon": -122.3162, @@ -31295,6 +31611,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 121, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NmMyNDRhZjEtZjJjOC00N2JhLWIzOTMtNDhkMGVhY2ZlMDFj", "lat": 47.6764, "lon": -122.3162, @@ -31313,6 +31630,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 121, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NmMyNDRhZjEtZjJjOC00N2JhLWIzOTMtNDhkMGVhY2ZlMDFj", "lat": 47.6764, "lon": -122.3162, @@ -31328,15 +31646,15 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

                                viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 121, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NmMyNDRhZjEtZjJjOC00N2JhLWIzOTMtNDhkMGVhY2ZlMDFj", "lat": 47.6764, "lon": -122.3162, @@ -31378,6 +31697,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 121, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NmMyNDRhZjEtZjJjOC00N2JhLWIzOTMtNDhkMGVhY2ZlMDFj", "lat": 47.6764, "lon": -122.3162, @@ -31410,17 +31730,38 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `

                                + + +

                                + + components.NearbyView.distanceAway + +

                                +
                                +
                                viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 121, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NmMyNDRhZjEtZjJjOC00N2JhLWIzOTMtNDhkMGVhY2ZlMDFj", "lat": 47.6764, "lon": -122.3162, @@ -31659,6 +32001,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 143, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NDJjMjA0NWUtZDEyYS00MTg1LTlkNjEtM2ZkNjMwMzQyNjUz", "lat": 47.6754, "lon": -122.3173, @@ -31677,6 +32020,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 143, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NDJjMjA0NWUtZDEyYS00MTg1LTlkNjEtM2ZkNjMwMzQyNjUz", "lat": 47.6754, "lon": -122.3173, @@ -31698,6 +32042,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 143, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NDJjMjA0NWUtZDEyYS00MTg1LTlkNjEtM2ZkNjMwMzQyNjUz", "lat": 47.6754, "lon": -122.3173, @@ -31716,6 +32061,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 143, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NDJjMjA0NWUtZDEyYS00MTg1LTlkNjEtM2ZkNjMwMzQyNjUz", "lat": 47.6754, "lon": -122.3173, @@ -31731,15 +32077,15 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

                                viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 143, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NDJjMjA0NWUtZDEyYS00MTg1LTlkNjEtM2ZkNjMwMzQyNjUz", "lat": 47.6754, "lon": -122.3173, @@ -31781,6 +32128,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 143, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NDJjMjA0NWUtZDEyYS00MTg1LTlkNjEtM2ZkNjMwMzQyNjUz", "lat": 47.6754, "lon": -122.3173, @@ -31813,17 +32161,38 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `

                                + + +

                                + + components.NearbyView.distanceAway + +

                                +
                                +
                                viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 143, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NDJjMjA0NWUtZDEyYS00MTg1LTlkNjEtM2ZkNjMwMzQyNjUz", "lat": 47.6754, "lon": -122.3173, @@ -32062,6 +32432,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 151, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NTZkNTJkNzktOGMwZC00NzJiLThlMzgtZjgwMGJjZTBhN2Iy", "lat": 47.6754, "lon": -122.3174, @@ -32080,6 +32451,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 151, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NTZkNTJkNzktOGMwZC00NzJiLThlMzgtZjgwMGJjZTBhN2Iy", "lat": 47.6754, "lon": -122.3174, @@ -32101,6 +32473,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 151, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NTZkNTJkNzktOGMwZC00NzJiLThlMzgtZjgwMGJjZTBhN2Iy", "lat": 47.6754, "lon": -122.3174, @@ -32119,6 +32492,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 151, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NTZkNTJkNzktOGMwZC00NzJiLThlMzgtZjgwMGJjZTBhN2Iy", "lat": 47.6754, "lon": -122.3174, @@ -32134,15 +32508,15 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

                                viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 151, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NTZkNTJkNzktOGMwZC00NzJiLThlMzgtZjgwMGJjZTBhN2Iy", "lat": 47.6754, "lon": -122.3174, @@ -32184,6 +32559,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 151, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NTZkNTJkNzktOGMwZC00NzJiLThlMzgtZjgwMGJjZTBhN2Iy", "lat": 47.6754, "lon": -122.3174, @@ -32216,17 +32592,38 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `

                                + + +

                                + + components.NearbyView.distanceAway + +

                                +
                                +
                                viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 151, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6NTZkNTJkNzktOGMwZC00NzJiLThlMzgtZjgwMGJjZTBhN2Iy", "lat": 47.6754, "lon": -122.3174, @@ -32465,6 +32863,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16440", + "distance": 153, "gtfsId": "kcm:16440", "id": "U3RvcDprY206MTY0NDA", "lat": 47.675457, @@ -32829,6 +33228,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16440", + "distance": 153, "gtfsId": "kcm:16440", "id": "U3RvcDprY206MTY0NDA", "lat": 47.675457, @@ -33196,6 +33596,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16440", + "distance": 153, "gtfsId": "kcm:16440", "id": "U3RvcDprY206MTY0NDA", "lat": 47.675457, @@ -33561,6 +33962,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16440", + "distance": 153, "gtfsId": "kcm:16440", "id": "U3RvcDprY206MTY0NDA", "lat": 47.675457, @@ -33922,7 +34324,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >
                                viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16440", + "distance": 153, "gtfsId": "kcm:16440", "id": "U3RvcDprY206MTY0NDA", "lat": 47.675457, @@ -34313,6 +34716,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16440", + "distance": 153, "gtfsId": "kcm:16440", "id": "U3RvcDprY206MTY0NDA", "lat": 47.675457, @@ -34698,6 +35102,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16440", + "distance": 153, "gtfsId": "kcm:16440", "id": "U3RvcDprY206MTY0NDA", "lat": 47.675457, @@ -35062,6 +35467,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16440", + "distance": 153, "gtfsId": "kcm:16440", "id": "U3RvcDprY206MTY0NDA", "lat": 47.675457, @@ -35424,22 +35830,42 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

                                Roosevelt Station Bay 5 - Bay 5

                                + + +

                                + + components.NearbyView.distanceAway + +

                                +
                                +
                                viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16440", + "distance": 153, "gtfsId": "kcm:16440", "id": "U3RvcDprY206MTY0NDA", "lat": 47.675457, @@ -35919,6 +36346,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "16440", + "distance": 153, "gtfsId": "kcm:16440", "id": "U3RvcDprY206MTY0NDA", "lat": 47.675457, @@ -36467,7 +36895,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `
                                  viewers > nearby view renders proper scooter dates 1`] = ` roundedTop={false} >
                                • viewers > nearby view renders proper scooter dates 1`] = ` title="67" > viewers > nearby view renders proper scooter dates 1`] = `

                                    viewers > nearby view renders proper scooter dates 1`] = ` > viewers > nearby view renders proper scooter dates 1`] = ` iconViewBox="0 0 448 512" > viewers > nearby view renders proper scooter dates 1`] = ` >

                                  1. viewers > nearby view renders proper scooter dates 1`] = ` title="73" > viewers > nearby view renders proper scooter dates 1`] = `

                                      viewers > nearby view renders proper scooter dates 1`] = ` roundedTop={false} >

                                    1. viewers > nearby view renders proper scooter dates 1`] = ` title="984" > viewers > nearby view renders proper scooter dates 1`] = `

                                        viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 156, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6OWM3ZDZkYjEtYWJiMi00OWFlLTg3NzAtOGNkNjQ1MzcwMGUw", "lat": 47.675, "lon": -122.3164, @@ -38427,6 +38856,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 156, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6OWM3ZDZkYjEtYWJiMi00OWFlLTg3NzAtOGNkNjQ1MzcwMGUw", "lat": 47.675, "lon": -122.3164, @@ -38448,6 +38878,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 156, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6OWM3ZDZkYjEtYWJiMi00OWFlLTg3NzAtOGNkNjQ1MzcwMGUw", "lat": 47.675, "lon": -122.3164, @@ -38466,6 +38897,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 156, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6OWM3ZDZkYjEtYWJiMi00OWFlLTg3NzAtOGNkNjQ1MzcwMGUw", "lat": 47.675, "lon": -122.3164, @@ -38481,15 +38913,15 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

                                        viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 156, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6OWM3ZDZkYjEtYWJiMi00OWFlLTg3NzAtOGNkNjQ1MzcwMGUw", "lat": 47.675, "lon": -122.3164, @@ -38531,6 +38964,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 156, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6OWM3ZDZkYjEtYWJiMi00OWFlLTg3NzAtOGNkNjQ1MzcwMGUw", "lat": 47.675, "lon": -122.3164, @@ -38563,17 +38997,38 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `

                                        + + +

                                        + + components.NearbyView.distanceAway + +

                                        +
                                        +
                                        viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 156, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6OWM3ZDZkYjEtYWJiMi00OWFlLTg3NzAtOGNkNjQ1MzcwMGUw", "lat": 47.675, "lon": -122.3164, @@ -38812,6 +39268,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": null, + "distance": 156, "gtfsId": "40:990004", "id": "U3RvcDo0MDo5OTAwMDQ", "lat": 47.677081, @@ -39351,6 +39808,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": null, + "distance": 156, "gtfsId": "40:990004", "id": "U3RvcDo0MDo5OTAwMDQ", "lat": 47.677081, @@ -39893,6 +40351,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": null, + "distance": 156, "gtfsId": "40:990004", "id": "U3RvcDo0MDo5OTAwMDQ", "lat": 47.677081, @@ -40433,6 +40892,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": null, + "distance": 156, "gtfsId": "40:990004", "id": "U3RvcDo0MDo5OTAwMDQ", "lat": 47.677081, @@ -40969,7 +41429,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >
                                        viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": null, + "distance": 156, "gtfsId": "40:990004", "id": "U3RvcDo0MDo5OTAwMDQ", "lat": 47.677081, @@ -41535,6 +41996,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": null, + "distance": 156, "gtfsId": "40:990004", "id": "U3RvcDo0MDo5OTAwMDQ", "lat": 47.677081, @@ -42095,6 +42557,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": null, + "distance": 156, "gtfsId": "40:990004", "id": "U3RvcDo0MDo5OTAwMDQ", "lat": 47.677081, @@ -42634,6 +43097,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": null, + "distance": 156, "gtfsId": "40:990004", "id": "U3RvcDo0MDo5OTAwMDQ", "lat": 47.677081, @@ -43171,22 +43635,42 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

                                        Roosevelt

                                        + + +

                                        + + components.NearbyView.distanceAway + +

                                        +
                                        +
                                        viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": null, + "distance": 156, "gtfsId": "40:990004", "id": "U3RvcDo0MDo5OTAwMDQ", "lat": 47.677081, @@ -43841,6 +44326,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": null, + "distance": 156, "gtfsId": "40:990004", "id": "U3RvcDo0MDo5OTAwMDQ", "lat": 47.677081, @@ -44564,7 +45050,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `
                                          viewers > nearby view renders proper scooter dates 1`] = ` roundedTop={false} >
                                        • viewers > nearby view renders proper scooter dates 1`] = ` title="1 Line" > viewers > nearby view renders proper scooter dates 1`] = `

                                            viewers > nearby view renders proper scooter dates 1`] = ` > viewers > nearby view renders proper scooter dates 1`] = ` iconViewBox="0 0 448 512" > viewers > nearby view renders proper scooter dates 1`] = ` >

                                            viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "23561", + "distance": 178, "gtfsId": "kcm:23561", "id": "U3RvcDprY206MjM1NjE", "lat": 47.6771355, @@ -48737,6 +49228,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "23561", + "distance": 178, "gtfsId": "kcm:23561", "id": "U3RvcDprY206MjM1NjE", "lat": 47.6771355, @@ -49400,6 +49892,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "23561", + "distance": 178, "gtfsId": "kcm:23561", "id": "U3RvcDprY206MjM1NjE", "lat": 47.6771355, @@ -50042,6 +50535,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "23561", + "distance": 178, "gtfsId": "kcm:23561", "id": "U3RvcDprY206MjM1NjE", "lat": 47.6771355, @@ -50682,22 +51176,42 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

                                            Roosevelt Station - Bay 3

                                            + + +

                                            + + components.NearbyView.distanceAway + +

                                            +
                                            +
                                            viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "23561", + "distance": 178, "gtfsId": "kcm:23561", "id": "U3RvcDprY206MjM1NjE", "lat": 47.6771355, @@ -51455,6 +51970,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "23561", + "distance": 178, "gtfsId": "kcm:23561", "id": "U3RvcDprY206MjM1NjE", "lat": 47.6771355, @@ -52281,7 +52797,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `
                                              viewers > nearby view renders proper scooter dates 1`] = ` roundedTop={false} >
                                            • viewers > nearby view renders proper scooter dates 1`] = ` title="522" > viewers > nearby view renders proper scooter dates 1`] = `

                                                viewers > nearby view renders proper scooter dates 1`] = ` roundedTop={false} >

                                              1. viewers > nearby view renders proper scooter dates 1`] = ` title="67" > viewers > nearby view renders proper scooter dates 1`] = `

                                                  viewers > nearby view renders proper scooter dates 1`] = ` > viewers > nearby view renders proper scooter dates 1`] = ` iconViewBox="0 0 448 512" > viewers > nearby view renders proper scooter dates 1`] = ` >

                                                1. viewers > nearby view renders proper scooter dates 1`] = ` title="522" > viewers > nearby view renders proper scooter dates 1`] = `

                                                    viewers > nearby view renders proper scooter dates 1`] = ` roundedTop={false} >

                                                  1. viewers > nearby view renders proper scooter dates 1`] = ` title="73" > viewers > nearby view renders proper scooter dates 1`] = `

                                                      viewers > nearby view renders proper scooter dates 1`] = ` roundedTop={false} >

                                                    1. viewers > nearby view renders proper scooter dates 1`] = ` title="322" > viewers > nearby view renders proper scooter dates 1`] = `

                                                        viewers > nearby view renders proper scooter dates 1`] = ` roundedTop={false} >

                                                      1. viewers > nearby view renders proper scooter dates 1`] = ` title="322" > viewers > nearby view renders proper scooter dates 1`] = `

                                                          viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 181, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6YTM0YzhmNTUtMjY4Ny00MjhlLWJmZTMtYWZiODgwNjdmNDM2", "lat": 47.6772, "lon": -122.3159, @@ -56782,6 +57299,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 181, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6YTM0YzhmNTUtMjY4Ny00MjhlLWJmZTMtYWZiODgwNjdmNDM2", "lat": 47.6772, "lon": -122.3159, @@ -56803,6 +57321,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 181, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6YTM0YzhmNTUtMjY4Ny00MjhlLWJmZTMtYWZiODgwNjdmNDM2", "lat": 47.6772, "lon": -122.3159, @@ -56821,6 +57340,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 181, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6YTM0YzhmNTUtMjY4Ny00MjhlLWJmZTMtYWZiODgwNjdmNDM2", "lat": 47.6772, "lon": -122.3159, @@ -56836,15 +57356,15 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

                                                          viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 181, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6YTM0YzhmNTUtMjY4Ny00MjhlLWJmZTMtYWZiODgwNjdmNDM2", "lat": 47.6772, "lon": -122.3159, @@ -56886,6 +57407,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 181, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6YTM0YzhmNTUtMjY4Ny00MjhlLWJmZTMtYWZiODgwNjdmNDM2", "lat": 47.6772, "lon": -122.3159, @@ -56918,17 +57440,38 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `

                                                          + + +

                                                          + + components.NearbyView.distanceAway + +

                                                          +
                                                          +
                                                          viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "RentalVehicle", "allowPickupNow": true, + "distance": 181, "id": "UmVudGFsVmVoaWNsZTpsaW1lX3NlYXR0bGU6YTM0YzhmNTUtMjY4Ny00MjhlLWJmZTMtYWZiODgwNjdmNDM2", "lat": 47.6772, "lon": -122.3159, @@ -57167,6 +57711,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36931", + "distance": 194, "gtfsId": "kcm:36931", "id": "U3RvcDprY206MzY5MzE", "lat": 47.6758652, @@ -57732,6 +58277,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36931", + "distance": 194, "gtfsId": "kcm:36931", "id": "U3RvcDprY206MzY5MzE", "lat": 47.6758652, @@ -58300,6 +58846,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36931", + "distance": 194, "gtfsId": "kcm:36931", "id": "U3RvcDprY206MzY5MzE", "lat": 47.6758652, @@ -58866,6 +59413,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36931", + "distance": 194, "gtfsId": "kcm:36931", "id": "U3RvcDprY206MzY5MzE", "lat": 47.6758652, @@ -59428,7 +59976,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >
                                                          viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36931", + "distance": 194, "gtfsId": "kcm:36931", "id": "U3RvcDprY206MzY5MzE", "lat": 47.6758652, @@ -60020,6 +60569,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36931", + "distance": 194, "gtfsId": "kcm:36931", "id": "U3RvcDprY206MzY5MzE", "lat": 47.6758652, @@ -60606,6 +61156,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36931", + "distance": 194, "gtfsId": "kcm:36931", "id": "U3RvcDprY206MzY5MzE", "lat": 47.6758652, @@ -61171,6 +61722,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36931", + "distance": 194, "gtfsId": "kcm:36931", "id": "U3RvcDprY206MzY5MzE", "lat": 47.6758652, @@ -61734,22 +62286,42 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` >

                                                          NE 65th St & 14th Ave NE

                                                          + + +

                                                          + + components.NearbyView.distanceAway + +

                                                          +
                                                          +
                                                          viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36931", + "distance": 194, "gtfsId": "kcm:36931", "id": "U3RvcDprY206MzY5MzE", "lat": 47.6758652, @@ -62430,6 +63003,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = ` Object { "__typename": "Stop", "code": "36931", + "distance": 194, "gtfsId": "kcm:36931", "id": "U3RvcDprY206MzY5MzE", "lat": 47.6758652, @@ -63179,7 +63753,7 @@ exports[`components > viewers > nearby view renders proper scooter dates 1`] = `
                                                            viewers > nearby view renders proper scooter dates 1`] = ` roundedTop={false} >
                                                          • viewers > nearby view renders proper scooter dates 1`] = ` title="45" > viewers > nearby view renders proper scooter dates 1`] = `

                                                              viewers > nearby view renders proper scooter dates 1`] = ` > viewers > nearby view renders proper scooter dates 1`] = ` iconViewBox="0 0 448 512" > viewers > nearby view renders proper scooter dates 1`] = ` >

                                                            1. viewers > nearby view renders proper scooter dates 1`] = ` title="62" > viewers > nearby view renders proper scooter dates 1`] = `

                                                                viewers > nearby view renders proper scooter dates 1`] = ` > viewers > nearby view renders proper scooter dates 1`] = ` iconViewBox="0 0 448 512" > viewers > nearby view renders proper scooter dates 1`] = ` >

                                                              1. viewers > nearby view renders proper scooter dates 1`] = ` title="79" > viewers > nearby view renders proper scooter dates 1`] = `

                                                                  viewers > nearby view renders proper scooter dates 1`] = ` > viewers > nearby view renders proper scooter dates 1`] = ` iconViewBox="0 0 448 512" > viewers > nearby view renders proper scooter dates 1`] = ` >

                                                          {days}" - notifications: >- - Notifications: {leadTimeInMinutes} min. before scheduled - departure - notificationsDisabled: "Notifications: Disabled" + happensOnDays: "Happens on: {days}" + monitoredTripDays: Trip monitored days + notifications: "{leadTimeInMinutes} min. before scheduled departure" + notificationsDisabled: Notifications disabled + timeAndDuration: Trip time and duration TripTools: copyLink: Copy Link header: Trip Tools diff --git a/i18n/es.yml b/i18n/es.yml index 7b58e3aff..1f847bfd8 100644 --- a/i18n/es.yml +++ b/i18n/es.yml @@ -81,13 +81,13 @@ common: tuesday: Martes wednesday: Miércoles daysOfWeekCompact: - friday: Vie. - monday: Lun. - saturday: Sáb. - sunday: Dom. - thursday: Jue. - tuesday: Mar. - wednesday: Mié. + friday: V + monday: L + saturday: S + sunday: D + thursday: J + tuesday: M + wednesday: X daysOfWeekPlural: friday: Viernes monday: Lunes @@ -527,6 +527,7 @@ components: tripNotFound: No se encontró el viaje tripNotFoundDescription: Lo sentimos, no se encontró el viaje solicitado. tripNotifications: Notificaciones de viaje + deleteSavedTrip: Borrar viaje guardado SavedTripList: alertTag: "{alerta, plural, one {Ver una alerta} other {Ver # alertas}}" fromTo: De {from} al {to} @@ -617,7 +618,6 @@ components: vehicleName: Vehículo {vehicleNumber} TripBasicsPane: checkingItineraryExistence: Comprobación de la existencia de itinerarios para cada día de la semana… - selectAtLeastOneDay: Por favor, seleccione al menos un día para el seguimiento. tripDaysPrompt: ¿Qué días hace este viaje? tripIsAvailableOnDaysIndicated: Su viaje está disponible en los días de la semana indicados anteriormente. tripNamePrompt: "Por favor, indique un nombre para este viaje:" @@ -702,11 +702,9 @@ components: arriveAt: "Llegue a las " leaveAt: "Salida a las " TripSummaryPane: - happensOnDays: "Ocurre en: {days}" - notifications: >- - Notificaciones: {leadTimeInMinutes} minutos antes de la salida - programada - notificationsDisabled: "Notificaciones: Desactivadas" + happensOnDays: "Ocurre en: {days}" + notifications: "{leadTimeInMinutes} minutos antes de la salida programada" + notificationsDisabled: Notificaciones desactivadas TripTools: copyLink: Copiar enlace header: Herramientas diff --git a/i18n/fr.yml b/i18n/fr.yml index 0eed7f0d0..ad2a17b26 100644 --- a/i18n/fr.yml +++ b/i18n/fr.yml @@ -87,13 +87,13 @@ common: tuesday: mardi wednesday: mercredi daysOfWeekCompact: - friday: ven. - monday: lun. - saturday: sam. - sunday: dim. - thursday: jeu. - tuesday: mar. - wednesday: mer. + friday: V + monday: L + saturday: S + sunday: D + thursday: J + tuesday: M + wednesday: M daysOfWeekPlural: friday: vendredis monday: lundis @@ -370,6 +370,7 @@ components: disponibles}} companyBicycle: Vélo {company} companyScooter: Trottinette {company} + distanceAway: à {localizedDistanceString} error: Erreur lors du chargement des services à proximité. header: À proximité nearbyListIntro: Liste de {count} entités à proximité. @@ -528,7 +529,7 @@ components: signInText: Connectez-vous pour enregistrer signInTooltip: Veuillez vous connecter pour enregistrer ce trajet. SavedTripEditor: - deleteSavedTrip: Supprimer le trajet enregistré + deleteSavedTrip: Supprimer ce trajet editSavedTrip: Modifier un trajet enregistré saveNewTrip: Enregistrer un nouveau trajet tripInformation: Informations sur le trajet @@ -629,7 +630,8 @@ components: vehicleName: Véhicule {vehicleNumber} TripBasicsPane: checkingItineraryExistence: Vérification du trajet pour chaque jour de la semaine... - selectAtLeastOneDay: Veuillez choisir au moins un jour pour effectuer le suivi. + onlyOnDate: "{date, date, ::eeeee yyyyMMdd} uniquement" + recurringEachWeek: Certains jours chaque semaine tripDaysPrompt: Quels jours effectuez-vous ce trajet ? tripIsAvailableOnDaysIndicated: Votre trajet est possible les jours indiqués ci-dessus. tripNamePrompt: "Saisissez un nom pour ce trajet :" @@ -692,6 +694,9 @@ components: Veuillez patienter pendant que les conditions du trajet sont déterminées. heading: Conditions du trajet indéterminées + past: + description: Le jour de ce trajet non-répété est passé. + heading: Trajet dans le passé snoozed: description: Reprenez le suivi pour obtenir des dernières conditions de votre trajet. heading: Suivi suspendu jusqu'à demain @@ -710,11 +715,11 @@ components: arriveAt: "Arrivée à " leaveAt: "Partez à " TripSummaryPane: - happensOnDays: "Effectué : {days}" - notifications: >- - Notifications : {leadTimeInMinutes} mn avant l'heure de départ - prévue - notificationsDisabled: "Notifications : Désactivées" + happensOnDays: "Effectué : {days}" + monitoredTripDays: Jours de suivi de ce trajet + notifications: "{leadTimeInMinutes} mn avant l'heure de départ prévue" + notificationsDisabled: Notifications désactivées + timeAndDuration: Heure et durée du trajet TripTools: copyLink: Copier le lien header: Outils diff --git a/i18n/ko.yml b/i18n/ko.yml index 9c056a296..33d3dcbc9 100644 --- a/i18n/ko.yml +++ b/i18n/ko.yml @@ -521,7 +521,6 @@ components: vehicleName: 차량 {vehicleNumber} TripBasicsPane: checkingItineraryExistence: 각 요일의 트립을 확인 중… - selectAtLeastOneDay: 모니터링하려면 최소 1일 이상을 선택하세요. tripDaysPrompt: 어느 요일에 이 트립을 사용하시나요? tripIsAvailableOnDaysIndicated: 트립은 위에 표시된 요일에 제공됩니다. tripNamePrompt: "이 트립의 이름을 입력하세요:" @@ -592,9 +591,9 @@ components: arriveAt: "도착 " leaveAt: "출발 " TripSummaryPane: - happensOnDays: "발생: {days}" - notifications: "알림: 출발 예정 시간 {leadTimeInMinutes} 분 전" - notificationsDisabled: "알림: 비활성화됨" + happensOnDays: "발생: {days}" + notifications: 출발 예정 시간 {leadTimeInMinutes} 분 전 + notificationsDisabled: "알림: 비활성화됨" TripTools: copyLink: 링크 복사 header: 도구 diff --git a/i18n/ru.yml b/i18n/ru.yml index 3e97961ec..c76c0406a 100644 --- a/i18n/ru.yml +++ b/i18n/ru.yml @@ -570,7 +570,6 @@ components: vehicleName: Транспортное средство {vehicleNumber} TripBasicsPane: checkingItineraryExistence: Проверка маршрута на каждый день недели… - selectAtLeastOneDay: Для просмотра выберите хотя бы один день. tripDaysPrompt: В какие дни вы хотите совершать эту поездку? tripIsAvailableOnDaysIndicated: Поездка доступна для указанных выше дней. tripNamePrompt: "Укажите имя поездки:" @@ -652,11 +651,9 @@ components: arriveAt: "Прибытие в " leaveAt: "Оставить " TripSummaryPane: - happensOnDays: "Проходит в такие дни: {days}" - notifications: >- - Уведомления: за {leadTimeInMinutes} мин до запланированного - времени отправления - notificationsDisabled: "Уведомления: отключены" + happensOnDays: "Проходит в такие дни: {days}" + notifications: за {leadTimeInMinutes} мин до запланированного времени отправления + notificationsDisabled: "Уведомления: отключены" TripTools: copyLink: Скопировать ссылку header: Инструменты маршрута diff --git a/i18n/tl.yml b/i18n/tl.yml index 79960eb26..24c16d44e 100644 --- a/i18n/tl.yml +++ b/i18n/tl.yml @@ -585,7 +585,6 @@ components: vehicleName: Sasakyan {vehicleNumber} TripBasicsPane: checkingItineraryExistence: Tinitingnan kung may itinerary para sa bawat araw ng linggo... - selectAtLeastOneDay: Pumili ng kahit isang araw lang na susubaybayan. tripDaysPrompt: Anong mga araw mo ginagawa ang biyaheng ito? tripIsAvailableOnDaysIndicated: Available ang iyong biyahe sa mga araw ng linggo na nakasaad sa itaas. tripNamePrompt: "Pangalanan ang biyaheng ito:" @@ -670,11 +669,9 @@ components: arriveAt: "Darating nang " leaveAt: "Umalis sa " TripSummaryPane: - happensOnDays: "Mangyayari sa: {days}" - notifications: >- - Mga Notification: {leadTimeInMinutes} (na) minuto bago ang - nakaiskedyul na pag-alis - notificationsDisabled: "Mga Notification: Naka-disable" + happensOnDays: "Mangyayari sa: {days}" + notifications: "{leadTimeInMinutes} (na) minuto bago ang nakaiskedyul na pag-alis" + notificationsDisabled: "Mga Notification: Naka-disable" TripTools: copyLink: Kopyahin ang Link header: Mga Tool sa Biyahe diff --git a/i18n/vi.yml b/i18n/vi.yml index dae70aa28..dba6ed8fd 100644 --- a/i18n/vi.yml +++ b/i18n/vi.yml @@ -81,13 +81,13 @@ common: tuesday: Thứ ba wednesday: Thứ tư daysOfWeekCompact: - friday: Thứ sáu - monday: Thứ hai - saturday: Thứ bảy - sunday: Chủ nhật - thursday: Thứ năm - tuesday: Thứ ba - wednesday: Thứ tư + friday: T6 + monday: T2 + saturday: T7 + sunday: CN + thursday: T5 + tuesday: T3 + wednesday: T4 daysOfWeekPlural: friday: Các thứ sáu monday: Các thứ hai @@ -579,7 +579,6 @@ components: vehicleName: Phương tiện giao thông {vehicleNumber} TripBasicsPane: checkingItineraryExistence: Kiểm tra sự tồn tại của hành trình cho mỗi ngày trong tuần… - selectAtLeastOneDay: Vui lòng chọn ít nhất một ngày để theo dõi. tripDaysPrompt: Bạn thực hiện chuyến đi này vào những ngày nào? tripIsAvailableOnDaysIndicated: Chuyến đi của bạn có sẵn vào những ngày trong tuần như đã nêu ở trên. tripNamePrompt: "Vui lòng cung cấp tên cho chuyến đi này:" @@ -659,11 +658,9 @@ components: arriveAt: "Đến nơi " leaveAt: "Rời đi lúc " TripSummaryPane: - happensOnDays: "Xảy ra vào: {days}" - notifications: >- - Thông báo: {leadTimeInMinutes} phút trước khi khởi hành theo lịch - trình - notificationsDisabled: "Thông báo: Đã tắt" + happensOnDays: "Xảy ra vào: {days}" + notifications: "{leadTimeInMinutes} phút trước khi khởi hành theo lịch trình" + notificationsDisabled: Thông báo đã tắt TripTools: copyLink: Sao chép URL header: Công cụ diff --git a/i18n/zh.yml b/i18n/zh.yml index 6fbc61ccf..7c822d921 100644 --- a/i18n/zh.yml +++ b/i18n/zh.yml @@ -518,7 +518,6 @@ components: vehicleName: 车辆 {vehicleNumber} TripBasicsPane: checkingItineraryExistence: 检查一周中每一天的行程存在… - selectAtLeastOneDay: 请至少选择一天进行监测. tripDaysPrompt: 您这次行程是在哪天进行的? tripIsAvailableOnDaysIndicated: 您的行程可以在上述一周的日子里进行. tripNamePrompt: "请为这次旅行提供一个名称:" @@ -589,9 +588,9 @@ components: arriveAt: "到达 " leaveAt: "离开 " TripSummaryPane: - happensOnDays: "发生在: {days}" - notifications: "通知: 预定出发前 {leadTimeInMinutes} " - notificationsDisabled: "通知: 已禁用" + happensOnDays: "发生在: {days}" + notifications: 预定出发前 {leadTimeInMinutes} + notificationsDisabled: "通知: 已禁用" TripTools: copyLink: 复制链接 header: 工具 diff --git a/lib/components/app/app-menu-item.tsx b/lib/components/app/app-menu-item.tsx index 236e3bc8e..ee3d360da 100644 --- a/lib/components/app/app-menu-item.tsx +++ b/lib/components/app/app-menu-item.tsx @@ -1,10 +1,12 @@ import { ChevronDown } from '@styled-icons/fa-solid/ChevronDown' import { ChevronUp } from '@styled-icons/fa-solid/ChevronUp' -import AnimateHeight from 'react-animate-height' -import React, { Component, HTMLAttributes, KeyboardEvent } from 'react' +import { getEntryRelativeTo } from '../util/get-entry-relative-to' +import AnimateHeight from 'react-animate-height' import Link from '../util/link' +import React, { Component, HTMLAttributes, KeyboardEvent } from 'react' + interface Props extends HTMLAttributes { href?: string icon?: JSX.Element @@ -17,20 +19,8 @@ interface Props extends HTMLAttributes { interface State { isExpanded: boolean } - -/** - * Helper method to find the element within the app menu at the given offset - * (e.g. previous or next) relative to the specified element. - * The query is limited to the app menu so that arrow navigation is contained within - * (tab navigation is not restricted). - */ -function getEntryRelativeTo(element: EventTarget, offset: 1 | -1): HTMLElement { - const entries = Array.from( - document.querySelectorAll('.app-menu a, .app-menu button') - ) - const elementIndex = entries.indexOf(element as HTMLElement) - return entries[elementIndex + offset] as HTMLElement -} +// Argument for document.querySelectorAll to target focusable elements. +const queryId = '.app-menu a, .app-menu button' /** * Renders a single entry from the hamburger menu. @@ -48,13 +38,13 @@ export default class AppMenuItem extends Component { subItems && this.setState({ isExpanded: false }) break case 'ArrowUp': - getEntryRelativeTo(element, -1)?.focus() + getEntryRelativeTo(queryId, element, -1)?.focus() break case 'ArrowRight': subItems && this.setState({ isExpanded: true }) break case 'ArrowDown': - getEntryRelativeTo(element, 1)?.focus() + getEntryRelativeTo(queryId, element, 1)?.focus() break case ' ': // For links (tagName "A" uppercase), trigger link on space for consistency with buttons. diff --git a/lib/components/form/batch-settings.tsx b/lib/components/form/batch-settings.tsx index 2ed424732..0dee76851 100644 --- a/lib/components/form/batch-settings.tsx +++ b/lib/components/form/batch-settings.tsx @@ -18,13 +18,13 @@ import { Search } from '@styled-icons/fa-solid/Search' import { SyncAlt } from '@styled-icons/fa-solid/SyncAlt' import { useIntl } from 'react-intl' import React, { useCallback, useContext, useState } from 'react' -import tinycolor from 'tinycolor2' import * as apiActions from '../../actions/api' import * as formActions from '../../actions/form' import { ComponentContext } from '../../util/contexts' import { generateModeSettingValues } from '../../util/api' import { getActiveSearch, hasValidLocation } from '../../util/state' +import { getBaseColor, getDarkenedBaseColor } from '../util/base-color' import { getFormattedMode } from '../../util/i18n' import { RoutingQueryCallResult } from '../../actions/api-constants' import { StyledIconWrapper } from '../util/styledIcon' @@ -49,7 +49,7 @@ type Props = { modeSettingValues: ModeSettingValues onPlanTripClick: () => void routingQuery: any - setUrlSearch: (evt: any) => void + setQueryParam: (evt: any) => void spacedOutModeSelector?: boolean updateQueryTimeIfLeavingNow: () => void } @@ -81,7 +81,7 @@ function BatchSettings({ modeSettingValues, onPlanTripClick, routingQuery, - setUrlSearch, + setQueryParam, spacedOutModeSelector, updateQueryTimeIfLeavingNow }: Props) { @@ -189,6 +189,17 @@ function BatchSettings({ updateQueryTimeIfLeavingNow ]) + /** + * Stores parameters in both the Redux `currentQuery` and URL + * @param params Params to store + */ + const _onSettingsUpdate = useCallback( + (params: any) => { + setQueryParam({ queryParamData: params, ...params }) + }, + [setQueryParam] + ) + const _toggleModeButton = useCallback( (buttonId: string, newState: boolean) => { let newButtons @@ -200,11 +211,11 @@ function BatchSettings({ // encodeQueryParams serializes the mode buttons for the URL // to get nice looking URL params and consistency - setUrlSearch( + _onSettingsUpdate( encodeQueryParams(queryParamConfig, { modeButtons: newButtons }) ) }, - [enabledModeButtons, setUrlSearch] + [enabledModeButtons, _onSettingsUpdate] ) /** @@ -217,11 +228,9 @@ function BatchSettings({ setModeSelectorPopup(!!modeSelectorPopup) }, [setModeSelectorPopup]) - // We can rely on this existing, as there is a default - const baseColor = getComputedStyle(document.documentElement).getPropertyValue( - '--main-base-color' - ) - const accentColor = tinycolor(baseColor).darken(10) + const baseColor = getBaseColor() + + const accentColor = getDarkenedBaseColor() return ( @@ -244,7 +253,7 @@ function BatchSettings({ id: 'components.BatchSearchScreen.modeSelectorLabel' })} modeButtons={processedModeButtons} - onSettingsUpdate={setUrlSearch} + onSettingsUpdate={_onSettingsUpdate} onToggleModeButton={_toggleModeButton} /> { const mapDispatchToProps = { routingQuery: apiActions.routingQuery, - setUrlSearch: apiActions.setUrlSearch, + setQueryParam: formActions.setQueryParam, updateQueryTimeIfLeavingNow: formActions.updateQueryTimeIfLeavingNow } diff --git a/lib/components/form/call-taker/advanced-options.js b/lib/components/form/call-taker/advanced-options.js index 07de56404..de97254ce 100644 --- a/lib/components/form/call-taker/advanced-options.js +++ b/lib/components/form/call-taker/advanced-options.js @@ -83,8 +83,8 @@ class AdvancedOptions extends Component { componentDidUpdate(prevProps) { const { routes } = this.props // Once routes are available, map them to the route options format. - if (!isEmpty(routes) && isEmpty(prevProps.routes)) { - const routeOptions = Object.values(routes).map(this.routeToOption) + const routeOptions = Object.values(routes).map(this.routeToOption) + if (routeOptions.length !== this.state.routeOptions.length) { this.setState({ routeOptions }) } } diff --git a/lib/components/form/connected-links.js b/lib/components/form/connected-links.js deleted file mode 100644 index 964809a7e..000000000 --- a/lib/components/form/connected-links.js +++ /dev/null @@ -1,47 +0,0 @@ -/* eslint-disable react/prop-types */ -import { connect } from 'react-redux' -import { Link } from 'react-router-dom' -import { LinkContainer } from 'react-router-bootstrap' -import { Redirect } from 'react-router' -import React from 'react' - -/** - * This function enhances the routing components imported above - * by preserving the itinerary search query from the redux state - * when redirecting the user between the main map and account-related pages, - * so that when the user returns to the map, the itinerary that was previously - * displayed is shown again. - * Implementers only need to specify the 'to' route and - * do not need to hook to redux store to retrieve the itinerary search query. - * @param RoutingComponent The routing component to enhance. - * @returns A new component that passes the redux search params to - * the RoutingComponent's 'to' prop. - */ -const withQueryParams = - (RoutingComponent) => - // eslint-disable-next-line react/display-name - ({ children, queryParams, to, ...props }) => - to ? ( - - {children} - - ) : ( - children - ) - -// For connecting to the redux store -const mapStateToProps = (state, ownProps) => { - return { - queryParams: state.router.location.search - } -} - -// Enhance routing components, connect the result to redux, -// and export. -export const LinkContainerWithQuery = connect(mapStateToProps)( - withQueryParams(LinkContainer) -) -export const LinkWithQuery = connect(mapStateToProps)(withQueryParams(Link)) -export const RedirectWithQuery = connect(mapStateToProps)( - withQueryParams(Redirect) -) diff --git a/lib/components/form/redirect-with-query.ts b/lib/components/form/redirect-with-query.ts new file mode 100644 index 000000000..5103c01f9 --- /dev/null +++ b/lib/components/form/redirect-with-query.ts @@ -0,0 +1,20 @@ +import { connect } from 'react-redux' +import { Redirect } from 'react-router' + +import { AppReduxState } from '../../util/state-types' + +interface OwnProps { + to: string +} + +// For connecting to the redux store +const mapStateToProps = (state: AppReduxState, ownProps: OwnProps) => { + return { + to: { + pathname: ownProps.to, + search: state.router.location.search + } + } +} + +export default connect(mapStateToProps)(Redirect) diff --git a/lib/components/form/user-settings.js b/lib/components/form/user-settings.js index cae8a6280..15912604b 100644 --- a/lib/components/form/user-settings.js +++ b/lib/components/form/user-settings.js @@ -16,8 +16,8 @@ import { getPlaceMainText, isOtpMiddleware } from '../../util/user' -import { LinkWithQuery } from '../form/connected-links' import { StyledMainPanelPlace } from '../user/places/styled' +import Link from '../util/link' import PlaceShortcut from '../user/places/place-shortcut' import { summarizeQuery } from './user-settings-i18n' @@ -249,9 +249,7 @@ class UserSettings extends Component { values={{ manageLink: (linkText) => ( - - {linkText} - + {linkText} ) }} diff --git a/lib/components/map/connected-transit-vehicle-overlay.js b/lib/components/map/connected-transit-vehicle-overlay.js index 88fbb273c..bb08d87db 100644 --- a/lib/components/map/connected-transit-vehicle-overlay.js +++ b/lib/components/map/connected-transit-vehicle-overlay.js @@ -155,6 +155,7 @@ const mapStateToProps = (state) => { color: route?.color ? '#' + route.color : null, IconContainer: ConfiguredIconContainer, iconPadding: state.otp.config?.routeViewer?.vehicleIconPadding, + maxVehicleAge: state.otp.config?.routeViewer?.maxRealtimeVehicleAge, // Note: with OTP2, we are showing route stops along with the route alignment, // and vehicle direction arrows become difficult to distinguish from the stop circles. TooltipSlot: injectIntl(VehicleTooltip), diff --git a/lib/components/map/point-popup.tsx b/lib/components/map/point-popup.tsx index d9e902dbd..b13e3ce3a 100644 --- a/lib/components/map/point-popup.tsx +++ b/lib/components/map/point-popup.tsx @@ -4,11 +4,12 @@ import { Search } from '@styled-icons/fa-solid/Search' import { useIntl, WrappedComponentProps } from 'react-intl' import { useMap } from 'react-map-gl' import FromToLocationPicker from '@opentripplanner/from-to-location-picker' -import React, { useCallback } from 'react' +import React, { useCallback, useMemo } from 'react' import styled from 'styled-components' import type { Location } from '@opentripplanner/types' import * as mapActions from '../../actions/map' +import { getEntryRelativeTo } from '../util/get-entry-relative-to' import { Icon } from '../util/styledIcon' import { renderCoordinates } from '../../util/i18n' import { SetLocationHandler, ZoomToPlaceHandler } from '../util/types' @@ -50,6 +51,49 @@ function MapPopup({ const intl = useIntl() const { current: map } = useMap() + /** + * Creates a focus trap within map popup that can be dismissed with esc. + * https://medium.com/cstech/achieving-focus-trapping-in-a-react-modal-component-3f28f596f35b + */ + + /** + * Check to see which keys are down by tracking keyUp and keyDown events + * in order to see when "tab" and "shift" are pressed at the same time. + */ + let keysDown: string[] = useMemo(() => [], []) + + // Argument for document.querySelectorAll to target focusable elements. + const queryId = 'button#zoom-btn, #from-to button' + + const _handleKeyDown = useCallback( + (e) => { + keysDown.push(e.key) + const element = e.target as HTMLElement + switch (e.key) { + case 'Escape': + clearMapPopupLocation() + break + case 'Tab': + if (keysDown.includes('Shift')) { + e.preventDefault() + getEntryRelativeTo(queryId, element, -1)?.focus() + } else { + e.preventDefault() + getEntryRelativeTo(queryId, element, 1)?.focus() + } + break + case ' ': + break + default: + } + }, + [clearMapPopupLocation, keysDown] + ) + + const _handleKeyUp = (e: any) => { + keysDown = keysDown.filter((key) => key !== e.key) + } + // Memoize callbacks that shouldn't change from one render to the next. const onSetLocationFromPopup = useCallback( (payload) => { @@ -72,37 +116,40 @@ function MapPopup({ }) return ( - - - - {typeof popupName === 'string' && popupName.split(',').length > 3 - ? popupName.split(',').splice(0, 3).join(',') - : popupName} - - zoomToPlace(map, mapPopupLocation, DEFAULT_ZOOM)} - title={zoomButtonLabel} - > - - - -
                                                          - -
                                                          -
                                                          +
                                                          + + + + {typeof popupName === 'string' && popupName.split(',').length > 3 + ? popupName.split(',').splice(0, 3).join(',') + : popupName} + + zoomToPlace(map, mapPopupLocation, DEFAULT_ZOOM)} + title={zoomButtonLabel} + > + + + +
                                                          + +
                                                          +
                                                          +
                                                          ) } diff --git a/lib/components/mobile/mobile.css b/lib/components/mobile/mobile.css index 9239e1e49..b0b6fb3db 100644 --- a/lib/components/mobile/mobile.css +++ b/lib/components/mobile/mobile.css @@ -269,3 +269,10 @@ .otp.mobile .route-viewer-header { margin: 0; } + +@media (max-width: 768px){ + .panel-default { + width: 90%; + } +} + diff --git a/lib/components/narrative/default/itinerary.css b/lib/components/narrative/default/itinerary.css index 91a5e089c..c996b1383 100644 --- a/lib/components/narrative/default/itinerary.css +++ b/lib/components/narrative/default/itinerary.css @@ -399,7 +399,9 @@ } /* Allow banned/preferred routes to float on top */ -#bannedRoutes, -#preferredRoutes { +#bannedRoutes { z-index: 100; } +#preferredRoutes { + z-index: 101; +} diff --git a/lib/components/narrative/save-trip-button.js b/lib/components/narrative/save-trip-button.tsx similarity index 58% rename from lib/components/narrative/save-trip-button.js rename to lib/components/narrative/save-trip-button.tsx index 341e7db24..e3e1579f1 100644 --- a/lib/components/narrative/save-trip-button.js +++ b/lib/components/narrative/save-trip-button.tsx @@ -1,5 +1,3 @@ -// TODO: Typescript -/* eslint-disable react/prop-types */ import { Ban } from '@styled-icons/fa-solid/Ban' import { connect } from 'react-redux' import { FormattedMessage, useIntl } from 'react-intl' @@ -8,36 +6,52 @@ import { OverlayTrigger, Tooltip } from 'react-bootstrap' import { PlusCircle } from '@styled-icons/fa-solid/PlusCircle' import React from 'react' +import { AppReduxState } from '../../util/state-types' import { CREATE_TRIP_PATH } from '../../util/constants' import { getActiveItinerary } from '../../util/state' import { IconWithText } from '../util/styledIcon' -import { itineraryCanBeMonitored } from '../../util/itinerary' -import { LinkContainerWithQuery } from '../form/connected-links' +import { + itineraryCanBeMonitored, + ItineraryWithOtp1HailedCar +} from '../../util/itinerary' +import { PersistenceConfig } from '../../util/config-types' +import { UnstyledLink } from '../user/styled' +import { User } from '../user/types' + +interface Props { + itinerary?: ItineraryWithOtp1HailedCar + loggedInUser?: User + persistence?: PersistenceConfig +} /** * This connected component encapsulates the states and behavior of the button * to save an itinerary for notifications. */ -const SaveTripButton = ({ itinerary, loggedInUser, persistence }) => { +const SaveTripButton = ({ + itinerary, + loggedInUser, + persistence +}: Props): JSX.Element | null => { const intl = useIntl() // We are dealing with the following states: // 1. Persistence disabled => just return null // 2. User is not logged in => render something like: "Please log in to save trip". // 3. itin cannot be monitored => disable the button with prompt and tooltip. + if (!persistence || !persistence.enabled) return null + let buttonDisabled let buttonText let tooltipText - let iconType let ButtonIcon - if (!persistence || !persistence.enabled) { - return null - } else if (!loggedInUser) { + if (!loggedInUser) { buttonDisabled = true buttonText = - iconType = 'lock' ButtonIcon = Lock + // Must get text using intl.formatMessage here because the rendering + // OverlayTrigger occurs outside of the IntlProvider context. tooltipText = intl.formatMessage({ id: 'components.SaveTripButton.signInTooltip' }) @@ -46,40 +60,27 @@ const SaveTripButton = ({ itinerary, loggedInUser, persistence }) => { buttonText = ( ) - iconType = 'ban' ButtonIcon = Ban tooltipText = intl.formatMessage({ id: 'components.SaveTripButton.cantSaveTooltip' }) - } else { - buttonText = ( - - ) - iconType = 'plus-circle' - ButtonIcon = PlusCircle } - const button = ( - - ) // Show tooltip with help text if button is disabled. if (buttonDisabled) { + const button = ( + + ) return ( - {/* Must get text using intl.formatMessage here because the rendering - of OverlayTrigger seems to occur outside of the IntlProvider context. */} - {tooltipText} - - } + overlay={{tooltipText}} placement="top" > {/* An active element around the disabled button is necessary @@ -92,18 +93,20 @@ const SaveTripButton = ({ itinerary, loggedInUser, persistence }) => { } return ( - - {button} - + + + + + ) } // connect to the redux store -const mapStateToProps = (state, ownProps) => { +const mapStateToProps = (state: AppReduxState) => { const { persistence } = state.otp.config return { - itinerary: getActiveItinerary(state), + itinerary: getActiveItinerary(state) as ItineraryWithOtp1HailedCar, loggedInUser: state.user.loggedInUser, persistence } diff --git a/lib/components/user/monitored-trip/saved-trip-list.tsx b/lib/components/user/monitored-trip/saved-trip-list.tsx index bc8e2fdf8..0df5ff909 100644 --- a/lib/components/user/monitored-trip/saved-trip-list.tsx +++ b/lib/components/user/monitored-trip/saved-trip-list.tsx @@ -1,25 +1,22 @@ -import { Button, Panel } from 'react-bootstrap' import { connect } from 'react-redux' import { FormattedMessage, injectIntl, IntlShape, useIntl } from 'react-intl' -import { Pause } from '@styled-icons/fa-solid/Pause' -import { PencilAlt } from '@styled-icons/fa-solid/PencilAlt' -import { Play } from '@styled-icons/fa-solid/Play' +import { Panel } from 'react-bootstrap' import { TriangleExclamation } from '@styled-icons/fa-solid/TriangleExclamation' import { withAuthenticationRequired } from '@auth0/auth0-react' import React, { Component } from 'react' -import * as uiActions from '../../../actions/ui' import * as userActions from '../../../actions/user' import { AppReduxState } from '../../../util/state-types' +import { Edit } from '@styled-icons/fa-solid' import { IconWithText } from '../../util/styledIcon' -import { InlineLoading } from '../../narrative/loading' import { MonitoredTrip } from '../types' import { PageHeading, TripHeader, TripPanelAlert, TripPanelFooter, - TripPanelHeading + TripPanelHeading, + TripPanelTitle } from '../styled' import { RETURN_TO_CURRENT_ROUTE } from '../../../util/ui' import { TRIPS_PATH } from '../../../util/constants' @@ -27,9 +24,18 @@ import AccountPage from '../account-page' import AwaitingScreen from '../awaiting-screen' import BackToTripPlanner from '../back-to-trip-planner' import PageTitle from '../../util/page-title' + +import styled from 'styled-components' + import withLoggedInUserSupport from '../with-logged-in-user-support' import getRenderData from './trip-status-rendering-strategies' +import InvisibleA11yLabel from '../../util/invisible-a11y-label' + +import { ComponentContext } from '../../../util/contexts' +import Link from '../../util/link' +import MetroItineraryRoutes from '../../narrative/metro/metro-itinerary-routes' + import TripSummaryPane from './trip-summary-pane' interface ItemOwnProps { @@ -39,7 +45,6 @@ interface ItemOwnProps { interface ItemProps extends ItemOwnProps { intl: IntlShape renderData: any - routeTo: (url: string) => void togglePauseTrip: (trip: MonitoredTrip, intl: IntlShape) => void } @@ -51,6 +56,22 @@ interface Props { trips?: MonitoredTrip[] } +const TripContainer = styled.div` + align-items: center; + display: flex; + flex-direction: column; + justify-content: center; +` +// Prevent the invisible header in route-blocks from causing white space +const RouteBlockGrid = styled.div` + display: grid; + grid-template-columns: 2; + + span { + grid-row: 1; + } +` + /** * This class manages events and rendering for one item in the saved trip list. */ @@ -62,21 +83,14 @@ class TripListItem extends Component { } } + static contextType = ComponentContext + componentDidUpdate = (prevProps: ItemProps) => { if (prevProps.trip.isActive !== this.props.trip.isActive) { this.setState({ pendingRequest: false }) } } - /** - * Navigate to the saved trip's URL #/TRIPS_PATH/trip-id-123. - * (There shouldn't be a need to encode the ids from Mongo.) - */ - _handleEditTrip = () => { - const { routeTo, trip } = this.props - routeTo(`${TRIPS_PATH}/${trip.id}`) - } - /** * Pauses or resumes the specified trip. */ @@ -87,7 +101,7 @@ class TripListItem extends Component { } render() { - const { renderData, trip } = this.props + const { intl, renderData, trip } = this.props const { itinerary } = trip const { legs } = itinerary const { alerts, shouldRenderAlerts } = renderData @@ -96,63 +110,59 @@ class TripListItem extends Component { // - get the 'to' location of the last leg. const from = legs[0].from const to = legs[legs.length - 1].to + const editTripPath = `${TRIPS_PATH}/${trip.id}` + const { LegIcon } = this.context return ( - {shouldRenderAlerts && ( - - - - - - )} - - {trip.tripName} - - {from.name}
                                                          , - to: {to.name} - }} - /> - - + + + {trip.tripName} + + + + + + + + + + {/* TODO: Fix issues with custom route renderer */} + + - - - - - - + + ) } @@ -168,7 +178,6 @@ const itemMapStateToProps = (state: AppReduxState, { trip }: ItemOwnProps) => { } const itemMapDispatchToProps = { - routeTo: uiActions.routeTo, togglePauseTrip: userActions.togglePauseTrip } const ConnectedTripListItem = connect( @@ -218,9 +227,11 @@ const SavedTripList = ({ trips }: Props) => { - {trips.map((trip) => ( - - ))} + + {trips.map((trip) => ( + + ))} + ) } diff --git a/lib/components/user/monitored-trip/saved-trip-screen.js b/lib/components/user/monitored-trip/saved-trip-screen.js index 9f0560786..14ab18f8b 100644 --- a/lib/components/user/monitored-trip/saved-trip-screen.js +++ b/lib/components/user/monitored-trip/saved-trip-screen.js @@ -10,7 +10,7 @@ import React, { Component } from 'react' import * as formActions from '../../../actions/form' import * as uiActions from '../../../actions/ui' import * as userActions from '../../../actions/user' -import { ALL_DAYS, arrayToDayFields } from '../../../util/monitored-trip' +import { arrayToDayFields } from '../../../util/monitored-trip' import { getActiveItineraries, getActiveSearch } from '../../../util/state' import { getItineraryDefaultMonitoredDays } from '../../../util/itinerary' import { RETURN_TO_CURRENT_ROUTE } from '../../../util/ui' @@ -27,7 +27,6 @@ import TripNotificationsPane from './trip-notifications-pane' import TripSummaryPane from './trip-summary-pane' // The validation schema shape for the form fields. -// TODO: add fields here as they are implemented. const validationSchemaShape = { isActive: yup.boolean(), leadTimeInMinutes: yup.number().positive().integer(), @@ -38,20 +37,6 @@ const validationSchemaShape = { // which IDs are in the code. .required('trip-name-required') } -// Add the checks on each day that at least one day is monitored. -ALL_DAYS.forEach((day) => { - validationSchemaShape[day] = yup.boolean().test( - 'one-day-selected', - 'selectAtLeastOneDay', // not directly shown. - function () { - let selectedDays = 0 - ALL_DAYS.forEach((day) => { - if (this.parent[day]) selectedDays++ - }) - return selectedDays !== 0 - } - ) -}) /** * Checks that the maximum allowed number of saved trips has not been reached. diff --git a/lib/components/user/monitored-trip/trip-basics-pane.tsx b/lib/components/user/monitored-trip/trip-basics-pane.tsx index dfb5149e4..858cc0ec2 100644 --- a/lib/components/user/monitored-trip/trip-basics-pane.tsx +++ b/lib/components/user/monitored-trip/trip-basics-pane.tsx @@ -5,20 +5,23 @@ import { FormGroup, Glyphicon, HelpBlock, - ProgressBar + ProgressBar, + Radio } from 'react-bootstrap' import { Field, FormikProps } from 'formik' import { FormattedMessage, injectIntl } from 'react-intl' import { Prompt } from 'react-router' // @ts-expect-error FormikErrorFocus does not support TypeScript yet. import FormikErrorFocus from 'formik-error-focus' -import React, { Component } from 'react' +import React, { Component, FormEventHandler } from 'react' import styled from 'styled-components' import type { IntlShape, WrappedComponentProps } from 'react-intl' import * as userActions from '../../../actions/user' import { ALL_DAYS, + arrayToDayFields, + dayFieldsToArray, getFormattedDayOfWeekPlural } from '../../../util/monitored-trip' import { AppReduxState } from '../../../util/state-types' @@ -31,7 +34,7 @@ import FormattedValidationError from '../../util/formatted-validation-error' import InvisibleA11yLabel from '../../util/invisible-a11y-label' import TripStatus from './trip-status' -import TripSummary from './trip-summary' +import TripSummary from './trip-duration-summary' type TripBasicsProps = WrappedComponentProps & FormikProps & { @@ -45,8 +48,9 @@ type TripBasicsProps = WrappedComponentProps & itineraryExistence?: ItineraryExistence } -// FIXME: move to shared types file -type ErrorStates = 'success' | 'warning' | 'error' | null | undefined +interface State { + selectedDays: string[] | null +} // Styles. const AvailableDays = styled(FieldSet)` @@ -113,11 +117,19 @@ const AvailableDays = styled(FieldSet)` } ` +function isDisabled(day: string, itineraryExistence?: ItineraryExistence) { + return itineraryExistence && !itineraryExistence[day]?.valid +} + /** * This component shows summary information for a trip * and lets the user edit the trip name and day. */ -class TripBasicsPane extends Component { +class TripBasicsPane extends Component { + state = { + selectedDays: null + } + /** * For new trips only, update the Formik state to * uncheck days for which the itinerary is not available. @@ -138,6 +150,45 @@ class TripBasicsPane extends Component { } } + _getDaysFromItineraryExistence = () => { + const { itineraryExistence, values: trip } = this.props + const finalItineraryExistence = + trip.itineraryExistence || itineraryExistence + return ALL_DAYS.filter((day) => finalItineraryExistence?.[day]?.valid) + } + + _handleRecurringTrip: FormEventHandler = (e) => { + const input = e.target as HTMLInputElement + if (input.checked) { + const { setValues, values } = this.props + const { selectedDays } = this.state + + // Restore previously checked monitored days. + // If none were set, use the itinerary existence values (at least one day should exist in there). + setValues({ + ...values, + ...arrayToDayFields( + selectedDays || this._getDaysFromItineraryExistence() + ) + }) + } + } + + _handleOneTimeTrip: FormEventHandler = (e) => { + const input = e.target as HTMLInputElement + if (input.checked) { + const { setValues, values } = this.props + // Hold on to monitored days + this.setState({ selectedDays: dayFieldsToArray(values) }) + + // Uncheck all monitored days + setValues({ + ...values, + ...arrayToDayFields([]) + }) + } + } + componentDidMount() { // Check itinerary availability (existence) for all days if not already done. const { checkItineraryExistence, intl, values: monitoredTrip } = this.props @@ -188,18 +239,13 @@ class TripBasicsPane extends Component {

                                                          ) } else { - // Show an error indication when - // - monitoredTrip.tripName is not blank and that tripName is not already used. - // - no day is selected (show a combined error indication). + // Show an error indication when monitoredTrip.tripName is not blank, or that tripName is already used. const errorStates = getErrorStates(this.props) - - let monitoredDaysValidationState: ErrorStates = null - ALL_DAYS.forEach((day) => { - if (!monitoredDaysValidationState) { - monitoredDaysValidationState = errorStates[day] - } - }) - + const monitoredDays = dayFieldsToArray(monitoredTrip) + const isOneTime = monitoredDays.length === 0 + const errorCheckingTrip = ALL_DAYS.every((day) => + isDisabled(day, finalItineraryExistence) + ) return (
                                                          {/* TODO: This component does not block navigation on reload or using the back button. @@ -230,71 +276,101 @@ class TripBasicsPane extends Component { - - - - - - {ALL_DAYS.map((day) => { - const isDayDisabled = - finalItineraryExistence && - !finalItineraryExistence[day]?.valid - const boxClass = isDayDisabled - ? 'alert-danger' - : monitoredTrip[day] - ? 'bg-primary' - : '' - const notAvailableText = isDayDisabled - ? intl.formatMessage( - { id: 'components.TripBasicsPane.tripNotAvailableOnDay' }, - { repeatedDay: getFormattedDayOfWeekPlural(day, intl) } + + + + + + + {errorCheckingTrip && ( + <> + {/* FIXME: Temporary solution until itinerary existence check is fixed. */} +
                                                          + + + )} +
                                                          + {!isOneTime && ( + <> + + {ALL_DAYS.map((day) => { + const isDayDisabled = isDisabled( + day, + finalItineraryExistence ) - : '' - - return ( - - - - - {notAvailableText} - - ) - })} - - - {finalItineraryExistence ? ( - - ) : ( - - } - now={100} - /> - )} - - - {monitoredDaysValidationState && ( - - )} - + ) + })} +
                                                          + + {finalItineraryExistence ? ( + + ) : ( + + } + now={100} + /> + )} + + + )} + + + {/* Scroll to the trip name/days fields if submitting and there is an error on these fields. */} diff --git a/lib/components/user/monitored-trip/trip-summary.tsx b/lib/components/user/monitored-trip/trip-duration-summary.tsx similarity index 66% rename from lib/components/user/monitored-trip/trip-summary.tsx rename to lib/components/user/monitored-trip/trip-duration-summary.tsx index ca5c700c9..f73478186 100644 --- a/lib/components/user/monitored-trip/trip-summary.tsx +++ b/lib/components/user/monitored-trip/trip-duration-summary.tsx @@ -1,24 +1,20 @@ import { FormattedMessage, FormattedTime } from 'react-intl' -import React, { useContext } from 'react' +import React from 'react' import styled from 'styled-components' -import { ComponentContext } from '../../../util/contexts' import { MonitoredTripProps } from '../types' import FormattedDuration from '../../util/formatted-duration' import InvisibleA11yLabel from '../../util/invisible-a11y-label' -const SummaryContainer = styled.div` - margin-bottom: 10px; +const Divider = styled.span` + margin: 0 7px; ` const TripSummary = ({ monitoredTrip }: MonitoredTripProps): JSX.Element => { const { itinerary } = monitoredTrip const { duration, endTime, startTime } = itinerary - // @ts-expect-error TODO: add ModesAndRoutes to ItineraryBody attribute of ComponentContext - const { ItineraryBody, LegIcon } = useContext(ComponentContext) - const ModesAndRoutes = ItineraryBody.ModesAndRoutes return ( - + {/* Set up invisible "labels" for each itinerary field, and comma, so that the output of screen readers is more intelligible. */} @@ -29,11 +25,11 @@ const TripSummary = ({ monitoredTrip }: MonitoredTripProps): JSX.Element => { , - + + - - + ) } diff --git a/lib/components/user/monitored-trip/trip-monitored-days.tsx b/lib/components/user/monitored-trip/trip-monitored-days.tsx new file mode 100644 index 000000000..16861f2e4 --- /dev/null +++ b/lib/components/user/monitored-trip/trip-monitored-days.tsx @@ -0,0 +1,77 @@ +import { FormattedList, FormattedMessage, useIntl } from 'react-intl' + +import InvisibleA11yLabel from '../../util/invisible-a11y-label' +import React from 'react' + +import { ALL_DAYS } from '../../../util/monitored-trip' +import { getBaseColor } from '../../util/base-color' +import FormattedDayOfWeek from '../../util/formatted-day-of-week' +import FormattedDayOfWeekCompact from '../../util/formatted-day-of-week-compact' + +import styled from 'styled-components' + +interface Props { + days: string[] +} + +const DayCircleContainer = styled.div` + display: flex; + gap: 4px; +` + +const MonitoredDayCircle = styled.span<{ + baseColor: string + monitored: boolean +}>` + align-items: center; + background-color: ${(props) => + props.monitored ? props.baseColor : `${props.baseColor}20`}; + border-radius: 50%; + color: ${(props) => (props.monitored ? 'white' : 'inherit')}; + display: flex; + height: 3rem; + justify-content: center; + opacity: ${(props) => (props.monitored ? 1 : 0.7)}; + text-transform: capitalize; + width: 3rem; + + span { + font-family: 'SF Pro Display', 'Inter', sans-serif; + margin-top: 1px; + } +` + +const MonitoredDays = ({ days }: Props) => { + const monitoredDaysList = ( + ( + + ))} + /> + ) + + const baseColor = getBaseColor() + const DayCircles = ALL_DAYS.map((d) => { + const dayAbbrev = + const monitored = days?.includes(d) + return ( + + {dayAbbrev} + + ) + }) + return ( + <> + {DayCircles} + + + + + ) +} + +export default MonitoredDays diff --git a/lib/components/user/monitored-trip/trip-status-rendering-strategies/index.js b/lib/components/user/monitored-trip/trip-status-rendering-strategies/index.js index d5a226659..9775c779e 100644 --- a/lib/components/user/monitored-trip/trip-status-rendering-strategies/index.js +++ b/lib/components/user/monitored-trip/trip-status-rendering-strategies/index.js @@ -3,6 +3,7 @@ import inactiveRenderer from './inactive-renderer' import nextTripNotPossibleRenderer from './next-trip-not-possible-renderer' import noLongerPossibleRenderer from './no-longer-possible-renderer' import notYetCalculatedTripRenderer from './not-yet-calculated-renderer' +import pastTripRenderer from './past-trip-renderer' import snoozedRenderer from './snoozed-renderer' import upcomingTripRenderer from './upcoming-trip-renderer' @@ -19,7 +20,7 @@ import upcomingTripRenderer from './upcoming-trip-renderer' * trip monitor might have already calculated some realtime data) * - the trip is active (currently in progress) */ -export default function getRenderData (props) { +export default function getRenderData(props) { const { monitoredTrip } = props const journeyState = monitoredTrip && monitoredTrip.journeyState @@ -38,6 +39,8 @@ export default function getRenderData (props) { data = upcomingTripRenderer(props) } else if (journeyState.tripStatus === 'TRIP_ACTIVE') { data = activeTripRenderer(props) + } else if (journeyState.tripStatus === 'PAST_TRIP') { + data = pastTripRenderer(monitoredTrip) } else { // trip status not yet calculated data = notYetCalculatedTripRenderer(monitoredTrip) diff --git a/lib/components/user/monitored-trip/trip-status-rendering-strategies/past-trip-renderer.tsx b/lib/components/user/monitored-trip/trip-status-rendering-strategies/past-trip-renderer.tsx new file mode 100644 index 000000000..fc4264d97 --- /dev/null +++ b/lib/components/user/monitored-trip/trip-status-rendering-strategies/past-trip-renderer.tsx @@ -0,0 +1,25 @@ +import { FormattedMessage } from 'react-intl' +import React from 'react' + +import { MonitoredTrip, MonitoredTripRenderData } from '../../types' + +import baseRenderer from './base-renderer' + +/** + * Rendering info for a one-time trip in the past. + */ +export default function pastTripRenderer( + monitoredTrip: MonitoredTrip +): MonitoredTripRenderData { + const data = baseRenderer(monitoredTrip) as unknown as MonitoredTripRenderData + + data.headingText = ( + + ) + data.bodyText = ( + + ) + data.shouldRenderAlerts = false + + return data +} diff --git a/lib/components/user/monitored-trip/trip-summary-pane.tsx b/lib/components/user/monitored-trip/trip-summary-pane.tsx index d1fb81f03..a448bb42c 100644 --- a/lib/components/user/monitored-trip/trip-summary-pane.tsx +++ b/lib/components/user/monitored-trip/trip-summary-pane.tsx @@ -1,21 +1,122 @@ -import { FormattedList, FormattedMessage } from 'react-intl' +import { Bell, BellSlash, Calendar, Clock } from '@styled-icons/fa-regular' +import { FormattedDate, FormattedMessage, useIntl } from 'react-intl' +import LocationIcon from '@opentripplanner/location-icon' import React from 'react' +import styled from 'styled-components' import { dayFieldsToArray } from '../../../util/monitored-trip' +import { InlineLoading } from '../../narrative/loading' import { MonitoredTripProps } from '../types' -import FormattedDayOfWeek from '../../util/formatted-day-of-week' -import Strong from '../../util/strong-text' +import InvisibleA11yLabel from '../../util/invisible-a11y-label' -import TripSummary from './trip-summary' +import MonitoredDays from './trip-monitored-days' +import TripSummary from './trip-duration-summary' /** * Displays the summary information of a monitored trip. */ + +const SavedTripBody = styled.div` + display: flex; + justify-content: center; + padding: 0 0 0 15px; + + @media (max-width: 768px) { + flex-direction: column; + padding: 0; + } +` + +const LocationDetails = styled.div` + align-items: start; + border-right: 1px solid #ddd; + display: flex; + flex-direction: column; + gap: 10px; + justify-content: center; + padding: 20px; + padding-right: 30px; + width: 50%; + + @media (max-width: 768px) { + align-items: center; + border-bottom: 1px solid #ddd; + border-right: 0; + border-top: 1px solid #ddd; + padding: 30px 20px 30px 20px; + width: 100%; + } +` +const ItineraryDetails = styled.div` + display: flex; + justify-content: center; + padding: 20px; + padding-left: 30px; + + @media (max-width: 768px) { + padding-top: 30px; + width: 100%; + } +` +const TextWIcon = styled.div` + align-items: flex-start; + display: flex; + gap: 7px; + justify-content: left; + // TODO: Do this in grid + width: 250px; + + svg { + flex-shrink: 0; + } +` + +const TripDetailWithIcon = styled(TextWIcon)` + align-items: center; + gap: 12px; + // TODO: Do this in grid + width: 273px; + + svg { + width: 16px; + } + + &:last-of-type { + align-items: flex-start; + + svg { + margin-top: 2px; + } + } +` + +const TripDetailsList = styled.ul` + align-items: start; + display: flex; + flex-direction: column; + gap: 15px; + justify-content: center; + list-style: none; + padding: 0; +` + +const ToggleNotificationButton = styled.button` + background: transparent; + border: none; + font-style: italic; + padding: 0; + text-decoration: underline; +` + const TripSummaryPane = ({ - monitoredTrip + from, + handleTogglePauseMonitoring, + monitoredTrip, + pendingRequest, + to }: MonitoredTripProps): JSX.Element => { + const intl = useIntl() const { itinerary, leadTimeInMinutes } = monitoredTrip - if (!itinerary) { return (
                                                          @@ -23,39 +124,122 @@ const TripSummaryPane = ({
                                                          ) } else { - const days = ( - ( - - ))} - /> + const monitoredDays = dayFieldsToArray(monitoredTrip) + const isOneTime = monitoredDays.length === 0 + // For one-time trips, just print the date the trip is taken. + // For recurrent trips, print the days the trip will be monitored. + const displayedDays = isOneTime ? ( + + ) : ( + ) + const testHandle = () => { + if (handleTogglePauseMonitoring) { + handleTogglePauseMonitoring() + } + } + + const notificationLabel = intl.formatMessage({ + id: 'components.ExistingAccountDisplay.notifications' + }) + + const ICON_SIZE = 14 + return ( - <> - {/* TODO: use the modern itinerary summary built for trip comparison. */} - -

                                                          + + -

                                                          -

                                                          - {monitoredTrip.isActive ? ( - - ) : ( - - )} -

                                                          - + + + + {/* Location Icon does not allow a title prop so use a span wrapper for a title tooltip */} + + + + {from?.name} + + + + + + {to?.name} + + + + + {/* Trip time and duration */} + + + + + {/* Available trip days */} + + + {displayedDays} + + {/* Trip notification info */} + + {monitoredTrip.isActive ? ( + + ) : ( + + )} + + {monitoredTrip.isActive ? ( + + ) : ( + + )} +
                                                          + + {pendingRequest === 'pause' ? ( + /* Make loader fit */ + + ) : monitoredTrip.isActive ? ( + + ) : ( + + )} + +
                                                          +
                                                          +
                                                          +
                                                          + ) } } diff --git a/lib/components/user/nav-login-button.tsx b/lib/components/user/nav-login-button.tsx index 59b5b3e1e..078b2eb34 100644 --- a/lib/components/user/nav-login-button.tsx +++ b/lib/components/user/nav-login-button.tsx @@ -6,34 +6,30 @@ import React, { HTMLAttributes } from 'react' import styled from 'styled-components' import { Dropdown } from '../util/dropdown' -import { LinkContainerWithQuery } from '../form/connected-links' import { NewWindowIconA11y } from '../util/externalLink' import { UnstyledButton } from '../util/unstyled-button' import InvisibleA11yLabel from '../util/invisible-a11y-label' import NavbarItem from '../app/nav-item' +import { UnstyledLink } from './styled' + const Avatar = styled.img` height: 2em; margin: -15px 0; width: 2em; ` -const UnstyledHelpLink = styled.a` +const NavUnstyledLink = styled(UnstyledLink)` display: block; - color: inherit; - &:hover { - color: inherit; - text-decoration: none; - } ` -type Link = { +type LinkData = { messageId: string target?: string url: string } interface Props extends HTMLAttributes { - links: Link[] + links: LinkData[] onSignInClick: () => void onSignOutClick: () => void profile?: User | null @@ -87,34 +83,27 @@ const NavLoginButton = ({ links.map((link, i) => { if (link.url.startsWith('http')) { return ( -
                                                        1. - +
                                                        2. + - +
                                                        3. ) } return ( - -
                                                        4. - - {link.messageId === 'myAccount' ? ( // messageId is 'myAccount' or 'help' - - ) : ( - - )} - -
                                                        5. -
                                                          +
                                                        6. + + {link.messageId === 'myAccount' ? ( // messageId is 'myAccount' or 'help' + + ) : ( + + )} + +
                                                        7. ) })} diff --git a/lib/components/user/places/place.tsx b/lib/components/user/places/place.tsx index 6b3325c17..c862f0fb4 100644 --- a/lib/components/user/places/place.tsx +++ b/lib/components/user/places/place.tsx @@ -3,12 +3,12 @@ import { Search } from '@styled-icons/fa-solid/Search' import { TrashAlt } from '@styled-icons/fa-solid/TrashAlt' import { useIntl } from 'react-intl' import React, { HTMLAttributes, ReactNode, useContext } from 'react' -import styled from 'styled-components' +import styled, { css } from 'styled-components' import { ComponentContext } from '../../../util/contexts' -import { LinkContainerWithQuery } from '../../form/connected-links' import { StyledIconWrapper } from '../../util/styledIcon' import InvisibleA11yLabel from '../../util/invisible-a11y-label' +import Link from '../../util/link' interface Props extends HTMLAttributes { /** The action text shown for accessibility purposes */ @@ -48,7 +48,7 @@ const Container = styled.li` // styled.js to define multiple flavors of the Place component, // without creating circular references between that file and this file. -export const PlaceButton = styled(Button)` +const placeButtonCss = css` background: none; flex: 1 0 0; overflow: hidden; @@ -56,6 +56,14 @@ export const PlaceButton = styled(Button)` text-overflow: ellipsis; ` +export const PlaceButton = styled(Button)` + ${placeButtonCss} +` + +export const PlaceLink = styled(Link)` + ${placeButtonCss} +` + export const PlaceDetail = styled.span`` export const PlaceContent = styled.span`` @@ -98,43 +106,45 @@ const Place = ({ const deletePlaceLabel = intl.formatMessage({ id: 'components.Place.deleteThisPlace' }) - const to = onClick ? null : path const iconSize = largeIcon ? '2x' : undefined - return ( - // @ts-expect-error Prop 'as' from styled-components is not recognized by TypeScript. - - - - {largeIcon && ( - + + const placeContent = ( + <> + {largeIcon && ( + + + + )} + + + {!largeIcon && ( + )} - - - {!largeIcon && ( - - - - )} - {mainText} - - {detailText && ( - - - - {detailText} - - )} - {actionText && ( - [{actionText}] - )} - - - + {mainText} + + {detailText && ( + + - + {detailText} + + )} + {actionText && [{actionText}]} + + + ) + + return ( + // @ts-expect-error Prop 'as' from styled-components is not recognized by TypeScript. + + {onClick ? ( + {placeContent} + ) : ( + + {placeContent} + + )} {/* Action buttons. If none, render a placeholder. */} {!onView && !onDelete && } diff --git a/lib/components/user/places/styled.ts b/lib/components/user/places/styled.ts index b5ea6e799..663fe66c6 100644 --- a/lib/components/user/places/styled.ts +++ b/lib/components/user/places/styled.ts @@ -9,6 +9,7 @@ import Place, { PlaceButton, PlaceContent, PlaceDetail, + PlaceLink, PlaceName } from './place' @@ -25,7 +26,7 @@ export const StyledFavoritePlace = styled(Place).attrs({ height: ${FAVORITE_PLACE_HEIGHT_PX}; margin-bottom: 10px; - ${PlaceButton} { + ${PlaceLink} { align-items: center; display: flex; flex: 1 0 0; diff --git a/lib/components/user/styled.ts b/lib/components/user/styled.ts index 6b4c8310b..8e81734a2 100644 --- a/lib/components/user/styled.ts +++ b/lib/components/user/styled.ts @@ -1,7 +1,11 @@ import { Panel } from 'react-bootstrap' import styled, { css } from 'styled-components' +import { getBaseColor } from '../util/base-color' import { RED_ON_WHITE } from '../util/colors' +import Link from '../util/link' + +const baseColor = getBaseColor() export const PageHeading = styled.h2` margin: 10px 0px 45px 0px; @@ -46,11 +50,28 @@ export const TripHeader = styled.h3` margin-top: 0px; ` +export const TripPanelTitle = styled.div` + align-items: center; + display: flex; + justify-content: space-between; +` + export const TripPanelHeading = styled(Panel.Heading)` background-color: white !important; + border-color: #fff !important; + padding: 20px 25px 0 25px; + max-width: 670px; + + a svg { + color: ${baseColor}; + } + + h3 { + margin: 0; + } ` -export const TripPanelAlert = styled.button` +export const TripPanelAlert = styled.span` background: none; border: none; color: ${RED_ON_WHITE}; @@ -64,23 +85,8 @@ export const TripPanelAlert = styled.button` export const TripPanelFooter = styled(Panel.Footer)` background-color: white !important; + border: none; padding: 0px; - button { - border: 0px; - padding: 13px 0px; - width: 50%; - } - - button:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - } - - button:nth-child(2) { - border-radius: 0; - border-left: 1px solid #ddd; - } ` /** Formats non-
                                                          )) diff --git a/lib/components/viewers/nearby/rental-station.tsx b/lib/components/viewers/nearby/rental-station.tsx index 37e226b7f..571535845 100644 --- a/lib/components/viewers/nearby/rental-station.tsx +++ b/lib/components/viewers/nearby/rental-station.tsx @@ -11,6 +11,7 @@ import { AppReduxState } from '../../../util/state-types' import { IconWithText } from '../../util/styledIcon' import { Card, CardBody, CardHeader, CardSubheader, CardTitle } from './styled' +import DistanceDisplay from './distance-display' type Props = { companies?: Company[] @@ -45,6 +46,7 @@ const RentalStation = ({ companies, fromToSlot, place }: Props) => { )} +
                                                          diff --git a/lib/components/viewers/nearby/stop-card-header.tsx b/lib/components/viewers/nearby/stop-card-header.tsx index beab553d4..6eced1b1c 100644 --- a/lib/components/viewers/nearby/stop-card-header.tsx +++ b/lib/components/viewers/nearby/stop-card-header.tsx @@ -13,6 +13,7 @@ import OperatorLogo from '../../util/operator-logo' import Strong from '../../util/strong-text' import { CardBody, CardHeader, CardTitle } from './styled' +import DistanceDisplay from './distance-display' type Props = { actionIcon: ComponentType @@ -21,7 +22,7 @@ type Props = { actionText: JSX.Element fromToSlot: JSX.Element onZoomClick?: () => void - stopData: StopData + stopData: StopData & { distance?: number } titleAs?: string transitOperators?: TransitOperator[] } @@ -99,6 +100,7 @@ const StopCardHeader = ({ ))} {stopData.name} +
                                                          diff --git a/lib/components/viewers/nearby/styled.tsx b/lib/components/viewers/nearby/styled.tsx index 7e028686e..c9135d01e 100644 --- a/lib/components/viewers/nearby/styled.tsx +++ b/lib/components/viewers/nearby/styled.tsx @@ -36,6 +36,9 @@ export const Card = styled.div` ` export const CardHeader = styled.div` + align-items: center; + display: grid; + grid-template-columns: 25fr 1fr; padding: 1rem 1.2rem 0; ` @@ -45,6 +48,7 @@ export const CardTitle = styled.p` font-size: 22px; font-weight: 600; gap: 0.5ch; + grid-column: 1; margin: 0; /* Prevent svg and images to be taller than the text. */ svg { @@ -56,9 +60,17 @@ export const CardSubheader = styled.p` color: #444; font-size: 16px; font-weight: 400; + grid-column: 1; margin: 0; ` +export const CardAside = styled.p` + color: #444444ba; + grid-column: -1; + grid-row: 1; + text-align: right; +` + export const CardBody = styled.div` margin-bottom: 1rem; margin-top: 1rem; diff --git a/lib/components/viewers/nearby/vehicle-parking.tsx b/lib/components/viewers/nearby/vehicle-parking.tsx index 2efc1666f..e9bf9771f 100644 --- a/lib/components/viewers/nearby/vehicle-parking.tsx +++ b/lib/components/viewers/nearby/vehicle-parking.tsx @@ -5,10 +5,11 @@ import React from 'react' import { IconWithText } from '../../util/styledIcon' import { Card, CardBody, CardHeader, CardSubheader, CardTitle } from './styled' +import DistanceDisplay from './distance-display' type Props = { fromToSlot: JSX.Element - place: Place + place: Place & { distance?: number } } const VehicleParking = ({ fromToSlot, place }: Props): React.ReactElement => { @@ -19,6 +20,7 @@ const VehicleParking = ({ fromToSlot, place }: Props): React.ReactElement => { {place.name} Park and Ride + {fromToSlot} diff --git a/lib/components/viewers/nearby/vehicle-rent.tsx b/lib/components/viewers/nearby/vehicle-rent.tsx index 4b9dfa956..aba60334c 100644 --- a/lib/components/viewers/nearby/vehicle-rent.tsx +++ b/lib/components/viewers/nearby/vehicle-rent.tsx @@ -12,6 +12,7 @@ import { AppReduxState } from '../../../util/state-types' import { IconWithText } from '../../util/styledIcon' import { Card, CardBody, CardHeader, CardTitle } from './styled' +import DistanceDisplay from './distance-display' type VehicleFormFactor = | 'BICYCLE' @@ -110,6 +111,7 @@ const Vehicle = ({ {name} + {vehicle.name !== 'Default vehicle type' && vehicle.name !== name && ( diff --git a/lib/util/config-types.ts b/lib/util/config-types.ts index 377213cda..343686e5e 100644 --- a/lib/util/config-types.ts +++ b/lib/util/config-types.ts @@ -317,6 +317,8 @@ export interface TransitOperatorConfig extends TransitOperator { export interface RouteViewerConfig { /** Whether to hide the route linear shape inside a flex zone of that route. */ hideRouteShapesWithinFlexZones?: boolean + /** Remove vehicles from the map if they haven't sent an update in a number of seconds */ + maxRealtimeVehicleAge?: number /** Disable vehicle highlight if necessary (e.g. custom or inverted icons) */ vehicleIconHighlight?: boolean /** Customize vehicle icon padding (the default iconPadding is 2px in otp-ui) */ diff --git a/lib/util/itinerary.tsx b/lib/util/itinerary.tsx index 7fdaf3fa4..6cebee5b3 100644 --- a/lib/util/itinerary.tsx +++ b/lib/util/itinerary.tsx @@ -19,7 +19,7 @@ interface LegWithOtp1HailedCar extends Leg { hailedCar?: boolean } -interface ItineraryWithOtp1HailedCar extends Itinerary { +export interface ItineraryWithOtp1HailedCar extends Itinerary { legs: LegWithOtp1HailedCar[] } @@ -62,7 +62,7 @@ interface RelaxedFareProductSelector { * (We use the corresponding fields returned by OTP to get transit legs and rental/ride hail legs.) */ export function itineraryCanBeMonitored( - itinerary: ItineraryWithOtp1HailedCar + itinerary?: ItineraryWithOtp1HailedCar ): boolean { return ( !!itinerary?.legs && diff --git a/lib/util/webapp-routes.js b/lib/util/webapp-routes.js index 28b276c26..a76508043 100644 --- a/lib/util/webapp-routes.js +++ b/lib/util/webapp-routes.js @@ -1,8 +1,8 @@ import React, { lazy, Suspense } from 'react' import { frame } from '../components/app/app-frame' -import { RedirectWithQuery } from '../components/form/connected-links' import AfterSignInScreen from '../components/user/after-signin-screen' +import RedirectWithQuery from '../components/form/redirect-with-query' import SavedTripList from '../components/user/monitored-trip/saved-trip-list' import { diff --git a/package.json b/package.json index b17006b81..d9dbc3374 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@bugsnag/js": "^7.17.0", "@bugsnag/plugin-react": "^7.17.0", "@floating-ui/react": "^0.19.2", - "@opentripplanner/base-map": "^3.0.17", + "@opentripplanner/base-map": "^3.1.0", "@opentripplanner/core-utils": "^11.3.1", "@opentripplanner/endpoints-overlay": "^2.0.12", "@opentripplanner/from-to-location-picker": "^2.1.12", @@ -59,7 +59,7 @@ "@opentripplanner/route-viewer-overlay": "^2.0.15", "@opentripplanner/stop-viewer-overlay": "^2.0.8", "@opentripplanner/stops-overlay": "^5.2.2", - "@opentripplanner/transit-vehicle-overlay": "^4.0.9", + "@opentripplanner/transit-vehicle-overlay": "^4.0.10", "@opentripplanner/transitive-overlay": "^3.0.18", "@opentripplanner/trip-details": "^5.0.11", "@opentripplanner/trip-form": "^3.5.2", @@ -114,7 +114,6 @@ "react-redux": "^7.1.0", "react-resize-detector": "^2.1.0", "react-router": "^5.3.4", - "react-router-bootstrap": "^0.25.0", "react-router-dom": "^5.3.4", "react-select": "^3.1.0", "react-sliding-pane": "^7.0.0", @@ -140,7 +139,7 @@ "@graphql-tools/schema": "^10.0.0", "@jackwilsdon/craco-use-babelrc": "^1.0.0", "@opentripplanner/scripts": "^1.2.0", - "@opentripplanner/types": "^6.4.0", + "@opentripplanner/types": "^6.4.1", "@percy/cli": "^1.20.3", "@percy/puppeteer": "^2.0.2", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.1", diff --git a/yarn.lock b/yarn.lock index 67464a293..7166d20b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2383,10 +2383,10 @@ dependencies: "@octokit/openapi-types" "^10.0.0" -"@opentripplanner/base-map@^3.0.16", "@opentripplanner/base-map@^3.0.17": - version "3.0.17" - resolved "https://registry.yarnpkg.com/@opentripplanner/base-map/-/base-map-3.0.17.tgz#01862a7925b59be355e3229edac954ef876343cb" - integrity sha512-cWfhquu7PrLnqte03Mj5XQJW3OSrRtwq10/s2Az523X9yeheZsiO4sm/Bfmizr9xhqec/UTl882nOVKjESHzHA== +"@opentripplanner/base-map@^3.0.16", "@opentripplanner/base-map@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@opentripplanner/base-map/-/base-map-3.1.0.tgz#3181d4ec17029db8a40ca1342e20d1a0d449931f" + integrity sha512-feOSOWmiBFvIFWyG+OllCMxOcTmRKzxIoKKeoEgUFjNdVnrkZM6HH5r0m5IaQA9wO7T0N0K64hn/zdRQZBv0rQ== dependencies: mapbox-gl "npm:empty-npm-package@1.0.0" maplibre-gl "^2.1.9" @@ -2564,10 +2564,10 @@ "@opentripplanner/map-popup" "^3.0.2" flat "^5.0.2" -"@opentripplanner/transit-vehicle-overlay@^4.0.9": - version "4.0.9" - resolved "https://registry.yarnpkg.com/@opentripplanner/transit-vehicle-overlay/-/transit-vehicle-overlay-4.0.9.tgz#f193de3444445fefe1bf8e40e312d53ea2a70dc7" - integrity sha512-VajxLn+qIOQ17Z7vdjWFmImDz4aKJ4mzQsztZH0zSZepmEFD5HLqdlvm1RGRbpLbnAU2XWGVgAAT8NTT5YxVyw== +"@opentripplanner/transit-vehicle-overlay@^4.0.10": + version "4.0.10" + resolved "https://registry.yarnpkg.com/@opentripplanner/transit-vehicle-overlay/-/transit-vehicle-overlay-4.0.10.tgz#a63e86a2dc5108ddf47ba8d8c0c9f5017c65c86a" + integrity sha512-j8+KCyeCD7WLQgAIbtzX7ckwqLU1fwKjXCMJ5E5/t75YqNuWB8hAiUonerIanuA20TUinm4sPwSL3dr9OnGNlA== dependencies: "@opentripplanner/base-map" "^3.0.16" "@opentripplanner/core-utils" "^11.2.3" @@ -2626,10 +2626,10 @@ "@opentripplanner/base-map" "^3.0.16" "@opentripplanner/core-utils" "^11.2.3" -"@opentripplanner/types@^6.4.0": - version "6.4.0" - resolved "https://registry.yarnpkg.com/@opentripplanner/types/-/types-6.4.0.tgz#6f7a3475ea982c7b7d8b2f1383a6d775dfabe62a" - integrity sha512-PS+CUwETLf0WzAUZg3qiey+SBigaf0CfknKF1XMOM+zJVc2c8nN34hgnwV7sS+RKs030KZFAgIn8p035ErcBuQ== +"@opentripplanner/types@^6.4.1": + version "6.4.1" + resolved "https://registry.yarnpkg.com/@opentripplanner/types/-/types-6.4.1.tgz#a01e612e258d873840a3222bbc7dd446e7c502c4" + integrity sha512-gSaEIxdXJjOoUcOKi+JNVkcT58SyqU5RnU3zoBVKrH8DYjXOTqX058NmmzPpptL3yEZRXysjlIyRL/xo2x5Wlw== "@opentripplanner/vehicle-rental-overlay@^2.1.7": version "2.1.7" @@ -5506,16 +5506,7 @@ cachedir@2.2.0: resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.2.0.tgz#19afa4305e05d79e417566882e0c8f960f62ff0e" integrity sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ== -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" - integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== - dependencies: - function-bind "^1.1.2" - get-intrinsic "^1.2.1" - set-function-length "^1.1.1" - -call-bind@^1.0.7: +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== @@ -6969,15 +6960,6 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-data-property@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" - integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== - dependencies: - get-intrinsic "^1.2.1" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -8944,17 +8926,7 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" - integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== - dependencies: - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-intrinsic@^1.2.4: +get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -9289,13 +9261,6 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" - integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== - dependencies: - get-intrinsic "^1.2.2" - has-property-descriptors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" @@ -13246,7 +13211,7 @@ object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== -object-inspect@^1.11.0, object-inspect@^1.13.1, object-inspect@^1.6.0, object-inspect@^1.7.0, object-inspect@^1.9.0: +object-inspect@^1.11.0, object-inspect@^1.13.1, object-inspect@^1.6.0, object-inspect@^1.7.0: version "1.13.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== @@ -14939,20 +14904,13 @@ qrcode-terminal@^0.12.0: resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== -qs@6.11.0: +qs@6.11.0, qs@^6.10.3, qs@^6.3.0, qs@^6.5.1, qs@^6.9.1: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" -qs@^6.10.3, qs@^6.3.0, qs@^6.5.1, qs@^6.9.1: - version "6.12.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.0.tgz#edd40c3b823995946a8a0b1f208669c7a200db77" - integrity sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg== - dependencies: - side-channel "^1.0.6" - qs@~6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" @@ -15346,13 +15304,6 @@ react-resize-detector@^4.2.1: raf-schd "^4.0.2" resize-observer-polyfill "^1.5.1" -react-router-bootstrap@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/react-router-bootstrap/-/react-router-bootstrap-0.25.0.tgz#5d1a99b5b8a2016c011fc46019d2397e563ce0df" - integrity sha512-/22eqxjn6Zv5fvY2rZHn57SKmjmJfK7xzJ6/G1OgxAjLtKVfWgV5sn41W2yiqzbtV5eE4/i4LeDLBGYTqx7jbA== - dependencies: - prop-types "^15.5.10" - react-router-dom@^5.3.4: version "5.3.4" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" @@ -16511,16 +16462,6 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-function-length@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" - integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== - dependencies: - define-data-property "^1.1.1" - get-intrinsic "^1.2.1" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -16620,15 +16561,6 @@ shellwords@^0.1.1: integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -side-channel@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==