From 3bcc28251a6b2771dbe761a845aec1d938deb635 Mon Sep 17 00:00:00 2001 From: krzysztof ziecina Date: Thu, 6 Nov 2025 16:57:36 +0100 Subject: [PATCH 1/4] feat: add neighborhood amenities as dropdowns --- api/prisma/seed-staging.ts | 6 ++- .../enums/feature-flags/feature-flags-enum.ts | 6 +++ shared-helpers/src/types/backend-swagger.ts | 1 + .../locale_overrides/general.json | 10 ++++ .../sections/NeighborhoodAmenities.tsx | 49 +++++++++++++++---- 5 files changed, 62 insertions(+), 10 deletions(-) diff --git a/api/prisma/seed-staging.ts b/api/prisma/seed-staging.ts index 0ae2470dca1..5f68a3a4a4a 100644 --- a/api/prisma/seed-staging.ts +++ b/api/prisma/seed-staging.ts @@ -156,7 +156,11 @@ export const stagingSeed = async ( }); const angelopolisJurisdiction = await prismaClient.jurisdictions.create({ data: jurisdictionFactory('Angelopolis', { - featureFlags: [FeatureFlagEnum.enableNeighborhoodAmenities, FeatureFlagEnum.enableHousingDeveloperOwner], + featureFlags: [ + FeatureFlagEnum.enableHousingDeveloperOwner, + FeatureFlagEnum.enableNeighborhoodAmenities, + FeatureFlagEnum.enableNeighborhoodAmenitiesDropdown, + ], visibleNeighborhoodAmenities: [ NeighborhoodAmenitiesEnum.groceryStores, NeighborhoodAmenitiesEnum.pharmacies, diff --git a/api/src/enums/feature-flags/feature-flags-enum.ts b/api/src/enums/feature-flags/feature-flags-enum.ts index d4ef3a08b3f..16af2dd738a 100644 --- a/api/src/enums/feature-flags/feature-flags-enum.ts +++ b/api/src/enums/feature-flags/feature-flags-enum.ts @@ -24,6 +24,7 @@ export enum FeatureFlagEnum { enableListingUpdatedAt = 'enableListingUpdatedAt', enableMarketingStatus = 'enableMarketingStatus', enableNeighborhoodAmenities = 'enableNeighborhoodAmenities', + enableNeighborhoodAmenitiesDropdown = 'enableNeighborhoodAmenitiesDropdown', enableNonRegulatedListings = 'enableNonRegulatedListings', enablePartnerDemographics = 'enablePartnerDemographics', enablePartnerSettings = 'enablePartnerSettings', @@ -154,6 +155,11 @@ export const featureFlagMap: { name: string; description: string }[] = [ description: "When true, the 'neighborhood amenities' section is displayed in listing creation/edit and the public listing view", }, + { + name: FeatureFlagEnum.enableNeighborhoodAmenitiesDropdown, + description: + 'When true, neighborhood amenities inputs render as dropdowns with distance options instead of textareas', + }, { name: FeatureFlagEnum.enableNonRegulatedListings, description: diff --git a/shared-helpers/src/types/backend-swagger.ts b/shared-helpers/src/types/backend-swagger.ts index f23c42e535f..3c48427d172 100644 --- a/shared-helpers/src/types/backend-swagger.ts +++ b/shared-helpers/src/types/backend-swagger.ts @@ -7582,6 +7582,7 @@ export enum FeatureFlagEnum { "enableListingUpdatedAt" = "enableListingUpdatedAt", "enableMarketingStatus" = "enableMarketingStatus", "enableNeighborhoodAmenities" = "enableNeighborhoodAmenities", + "enableNeighborhoodAmenitiesDropdown" = "enableNeighborhoodAmenitiesDropdown", "enableNonRegulatedListings" = "enableNonRegulatedListings", "enablePartnerDemographics" = "enablePartnerDemographics", "enablePartnerSettings" = "enablePartnerSettings", diff --git a/sites/partners/page_content/locale_overrides/general.json b/sites/partners/page_content/locale_overrides/general.json index 9ff341cf427..72bec6f8e5a 100644 --- a/sites/partners/page_content/locale_overrides/general.json +++ b/sites/partners/page_content/locale_overrides/general.json @@ -508,6 +508,16 @@ "nav.flags": "Flags", "nav.siteTitlePartners": "Partners Portal", "nav.users": "Users", + "neighborhoodAmenities.distance.onSite": "On site", + "neighborhoodAmenities.distance.oneBlock": "One block", + "neighborhoodAmenities.distance.twoBlocks": "Two blocks", + "neighborhoodAmenities.distance.threeBlocks": "Three blocks", + "neighborhoodAmenities.distance.fourBlocks": "Four blocks", + "neighborhoodAmenities.distance.fiveBlocks": "Five blocks", + "neighborhoodAmenities.distance.withinOneMile": "Within one mile", + "neighborhoodAmenities.distance.withinTwoMiles": "Within two miles", + "neighborhoodAmenities.distance.withinThreeMiles": "Within three miles", + "neighborhoodAmenities.distance.withinFourMiles": "Within four miles", "settings.createCopy": "Make a copy", "settings.createCopyDescription": "Create a copy of your preference.", "settings.preference": "Preference", diff --git a/sites/partners/src/components/listings/PaperListingForm/sections/NeighborhoodAmenities.tsx b/sites/partners/src/components/listings/PaperListingForm/sections/NeighborhoodAmenities.tsx index d9dde84fdeb..83007949247 100644 --- a/sites/partners/src/components/listings/PaperListingForm/sections/NeighborhoodAmenities.tsx +++ b/sites/partners/src/components/listings/PaperListingForm/sections/NeighborhoodAmenities.tsx @@ -1,6 +1,6 @@ import React, { useContext, useMemo } from "react" import { useFormContext } from "react-hook-form" -import { t, Textarea } from "@bloom-housing/ui-components" +import { t, Textarea, Select } from "@bloom-housing/ui-components" import { Grid } from "@bloom-housing/ui-seeds" import SectionWithGrid from "../../../shared/SectionWithGrid" import { AuthContext } from "@bloom-housing/shared-helpers" @@ -25,6 +25,25 @@ const NeighborhoodAmenities = () => { jurisdiction ) + const enableNeighborhoodAmenitiesDropdown = doJurisdictionsHaveFeatureFlagOn( + FeatureFlagEnum.enableNeighborhoodAmenitiesDropdown, + jurisdiction + ) + + const neighborhoodAmenityKeys: string[] = [ + "", + "onSite", + "oneBlock", + "twoBlocks", + "threeBlocks", + "fourBlocks", + "fiveBlocks", + "withinOneMile", + "withinTwoMiles", + "withinThreeMiles", + "withinFourMiles", + ] + const visibleAmenities = useMemo(() => { const visibleAmenitiesList = jurisdictionData?.visibleNeighborhoodAmenities || [] return Object.values(NeighborhoodAmenitiesEnum).filter((amenity) => @@ -56,14 +75,26 @@ const NeighborhoodAmenities = () => { {row.map((amenity) => ( -