Skip to content

Commit

Permalink
Release/2023 05 30 (#616)
Browse files Browse the repository at this point in the history
* fix: stop transforming null to zero (bloom-housing#3453)

* fix: stop transforming null to zero

* fix: other fields defaulting to zero

* fix: public multiple photos from detroit (bloom-housing#3390)

* feat: add multiple photos

* feat: add tests

* feat: add images to seeds

* fix: return array when no image

* fix: shared helpers photos tests

* fix: add class with variables to parent element

* fix: make actions inside content section optional on desktop

* fix: pass modalCloseInContent prop to listing view's ImageCard

* fix: remove redundant image-card class

* chore: upgrade ui-c

* fix: remove redundant order column

* fix: change font for drawer title

* fix: remove default images value when editing

* feat: adding app sub verification endpoint (bloom-housing#3452)

* feat: adding app sub verification endpoint

* fix: build fix

* fix: redirect and alert language (bloom-housing#3467)

* fix: redirect and alert language

* fix: translations added

* fix: application summary coverage and translation handling

* fix: test reset

---------

Co-authored-by: ColinBuyck <53269332+ColinBuyck@users.noreply.github.com>
Co-authored-by: Krzysztof Zięcina <kziecina@airnauts.com>
Co-authored-by: Yazeed Loonat <YazeedLoonat@gmail.com>
  • Loading branch information
4 people committed Jun 2, 2023
1 parent fd75af0 commit 4f438ad
Show file tree
Hide file tree
Showing 36 changed files with 677 additions and 297 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,13 @@ export class ApplicationsSubmissionController {
const application = await this.applicationsService.submit(applicationCreateDto)
return mapTo(ApplicationDto, application)
}

@Post("verify")
@ApiOperation({ summary: "Verify application can be saved", operationId: "submissionValidation" })
@ResourceAction(authzActions.submit)
// eslint-disable-next-line @typescript-eslint/no-unused-vars
submissionValidation(@Body() applicationDraft: ApplicationCreateDto): boolean {
// if we succeeded then the record is good to submit
return true
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { MigrationInterface, QueryRunner } from "typeorm"

export class defaultNullUnitFields1684257708776 implements MigrationInterface {
name = "defaultNullUnitFields1684257708776"

public async up(queryRunner: QueryRunner): Promise<void> {
const unitFields = ["num_bathrooms", "floor", "max_occupancy", "min_occupancy"]
for (const field of unitFields) {
await queryRunner.query(`UPDATE units SET ${field} = NULL WHERE ${field} = 0`)
}
}
public async down(queryRunner: QueryRunner): Promise<void> {}
}
31 changes: 30 additions & 1 deletion backend/core/src/seeder/seeds/listings/listing-coliseum-seed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,36 @@ const coliseumListing: ListingSeedType = {
smokingPolicy: "No Smoking",
unitAmenities: null,
yearBuilt: 2021,
images: [],
images: [
{
image: {
label: "building",
fileId:
"https://regional-dahlia-staging.s3-us-west-1.amazonaws.com/listings/triton/thetriton.png",
},
},
{
image: {
label: "building",
fileId:
"https://res.cloudinary.com/exygy/image/upload/w_1302,c_limit,q_65/dev/oakhouse_cgdqmx.jpg",
},
},
{
image: {
label: "building",
fileId:
"https://res.cloudinary.com/exygy/image/upload/w_1302,c_limit,q_65/dev/house_goo3cp.jpg",
},
},
{
image: {
label: "building",
fileId:
"https://regional-dahlia-staging.s3-us-west-1.amazonaws.com/listings/triton/thetriton.png",
},
},
],
applicationPickUpAddressOfficeHours: null,
buildingSelectionCriteria: null,
costsNotIncluded:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,29 @@ export class ListingDefaultBmrChartSeed extends ListingDefaultSeed {
ordinal: 1,
},
],
images: [
{
image: {
label: "building",
fileId:
"https://res.cloudinary.com/exygy/image/upload/w_1302,c_limit,q_65/dev/house_goo3cp.jpg",
},
},
{
image: {
label: "building",
fileId:
"https://regional-dahlia-staging.s3-us-west-1.amazonaws.com/listings/triton/thetriton.png",
},
},
{
image: {
label: "building",
fileId:
"https://res.cloudinary.com/exygy/image/upload/w_1302,c_limit,q_65/dev/oakhouse_cgdqmx.jpg",
},
},
],
})

const unitsToBeCreated: Array<Omit<UnitCreateDto, keyof BaseEntity>> = bmrUnits.map((unit) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,22 @@ export class ListingDefaultFCFSSeed extends ListingDefaultSeed {
reviewOrderType: "firstComeFirstServe" as ListingReviewOrder,
applicationDueDate: null,
events: [],
images: [
{
image: {
label: "building",
fileId:
"https://regional-dahlia-staging.s3-us-west-1.amazonaws.com/listings/triton/thetriton.png",
},
},
{
image: {
label: "building",
fileId:
"https://res.cloudinary.com/exygy/image/upload/w_1302,c_limit,q_65/dev/house_goo3cp.jpg",
},
},
],
})
}
}
21 changes: 21 additions & 0 deletions backend/core/types/src/backend-swagger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -649,6 +649,27 @@ export class ApplicationsService {

let data = params.body

configs.data = data
axios(configs, resolve, reject)
})
}
/**
* Verify application can be saved
*/
submissionValidation(
params: {
/** requestBody */
body?: ApplicationCreate
} = {} as any,
options: IRequestOptions = {}
): Promise<boolean> {
return new Promise((resolve, reject) => {
let url = basePath + "/applications/verify"

const configs: IRequestConfig = getConfigs("post", "application/json", url, options)

let data = params.body

configs.data = data
axios(configs, resolve, reject)
})
Expand Down
4 changes: 2 additions & 2 deletions shared-helpers/__tests__/photos.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ describe("photos helper", () => {
],
} as Listing

expect(imageUrlFromListing(testListing)).toBe(
expect(imageUrlFromListing(testListing)[0]).toBe(
`https://res.cloudinary.com/exygy/image/upload/w_400,c_limit,q_65/1234.jpg`
)
})
Expand All @@ -55,6 +55,6 @@ describe("photos helper", () => {
],
} as Listing

