diff --git a/.circleci/config.yml b/.circleci/config.yml
index d2290bfacd..8a5e1ef5c7 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -194,15 +194,20 @@ jobs:
JEST_JUNIT_OUTPUT_DIR: ./reports/junit/
- store_test_results:
path: ./reports/junit/
+ - store_artifacts:
+ path: app/javascript/test-coverage
unit-rspec:
<<: *defaults
steps:
- setup
+ - run: wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
- run: sudo apt-get update -y
- run: sudo apt-get install graphicsmagick
- run: RAILS_ENV=test bundle exec rails db:create
- run: RAILS_ENV=test bundle exec rails db:test:prepare
- run: bundle exec rake spec
+ - store_artifacts:
+ path: coverage
unit-angular:
<<: *defaults
steps:
diff --git a/.env.sample b/.env.sample
index 184bf44959..9e5e6cb75c 100644
--- a/.env.sample
+++ b/.env.sample
@@ -1,7 +1,4 @@
EASYPOST_API_KEY=''
-SFGOV_DATA_USERNAME=''
-SFGOV_DATA_PASSWORD=''
-SFGOV_DATA_APP_TOKEN=''
LOCALHOST=''
GOOGLE_TAG_MANAGER_KEY=''
S3_ACCESS_KEY=''
@@ -16,7 +13,7 @@ SALESFORCE_PASSWORD=''
SALESFORCE_SECURITY_TOKEN=''
SALESFORCE_CLIENT_SECRET=''
SALESFORCE_CLIENT_ID=''
-SALESFORCE_HOST='test.salesforce.com'
+SALESFORCE_HOST=''
SALESFORCE_INSTANCE_URL=''
S3_BUCKET=''
RESOURCE_URL=''
diff --git a/.eslintrc.js b/.eslintrc.js
index c4f57aa965..8497844ba9 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -8,6 +8,8 @@ module.exports = {
globals: {
Atomics: "readonly",
SharedArrayBuffer: "readonly",
+ cy: "readonly",
+ Cypress: "readonly",
},
// Specifies the ESLint parser
parser: "@typescript-eslint/parser",
diff --git a/.gitignore b/.gitignore
index 3fe197b975..f6bc4c6db6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -56,6 +56,7 @@ yarn-debug.log*
.DS_Store
# Test output
+coverage
app/javascript/test-coverage
junit.xml
cypress/screenshots/*
diff --git a/Gemfile b/Gemfile
index 984e41bd13..adfaef84f1 100644
--- a/Gemfile
+++ b/Gemfile
@@ -23,7 +23,7 @@ gem "sprockets-rails"
gem 'sprockets_uglifier_with_source_maps'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby
-gem 'puma', '~> 5.6.8'
+gem 'puma', '~> 6.4.2'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.8.0'
diff --git a/Gemfile.lock b/Gemfile.lock
index 272b5ef78a..3cb962f498 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -255,11 +255,11 @@ GEM
net-protocol
newrelic_rpm (9.0.0)
nio4r (2.7.0)
- nokogiri (1.14.2-arm64-darwin)
+ nokogiri (1.16.2-arm64-darwin)
racc (~> 1.4)
- nokogiri (1.14.2-x86_64-darwin)
+ nokogiri (1.16.2-x86_64-darwin)
racc (~> 1.4)
- nokogiri (1.14.2-x86_64-linux)
+ nokogiri (1.16.2-x86_64-linux)
racc (~> 1.4)
oj (3.14.2)
oj_mimic_json (1.0.1)
@@ -286,9 +286,9 @@ GEM
pry (>= 0.10.4)
psych (3.3.4)
public_suffix (5.0.1)
- puma (5.6.8)
+ puma (6.4.2)
nio4r (~> 2.0)
- racc (1.6.2)
+ racc (1.7.3)
rack (2.2.6.4)
rack-cors (1.0.6)
rack (>= 1.6.0)
@@ -521,7 +521,7 @@ DEPENDENCIES
pry-byebug
pry-rails
psych (< 4)
- puma (~> 5.6.8)
+ puma (~> 6.4.2)
rack (>= 2.2.3)
rack-cors (~> 1.0.5)
rack-rewrite (~> 1.5.0)
diff --git a/app/assets/javascripts/listings/ListingPreferenceService.js.coffee b/app/assets/javascripts/listings/ListingPreferenceService.js.coffee
index dd844ad7b7..f68e9e435e 100644
--- a/app/assets/javascripts/listings/ListingPreferenceService.js.coffee
+++ b/app/assets/javascripts/listings/ListingPreferenceService.js.coffee
@@ -65,6 +65,10 @@ ListingPreferenceService = ($http, ListingConstantsService, ListingIdentityServi
!_.invert(Service.preferenceMap)[listingPref.preferenceName]
customProofPreferences = _.remove customPreferences, (customPref) ->
_.includes(Service.hardcodeCustomProofPrefs, customPref.preferenceName)
+
+ # custom preferences related to Veterans should not be seen by applicants
+ _.remove(customPreferences, (pref) -> _.includes(pref.preferenceName?.toLowerCase(), "veteran"))
+
listing.customPreferences = _.sortBy customPreferences, (pref) -> pref.order
listing.customProofPreferences = _.sortBy customProofPreferences, (pref) -> pref.order
diff --git a/app/assets/javascripts/shared/SharedService.js.coffee b/app/assets/javascripts/shared/SharedService.js.coffee
index 5a983d3dc5..de39bbde5d 100644
--- a/app/assets/javascripts/shared/SharedService.js.coffee
+++ b/app/assets/javascripts/shared/SharedService.js.coffee
@@ -171,7 +171,7 @@ SharedService = ($http, $state, $window, $document) ->
$window.VETERANS_APPLICATION_QUESTION is 'true' &&
!!listing.Listing_Lottery_Preferences &&
_.some(listing.Listing_Lottery_Preferences, (pref) ->
- pref?.Lottery_Preference?.Name?.toLowerCase().includes("veteran")
+ _.includes(pref?.Lottery_Preference?.Name?.toLowerCase(), "veteran")
)
return Service
diff --git a/app/assets/javascripts/short-form/ShortFormApplicationController.js.coffee b/app/assets/javascripts/short-form/ShortFormApplicationController.js.coffee
index c5f0f0b5ee..62cc57782b 100644
--- a/app/assets/javascripts/short-form/ShortFormApplicationController.js.coffee
+++ b/app/assets/javascripts/short-form/ShortFormApplicationController.js.coffee
@@ -718,19 +718,13 @@ ShortFormApplicationController = (
$scope.preferences.veterans_household_member = null
$scope.checkAfterVeteransPreference = ->
- # We don't want to show custom-preference page at all right now, because of the new combo-preferences in salesforce
- # We might want to re-enable them in the future
- # $scope.checkForCustomPreferences()
- $scope.checkIfNoPreferencesSelected()
+ $scope.checkForCustomPreferences()
$scope.checkAfterPreferencesPrograms = ->
if $scope.showVeteransApplicationQuestion()
ShortFormNavigationService.goToApplicationPage('dahlia.short-form-application.veterans-preference')
else
- # We don't want to show custom-preference page at all right now, because of the new combo-preferences in salesforce
- # We might want to re-enable them in the future
- # $scope.checkForCustomPreferences()
- $scope.checkIfNoPreferencesSelected()
+ $scope.checkForCustomPreferences()
########## END VETERANS PREFERENCE LOGIC ##########
diff --git a/app/assets/javascripts/short-form/ShortFormNavigationService.js.coffee b/app/assets/javascripts/short-form/ShortFormNavigationService.js.coffee
index 98fdc9a2d1..6b081dcc9e 100644
--- a/app/assets/javascripts/short-form/ShortFormNavigationService.js.coffee
+++ b/app/assets/javascripts/short-form/ShortFormNavigationService.js.coffee
@@ -405,10 +405,8 @@ ShortFormNavigationService = (
when 'review-optional'
if ShortFormApplicationService.applicantHasNoPreferences()
'general-lottery-notice'
- # We don't want to show custom-preference page at all right now, because of the new combo-preferences in salesforce
- # We might want to re-enable them in the future
- # else if Service.hasCustomPreferences()
- # 'custom-preferences'
+ else if Service.hasCustomPreferences()
+ 'custom-preferences'
else if !Service.showVeteransApplicationQuestion()
'preferences-programs'
else
@@ -493,18 +491,12 @@ ShortFormNavigationService = (
"custom-proof-preferences({prefIdx: #{currentIndex - 1}})"
Service.getPrevPageOfGeneralLottery = ->
- # We don't want to show custom-preference page at all right now, because of the new combo-preferences in salesforce
- # We might want to re-enable them in the future
- # customProofPreferences = ShortFormApplicationService.listing.customProofPreferences
- # if customProofPreferences.length
- # "custom-proof-preferences({prefIdx: #{customProofPreferences.length - 1}})"
- # else if Service.hasCustomPreferences()
- # 'custom-preferences'
- # else if !Service.showVeteransApplicationQuestion()
- # 'preferences-programs'
- # else
- # 'veterans-preference'
- if !Service.showVeteransApplicationQuestion()
+ customProofPreferences = ShortFormApplicationService.listing.customProofPreferences
+ if customProofPreferences.length
+ "custom-proof-preferences({prefIdx: #{customProofPreferences.length - 1}})"
+ else if Service.hasCustomPreferences()
+ 'custom-preferences'
+ else if !ShortFormApplicationService.showVeteransApplicationQuestion
'preferences-programs'
else
'veterans-preference'
diff --git a/app/assets/json/translations/react/en.json b/app/assets/json/translations/react/en.json
index d124e4fe73..701d9fc35b 100644
--- a/app/assets/json/translations/react/en.json
+++ b/app/assets/json/translations/react/en.json
@@ -846,7 +846,7 @@
"listings.apply.submitAPaperApplication": "Submit a Paper Application",
"listings.apply.visitAHousingCounselor": "Visit a local housing counselor for help with your application.",
"listings.apply.visitHomeownershipSf": "Visit HomeownershipSF",
- "listings.atTotalIncome": "at $%{income} %{per}",
+ "listings.atTotalIncome": "at $%{income} %{per}",
"listings.availableAndWaitlist": "Available Units & Open Waitlist",
"listings.availableUnits": "Available Units",
"listings.availableUnitsAndOpenWaitlist": "Available Units & Open Waitlist",
@@ -860,7 +860,7 @@
"listings.call": "Call %{phoneNumber}",
"listings.cc&r": "Covenants, Conditions and Restrictions (CC&R's)",
"listings.cc&rDescription": "The CC&R's explain the rules of the homeowners' association, and restrict how you can modify the property.",
- "listings.clickForOtherLisitings": "Click Here for other rental and ownership affordable housing opportunities.",
+ "listings.clickForOtherLisitings": "Click Here for other rental and ownership affordable housing opportunities.",
"listings.confirmedPreferenceList": "Confirmed %{preference} List",
"listings.currentWaitlistSize": "Current Waitlist Size",
"listings.customListingType.educator": "SF public schools employee housing",
@@ -933,7 +933,7 @@
"listings.features.unitFeatures": "Unit Features",
"listings.features.utilities": "Utilities",
"listings.finalWaitlistSize": "Final Waitlist Size",
- "listings.forHouseholdSize": "for %{size} %{people}",
+ "listings.forHouseholdSize": "for %{size} %{people}",
"listings.forIncomeCalculations": "For income calculations, household size includes everyone (all ages) living in the unit.",
"listings.habitat.applicationProcess.ol1": "You must go to a Habitat for Humanity information session.",
"listings.habitat.applicationProcess.ol10": "You can move into your new home!",
@@ -966,7 +966,7 @@
"listings.housingProgram": "Housing Program",
"listings.importantProgramRules": "Important Program Rules",
"listings.includesPriorityUnits": "Includes Priority Units for:",
- "listings.includingChildren": "(including %{number} %{children} under 6)",
+ "listings.includingChildren": "(including %{number} %{children} under 6)",
"listings.incomeExceptions.intro": "People in your household may need special income calculations if they:",
"listings.incomeExceptions.nontaxable": "Receive non-taxable income (non-taxable income might include SSI, SSDI, child support payments, and worker’s compensation benefits).",
"listings.incomeExceptions.students": "Are full-time students (but not the primary applicant).",
diff --git a/app/assets/json/translations/react/es.json b/app/assets/json/translations/react/es.json
index 61517774ad..4c48b47050 100644
--- a/app/assets/json/translations/react/es.json
+++ b/app/assets/json/translations/react/es.json
@@ -495,12 +495,12 @@
"f2ReviewTerms.title": "Términos",
"footer.cityCountyOfSf": "Ciudad y condado de San Francisco",
"footer.contact": "Comuníquese con",
- "footer.dahliaDescription": "DAHLIA: El Portal de Vivienda de San Francisco es un proyecto de la Oficina de Desarrollo Comunitario y de Viviendas del Alcalde",
+ "footer.dahliaDescription": "DAHLIA: El Portal de Vivienda de San Francisco es un proyecto de la Oficina de Desarrollo Comunitario y de Viviendas del Alcalde",
"footer.disclaimer": "Aviso de responsabilidad",
"footer.forGeneralQuestions": "Si desea hacer una consulta general sobre el programa, comuníquese con MOHCD al 415-701-5500.",
"footer.forListingQuestions": "Si desea hacer preguntas sobre los anuncios y la solicitud, comuníquese con el agente del anuncio.",
"footer.giveFeedback": "Envíe sus comentarios",
- "footer.inPartnershipWith": "en colaboración con la Departamento de Servicios Digitales de San Francisco (San Francisco Digital Services) Oficina de Innovación Cívica de la Alcaldía (Mayor's Office of Civic Innovation)",
+ "footer.inPartnershipWith": "en colaboración con la Departamento de Servicios Digitales de San Francisco (San Francisco Digital Services) Oficina de Innovación Cívica de la Alcaldía (Mayor's Office of Civic Innovation)",
"footer.listingQuestions": "Si desea hacer preguntas sobre los anuncios y la solicitud, comuníquese con el agente del anuncio.",
"footer.privacyPolicy": "Política de Privacidad",
"forgotPassword.emailSentDescription": "Recibirá un correo electrónico con un enlace para restablecer su contraseña.",
@@ -842,7 +842,7 @@
"listings.apply.submitAPaperApplication": "Presente una solicitud impresa",
"listings.apply.visitAHousingCounselor": "Visite a un consejero de vivienda local si desea recibir ayuda con su solicitud.",
"listings.apply.visitHomeownershipSf": "Visite HomeownershipSF",
- "listings.atTotalIncome": "a $%{income} %{per}",
+ "listings.atTotalIncome": "a $%{income} %{per}",
"listings.availableAndWaitlist": "Unidades disponibles y lista de espera abierta",
"listings.availableUnits": "Unidades disponibles",
"listings.availableUnitsAndOpenWaitlist": "Unidades disponibles y lista de espera abierta",
@@ -856,7 +856,7 @@
"listings.call": "Llame al %{phoneNumber}",
"listings.cc&r": "Cláusulas, condiciones y restricciones (Covenants, Conditions and Restrictions, CC&R)",
"listings.cc&rDescription": "Las CC&R establecen las normas de la asociación de propietarios y limitan la modificación de la propiedad.",
- "listings.clickForOtherLisitings": "Haga clic aquí para ver otras oportunidades de alquiler y de compra de vivienda asequible.",
+ "listings.clickForOtherLisitings": "Haga clic aquí para ver otras oportunidades de alquiler y de compra de vivienda asequible.",
"listings.confirmedPreferenceList": "Lista de %{preference} confirmada",
"listings.currentWaitlistSize": "Tamaño de la lista de espera actual",
"listings.customListingType.educator": "Viviendas para empleados de las escuelas públicas de SF",
@@ -929,7 +929,7 @@
"listings.features.unitFeatures": "Características de la unidad",
"listings.features.utilities": "Servicios públicos",
"listings.finalWaitlistSize": "Tamaño de la lista de espera final",
- "listings.forHouseholdSize": "para %{size} %{people}",
+ "listings.forHouseholdSize": "para %{size} %{people}",
"listings.forIncomeCalculations": "Para el cálculo de los ingresos, tenga en cuenta que el tamaño del grupo familiar incluye a todas las personas (de cualquier edad) que viven en la unidad.",
"listings.habitat.applicationProcess.ol1": "Debe asistir a una sesión informativa de Habitat for Humanity.",
"listings.habitat.applicationProcess.ol10": "¡Puede mudarse a su nueva casa!",
@@ -962,7 +962,7 @@
"listings.housingProgram": "Programa de vivienda",
"listings.importantProgramRules": "Reglas Importantes del Programa",
"listings.includesPriorityUnits": "Incluye unidades prioritarias para:",
- "listings.includingChildren": "(incluidos %{number} %{children} menores de 6 años)",
+ "listings.includingChildren": "(incluidos %{number} %{children} menores de 6 años)",
"listings.incomeExceptions.intro": "Las personas en su hogar pueden necesitar cálculos de ingresos especiales en el caso que ellos",
"listings.incomeExceptions.nontaxable": "Recibir ingresos no gravables (los ingresos no gravables pueden incluir SSI, SSDI, pagos de manutención infantil e indemnizaciones por accidentes laborales).",
"listings.incomeExceptions.students": "Sean estudiantes de tiempo completo (no se aplica al solicitante principal)",
diff --git a/app/assets/json/translations/react/tl.json b/app/assets/json/translations/react/tl.json
index bc9a07cce1..5ed9ea9093 100644
--- a/app/assets/json/translations/react/tl.json
+++ b/app/assets/json/translations/react/tl.json
@@ -495,12 +495,12 @@
"f2ReviewTerms.title": "Mga Patakaran",
"footer.cityCountyOfSf": "Lungsod at County ng San Francisco",
"footer.contact": "Kontak",
- "footer.dahliaDescription": "DAHLIA: Ang San Francisco Housing Portal ay proyekto ng Opisina para sa Pabahay at Pagpapaunlad ng Komunidad (Housing and Community Development) ng Mayor ",
+ "footer.dahliaDescription": "DAHLIA: Ang San Francisco Housing Portal ay proyekto ng Opisina para sa Pabahay at Pagpapaunlad ng Komunidad (Housing and Community Development) ng Mayor ",
"footer.disclaimer": "Pagwawaksi ng Pananagutan (Disclaimer)",
"footer.forGeneralQuestions": "Para sa mga tanong tungkol sa pangkalahatang programa, puwede ninyong tawagan ang MOHCD sa 415-701-5500.",
"footer.forListingQuestions": "Para sa mga tanong tungkol sa nakalistang pabahay at aplikasyon, pakikontak ang property agent o Ahente para sa pagpapaupa na makikita sa NAKALISTANG PABAHAY.",
"footer.giveFeedback": "Magbigay ng Opinyon ",
- "footer.inPartnershipWith": "sa pakikipagtulungan sa Serbisyong Pang-Digital ng San Francisco (San Francisco Digital Services) Opisina ng Meyor sa Sibikang Inobasyon (Office of Civic Innovation)",
+ "footer.inPartnershipWith": "sa pakikipagtulungan sa Serbisyong Pang-Digital ng San Francisco (San Francisco Digital Services) Opisina ng Meyor sa Sibikang Inobasyon (Office of Civic Innovation)",
"footer.listingQuestions": "Para sa mga tanong tungkol sa nakalistang pabahay at aplikasyon, pakikontak ang property agent o Ahente para sa pagpapaupa na makikita sa NAKALISTANG PABAHAY.",
"footer.privacyPolicy": "Polisiya Ukol sa Pagiging Pribado ng Impormasyon ",
"forgotPassword.emailSentDescription": "Makatatanggap kayo ng email na may link para mabago ninyo ang password. ",
@@ -842,7 +842,7 @@
"listings.apply.submitAPaperApplication": "Isumite ang Papel na Aplikasyon",
"listings.apply.visitAHousingCounselor": "Bumisita sa lokal na housing counselor (tagapayo para sa bahay) para matulungan kayo sa inyong aplikasyon.",
"listings.apply.visitHomeownershipSf": "Bisitahin ang Homeownership SF",
- "listings.atTotalIncome": "sa $%{income} %{per}",
+ "listings.atTotalIncome": "sa $%{income} %{per}",
"listings.availableAndWaitlist": "Mga Makukuhang Unit at Bukas na Waitlist (listahan ng mga naghihintay magkaroon ng pabahay)",
"listings.availableUnits": "Mga Makukuhang Unit ",
"listings.availableUnitsAndOpenWaitlist": "Mga Makukuhang Unit at Bukas na Waitlist (listahan ng mga naghihintay magkaroon ng pabahay)",
@@ -856,7 +856,7 @@
"listings.call": "Tumawag sa %{phoneNumber}",
"listings.cc&r": "Mga Kasunduan, Kondisyon, at Restriksyon (Covenants, Conditions and Restrictions, CC&R's)",
"listings.cc&rDescription": "Ipinaliliwanag ng CC&Rs ang mga patakaran ng samahan ng mga may-ari ng bahay o homeowner's association, at ang mga restriksiyon sa pagbabagong magagawa ninyo sa ari-arian. ",
- "listings.clickForOtherLisitings": "Mag-klik Dito para sa iba pang oportunidad sa pag-upa at sa pagmamay-ari ng abot-kayang pabahay. ",
+ "listings.clickForOtherLisitings": "Mag-klik Dito para sa iba pang oportunidad sa pag-upa at sa pagmamay-ari ng abot-kayang pabahay. ",
"listings.confirmedPreferenceList": "Kumpirmadong Listahan para sa %{preference} ",
"listings.currentWaitlistSize": "Kasalukuyang Laki ng Waitlist (listahan ng mga naghihintay magkaroon ng pabahay)",
"listings.customListingType.educator": "Pabahay para sa empleyado ng mga pampublikong paaralan ng SF",
@@ -929,7 +929,7 @@
"listings.features.unitFeatures": "Mga Katangian ng Unit",
"listings.features.utilities": "Mga Utility",
"listings.finalWaitlistSize": "Pinal na Laki ng Waitlist (listahan ng mga naghihintay magkaroon ng pabahay).",
- "listings.forHouseholdSize": "para sa %{size} %{people}",
+ "listings.forHouseholdSize": "para sa %{size} %{people}",
"listings.forIncomeCalculations": "Para sa mga kalkulasyon ng kita, kasama sa laki ng kabahayan (household size) ang lahat ng tao (lahat ng edad) na nakatira sa unit.",
"listings.habitat.applicationProcess.ol1": "Dapat kang dumalo sa isang sesyon para sa pagbibigay ng impormasyon ng Habitat for Humanity",
"listings.habitat.applicationProcess.ol10": "Puwede kang lumipat sa iyong bagong bahay!",
@@ -962,7 +962,7 @@
"listings.housingProgram": "Programa sa Pabahay (Housing Program)",
"listings.importantProgramRules": "Mahahalagang Patakaran ng Programa ",
"listings.includesPriorityUnits": "Kasama ang mga Priority Unit para sa:",
- "listings.includingChildren": "(kasama ang %{number} %{children} mas bata sa edad na 6)",
+ "listings.includingChildren": "(kasama ang %{number} %{children} mas bata sa edad na 6)",
"listings.incomeExceptions.intro": "Posibleng kailangan ng mga tao sa inyong kabahayan ng espesyal na pagkakalkula ng kita kung sila ay:",
"listings.incomeExceptions.nontaxable": "Makatanggap ng di nabubuwisang kita (maaaring kasama sa di nabubuwisang kita ang SSI, SSDI, mga pagbabayad ng sustento sa bata, at mga benepisyo ng kabayaran ng manggagawa).",
"listings.incomeExceptions.students": "Mga buong oras na estudyante (pero hindi ang pangunahing aplikante)",
diff --git a/app/assets/json/translations/react/zh.json b/app/assets/json/translations/react/zh.json
index 69a2b04c53..cc8dd60340 100644
--- a/app/assets/json/translations/react/zh.json
+++ b/app/assets/json/translations/react/zh.json
@@ -495,12 +495,12 @@
"f2ReviewTerms.title": "條款",
"footer.cityCountyOfSf": "舊金山市和郡",
"footer.contact": "聯絡資訊",
- "footer.dahliaDescription": "可負擔房屋項目名單、資訊和申請表資料庫 (Database of Affordable Housing Listings, Information, and Applications, DAHLIA):三藩市房屋網站 (San Francisco Housing Portal) 是 市長住房與社區發展辦公室的一項專案",
+ "footer.dahliaDescription": "可負擔房屋項目名單、資訊和申請表資料庫 (Database of Affordable Housing Listings, Information, and Applications, DAHLIA):三藩市房屋網站 (San Francisco Housing Portal) 是 市長住房與社區發展辦公室的一項專案",
"footer.disclaimer": "免責聲明",
"footer.forGeneralQuestions": "有關一般計畫詢問,可以致電 MOHCD,電話是 415-701-5500。",
"footer.forListingQuestions": "如需瞭解有關房屋項目和申請方面的問題,請與名單中例出的機構聯絡。",
"footer.giveFeedback": "提供意見",
- "footer.inPartnershipWith": "本專案與三藩市數碼服務部和 (San Francisco Digital Services) 市長市政創新辦公室 (Mayor's Office of Civic Innovation) 合作。",
+ "footer.inPartnershipWith": "本專案與三藩市數碼服務部和 (San Francisco Digital Services) 市長市政創新辦公室 (Mayor's Office of Civic Innovation) 合作。",
"footer.listingQuestions": "如需瞭解有關房屋項目和申請方面的問題,請與名單中例出的機構聯絡。",
"footer.privacyPolicy": "隱私政策",
"forgotPassword.emailSentDescription": "您會收到一封電子郵件,裡面包含重設密碼的連結。",
@@ -842,7 +842,7 @@
"listings.apply.submitAPaperApplication": "遞交書面申請表",
"listings.apply.visitAHousingCounselor": "約見本地房屋顧問以尋求申請協助。",
"listings.apply.visitHomeownershipSf": "點擊 HomeownershipSF",
- "listings.atTotalIncome": "總收入:$%{income} %{per}",
+ "listings.atTotalIncome": "總收入:$%{income} %{per}",
"listings.availableAndWaitlist": "現有單位與開放等候名單",
"listings.availableUnits": "可用單位",
"listings.availableUnitsAndOpenWaitlist": "現有單位與開放等候名單",
@@ -856,7 +856,7 @@
"listings.call": "電洽 %{phoneNumber}",
"listings.cc&r": "契約、條件與限制 (Covenants, Conditions and Restrictions, CC&R)",
"listings.cc&rDescription": "CC&R 說明有關屋主協會的規定,並且限制您如何裝修該物業。",
- "listings.clickForOtherLisitings": "按此查看其他租賃和購買平價住房機會。",
+ "listings.clickForOtherLisitings": "按此查看其他租賃和購買平價住房機會。",
"listings.confirmedPreferenceList": "確認的 %{preference} 名單",
"listings.currentWaitlistSize": "目前等候名單中的人數",
"listings.customListingType.educator": "三藩市公共學校雇員住房",
@@ -929,7 +929,7 @@
"listings.features.unitFeatures": "單位特色",
"listings.features.utilities": "水電瓦斯費",
"listings.finalWaitlistSize": "最終等候名單中的人數",
- "listings.forHouseholdSize": "人數:%{size} %{people}",
+ "listings.forHouseholdSize": "人數:%{size} %{people}",
"listings.forIncomeCalculations": "為計算收入,家庭人數須包含居住在該單位的所有成員 (無論年齡)。",
"listings.habitat.applicationProcess.ol1": "您必須參加 Habitat for Humanity 說明會。",
"listings.habitat.applicationProcess.ol10": "您可以搬入新家!",
@@ -962,7 +962,7 @@
"listings.housingProgram": "住房計劃",
"listings.importantProgramRules": "重要計畫規定",
"listings.includesPriorityUnits": "包括以下各項的優先住房單位:",
- "listings.includingChildren": "(包括%{number} %{children}6歲以下兒童)",
+ "listings.includingChildren": "(包括%{number} %{children}6歲以下兒童)",
"listings.incomeExceptions.intro": "如果您家中的成員符合以下情況,可能需要特別收入計算方式:",
"listings.incomeExceptions.nontaxable": "獲得非應稅收入 (非應稅收入可能包括 SSI、SSDI、兒童支援費用和勞工賠償權益)。",
"listings.incomeExceptions.students": "是全日制學生(但不是主申請人)",
diff --git a/app/javascript/__tests__/api/listingsApiService.test.ts b/app/javascript/__tests__/api/listingsApiService.test.ts
index 95f2b42f19..17d373365e 100644
--- a/app/javascript/__tests__/api/listingsApiService.test.ts
+++ b/app/javascript/__tests__/api/listingsApiService.test.ts
@@ -23,7 +23,7 @@ describe("listingsApiService", () => {
income_total: 70000,
include_children_under_6: true,
children_under_6: "2",
- type: null,
+ type: "",
}
expect(getEligibilityQueryString(filters, "rental")).toEqual(
"householdsize=4&incomelevel=70000&includeChildrenUnder6=true&childrenUnder6=2&listingsType=rental"
@@ -35,8 +35,8 @@ describe("listingsApiService", () => {
income_timeframe: "per_year",
income_total: 70000,
include_children_under_6: false,
- children_under_6: null,
- type: null,
+ children_under_6: "",
+ type: "",
}
expect(getEligibilityQueryString(filters, "rental")).toEqual(
"householdsize=4&incomelevel=70000&includeChildrenUnder6=false&childrenUnder6=&listingsType=rental"
@@ -49,7 +49,7 @@ describe("listingsApiService", () => {
income_total: 5000,
include_children_under_6: true,
children_under_6: "4",
- type: null,
+ type: "",
}
expect(getEligibilityQueryString(filters, "rental")).toContain("60000")
})
@@ -60,7 +60,7 @@ describe("listingsApiService", () => {
income_total: 5000,
include_children_under_6: true,
children_under_6: "4",
- type: null,
+ type: "",
}
expect(getEligibilityQueryString(filters, "ownership")).toContain("&listingsType=ownership")
})
diff --git a/app/javascript/__tests__/components/ErrorBoundary.test.tsx b/app/javascript/__tests__/components/ErrorBoundary.test.tsx
index 65a2e7aa29..c4e4705086 100644
--- a/app/javascript/__tests__/components/ErrorBoundary.test.tsx
+++ b/app/javascript/__tests__/components/ErrorBoundary.test.tsx
@@ -31,7 +31,7 @@ describe("ErrorBoundary", () => {
console.debug.mockRestore()
})
- it("displays content when there is no error", async (done) => {
+ it("displays content when there is no error", async () => {
const content = "test 123"
const { getByText } = await renderAndLoadAsync(
@@ -40,10 +40,9 @@ describe("ErrorBoundary", () => {
)
getByText(content)
- done()
})
- it("display fallback UI when error thrown for content level error boundary", async (done) => {
+ it("display fallback UI when error thrown for content level error boundary", async () => {
const { getByText } = await renderAndLoadAsync(
@@ -53,10 +52,9 @@ describe("ErrorBoundary", () => {
)
getByText("An error occurred. Check back later.")
- done()
})
- it("throws error when error occurs for page level boundary", async (done) => {
+ it("throws error when error occurs for page level boundary", async () => {
// In development environments, errors bubble up to window object so checking for error instead of redirect.
// https://reactjs.org/docs/react-component.html#componentdidcatch
@@ -69,6 +67,5 @@ describe("ErrorBoundary", () => {
)
).rejects.toThrow(errorMsg)
- done()
})
})
diff --git a/app/javascript/__tests__/components/TextTruncate.test.tsx b/app/javascript/__tests__/components/TextTruncate.test.tsx
index 1a034cc284..c034dae8d4 100644
--- a/app/javascript/__tests__/components/TextTruncate.test.tsx
+++ b/app/javascript/__tests__/components/TextTruncate.test.tsx
@@ -3,13 +3,12 @@ import { TextTruncate } from "../../components/TextTruncate"
import { renderAndLoadAsync } from "../__util__/renderUtils"
describe("TextTruncate", () => {
- it("truncates a string and adds an ellipsis when longer than 400 characters", async (done) => {
+ it("truncates a string and adds an ellipsis when longer than 400 characters", async () => {
const content =
"
As of 01/04/2022, there are 5 applications pending review for the remaining 2-Bedroom BMR unit. The application period began on 05/03/2021 at 8:00 AM PT. If interested, please submit an electronic application via the ShareFile secure link.
Instructions: Compile the application form and all required documents into one PDF file, and name the PDF file “MIRASF – Last Name, First Name” (Example, 123 Sample Street Unit A – Smith, John). Use the divider pages and place the corresponding documentation behind each divider page. Applications received in multiple files, an incorrect order, formats other than PDF or without supporting documents will not be accepted or reviewed. If you do not have internet access or are unable to submit electronically, please contact a housing counselor for assistance.
For the First Come First Served available unit details including sales price and HOA dues, please view the MIRA BMR Unit Matrix.
+ Tenants pay for gas, electricity.
-
-
- For pet fees: Cat is allowed with a $500 refundable deposit, $250 non-refundable cleaning fee and a pet addendum.
-
-
-
- Dogs are not allowed in the building.
-
-
-
- One parking space per unit available for $175 a month.
-
-
+
+
+ For pet fees: Cat is allowed with a $500 refundable deposit, $250 non-refundable cleaning fee and a pet addendum.
+
+
+
+ Dogs are not allowed in the building.
+
+
+
+ One parking space per unit available for $175 a month.
+
+
diff --git a/app/javascript/__tests__/modules/listingDetails/__snapshots__/ListingDetailsHabitat.test.tsx.snap b/app/javascript/__tests__/modules/listingDetails/__snapshots__/ListingDetailsHabitat.test.tsx.snap
index ce3059ac0a..5b2ceec77d 100644
--- a/app/javascript/__tests__/modules/listingDetails/__snapshots__/ListingDetailsHabitat.test.tsx.snap
+++ b/app/javascript/__tests__/modules/listingDetails/__snapshots__/ListingDetailsHabitat.test.tsx.snap
@@ -31,18 +31,18 @@ exports[`ListingDetailsHabitat displays habitat info when habitat listing 1`] =
>
Application Process
-
-
+
@@ -99,20 +99,20 @@ exports[`ListingDetailsHabitat displays habitat info when habitat listing 1`] =
>
For income calculations, household size includes everyone (all ages) living in the unit.
+ For households in which at least one member holds a Certificate of Preference from the former San Francisco Redevelopment Agency. COP holders were displaced by Agency action generally during the 1960s and 1970s.
+
+ For households in which at least one member holds a Displaced Tenant Housing Preference Certificate. DTHP Certificate holders are tenants who were evicted through either an Ellis Act Eviction or an Owner Move In Eviction, have been displaced by a fire, or who will experience an unaffordable rent increase due to affordability restrictions expiring. Once all units reserved for this preference are filled, remaining DTHP holders will receive Live/Work preference, regardless of their current residence or work location.
+
+ This is a custom description - For households in which at least one member lives or works in San Francisco. Requires submission of proof. Please note in order to claim Work Preference, the applicant currently work in San Francisco at least 75% of their working hours.
+
+ For households in which at least one member holds a Certificate of Preference from the former San Francisco Redevelopment Agency. COP holders were displaced by Agency action generally during the 1960s and 1970s.
+
+ For households who are currently paying more than 50% of income for housing costs or are living in public housing or project based Section 8 housing within San Francisco.
+
+ For households in which at least one member holds a Displaced Tenant Housing Preference Certificate. DTHP Certificate holders are tenants who were evicted through either an Ellis Act Eviction or an Owner Move In Eviction, have been displaced by a fire, or who will experience an unaffordable rent increase due to affordability restrictions expiring. Once all units reserved for this preference are filled, remaining DTHP holders will receive Live/Work preference, regardless of their current residence or work location.
+
+ For households in which at least one member either lives within the Supervisor district of the project or within a half-mile of the project. Requires submission of proof of address.
+
+ For households in which at least one member lives or works in San Francisco. Requires submission of proof. Please note in order to claim Work Preference, the applicant must currently work in San Francisco at least 75% of their working hours.
+
+ Right to Return - Alice Griffith. For households in which at least one member is a former or current resident of Alice Griffith public housing. Please note, these units are not subsidized — the rent will not change if your income changes.
+