174 lines
4.8 KiB
GDScript
174 lines
4.8 KiB
GDScript
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 _back_button := $TopBar/BackButton
|
||
@onready var _apply_button := $TopBar/ApplyButton
|
||
@onready var _delete_button := $BottomBar/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
|
||
|
||
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 repo = _main.get_reservation_repo()
|
||
var reservation_id = repo.get_current_reservation_id()
|
||
var reservation = repo.get_reservation(reservation_id)
|
||
|
||
_title_field.set_value(reservation.title)
|
||
_start_time_field.set_value(reservation.start_time)
|
||
_finish_time_field.set_value(reservation.finish_time)
|
||
|
||
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 _update_reservation():
|
||
if not _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() # TODO: make it listbox
|
||
dto.description = _description_field.get_value()
|
||
dto.color = randi_range(1, 3)
|
||
|
||
var repo = _main.get_reservation_repo()
|
||
var reservation_id = repo.get_current_reservation_id()
|
||
repo.change_reservation(reservation_id, dto)
|
||
repo.set_current_reservation_id(null)
|
||
|
||
dto.queue_free()
|
||
|
||
_main.load_page(Main.Pages.Board)
|
||
clean()
|
||
|
||
func _delete_reservation():
|
||
var repo = _main.get_reservation_repo()
|
||
var reservation_id = repo.get_current_reservation_id()
|
||
repo.cancel_reservation(reservation_id)
|
||
|
||
_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.")
|
||
_error_box.set_message("Не введено название встречи")
|
||
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 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 false
|
||
|
||
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 false
|
||
|
||
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 is_busy = service.is_time_busy(start_time_in_minutes, finish_time_in_minutes)
|
||
|
||
if is_busy:
|
||
print("The selected time slot is busy.")
|
||
_error_box.set_message("Выбранный временной интервал занят")
|
||
return false
|
||
|
||
return true
|
||
|
||
func set_start_time(value):
|
||
_start_time_field.set_value(value)
|
||
|
||
func update():
|
||
_ready()
|
||
|
||
if type == Types.Edit:
|
||
_load_info()
|
||
|
||
func clean():
|
||
_title_field.clean()
|
||
_start_time_field.clean()
|
||
_finish_time_field.clean()
|