talkpal-frontend/scenes/reservation/reservation_page.gd
DarkSlein cea005967b Added back button
Fixed creating and updating reservation
2025-03-27 23:25:59 +03:00

310 lines
9.3 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends VBoxContainer
enum Types {
Creation,
Edit,
Info
}
@export var type : Types:
set(new_type):
type = new_type
@onready var _main: Main = get_tree().get_current_scene()
@onready var _title := $TopBar/Label
@onready var _back_button := $BottomBar/Left/BackButton
@onready var _apply_button := $BottomBar/Right/ApplyButton
@onready var _delete_button := $BottomBar/Left/DeleteButton
@onready var _error_box := $ErrorBox
@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
var _reservation : ReservationEntity = null
func _process(delta):
_process_fonts()
_process_separation()
func _process_fonts():
_process_font_size(_title, 35)
_process_font_size(_back_button, 35)
_process_font_size(_apply_button, 35)
_process_font_size(_delete_button, 35)
_process_font_size(_error_box, 35)
func _process_font_size(obj, k):
var font_size = obj.get_theme_default_font_size()
var new_font_size = get_viewport_rect().size.y/k
if font_size != new_font_size:
obj.add_theme_font_size_override("font_size", new_font_size)
func _process_separation():
var separation = get_theme_constant("separation")
var new_separation = get_viewport_rect().size.y*(1.0/19.0) - 715.0/19.0
if separation != new_separation:
add_theme_constant_override("separation", new_separation)
func _ready():
initialize_signals()
_error_box.set_message(String())
func initialize_signals():
_back_button.pressed.connect(_on_back_button_pressed)
_apply_button.pressed.connect(_on_apply_button_pressed)
if type == Types.Edit:
_delete_button.pressed.connect(_on_delete_button_pressed)
func _on_back_button_pressed():
_main.load_page(Main.Pages.Board)
func _on_apply_button_pressed():
match type:
Types.Creation:
_create_reservation()
Types.Edit:
_update_reservation()
func _on_delete_button_pressed():
_delete_reservation()
func _load_info():
var reservation_repo = _main.get_reservation_repo()
var reservation_id = reservation_repo.get_selected_reservation_id()
_reservation = await reservation_repo.get_reservation(reservation_id)
var room_repo = _main.get_room_repo()
var room = await room_repo.get_room(_reservation.room_id)
var room_title = room.title if room != null else ""
_title_field.set_value(_reservation.title)
_start_time_field.set_value(_reservation.start_time)
_finish_time_field.set_value(_reservation.finish_time)
_date_field.set_value(_reservation.date)
_room_field.set_value({"title": room_title, "id": _reservation.room_id})
func _load_room():
if _room_field.get_value().title == "":
var room = _main.get_selected_room()
_room_field.set_value({"title": room.title, "id": room.id})
func _load_date():
if _date_field.get_value() == "":
_date_field.set_value(_main.get_selected_date())
func _create_reservation():
if not await _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().id
dto.description = _description_field.get_value()
dto.color = randi_range(1, 3)
var reservation_repo = _main.get_reservation_repo()
reservation_repo.create_reservation(dto)
dto.queue_free()
_main.load_page(Main.Pages.Board, true)
clean()
func _update_reservation():
if not await _fields_are_correct():
return
var dto = UpdateReservationDTO.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().id
dto.description = _description_field.get_value()
dto.color = randi_range(1, 3)
var reservation_repo = _main.get_reservation_repo()
var reservation_id = reservation_repo.get_selected_reservation_id()
reservation_repo.change_reservation(reservation_id, dto)
reservation_repo.set_selected_reservation_id(null)
dto.queue_free()
_main.load_page(Main.Pages.Board, true)
clean()
func _delete_reservation():
var repo = _main.get_reservation_repo()
var reservation_id = repo.get_selected_reservation_id()
repo.cancel_reservation(reservation_id)
_main.load_page(Main.Pages.Board, true)
clean()
func _fields_are_correct():
var successful := true
#if not _title_is_correct():
# successful = false
if not await _time_is_correct():
successful = false
return successful
func _title_is_correct():
if len(_title_field.get_value()) < 1:
print("The title is not entered.")
_error_box.set_message("Не введено название встречи")
return false
return true
func _time_is_correct():
var start_time = _start_time_field.get_value()
var finish_time = _finish_time_field.get_value()
if _time_is_not_entered(start_time, finish_time):
return false
if _time_or_date_is_before_now(start_time):
return false
if _finish_time_is_before_now(finish_time):
return false
if _start_time_is_after_finish_time(start_time, finish_time):
return false
if await _selected_time_is_busy(start_time, finish_time):
return false
return true
func _time_is_not_entered(start_time: Dictionary, finish_time: Dictionary):
var time_is_not_entered = \
start_time["hours"] == 0 and start_time["minutes"] == 0 or \
finish_time["hours"] == 0 and finish_time["minutes"] == 0
if time_is_not_entered:
_error_box.set_message("Введите время начала и окончания встречи")
return true
return false
func _time_or_date_is_before_now(start_time: Dictionary):
var start_time_is_before_now = _time_is_before_current_time(start_time)
var date_is_before_now = _main.date_is_before_current_date(_date_field.get_value())
var time_and_date_are_not_updated = \
_main.get_current_page() == Main.Pages.ReservationEdit \
and _time_and_date_are_not_updated()
if (start_time_is_before_now and time_and_date_are_not_updated and _date_is_today()) \
or date_is_before_now:
_error_box.set_message("Нельзя зарезервировать на прошедшее время")
return true
return false
func _finish_time_is_before_now(finish_time: Dictionary):
var finish_time_is_before_now = _time_is_before_current_time(finish_time)
if finish_time_is_before_now and _date_is_today():
_error_box.set_message("Время окончания должно быть позже текущего времени")
return true
func _date_is_today():
var current_date = Utils._date_to_number(_main.get_current_date())
var selected_date = Utils._date_to_number(_date_field.get_value())
return current_date == selected_date
func _time_is_before_current_time(time) -> bool:
var current_time = Time.get_time_dict_from_system()
var time_in_minutes = time.hours*60 + time.minutes
var current_time_in_minutes = current_time.hour*60 + current_time.minute
print(time_in_minutes, ' ', current_time_in_minutes)
return time_in_minutes < current_time_in_minutes
func _time_and_date_are_not_updated():
if _reservation:
var reservation_date = Utils._date_to_number(_reservation.date)
var selected_date = Utils._date_to_number(_date_field.get_value())
var selected_start_time = get_start_time()
if selected_start_time.hours == _reservation.start_time.hours and \
selected_start_time.minutes == _reservation.start_time.minutes and \
reservation_date == selected_date:
return true
return false
func _start_time_is_after_finish_time(start_time: Dictionary, finish_time: Dictionary):
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.")
_error_box.set_message("Время начала не может быть больше времени окончания")
return true
return false
func _selected_time_is_busy(start_time: Dictionary, finish_time: Dictionary):
var start_time_in_minutes = start_time.hours*60 + start_time.minutes
var finish_time_in_minutes = finish_time.hours*60 + finish_time.minutes
var service = _main.get_reservation_service()
var selected_room_id = _room_field.get_value().id
var selected_date = _date_field.get_value()
var is_busy = await service.is_time_busy(start_time_in_minutes, finish_time_in_minutes, \
selected_room_id, selected_date)
if is_busy:
print("The selected time slot is busy.")
_error_box.set_message("Выбранный временной интервал занят")
return true
return false
func get_start_time() -> Dictionary:
return _start_time_field.get_value()
func get_finish_time() -> Dictionary:
return _finish_time_field.get_value()
func set_start_time(value) -> void:
_start_time_field.set_value(value)
func set_finish_time(value) -> void:
_finish_time_field.set_value(value)
func update():
_ready()
if type == Types.Edit and _main.get_previous_page() == Main.Pages.Board:
_load_info()
else:
_load_room()
_load_date()
func clean():
_title_field.clean()
_start_time_field.clean()
_finish_time_field.clean()
_date_field.clean()
_room_field.clean()