@@ -22,24 +22,28 @@ import { DateFieldComponent } from '@placeos/form-fields';
2222import { addDays , endOfDay , startOfDay , startOfWeek } from 'date-fns' ;
2323
2424const SHIFT_PRESETS : Record < string , { start : number ; end : number } > = {
25- business : { start : 540 , end : 1020 } ,
26- morning : { start : 360 , end : 720 } ,
27- afternoon : { start : 720 , end : 1080 } ,
25+ day_worker : { start : 420 , end : 1020 } ,
26+ day_shift_12hr : { start : 330 , end : 1110 } ,
27+ night_shift_12hr : { start : 1050 , end : 390 } ,
28+ half_day_am : { start : 420 , end : 720 } ,
29+ half_day_pm : { start : 750 , end : 1020 } ,
2830} ;
2931
3032@Component ( {
3133 selector : 'parking-request-form-details' ,
3234 template : `
3335 @if (form()) {
34- <div class="space-y-4" [formGroup]="form()">
36+ <div [formGroup]="form()">
3537 <!-- BOOKING FREQUENCY -->
36- <div class="border-base-300 space-y-3 rounded-lg border p-4">
37- <h3
38- class="text-info flex items-center gap-2 text-sm font-bold tracking-wider uppercase"
39- >
40- <icon class="text-lg">date_range</icon >
38+ <div
39+ class="gradient border-base-content flex items-center space-x-2 border-l-8 px-4 py-3 font-medium"
40+ >
41+ <icon>date_range</icon >
42+ <div >
4143 {{ 'BOOKINGS.PARKING_BOOKING_FREQUENCY' | translate }}
42- </h3>
44+ </div>
45+ </div>
46+ <div class="space-y-3 p-4">
4347 <a-date-field
4448 name="date"
4549 formControlName="date"
@@ -248,13 +252,15 @@ const SHIFT_PRESETS: Record<string, { start: number; end: number }> = {
248252 </div>
249253
250254 <!-- REQUEST TYPE -->
251- <div class="border-base-300 space-y-3 rounded-lg border p-4">
252- <h3
253- class="text-info flex items-center gap-2 text-sm font-bold tracking-wider uppercase"
254- >
255- <icon class="text-lg">ballot</icon >
255+ <div
256+ class="gradient border-base-content flex items-center space-x-2 border-l-8 px-4 py-3 font-medium"
257+ >
258+ <icon>ballot</icon >
259+ <div >
256260 {{ 'BOOKINGS.PARKING_REQUEST_TYPE' | translate }}
257- </h3>
261+ </div>
262+ </div>
263+ <div class="space-y-3 p-4">
258264 <div class="space-y-2">
259265 @for (type of request_types(); track type.value) {
260266 <div
@@ -312,13 +318,15 @@ const SHIFT_PRESETS: Record<string, { start: number; end: number }> = {
312318 </div>
313319
314320 <!-- SHIFT SELECTION -->
315- <div class="border-base-300 space-y-3 rounded-lg border p-4">
316- <h3
317- class="text-info flex items-center gap-2 text-sm font-bold tracking-wider uppercase"
318- >
319- <icon class="text-lg">schedule</icon >
321+ <div
322+ class="gradient border-base-content flex items-center space-x-2 border-l-8 px-4 py-3 font-medium"
323+ >
324+ <icon>schedule</icon >
325+ <div >
320326 {{ 'BOOKINGS.PARKING_SHIFT_SELECTION' | translate }}
321- </h3>
327+ </div>
328+ </div>
329+ <div class="space-y-3 p-4">
322330 <div class="space-y-3">
323331 <div>
324332 <label class="mb-1 block text-sm font-medium">
@@ -334,16 +342,24 @@ const SHIFT_PRESETS: Record<string, { start: number; end: number }> = {
334342 setShiftType($event.value)
335343 "
336344 >
337- <mat-option value="business">{{
338- 'BOOKINGS.PARKING_SHIFT_BUSINESS'
345+ <mat-option value="day_worker">{{
346+ 'BOOKINGS.PARKING_SHIFT_DAY_WORKER'
347+ | translate
348+ }}</mat-option>
349+ <mat-option value="day_shift_12hr">{{
350+ 'BOOKINGS.PARKING_SHIFT_DAY_12HR'
351+ | translate
352+ }}</mat-option>
353+ <mat-option value="night_shift_12hr">{{
354+ 'BOOKINGS.PARKING_SHIFT_NIGHT_12HR'
339355 | translate
340356 }}</mat-option>
341- <mat-option value="morning ">{{
342- 'BOOKINGS.PARKING_SHIFT_MORNING '
357+ <mat-option value="half_day_am ">{{
358+ 'BOOKINGS.PARKING_SHIFT_HALF_DAY_AM '
343359 | translate
344360 }}</mat-option>
345- <mat-option value="afternoon ">{{
346- 'BOOKINGS.PARKING_SHIFT_AFTERNOON '
361+ <mat-option value="half_day_pm ">{{
362+ 'BOOKINGS.PARKING_SHIFT_HALF_DAY_PM '
347363 | translate
348364 }}</mat-option>
349365 <mat-option value="custom">{{
@@ -416,17 +432,17 @@ const SHIFT_PRESETS: Record<string, { start: number; end: number }> = {
416432 <!-- LOCATION PREFERENCE -->
417433 @if ((building_list | async)?.length > 1) {
418434 <div
419- class="border-base-300 space-y-3 rounded-lg border p-4 "
435+ class="gradient border-base-content flex items-center space-x-2 border-l-8 px-4 py-3 font-medium "
420436 >
421- <h3
422- class="text-success flex items-center gap-2 text-sm font-bold tracking-wider uppercase"
423- >
424- <icon class="text-lg">place</icon>
437+ <icon>place</icon>
438+ <div>
425439 {{
426440 'BOOKINGS.PARKING_LOCATION_PREFERENCE'
427441 | translate
428442 }}
429- </h3>
443+ </div>
444+ </div>
445+ <div class="space-y-3 p-4">
430446 @if (region_name) {
431447 <div class="text-sm font-medium">
432448 {{ region_name }}
@@ -477,13 +493,15 @@ const SHIFT_PRESETS: Record<string, { start: number; end: number }> = {
477493 </div>
478494 }
479495 <!-- VEHICLE DETAILS -->
480- <div class="border-base-300 space-y-3 rounded-lg border p-4">
481- <h3
482- class="text-info flex items-center gap-2 text-sm font-bold tracking-wider uppercase"
483- >
484- <icon class="text-lg">directions_car</icon >
496+ <div
497+ class="gradient border-base-content flex items-center space-x-2 border-l-8 px-4 py-3 font-medium"
498+ >
499+ <icon>directions_car</icon >
500+ <div >
485501 {{ 'BOOKINGS.PARKING_VEHICLE_DETAILS' | translate }}
486- </h3>
502+ </div>
503+ </div>
504+ <div class="space-y-3 p-4">
487505 <div class="flex flex-col gap-3 sm:flex-row sm:gap-4">
488506 <div class="flex-1">
489507 <label class="mb-1 block text-sm font-medium">
@@ -537,16 +555,18 @@ const SHIFT_PRESETS: Record<string, { start: number; end: number }> = {
537555 </div>
538556
539557 <!-- SPACE RESTRICTIONS -->
540- <div class="border-base-300 space-y-3 rounded-lg border p-4">
541- <h3
542- class="text-info flex items-center gap-2 text-sm font-bold tracking-wider uppercase"
543- >
544- <icon class="text-lg">tune</icon >
558+ <div
559+ class="gradient border-base-content flex items-center space-x-2 border-l-8 px-4 py-3 font-medium"
560+ >
561+ <icon>tune</icon >
562+ <div >
545563 {{
546564 'BOOKINGS.PARKING_SPACE_RESTRICTIONS_TITLE'
547565 | translate
548566 }}
549- </h3>
567+ </div>
568+ </div>
569+ <div class="space-y-3 p-4">
550570 <p class="text-sm opacity-60">
551571 {{
552572 'BOOKINGS.PARKING_SPACE_RESTRICTIONS_DESC'
@@ -579,7 +599,18 @@ const SHIFT_PRESETS: Record<string, { start: number; end: number }> = {
579599 </div>
580600 }
581601 ` ,
582- styles : [ `` ] ,
602+ styles : [
603+ `
604+ .gradient {
605+ background: linear-gradient(
606+ 105deg,
607+ var(--base-200) 0%,
608+ var(--base-200) 50%,
609+ var(--base-100) 100%
610+ );
611+ }
612+ ` ,
613+ ] ,
583614 imports : [
584615 CommonModule ,
585616 ReactiveFormsModule ,
@@ -624,8 +655,8 @@ export class ParkingRequestFormDetailsComponent
624655 public readonly week_options = computed ( ( ) =>
625656 Array . from ( { length : this . max_weeks ( ) } , ( _ , i ) => i + 1 ) ,
626657 ) ;
627- public readonly shift_type = signal < string > ( 'custom ' ) ;
628- public readonly start_time_mins = signal < number > ( 480 ) ;
658+ public readonly shift_type = signal < string > ( 'day_worker ' ) ;
659+ public readonly start_time_mins = signal < number > ( 420 ) ;
629660 public readonly end_time_mins = signal < number > ( 1020 ) ;
630661
631662 public readonly WEEKDAY_OPTIONS = [ 1 , 2 , 3 , 4 , 5 ] . map ( ( index ) => ( {
@@ -701,18 +732,17 @@ export class ParkingRequestFormDetailsComponent
701732 public ngOnInit ( ) {
702733 const form = this . form ( ) ;
703734 if ( ! form ) return ;
735+ const is_edit = ! ! form . value . id ;
704736 const date = form . getRawValue ( ) . date ;
705- if ( date ) {
737+ if ( is_edit && date ) {
706738 const d = new Date ( date ) ;
707739 const start = d . getHours ( ) * 60 + d . getMinutes ( ) ;
708- const duration = form . value . duration || 540 ;
740+ const duration = form . value . duration || 600 ;
709741 this . start_time_mins . set ( start ) ;
710742 this . end_time_mins . set ( start + duration ) ;
711743 this . _detectShiftType ( start , start + duration ) ;
712744 } else {
713- this . start_time_mins . set ( 480 ) ;
714- this . end_time_mins . set ( 1020 ) ;
715- this . shift_type . set ( 'custom' ) ;
745+ this . setShiftType ( 'day_worker' ) ;
716746 }
717747 const is_daily = form . value . recurrence_type === 'daily' ;
718748 this . booking_frequency . set ( is_daily ? 'daily' : 'single' ) ;
@@ -824,10 +854,13 @@ export class ParkingRequestFormDetailsComponent
824854 const raw_date = form . getRawValue ( ) . date || Date . now ( ) ;
825855 const day = startOfDay ( raw_date ) ;
826856 const new_date = day . valueOf ( ) + start_mins * 60 * 1000 ;
827- const duration = Math . max ( end_mins - start_mins , 30 ) ;
857+ const duration =
858+ end_mins > start_mins
859+ ? end_mins - start_mins
860+ : 1440 - start_mins + end_mins ;
828861 const was_disabled = form . controls . date . disabled ;
829862 if ( was_disabled ) form . controls . date . enable ( { emitEvent : false } ) ;
830- form . patchValue ( { date : new_date , duration } ) ;
863+ form . patchValue ( { date : new_date , duration : Math . max ( duration , 30 ) } ) ;
831864 if ( was_disabled ) form . controls . date . disable ( { emitEvent : false } ) ;
832865 }
833866
@@ -855,8 +888,9 @@ export class ParkingRequestFormDetailsComponent
855888 }
856889
857890 private _detectShiftType ( start : number , end : number ) {
891+ const normalized_end = end > 1440 ? end - 1440 : end ;
858892 for ( const [ key , preset ] of Object . entries ( SHIFT_PRESETS ) ) {
859- if ( preset . start === start && preset . end === end ) {
893+ if ( preset . start === start && preset . end === normalized_end ) {
860894 this . shift_type . set ( key ) ;
861895 return ;
862896 }
0 commit comments