From b13e6dd96937790fe0b31fbbe75a195e65d49705 Mon Sep 17 00:00:00 2001 From: Yuvraj Jain <97535654+yuvrajjain2003@users.noreply.github.com> Date: Fri, 8 Mar 2024 09:42:21 -0500 Subject: [PATCH] Room Reservations (#250) This very significant feature landing adds the ability to reserve group rooms in the XL into the future. Full-stack implications from reservation UI to resource limitations on the backend. Feature implemented by group B8 in the Fall of 2023 and Spring of 2024. For a full run-down of this feature, see `docs/specs/room-reservation.md`. --- backend/api/coworking/ambassador.py | 19 +- backend/api/coworking/reservation.py | 45 +- backend/models/coworking/__init__.py | 3 +- backend/models/coworking/availability.py | 13 + backend/models/coworking/operating_hours.py | 4 + backend/models/coworking/reservation.py | 14 +- backend/models/coworking/time_range.py | 2 +- backend/models/room.py | 6 +- .../script/deployments/coworking_launch.py | 3 +- backend/script/reset_demo.py | 1 - backend/services/coworking/policy.py | 109 +++- backend/services/coworking/reservation.py | 494 +++++++++++++++++- backend/test/services/coworking/fixtures.py | 19 +- .../get_current_reservations_for_user_test.py | 23 +- .../get_map_current_reservations_test.py | 136 +++++ .../list_all_active_and_upcoming_test.py | 6 +- .../coworking/reservation/reservation_data.py | 22 +- backend/test/services/coworking/time.py | 8 + docs/images/make-reservations.png | Bin 0 -> 135923 bytes .../room-reservation/active-reservations.png | Bin 0 -> 106335 bytes .../room-reservation/confirmation-page.png | Bin 0 -> 87557 bytes .../room-reservation/make-reservation.png | Bin 0 -> 140894 bytes .../reservation-confirmed.png | Bin 0 -> 133574 bytes docs/images/upcoming-reservations.png | Bin 0 -> 48014 bytes docs/specs/room-reservation.md | 386 ++++++++++++++ .../ambassador-home-routing.module.ts | 22 + .../ambassador-home.component.css | 15 - .../ambassador-home.component.html | 179 +------ .../ambassador-home.component.ts | 116 +--- .../ambassador-home/ambassador-home.module.ts | 41 ++ .../ambassador-room.service.spec.ts | 16 + .../ambassador-room.service.ts | 75 +++ .../list/ambassador-room-list.component.css | 15 + .../list/ambassador-room-list.component.html | 153 ++++++ .../ambassador-room-list.component.spec.ts | 22 + .../list/ambassador-room-list.component.ts | 51 ++ .../ambassador-xl.service.spec.ts | 16 + .../ambassador-xl.service.ts} | 14 +- .../list/ambassador-xl-list.component.css | 15 + .../list/ambassador-xl-list.component.html | 164 ++++++ .../list/ambassador-xl-list.component.spec.ts | 22 + .../list/ambassador-xl-list.component.ts | 112 ++++ .../coworking-home.component.css | 220 ++++++-- .../coworking-home.component.html | 79 ++- .../coworking-home.component.ts | 71 ++- .../app/coworking/coworking-routing.module.ts | 14 +- .../src/app/coworking/coworking.models.ts | 74 ++- .../src/app/coworking/coworking.module.ts | 34 +- .../src/app/coworking/coworking.service.ts | 29 +- .../reservation/reservation.component.css | 26 +- .../reservation/reservation.service.ts | 2 +- .../confirm-reservation.component.css | 34 ++ .../confirm-reservation.component.html | 7 + .../confirm-reservation.component.spec.ts | 22 + .../confirm-reservation.component.ts | 77 +++ .../new-reservation-page.component.css | 58 ++ .../new-reservation-page.component.html | 34 ++ .../new-reservation-page.component.spec.ts | 22 + .../new-reservation-page.component.ts | 73 +++ .../reservation-table.service.spec.ts | 16 + .../reservation-table.service.ts | 373 +++++++++++++ .../room-reservation.service.spec.ts | 16 + .../room-reservation.service.ts | 114 ++++ .../src/app/coworking/rx-coworking-status.ts | 8 + .../coworking-reservation-card.css | 47 +- .../coworking-reservation-card.html | 229 ++++---- .../coworking-reservation-card.ts | 136 ++++- .../date-selector/date-selector.widget.css | 0 .../date-selector/date-selector.widget.html | 11 + .../date-selector/date-selector.widget.ts | 41 ++ .../dropin-availability-card.widget.css | 81 +-- .../operating-hours-dialog.widget.css | 11 +- .../operating-hours-dialog.widget.html | 5 +- .../operating-hours-panel.widget.css | 50 +- .../operating-hours-panel.widget.html | 3 +- .../room-reservation-table.widget.css | 39 ++ .../room-reservation-table.widget.html | 26 + .../room-reservation-table.widget.ts | 177 +++++++ .../event-editor/event-editor.component.html | 102 ++-- .../organization-card.widget.html | 2 + .../profile-editor.component.html | 157 +++--- 81 files changed, 4108 insertions(+), 773 deletions(-) create mode 100644 backend/test/services/coworking/reservation/get_map_current_reservations_test.py create mode 100644 docs/images/make-reservations.png create mode 100644 docs/images/specs/room-reservation/active-reservations.png create mode 100644 docs/images/specs/room-reservation/confirmation-page.png create mode 100644 docs/images/specs/room-reservation/make-reservation.png create mode 100644 docs/images/specs/room-reservation/reservation-confirmed.png create mode 100644 docs/images/upcoming-reservations.png create mode 100644 docs/specs/room-reservation.md create mode 100644 frontend/src/app/coworking/ambassador-home/ambassador-home-routing.module.ts create mode 100644 frontend/src/app/coworking/ambassador-home/ambassador-home.module.ts create mode 100644 frontend/src/app/coworking/ambassador-home/ambassador-room/ambassador-room.service.spec.ts create mode 100644 frontend/src/app/coworking/ambassador-home/ambassador-room/ambassador-room.service.ts create mode 100644 frontend/src/app/coworking/ambassador-home/ambassador-room/list/ambassador-room-list.component.css create mode 100644 frontend/src/app/coworking/ambassador-home/ambassador-room/list/ambassador-room-list.component.html create mode 100644 frontend/src/app/coworking/ambassador-home/ambassador-room/list/ambassador-room-list.component.spec.ts create mode 100644 frontend/src/app/coworking/ambassador-home/ambassador-room/list/ambassador-room-list.component.ts create mode 100644 frontend/src/app/coworking/ambassador-home/ambassador-xl/ambassador-xl.service.spec.ts rename frontend/src/app/coworking/ambassador-home/{ambassador.service.ts => ambassador-xl/ambassador-xl.service.ts} (91%) create mode 100644 frontend/src/app/coworking/ambassador-home/ambassador-xl/list/ambassador-xl-list.component.css create mode 100644 frontend/src/app/coworking/ambassador-home/ambassador-xl/list/ambassador-xl-list.component.html create mode 100644 frontend/src/app/coworking/ambassador-home/ambassador-xl/list/ambassador-xl-list.component.spec.ts create mode 100644 frontend/src/app/coworking/ambassador-home/ambassador-xl/list/ambassador-xl-list.component.ts create mode 100644 frontend/src/app/coworking/room-reservation/confirm-reservation/confirm-reservation.component.css create mode 100644 frontend/src/app/coworking/room-reservation/confirm-reservation/confirm-reservation.component.html create mode 100644 frontend/src/app/coworking/room-reservation/confirm-reservation/confirm-reservation.component.spec.ts create mode 100644 frontend/src/app/coworking/room-reservation/confirm-reservation/confirm-reservation.component.ts create mode 100644 frontend/src/app/coworking/room-reservation/new-reservation-page/new-reservation-page.component.css create mode 100644 frontend/src/app/coworking/room-reservation/new-reservation-page/new-reservation-page.component.html create mode 100644 frontend/src/app/coworking/room-reservation/new-reservation-page/new-reservation-page.component.spec.ts create mode 100644 frontend/src/app/coworking/room-reservation/new-reservation-page/new-reservation-page.component.ts create mode 100644 frontend/src/app/coworking/room-reservation/reservation-table.service.spec.ts create mode 100644 frontend/src/app/coworking/room-reservation/reservation-table.service.ts create mode 100644 frontend/src/app/coworking/room-reservation/room-reservation.service.spec.ts create mode 100644 frontend/src/app/coworking/room-reservation/room-reservation.service.ts create mode 100644 frontend/src/app/coworking/widgets/date-selector/date-selector.widget.css create mode 100644 frontend/src/app/coworking/widgets/date-selector/date-selector.widget.html create mode 100644 frontend/src/app/coworking/widgets/date-selector/date-selector.widget.ts create mode 100644 frontend/src/app/coworking/widgets/room-reservation-table/room-reservation-table.widget.css create mode 100644 frontend/src/app/coworking/widgets/room-reservation-table/room-reservation-table.widget.html create mode 100644 frontend/src/app/coworking/widgets/room-reservation-table/room-reservation-table.widget.ts diff --git a/backend/api/coworking/ambassador.py b/backend/api/coworking/ambassador.py index cc6e9e9ca..8e0e2052b 100644 --- a/backend/api/coworking/ambassador.py +++ b/backend/api/coworking/ambassador.py @@ -17,15 +17,26 @@ api = APIRouter(prefix="/api/coworking/ambassador") -@api.get("", tags=["Coworking"]) -def active_and_upcoming_reservations( +@api.get("/xl", tags=["Coworking"]) +def active_and_upcoming_reservations_for_xl( subject: User = Depends(registered_user), reservation_svc: ReservationService = Depends(), ) -> Sequence[Reservation]: - """List active and upcoming reservations. + """List active and upcoming reservations for the XL. This list drives the ambassador's checkin UI.""" - return reservation_svc.list_all_active_and_upcoming(subject) + return reservation_svc.list_all_active_and_upcoming_for_xl(subject) + + +@api.get("/rooms", tags=["Coworking"]) +def active_and_upcoming_reservations_for_rooms( + subject: User = Depends(registered_user), + reservation_svc: ReservationService = Depends(), +) -> Sequence[Reservation]: + """List active and upcoming reservations for the rooms. + + This list drives the ambassador's checkin UI.""" + return reservation_svc.list_all_active_and_upcoming_for_rooms(subject) @api.put("/checkin", tags=["Coworking"]) diff --git a/backend/api/coworking/reservation.py b/backend/api/coworking/reservation.py index 8af862931..3f4877d2d 100644 --- a/backend/api/coworking/reservation.py +++ b/backend/api/coworking/reservation.py @@ -3,17 +3,22 @@ This API is used to make and manage reservations.""" from fastapi import APIRouter, Depends, HTTPException +from typing import Sequence +from datetime import datetime + +from backend.models.room import Room from ..authentication import registered_user -from ...services.coworking.reservation import ReservationService +from ...services.coworking.reservation import ReservationException, ReservationService from ...models import User from ...models.coworking import ( Reservation, ReservationRequest, ReservationPartial, ReservationState, + ReservationMapDetails ) -__authors__ = ["Kris Jordan"] +__authors__ = ["Kris Jordan, Yuvraj Jain"] __copyright__ = "Copyright 2023" __license__ = "MIT" @@ -44,6 +49,20 @@ def get_reservation( return reservation_svc.get_reservation(subject, id) +@api.get("/room-reservations/", tags=["Coworking"]) +def get_all_reservations_by_state( + state: ReservationState, + subject: User = Depends(registered_user), + reservation_svc: ReservationService = Depends(), +) -> Sequence[Reservation]: + try: + return reservation_svc.get_current_reservations_for_user( + subject=subject, focus=subject, state=state + ) + except Exception as e: + raise HTTPException(status_code=404, detail=str(e)) + + @api.put("/reservation/{id}", tags=["Coworking"]) def update_reservation( reservation: ReservationPartial, @@ -64,3 +83,25 @@ def cancel_reservation( return reservation_svc.change_reservation( subject, ReservationPartial(id=id, state=ReservationState.CANCELLED) ) + + +@api.get("/room-reservation/", tags=["Coworking"]) +def get_reservations_for_rooms_by_date( + date: datetime, + subject: User = Depends(registered_user), + reservation_svc: ReservationService = Depends(), +) -> ReservationMapDetails: + """See available rooms for any given day.""" + try: + return reservation_svc.get_map_reserved_times_by_date(date, subject) + except Exception as e: + raise HTTPException(status_code=404, detail=str(e)) + + +@api.get("/user-reservations/", tags=["Coworking"]) +def get_total_hours_study_room_reservations( + subject: User = Depends(registered_user), + reservation_svc: ReservationService = Depends(), +) -> str: + """Allows a user to know how many hours they have reserved in all study rooms (Excludes CSXL).""" + return reservation_svc._get_total_time_user_reservations(subject) diff --git a/backend/models/coworking/__init__.py b/backend/models/coworking/__init__.py index 7c839c4c7..ef78a4d91 100644 --- a/backend/models/coworking/__init__.py +++ b/backend/models/coworking/__init__.py @@ -10,11 +10,12 @@ ReservationRequest, ReservationState, ReservationPartial, + ReservationMapDetails, ReservationIdentity, ) from .availability_list import AvailabilityList -from .availability import SeatAvailability, RoomAvailability +from .availability import RoomState, SeatAvailability, RoomAvailability from .status import Status diff --git a/backend/models/coworking/availability.py b/backend/models/coworking/availability.py index b584af262..08bf9871c 100644 --- a/backend/models/coworking/availability.py +++ b/backend/models/coworking/availability.py @@ -1,5 +1,6 @@ """Models for the availability of rooms and seats over a time range.""" +from enum import Enum from pydantic import BaseModel, validator from ..room import Room @@ -7,6 +8,18 @@ from .time_range import TimeRange from .availability_list import AvailabilityList +__authors__ = ["Kris Jordan, Yuvraj Jain"] +__copyright__ = "Copyright 2024" +__license__ = "MIT" + + +class RoomState(int, Enum): + AVAILABLE = 0 + RESERVED = 1 + SELECTED = 2 + UNAVAILABLE = 3 + SUBJECT_RESERVED = 4 + class RoomAvailability(Room, AvailabilityList): """A room that is available for a given time range.""" diff --git a/backend/models/coworking/operating_hours.py b/backend/models/coworking/operating_hours.py index f7c15366b..bec959b78 100644 --- a/backend/models/coworking/operating_hours.py +++ b/backend/models/coworking/operating_hours.py @@ -5,6 +5,10 @@ from .time_range import TimeRange +__authors__ = ["Kris Jordan, Yuvraj Jain"] +__copyright__ = "Copyright 2024" +__license__ = "MIT" + class OperatingHours(TimeRange, BaseModel): """The operating hours of the XL.""" diff --git a/backend/models/coworking/reservation.py b/backend/models/coworking/reservation.py index 48850bbad..dc4f3f3e9 100644 --- a/backend/models/coworking/reservation.py +++ b/backend/models/coworking/reservation.py @@ -2,10 +2,14 @@ from pydantic import BaseModel from datetime import datetime from ...models.user import User, UserIdentity -from ..room import Room +from ..room import Room, RoomPartial from .seat import Seat, SeatIdentity from .time_range import TimeRange +__authors__ = ["Kris Jordan, Yuvraj Jain"] +__copyright__ = "Copyright 2024" +__license__ = "MIT" + class ReservationState(str, Enum): DRAFT = "DRAFT" @@ -22,6 +26,7 @@ class ReservationIdentity(BaseModel): class ReservationRequest(TimeRange): users: list[UserIdentity] = [] seats: list[SeatIdentity] = [] + room: RoomPartial | None = None class Reservation(ReservationIdentity, TimeRange): @@ -34,6 +39,13 @@ class Reservation(ReservationIdentity, TimeRange): updated_at: datetime +class ReservationMapDetails(BaseModel): + reserved_date_map: dict[str, list[int]] = {} + operating_hours_start: datetime | None = None + operating_hours_end: datetime | None = None + number_of_time_slots: int | None = None + + class ReservationPartial(Reservation, BaseModel): start: datetime | None = None end: datetime | None = None diff --git a/backend/models/coworking/time_range.py b/backend/models/coworking/time_range.py index 95220d082..e2c5cef3e 100644 --- a/backend/models/coworking/time_range.py +++ b/backend/models/coworking/time_range.py @@ -5,7 +5,7 @@ from pydantic import BaseModel, field_validator, ValidationInfo, validator from typing import Self -__authors__ = ["Kris Jordan"] +__authors__ = ["Kris Jordan, Yuvraj Jain"] __copyright__ = "Copyright 2023" __license__ = "MIT" diff --git a/backend/models/room.py b/backend/models/room.py index 6e7aae3a0..431e272d3 100644 --- a/backend/models/room.py +++ b/backend/models/room.py @@ -7,7 +7,9 @@ __copyright__ = "Copyright 2023" __license__ = "MIT" - -class Room(BaseModel): +class RoomPartial(BaseModel): id: str + +class Room(RoomPartial): nickname: str = "" + diff --git a/backend/script/deployments/coworking_launch.py b/backend/script/deployments/coworking_launch.py index 78ab33b8f..e75e343ae 100644 --- a/backend/script/deployments/coworking_launch.py +++ b/backend/script/deployments/coworking_launch.py @@ -15,9 +15,8 @@ from ...entities.coworking import SeatEntity, OperatingHoursEntity, RoomEntity from ...test.services.reset_table_id_seq import reset_table_id_seq -from ...test.services import role_data, user_data, permission_data +from ...test.services import role_data, user_data, permission_data, room_data from ...test.services.coworking import ( - room_data, seat_data, operating_hours_data, time, diff --git a/backend/script/reset_demo.py b/backend/script/reset_demo.py index 2a4f7ce48..b1200f43a 100644 --- a/backend/script/reset_demo.py +++ b/backend/script/reset_demo.py @@ -21,7 +21,6 @@ from ..test.services import role_data, user_data, permission_data, room_data from ..test.services.organization import organization_demo_data from ..test.services.event import event_demo_data - from ..test.services.coworking import seat_data, operating_hours_data, time from ..test.services.coworking.reservation import reservation_data from ..test.services.academics import course_data, term_data, section_data diff --git a/backend/services/coworking/policy.py b/backend/services/coworking/policy.py index 723ef6f15..813eaac73 100644 --- a/backend/services/coworking/policy.py +++ b/backend/services/coworking/policy.py @@ -2,7 +2,7 @@ from fastapi import Depends from sqlalchemy.orm import Session -from datetime import timedelta +from datetime import timedelta, datetime, time from ...database import db_session from ...models import User @@ -10,6 +10,13 @@ __copyright__ = "Copyright 2023" __license__ = "MIT" +MONDAY = 0 +TUESDAY = 1 +WEDNESDAY = 2 +THURSDAY = 3 +FRIDAY = 4 +SATURDAY = 5 +SUNDAY = 6 class PolicyService: """RoleService is the access layer to the role data model, its members, and permissions. @@ -18,8 +25,7 @@ class PolicyService: for different groups of users (e.g. majors, ambassadors, LAs, etc). """ - def __init__(self): - ... + def __init__(self): ... def walkin_window(self, _subject: User) -> timedelta: """How far into the future can walkins be reserved?""" @@ -51,6 +57,103 @@ def maximum_initial_reservation_duration(self, _subject: User) -> timedelta: def reservation_draft_timeout(self) -> timedelta: return timedelta(minutes=5) + def reservation_checkin_timeout(self) -> timedelta: return timedelta(minutes=10) + + + def room_reservation_weekly_limit(self) -> timedelta: + """The maximum amount of hours a student can reserve the study rooms outside of the csxl.""" + return timedelta(hours=6) + + def non_reservable_rooms(self) -> list[str]: + return ['404'] + + def office_hours(self, date: datetime): + day = date.weekday() + if day == MONDAY: + return { + 'SN135' : [ + (time(hour=16, minute=30), time(hour=17, minute=00)), + ], + 'SN137' : [ + (time(hour=15, minute=00), time(hour=16, minute=30)) + ], + 'SN139' : [], + 'SN141' : [ + (time(hour=16, minute=00), time(hour=17, minute=30)) + ] + } + elif day == TUESDAY: + return { + 'SN135' : [ + (time(hour=14, minute=30), time(hour=16, minute=00)), + (time(hour=11, minute=00), time(hour=12, minute=00)) + ], + 'SN137' : [], + 'SN139' : [ + (time(hour=10, minute=30), time(hour=11, minute=00)), + (time(hour=11, minute=30), time(hour=13, minute=00)), + ], + 'SN141' : [ + (time(hour=10, minute=00), time(hour=11, minute=00)) + ] + } + elif day == WEDNESDAY: + return { + 'SN135' : [ + (time(hour=11, minute=00), time(hour=12, minute=00)) + ], + 'SN137' : [], + 'SN139' : [ + (time(hour=10, minute=30), time(hour=11, minute=00)), + (time(hour=11, minute=30), time(hour=13, minute=00)), + (time(hour=14, minute=30), time(hour=15, minute=00)) + ], + 'SN141' : [ + (time(hour=10, minute=00), time(hour=11, minute=00)) + ] + } + elif day == THURSDAY: + return { + 'SN135' : [ + (time(hour=14, minute=30), time(hour=16, minute=00)), + (time(hour=11, minute=00), time(hour=12, minute=00)) + ], + 'SN137' : [], + 'SN139' : [ + (time(hour=10, minute=30), time(hour=11, minute=00)), + (time(hour=11, minute=30), time(hour=13, minute=00)), + (time(hour=14, minute=30), time(hour=15, minute=00)) + ], + 'SN141' : [] + } + elif day == FRIDAY: + return { + 'SN135' : [ + (time(hour=11, minute=00), time(hour=12, minute=00)) + ], + 'SN137' : [], + 'SN139' : [ + (time(hour=10, minute=30), time(hour=11, minute=00)), + (time(hour=14, minute=30), time(hour=15, minute=00)) + ], + 'SN141' : [ + (time(hour=10, minute=00), time(hour=11, minute=00)) + ] + } + elif day == SATURDAY: + return { + 'SN135' : [], + 'SN137' : [], + 'SN139' : [], + 'SN141' : [] + } + elif day == SUNDAY: + return { + 'SN135' : [], + 'SN137' : [], + 'SN139' : [], + 'SN141' : [] + } \ No newline at end of file diff --git a/backend/services/coworking/reservation.py b/backend/services/coworking/reservation.py index 0ccac6643..38b38d5bc 100644 --- a/backend/services/coworking/reservation.py +++ b/backend/services/coworking/reservation.py @@ -5,17 +5,22 @@ from random import random from typing import Sequence from sqlalchemy.orm import Session, joinedload +from backend.entities.room_entity import RoomEntity + +from backend.models.room_details import RoomDetails from ...database import db_session from ...models.user import User, UserIdentity from ..exceptions import UserPermissionException, ResourceNotFoundException from ...models.coworking import ( Seat, Reservation, + ReservationMapDetails, ReservationRequest, ReservationPartial, TimeRange, SeatAvailability, ReservationState, + RoomState, AvailabilityList, OperatingHours, ) @@ -26,8 +31,8 @@ from .operating_hours import OperatingHoursService from ..permission import PermissionService -__authors__ = ["Kris Jordan", "Matt Vu"] -__copyright__ = "Copyright 2023 - 2024" +__authors__ = ["Kris Jordan", "Matt Vu","Yuvraj Jain"] +__copyright__ = "Copyright 2023" __license__ = "MIT" @@ -92,7 +97,7 @@ def get_reservation(self, subject: User, id: int) -> Reservation: return reservation.to_model() def get_current_reservations_for_user( - self, subject: User, focus: User + self, subject: User, focus: User, state: ReservationState | None = None ) -> Sequence[Reservation]: """Find current and upcoming reservations for a given user. The subject must either also be the focus or have permission to view reservations of @@ -114,12 +119,18 @@ def get_current_reservations_for_user( "coworking.reservation.read", f"user/{focus.id}", ) - # + now = datetime.now() time_range = TimeRange( start=now - timedelta(days=1), end=now + self._policy_svc.reservation_window(focus), ) + + if state: + return self._get_active_reservations_for_user_by_state( + focus, time_range, state + ) + return self._get_active_reservations_for_user(focus, time_range) def _get_active_reservations_for_user( @@ -149,6 +160,374 @@ def _get_active_reservations_for_user( return [reservation.to_model() for reservation in reservations] + def _get_active_reservations_for_user_by_state( + self, + focus: UserIdentity, + time_range: TimeRange, + state: ReservationState, + ) -> Sequence[Reservation]: + reservations = ( + self._session.query(ReservationEntity) + .join(ReservationEntity.users) + .filter( + ReservationEntity.start < time_range.end, + ReservationEntity.end > time_range.start, + ReservationEntity.state == state, + UserEntity.id == focus.id, + ) + .options( + joinedload(ReservationEntity.users), joinedload(ReservationEntity.seats) + ) + .order_by(ReservationEntity.start) + .all() + ) + + reservations = self._state_transition_reservation_entities_by_time( + datetime.now(), reservations + ) + + return [reservation.to_model() for reservation in reservations] + + def _check_user_reservation_duration( + self, user: UserIdentity, bounds: TimeRange + ) -> bool: + """Helper method to check if the total reservation duration for a user exceeds 6 hours. + + Args: + user (User): The user for whom to check reservation duration. + bounds (TimeRange): The time range to check for reservation duration. + + Returns: + True if a user has >= 6 total hours reserved + False if a user has exceeded the limit + """ + reservations = self.get_current_reservations_for_user(user, user) + total_duration = timedelta() + total_duration += bounds.end - bounds.start + + for reservation in reservations: + if reservation.room: + total_duration += reservation.end - reservation.start + if total_duration > self._policy_svc.room_reservation_weekly_limit(): + return False + return True + + def _get_total_time_user_reservations(self, user: UserIdentity) -> str: + """Calculate the total duration (in hours) of study room reservations for the given user. + Args: + user (UserIdentity): The user for whom to calculate the total reservation time. + Returns: + str: The total reservation time in hours. + """ + reservations = self.get_current_reservations_for_user(user, user) + duration = timedelta() + for reservation in reservations: + if reservation.room: + duration += reservation.end - reservation.start + str_duration = str(6 - (round((duration.total_seconds() / 3600) * 2) / 2)) + if str_duration[2] == "0": + return str_duration.rstrip("0").rstrip(".") + return str_duration + + def get_map_reserved_times_by_date( + self, date: datetime, subject: User + ) -> ReservationMapDetails: + """ + Retrieves a detailed mapping of room reservation statuses for a specific date, tailored for a given user. + + This method returns an instance of ReservationMapDetails, which includes: + - A dictionary (`reserved_date_map`) where keys are room IDs and values are lists of time slot statuses + for each room. Statuses are integers representing: + 0 (Available - Green) + 1 (Reserved - Red) + 2 (Selected - Orange) + 3 (Unavailable - Grayed out) + 4 (Subject's Reservation - Blue). + - The start (`operating_hours_start`) and end (`operating_hours_end`) times of operating hours for + the date queried. + - The total number of time slots (`number_of_time_slots`) available within the operating hours, + based on 30-minute intervals. + + It handles various scenarios including days without operating hours by providing a default schedule + (10 am to 6 pm) and adjusting time slots based on current time to mark past slots as unavailable. + It supports rounding start and end times to the nearest half-hour and excludes reservations that + are outside the operating hours. + + Args: + date (datetime): The date for which the reservation statuses are to be fetched. + subject (User): The user for whom the reservation statuses are being determined, to highlight + their own reservations. + + Returns: + ReservationMapDetails: An object containing the mapping of room reservation statuses, + operating hours, and the number of time slots. + + Note: + This method assumes individual user reservations. Group reservations require adjustments to + the implementation. + + Future reservations are shown up to the current time, with past slots marked as unavailable + for today's date. + """ + reserved_date_map: dict[str, list[int]] = {} + + # Query DB to get reservable rooms. You can change coworking policy to change + # which rooms are reservable. SN156 should not go in coworking policy. + rooms = self._get_reservable_rooms() + + # Generate a 1 day time range to get operating hours on date. + date_midnight = date.replace(hour=0, minute=0, second=0) + tomorrow_midnight = date_midnight + timedelta(days=1) + day_range = TimeRange(start=date_midnight, end=tomorrow_midnight) + + # Check if operating hours exist on date + try: + operating_hours_on_date = self._operating_hours_svc.schedule(day_range)[0] + except: + # TODO: Possibly consider thowing exception and handling on the frontend? + # If operating hours don't exist, then return an all grayed out table + # from 10 am to 6 pm which is the standard office hours. + for room in rooms: + if room.id: + reserved_date_map[room.id] = [RoomState.UNAVAILABLE.value] * 16 + return ReservationMapDetails( + reserved_date_map=reserved_date_map, + operating_hours_start=datetime.now().replace(hour=10, minute=0), + operating_hours_end=datetime.now().replace(hour=18, minute=0), + number_of_time_slots=16, + ) + + # Extract the start time and end time for operating hours rounded to the closest half hour + operating_hours_start = self._round_to_closest_half_hour( + operating_hours_on_date.start, round_up=True + ) + operating_hours_end = self._round_to_closest_half_hour( + operating_hours_on_date.end, round_up=False + ) + operating_hours_time_delta = operating_hours_end - operating_hours_start + + # Multiply by 2 because 30 min interval indexes + operating_hours_duration = int( + 2 * operating_hours_time_delta.total_seconds() / 3600 + ) + + # Need current time to gray out slots in the past on that day. + current_time = datetime.now() + current_time_idx = ( + self._idx_calculation(current_time, operating_hours_start) + 1 + ) + + for room in rooms: + time_slots_for_room = [0] * operating_hours_duration + + # Making slots up till current time gray + if date.date() == current_time.date(): + for i in range(0, current_time_idx): + time_slots_for_room[i] = RoomState.UNAVAILABLE.value + + room_id = room.id if room else "SN156" + reservations = self._query_confirmed_reservations_by_date_and_room( + date, room_id + ) + for reservation in reservations: + start_idx = self._idx_calculation( + reservation.start, operating_hours_start + ) + end_idx = self._idx_calculation(reservation.end, operating_hours_start) + + if start_idx < 0 or end_idx > operating_hours_duration: + continue + + # Gray out previous time slots for today only + if date.date() == current_time.date(): + if end_idx < current_time_idx: + continue + start_idx = max(current_time_idx, start_idx) + + for idx in range(start_idx, end_idx): + # Currently only assuming single user. + # TODO: If making group reservations, need to change this. + if reservation.users[0].id == subject.id: + time_slots_for_room[idx] = RoomState.SUBJECT_RESERVED.value + else: + if time_slots_for_room[idx] != RoomState.SUBJECT_RESERVED.value: + time_slots_for_room[idx] = RoomState.RESERVED.value + reserved_date_map[room.id] = time_slots_for_room + + self._transform_date_map_for_unavailable(reserved_date_map) + del reserved_date_map["SN156"] + self._transform_date_map_for_officehours( + date, reserved_date_map, operating_hours_start, operating_hours_duration + ) + + return ReservationMapDetails( + reserved_date_map=reserved_date_map, + operating_hours_start=operating_hours_start, + operating_hours_end=operating_hours_end, + number_of_time_slots=operating_hours_duration, + ) + + def _round_to_closest_half_hour( + self, dt: datetime, round_up: bool = True + ) -> datetime: + """ + This helper rounds a datetime object to the closest half hour either up or down based on the round_up flag. + + Args: + dt (datetime): The datetime object you want to round. + round_up (bool): If True, rounds up to the closest half hour. If False, rounds down to the closest half hour. + + Returns: + datetime: Rounded datetime object. + """ + minutes = dt.minute + + if round_up: + if minutes < 30: + to_add = timedelta(minutes=(30 - minutes)) + else: + to_add = timedelta(minutes=(60 - minutes)) + rounded_dt = dt + to_add + else: + if minutes > 30: + to_subtract = timedelta(minutes=(minutes - 30)) + else: + to_subtract = timedelta(minutes=minutes) + rounded_dt = dt - to_subtract + + rounded_dt = rounded_dt.replace(second=0, microsecond=0) + + return rounded_dt + + def _idx_calculation(self, time: datetime, operating_hours_start: datetime) -> int: + """ + Calculates the index of a time slot based on a given time. + + This function converts a datetime object into an index representing a specific + time slot in the reservation system. Each hour is divided into two slots. + + Args: + time (datetime): The time to convert into an index. + operating_hours_start (int): The hour when the XL opens as an int. + + Returns: + int: The index of the time slot corresponding to the given time. + """ + return int(2 * (time.hour - operating_hours_start.hour)) + ( + (time.minute - operating_hours_start.minute) // 30 + ) + + def _transform_date_map_for_unavailable( + self, reserved_date_map: dict[str, list[int]] + ) -> None: + """ + Modifies the reserved date map to mark certain slots as unavailable. + + This function updates the reserved date map so that if a slot is reserved by the subject + (indicated by a 4), then any available slots (indicated by 0) in the same column across + all rooms are marked as unavailable (changed to 3). + + Args: + reserved_date_map (dict[str, list[int]]): The map of room reservations to be transformed. + + Returns: + None: This function modifies the reserved_date_map in place. + """ + # Identify the columns where 4 appears + columns_with_4 = set() + for key, values in reserved_date_map.items(): + for i, value in enumerate(values): + if value == RoomState.SUBJECT_RESERVED.value: + columns_with_4.add(i) + + # Transform the dictionary as per the rules + for key, values in reserved_date_map.items(): + for i in columns_with_4: + if values[i] == RoomState.AVAILABLE.value: + values[i] = RoomState.UNAVAILABLE.value + + def _transform_date_map_for_officehours( + self, + date: datetime, + reserved_date_map: dict[str, list[int]], + operating_hours_start: datetime, + operating_hours_duration: int, + ) -> None: + """ + Transforms date map in place. + """ + office_hours = self._policy_svc.office_hours(date=date) + for room_id, hours in office_hours.items(): + for start, end in hours: + start_idx = max(self._idx_calculation(start, operating_hours_start), 0) + end_idx = min( + self._idx_calculation(end, operating_hours_start), + operating_hours_duration, + ) + if start_idx < end_idx: + for idx in range(start_idx, end_idx): + reserved_date_map[room_id][idx] = RoomState.UNAVAILABLE.value + + def _query_confirmed_reservations_by_date_and_room( + self, date: datetime, room_id: str + ) -> Sequence[Reservation]: + """ + Queries and returns confirmed and checked-in reservations for a given date and room. + + This function fetches all confirmed and checked-in reservations from the database for a specified date and room. + It includes reservations that have any overlap with the 24-hour period starting from the + beginning of the given date, and are associated with a specific room ID. + + Args: + date (datetime): The date for which to query confirmed reservations. + room_id (str): The ID of the room for which to query confirmed reservations. + + Returns: + Sequence[Reservation]: A sequence of Reservation model objects representing the confirmed reservations for the specified date and room. + """ + start = date.replace(hour=0, minute=0, second=0, microsecond=0) + reservations = ( + self._session.query(ReservationEntity) + .join(ReservationEntity.room) + .filter( + ReservationEntity.start < start + timedelta(hours=24), + ReservationEntity.end > start, + ReservationEntity.state.not_in( + [ReservationState.CANCELLED, ReservationState.CHECKED_OUT] + ), + RoomEntity.id == room_id, + ) + .options( + joinedload(ReservationEntity.users), joinedload(ReservationEntity.seats) + ) + .order_by(ReservationEntity.start) + .all() + ) + + return [reservation.to_model() for reservation in reservations] + + def _get_reservable_rooms(self) -> Sequence[RoomDetails]: + """ + Retrieves a list of all reservable rooms. + This method queries the RoomEntity table to find all rooms that are marked as reservable + (i.e., their 'reservable' attribute is True) and are not the room with ID 'SN156'. + The rooms are then ordered by their ID in ascending order. + + Each room entity is converted to a RoomDetails model before being returned. + + Returns: + Sequence[RoomDetails]: A sequence of RoomDetails models representing all the reservable rooms, excluding room 'SN156'. + """ + + rooms = ( + self._session.query(RoomEntity) + .filter(RoomEntity.id.not_in(self._policy_svc.non_reservable_rooms())) + .order_by(RoomEntity.id) + .all() + ) + + return [room.to_details_model() for room in rooms] + def get_seat_reservations( self, seats: Sequence[Seat], time_range: TimeRange ) -> Sequence[Reservation]: @@ -381,6 +760,13 @@ def draft_reservation( # Enforce request range is within bounds of walkin vs. pre-reserved policies bounds = TimeRange(start=start, end=end) + # Check if user has exceeded reservation limit + if request.room: + if not self._check_user_reservation_duration(request.users[0], bounds): + raise ReservationException( + "Oops! Looks like you've reached your weekly study room reservation limit" + ) + # Fetch User entities for all requested in reservation user_entities = ( self._session.query(UserEntity) @@ -402,12 +788,13 @@ def draft_reservation( ) nonconflicting = bounds.subtract(conflict) - if len(nonconflicting) == 1: + if len(nonconflicting) >= 1: bounds = nonconflicting[0] else: raise ReservationException( "Users may not have conflicting reservations." ) + # Dead code because of the NotImplementedError testing for multiple users at the top # else: # # Draft of expected functionality (needs testing and sanity checking) @@ -421,23 +808,32 @@ def draft_reservation( # Look at the seats - match bounds of assigned seat's availability # TODO: Fetch all seats - seats: list[Seat] = SeatEntity.get_models_from_identities( - self._session, request.seats - ) - seat_availability = self.seat_availability(seats, bounds) + if request.room is None: + seats: list[Seat] = SeatEntity.get_models_from_identities( + self._session, request.seats + ) + seat_availability = self.seat_availability(seats, bounds) - if not is_walkin: - seat_availability = [seat for seat in seat_availability if seat.reservable] + if not is_walkin: + seat_availability = [ + seat for seat in seat_availability if seat.reservable + ] + + if len(seat_availability) == 0: + raise ReservationException( + "The requested seat(s) are no longer available." + ) - if len(seat_availability) == 0: - raise ReservationException("The requested seat(s) are no longer available.") + # TODO (limit to # of users on request if multiple users) + # Here we constrain the reservation start/end to that of the best available seat requested. + # This matters as walk-in availability becomes scarce (may start in the near future even though request + # start is for right now), alternatively may end early due to reserved seat on backend. + seat_entities = [self._session.get(SeatEntity, seat_availability[0].id)] + bounds = seat_availability[0].availability[0] + else: + seat_entities = [] - # TODO (limit to # of users on request if multiple users) - # Here we constrain the reservation start/end to that of the best available seat requested. - # This matters as walk-in availability becomes scarce (may start in the near future even though request - # start is for right now), alternatively may end early due to reserved seat on backend. - seat_entities = [self._session.get(SeatEntity, seat_availability[0].id)] - bounds = seat_availability[0].availability[0] + room_id = request.room.id if request.room else None draft = ReservationEntity( state=ReservationState.DRAFT, @@ -445,7 +841,7 @@ def draft_reservation( end=bounds.end, users=user_entities, walkin=is_walkin, - room_id=None, + room_id=room_id, seats=seat_entities, ) @@ -521,6 +917,7 @@ def _change_state(self, entity: ReservationEntity, delta: ReservationState) -> b transition = (entity.state, delta) valid_transition = False + match transition: case (RS.DRAFT, RS.CONFIRMED): valid_transition = True @@ -531,15 +928,22 @@ def _change_state(self, entity: ReservationEntity, delta: ReservationState) -> b case (RS.CHECKED_IN, RS.CHECKED_OUT): valid_transition = True case _: - return False + valid_transition = False + + if entity.room: + match transition: + case (RS.CONFIRMED, RS.CHECKED_IN): + valid_transition = True if valid_transition: entity.state = delta - return True + return valid_transition - def list_all_active_and_upcoming(self, subject: User) -> Sequence[Reservation]: - """Ambassadors need to see all active and upcoming reservations. + def list_all_active_and_upcoming_for_xl( + self, subject: User + ) -> Sequence[Reservation]: + """Ambassadors need to see all active and upcoming reservations for the XL. This method queries all future events. When pre-reservations are added, this method will need redesign to support date/time based pagination. @@ -571,6 +975,7 @@ def list_all_active_and_upcoming(self, subject: User) -> Sequence[Reservation]: ReservationState.CHECKED_OUT, ) ), + ReservationEntity.room == None, ) .options( joinedload(ReservationEntity.users), joinedload(ReservationEntity.seats) @@ -580,6 +985,47 @@ def list_all_active_and_upcoming(self, subject: User) -> Sequence[Reservation]: ) return [reservation.to_model() for reservation in reservations] + def list_all_active_and_upcoming_for_rooms( + self, subject: User + ) -> Sequence[Reservation]: + """Ambassadors need to see all active and upcoming reservations for the rooms. + + This method queries all future events. When pre-reservations are added, this method + will need redesign to support date/time based pagination. + + Args: + subject (User): The user initiating the reservation change request. + + Returns: + Sequence[Reservation] - all active and upcoming reservations for rooms. + + Raises: + UserPermissionException when user does not have permission to read reservations + """ + self._permission_svc.enforce(subject, "coworking.reservation.read", f"user/*") + now = datetime.now() + reservations = ( + self._session.query(ReservationEntity) + .join(ReservationEntity.users) + .filter( + ReservationEntity.start >= now - timedelta(minutes=10), + ReservationEntity.state.in_( + ( + ReservationState.CONFIRMED, + ReservationState.CHECKED_IN, + ReservationState.CHECKED_OUT, + ) + ), + ReservationEntity.room != None, + ) + .options( + joinedload(ReservationEntity.users), joinedload(ReservationEntity.seats) + ) + .order_by(ReservationEntity.start.asc()) + .all() + ) + return [reservation.to_model() for reservation in reservations] + def staff_checkin_reservation( self, subject: User, reservation: Reservation ) -> Reservation: diff --git a/backend/test/services/coworking/fixtures.py b/backend/test/services/coworking/fixtures.py index 70b54b22d..cdcd78561 100644 --- a/backend/test/services/coworking/fixtures.py +++ b/backend/test/services/coworking/fixtures.py @@ -3,7 +3,10 @@ import pytest from unittest.mock import create_autospec from sqlalchemy.orm import Session -from ....services import PermissionService +from ....services import ( + PermissionService, + RoomService, +) from ....services.coworking import ( OperatingHoursService, SeatService, @@ -12,7 +15,13 @@ StatusService, ) -__authors__ = ["Kris Jordan"] +__authors__ = [ + "Kris Jordan", + "Aarjav Jain", + "John Schachte", + "Nick Wherthey", + "Yuvraj Jain", +] __copyright__ = "Copyright 2023" __license__ = "MIT" @@ -29,6 +38,12 @@ def operating_hours_svc(session: Session, permission_svc: PermissionService): return OperatingHoursService(session, permission_svc) +@pytest.fixture() +def room_svc(session: Session): + """RoomService fixture.""" + return RoomService(session) + + @pytest.fixture() def seat_svc(session: Session): """SeatService fixture.""" diff --git a/backend/test/services/coworking/reservation/get_current_reservations_for_user_test.py b/backend/test/services/coworking/reservation/get_current_reservations_for_user_test.py index 93e8ea26b..4ae74c40a 100644 --- a/backend/test/services/coworking/reservation/get_current_reservations_for_user_test.py +++ b/backend/test/services/coworking/reservation/get_current_reservations_for_user_test.py @@ -2,6 +2,8 @@ from unittest.mock import create_autospec +from backend.models.coworking.reservation import ReservationState + from .....services.coworking import ReservationService # Imported fixtures provide dependencies injected for the tests as parameters. @@ -29,7 +31,13 @@ from .. import seat_data from . import reservation_data -__authors__ = ["Kris Jordan"] +__authors__ = [ + "Kris Jordan", + "Nick Wherthey", + "Yuvraj Jain", + "Aarjav Jain", + "John Schachte", +] __copyright__ = "Copyright 2023" __license__ = "MIT" @@ -41,9 +49,8 @@ def test_get_current_reservations_for_user_as_user( reservations = reservation_svc.get_current_reservations_for_user( user_data.user, user_data.user ) - assert len(reservations) == 2 + assert len(reservations) == 3 assert reservations[0].id == reservation_data.reservation_1.id - assert reservations[1].id == reservation_data.reservation_5.id reservations = reservation_svc.get_current_reservations_for_user( user_data.ambassador, user_data.ambassador @@ -66,3 +73,13 @@ def test_get_current_reservations_for_user_permissions( "coworking.reservation.read", f"user/{user_data.user.id}", ) + + +def test_get_current_reservation_for_user_by_state(reservation_svc: ReservationService): + """Get reservation for user by state.""" + reservations = reservation_svc.get_current_reservations_for_user( + user_data.user, user_data.user, ReservationState.CHECKED_IN + ) + assert len(reservations) == 1 + assert reservations[0].id == reservation_data.reservation_1.id + assert reservations[0].state == reservation_data.reservation_1.state diff --git a/backend/test/services/coworking/reservation/get_map_current_reservations_test.py b/backend/test/services/coworking/reservation/get_map_current_reservations_test.py new file mode 100644 index 000000000..446c41ffe --- /dev/null +++ b/backend/test/services/coworking/reservation/get_map_current_reservations_test.py @@ -0,0 +1,136 @@ +"""Tests for ReservationService#get_map_reservations_for_date and helper functions.""" + +from backend.models.coworking.availability import RoomState +from backend.models.coworking.reservation import ReservationState +from datetime import date + +from .....services.coworking import ReservationService + +# Imported fixtures provide dependencies injected for the tests as parameters. +# Dependent fixtures (seat_svc) are required to be imported in the testing module. +from ..fixtures import ( + reservation_svc, + permission_svc, + seat_svc, + policy_svc, + operating_hours_svc, +) +from ..time import * + +# Import the setup_teardown fixture explicitly to load entities in database. +# The order in which these fixtures run is dependent on their imported alias. +# Since there are relationship dependencies between the entities, order matters. +from ...core_data import user_data +from ...core_data import setup_insert_data_fixture as insert_order_0 +from ..operating_hours_data import fake_data_fixture as insert_order_1 +from ...room_data import fake_data_fixture as insert_order_2 +from ..seat_data import fake_data_fixture as insert_order_3 +from .reservation_data import fake_data_fixture as insert_order_4 + +# Import the fake model data in a namespace for test assertions +from ...core_data import user_data +from .. import seat_data +from . import reservation_data + +__authors__ = [ + "Nick Wherthey", + "Yuvraj Jain", +] +__copyright__ = "Copyright 2023" +__license__ = "MIT" + +SATURDAY, SUNDAY = [5, 6] + + +def test_transform_date_map_for_unavailable_simple(reservation_svc: ReservationService): + """ + Validates the transformation of the date map to indicate unavailable time slots. + + This test ensures that time slots are appropriately grayed out for all other rooms + once a user has made a reservation. For example, if Sally Student reserves room SN135 + from 1 pm to 3 pm on February 29, she should be prevented from booking any other room + during these hours. The function verifies that the data map returned by the endpoint + accurately reflects these unavailable slots, enhancing the user experience by + preventing double bookings. + """ + + sample_date_map_1 = { + 'SN135': [0, 0, 0, 0], + 'SN137': [0, 0, 4, 4], + 'SN139': [0, 0, 0, 0] + } + + expected_transformed_date_map_1 = { + 'SN135': [0, 0, 3, 3], + 'SN137': [0, 0, 4, 4], + 'SN139': [0, 0, 3, 3] + } + + reservation_svc._transform_date_map_for_unavailable(sample_date_map_1) + assert sample_date_map_1 == expected_transformed_date_map_1 + + +def test_transform_date_map_for_unavailable_complex(reservation_svc: ReservationService): + sample_date_map_2 = { + 'SN135': [0, 0, 0, 0, 0, 0, 1, 1, 1, 1], + 'SN137': [0, 0, 1, 1, 4, 4, 4, 4, 0, 0], + 'SN139': [0, 4, 4, 1, 1, 0, 0, 0, 0, 0] + } + + expected_transformed_date_map_2 = { + 'SN135': [0, 3, 3, 0, 3, 3, 1, 1, 1, 1], + 'SN137': [0, 3, 1, 1, 4, 4, 4, 4, 0, 0], + 'SN139': [0, 4, 4, 1, 1, 3, 3, 3, 0, 0] + } + + reservation_svc._transform_date_map_for_unavailable(sample_date_map_2) + assert expected_transformed_date_map_2 == sample_date_map_2 + + +def test_idx_calculation(reservation_svc: ReservationService): + time_1 = datetime.now().replace(hour=10, minute=12) + oh_start = datetime.now().replace(hour=10, minute=0) + assert reservation_svc._idx_calculation(time_1, oh_start) == 0 + + time_2 = datetime.now().replace(hour=12, minute=30) + assert reservation_svc._idx_calculation(time_2, oh_start) == 5 + + time_3 = datetime.now().replace(hour=13, minute=40) + assert reservation_svc._idx_calculation(time_3, oh_start) == 7 + + +def test_query_confirmed_reservations_by_date_and_room( + reservation_svc: ReservationService, time: dict[str, datetime] +): + """Test getting all reservations for a particular date.""" + reservations = reservation_svc._query_confirmed_reservations_by_date_and_room(time[TOMORROW], 'SN135') + assert True + #TODO: Add in better assert statements here. + +def test_get_reservable_rooms(reservation_svc: ReservationService): + rooms = reservation_svc._get_reservable_rooms() + assert rooms[0].id == 'SN135' and rooms[0].reservable is True + assert rooms[1].id == 'SN137' and rooms[1].reservable is True + assert rooms[2].id == 'SN139' and rooms[2].reservable is True + assert rooms[3].id == 'SN141' and rooms[3].reservable is True + +def test_get_map_reserved_times_by_date( + reservation_svc: ReservationService, time: dict[str, datetime] +): + """Test for getting a dictionary where keys are room ids and time slots array are values. + + If this test fails, consider running the reset_demo script before running this test again. + This is hard function to test, and this test does not ensure 100% coverage due to the + multiple edge cases that arise out of it. I recommend setting a breakpoint and looking at + the reserved_date_map in the debugger. + """ + test_time = time[NOW] + reserved_date_map = reservation_svc.get_map_reserved_times_by_date( + test_time + timedelta(days=2), user_data.user + ) + + reserved_date_map_root = reservation_svc.get_map_reserved_times_by_date( + test_time, user_data.root + ) + + assert True \ No newline at end of file diff --git a/backend/test/services/coworking/reservation/list_all_active_and_upcoming_test.py b/backend/test/services/coworking/reservation/list_all_active_and_upcoming_test.py index 00f0b82fa..01b448d23 100644 --- a/backend/test/services/coworking/reservation/list_all_active_and_upcoming_test.py +++ b/backend/test/services/coworking/reservation/list_all_active_and_upcoming_test.py @@ -35,8 +35,8 @@ __license__ = "MIT" -def test_list_all_active_and_upcoming(reservation_svc: ReservationService): - all = reservation_svc.list_all_active_and_upcoming(user_data.ambassador) +def test_list_all_active_and_upcoming_for_xl(reservation_svc: ReservationService): + all = reservation_svc.list_all_active_and_upcoming_for_xl(user_data.ambassador) assert len(all) == len(reservation_data.active_reservations) + len( reservation_data.confirmed_reservations ) @@ -46,7 +46,7 @@ def test_list_all_active_and_upcoming_permission(reservation_svc: ReservationSer permission_svc = create_autospec(PermissionService) permission_svc.enforce.return_value = None reservation_svc._permission_svc = permission_svc - reservation_svc.list_all_active_and_upcoming(user_data.ambassador) + reservation_svc.list_all_active_and_upcoming_for_xl(user_data.ambassador) permission_svc.enforce.assert_called_once_with( user_data.ambassador, "coworking.reservation.read", diff --git a/backend/test/services/coworking/reservation/reservation_data.py b/backend/test/services/coworking/reservation/reservation_data.py index 1f3728480..24c954dd7 100644 --- a/backend/test/services/coworking/reservation/reservation_data.py +++ b/backend/test/services/coworking/reservation/reservation_data.py @@ -13,6 +13,7 @@ from ...reset_table_id_seq import reset_table_id_seq from .. import seat_data from .. import operating_hours_data +from ... import room_data __authors__ = ["Kris Jordan"] @@ -29,6 +30,8 @@ reservation_4: Reservation # Draft reservation for user tomorrow reservation_5: Reservation +# Future room reservation +reservation_6: Reservation # Lists used for access active_reservations: list[Reservation] @@ -38,7 +41,7 @@ def instantiate_global_models(time: dict[str, datetime]): - global reservation_1, reservation_2, reservation_3, reservation_4, reservation_5 + global reservation_1, reservation_2, reservation_3, reservation_4, reservation_5, reservation_6 global active_reservations, reservations, draft_reservations, confirmed_reservations reservation_1 = Reservation( id=1, @@ -109,6 +112,22 @@ def instantiate_global_models(time: dict[str, datetime]): seats=[seat_data.reservable_seats[0]], ) + # Confirm Room Reservation + reservation_6 = Reservation( + id=6, + start=operating_hours_data.tomorrow.start.replace(hour=12, minute=0) + + timedelta(hours=24), + end=operating_hours_data.tomorrow.end.replace(hour=14, minute=30) + + timedelta(hours=24), + created_at=time[NOW], + updated_at=time[NOW], + walkin=False, + room=room_data.group_b, + state=ReservationState.CONFIRMED, + users=[user_data.user], + seats=[], + ) + active_reservations = [reservation_1] confirmed_reservations = [reservation_4] draft_reservations = [reservation_5] @@ -118,6 +137,7 @@ def instantiate_global_models(time: dict[str, datetime]): reservation_3, reservation_4, reservation_5, + reservation_6, ] diff --git a/backend/test/services/coworking/time.py b/backend/test/services/coworking/time.py index 8ed48dc93..b7cff8258 100644 --- a/backend/test/services/coworking/time.py +++ b/backend/test/services/coworking/time.py @@ -17,16 +17,19 @@ # Constants are keys to the times fixture NOW = "NOW" +MIDNIGHT_TODAY = "MIDNIGHT_TODAY" # Past A_WEEK_AGO = "A_WEEK_AGO" AN_HOUR_AGO = "AN_HOUR_AGO" THIRTY_MINUTES_AGO = "THIRTY_MINUTES_AGO" # Future +MIDNIGHT_TOMORROW = "MIDNIGHT_TOMORROW" IN_THIRTY_MINUTES = "IN_THIRTY_MINUTES" TOMORROW = "TOMORROW" IN_ONE_HOUR = "IN_ONE_HOUR" IN_TWO_HOURS = "IN_TWO_HOURS" IN_THREE_HOURS = "IN_THREE_HOURS" +IN_EIGHT_HOURS = "IN_EIGHT_HOURS" @pytest.fixture() @@ -46,16 +49,21 @@ def time_data() -> dict[str, datetime]: return { # Times NOW: now, + MIDNIGHT_TODAY: now.replace(hour=0, minute=0, second=0, microsecond=0), # Past A_WEEK_AGO: now - 7 * ONE_DAY, AN_HOUR_AGO: now - ONE_HOUR, THIRTY_MINUTES_AGO: now - THIRTY_MINUTES, # Future + MIDNIGHT_TOMORROW: (now + ONE_DAY).replace( + hour=0, minute=0, second=0, microsecond=0 + ), IN_THIRTY_MINUTES: now + THIRTY_MINUTES, TOMORROW: now + ONE_DAY, IN_ONE_HOUR: now + ONE_HOUR, IN_TWO_HOURS: now + 2 * ONE_HOUR, IN_THREE_HOURS: now + 3 * ONE_HOUR, + IN_EIGHT_HOURS: now + 8 * ONE_HOUR } diff --git a/docs/images/make-reservations.png b/docs/images/make-reservations.png new file mode 100644 index 0000000000000000000000000000000000000000..1c7feb759d11a1f0fdb623994297701a0c00f6d8 GIT binary patch literal 135923 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 OkKrY=i)H7p-~E45tcuG3 literal 0 HcmV?d00001 diff --git a/docs/images/specs/room-reservation/active-reservations.png b/docs/images/specs/room-reservation/active-reservations.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6920a5dd5ee339dcc7fba7d162106512dde2c8 GIT binary patch literal 106335 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 SX2>S+zbhA&E~LundHz2L3ShSY literal 0 HcmV?d00001 diff --git a/docs/images/specs/room-reservation/confirmation-page.png b/docs/images/specs/room-reservation/confirmation-page.png new file mode 100644 index 0000000000000000000000000000000000000000..6f4d86e75209e0818d82035874864b526151fc66 GIT binary patch literal 87557 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

RuRDvdL$x><`a_qnlMFu8I^)IO@U* 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 literal 0 HcmV?d00001 diff --git a/docs/images/specs/room-reservation/make-reservation.png b/docs/images/specs/room-reservation/make-reservation.png new file mode 100644 index 0000000000000000000000000000000000000000..711e5af4760d39a89d7678e7dc11c047d83719ab GIT binary patch literal 140894 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/images/specs/room-reservation/reservation-confirmed.png b/docs/images/specs/room-reservation/reservation-confirmed.png new file mode 100644 index 0000000000000000000000000000000000000000..523fb1dc9e7a187bac39d9e0d81bf6d8c384ac39 GIT binary patch literal 133574 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

kr&_~Gjpmq%=qrG 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

N(r)-|QsRxSj<~-^rmIxqk(c5Fu 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 bU*FkvM{ujyVUE{Z;Ge#Zv3B7p+nfIfNkmI{ literal 0 HcmV?d00001 diff --git a/docs/specs/room-reservation.md b/docs/specs/room-reservation.md new file mode 100644 index 000000000..7fbfcd345 --- /dev/null +++ b/docs/specs/room-reservation.md @@ -0,0 +1,386 @@ +# Room Reservation Technical Specifications + +This document contains the technical specifications, including sample data representation of our feature, descriptions of underlying database / entity-level representation decisions and development concerns. + +# Authors + +- [Aarjav Jain](https://github.com/aarjavjain2002) +- [John Schachte](https://github.com/JohnSchachte) +- [Nick Wherthey](https://github.com/wherthey) +- [Yuvraj Jain](https://github.com/yuvrajjain2003) + +# Table of Contents + +- [Introduction to Demo](#introduction-to-demo) + - [How do I reserve a room?](#how-do-i-reserve-a-room) + - [How do I view my room reservation?](#how-do-i-view-my-room-reservation) + - [How do I cancel my room reservation](#how-do-i-cancel-my-room-reservation) +- [Description and Sample Data](#descriptions-and-sample-data-representation-of-feature) + - [0. Room Partial](#0-room-partial) + - [1. Reservation Request](#1-reservation-request) + - [2. Reservation Service](#2-reservation-service) + - [3. Route to get all upcoming reservations for a user.](#3-route-to-get-all-upcoming-reservations-for-a-user) +- [Underlying Database / Entity-Level Representation decisions](#underlying-database--entity-level-representation-decisions) +- [Technical and User Experience Design Choices](#technical-and-user-experience-design-choices) +- [Development Concerns](#development-concerns) +- [For Future Developers](#future-developers) + +# Introduction to Demo + +This section of the documents contains the instructions to replicate the steps we take in our demo. By reading this, you should be able to replicate how we create room reservations, view upcoming room reservations, and delete room reservations. We would recommend running the `reset_demo` script to populate the backend with some sample reservations to ease the testing process. + +## How do I reserve a room? + +- From the sidebar, click on Coworking > Room Reservations +- Now you should see a date selector and a table with certain time intervals as columns and room names as rows. To reserve a room, click on **adjacent cells** in a table showing time intervals and room names. You can select up to 4 adjacent slots, equaling a 2-hour reservation. Selecting more than 4 slots resets the selection to one slot. This 2-hour limit is set by a function in the frontend service files and can be adjusted if needed. +- While picking the slots, you will notice a legend with 5 colors. Please bear with us as we figure out more ways to make this accessible to people with color blindness. Currently, the structure is as follows: + - Available (Green): These slots are ones which available to be reserved by the user. You can try clicking on one of these slots which will turn into into a "Selected" time slot which will appear orange. + - Reserved (Red): These slots are the ones which have been reserved by someone other than you. + - Selected (Orange): These slots represent your selection. + - Unavailable (Gray): These slots are unavailble to be reserved because they are either in the past or you have a conflicting reservation in another room or at the CSXL. + - Your Reservations (Blue): These slots represent your reservations. You will notice that once you make a reservation, all other time slots in the same column turn gray. + +![Make Reservations](../images/specs/room-reservation/make-reservation.png) + +- Once you have picked the slots you like, click on the **Select** button, which will draft a reservation for you, and redirect you to the confirmation page. +- On the confirmation page, you can view the details of your selection including the time, location, and date for your reservation. If you are happy with your selection, click on the **Confirm** button. Otherwise, click on **Cancel**. Note that your reservation draft will automatically be cancelled within 5 minutes if you don't press anything. Navigating out of the page also cancels your reservation. + +![Confirmation Page](../images/specs/room-reservation/confirmation-page.png) + +## How do I view my room reservation? + +The natural next question from our previous steps would be, "How do I know that my reservation actually exists?" + +Well, our team has come up with a visually succinct way of displaying this information through coworking cards that were already present in the codebase. If you hit confirm, follow the steps below to see your reservations: + +- From the sidebar, click on Coworking > Room Reservations. + +- Now you should be able to view all your upcoming reservations below the reservation table under the "Upcoming Reservations" header. + +![Profile Card After Reservation](../images/specs/room-reservation/reservation-confirmed.png) + +- Please note that our upcoming reservations only show reservations to the rooms and not to the Colab CSXL SN156 room, since SN156 currently doesn't accept pre-reservations and only takes walk-ins. + +## How do I cancel my room reservation? + +- From the sidebar, click on Coworking > Room Reservations. + +- On the card for the reservation you want to cancel, simply click on the cancel button. Note that this feature doesn't exist for active reservations, since you are already checked-in. You can instead simply check-out for active reservations. + +## Where can I find my active reservations? + +- Once you have checked in, the reservation becomes active. The active reservations can be found on the Coworking page. + +![Active Reservations](../images/specs/room-reservation/active-reservations.png) + +# Descriptions and Sample Data Representation of feature + +We have added / modified the following models / API routes: + +## 0. Room Partial + +Before: + +```py3 +class Room(BaseModel): + id: str + nickname: str = "" +``` + +After: + +```py3 +class RoomPartial(BaseModel): + id: str | None = None + +class Room(RoomPartial): + nickname: str = "" +``` + +We had to modify the following class because it felt weird to make a frontend request to draft a reservation and send in the entire `Room` object. This would require the frontend to know both the `id` and the `nickname` for the room that they were trying to book. Instead, we broke up the `Room` class into `Room` and `RoomPartial`, and `ReservationRequest`now uses the `RoomPartial` class instead. + +Tl;dr: The frontend now only needs to send in the `id` of the room they want to reserve through the HTTP request. + +## 1. Reservation Request + +Before: + +```py3 +class ReservationRequest(TimeRange): + users: list[UserIdentity] = [] + seats: list[SeatIdentity] = [] +``` + +After: + +```py3 +class ReservationRequest(TimeRange): + users: list[UserIdentity] = [] + seats: list[SeatIdentity] = [] + room: RoomPartial | None = None +``` + +The model did not account for different rooms when making a ReservationRequest. And all reservation requests were hardcoded to make reservations for the CSXL Colab. But, now we have extended this feature to make reservations for any room the user wants. + +## 2. Reservation Service + +We had to modify the `draft_reservation()` method inside the ReservationService because previously the service would only cater to reservation requests to the XL since the room parameter was hardcoded to be None. We have laxed this condition, and instead feed the room paramater the input we get from the frontend as a FastAPI parameter in `backend/api/coworking/reservation.py`. + +We added the following methods into the registration_service file. For sake of brevity, we will only include the method signatures here, but you can locate the actual implementation in the repo. + +```py3 +def get_current_reservations_for_user( + self, subject: User, focus: User, state: ReservationState | None = None +) -> Sequence[Reservation]: + ... + + +def _get_active_reservations_for_user( + self, focus: UserIdentity, time_range: TimeRange +) -> Sequence[Reservation]: + ... + + +def _get_active_reservations_for_user_by_state( + self, + focus: UserIdentity, + time_range: TimeRange, + state: ReservationState, +) -> Sequence[Reservation]: + ... + + +def get_map_reserved_times_by_date( + self, date: datetime, subject: User +) -> dict[str, list[int]]: + ... + + +def _idx_calculation(self, time: datetime) -> int: + ... + +def _transform_date_map_for_unavailable( + self, reserved_date_map: dict[str, list[int]] +) -> None: + ... + +def _query_confirmed_reservations_by_date( + self, date: datetime + ) -> Sequence[Reservation]: + ... +``` + +If you want a deeper understanding of how these functions works, we recommened reading [this section.](#future-developers) + +## 3. Route to get all upcoming reservations for a user + +We added the following code into the backend API layer: + +```py3 +@api.get("/room-reservations/", tags=["Coworking"]) +def get_all_reservations_by_state( + state: ReservationState, + subject: User = Depends(registered_user), + reservation_svc: ReservationService = Depends(), +) -> Sequence[Reservation]: + try: + return reservation_svc.get_current_reservations_for_user( + subject=subject, focus=subject, state=state + ) + except Exception as e: + raise HTTPException(status_code=404, detail=str(e)) + +``` + +We needed a way to view all upcoming reservations for a given user so that we can display this information. So we added the following API route into the codebase. + +## 4. Route to get timeslots of all reservations for all users + +We needed this endpoint because we needed a way for the user to know which timeslots and rooms have already been booked, so that they could make their selection accordingly. We make sure that we only get the time slots and not any private information like names of users who made the reservations. This is the route we added in the `backend/api/coworking/reservation.py` file. + +```py3 +@api.get("/room-reservation/", tags=["Coworking"]) +def get_reservations_for_rooms_by_date( + date: datetime, + subject: User = Depends(registered_user), + reservation_svc: ReservationService = Depends(), +) -> dict[str, list[int]]: + """See available rooms for any given day.""" + try: + return reservation_svc.get_map_reserved_times_by_date(date, subject) + except Exception as e: + raise HTTPException(status_code=404, detail=str(e)) +``` + +Note that we had to make a novel method to get this map of reserved times. You can find this implementation under `backend/services/coworking/reservation.py`. + +# Underlying Database / Entity-Level Representation decisions + +We have not interefered with the way that our underlying database stores the data since the structure still remains the same. We have built upon this structure by making new reservations. We are now utilizing the room column within our database which was earlier set to be only None. + +# Technical and User Experience Design Choices + +## 1. Cards or Table for viewing upcoming reservation + +While implementing the upcoming reservations for the user, our team considered between using a table to view all possible upcoming reservations or using a widget card. The trade-off we considered were that tables were a more efficient way of presenting information, and they provide a more efficient way of searching and modifying data. Widgets are much harder to change inputs for and modify, but they provide a more aesthetic and consistent User Experience. + +Our team ended up picking the coworking card widgets to display this information because it was more consistent with how the website is set up right now. It actually ended up providing more modularity than a table than we had anticipated and is actually much easier to manage. + +## 2. API Routes for drafting reservations + +While implementing the API routes for drafting reservations, our team also considering making a separate endpoint for drafting room reservations which were not for the XL, but this ended up becoming very complicated. In the end, we decided that it is probably for the best to reduce the number of endpoints we have and instead modifying the current endpoint to be more expansive and inclusive so that we can make reservations for room other than the XL. + +## 3. List of Reservation Time Ranges or Matrix of Available Time Slots + +This is in context to making new reservations as illustrated in our Figma wireframe below. + +![Make Reservations](../images/make-reservations.png) + +When making reservations, you can see that some of the slots are marked red. These are possibly other reservations that other people in the XL might have made while Sally is trying to make her reservation. In order to actually get this information from the backend, we were debating whether we want to send back a list of reservation objects from the backend to the frontend or send back a matrix of 0s and 1s to represent time slots that are available vs time slots that are reserved. These are the possible trade-offs we considered. + +| List of Reservations | Matrix of Numbers | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| This would be easier to implement on the backend. | This would be considerably harder to implement on the backend | +| This would require then iterating through the list of reservations on the frontend, and it is awkwards to have business logic on the frontend for such an algorthmic process. | This would make it much easier to implement in the frontend since we can easily iterate over the matix and apply the correct widget depending on what value we see in the matrix. | +| This would be much more hardcoded with less modularity for changes in the future. For example, if we toggle to make a room not reservable anymore in the backend, it would either require making an endpoint connect which is awkward or change the hardcoded values which is also awkward. | This would be much more modular since we can actually fetch the operating hours and currently reservable rooms to dynamically update our matrix with updated values. | + +Based on the above analysis of trade-offs, we decided to actually go with the matrix approach, but we made a slight change to it by making it a Map instead, so that the number of rows and columns are not hardcoded, but rather retrived from the backend operating hours page. + +# Development Concerns + +We have a few development concerns that we would like to hopefully address in the future: + +- There should be a limit on how many rooms a user can reserve i.e how many reservations a user can have at any given time. +- Possibly consider adding group members to a reservation. (Add a button in the card to add a user.) +- Allow for pre-reservations in the XL as well. However this will require some clever thinking as the table cannot be extended to just incorporate SN156. +- There are some issues with how room reservations have been currently integrated with XL drop-in reservations, which make it a little harder for the user to navigate. + +# Future Developers + +This section is designed for developers interested in enhancing or expanding our features. Our goal is to provide a comprehensive overview that facilitates a smooth development experience. We've organized this guide into two main subsections: Frontend Concerns and Backend Concerns. This division reflects the separation of concerns inherent in the RestAPI architecture. If your focus is on frontend development, we strongly advise a thorough examination of the Frontend section and a cursory review of the Backend section. Conversely, backend developers should primarily focus on the Backend section while also familiarizing themselves with key aspects of the Frontend section. This approach ensures a holistic understanding of our system's architecture and functionalities, aiding in more effective and efficient development. + +## Frontend Concerns + +The Room Reservation feature introduces 2 components, 2 services, and 2 widgets. Users can access this feature through the coworking tab on the navigation bar. It was important to us to maintain the existing structure while developing an interface for users to book reservations, so future developers have less code to learn. + +### Components + +The components introduced in this feature are the new-reservation and confirmation-reservation components. + +#### New-Reservation Component: + +This component holds a table for users to make reservations with. In its view, it is the parent component for the Room Reservation Table and Date Selector widget. +It has access to the table service, which holds the business logic for this component to maintain appropriate barriers. A user may also see their Upcoming Reservations under the reservation table. +We decided to use the Coworking Reservation Card to display an upcoming reservation. Once the user clicks the 'Select' button, the component will navigate the user to the Confirm Reservation Component. +Availability is requested from the backend with the help of the Room Reservation Table Service and the Date Selector widget. + +#### Confirm Reservation Component: + +This is where a user may inspect the reservation they are about to make. This component uses the Coworking Reservation Card widget to display the reservation to the user. If the user does not confirm the draft reservation, this reservation draft will be cancelled on ng destroy. If either cancel or confirm are clicked, the user will be navigated to the Coworking Home Component. + +### Services + +The two services introduced are the Room Reservation Service and Reservation Table Service. + +#### Room Reservation Service: + +The Room Reservation Service extends the Reservation Service by adding 3 methods: + +1. getReservationsByState: Retrieves reservations by state. +2. checkin: Checks in a confirmed reservation. +3. deleteRoomReservation: Updates a reservation to a cancelled state. + +These methods are used to add and update room reservations with the backend. This service is the primary way of interacting with room reservations in the backend. + +#### Reservation Table Service: + +The Reservation Table Service holds all the business logic for the Room Reservation Table widget while also enumerating the table's cell states. +This service also has logic for interacting with the backend by making draft reservations and getting room reservations by date. + +A large portion of this service is aimed at encapsulating rules for maintaining a legitimate reservation request while users interact with the table. For example, a reservation should not have gaps between the reservation start and end times. + +### Widgets + +The widgets introduced in this feature are the Room Reservation Table and Date Selector. The Coworking Reservation Card widget was heavily used but was preexisting. These were discussed with how they were used within their parent components above. + +#### Room Reservation Table: + +A widget that uses a table to encapsulate the availability of room reservations for a specific day. + +#### Date Selector: + +A widget that uses a material date selector class to emit events to parent components. When a user wants to see room reservation availability for a different day, they will use the Date Selector widget to facilitate this change. + +#### Coworking Reservation Card: + +This preexisting widget is the method by which reservations are displayed to the user. + +## Backend Concerns + +For this feature, the backend primarily focuses on identifying available and reserved rooms, and also displays users' reservations. To understand the backend functionality, it's recommended to follow the outlined path where we move top-down i.e, we start at the API layer and move down to the queries that interact with the persistent storage. + +### 1. API Layer + +We recommend by checking out the code present in `backend/api/coworking/reservation.py`. Since this is the first layer that interacts with the frontend, it is the best to understand how the code is working. In this file we added the following routes: + +```py3 +@api.get("/room-reservations/", tags=["Coworking"]) +def get_all_reservations_by_state( + state: ReservationState, + subject: User = Depends(registered_user), + reservation_svc: ReservationService = Depends(), +) -> Sequence[Reservation]: + try: + return reservation_svc.get_current_reservations_for_user( + subject=subject, focus=subject, state=state + ) + except Exception as e: + raise HTTPException(status_code=404, detail=str(e)) + +@api.get("/room-reservation/", tags=["Coworking"]) +def get_reservations_for_rooms_by_date( + date: datetime, + subject: User = Depends(registered_user), + reservation_svc: ReservationService = Depends(), +) -> dict[str, list[int]]: + """See available rooms for any given day.""" + try: + return reservation_svc.get_map_reserved_times_by_date(date, subject) + except Exception as e: + raise HTTPException(status_code=404, detail=str(e)) +``` + +The `get_all_reservations_by_state()` method takes in a state as an argument and retreives all reservations of that state. To understand what a state is, we recommend checking out the `backend/models/coworking/reservation.py` and look at the class `ReservationState`. + +The `get_reservations_for_rooms_by_date` returns a dictionary of lists where the keys i.e the rows represents different rooms and the columns represent 30 minute time slots from 10:00 am to 12:00 pm. We will investigate how this dictionary is made within the next section. + +### 2. Reservation Service + +A keen reader would observe that within the routes we called the `get_map_reserved_times_by_date()` method. This is what does the majority of the work in the backend, and it is highly recommended to become familiar with this method. + +The main function `get_map_reserved_times_by_date()` uses the other 3 methods as helper functions to query through the database and turn that into a dictionary of lists where 0 represents available, 1 represents reserved, 2 represents selected, 3 represents unavailable, and 4 represents subject reservations. + +An example of what this dictionary would look like is represented below. This is the exact dictionary that is returned by the backend to the frontend. Index 0 represents the timeslot 10:00 - 10:30 am. Index 1 represents 10:30 am - 11:00 am. And so on... + +```py3 +{ + "SN135" : [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 4, 4, 4, 4], + "SN137" : [0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 3, 3, 3, 3], + "SN139" : [1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 3, 3, 3, 3], + "SN141" : [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 3, 3] +} +``` + +So you can imagine that some other people have already made reservations for example in SN139 from 10:00 am to 11:00 am and SN141 from 12:00 pm to 2:00 pm. Obviously this list does not contain all the reservations listed above, but hopefully should give you a good understanding how this dictionary works. Also note that the columns which have a 4 all have 3s. This is because if you have a reservation from 4:00 pm to 6:00 pm as in the example above, you cannot make another reservation in the time slot. So those time slots become unavailable to be reserved. + +## 3. Models + +The only model we really implemented in the backend is the RoomPartial and Room model shown below. But it is recommened to go through the other models including the Reservation and User model that are frequently used through our codebase. + +```py3 +class RoomPartial(BaseModel): + id: str | None = None + +class Room(RoomPartial): + nickname: str = "" +``` diff --git a/frontend/src/app/coworking/ambassador-home/ambassador-home-routing.module.ts b/frontend/src/app/coworking/ambassador-home/ambassador-home-routing.module.ts new file mode 100644 index 000000000..edb0235a3 --- /dev/null +++ b/frontend/src/app/coworking/ambassador-home/ambassador-home-routing.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { AmbassadorXlListComponent } from './ambassador-xl/list/ambassador-xl-list.component'; +import { AmbassadorPageComponent } from './ambassador-home.component'; +import { AmbassadorRoomListComponent } from './ambassador-room/list/ambassador-room-list.component'; + +const routes: Routes = [ + { + path: '', + component: AmbassadorPageComponent, + children: [ + AmbassadorXlListComponent.Route, + AmbassadorRoomListComponent.Route + ] + } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class AmbassadorHomeRoutingModule {} diff --git a/frontend/src/app/coworking/ambassador-home/ambassador-home.component.css b/frontend/src/app/coworking/ambassador-home/ambassador-home.component.css index 79b4759b9..e69de29bb 100644 --- a/frontend/src/app/coworking/ambassador-home/ambassador-home.component.css +++ b/frontend/src/app/coworking/ambassador-home/ambassador-home.component.css @@ -1,15 +0,0 @@ -.mat-mdc-card { - max-width: 100%; -} - -.mat-mdc-card-header { - margin-bottom: 16px; -} - -.walkinReservation.mat-mdc-card-content:last-child { - padding-bottom: 0; -} - -button { - margin-right: 1vw; -} diff --git a/frontend/src/app/coworking/ambassador-home/ambassador-home.component.html b/frontend/src/app/coworking/ambassador-home/ambassador-home.component.html index 429470d20..20fe6ba7e 100644 --- a/frontend/src/app/coworking/ambassador-home/ambassador-home.component.html +++ b/frontend/src/app/coworking/ambassador-home/ambassador-home.component.html @@ -1,164 +1,15 @@ -

- - - Reserve a Drop-in at the Welcome Desk - Create a walk-in reservation for an XL community member at the welcome - desk. Members must be registered with the XL and accept the Community - Agreement. - - - - - - - - - - -
-
- - - Upcoming Reservations - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ID{{ reservation.id }}Name - {{ reservation.users[0].first_name }} {{ - reservation.users[0].last_name }} - Start - {{ reservation.start | date: 'shortTime' }} - End - {{ reservation.end | date: 'shortTime' }} - Seat - {{ reservation.seats[0].title }} - Actions - - -
-
-
- - - - - Upcoming Reservations - - No upcoming reservations. - - -
- -
- - - Active Reservations - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ID{{ reservation.id }}Name - {{ reservation.users[0].first_name }} {{ - reservation.users[0].last_name }} - Start - {{ reservation.start | date: 'shortTime' }} - End - {{ reservation.end | date: 'shortTime' }} - Seat - {{ reservation.seats[0].title }} - Actions -   -
-
-
- - - - - Active Reservations - - It's lonely in here. - - -
+
+ + + diff --git a/frontend/src/app/coworking/ambassador-home/ambassador-home.component.ts b/frontend/src/app/coworking/ambassador-home/ambassador-home.component.ts index b60e64aa6..3fa966a3b 100644 --- a/frontend/src/app/coworking/ambassador-home/ambassador-home.component.ts +++ b/frontend/src/app/coworking/ambassador-home/ambassador-home.component.ts @@ -7,114 +7,30 @@ */ import { Component, OnDestroy, OnInit } from '@angular/core'; -import { Route } from '@angular/router'; -import { permissionGuard } from 'src/app/permission.guard'; -import { profileResolver } from 'src/app/profile/profile.resolver'; -import { Observable, Subscription, map, tap, timer } from 'rxjs'; -import { - CoworkingStatus, - Reservation, - SeatAvailability -} from '../coworking.models'; -import { AmbassadorService } from './ambassador.service'; -import { PublicProfile } from 'src/app/profile/profile.service'; -import { CoworkingService } from '../coworking.service'; - -const FIVE_SECONDS = 5 * 1000; +import { Router } from '@angular/router'; @Component({ selector: 'app-coworking-ambassador-home', templateUrl: './ambassador-home.component.html', styleUrls: ['./ambassador-home.component.css'] }) -export class AmbassadorPageComponent implements OnInit, OnDestroy { - /** Route information to be used in App Routing Module */ - public static Route: Route = { - path: 'ambassador', - component: AmbassadorPageComponent, - title: 'XL Ambassador', - canActivate: [permissionGuard('coworking.reservation.*', '*')], - resolve: { profile: profileResolver } - }; - - reservations$: Observable; - upcomingReservations$: Observable; - activeReservations$: Observable; - - welcomeDeskReservationSelection: PublicProfile[] = []; - status$: Observable; - - columnsToDisplay = ['id', 'name', 'seat', 'start', 'end', 'actions']; - - private refreshSubscription!: Subscription; - - constructor( - public ambassadorService: AmbassadorService, - public coworkingService: CoworkingService - ) { - this.reservations$ = this.ambassadorService.reservations$; - this.upcomingReservations$ = this.reservations$.pipe( - map((reservations) => reservations.filter((r) => r.state === 'CONFIRMED')) - ); - this.activeReservations$ = this.reservations$.pipe( - map((reservations) => - reservations.filter((r) => r.state === 'CHECKED_IN') - ) - ); - - this.status$ = coworkingService.status$; - } - - beginReservationRefresh(): void { - if (this.refreshSubscription) { - this.refreshSubscription.unsubscribe(); - } - this.refreshSubscription = timer(0, FIVE_SECONDS) - .pipe(tap((_) => this.ambassadorService.fetchReservations())) - .subscribe(); - } +export class AmbassadorPageComponent implements OnInit { + public links = [ + { + label: 'XL Reservations', + path: '/coworking/ambassador/xl', + default: true + }, + { label: 'Room Reservations', path: '/coworking/ambassador/room' } + ]; + + constructor(private router: Router) {} ngOnInit(): void { - this.beginReservationRefresh(); - } - - ngOnDestroy(): void { - this.refreshSubscription.unsubscribe(); - } - - onUsersChanged(users: PublicProfile[]) { - if (users.length > 0) { - this.coworkingService.pollStatus(); - } - } - - onWalkinSeatSelection(seatSelection: SeatAvailability[]) { - if ( - seatSelection.length > 0 && - this.welcomeDeskReservationSelection.length > 0 - ) { - this.ambassadorService - .makeDropinReservation( - seatSelection, - this.welcomeDeskReservationSelection - ) - .subscribe({ - next: (reservation) => { - this.welcomeDeskReservationSelection = []; - this.beginReservationRefresh(); - alert( - `Walk-in reservation made for ${ - reservation.users[0].first_name - } ${ - reservation.users[0].last_name - }!\nReservation ends at ${reservation.end.toLocaleTimeString()}` - ); - }, - error: (e) => { - this.welcomeDeskReservationSelection = []; - alert(e.message + '\n\n' + e.error.message); - } - }); + // Find the default link and navigate to it + const defaultLink = this.links.find((link) => link.default); + if (defaultLink) { + this.router.navigate([defaultLink.path]); } } } diff --git a/frontend/src/app/coworking/ambassador-home/ambassador-home.module.ts b/frontend/src/app/coworking/ambassador-home/ambassador-home.module.ts new file mode 100644 index 000000000..f7ca061c9 --- /dev/null +++ b/frontend/src/app/coworking/ambassador-home/ambassador-home.module.ts @@ -0,0 +1,41 @@ +import { NgModule } from '@angular/core'; +import { AsyncPipe, CommonModule } from '@angular/common'; + +import { AmbassadorHomeRoutingModule } from './ambassador-home-routing.module'; +import { MatCard, MatCardModule } from '@angular/material/card'; +import { MatButtonModule } from '@angular/material/button'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTableModule } from '@angular/material/table'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTabsModule } from '@angular/material/tabs'; +// import { AmbassadorXlListComponent } from './ambassador-xl/list/ambassador-xl-list.component'; +// import { AmbassadorRoomListComponent } from './ambassador-room/list/ambassador-room-list.component'; +import { SharedModule } from 'src/app/shared/shared.module'; + +@NgModule({ + imports: [ + CommonModule, + AmbassadorHomeRoutingModule, + MatCardModule, + MatTabsModule, + MatTableModule, + MatDialogModule, + MatButtonModule, + MatSelectModule, + MatFormFieldModule, + MatInputModule, + MatPaginatorModule, + MatListModule, + MatAutocompleteModule, + AsyncPipe, + SharedModule + ] +}) +export class AmbassadorHomeModule {} diff --git a/frontend/src/app/coworking/ambassador-home/ambassador-room/ambassador-room.service.spec.ts b/frontend/src/app/coworking/ambassador-home/ambassador-room/ambassador-room.service.spec.ts new file mode 100644 index 000000000..d3053e063 --- /dev/null +++ b/frontend/src/app/coworking/ambassador-home/ambassador-room/ambassador-room.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { AmbassadorRoomService } from './ambassador-room.service'; + +describe('AmbassadorRoomService', () => { + let service: AmbassadorRoomService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(AmbassadorRoomService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/coworking/ambassador-home/ambassador-room/ambassador-room.service.ts b/frontend/src/app/coworking/ambassador-home/ambassador-room/ambassador-room.service.ts new file mode 100644 index 000000000..490b5caff --- /dev/null +++ b/frontend/src/app/coworking/ambassador-home/ambassador-room/ambassador-room.service.ts @@ -0,0 +1,75 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { + Reservation, + ReservationJSON, + parseReservationJSON +} from '../../coworking.models'; +import { RxReservations } from '../rx-reservations'; + +@Injectable({ + providedIn: 'root' +}) +export class AmbassadorRoomService { + private reservations: RxReservations = new RxReservations(); + public reservations$: Observable = this.reservations.value$; + + constructor(private http: HttpClient) {} + + fetchReservations(): void { + this.http + .get('/api/coworking/ambassador/rooms') + .subscribe((reservations) => { + this.reservations.set(reservations.map(parseReservationJSON)); + }); + } + + isCheckInDisabled(reservation: Reservation): boolean { + const currentTime = new Date(); + const reservationStartTime = new Date(reservation.start); + return reservationStartTime > currentTime; + } + + checkIn(reservation: Reservation): void { + this.http + .put(`/api/coworking/ambassador/checkin`, { + id: reservation.id, + state: 'CHECKED_IN' + }) + .subscribe((reservationJson) => { + this.reservations.updateReservation( + parseReservationJSON(reservationJson) + ); + }); + } + + checkOut(reservation: Reservation) { + this.http + .put(`/api/coworking/reservation/${reservation.id}`, { + id: reservation.id, + state: 'CHECKED_OUT' + }) + .subscribe((reservationJson) => { + this.reservations.updateReservation( + parseReservationJSON(reservationJson) + ); + }); + } + + cancel(reservation: Reservation) { + this.http + .put(`/api/coworking/reservation/${reservation.id}`, { + id: reservation.id, + state: 'CANCELLED' + }) + .subscribe({ + next: (_) => { + this.reservations.remove(reservation); + }, + error: (err) => { + alert(err); + } + }); + } +} diff --git a/frontend/src/app/coworking/ambassador-home/ambassador-room/list/ambassador-room-list.component.css b/frontend/src/app/coworking/ambassador-home/ambassador-room/list/ambassador-room-list.component.css new file mode 100644 index 000000000..fe356ae49 --- /dev/null +++ b/frontend/src/app/coworking/ambassador-home/ambassador-room/list/ambassador-room-list.component.css @@ -0,0 +1,15 @@ +.mat-mdc-card { + max-width: 100%; + } + + .mat-mdc-card-header { + margin-bottom: 16px; + } + + .walkinReservation.mat-mdc-card-content:last-child { + padding-bottom: 0; + } + + button { + margin-right: 1vw; + } \ No newline at end of file diff --git a/frontend/src/app/coworking/ambassador-home/ambassador-room/list/ambassador-room-list.component.html b/frontend/src/app/coworking/ambassador-home/ambassador-room/list/ambassador-room-list.component.html new file mode 100644 index 000000000..357a4044d --- /dev/null +++ b/frontend/src/app/coworking/ambassador-home/ambassador-room/list/ambassador-room-list.component.html @@ -0,0 +1,153 @@ +
+ + + Upcoming Reservations + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID{{ reservation.id }}Name + {{ reservation.users[0].first_name }} + {{ reservation.users[0].last_name }} + Date + {{ reservation.start | date: 'dd MMM yyyy' }} + Start + {{ reservation.start | date: 'shortTime' }} + End + {{ reservation.end | date: 'shortTime' }} + Room + {{ reservation.room.id }} + Actions + + +
+
+
+ + + + + Upcoming Reservations + + No upcoming reservations. + + +
+ +
+ + + Active Reservations + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID{{ reservation.id }}Name + {{ reservation.users[0].first_name }} + {{ reservation.users[0].last_name }} + Date + {{ reservation.start | date: 'dd MMM yyyy' }} + Start + {{ reservation.start | date: 'shortTime' }} + End + {{ reservation.end | date: 'shortTime' }} + Room + {{ reservation.room.id }} + Actions + +
+
+
+ + + + + Active Reservations + + It's lonely in here. + + +
diff --git a/frontend/src/app/coworking/ambassador-home/ambassador-room/list/ambassador-room-list.component.spec.ts b/frontend/src/app/coworking/ambassador-home/ambassador-room/list/ambassador-room-list.component.spec.ts new file mode 100644 index 000000000..e905129bf --- /dev/null +++ b/frontend/src/app/coworking/ambassador-home/ambassador-room/list/ambassador-room-list.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AmbassadorRoomListComponent } from './ambassador-room-list.component'; + +describe('AmbassadorRoomListComponent', () => { + let component: AmbassadorRoomListComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [AmbassadorRoomListComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(AmbassadorRoomListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/coworking/ambassador-home/ambassador-room/list/ambassador-room-list.component.ts b/frontend/src/app/coworking/ambassador-home/ambassador-room/list/ambassador-room-list.component.ts new file mode 100644 index 000000000..7678b87d3 --- /dev/null +++ b/frontend/src/app/coworking/ambassador-home/ambassador-room/list/ambassador-room-list.component.ts @@ -0,0 +1,51 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { Route } from '@angular/router'; +import { Observable, Subscription, map, timer, tap } from 'rxjs'; +import { Reservation } from 'src/app/coworking/coworking.models'; +import { permissionGuard } from 'src/app/permission.guard'; +import { AmbassadorRoomService } from '../ambassador-room.service'; + +@Component({ + selector: 'app-ambassador-room-list', + templateUrl: './ambassador-room-list.component.html', + styleUrls: ['./ambassador-room-list.component.css'] +}) +export class AmbassadorRoomListComponent implements OnInit, OnDestroy { + public static Route: Route = { + path: 'room', + component: AmbassadorRoomListComponent, + title: 'Room Reservations', + canActivate: [permissionGuard('coworking.reservation.*', '*')], + resolve: {} + }; + + reservations$: Observable; + upcomingReservations$: Observable; + activeReservations$: Observable; + + columnsToDisplay = ['id', 'name', 'room', 'date', 'start', 'end', 'actions']; + + private refreshSubscription!: Subscription; + + constructor(public ambassadorService: AmbassadorRoomService) { + this.reservations$ = this.ambassadorService.reservations$; + this.upcomingReservations$ = this.reservations$.pipe( + map((reservations) => reservations.filter((r) => r.state === 'CONFIRMED')) + ); + this.activeReservations$ = this.reservations$.pipe( + map((reservations) => + reservations.filter((r) => r.state === 'CHECKED_IN') + ) + ); + } + + ngOnInit(): void { + this.refreshSubscription = timer(0, 5000) + .pipe(tap((_) => this.ambassadorService.fetchReservations())) + .subscribe(); + } + + ngOnDestroy(): void { + this.refreshSubscription.unsubscribe(); + } +} diff --git a/frontend/src/app/coworking/ambassador-home/ambassador-xl/ambassador-xl.service.spec.ts b/frontend/src/app/coworking/ambassador-home/ambassador-xl/ambassador-xl.service.spec.ts new file mode 100644 index 000000000..88e0865a4 --- /dev/null +++ b/frontend/src/app/coworking/ambassador-home/ambassador-xl/ambassador-xl.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { AmbassadorXlService } from './ambassador-xl.service'; + +describe('AmbassadorXlService', () => { + let service: AmbassadorXlService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(AmbassadorXlService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/coworking/ambassador-home/ambassador.service.ts b/frontend/src/app/coworking/ambassador-home/ambassador-xl/ambassador-xl.service.ts similarity index 91% rename from frontend/src/app/coworking/ambassador-home/ambassador.service.ts rename to frontend/src/app/coworking/ambassador-home/ambassador-xl/ambassador-xl.service.ts index 4db97e95b..ba5078ac6 100644 --- a/frontend/src/app/coworking/ambassador-home/ambassador.service.ts +++ b/frontend/src/app/coworking/ambassador-home/ambassador-xl/ambassador-xl.service.ts @@ -1,19 +1,21 @@ +import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { RxReservations } from './rx-reservations'; import { Observable, map } from 'rxjs'; import { Reservation, ReservationJSON, SeatAvailability, parseReservationJSON -} from '../coworking.models'; -import { HttpClient } from '@angular/common/http'; +} from '../../coworking.models'; +import { RxReservations } from '../rx-reservations'; import { PublicProfile } from 'src/app/profile/profile.service'; const ONE_HOUR = 60 * 60 * 1000; -@Injectable({ providedIn: 'root' }) -export class AmbassadorService { +@Injectable({ + providedIn: 'root' +}) +export class AmbassadorXlService { private reservations: RxReservations = new RxReservations(); public reservations$: Observable = this.reservations.value$; @@ -21,7 +23,7 @@ export class AmbassadorService { fetchReservations(): void { this.http - .get('/api/coworking/ambassador') + .get('/api/coworking/ambassador/xl') .subscribe((reservations) => { this.reservations.set(reservations.map(parseReservationJSON)); }); diff --git a/frontend/src/app/coworking/ambassador-home/ambassador-xl/list/ambassador-xl-list.component.css b/frontend/src/app/coworking/ambassador-home/ambassador-xl/list/ambassador-xl-list.component.css new file mode 100644 index 000000000..fe356ae49 --- /dev/null +++ b/frontend/src/app/coworking/ambassador-home/ambassador-xl/list/ambassador-xl-list.component.css @@ -0,0 +1,15 @@ +.mat-mdc-card { + max-width: 100%; + } + + .mat-mdc-card-header { + margin-bottom: 16px; + } + + .walkinReservation.mat-mdc-card-content:last-child { + padding-bottom: 0; + } + + button { + margin-right: 1vw; + } \ No newline at end of file diff --git a/frontend/src/app/coworking/ambassador-home/ambassador-xl/list/ambassador-xl-list.component.html b/frontend/src/app/coworking/ambassador-home/ambassador-xl/list/ambassador-xl-list.component.html new file mode 100644 index 000000000..7680afda9 --- /dev/null +++ b/frontend/src/app/coworking/ambassador-home/ambassador-xl/list/ambassador-xl-list.component.html @@ -0,0 +1,164 @@ +
+ + + Reserve a Drop-in at the Welcome Desk + Create a walk-in reservation for an XL community member at the welcome + desk. Members must be registered with the XL and accept the Community + Agreement. + + + + + + + + + + +
+
+ + + Upcoming Reservations + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID{{ reservation.id }}Name + {{ reservation.users[0].first_name }} + {{ reservation.users[0].last_name }} + Start + {{ reservation.start | date: 'shortTime' }} + End + {{ reservation.end | date: 'shortTime' }} + Seat + {{ reservation.seats[0].title }} + Actions + + +
+
+
+ + + + + Upcoming Reservations + + No upcoming reservations. + + +
+ +
+ + + Active Reservations + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID{{ reservation.id }}Name + {{ reservation.users[0].first_name }} + {{ reservation.users[0].last_name }} + Start + {{ reservation.start | date: 'shortTime' }} + End + {{ reservation.end | date: 'shortTime' }} + Seat + {{ reservation.seats[0].title }} + Actions +   +
+
+
+ + + + + Active Reservations + + It's lonely in here. + + +
diff --git a/frontend/src/app/coworking/ambassador-home/ambassador-xl/list/ambassador-xl-list.component.spec.ts b/frontend/src/app/coworking/ambassador-home/ambassador-xl/list/ambassador-xl-list.component.spec.ts new file mode 100644 index 000000000..c7532b65e --- /dev/null +++ b/frontend/src/app/coworking/ambassador-home/ambassador-xl/list/ambassador-xl-list.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AmbassadorXlListComponent } from './ambassador-xl-list.component'; + +describe('AmbassadorXlListComponent', () => { + let component: AmbassadorXlListComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [AmbassadorXlListComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(AmbassadorXlListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/coworking/ambassador-home/ambassador-xl/list/ambassador-xl-list.component.ts b/frontend/src/app/coworking/ambassador-home/ambassador-xl/list/ambassador-xl-list.component.ts new file mode 100644 index 000000000..e9661295a --- /dev/null +++ b/frontend/src/app/coworking/ambassador-home/ambassador-xl/list/ambassador-xl-list.component.ts @@ -0,0 +1,112 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { Route } from '@angular/router'; +import { permissionGuard } from 'src/app/permission.guard'; +import { profileResolver } from 'src/app/profile/profile.resolver'; +import { Observable, Subscription, map, tap, timer } from 'rxjs'; +import { + CoworkingStatus, + Reservation, + SeatAvailability +} from '../../../coworking.models'; +import { AmbassadorXlService } from '../ambassador-xl.service'; +import { PublicProfile } from 'src/app/profile/profile.service'; +import { CoworkingService } from '../../../coworking.service'; + +const FIVE_SECONDS = 5 * 1000; + +@Component({ + selector: 'app-ambassador-xl-list', + templateUrl: './ambassador-xl-list.component.html', + styleUrls: ['./ambassador-xl-list.component.css'] +}) +export class AmbassadorXlListComponent implements OnDestroy, OnInit { + /** Route information to be used in App Routing Module */ + public static Route: Route = { + path: 'xl', + component: AmbassadorXlListComponent, + title: 'XL Reservations', + canActivate: [permissionGuard('coworking.reservation.*', '*')], + resolve: {} + }; + + reservations$: Observable; + upcomingReservations$: Observable; + activeReservations$: Observable; + + welcomeDeskReservationSelection: PublicProfile[] = []; + status$: Observable; + + columnsToDisplay = ['id', 'name', 'seat', 'start', 'end', 'actions']; + + private refreshSubscription!: Subscription; + + constructor( + public ambassadorService: AmbassadorXlService, + public coworkingService: CoworkingService + ) { + this.reservations$ = this.ambassadorService.reservations$; + this.upcomingReservations$ = this.reservations$.pipe( + map((reservations) => reservations.filter((r) => r.state === 'CONFIRMED')) + ); + this.activeReservations$ = this.reservations$.pipe( + map((reservations) => + reservations.filter((r) => r.state === 'CHECKED_IN') + ) + ); + + this.status$ = coworkingService.status$; + } + + beginReservationRefresh(): void { + if (this.refreshSubscription) { + this.refreshSubscription.unsubscribe(); + } + this.refreshSubscription = timer(0, FIVE_SECONDS) + .pipe(tap((_) => this.ambassadorService.fetchReservations())) + .subscribe(); + } + + ngOnInit(): void { + this.beginReservationRefresh(); + } + + ngOnDestroy(): void { + this.refreshSubscription.unsubscribe(); + } + + onUsersChanged(users: PublicProfile[]) { + if (users.length > 0) { + this.coworkingService.pollStatus(); + } + } + + onWalkinSeatSelection(seatSelection: SeatAvailability[]) { + if ( + seatSelection.length > 0 && + this.welcomeDeskReservationSelection.length > 0 + ) { + this.ambassadorService + .makeDropinReservation( + seatSelection, + this.welcomeDeskReservationSelection + ) + .subscribe({ + next: (reservation) => { + this.welcomeDeskReservationSelection = []; + this.beginReservationRefresh(); + alert( + `Walk-in reservation made for ${ + reservation.users[0].first_name + } ${ + reservation.users[0].last_name + }!\nReservation ends at ${reservation.end.toLocaleTimeString()}` + ); + }, + error: (e) => { + this.welcomeDeskReservationSelection = []; + alert(e.message + '\n\n' + e.error.message); + } + }); + } + } +} diff --git a/frontend/src/app/coworking/coworking-home/coworking-home.component.css b/frontend/src/app/coworking/coworking-home/coworking-home.component.css index 1587880d6..640e50bcd 100644 --- a/frontend/src/app/coworking/coworking-home/coworking-home.component.css +++ b/frontend/src/app/coworking/coworking-home/coworking-home.component.css @@ -6,28 +6,31 @@ * */ -.coworking-top-grid { - display: grid; - padding-top: 24px; - padding-left: 24px; - padding-right: 24px; - grid-template-columns: 4fr 1fr; - /* grid-template-rows: 0fr 2fr; <-- UNCOMMENT */ - row-gap: 15px; - column-gap: 15px; +.coworking-home-top { + padding-bottom: 24px; + padding-top: 24px; } .coworking-reservations-grid { - display: grid; - padding: 24px; - /* grid-template-columns: 1fr 1fr; */ - /* grid-template-rows: 0fr 2fr; <-- UNCOMMENT */ - row-gap: 15px; - column-gap: 15px; + display: grid; + padding: 0px 24px 0px 24px !important; + grid-template-columns: 4fr; + /* grid-template-rows: 0fr 2fr; <-- UNCOMMENT */ + row-gap: 15px; + column-gap: 15px; +} + +.coworking-reservations-grid { + display: grid; + padding: 24px; + /* grid-template-columns: 1fr 1fr; */ + /* grid-template-rows: 0fr 2fr; <-- UNCOMMENT */ + row-gap: 15px; + column-gap: 15px; } .coworking-top-card-container { - grid-column: span 1; + grid-column: span 1; } /* UNCOMMENT THE FOLLOWING: */ @@ -40,21 +43,178 @@ } */ .other-dropin-card-container { - grid-column-start: 1; + grid-column-start: 1; } /** Make cards display in one column, with the event card appearing last */ @media only screen and (max-device-width: 730px) { - .coworking-grid { - display: grid; - padding: 24px; - grid-template-columns: 1fr; - grid-template-rows: 1fr; - row-gap: 15px; - column-gap: 24px; - } - - .dropin-card-container { - order: 1; - } -} \ No newline at end of file + .coworking-home-top { + padding-bottom: 20px; + padding-top: 20px; + } + + .coworking-reservations-grid { + display: grid; + box-sizing: border-box; /* This ensures padding is included in the width */ + padding: 0px 20px 0px 20px !important; + grid-template-columns: 1fr; + grid-template-rows: 1fr; + row-gap: 15px; + } + + .coworking-reservations-grid > * { + box-sizing: border-box; + padding: 0px; + margin: 0px; + } + + .reservation-card { + padding: 4px 16px 4px 16px !important; + box-sizing: border-box; + max-width: 348px; /* Max width as per the other element */ + /* max-height: 321px; Max height as per the other element */ + /* ... other necessary styles ... */ + } + + .dropin-card-container { + order: 1; + } + + .upcoming-card-container { + order: 3; + } +} + +.navigation-card { + background-color: rgb(71, 134, 198); /* Set the background color to gray */ + border: 1px solid #999; /* Set the border color */ + padding: 10px; /* Add padding for spacing */ + margin-top: 15px; /* Add margin for spacing */ + text-align: center; /* Align the content to the left */ + border-radius: 5px; /* Add border radius for rounded corners */ + width: 200px; /* Set the width of the cards */ +} + +.navigation-card a { + text-decoration: none; /* Remove the default underline on the link */ + color: white; /* Set the text color */ + font-weight: bold; /* Make the text bold */ + cursor: pointer; /* Change cursor to pointer on hover */ +} + +/* Add this to your global or component CSS file */ +.room-reservation-button { + font-size: 12px; /* Adjust the font size as needed */ + background-color: red; + width: 180px; + height: 40px; +} + +.mdc-list-item--with-leading-icon .mdc-list-item__start { + font-size: 24px; + background: #4786c6; + width: 36px; + height: 50%; + text-align: center; + margin-bottom: 0; + padding-bottom: 0; + line-height: 36px; + border-radius: 100%; + color: white; +} + +.mat-mdc-list-item-meta.mdc-list-item__end { + display: flex; + align-items: center; + justify-content: center; + height: 100%; +} + +.mat-mdc-list-item-meta { + height: 100%; + vertical-align: middle; + font-size: 32px; +} + +.mdc-list-item { + display: flex; + align-items: center; +} + +.mdc-list-item--with-leading-icon .mdc-list-item__start.unavailable { + background: #612d23; +} + +.mdc-list-item--with-leading-icon .mdc-list-item__start.upcoming { + background: #234261; +} + +/* End Action List Styling */ + +.mat-mdc-card { + padding: 0px; + margin: 0 !important; + max-width: 640px; +} + +.dropin-header { + display: flex; + margin-bottom: 0.5rem; + align-items: center; + justify-content: space-between; +} + +.mdc-list-group__subheader { + margin: 0; +} + +.mdc-list-item { + padding: 0 !important; + display: flex; + align-items: baseline; +} + +.mdc-list-group__subheader { + margin: 0; +} + +.mat-mdc-list-base { + padding: 0; +} + +.mat-expansion-panel-header-description { + align-items: right; + flex: 0 0 auto; +} + +.mat-expansion-panel-header-description button { + z-index: 10 !important; +} + +mat-expansion-panel { + margin-top: 8px; +} + +.mat-action-row { + align-items: center; +} + +mat-checkbox { + flex: 1; +} + +.bolded { + font-weight: 500; +} + +a { + text-decoration: none; +} + +.reservation-card { + padding: 8px 16px 8px 16px; /* Top padding is now the same as sides and bottom */ +} + +.reservation-link { + flex: 1; +} diff --git a/frontend/src/app/coworking/coworking-home/coworking-home.component.html b/frontend/src/app/coworking/coworking-home/coworking-home.component.html index 43a820f08..955a4dbfa 100644 --- a/frontend/src/app/coworking/coworking-home/coworking-home.component.html +++ b/frontend/src/app/coworking/coworking-home/coworking-home.component.html @@ -1,29 +1,72 @@ -
- - - +
+
+ + + + - -
- -
+ + +
+ +
+
+
+ + +
+
+
+
+ + + + +

{{ 'Room Reservations' }}

+

{{ 'Make a new room reservations!' }}

+

+
+
+
+
+
- - - - +
+
+ + +
+

Upcoming Reservations

+
+
+ + + + +
+
+
+
+
+
+
diff --git a/frontend/src/app/coworking/coworking-home/coworking-home.component.ts b/frontend/src/app/coworking/coworking-home/coworking-home.component.ts index 3a43d9fae..8422f5d2d 100644 --- a/frontend/src/app/coworking/coworking-home/coworking-home.component.ts +++ b/frontend/src/app/coworking/coworking-home/coworking-home.component.ts @@ -2,13 +2,13 @@ * The Coworking Component serves as the hub for students to create reservations * for tables, rooms, and equipment from the CSXL. * - * @author Kris Jordan, Ajay Gandecha + * @author Kris Jordan, Ajay Gandecha, John Schachte * @copyright 2023 * @license MIT */ import { Component, OnDestroy, OnInit } from '@angular/core'; -import { ActivatedRoute, Route, Router } from '@angular/router'; +import { Route, Router } from '@angular/router'; import { isAuthenticated } from 'src/app/gate/gate.guard'; import { profileResolver } from 'src/app/profile/profile.resolver'; import { CoworkingService } from '../coworking.service'; @@ -19,19 +19,12 @@ import { Reservation, SeatAvailability } from '../coworking.models'; -import { - Observable, - Subscription, - filter, - map, - mergeMap, - of, - timer -} from 'rxjs'; +import { Observable, Subscription, map, mergeMap, of, timer } from 'rxjs'; +import { RoomReservationService } from '../room-reservation/room-reservation.service'; import { ReservationService } from '../reservation/reservation.service'; import { MatDialog } from '@angular/material/dialog'; import { CommunityAgreement } from 'src/app/shared/community-agreement/community-agreement.widget'; - +import { MatSnackBar } from '@angular/material/snack-bar'; @Component({ selector: 'app-coworking-home', templateUrl: './coworking-home.component.html', @@ -47,6 +40,10 @@ export class CoworkingPageComponent implements OnInit, OnDestroy { private timerSubscription!: Subscription; + public upcomingRoomReservation$!: Observable; + + public filteredRoomReservations$!: Observable; + /** Route information to be used in App Routing Module */ public static Route: Route = { path: '', @@ -57,34 +54,55 @@ export class CoworkingPageComponent implements OnInit, OnDestroy { }; constructor( - route: ActivatedRoute, public coworkingService: CoworkingService, private router: Router, private reservationService: ReservationService, + protected snackBar: MatSnackBar, + private roomReservationService: RoomReservationService, private profileService: ProfileService, private dialog: MatDialog ) { this.status$ = coworkingService.status$; + this.upcomingRoomReservation$ = + roomReservationService.upcomingReservations$; + this.openOperatingHours$ = this.initNextOperatingHours(); + this.isOpen$ = this.initIsOpen(); + this.activeReservation$ = this.initActiveReservation(); + } + + /** + * A lifecycle hook that is called after Angular has initialized all data-bound properties of a directive. + * + * Use this hook to initialize the directive or component. This is the right place to fetch data from a server, + * set up any local state, or perform operations that need to be executed only once when the component is instantiated. + * + * @returns {void} - This method does not return a value. + */ + ngOnInit(): void { + this.status$ = this.coworkingService.status$; this.openOperatingHours$ = this.initNextOperatingHours(); this.isOpen$ = this.initIsOpen(); this.activeReservation$ = this.initActiveReservation(); + this.timerSubscription = timer(0, 10000).subscribe(() => { + this.coworkingService.pollStatus(); + this.roomReservationService.pollUpcomingRoomReservation(this.snackBar); + }); } reserve(seatSelection: SeatAvailability[]) { this.coworkingService.draftReservation(seatSelection).subscribe({ + error: (error) => + this.snackBar.open( + 'Error. There may be a conflicting upcoming reservation. Please check upcoming reservations.', + '', + { duration: 8000 } + ), next: (reservation) => { this.router.navigateByUrl(`/coworking/reservation/${reservation.id}`); } }); } - ngOnInit(): void { - this.timerSubscription = timer(0, 10000).subscribe(() => - this.coworkingService.pollStatus() - ); - this.hasAcceptedAgreement(); - } - ngOnDestroy(): void { this.timerSubscription.unsubscribe(); } @@ -113,7 +131,7 @@ export class CoworkingPageComponent implements OnInit, OnDestroy { let reservations = status.my_reservations; let now = new Date(); return reservations.find( - (reservation) => reservation.start <= now && reservation.end > now + this.roomReservationService.findActiveReservationPredicate ); }), mergeMap((reservation) => @@ -124,6 +142,17 @@ export class CoworkingPageComponent implements OnInit, OnDestroy { ); } + navigateToNewReservation() { + this.router.navigateByUrl('/coworking/new-reservation'); + } + + /** + * Function that is used when coworking card triggers a need to refresh the active reservation + */ + setActiveReservation() { + this.activeReservation$ = this.initActiveReservation(); + } + private hasAcceptedAgreement() { this.profileService.profile$.subscribe((profile) => { if (profile) { diff --git a/frontend/src/app/coworking/coworking-routing.module.ts b/frontend/src/app/coworking/coworking-routing.module.ts index 5d1e50a73..36bb7827d 100644 --- a/frontend/src/app/coworking/coworking-routing.module.ts +++ b/frontend/src/app/coworking/coworking-routing.module.ts @@ -1,13 +1,23 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { CoworkingPageComponent } from './coworking-home/coworking-home.component'; -import { AmbassadorPageComponent } from './ambassador-home/ambassador-home.component'; import { ReservationComponent } from './reservation/reservation.component'; +import { NewReservationPageComponent } from './room-reservation/new-reservation-page/new-reservation-page.component'; +import { ConfirmReservationComponent } from './room-reservation/confirm-reservation/confirm-reservation.component'; const routes: Routes = [ CoworkingPageComponent.Route, ReservationComponent.Route, - AmbassadorPageComponent.Route + NewReservationPageComponent.Route, + ConfirmReservationComponent.Route, + { + path: 'ambassador', + title: 'Ambassador', + loadChildren: () => + import('./ambassador-home/ambassador-home.module').then( + (m) => m.AmbassadorHomeModule + ) + } ]; @NgModule({ diff --git a/frontend/src/app/coworking/coworking.models.ts b/frontend/src/app/coworking/coworking.models.ts index 1fa403d4c..4f1c984d0 100644 --- a/frontend/src/app/coworking/coworking.models.ts +++ b/frontend/src/app/coworking/coworking.models.ts @@ -33,6 +33,11 @@ export interface Seat { y: number; } +export interface Room { + id: string | null; + nickname: string; +} + export interface ReservationJSON extends TimeRangeJSON { id: number; users: Profile[]; @@ -40,6 +45,7 @@ export interface ReservationJSON extends TimeRangeJSON { walkin: boolean; created_at: string; updated_at: string; + room: Room | null; state: string; } @@ -50,6 +56,7 @@ export interface Reservation extends TimeRange { walkin: boolean; created_at: Date; updated_at: Date; + room: Room | null; state: string; } @@ -99,6 +106,69 @@ export const parseCoworkingStatusJSON = ( }; export interface ReservationRequest extends TimeRange { - users: Profile[]; - seats: Seat[]; + users: Profile[] | null; + seats: Seat[] | null; + room: { id: string }; +} +/* Interface for Room Reservation Type */ +export interface RoomReservation { + reservation_id: number | null; + user_id: number; + room_name: string; + start: Date; + end: Date; +} + +/** Interface for the RoomReservation JSON Response model + * Note: The API returns object data, such as `Date`s, as strings. So, + * this interface models the data directly received from the API. It is + * the job of the `parseRoomReservationJson` function to convert it to the + * `RoomReservation` type + */ +export interface RoomReservationJson { + reservation_id: number | null; + user_id: number; + room_name: string; + start: string; + end: string; +} + +/** Function that converts a RoomReservationJSON response model to a + * Room Reservation model. This function is needed because the API response + * will return certain objects (such as `Date`s) as strings. We need to + * convert this to TypeScript objects ourselves. + */ +export const parseEventJson = ( + roomReservationJson: RoomReservationJson +): RoomReservation => { + return Object.assign({}, roomReservationJson, { + start: new Date(roomReservationJson.start), + end: new Date(roomReservationJson.end) + }); +}; + +/** + * Represents a cell in a Table Widget + * @property key - The room of the cell acting as key + * @property index - The index of the cell in the reservationMap that represents the timeslot's state + */ +export interface TableCell { + key: string; + index: number; +} + +export interface TableCellProperty { + backgroundColor: string; + isDisabled: boolean; +} + +export interface TablePropertyMap { + [key: number]: TableCellProperty; +} + +export interface ReservationMapDetails { + reserved_date_map: Record; + operating_hours_start: string; + operating_hours_end: string; + number_of_time_slots: number; } diff --git a/frontend/src/app/coworking/coworking.module.ts b/frontend/src/app/coworking/coworking.module.ts index 00bc74019..fd3b5bfb8 100644 --- a/frontend/src/app/coworking/coworking.module.ts +++ b/frontend/src/app/coworking/coworking.module.ts @@ -6,33 +6,55 @@ import { CoworkingPageComponent } from './coworking-home/coworking-home.componen import { AmbassadorPageComponent } from './ambassador-home/ambassador-home.component'; import { MatCardModule } from '@angular/material/card'; import { CoworkingReservationCard } from './widgets/coworking-reservation-card/coworking-reservation-card'; -import { MatDividerModule } from '@angular/material/divider'; import { CoworkingDropInCard } from './widgets/dropin-availability-card/dropin-availability-card.widget'; import { MatListModule } from '@angular/material/list'; import { CoworkingHoursCard } from './widgets/operating-hours-panel/operating-hours-panel.widget'; import { MatExpansionModule } from '@angular/material/expansion'; -import { MatButtonModule } from '@angular/material/button'; import { MatTableModule } from '@angular/material/table'; import { ReservationComponent } from './reservation/reservation.component'; +import { MatIconModule } from '@angular/material/icon'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatButtonModule } from '@angular/material/button'; +import { NewReservationPageComponent } from './room-reservation/new-reservation-page/new-reservation-page.component'; +import { RoomReservationWidgetComponent } from './widgets/room-reservation-table/room-reservation-table.widget'; +import { ConfirmReservationComponent } from './room-reservation/confirm-reservation/confirm-reservation.component'; +import { DateSelector } from './widgets/date-selector/date-selector.widget'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatNativeDateModule } from '@angular/material/core'; import { OperatingHoursDialog } from './widgets/operating-hours-dialog/operating-hours-dialog.widget'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { ReactiveFormsModule } from '@angular/forms'; import { MatInputModule } from '@angular/material/input'; import { SharedModule } from '../shared/shared.module'; +import { MatTabsModule } from '@angular/material/tabs'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { AmbassadorXlListComponent } from './ambassador-home/ambassador-xl/list/ambassador-xl-list.component'; +import { AmbassadorRoomListComponent } from './ambassador-home/ambassador-room/list/ambassador-room-list.component'; @NgModule({ declarations: [ + NewReservationPageComponent, + RoomReservationWidgetComponent, CoworkingPageComponent, ReservationComponent, AmbassadorPageComponent, + AmbassadorXlListComponent, + AmbassadorRoomListComponent, CoworkingDropInCard, CoworkingReservationCard, CoworkingHoursCard, + ConfirmReservationComponent, + NewReservationPageComponent, + DateSelector, OperatingHoursDialog ], imports: [ CommonModule, + MatCardModule, + MatButtonModule, + MatDividerModule, + MatIconModule, CoworkingRoutingModule, MatCardModule, MatDividerModule, @@ -46,7 +68,13 @@ import { SharedModule } from '../shared/shared.module'; MatCardModule, AsyncPipe, AsyncPipe, - SharedModule + SharedModule, + MatDatepickerModule, + MatInputModule, + MatNativeDateModule, + MatFormFieldModule, + MatTooltipModule, + MatTabsModule ] }) export class CoworkingModule {} diff --git a/frontend/src/app/coworking/coworking.service.ts b/frontend/src/app/coworking/coworking.service.ts index efeace6e8..cf8f07f46 100644 --- a/frontend/src/app/coworking/coworking.service.ts +++ b/frontend/src/app/coworking/coworking.service.ts @@ -1,10 +1,15 @@ +/** + * @author Kris Jordan, John Schachte + * @copyright 2023 + * @license MIT + */ + import { HttpClient } from '@angular/common/http'; import { Injectable, OnDestroy } from '@angular/core'; -import { Observable, Subscription, map, tap } from 'rxjs'; +import { Observable, Subscription, map, BehaviorSubject } from 'rxjs'; import { CoworkingStatus, CoworkingStatusJSON, - Reservation, ReservationJSON, SeatAvailability, parseCoworkingStatusJSON, @@ -26,6 +31,8 @@ export class CoworkingService implements OnDestroy { private profile: Profile | undefined; private profileSubscription!: Subscription; + isCancelExpanded = new BehaviorSubject(false); + public constructor( protected http: HttpClient, protected profileSvc: ProfileService @@ -66,4 +73,22 @@ export class CoworkingService implements OnDestroy { .post('/api/coworking/reservation', reservation) .pipe(map(parseReservationJSON)); } + + /** + * Toggles the expansion state of the cancellation UI. + * + * This method inverts the current boolean state of `isCancelExpanded`. + * If `isCancelExpanded` is currently true, calling this method will set it to false, and vice versa. + * This is typically used to control the visibility of a UI element that allows the user to cancel an action. + * + * @example + * // Assuming `isCancelExpanded` is initially false + * toggleCancelExpansion(); + * // Now `isCancelExpanded` is true + * + * @returns {void} + */ + toggleCancelExpansion(): void { + this.isCancelExpanded.next(!this.isCancelExpanded.value); + } } diff --git a/frontend/src/app/coworking/reservation/reservation.component.css b/frontend/src/app/coworking/reservation/reservation.component.css index 2fbf68f2d..4c3fd726f 100644 --- a/frontend/src/app/coworking/reservation/reservation.component.css +++ b/frontend/src/app/coworking/reservation/reservation.component.css @@ -1,34 +1,34 @@ .card-container { - margin: 16px; + margin: 16px; } .mat-mdc-card { - max-width: 640px; - margin: 0px; + max-width: 640px; + margin: 0px; } .mat-mdc-card-header { - margin-bottom: 16px; + margin-bottom: 16px; } .mat-mdc-card-actions { - margin-top: 16px; + margin-top: 16px; } .mat-divider { - margin: 1em 0; + margin: 1em 0; } h3 { - font-size: 18px; - margin-bottom: 0px; + font-size: 18px; + margin-bottom: 0px; } -h3>label { - width: 64px; - display: inline-block; +h3 > label { + width: 64px; + display: inline-block; } p { - margin-left: 64px; -} \ No newline at end of file + margin-left: 64px; +} diff --git a/frontend/src/app/coworking/reservation/reservation.service.ts b/frontend/src/app/coworking/reservation/reservation.service.ts index e3915be50..6ebf23e48 100644 --- a/frontend/src/app/coworking/reservation/reservation.service.ts +++ b/frontend/src/app/coworking/reservation/reservation.service.ts @@ -14,7 +14,7 @@ import { RxReservation } from './rx-reservation'; export class ReservationService { private reservations: Map = new Map(); - constructor(private http: HttpClient) {} + constructor(protected http: HttpClient) {} get(id: number): Observable { let reservation = this.getRxReservation(id); diff --git a/frontend/src/app/coworking/room-reservation/confirm-reservation/confirm-reservation.component.css b/frontend/src/app/coworking/room-reservation/confirm-reservation/confirm-reservation.component.css new file mode 100644 index 000000000..4c3fd726f --- /dev/null +++ b/frontend/src/app/coworking/room-reservation/confirm-reservation/confirm-reservation.component.css @@ -0,0 +1,34 @@ +.card-container { + margin: 16px; +} + +.mat-mdc-card { + max-width: 640px; + margin: 0px; +} + +.mat-mdc-card-header { + margin-bottom: 16px; +} + +.mat-mdc-card-actions { + margin-top: 16px; +} + +.mat-divider { + margin: 1em 0; +} + +h3 { + font-size: 18px; + margin-bottom: 0px; +} + +h3 > label { + width: 64px; + display: inline-block; +} + +p { + margin-left: 64px; +} diff --git a/frontend/src/app/coworking/room-reservation/confirm-reservation/confirm-reservation.component.html b/frontend/src/app/coworking/room-reservation/confirm-reservation/confirm-reservation.component.html new file mode 100644 index 000000000..b932a7b51 --- /dev/null +++ b/frontend/src/app/coworking/room-reservation/confirm-reservation/confirm-reservation.component.html @@ -0,0 +1,7 @@ +
+ + +
diff --git a/frontend/src/app/coworking/room-reservation/confirm-reservation/confirm-reservation.component.spec.ts b/frontend/src/app/coworking/room-reservation/confirm-reservation/confirm-reservation.component.spec.ts new file mode 100644 index 000000000..fe3f7515d --- /dev/null +++ b/frontend/src/app/coworking/room-reservation/confirm-reservation/confirm-reservation.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ConfirmReservationComponent } from './confirm-reservation.component'; + +describe('ConfirmReservationComponent', () => { + let component: ConfirmReservationComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ConfirmReservationComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(ConfirmReservationComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/coworking/room-reservation/confirm-reservation/confirm-reservation.component.ts b/frontend/src/app/coworking/room-reservation/confirm-reservation/confirm-reservation.component.ts new file mode 100644 index 000000000..7d9cc5c33 --- /dev/null +++ b/frontend/src/app/coworking/room-reservation/confirm-reservation/confirm-reservation.component.ts @@ -0,0 +1,77 @@ +/** + * @author John Schachte, Aarjav Jain, Nick Wherthey + * @copyright 2023 + * @license MIT + */ + +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { ActivatedRoute, Router } from '@angular/router'; +import { timer } from 'rxjs'; +import { isAuthenticated } from 'src/app/gate/gate.guard'; +import { profileResolver } from 'src/app/profile/profile.resolver'; +import { Reservation } from '../../coworking.models'; +import { RoomReservationService } from '../room-reservation.service'; + +@Component({ + selector: 'app-confirm-reservation', + templateUrl: './confirm-reservation.component.html', + styleUrls: ['./confirm-reservation.component.css'] +}) +export class ConfirmReservationComponent implements OnInit, OnDestroy { + public static Route = { + path: 'confirm-reservation/:id', + title: 'Confirm Reservation', + component: ConfirmReservationComponent, + canActivate: [isAuthenticated], + resolve: { profile: profileResolver } + }; + + reservation: Reservation | null = null; // Declaration of the reservation property + isConfirmed: boolean = false; // flag to see if reservation was confirmed + + public id: number; + + constructor( + private roomReservationService: RoomReservationService, + protected snackBar: MatSnackBar, + private router: Router, + public route: ActivatedRoute + ) { + this.id = parseInt(this.route.snapshot.params['id']); + } + + ngOnDestroy(): void { + if (this.isConfirmed) return; + this.roomReservationService + .deleteRoomReservation(this.reservation!) + .subscribe(); + } + + /** + * A lifecycle hook that is called after Angular has initialized all data-bound properties of a directive. + * + * Use this hook to initialize the directive or component. This is the right place to fetch data from a server, + * set up any local state, or perform operations that need to be executed only once when the component is instantiated. + * + * @returns {void} - This method does not return a value. + */ + ngOnInit() { + this.roomReservationService.get(this.id).subscribe({ + next: (response) => (this.reservation = response), // Assume only one draft per user + error: (error) => { + this.snackBar.open('Error while fetching draft reservation.', '', { + duration: 8000 + }); + timer(3000).subscribe(() => + this.router.navigateByUrl('/coworking/new-reservation') + ); + console.error(error.message); + } + }); + } + + setConfirmation(isConfirmed: boolean) { + this.isConfirmed = isConfirmed; + } +} diff --git a/frontend/src/app/coworking/room-reservation/new-reservation-page/new-reservation-page.component.css b/frontend/src/app/coworking/room-reservation/new-reservation-page/new-reservation-page.component.css new file mode 100644 index 000000000..baf71848f --- /dev/null +++ b/frontend/src/app/coworking/room-reservation/new-reservation-page/new-reservation-page.component.css @@ -0,0 +1,58 @@ +.table-container { + overflow-x: auto; /* Enable horizontal scrolling for the table container */ + max-width: 100%; /* Ensure it doesn't exceed the viewport width */ +} + +.horizontal-scroll { + white-space: nowrap; /* Prevent line breaks for child elements */ +} + +/* Add any additional styling for the room-reservation-table if needed */ + +.date-selector { + padding: 10px; /* Adjust the value as needed */ +} + +.upcoming-reservations-container { + display: flex; + flex-wrap: wrap; + gap: 20px; /* Adjust the gap as needed */ +} + +.coworking-reservation-card { + width: calc(50% - 10px); /* Adjust the width and margin as needed */ + margin-bottom: 20px; + box-sizing: border-box; /* Include padding and border in the total width */ +} + +.heading { + padding-top: 30px; + padding-left: 10px; +} + +.legend-container { + display: flex; + flex-wrap: wrap; + margin-top: 20px; /* Adjust the margin as needed */ +} + +.legend-item { + display: flex; + align-items: center; + margin-left: 10px; /* Adjust the margin between legend items */ + margin-top: 5px; +} + +.legend-color { + width: 20px; + height: 20px; + margin-right: 5px; +} + +.legend-text { + font-size: 14px; +} + +.reservation-limit { + padding-left: 10px; +} diff --git a/frontend/src/app/coworking/room-reservation/new-reservation-page/new-reservation-page.component.html b/frontend/src/app/coworking/room-reservation/new-reservation-page/new-reservation-page.component.html new file mode 100644 index 000000000..cc0710a13 --- /dev/null +++ b/frontend/src/app/coworking/room-reservation/new-reservation-page/new-reservation-page.component.html @@ -0,0 +1,34 @@ +
+ +
+ +
+ +
+ +
+
+
+ Available +
+
+
+ Reserved +
+
+
+ Your Reservations +
+
+
+ Selected +
+
+
+ Unavailable +
+
+ +
+

Total Hours Remaining: {{ numHoursStudyRoomReservations$ | async }}

+
diff --git a/frontend/src/app/coworking/room-reservation/new-reservation-page/new-reservation-page.component.spec.ts b/frontend/src/app/coworking/room-reservation/new-reservation-page/new-reservation-page.component.spec.ts new file mode 100644 index 000000000..aa23864ec --- /dev/null +++ b/frontend/src/app/coworking/room-reservation/new-reservation-page/new-reservation-page.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NewReservationPageComponent } from './new-reservation-page.component'; + +describe('NewReservationPageComponent', () => { + let component: NewReservationPageComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [NewReservationPageComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(NewReservationPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/coworking/room-reservation/new-reservation-page/new-reservation-page.component.ts b/frontend/src/app/coworking/room-reservation/new-reservation-page/new-reservation-page.component.ts new file mode 100644 index 000000000..738e90c6c --- /dev/null +++ b/frontend/src/app/coworking/room-reservation/new-reservation-page/new-reservation-page.component.ts @@ -0,0 +1,73 @@ +/** + * @author John Schachte, Aarjav Jain, Nick Wherthey + * @copyright 2023 + * @license MIT + */ + +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { Reservation } from 'src/app/coworking/coworking.models'; +import { isAuthenticated } from 'src/app/gate/gate.guard'; +import { profileResolver } from 'src/app/profile/profile.resolver'; +import { catchError, Observable, of } from 'rxjs'; +import { RoomReservationService } from '../room-reservation.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; + +@Component({ + selector: 'app-new-reservation-page', + templateUrl: './new-reservation-page.component.html', + styleUrls: ['./new-reservation-page.component.css'] +}) +export class NewReservationPageComponent implements OnInit { + public static Route = { + path: 'new-reservation', + title: 'New Reservation', + component: NewReservationPageComponent, + canActivate: [isAuthenticated], + resolve: { profile: profileResolver } + }; + + public upcomingRoomReservations$!: Observable; + public numHoursStudyRoomReservations$!: Observable; + + constructor( + private router: Router, + private roomReservationService: RoomReservationService, + protected snackBar: MatSnackBar + ) {} + + /** + * A lifecycle hook that is called after Angular has initialized all data-bound properties of a directive. + * + * Use this hook to initialize the directive or component. This is the right place to fetch data from a server, + * set up any local state, or perform operations that need to be executed only once when the component is instantiated. + * + * @returns {void} - This method does not return a value. + */ + + ngOnInit() { + this.initUpdateReservationsList(); + this.getNumHoursStudyRoomReservations(); + } + + navigateToNewReservation() { + this.router.navigateByUrl('/coworking/new-reservation'); + } + + initUpdateReservationsList() { + this.upcomingRoomReservations$ = this.roomReservationService + .getReservationsByState('CONFIRMED') + .pipe( + catchError((err) => { + const message = 'Error while fetching upcoming reservations.'; + this.snackBar.open(message, '', { duration: 8000 }); + console.error(err); + return of([]); + }) + ); + } + getNumHoursStudyRoomReservations() { + this.numHoursStudyRoomReservations$ = + this.roomReservationService.getNumHoursStudyRoomReservations(); + } +} diff --git a/frontend/src/app/coworking/room-reservation/reservation-table.service.spec.ts b/frontend/src/app/coworking/room-reservation/reservation-table.service.spec.ts new file mode 100644 index 000000000..970637941 --- /dev/null +++ b/frontend/src/app/coworking/room-reservation/reservation-table.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { ReservationTableService } from './reservation-table.service'; + +describe('ReservationTableService', () => { + let service: ReservationTableService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(ReservationTableService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/coworking/room-reservation/reservation-table.service.ts b/frontend/src/app/coworking/room-reservation/reservation-table.service.ts new file mode 100644 index 000000000..7e2afab2b --- /dev/null +++ b/frontend/src/app/coworking/room-reservation/reservation-table.service.ts @@ -0,0 +1,373 @@ +/** + * @author John Schachte, Aarjav Jain, Nick Wherthey + * @copyright 2023 + * @license MIT + */ + +import { HttpClient, HttpParams } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { BehaviorSubject, Observable, Subscription } from 'rxjs'; +import { + Reservation, + ReservationMapDetails, + ReservationRequest, + TableCell, + TablePropertyMap +} from '../coworking.models'; +import { ProfileService } from '../../profile/profile.service'; +import { Profile } from '../../models.module'; +import { RoomReservationWidgetComponent } from '../widgets/room-reservation-table/room-reservation-table.widget'; + +@Injectable({ + providedIn: 'root' +}) +export class ReservationTableService { + private selectedDateSubject = new BehaviorSubject(''); + selectedDate$ = this.selectedDateSubject.asObservable(); + private profile: Profile | undefined; + private profileSubscription!: Subscription; + + private EndingOperationalHour: number = 17; + + static readonly MAX_RESERVATION_CELL_LENGTH: number = 4; // rule for how long a reservation can be consecutively + + static readonly CellEnum = { + AVAILABLE: 0, + BOOKED: 1, + RESERVING: 2, + UNAVAILABLE: 3, + SUBJECT_RESERVATION: 4 + } as const; + + //Add table cell states here + static readonly CellPropertyMap: TablePropertyMap = { + [ReservationTableService.CellEnum.AVAILABLE]: { + backgroundColor: '#03691e', + isDisabled: false + }, + [ReservationTableService.CellEnum.BOOKED]: { + backgroundColor: 'red', + isDisabled: true + }, + [ReservationTableService.CellEnum.RESERVING]: { + backgroundColor: 'orange', + isDisabled: false + }, + [ReservationTableService.CellEnum.UNAVAILABLE]: { + backgroundColor: '#4d4d4d', + isDisabled: true + }, + [ReservationTableService.CellEnum.SUBJECT_RESERVATION]: { + backgroundColor: '#3479be', + isDisabled: true + } + }; + + constructor( + private http: HttpClient, + protected profileSvc: ProfileService + ) { + this.profileSubscription = this.profileSvc.profile$.subscribe( + (profile) => (this.profile = profile) + ); + } + + setSelectedDate(date: string) { + this.selectedDateSubject.next(date); + } + + //TODO Change route from ISO String to date object + getReservationsForRoomsByDate(date: Date): Observable { + let params = new HttpParams().set('date', date.toISOString()); + return this.http.get( + `/api/coworking/room-reservation/`, + { params } + ); + } + + draftReservation( + reservationsMap: Record, + operationStart: Date + ): Observable { + const selectedRoom: { room: string; availability: number[] } | null = + this._findSelectedRoom(reservationsMap); + + if (!selectedRoom) throw new Error('No room selected'); + const reservationRequest: ReservationRequest = this._makeReservationRequest( + selectedRoom!, + operationStart + ); + return this.makeDraftReservation(reservationRequest); + } + + //TODO Draft Reservation method + makeDraftReservation( + reservationRequest: ReservationRequest + ): Observable { + return this.http.post( + `/api/coworking/reservation`, + reservationRequest + ); + } + + /** + * Deselects a cell in the reservations map and updates selected cells. + * + * @param {string} key - The key representing the room in the reservations map. + * @param {number} index - The index representing the time slot in the reservations map. + * @returns {void} The method does not return a value. + * @public This method is intended for internal use. + */ + public deselectCell( + key: string, + index: number, + tableWidget: RoomReservationWidgetComponent + ): void { + tableWidget.setSlotAvailable(key, index); + + tableWidget.selectedCells = tableWidget.selectedCells.filter( + (cell) => !(cell.key === key && cell.index === index) + ); + + const isAllAdjacent = this._areAllAdjacent(tableWidget.selectedCells); + if (!isAllAdjacent) { + tableWidget.selectedCells = this._updateAdjacentCells(index, tableWidget); + } + } + + /** + * Selects a cell in the reservations map and updates selected cells. + * + * @param {string} key - The key representing the room in the reservations map. + * @param {number} index - The index representing the time slot in the reservations map. + * @returns {void} The method does not return a value. + * @public This method is intended for internal use. + */ + + public selectCell( + key: string, + index: number, + tableWidget: RoomReservationWidgetComponent + ): void { + const isAdjacentToAny = tableWidget.selectedCells.some( + (cell: TableCell) => { + return Math.abs(index - cell.index) <= 1 && key === cell.key; + } + ); + + if ( + isAdjacentToAny && + tableWidget.selectedCells.length < + ReservationTableService.MAX_RESERVATION_CELL_LENGTH + ) { + // If adjacent and within the maximum reservation length, select the cell + tableWidget.setSlotReserving(key, index); + + tableWidget.selectedCells.push({ key, index }); + } else if ( + tableWidget.selectedCells.length >= + ReservationTableService.MAX_RESERVATION_CELL_LENGTH + ) { + // If the maximum reservation length is exceeded, deselect all cells + this._setAllAvailable(tableWidget); + tableWidget.selectedCells = [{ key, index }]; // resetting selected cells to lone cell + tableWidget.setSlotReserving(key, index); + } else { + // If not adjacent to any selected cells, deselect all and select the new cell + this._setAllAvailable(tableWidget); + tableWidget.selectedCells = [{ key, index }]; // resetting selected cells to lone cell + tableWidget.setSlotReserving(key, index); + } + } + + _findSelectedRoom( + reservationsMap: Record + ): { room: string; availability: number[] } | null { + //- Finding the room with the selected cells (assuming only 1 row) + const result = Object.entries(reservationsMap).find( + ([id, availability]) => { + return availability.includes( + ReservationTableService.CellEnum.RESERVING + ); + } + ); + return result ? { room: result[0], availability: result[1] } : null; + } + + _makeReservationRequest( + selectedRoom: { room: string; availability: number[] }, + operationStart: Date + ): ReservationRequest { + const minIndex = selectedRoom?.availability.indexOf( + ReservationTableService.CellEnum.RESERVING + ); + const maxIndex = selectedRoom?.availability.lastIndexOf( + ReservationTableService.CellEnum.RESERVING + ); + const thirtyMinutes = 30 * 60 * 1000; + const startDateTime = new Date( + operationStart.getTime() + thirtyMinutes * minIndex + ); + + const endDateTime = new Date( + operationStart.getTime() + thirtyMinutes * (maxIndex + 1) + ); + + return { + users: [this.profile!], + seats: [], + room: { id: selectedRoom!.room }, + start: startDateTime, + end: endDateTime + }; + } + + /** + * Makes all selected cells Available. + * @param tableWidget RoomReservationWidgetComponent + * @returns void + * @private This method is intended for internal use. + * + */ + private _setAllAvailable(tableWidget: RoomReservationWidgetComponent): void { + tableWidget.selectedCells.forEach((cell: TableCell) => { + tableWidget.setSlotAvailable(cell.key, cell.index); + }); + } + + /** + * Checks if all currently selected cells are adjacent to each other. + * + * @returns {boolean} True if all selected cells are adjacent, false otherwise. + * @private This method is intended for internal use. + */ + + private _areAllAdjacent(selectedCells: TableCell[]): boolean { + return selectedCells.every((cell: TableCell, i) => { + if (i < selectedCells.length - 1) { + const nextCell = selectedCells[i + 1]; + return Math.abs(cell.index - nextCell.index) <= 1; // Check if the next cell is adjacent + } + return true; // Always return true for the last element + }); + } + + /** + * Updates adjacent cells based on the index of the selected cell. + * + * @param {number} index - The index representing the time slot in the reservations map. + * @returns {void} The method does not return a value. + * @private This method is intended for internal use. + */ + + private _updateAdjacentCells( + index: number, + tableWidget: RoomReservationWidgetComponent + ): TableCell[] { + // count if there are more cells on the left or on the right + const leftFrom = this._countIfOnLeft(index, tableWidget.selectedCells); + const rightFrom = tableWidget.selectedCells.length - leftFrom; // right and left counts are disjoint + return this._filterCellsBasedOnIndex( + tableWidget, + index, + leftFrom < rightFrom + ); + } + + /** + * Filters selected cells based on their index relative to a given index. + * + * @param tableWidget The RoomReservationWidgetComponent instance. + * @param index The index to compare against. + * @param filterBefore If true, filters out cells before the index; otherwise, filters out cells after the index. + */ + private _filterCellsBasedOnIndex( + tableWidget: RoomReservationWidgetComponent, + index: number, + filterBefore: boolean + ): TableCell[] { + return ( + tableWidget.selectedCells.filter((cell) => { + if (filterBefore && cell.index < index) { + tableWidget.setSlotAvailable(cell.key, cell.index); + return false; + } else if (!filterBefore && cell.index > index) { + tableWidget.reservationsMap[cell.key][cell.index] = + ReservationTableService.CellEnum.AVAILABLE; + return false; + } + return true; + }) ?? [] + ); + } + + /** + * Counts the number of cells on the left of the selected cell. + * @param index number + * @param selectedCells TableCell[] + * @returns number + * @private This method is intended for internal use. + */ + + private _countIfOnLeft(index: number, selectedCells: TableCell[]): number { + return selectedCells.reduce( + (count, cell) => (cell.index < index ? (count += 1) : count), + 0 + ); + } + + setMaxDate(): Date { + let result = new Date(); + result.setDate(result.getDate() + 7); + return result; + } + + setMinDate(): Date { + let result = new Date(); + if (result.getHours() >= this.EndingOperationalHour) { + result.setDate(result.getDate() + 1); + } + return result; + } + + /** + * Formats a date object into a string of the format 'HH:MMAM/PM'. + * + * @private + * @param {Date} date - The date object to be formatted. + * @returns {string} The formatted time string in 'HH:MMAM/PM' format. + */ + private formatAMPM(date: Date): string { + let hours = date.getHours(); + let minutes = date.getMinutes(); + const ampm = hours >= 12 ? 'PM' : 'AM'; + hours = hours % 12; + hours = hours ? hours : 12; // the hour '0' should be '12' + const minutesStr = minutes < 10 ? '0' + minutes : minutes.toString(); + return `${hours}:${minutesStr}${ampm}`; + } + + /** + * Generates time slots between two dates in increments of thirty minutes, formatted as 'HH:MMA/PM
to
HH:MMPM'. + * + * @private + * @param {Date} start - The start date and time for generating time slots. + * @param {Date} end - The end date and time for the time slots. + * @param {number} slots - The number of slots to generate. + * @returns {string[]} An array of strings representing the time slots in 'HH:MMA/PM
to
HH:MMPM' format. + */ + generateTimeSlots(start: Date, end: Date, slots: number): string[] { + const timeSlots = []; + const ThirtyMinutes = 30 * 60000; // Thirty minutes in milliseconds + while (start < end) { + let thirtyMinutesLater = new Date(start.getTime() + ThirtyMinutes); + timeSlots.push( + `${this.formatAMPM(start)}
to
${this.formatAMPM( + thirtyMinutesLater + )}` + ); + start = thirtyMinutesLater; + } + return timeSlots; + } +} diff --git a/frontend/src/app/coworking/room-reservation/room-reservation.service.spec.ts b/frontend/src/app/coworking/room-reservation/room-reservation.service.spec.ts new file mode 100644 index 000000000..085000adb --- /dev/null +++ b/frontend/src/app/coworking/room-reservation/room-reservation.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { RoomReservationService } from './room-reservation.service'; + +describe('RoomReservationService', () => { + let service: RoomReservationService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(RoomReservationService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/coworking/room-reservation/room-reservation.service.ts b/frontend/src/app/coworking/room-reservation/room-reservation.service.ts new file mode 100644 index 000000000..db9378d57 --- /dev/null +++ b/frontend/src/app/coworking/room-reservation/room-reservation.service.ts @@ -0,0 +1,114 @@ +/** + * The Room Reservation Service abstracts HTTP requests to the backend + * from the components. + * + * @author Aarjav Jain, John Schachte, Nick Wherthey, Yuvraj Jain + * @copyright 2023 + * @license MIT + */ + +import { Injectable } from '@angular/core'; +import { HttpClient, HttpParams } from '@angular/common/http'; +import { catchError, map, Observable, of } from 'rxjs'; +import { + parseReservationJSON, + Reservation, + ReservationJSON +} from '../coworking.models'; +import { ReservationService } from '../reservation/reservation.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { RxUpcomingReservation } from '../rx-coworking-status'; + +@Injectable({ + providedIn: 'root' +}) +export class RoomReservationService extends ReservationService { + private upcomingReservations: RxUpcomingReservation = + new RxUpcomingReservation(); + public upcomingReservations$: Observable = + this.upcomingReservations.value$; + public findActiveReservationPredicate: (r: Reservation) => boolean = ( + r: Reservation + ) => { + let now = new Date(); + const activeStates = ['CONFIRMED', 'CHECKED_IN']; + return r.start <= now && r.end > now && activeStates.includes(r.state); + }; + + constructor(http: HttpClient) { + super(http); + } + + /** Returns all room reservations from the backend database table using the backend HTTP get request. + * @returns {Observable} + */ + + getReservationsByState(state: string): Observable { + // Create HttpParams with the state + let params = new HttpParams().set('state', state); + return this.http + .get('/api/coworking/room-reservations/', { + params + }) + .pipe(map((reservations) => reservations.map(parseReservationJSON))); + } + + checkin(reservation: Reservation): Observable { + let endpoint = `/api/coworking/reservation/${reservation.id}`; + let payload = { id: reservation.id, state: 'CHECKED_IN' }; + return this.http + .put(endpoint, payload) + .pipe(map(parseReservationJSON)); + } + + deleteRoomReservation(reservation: Reservation): Observable { + return this.http.delete( + `/api/coworking/reservation/${reservation.id}` + ); + } + + getNumHoursStudyRoomReservations(): Observable { + return this.http.get('/api/coworking/user-reservations/'); + } + + /** + * Polls for upcoming room reservations with a 'CONFIRMED' state that are not currently active. + * + * This method fetches reservations and filters them to find upcoming reservations based on a specific predicate. + * The predicate checks that the reservation is not active and that it has a defined room. + * In case of an error while fetching reservations, it displays an error message using `MatSnackBar`. + * + * @param {MatSnackBar} snackBar - The MatSnackBar service used to display notifications or error messages. + * + * @example + * pollUpcomingRoomReservation(this.snackBar); + * + * @remarks + * This method utilizes RxJS operators to process the stream of reservations. The `map` operator is used to filter + * reservations based on the provided predicate. The `catchError` operator handles any errors during the fetching process, + * displaying an error message and logging the error to the console. + * + * @returns {void} - This method does not return a value; it sets the upcoming reservations in a state management variable. + */ + pollUpcomingRoomReservation(snackBar: MatSnackBar) { + // predicate to determine if this is a non active upcoming room reservation + const isUpcomingRoomReservation = (r: Reservation) => + !this.findActiveReservationPredicate(r) && !!r && !!r.room; + + this.getReservationsByState('CONFIRMED') + .pipe( + map((reservations) => + reservations.filter((r) => isUpcomingRoomReservation(r)) + ), + catchError((err: Error) => { + const message = 'Error while fetching upcoming reservations.'; + snackBar.open(message, '', { duration: 8000 }); + console.error(err); + return of([]); + }) + ) + .subscribe((upcomingRoomReservations) => + this.upcomingReservations.set(upcomingRoomReservations) + ); + } +} diff --git a/frontend/src/app/coworking/rx-coworking-status.ts b/frontend/src/app/coworking/rx-coworking-status.ts index f4299e643..3952ef1e5 100644 --- a/frontend/src/app/coworking/rx-coworking-status.ts +++ b/frontend/src/app/coworking/rx-coworking-status.ts @@ -1,4 +1,12 @@ +/** + * @author Kris Jordan, John Schachte + * @copyright 2023 + * @license MIT + */ + import { RxObject } from '../rx-object'; import { CoworkingStatus, Reservation } from './coworking.models'; export class RxCoworkingStatus extends RxObject {} + +export class RxUpcomingReservation extends RxObject {} diff --git a/frontend/src/app/coworking/widgets/coworking-reservation-card/coworking-reservation-card.css b/frontend/src/app/coworking/widgets/coworking-reservation-card/coworking-reservation-card.css index 189d2420c..747f37d5d 100644 --- a/frontend/src/app/coworking/widgets/coworking-reservation-card/coworking-reservation-card.css +++ b/frontend/src/app/coworking/widgets/coworking-reservation-card/coworking-reservation-card.css @@ -1,30 +1,53 @@ .mat-mdc-card { - max-width: 640px; - margin: 0; + max-width: 640px; + margin: 0; } .mat-mdc-card-header { - margin-bottom: 16px; + margin-bottom: 0px; + padding: 0px; } .mat-mdc-card-actions { - margin-top: 16px; + margin-top: 0px; + padding: 0px; } .mat-divider { - margin: 1em 0; + margin: 0.7em 0; + padding: 0px; } h3 { - font-size: 18px; - margin-bottom: 0px; + font-size: 18px; + margin-bottom: 0px; + padding: 0px; + margin-top: 0px; } -h3>label { - width: 64px; - display: inline-block; +h3 > label { + width: 64px; + display: inline-block; + padding: 0px; } p { - margin-left: 64px; -} \ No newline at end of file + margin-left: 64px; + padding: 0px; +} + +.divider { + margin: 0.5em; +} + +@media only screen and (max-device-width: 730px) { + h3 > * { + font-size: 0.8em; + } +} + +.header-container { + display: flex; + justify-content: space-between; + align-items: center; /* This ensures vertical alignment if needed */ +} diff --git a/frontend/src/app/coworking/widgets/coworking-reservation-card/coworking-reservation-card.html b/frontend/src/app/coworking/widgets/coworking-reservation-card/coworking-reservation-card.html index 6d0d1bfd4..8037c40c2 100644 --- a/frontend/src/app/coworking/widgets/coworking-reservation-card/coworking-reservation-card.html +++ b/frontend/src/app/coworking/widgets/coworking-reservation-card/coworking-reservation-card.html @@ -1,112 +1,155 @@ - - - Confirm Reservation Details - + + + + Confirm Reservation Details + + + + See the XL Ambassador staffing the front desk to check-in. + + - - Reservation #{{ reservation.id }} Confirmed - See the XL Ambassador staffing the front desk to - check-in. - + + You're Checked In! + + See the XL Ambassador if you need anything. When you're done, just + press the Check Out button or check out with the XL Ambassador. +
+ Changing seats? Please check out and check back in. +
+
+
- - You're Checked In! - See the XL Ambassador if you need anything. When you're done, just - press the Check Out button or check out with the XL Ambassador. -

- Changing seats? Please check out and check back in.
-
+ + Thanks for visiting! + You're all checked out. + - - Thanks for visiting! - You're all checked out. - + + Reservation Cancelled + + +
+
- - Reservation Cancelled - - -
+
- -

- - {{ reservation.users[0].first_name }} - {{ reservation.users[0].last_name }} -

- +
+

+ + {{ reservation.start | date: 'shortTime' }} to + {{ reservation.end | date: 'shortTime' }} + {{ ', ' }} + {{ reservation.start | date: 'dd MMM yyyy' }} +

-

- - {{ reservation.start | date: 'shortTime' }} until - {{ reservation.end | date: 'shortTime' }} -

+ + + +

+ {{ reservation.seats[0].title }} +

+ +
-

- Check-in between {{ reservation.start | date: 'shortTime' }} and - {{ checkinDeadline(reservation.start) | date: 'shortTime' }} to avoid - cancellation. -

- +
+ +

+ + {{ reservation.room ? reservation.room.id : 'The XL Colab in Sitterson 156' }} +

-

- {{ reservation.seats[0].title }} -

- + + + + +
+
-

The XL Colab in Sitterson 156

+ - - - -   - - +
+ + + +   + + - - - + + + + +   + + + - - - + + + - - - + + + - - - - + + + + +
diff --git a/frontend/src/app/coworking/widgets/coworking-reservation-card/coworking-reservation-card.ts b/frontend/src/app/coworking/widgets/coworking-reservation-card/coworking-reservation-card.ts index 0c66a9a9d..c27b00f16 100644 --- a/frontend/src/app/coworking/widgets/coworking-reservation-card/coworking-reservation-card.ts +++ b/frontend/src/app/coworking/widgets/coworking-reservation-card/coworking-reservation-card.ts @@ -1,8 +1,16 @@ +/** + * @author John Schachte + * @copyright 2023 + * @license MIT + */ + import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { Reservation } from '../../coworking.models'; -import { Observable, map, mergeMap, timer } from 'rxjs'; +import { Reservation } from 'src/app/coworking/coworking.models'; +import { Observable, map, timer } from 'rxjs'; import { Router } from '@angular/router'; -import { ReservationService } from '../../reservation/reservation.service'; +import { RoomReservationService } from '../../room-reservation/room-reservation.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { CoworkingService } from '../../coworking.service'; @Component({ selector: 'coworking-reservation-card', @@ -11,14 +19,32 @@ import { ReservationService } from '../../reservation/reservation.service'; }) export class CoworkingReservationCard implements OnInit { @Input() reservation!: Reservation; + @Output() updateReservationsList = new EventEmitter(); + @Output() isConfirmed = new EventEmitter(); + @Output() updateActiveReservation = new EventEmitter(); + @Output() reloadCoworkingHome = new EventEmitter(); public draftConfirmationDeadline$!: Observable; + isCancelExpanded$: Observable; constructor( public router: Router, - public reservationService: ReservationService - ) {} + public reservationService: RoomReservationService, + protected snackBar: MatSnackBar, + public coworkingService: CoworkingService + ) { + this.isCancelExpanded$ = + this.coworkingService.isCancelExpanded.asObservable(); + } + /** + * A lifecycle hook that is called after Angular has initialized all data-bound properties of a directive. + * + * Use this hook to initialize the directive or component. This is the right place to fetch data from a server, + * set up any local state, or perform operations that need to be executed only once when the component is instantiated. + * + * @returns {void} - This method does not return a value. + */ ngOnInit(): void { this.draftConfirmationDeadline$ = this.initDraftConfirmationDeadline(); } @@ -28,23 +54,75 @@ export class CoworkingReservationCard implements OnInit { } cancel() { - this.reservationService.cancel(this.reservation).subscribe(); + this.reservationService.deleteRoomReservation(this.reservation).subscribe({ + next: () => { + this.refreshCoworkingHome(); + }, + error: (error: Error) => { + this.snackBar.open( + 'Error: Issue cancelling reservation. Please see CSXL Ambassador for assistance.', + '', + { duration: 8000 } + ); + console.error(error.message); + } + }); } confirm() { - this.reservationService.confirm(this.reservation).subscribe(); + this.isConfirmed.emit(true); + this.reservationService.confirm(this.reservation).subscribe({ + next: () => { + this.refreshCoworkingHome(); + // this.router.navigateByUrl('/coworking'); + }, + error: (error: Error) => { + this.snackBar.open( + 'Error: Issue confirming reservation. Please see CSXL Ambassador for assistance.', + '', + { duration: 8000 } + ); + console.error(error.message); + } + }); } checkout() { - this.reservationService.checkout(this.reservation).subscribe(); + this.reservationService.checkout(this.reservation).subscribe({ + next: () => this.refreshCoworkingHome(), + error: (error: Error) => { + this.snackBar.open( + 'Error: Issue checking out reservation. Please see CSXL Ambassador for assistance.', + '', + { duration: 8000 } + ); + console.error(error.message); + } + }); + } + + checkin(): void { + this.reservationService.checkin(this.reservation).subscribe({ + next: () => { + this.refreshCoworkingHome(); + }, + error: (error: Error) => { + this.snackBar.open( + 'Error: Issue cancelling reservation. Please see CSXL Ambassador for assistance.', + '', + { duration: 8000 } + ); + } + }); } private initDraftConfirmationDeadline(): Observable { const fiveMinutes = 5 /* minutes */ * 60 /* seconds */ * 1000; /* milliseconds */ - const reservationDraftDeadline = (reservation: Reservation) => - reservation.created_at.getTime() + fiveMinutes; + const reservationDraftDeadline = (reservation: Reservation) => { + return new Date(reservation.created_at).getTime() + fiveMinutes; + }; const deadlineString = (deadline: number): string => { const now = new Date().getTime(); @@ -65,4 +143,42 @@ export class CoworkingReservationCard implements OnInit { map(deadlineString) ); } + + refreshCoworkingHome(): void { + this.reloadCoworkingHome.emit(); + this.router.navigateByUrl('/coworking'); + } + + checkCheckinAllowed(): boolean { + let now = new Date(); + return ( + new Date(this.reservation!.start) <= now && + now <= new Date(this.reservation!.end) + ); + } + + toggleCancelExpansion(): void { + this.coworkingService.toggleCancelExpansion(); + } + + /** + * Evaluates if the cancel operation is expanded or if check-in is allowed. + * + * Combines the observable `isCancelExpanded$` with the result of `checkCheckinAllowed()` to + * determine the UI state. It uses RxJS's `map` to emit true if either condition is met: the + * cancel operation is expanded (`isCancelExpanded$` is true) or check-in is allowed (`checkCheckinAllowed()` + * returns true). + * + * @returns {Observable} Observable that emits true if either condition is true, otherwise false. + * + * Usage: + * Can be used in Angular templates with async pipe for conditional UI rendering: + * `...` + */ + isExpandedOrAllowCheckin(): Observable { + return this.isCancelExpanded$.pipe( + map(isCancelExpanded => isCancelExpanded || this.checkCheckinAllowed()) + ); + } + } diff --git a/frontend/src/app/coworking/widgets/date-selector/date-selector.widget.css b/frontend/src/app/coworking/widgets/date-selector/date-selector.widget.css new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/src/app/coworking/widgets/date-selector/date-selector.widget.html b/frontend/src/app/coworking/widgets/date-selector/date-selector.widget.html new file mode 100644 index 000000000..e3a11a851 --- /dev/null +++ b/frontend/src/app/coworking/widgets/date-selector/date-selector.widget.html @@ -0,0 +1,11 @@ + + + + + diff --git a/frontend/src/app/coworking/widgets/date-selector/date-selector.widget.ts b/frontend/src/app/coworking/widgets/date-selector/date-selector.widget.ts new file mode 100644 index 000000000..ee2ab6347 --- /dev/null +++ b/frontend/src/app/coworking/widgets/date-selector/date-selector.widget.ts @@ -0,0 +1,41 @@ +/** + * The date selector widget that abstracts date selection. + * + * @author Aarjav Jain, John Schachte + * @copyright 2023 + * @license MIT + */ + +import { Component, EventEmitter, Output } from '@angular/core'; +import { MatDatepickerInputEvent } from '@angular/material/datepicker'; +import { ReservationTableService } from '../../room-reservation/reservation-table.service'; + +/** + * @title Date Selector + */ +@Component({ + selector: 'date-selector', + templateUrl: './date-selector.widget.html', + styleUrls: ['./date-selector.widget.css'] +}) +export class DateSelector { + @Output() dateSelected = new EventEmitter(); + minDate: Date; + maxDate: Date; + + constructor(private reservationTableService: ReservationTableService) { + this.minDate = this.reservationTableService.setMinDate(); + this.maxDate = this.reservationTableService.setMaxDate(); + } + + onDateChange(event: MatDatepickerInputEvent) { + const selectedDate: string = this.formatDate(event.value!); + this.reservationTableService.setSelectedDate(selectedDate); + } + + private formatDate(date: Date): string { + // Format the date as needed, you might want to use a library like 'date-fns' or 'moment' + // For simplicity, this example uses the default 'toLocaleDateString' method + return date.toLocaleDateString(); // Adjust this based on your actual formatting requirements + } +} diff --git a/frontend/src/app/coworking/widgets/dropin-availability-card/dropin-availability-card.widget.css b/frontend/src/app/coworking/widgets/dropin-availability-card/dropin-availability-card.widget.css index c4b58c9fb..276b425cc 100644 --- a/frontend/src/app/coworking/widgets/dropin-availability-card/dropin-availability-card.widget.css +++ b/frontend/src/app/coworking/widgets/dropin-availability-card/dropin-availability-card.widget.css @@ -1,94 +1,95 @@ /* Begin Action List Styling */ .mdc-list-item.mdc-list-item--with-trailing-meta .mdc-list-item__end { - height: 100%; - vertical-align: middle; - font-size: 32px; + height: 100%; + vertical-align: middle; + font-size: 32px; } -.mdc-list-item--with-trailing-meta.mdc-list-item--with-two-lines .mdc-list-item__end::before { - height: 40px; +.mdc-list-item--with-trailing-meta.mdc-list-item--with-two-lines + .mdc-list-item__end::before { + height: 40px; } .mdc-list-item--with-leading-icon .mdc-list-item__start { - font-size: 24px; - background: #4786C6; - width: 36px; - height: 50%; - text-align: center; - margin-bottom: 0; - margin-left: 8px; - margin-right: 8px; - padding-bottom: 0; - line-height: 36px; - border-radius: 100%; - color: white; + font-size: 24px; + background: #4786c6; + width: 36px; + height: 50%; + text-align: center; + margin-bottom: 0; + margin-left: 8px; + margin-right: 8px; + padding-bottom: 0; + line-height: 36px; + border-radius: 100%; + color: white; } .mdc-list-item--with-leading-icon .mdc-list-item__start.unavailable { - background: #612d23; + background: #612d23; } .mdc-list-item--with-leading-icon .mdc-list-item__start.upcoming { - background: #234261; + background: #234261; } /* End Action List Styling */ .mat-mdc-card { - margin: 0 !important; - max-width: 640px; + margin: 0 !important; + max-width: 640px; } .dropin-header { - display: flex; - margin-bottom: 0.5rem; - align-items: center; - justify-content: space-between; + display: flex; + margin-bottom: 0.5rem; + align-items: center; + justify-content: space-between; } .mdc-list-group__subheader { - margin: 0; + margin: 0; } .mdc-list-item { - padding: 0 !important; - display: flex; - align-items: baseline; + padding: 0 !important; + display: flex; + align-items: baseline; } .mdc-list-group__subheader { - margin: 0; + margin: 0; } .mat-mdc-list-base { - padding: 0; + padding: 0; } .mat-expansion-panel-header-description { - align-items: right; - flex: 0 0 auto; + align-items: right; + flex: 0 0 auto; } .mat-expansion-panel-header-description button { - z-index: 10 !important; + z-index: 10 !important; } mat-expansion-panel { - margin-top: 8px; + margin-top: 8px; } .mat-action-row { - align-items: center; + align-items: center; } mat-checkbox { - flex: 1; + flex: 1; } .bolded { - font-weight: 500; + font-weight: 500; } a { - text-decoration: none; -} \ No newline at end of file + text-decoration: none; +} diff --git a/frontend/src/app/coworking/widgets/operating-hours-dialog/operating-hours-dialog.widget.css b/frontend/src/app/coworking/widgets/operating-hours-dialog/operating-hours-dialog.widget.css index 398a74f4e..5c4a94198 100644 --- a/frontend/src/app/coworking/widgets/operating-hours-dialog/operating-hours-dialog.widget.css +++ b/frontend/src/app/coworking/widgets/operating-hours-dialog/operating-hours-dialog.widget.css @@ -1,10 +1,9 @@ - .dialog { - padding: 24px; + padding: 24px; } @media (prefers-color-scheme: dark) { - .dialog { - color: white; - } -} \ No newline at end of file + .dialog { + color: white; + } +} diff --git a/frontend/src/app/coworking/widgets/operating-hours-dialog/operating-hours-dialog.widget.html b/frontend/src/app/coworking/widgets/operating-hours-dialog/operating-hours-dialog.widget.html index 0b6d63cf8..20c54f0b3 100644 --- a/frontend/src/app/coworking/widgets/operating-hours-dialog/operating-hours-dialog.widget.html +++ b/frontend/src/app/coworking/widgets/operating-hours-dialog/operating-hours-dialog.widget.html @@ -2,9 +2,8 @@

Upcoming Hours

  • - {{ hours.start | date: 'EEEE M/d' }} - from {{ hours.start | date: 'h:mma' | lowercase }} to - {{ hours.end | date: 'h:mma' | lowercase }} + {{ hours.start | date: 'EEEE M/d' }} from {{ hours.start | date: 'h:mma' | + lowercase }} to {{ hours.end | date: 'h:mma' | lowercase }}
diff --git a/frontend/src/app/coworking/widgets/operating-hours-panel/operating-hours-panel.widget.css b/frontend/src/app/coworking/widgets/operating-hours-panel/operating-hours-panel.widget.css index 64fbdade0..9782d08da 100644 --- a/frontend/src/app/coworking/widgets/operating-hours-panel/operating-hours-panel.widget.css +++ b/frontend/src/app/coworking/widgets/operating-hours-panel/operating-hours-panel.widget.css @@ -1,47 +1,47 @@ .header { - padding: 16px; + padding: 16px; } .hours-title { - font-size: 20px; - font-weight: 500; - margin: 0; - letter-spacing: 0.25px; - line-height: 32px; - text-decoration-color: rgba(0, 0, 0, 0.87); - text-decoration-line: none; - text-decoration-style: solid; - text-decoration-thickness: auto; - -webkit-font-smoothing: antialiased; + font-size: 20px; + font-weight: 500; + margin: 0; + letter-spacing: 0.25px; + line-height: 32px; + text-decoration-color: rgba(0, 0, 0, 0.87); + text-decoration-line: none; + text-decoration-style: solid; + text-decoration-thickness: auto; + -webkit-font-smoothing: antialiased; } .badge { - display: inline-block; - border-radius: 20px; - margin-right: 8px; - padding: 0 16px; - color: white; + display: inline-block; + border-radius: 20px; + margin-right: 8px; + padding: 0 16px; + color: white; } .open .badge { - background: #256123; + background: #256123; } .closed .badge { - background: #612d23; + background: #612d23; } .mat-mdc-card { - max-width: 640px; - margin: 0; + max-width: 640px; + margin: 0; } .header-row { - display: flex; - flex-direction: row; - width: 100%; + display: flex; + flex-direction: row; + width: 100%; } #hours-button { - margin-left: auto; -} \ No newline at end of file + margin-left: auto; +} diff --git a/frontend/src/app/coworking/widgets/operating-hours-panel/operating-hours-panel.widget.html b/frontend/src/app/coworking/widgets/operating-hours-panel/operating-hours-panel.widget.html index f3dc05b4a..337ff1eb2 100644 --- a/frontend/src/app/coworking/widgets/operating-hours-panel/operating-hours-panel.widget.html +++ b/frontend/src/app/coworking/widgets/operating-hours-panel/operating-hours-panel.widget.html @@ -5,8 +5,7 @@ *ngIf="openOperatingHours; else closed">
Open - until - {{ openOperatingHours!.end | date: 'h:mma' | lowercase }} + until {{ openOperatingHours!.end | date: 'h:mma' | lowercase }} diff --git a/frontend/src/app/coworking/widgets/room-reservation-table/room-reservation-table.widget.css b/frontend/src/app/coworking/widgets/room-reservation-table/room-reservation-table.widget.css new file mode 100644 index 000000000..d1511b90d --- /dev/null +++ b/frontend/src/app/coworking/widgets/room-reservation-table/room-reservation-table.widget.css @@ -0,0 +1,39 @@ +/* room-reservation-table.widget.css */ + +table { + border-collapse: collapse; + width: 99%; + margin-left: 10px; +} + +th, +td { + border: 1px solid #ddd; + padding: 10px; + text-align: center; +} + +th { + height: 40px; /* Set the height for header rows */ + width: 30px; +} + +td { + height: 40px; /* Set the height for data rows */ + width: 30px; +} + +.time-slot { + font-size: 12px; /* Set the font size for time slot headings */ +} + +.button { + margin-top: 20px; /* Add top margin for spacing */ + font-size: 16px; /* Increase font size */ + padding: 10px 20px; /* Add padding */ + margin-left: 10px; +} + +.divider { + margin-bottom: 1em; +} diff --git a/frontend/src/app/coworking/widgets/room-reservation-table/room-reservation-table.widget.html b/frontend/src/app/coworking/widgets/room-reservation-table/room-reservation-table.widget.html new file mode 100644 index 000000000..72baed4c8 --- /dev/null +++ b/frontend/src/app/coworking/widgets/room-reservation-table/room-reservation-table.widget.html @@ -0,0 +1,26 @@ + + + + + + + + + + + +
{{ record.key }}
+
+ +
diff --git a/frontend/src/app/coworking/widgets/room-reservation-table/room-reservation-table.widget.ts b/frontend/src/app/coworking/widgets/room-reservation-table/room-reservation-table.widget.ts new file mode 100644 index 000000000..4c00e99f7 --- /dev/null +++ b/frontend/src/app/coworking/widgets/room-reservation-table/room-reservation-table.widget.ts @@ -0,0 +1,177 @@ +/** + * @author John Schachte, Aarjav Jain, Nick Wherthey + * @copyright 2023 + * @license MIT + */ + +import { Component } from '@angular/core'; +import { ReservationTableService } from '../../room-reservation/reservation-table.service'; +import { Subscription } from 'rxjs'; +import { Router } from '@angular/router'; +import { Reservation, TableCell } from 'src/app/coworking/coworking.models'; +import { RoomReservationService } from '../../room-reservation/room-reservation.service'; +import { MatSnackBar } from '@angular/material/snack-bar'; + +@Component({ + selector: 'room-reservation-table', + templateUrl: './room-reservation-table.widget.html', + styleUrls: ['./room-reservation-table.widget.css'] +}) +export class RoomReservationWidgetComponent { + timeSlots: string[] = []; + + //- Reservations Map + reservationsMap: Record = {}; + + //- Select Button enabled + selectButton: boolean = false; + + operationStart: Date = new Date(); + + //- Selected Date + selectedDate: string = ''; + // private subscription: Subscription; + Object: any; + subscription: Subscription; + cellPropertyMap = ReservationTableService.CellPropertyMap; + + snackBarOptions: Object = { + duration: 8000 + }; + + constructor( + protected reservationTableService: ReservationTableService, + private router: Router, + private roomReservationService: RoomReservationService, + protected snackBar: MatSnackBar + ) { + this.reservationTableService.setSelectedDate( + this.reservationTableService.setMinDate().toDateString() + ); + this.subscription = this.reservationTableService.selectedDate$.subscribe( + (selectedDate: string) => { + this.selectedDate = selectedDate; + this.getReservationsByDate(new Date(selectedDate)); + } + ); + } + + getReservationsByDate(date: Date) { + this.reservationTableService.getReservationsForRoomsByDate(date).subscribe( + (result) => { + this.reservationsMap = result.reserved_date_map; + let end = new Date(result.operating_hours_end); + this.operationStart = new Date(result.operating_hours_start); + let slots = result.number_of_time_slots; + + this.timeSlots = this.reservationTableService.generateTimeSlots( + this.operationStart, + end, + slots + ); + }, + (error: Error) => { + // Handle the error here + this.snackBar.open( + 'Error fetching reservations', + 'Close', + this.snackBarOptions + ); + console.error('Error fetching reservations:', error); + } + ); + } + + //- Array to store information about selected cells, where each element is an object + //- with 'key' representing the room number and 'index' representing the time interval. + selectedCells: TableCell[] = []; + + /** + * Toggles the color of a cell in the reservations map and manages selected cells. + * + * @param {string} key - The key representing the room in the reservations map. + * @param {number} index - The index representing the time slot in the reservations map. + * @returns {void} The method does not return a value. + */ + toggleCellColor(key: string, index: number): void { + const isSelected = + this.reservationsMap[key][index] === + ReservationTableService.CellEnum.RESERVING; + + if (isSelected) { + this.reservationTableService.deselectCell(key, index, this); + } else { + this.reservationTableService.selectCell(key, index, this); + } + + this.selectButtonToggle(); + } + + //- Check if at least one time slot selected + selectButtonToggle(): void { + this.selectButton = Object.values(this.reservationsMap).some( + (timeSlotsForRow) => + timeSlotsForRow.includes(ReservationTableService.CellEnum.RESERVING) + ); + } + + /** + * Initiates the process of drafting a reservation based on the current state + * of the reservations map and the selected date. + * + * @throws {Error} If there is an exception during the drafting process. + * + * @remarks + * The method calls the 'draftReservation' service method and handles the response: + * - If the reservation is successfully drafted, the user is navigated to the + * confirmation page with the reservation data. + * - If there is an error during the drafting process, the error is logged, and an + * alert with the error message is displayed to the user. + * + * @example + * ```typescript + * draftReservation(); + * ``` + */ + + draftReservation() { + const result = this.reservationTableService.draftReservation( + this.reservationsMap, + this.operationStart + ); + result.subscribe( + (reservation: Reservation) => { + // Navigate with the reservation data + this.router.navigateByUrl( + `/coworking/confirm-reservation/${reservation.id}` + ); + }, + + (error) => { + // Handle errors here + console.error('Error drafting reservation', error); + this.snackBar.open(error.error.message, 'Close', this.snackBarOptions); + } + ); + } + + /** + * Setter for the reservations map to set the state of a timeslot to reserving. + * @param key room id for reservationsMap. + * @param index index of the timeslot to change the state of. + */ + public setSlotReserving(key: string, index: number) { + this.reservationsMap[key][index] = + ReservationTableService.CellEnum.RESERVING; + } + + /** + * Setter for the reservations map to set the state of a timeslot to reserved. + * @param key room id for reservationsMap. + * @param index index of the timeslot to change the state of. + */ + public setSlotAvailable(key: string, index: number) { + this.reservationsMap[key][index] = + ReservationTableService.CellEnum.AVAILABLE; + } +} diff --git a/frontend/src/app/event/event-editor/event-editor.component.html b/frontend/src/app/event/event-editor/event-editor.component.html index d7a3117e1..58298b02f 100644 --- a/frontend/src/app/event/event-editor/event-editor.component.html +++ b/frontend/src/app/event/event-editor/event-editor.component.html @@ -10,60 +10,38 @@ Update Event - - - - Event Name - - + + + + Event Name + + - - - - + + + + - - - Location - - + + + Location + + - - - Description - - + + + Description + + - - - Registration Limit - - + + + Registration Limit + + - - - + + + - - - + + + - You do not have permission to view this page - + You do not have permission to view this page + \ No newline at end of file diff --git a/frontend/src/app/organization/widgets/organization-card/organization-card.widget.html b/frontend/src/app/organization/widgets/organization-card/organization-card.widget.html index 7d552405c..d90f62694 100644 --- a/frontend/src/app/organization/widgets/organization-card/organization-card.widget.html +++ b/frontend/src/app/organization/widgets/organization-card/organization-card.widget.html @@ -1,3 +1,5 @@ + + diff --git a/frontend/src/app/profile/profile-editor/profile-editor.component.html b/frontend/src/app/profile/profile-editor/profile-editor.component.html index 1c55c3268..e0dab8503 100644 --- a/frontend/src/app/profile/profile-editor/profile-editor.component.html +++ b/frontend/src/app/profile/profile-editor/profile-editor.component.html @@ -1,99 +1,70 @@
- - - Update your Profile - - - - Welcome to CSXL! Please verify and complete your profile - below. - - Once your profile is setup you will be able to take advantage of CSXL - initiatives such as enrolling in workshops, reserving a desk during - coworking hours, and more! - - - - - - First Name - - - - Last Name - - - - UNC Email - - Must provide a valid UNC email address. - - - Pronouns - - - - - - - + + + Update your Profile + + + + Welcome to CSXL! Please verify and complete your profile + below. + + Once your profile is setup you will be able to take advantage of CSXL + initiatives such as enrolling in workshops, reserving a desk during + coworking hours, and more! + + + + + + First Name + + + + Last Name + + + + UNC Email + + Must provide a valid UNC email address. + + + Pronouns + + + + + + +
-
- - - GitHub / - - {{ profile.github }} - - - - - -
- - - Link Your GitHub Account - - - - - +
+ + + GitHub / + + {{ profile.github }} + + + + + +
+ + + Link Your GitHub Account + + + + +
@@ -133,4 +104,4 @@ {{ token }}
- + \ No newline at end of file