From e8134d2626dc51c0a1fa27c138e1735d8453a142 Mon Sep 17 00:00:00 2001 From: Andrea Gueugnaut Date: Tue, 8 Oct 2024 15:33:02 +0200 Subject: [PATCH] fix: display ownership kind correctly --- frontend/package.json | 1 + .../HousingDetailsSubCardProperties.tsx | 6 ++--- frontend/src/models/Housing.tsx | 27 +++++++++---------- frontend/src/models/HousingFilters.tsx | 18 +++++-------- frontend/test/fixtures.test.ts | 4 +-- packages/models/src/OwnershipKind.ts | 8 ++++++ server/src/models/HousingApi.ts | 8 ------ server/src/repositories/housingRepository.ts | 8 +++--- server/src/test/testFixtures.ts | 8 +++--- yarn.lock | 1 + 10 files changed, 44 insertions(+), 45 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 8f3bdbb29..50d1ba00a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -62,6 +62,7 @@ "react-use": "^17.5.1", "redux": "^5.0.1", "ts-essentials": "^10.0.2", + "ts-pattern": "^5.4.0", "uuid": "^9.0.1", "web-vitals": "^1.1.2", "whatwg-fetch": "^3.6.20", diff --git a/frontend/src/components/HousingDetails/HousingDetailsSubCardProperties.tsx b/frontend/src/components/HousingDetails/HousingDetailsSubCardProperties.tsx index 8b3f7e754..3e97e75da 100644 --- a/frontend/src/components/HousingDetails/HousingDetailsSubCardProperties.tsx +++ b/frontend/src/components/HousingDetails/HousingDetailsSubCardProperties.tsx @@ -1,5 +1,5 @@ import { Text } from '../_dsfr'; -import { Housing, OwnershipKindLabels } from '../../models/Housing'; +import { formatOwnershipKind, Housing } from '../../models/Housing'; import { cadastralClassificationOptions } from '../../models/HousingFilters'; import HousingDetailsSubCard from './HousingDetailsSubCard'; @@ -21,7 +21,7 @@ function HousingDetailsSubCardProperties({ housing }: Props) { Type de propriété - {OwnershipKindLabels[housing.ownershipKind]} + {formatOwnershipKind(housing.ownershipKind)}
@@ -49,7 +49,7 @@ function HousingDetailsSubCardProperties({ housing }: Props) { { cadastralClassificationOptions.find( - (_) => _.value === String(housing.cadastralClassification), + (_) => _.value === String(housing.cadastralClassification) )?.label } diff --git a/frontend/src/models/Housing.tsx b/frontend/src/models/Housing.tsx index c923623c0..19e717206 100644 --- a/frontend/src/models/Housing.tsx +++ b/frontend/src/models/Housing.tsx @@ -1,10 +1,13 @@ import { differenceInDays, format } from 'date-fns'; +import { match, Pattern } from 'ts-pattern'; import { EnergyConsumption, HousingDTO, HousingKind, HousingStatus, + INTERNAL_CO_CONDOMINIUM_VALUES, + INTERNAL_MONO_CONDOMINIUM_VALUES, Occupancy } from '@zerologementvacant/models'; import { Owner, toOwnerDTO } from './Owner'; @@ -38,7 +41,7 @@ export interface Housing { uncomfortable: boolean; cadastralClassification: number; taxed: boolean; - ownershipKind: OwnershipKinds; + ownershipKind: string; buildingHousingCount?: number; buildingVacancyRate: number; dataFileYears: string[]; @@ -128,22 +131,16 @@ export function byAddress(h1: Housing, h2: Housing): Compare { return byCity; } -export const hasGeoPerimeters = (housing: Housing) => - housing.geoPerimeters && - housing.geoPerimeters.filter((_) => _ !== null).length > 0; - -export enum OwnershipKinds { - Single = 'single', - CoOwnership = 'co', - Other = 'other' +export function formatOwnershipKind(kind: string | null): string { + return match(kind) + .with( + Pattern.union(null, ...INTERNAL_MONO_CONDOMINIUM_VALUES), + () => 'Monopropriété' + ) + .with(Pattern.union(...INTERNAL_CO_CONDOMINIUM_VALUES), () => 'Copropriété') + .otherwise(() => 'Autre'); } -export const OwnershipKindLabels = { - [OwnershipKinds.Single]: 'Monopropriété', - [OwnershipKinds.CoOwnership]: 'Copropriété', - [OwnershipKinds.Other]: 'Autre' -}; - export type HousingSortable = Pick< Housing, 'rawAddress' | 'owner' | 'occupancy' | 'status' diff --git a/frontend/src/models/HousingFilters.tsx b/frontend/src/models/HousingFilters.tsx index 3a7daa3e6..509785e58 100644 --- a/frontend/src/models/HousingFilters.tsx +++ b/frontend/src/models/HousingFilters.tsx @@ -19,11 +19,7 @@ import { } from '@zerologementvacant/models'; import { OptionTreeElement, SelectOption } from './SelectOption'; import { HousingStates } from './HousingState'; -import { - OCCUPANCY_LABELS, - OwnershipKindLabels, - OwnershipKinds -} from './Housing'; +import { OCCUPANCY_LABELS } from './Housing'; import { LocalityKindLabels, LocalityKinds } from './Locality'; import EnergyConsumptionOption from '../components/_app/AppMultiSelect/EnergyConsumptionOption'; @@ -228,16 +224,16 @@ export const taxedOptions: SelectOption[] = [ export const ownershipKindsOptions: SelectOption[] = [ { - value: OwnershipKinds.Single, - label: OwnershipKindLabels[OwnershipKinds.Single] + value: 'single', + label: 'Monopropriété' }, { - value: OwnershipKinds.CoOwnership, - label: OwnershipKindLabels[OwnershipKinds.CoOwnership] + value: 'co', + label: 'Copropriété' }, { - value: OwnershipKinds.Other, - label: OwnershipKindLabels[OwnershipKinds.Other], + value: 'other', + label: 'Autre', badgeLabel: 'Autre type de propriété' } ]; diff --git a/frontend/test/fixtures.test.ts b/frontend/test/fixtures.test.ts index d51c14f52..47ac8b7c6 100644 --- a/frontend/test/fixtures.test.ts +++ b/frontend/test/fixtures.test.ts @@ -4,7 +4,7 @@ import randomstring from 'randomstring'; import { Owner } from '../src/models/Owner'; import { Address } from '../src/models/Address'; -import { Housing, OccupancyKind, OwnershipKinds } from '../src/models/Housing'; +import { Housing, OccupancyKind } from '../src/models/Housing'; import { AuthUser, User } from '../src/models/User'; import { SignupLink } from '../src/models/SignupLink'; import { Prospect } from '../src/models/Prospect'; @@ -103,7 +103,7 @@ export function genHousing(): Housing { uncomfortable: false, cadastralClassification: genNumber(1), taxed: false, - ownershipKind: OwnershipKinds.Single, + ownershipKind: 'single', buildingVacancyRate: genNumber(2), status: HousingStatus.NEVER_CONTACTED, source: null, diff --git a/packages/models/src/OwnershipKind.ts b/packages/models/src/OwnershipKind.ts index f7cf7346c..b8df80aa4 100644 --- a/packages/models/src/OwnershipKind.ts +++ b/packages/models/src/OwnershipKind.ts @@ -1,3 +1,11 @@ export const OWNERSHIP_KIND_VALUES = ['single', 'co', 'other'] as const; export type OwnershipKind = (typeof OWNERSHIP_KIND_VALUES)[number]; + +export const INTERNAL_MONO_CONDOMINIUM_VALUES = ['single'] as const; // and null +export const INTERNAL_CO_CONDOMINIUM_VALUES = [ + 'co', + 'CL', + 'CLV', + 'CV' +] as const; diff --git a/server/src/models/HousingApi.ts b/server/src/models/HousingApi.ts index 7333da761..87fbce2ad 100644 --- a/server/src/models/HousingApi.ts +++ b/server/src/models/HousingApi.ts @@ -87,14 +87,6 @@ export enum OwnershipKindsApi { Other = 'other' } -export const INTERNAL_MONO_CONDOMINIUM_VALUES = ['single'] as const; // and null -export const INTERNAL_CO_CONDOMINIUM_VALUES = [ - 'co', - 'CL', - 'CLV', - 'CV' -] as const; - export const getOwnershipKindFromValue = (value?: string) => { return !value ? OwnershipKindsApi.Single diff --git a/server/src/repositories/housingRepository.ts b/server/src/repositories/housingRepository.ts index 2b151aa38..002e00a93 100644 --- a/server/src/repositories/housingRepository.ts +++ b/server/src/repositories/housingRepository.ts @@ -3,6 +3,11 @@ import { Knex } from 'knex'; import _ from 'lodash'; import fp from 'lodash/fp'; +import { + AddressKinds, + INTERNAL_CO_CONDOMINIUM_VALUES, + INTERNAL_MONO_CONDOMINIUM_VALUES +} from '@zerologementvacant/models'; import { HousingSource, PaginationOptions } from '@zerologementvacant/shared'; import db, { toRawArray, where } from '~/infra/database'; import { @@ -10,8 +15,6 @@ import { HousingApi, HousingRecordApi, HousingSortApi, - INTERNAL_CO_CONDOMINIUM_VALUES, - INTERNAL_MONO_CONDOMINIUM_VALUES, OccupancyKindApi } from '~/models/HousingApi'; import { OwnerDBO, ownerTable, parseOwnerApi } from './ownerRepository'; @@ -32,7 +35,6 @@ import { groupsHousingTable } from './groupRepository'; import { housingOwnersTable } from './housingOwnerRepository'; import { campaignsHousingTable } from './campaignHousingRepository'; import { campaignsTable } from './campaignRepository'; -import { AddressKinds } from '@zerologementvacant/models'; import { ReadableStream } from 'node:stream/web'; import { Readable } from 'node:stream'; diff --git a/server/src/test/testFixtures.ts b/server/src/test/testFixtures.ts index 08040ccff..2251d1dfa 100644 --- a/server/src/test/testFixtures.ts +++ b/server/src/test/testFixtures.ts @@ -19,8 +19,6 @@ import { import { ENERGY_CONSUMPTION_GRADES, HousingApi, - INTERNAL_CO_CONDOMINIUM_VALUES, - INTERNAL_MONO_CONDOMINIUM_VALUES, OccupancyKindApi } from '~/models/HousingApi'; import { CampaignApi } from '~/models/CampaignApi'; @@ -77,7 +75,11 @@ import { AddressApi } from '~/models/AddressApi'; import { HousingNoteApi, NoteApi } from '~/models/NoteApi'; import { SenderApi } from '~/models/SenderApi'; import { DraftApi } from '~/models/DraftApi'; -import { HOUSING_KIND_VALUES } from '@zerologementvacant/models'; +import { + HOUSING_KIND_VALUES, + INTERNAL_CO_CONDOMINIUM_VALUES, + INTERNAL_MONO_CONDOMINIUM_VALUES +} from '@zerologementvacant/models'; export { genGeoCode } from '@zerologementvacant/utils'; diff --git a/yarn.lock b/yarn.lock index d86ad5cf7..04d6f7226 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9426,6 +9426,7 @@ __metadata: rimraf: "npm:^5.0.10" sass: "npm:^1.79.4" ts-essentials: "npm:^10.0.2" + ts-pattern: "npm:^5.4.0" typescript: "npm:^5.6.2" undici: "npm:^6.19.8" uuid: "npm:^9.0.1"