From 845aa040cc02f707fa6c529f60eec524b6a2c01f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Fri, 15 Aug 2025 01:08:56 +0200 Subject: [PATCH] [WIP] Integrate local aggregated address search in AddressPicker Added a `local-search` driver to support aggregated address fetching. Integrated the `getAddressesAggregated` function with `AddressPicker.vue` for dynamic search suggestions and abortable fetch requests. --- .../Repository/AddressReferenceRepository.php | 2 +- .../vuejs/AddressPicker/AddressPicker.vue | 36 ++++++++++++++++++- .../AddressPicker/driver/local-search.ts | 30 ++++++++++++++++ 3 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 src/Bundle/ChillMainBundle/Resources/public/vuejs/AddressPicker/driver/local-search.ts diff --git a/src/Bundle/ChillMainBundle/Repository/AddressReferenceRepository.php b/src/Bundle/ChillMainBundle/Repository/AddressReferenceRepository.php index 741d99b2c..08e662e37 100644 --- a/src/Bundle/ChillMainBundle/Repository/AddressReferenceRepository.php +++ b/src/Bundle/ChillMainBundle/Repository/AddressReferenceRepository.php @@ -77,7 +77,7 @@ final readonly class AddressReferenceRepository implements ObjectRepository $connection = $this->entityManager->getConnection(); $qb = $connection->createQueryBuilder(); - $qb->select('var.street AS street', 'cmpc.id AS postcode_id', 'cmpc.code AS code', 'cmpc.label AS label', 'jsonb_object_agg(var.address_id, var.streetnumber ORDER BY var.row_number) AS positions') + $qb->select('row_number() OVER () AS row_number','var.street AS street', 'cmpc.id AS postcode_id', 'cmpc.code AS code', 'cmpc.label AS label', 'jsonb_object_agg(var.address_id, var.streetnumber ORDER BY var.row_number) AS positions') ->from('view_chill_main_address_reference', 'var') ->innerJoin('var', 'chill_main_postal_code', 'cmpc', 'cmpc.id = var.postcode_id') ->groupBy('cmpc.id', 'var.street') diff --git a/src/Bundle/ChillMainBundle/Resources/public/vuejs/AddressPicker/AddressPicker.vue b/src/Bundle/ChillMainBundle/Resources/public/vuejs/AddressPicker/AddressPicker.vue index 30bc495e6..305f641dd 100644 --- a/src/Bundle/ChillMainBundle/Resources/public/vuejs/AddressPicker/AddressPicker.vue +++ b/src/Bundle/ChillMainBundle/Resources/public/vuejs/AddressPicker/AddressPicker.vue @@ -1,6 +1,11 @@ diff --git a/src/Bundle/ChillMainBundle/Resources/public/vuejs/AddressPicker/driver/local-search.ts b/src/Bundle/ChillMainBundle/Resources/public/vuejs/AddressPicker/driver/local-search.ts new file mode 100644 index 000000000..0903ec948 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Resources/public/vuejs/AddressPicker/driver/local-search.ts @@ -0,0 +1,30 @@ +export interface AddressAggregated { + row_number: number; + street: string; + postcode_id: number; + code: string; + label: string; + positions: Record; +} + +/** + * @throws {DOMException} when fetch is aborted, the property name is always equals to 'AbortError' + */ +export const getAddressesAggregated = async ( + search: string, + abortController: AbortController, +): Promise => { + const params = new URLSearchParams({ q: search }); + let response = null; + + response = await fetch( + `/api/1.0/main/address-reference/aggregated/search?${params}`, + { signal: abortController.signal }, + ); + + if (response.ok) { + return await response.json(); + } + + throw new Error(response.statusText); +};