Skip to content

Commit

Permalink
Merge branch '1382/application-datess' of https://github.com/bloom-ho…
Browse files Browse the repository at this point in the history
…using/bloom into 1382/application-datess
  • Loading branch information
emilyjablonski committed Jul 2, 2021
2 parents f5906c4 + afcf3a1 commit f53cae4
Show file tree
Hide file tree
Showing 16 changed files with 1,015 additions and 30 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ All notable changes to this project will be documented in this file. The format
- Fix units availability ([#1397](https://github.com/bloom-housing/bloom/issues/1397))

- Added:

- Added "closed" to ListingStatus enum
- Added Transform to ListingStatus field to return closed if applicationDueDate is in the past
- Added "ohaFormat" to CSV exporter (includes OHA and HOPWA preferences) ([#1292](https://github.com/bloom-housing/bloom/pull/1292)) (Michał Plebański)
Expand Down Expand Up @@ -66,6 +65,7 @@ All notable changes to this project will be documented in this file. The format
- Add Additional Fees section to listing management ([#1377](https://github.com/bloom-housing/bloom/pull/1377)) (Emily Jablonski)
- Add Building Details and Intro section to listing management ([#1420](https://github.com/bloom-housing/bloom/pull/1420)) (Emily Jablonski)
- Add Building Features section to listing management ([#1412](https://github.com/bloom-housing/bloom/pull/1412)) (Emily Jablonski)
- Adds units to listings ([#1448](https://github.com/bloom-housing/bloom/pull/1448))
- Add Rankings and Results section to listing management ([#1433](https://github.com/bloom-housing/bloom/pull/1433)) (Emily Jablonski)
- Add Application Dates section to listing management ([#1432](https://github.com/bloom-housing/bloom/pull/1432)) (Emily Jablonski)

Expand Down
8 changes: 6 additions & 2 deletions backend/core/src/listings/listings.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ export class ListingsService {
const countIndex = arrayIndex<Listing>(counts, "id")

listings.forEach((listing: Listing) => {
listing.applicationCount = countIndex[listing.id].applicationCount
listing.applicationCount = countIndex[listing.id].applicationCount || 0
})
}

Expand All @@ -84,7 +84,11 @@ export class ListingsService {
if (!listing) {
throw new NotFoundException()
}

listingDto.units.forEach((unit) => {
if (unit.id.length === 0 || unit.id === "undefined") {
delete unit.id
}
})
Object.assign(listing, {
...plainToClass(Listing, listingDto, { excludeExtraneousValues: true }),
property: plainToClass(
Expand Down
4 changes: 2 additions & 2 deletions backend/core/src/shared/units-transformations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { MinMaxCurrency } from "../units/types/min-max-currency"
import { UnitSummary } from "../units/types/unit-summary"
import { UnitsSummarized } from "../units/types/units-summarized"

export type AnyDict = { [key: string]: any }
export type AnyDict = { [key: string]: unknown }
type Units = Unit[]

const usd = new Intl.NumberFormat("en-US", {
Expand Down Expand Up @@ -33,7 +33,7 @@ const bmrHeaders = ["Studio", "1 BR", "2 BR", "3 BR", "4 BR"]
const hmiData = (units: Units, byUnitType: UnitSummary[], amiPercentages: string[]) => {
const bmrProgramChart = units[0].bmrProgramChart
// TODO https://github.com/bloom-housing/bloom/issues/872
const amiChartItems = units[0].amiChart.items
const amiChartItems = units[0].amiChart?.items || []
const hmiHeaders = {
householdSize: bmrProgramChart ? "t.unitType" : "listings.householdSize",
} as AnyDict
Expand Down
30 changes: 29 additions & 1 deletion sites/partners/lib/helpers.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { t } from "@bloom-housing/ui-components"
import moment from "moment"
import { ApplicationSubmissionType } from "@bloom-housing/backend-core/types"
import { AmiChart, ApplicationSubmissionType } from "@bloom-housing/backend-core/types"
import { TempUnit } from "../src/listings/PaperListingForm"

type DateTimePST = {
hour: string
Expand Down Expand Up @@ -66,3 +67,30 @@ export const convertDataToPst = (dateObj: Date, type: ApplicationSubmissionType)
}
}
}

export const stringToNumber = (str: string | number | undefined): number => {
return str ? Number(str) : 1
}

export const stringToBoolean = (str: string | boolean | undefined): boolean => {
return str === true || str === "true" || str === "yes"
}

export const booleanToString = (bool: boolean): string => {
return bool === true ? "true" : "false"
}

export const getRentType = (unit: TempUnit): string | null => {
return unit?.monthlyIncomeMin && unit?.monthlyRent
? "fixed"
: unit?.monthlyRentAsPercentOfIncome
? "percentage"
: null
}

export const getAmiChartId = (chart: AmiChart | string | undefined): string | null => {
if (chart === undefined) {
return null
}
return chart instanceof Object ? chart.id : chart
}
13 changes: 13 additions & 0 deletions sites/partners/lib/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,3 +136,16 @@ export function useSingleFlaggedApplication(afsId: string) {
error,
}
}

export function useAmiChartList() {
const { amiChartsService } = useContext(AuthContext)
const fetcher = () => amiChartsService.list()

const { data, error } = useSWR(`${process.env.backendApiBase}/amiCharts`, fetcher)

return {
data,
loading: !error && !data,
error,
}
}
8 changes: 8 additions & 0 deletions sites/partners/pages/listings/[id]/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ import DetailAdditionalDetails from "../../../src/listings/PaperListingDetails/s
import DetailAdditionalEligibility from "../../../src/listings/PaperListingDetails/sections/DetailAdditionalEligibility"
import DetailLeasingAgent from "../../../src/listings/PaperListingDetails/sections/DetailLeasingAgent"
import DetailAdditionalFees from "../../../src/listings/PaperListingDetails/sections/DetailAdditionalFees"
import { DetailUnits } from "../../../src/listings/PaperListingDetails/sections/DetailUnits"
import DetailUnitDrawer, {
UnitDrawer,
} from "../../../src/listings/PaperListingDetails/DetailsUnitDrawer"
import DetailBuildingFeatures from "../../../src/listings/PaperListingDetails/sections/DetailBuildingFeatures"
import DetailRankingsAndResults from "../../../src/listings/PaperListingDetails/sections/DetailRankingsAndResults"
import DetailApplicationDates from "../../../src/listings/PaperListingDetails/sections/DetailApplicationDates"
Expand All @@ -33,6 +37,7 @@ export default function ApplicationsList() {
const listingId = router.query.id as string
const { listingDto } = useSingleListingData(listingId)
const [errorAlert, setErrorAlert] = useState(false)
const [unitDrawer, setUnitDrawer] = useState<UnitDrawer>(null)

const listingStatus = useMemo(() => {
switch (listingDto?.status) {
Expand Down Expand Up @@ -109,6 +114,7 @@ export default function ApplicationsList() {
<DetailListingIntro />
<DetailBuildingDetails />
<DetailApplication />
<DetailUnits setUnitDrawer={setUnitDrawer} />
<DetailAdditionalFees />
<DetailBuildingFeatures />
<DetailAdditionalEligibility />
Expand All @@ -125,6 +131,8 @@ export default function ApplicationsList() {
</div>
</section>
</Layout>

<DetailUnitDrawer unit={unitDrawer} setUnitDrawer={setUnitDrawer} />
</ListingContext.Provider>
)
}
112 changes: 112 additions & 0 deletions sites/partners/src/listings/PaperListingDetails/DetailsUnitDrawer.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import React from "react"
import {
AppearanceStyleType,
t,
GridSection,
ViewItem,
Button,
Drawer,
} from "@bloom-housing/ui-components"
import { Unit } from "@bloom-housing/backend-core/types"
import { getRentType } from "../../../lib/helpers"

export type UnitDrawer = Unit | null

type UnitDrawerProps = {
unit: UnitDrawer
setUnitDrawer: (unit: UnitDrawer) => void
}

const DetailUnitDrawer = ({ unit, setUnitDrawer }: UnitDrawerProps) => {
const rentType = getRentType(unit)
return (
<Drawer
open={!!unit}
title={t("listings.unit.title")}
ariaDescription={t("listings.unit.title")}
onClose={() => setUnitDrawer(null)}
>
<section className="border rounded-md p-8 bg-white mb-8">
<GridSection title={t("listings.unit.details")} tinted={true} inset={true} grid={false}>
<GridSection grid columns={4}>
<ViewItem label={t("listings.unit.unitNumber")} children={unit?.number || t("t.n/a")} />

<ViewItem label={t("listings.unit.type")} children={unit?.unitType || t("t.n/a")} />

<ViewItem
label={t("listings.unit.numBathrooms")}
children={unit?.numBathrooms || t("t.n/a")}
/>

<ViewItem label={t("listings.unit.floor")} children={unit?.floor || t("t.n/a")} />

<ViewItem
label={t("listings.unit.squareFootage")}
children={unit?.sqFeet || t("t.n/a")}
/>

<ViewItem label={t("listings.unit.unitStatus")} children={unit?.status || t("t.n/a")} />

<ViewItem
label={t("listings.unit.minOccupancy")}
children={unit?.minOccupancy || t("t.n/a")}
/>

<ViewItem
label={t("listings.unit.maxOccupancy")}
children={unit?.maxOccupancy || t("t.n/a")}
/>
</GridSection>
</GridSection>
<GridSection title={t("listings.unit.eligibility")} tinted={true} inset={true} grid={false}>
<GridSection grid columns={4}>
<ViewItem
label={t("listings.unit.amiChart")}
children={unit?.amiChart?.name || t("t.n/a")}
/>

<ViewItem
label={t("listings.unit.amiPercentage")}
children={unit?.amiPercentage || t("t.n/a")}
/>
</GridSection>
<GridSection columns={4} className="pt-6">
{rentType === "fixed" && (
<>
<ViewItem
label={t("t.minimumIncome")}
children={unit?.monthlyIncomeMin || t("t.n/a")}
/>

<ViewItem
label={t("listings.unit.monthlyRent")}
children={unit?.monthlyRent || t("t.n/a")}
/>
</>
)}
{rentType === "percentage" && (
<ViewItem
label={t("listings.unit.percentage")}
children={unit?.monthlyRentAsPercentOfIncome || t("t.n/a")}
/>
)}
</GridSection>
</GridSection>
<GridSection title={t("t.accessibility")} tinted={true} inset={true} grid={false}>
<GridSection grid columns={4}>
<ViewItem
label={t("listings.unit.accessibilityPriorityType")}
children={unit?.priorityType || t("t.n/a")}
/>
</GridSection>
</GridSection>
</section>

<Button styleType={AppearanceStyleType.primary} onClick={() => setUnitDrawer(null)}>
{t("t.done")}
</Button>
</Drawer>
)
}

export default DetailUnitDrawer
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import React, { useContext, useMemo } from "react"
import { t, GridSection, MinimalTable, Button, ViewItem } from "@bloom-housing/ui-components"
import { ListingContext } from "../../ListingContext"
import { UnitDrawer } from "../DetailsUnitDrawer"

type DetailUnitsProps = {
setUnitDrawer: (unit: UnitDrawer) => void
}

const DetailUnits = ({ setUnitDrawer }: DetailUnitsProps) => {
const listing = useContext(ListingContext)

const unitTableHeaders = {
number: "listings.unit.number",
unitType: "listings.unit.type",
amiPercentage: "listings.unit.ami",
monthlyRent: "listings.unit.rent",
sqFeet: "listings.unit.sqft",
priorityType: "listings.unit.priorityType",
status: "listings.unit.status",
action: "",
}

const unitTableData = useMemo(
() =>
listing?.units.map((unit) => ({
number: unit.number,
unitType: t(`listings.unitTypes.${unit.unitType}`),
amiPercentage: unit.amiPercentage,
monthlyRent: unit.monthlyRent,
sqFeet: unit.sqFeet,
priorityType: unit.priorityType,
status: unit.status,
action: (
<Button
type="button"
className="font-semibold uppercase"
onClick={() => setUnitDrawer(unit)}
unstyled
>
{t("t.view")}
</Button>
),
})),
[listing, setUnitDrawer]
)

return (
<GridSection
className="bg-primary-lighter"
title={t("listings.units")}
grid={false}
tinted
inset
>
<GridSection title={t("listings.unit.details")} tinted={true} inset={true} grid={false}>
<GridSection grid columns={1}>
<ViewItem
label={t("listings.unitTypesOrIndividual")}
children={
listing.disableUnitsAccordion
? t("listings.unit.unitTypes")
: t("listings.unit.individualUnits")
}
/>
</GridSection>
</GridSection>

{listing.units.length ? (
<MinimalTable headers={unitTableHeaders} data={unitTableData} />
) : (
<span className="text-base font-semibold">{t("t.none")}</span>
)}
</GridSection>
)
}

export { DetailUnits as default, DetailUnits }
Loading

0 comments on commit f53cae4

Please sign in to comment.