expect(imageUrlFromListing(testListing)).toBe("5678")
expect(imageUrlFromListing(testListing)[0]).toBe("5678")
})
})
2 changes: 1 addition & 1 deletion shared-helpers/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
},
"dependencies": {
"@bloom-housing/backend-core": "^7.13.0",
"@bloom-housing/ui-components": "^12.0.8",
"@bloom-housing/ui-components": "^12.0.9",
"axios-cookiejar-support": "4.0.6",
"tough-cookie": "4.1.2"
},
Expand Down
2 changes: 2 additions & 0 deletions shared-helpers/src/locales/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,7 @@
"errors.agreeError": "Debe estar de acuerdo con los términos para poder continuar",
"errors.alert.badRequest": "¡Oops! Parece que algo salió mal. Por favor, inténtelo de nuevo. Comuníquese con su departamento de vivienda si sigue teniendo problemas.",
"errors.alert.timeoutPleaseTryAgain": "¡Oops! Parece que algo salió mal. Por favor, inténtelo de nuevo.",
"errors.alert.applicationSubmissionVerificationError": "A su solicitud le faltan campos obligatorios. Vuelva atrás y corrija esto antes de enviarlo.",
"errors.cityError": "Por favor ingrese una ciudad",
"errors.dateError": "Por favor_ deberá introducir una fecha valida",
"errors.dateOfBirthErrorAge": "Ingrese una fecha de nacimiento válida. Para poder registrarse_ debe ser mayor de 18 años",
Expand Down Expand Up @@ -469,6 +470,7 @@
"listings.applicationOpenPeriod": "Solicitudes abiertas",
"listings.applicationPerApplicantAgeDescription": "por solicitante de 18 años o más",
"listings.applicationsClosed": "Solicitudes cerradas",
"listings.applicationsClosedRedirect": "Esta lista ya no acepta solicitudes.",
"listings.applications": "Solicitudes",
"listings.apply.applicationWillBeAvailableOn": "La solicitud podrá ser descargada y recogida el %{openDate}",
"listings.apply.applyOnline": "Haga su solicitud por Internet",
Expand Down
5 changes: 5 additions & 0 deletions shared-helpers/src/locales/general.json
Original file line number Diff line number Diff line change
Expand Up @@ -551,6 +551,7 @@
"errors.agreeError": "You must agree to the terms in order to continue",
"errors.alert.badRequest": "Looks like something went wrong. Please try again. \n\nContact your housing department if you're still experiencing issues.",
"errors.alert.timeoutPleaseTryAgain": "Oops! Looks like something went wrong. Please try again.",
"errors.alert.applicationSubmissionVerificationError": "Your application is missing required fields. Please go back and correct this before submitting.",
"errors.cityError": "Please enter a city",
"errors.dateError": "Please enter a valid date",
"errors.dateOfBirthError": "Please enter a valid Date of Birth",
Expand Down Expand Up @@ -610,6 +611,7 @@
"listings.applicationPerApplicantAgeDescription": "per applicant age 18 and over",
"listings.applications": "Applications",
"listings.applicationsClosed": "Applications Closed",
"listings.applicationsClosedRedirect": "This listing is no longer accepting applications.",
"listings.apply.applicationWillBeAvailableOn": "Application will be available for download and pick up on %{openDate}",
"listings.apply.applyOnline": "Apply Online",
"listings.apply.downloadApplication": "Download Application",
Expand Down Expand Up @@ -671,6 +673,8 @@
"listings.maxIncomeYear": "Maximum Income / Year",
"listings.monthlyIncome": "%{income} per month",
"listings.moreBuildingSelectionCriteria": "Find out more about Building Selection Criteria",
"listings.moreImagesLabel": "images",
"listings.moreImagesAltDescription": "more images for %{listingName}",
"listings.neighborhoodBuildings": "Neighborhood Buildings",
"listings.noAvailableUnits": "There are no available units at this time.",
"listings.noOpenListings": "No listings currently have open applications.",
Expand Down Expand Up @@ -871,6 +875,7 @@
"t.at": "at",
"t.availability": "Availability",
"t.back": "Back",
"t.backToListing": "Back to listing",
"t.built": "Built",
"t.call": "Call",
"t.cancel": "Cancel",
Expand Down
2 changes: 2 additions & 0 deletions shared-helpers/src/locales/tl.json
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,7 @@
"errors.agreeError": "Dapat kang sumang-ayon sa mga tuntunin upang magpatuloy",
"errors.alert.badRequest": "Mukhang nagkaproblema. Pakisubukan muli. \n\nMakipag-ugnayan sa iyong departamento ng pabahay kung nakakaranas ka pa rin ng mga isyu.",
"errors.alert.timeoutPleaseTryAgain": "Teka! Mukhang nagkaproblema. Pakisubukan muli.",
"errors.alert.applicationSubmissionVerificationError": "Walang kinakailangang field ang iyong aplikasyon. Mangyaring bumalik at itama ito bago isumite.",
"errors.cityError": "Pakilagay ang lungsod",
"errors.dateError": "Pakilagay ang tamang petsa",
"errors.dateOfBirthErrorAge": "Pakilagay ang tamang Petsa ng Kapanganakan_ dapat 18 o mas matanda",
Expand Down Expand Up @@ -404,6 +405,7 @@
"listings.applicationOpenPeriod": "Mga bukas na application",
"listings.applicationPerApplicantAgeDescription": "bawat aplikante na edad 18 at mas matanda",
"listings.applicationsClosed": "Mga Isinarang Application",
"listings.applicationsClosedRedirect": "Ang listahang ito ay hindi na tumatanggap ng mga aplikasyon.",
"listings.applications": "Mga Application",
"listings.apply.applicationWillBeAvailableOn": "Magiging available ang application para i-download at kunin sa %{openDate}",
"listings.apply.applyOnline": "Mag-apply Online",
Expand Down
2 changes: 2 additions & 0 deletions shared-helpers/src/locales/vi.json
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,7 @@
"errors.agreeError": "Quý vị phải đồng ý với các điều khoản để tiếp tục",
"errors.alert.badRequest": "Ối! Có vẻ như đã có lỗi xảy ra. Vui lòng thử lại. Liên hệ với bộ phận nhà ở của bạn nếu bạn vẫn gặp sự cố.",
"errors.alert.timeoutPleaseTryAgain": "Ối! Có vẻ như đã có lỗi xảy ra. Vui lòng thử lại.",
"errors.alert.applicationSubmissionVerificationError": "Ứng dụng của bạn thiếu các trường bắt buộc. Vui lòng quay lại và sửa lỗi này trước khi gửi.",
"errors.cityError": "Vui lòng nhập thành phố",
"errors.dateError": "Vui lòng nhập ngày hợp lệ",
"errors.dateOfBirthErrorAge": "Vui lòng nhập Ngày sinh hợp lệ_ phải từ 18 tuổi trở lên",
Expand Down Expand Up @@ -446,6 +447,7 @@
"listings.applicationOpenPeriod": "Bắt đầu nhận đơn Ghi danh",
"listings.applicationPerApplicantAgeDescription": "mỗi ứng viên từ 18 tuổi trở lên",
"listings.applicationsClosed": "Ngừng nhận Đơn ghi danh",
"listings.applicationsClosedRedirect": "Danh sách này không còn chấp nhận các ứng dụng.",
"listings.applications": "Đơn đăng ký",
"listings.apply.applicationWillBeAvailableOn": "Đơn ghi danh sẽ có sẵn để tải xuống và tới nhận vào %{openDate}",
"listings.apply.applyOnline": "Ghi danh Trực tuyến",
Expand Down
2 changes: 2 additions & 0 deletions shared-helpers/src/locales/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,7 @@
"errors.agreeError": "您必須同意有關條款才能繼續",
"errors.alert.badRequest": "糟糕!好像出了點問題。請再試一次。如果您仍然遇到问题,请联系您的住房部门。",
"errors.alert.timeoutPleaseTryAgain": "糟糕!好像出了點問題。請再試一次。",
"errors.alert.applicationSubmissionVerificationError": "您的申请缺少必填字段。请在提交前返回并更正此问题。",
"errors.cityError": "請輸入城市名稱",
"errors.dateError": "請輸入有效的日期",
"errors.dateOfBirthErrorAge": "請輸入有效的出生日期,且您必須年滿 18 歲以上",
Expand Down Expand Up @@ -451,6 +452,7 @@
"listings.applicationOpenPeriod": "接受申請期限",
"listings.applicationPerApplicantAgeDescription": "每位年滿 18 歲的申請人",
"listings.applicationsClosed": "申請期限已經結束",
"listings.applicationsClosedRedirect": "此房源不再接受申请。",
"listings.applications": "申請",
"listings.apply.applicationWillBeAvailableOn": "申請表將可供下載,亦可在 %{openDate} 領取",
"listings.apply.applyOnline": "線上申請",
Expand Down
37 changes: 28 additions & 9 deletions shared-helpers/src/utilities/photos.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,39 @@
import { Asset, Listing } from "@bloom-housing/backend-core/types"

