talkpal-frontend/scenes/reservation/reservation_creation.gd
2025-01-29 00:45:44 +03:00

116 lines
3.3 KiB
GDScript

extends VBoxContainer
@onready var _main: Main = get_tree().get_current_scene()
@onready var _back_button := $TopBar/BackButton
@onready var _apply_button := $TopBar/ApplyButton
@onready var _title_field := $TitleField
@onready var _date_field := $DateField
@onready var _start_time_field := $StartTimeField
@onready var _finish_time_field := $FinishTimeField
@onready var _creator_field := $CreatorField
@onready var _room_field := $RoomField
@onready var _description_field := $DescriptionField
func _ready():
initialize_signals()
func initialize_signals():
_back_button.pressed.connect(_on_back_button_pressed)
_apply_button.pressed.connect(_on_apply_button_pressed)
func _on_back_button_pressed():
_main.load_page(Main.Pages.Board)
func _on_apply_button_pressed():
_create_reservation()
func _create_reservation():
if not _fields_are_correct():
return
var dto = CreateReservationDTO.new()
dto.title = _title_field.get_value()
dto.date = _date_field.get_value()
dto.start_time = _start_time_field.get_value()
dto.finish_time = _finish_time_field.get_value()
dto.creator = _creator_field.get_value()
dto.room_id = _room_field.get_value() # TODO: make it listbox
dto.description = _description_field.get_value()
dto.color = randi_range(1, 3)
var repo = _main.get_reservation_repo()
repo.create_reservation(dto)
dto.queue_free()
_main.load_page(Main.Pages.Board)
clean()
func _fields_are_correct():
var successful := true
if len(_title_field.get_value()) < 1:
print("The title is not entered.")
successful = false
if not _time_is_correct():
successful = false
return successful
func _time_is_correct():
var start_time = _start_time_field.get_value()
var finish_time = _finish_time_field.get_value()
var start_time_is_after_finish_time = \
start_time["hours"] > finish_time["hours"] or \
(start_time["hours"] == finish_time["hours"] and \
start_time["minutes"] >= finish_time["minutes"])
if start_time_is_after_finish_time:
print("Start time should not be more than or equal to finish time.")
return false
var repo = _main.get_reservation_repo()
var reservations = repo.list_reservations()
var new_start_time_minutes = start_time["hours"]*60 + start_time["minutes"]
var new_finish_time_minutes = finish_time["hours"]*60 + finish_time["minutes"]
for reservation in reservations:
var other_start_time = reservation.start_time
var other_finish_time = reservation.finish_time
var other_start_time_minutes = other_start_time["hours"]*60 + other_start_time["minutes"]
var other_finish_time_minutes = other_finish_time["hours"]*60 + other_finish_time["minutes"]
var is_busy = (
(
new_start_time_minutes >= other_start_time_minutes and
new_start_time_minutes < other_finish_time_minutes
) or (
new_finish_time_minutes > other_start_time_minutes and
new_finish_time_minutes <= other_finish_time_minutes
) or (
new_start_time_minutes >= other_start_time_minutes and
new_finish_time_minutes <= other_finish_time_minutes
) or (
new_start_time_minutes <= other_start_time_minutes and
new_finish_time_minutes >= other_finish_time_minutes
)
)
if is_busy:
print("The selected time slot is busy.")
return false
return true
func update():
_ready()
func clean():
_title_field.clean()
_start_time_field.clean()
_finish_time_field.clean()