@@ -12,7 +12,11 @@ import { MatRippleModule } from '@angular/material/core';
1212import { MatDialogRef } from '@angular/material/dialog' ;
1313import { MatProgressSpinnerModule } from '@angular/material/progress-spinner' ;
1414import { Router } from '@angular/router' ;
15- import { BookingAsset , BookingFormService } from '@placeos/bookings' ;
15+ import {
16+ BookingAsset ,
17+ BookingFormService ,
18+ findNearbyFeature ,
19+ } from '@placeos/bookings' ;
1620import {
1721 AsyncHandler ,
1822 Desk ,
@@ -226,6 +230,10 @@ export class AutoAssignedDeskModalComponent
226230 public readonly assigned_desk = signal < BookingAsset | Desk | null > ( null ) ;
227231 public readonly date = model < number | undefined > ( undefined ) ;
228232 public readonly duration = model < number | undefined > ( undefined ) ;
233+ /** When set, tries to find a desk nearby to this desk */
234+ public readonly nearby_desk_id = model < string | undefined > ( undefined ) ;
235+ /** When set, filters available desks to this level */
236+ public readonly level_id = model < string | undefined > ( undefined ) ;
229237
230238 public zoom = 1.5 ;
231239 public center = signal ( { x : 0.5 , y : 0.5 } ) ;
@@ -262,7 +270,7 @@ export class AutoAssignedDeskModalComponent
262270 } ) ;
263271
264272 // Get available resources (desks)
265- const available_desks = await firstTruthyValueFrom (
273+ let available_desks = await firstTruthyValueFrom (
266274 this . _state . available_resources ,
267275 ) ;
268276
@@ -272,26 +280,79 @@ export class AutoAssignedDeskModalComponent
272280 return ;
273281 }
274282
275- // Group desks by level and find level with most available desks
276- const desks_by_level = available_desks . reduce (
277- ( acc , desk ) => {
278- const level_id = desk . zone ?. id || 'unknown' ;
279- if ( ! acc [ level_id ] ) {
280- acc [ level_id ] = [ ] ;
283+ let assigned_desk : BookingAsset ;
284+ const nearby_desk_id = this . nearby_desk_id ( ) ;
285+ const level_id = this . level_id ( ) ;
286+
287+ // If nearby_desk_id is provided, try to find a desk nearby
288+ if ( nearby_desk_id ) {
289+ // Filter to same level if level_id is provided
290+ if ( level_id ) {
291+ const level_desks = available_desks . filter (
292+ ( desk ) => desk . zone ?. id === level_id ,
293+ ) ;
294+ if ( level_desks . length > 0 ) {
295+ available_desks = level_desks ;
281296 }
282- acc [ level_id ] . push ( desk ) ;
283- return acc ;
284- } ,
285- { } as Record < string , typeof available_desks > ,
286- ) ;
297+ }
287298
288- // Find the level with the most available desks
289- const level_with_most_desks = Object . entries ( desks_by_level ) . sort (
290- ( [ , a ] , [ , b ] ) => b . length - a . length ,
291- ) [ 0 ] ;
299+ // Try to find the level by looking at nearby desk in all resources
300+ const all_resources = await firstTruthyValueFrom (
301+ this . _state . resources ,
302+ ) ;
303+ const nearby_resource = all_resources . find (
304+ ( r ) =>
305+ r . id === nearby_desk_id || r . map_id === nearby_desk_id ,
306+ ) ;
307+
308+ if ( nearby_resource ?. zone ?. id ) {
309+ const level = this . _org . levelWithID ( [
310+ nearby_resource . zone . id ,
311+ ] ) ;
312+ if ( level ?. map_id ) {
313+ // Use findNearbyFeature to get the closest desk
314+ const desk_ids = available_desks . map (
315+ ( d ) => d . map_id || d . id ,
316+ ) ;
317+ const closest_id = await findNearbyFeature (
318+ level . map_id ,
319+ nearby_desk_id ,
320+ desk_ids ,
321+ ) ;
322+ if ( closest_id ) {
323+ assigned_desk = available_desks . find (
324+ ( d ) =>
325+ d . id === closest_id ||
326+ d . map_id === closest_id ,
327+ ) ;
328+ }
329+ }
330+ }
331+ }
292332
293- // Pick the first desk from the level with most availability
294- const assigned_desk = level_with_most_desks [ 1 ] [ 0 ] ;
333+ // Fallback to original logic if no nearby desk found
334+ if ( ! assigned_desk ) {
335+ // Group desks by level and find level with most available desks
336+ const desks_by_level = available_desks . reduce (
337+ ( acc , desk ) => {
338+ const zone_id = desk . zone ?. id || 'unknown' ;
339+ if ( ! acc [ zone_id ] ) {
340+ acc [ zone_id ] = [ ] ;
341+ }
342+ acc [ zone_id ] . push ( desk ) ;
343+ return acc ;
344+ } ,
345+ { } as Record < string , typeof available_desks > ,
346+ ) ;
347+
348+ // Find the level with the most available desks
349+ const level_with_most_desks = Object . entries (
350+ desks_by_level ,
351+ ) . sort ( ( [ , a ] , [ , b ] ) => b . length - a . length ) [ 0 ] ;
352+
353+ // Pick the first desk from the level with most availability
354+ assigned_desk = level_with_most_desks [ 1 ] [ 0 ] ;
355+ }
295356
296357 form . patchValue ( {
297358 asset_id : assigned_desk . id ,
0 commit comments