export const CLOUDINARY_BUILDING_LABEL = "cloudinaryBuilding"

export const cloudinaryUrlFromId = (publicId: string, size = 400) => {
const cloudName = process.env.cloudinaryCloudName || process.env.CLOUDINARY_CLOUD_NAME
return `https://res.cloudinary.com/${cloudName}/image/upload/w_${size},c_limit,q_65/${publicId}.jpg`
}

export const imageUrlFromListing = (listing: Listing, size = 400) => {
// Use the new `image` field
export const getUrlForListingImage = (image: Asset, size = 400) => {
if (!image) return null

if (image.label == CLOUDINARY_BUILDING_LABEL) {
return cloudinaryUrlFromId(image.fileId, size)
} else {
return image.fileId
}
}

export const imageUrlFromListing = (listing: Listing, size = 400): string[] => {
const imageAssets =
listing?.images?.length && listing.images[0].image ? [listing.images[0].image] : listing?.assets
listing?.images?.length && listing.images[0].image
? listing.images
.sort((imageA, imageB) => (imageA.ordinal ?? 10) - (imageB?.ordinal ?? 10))
.map((imageObj) => imageObj.image)
: listing?.assets

// Fallback to `assets`
const cloudinaryBuilding = imageAssets?.find(
(asset: Asset) => asset.label == "cloudinaryBuilding"
)?.fileId
if (cloudinaryBuilding) return cloudinaryUrlFromId(cloudinaryBuilding, size)
const imageUrls = imageAssets
?.filter(
(asset: Asset) => asset.label === CLOUDINARY_BUILDING_LABEL || asset.label === "building"
)
?.map((asset: Asset) => {
return asset.label === CLOUDINARY_BUILDING_LABEL
? cloudinaryUrlFromId(asset.fileId, size)
: asset.fileId
})

return imageAssets?.find((asset: Asset) => asset.label == "building")?.fileId
return imageUrls?.length > 0 ? imageUrls : [""]
}
32 changes: 29 additions & 3 deletions sites/partners/cypress/e2e/03-listing.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,40 @@ describe("Listing Management Tests", () => {
cy.getByID("jurisdiction.id").select(listing["jurisdiction.id"])
cy.get("#name").type(listing["name"])
cy.get("#developer").type(listing["developer"])
cy.getByID("addPhotoButton").contains("Add Photo").click()
cy.get(`[data-testid="dropzone-input"]`).attachFile(
// Test photo upload
cy.getByTestId("add-photos-button").contains("Add Photo").click()
cy.getByTestId("dropzone-input").attachFile(
"cypress-automated-image-upload-071e2ab9-5a52-4f34-85f0-e41f696f4b96.jpeg",
{
subjectType: "drag-n-drop",
}
)
cy.get(`[data-testid="listing-photo-uploaded"]`).contains("Save").click()
cy.getByTestId("drawer-photos-table").contains(
"cypress-automated-image-upload-071e2ab9-5a52-4f34-85f0-e41f696f4b96"
)
cy.getByTestId("listing-photo-uploaded").contains("Save").click()
cy.getByTestId("photos-table").contains(
"cypress-automated-image-upload-071e2ab9-5a52-4f34-85f0-e41f696f4b96"
)

cy.getByTestId("add-photos-button").contains("Edit Photos").click()
cy.getByTestId("dropzone-input").attachFile(
"cypress-automated-image-upload-46806882-b98d-49d7-ac83-8016ab4b2f08.jpg",
{
subjectType: "drag-n-drop",
}
)
cy.getByTestId("drawer-photos-table").contains(
"cypress-automated-image-upload-46806882-b98d-49d7-ac83-8016ab4b2f08"
)
cy.getByTestId("listing-photo-uploaded").contains("Save").click()
cy.getByTestId("photos-table").contains(
"cypress-automated-image-upload-46806882-b98d-49d7-ac83-8016ab4b2f08"
)
cy.getByTestId("photos-table").get("tbody > tr").should("have.length", 2)
cy.getByTestId("photos-table")
.get("tbody > tr:nth-of-type(2)")
.should("not.contain", "Primary photo")
cy.getByID("buildingAddress.street").type(listing["buildingAddress.street"])
cy.getByID("neighborhood").type(listing["neighborhood"])
cy.getByID("buildingAddress.city").type(listing["buildingAddress.city"])
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion sites/partners/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
"dependencies": {
"@bloom-housing/backend-core": "^7.13.0",
"@bloom-housing/shared-helpers": "^7.7.1",
"@bloom-housing/ui-components": "^12.0.8",
"@bloom-housing/ui-components": "^12.0.9",
"@bloom-housing/ui-seeds": "^1.2.1",
"@mapbox/mapbox-sdk": "^0.13.0",
"ag-grid-community": "^26.0.0",
Expand Down
Loading

0 comments on commit 4f438ad

Please sign in to comment.