Added date and room selection during reservation creation/edit

This commit is contained in:
Sviatoslav Tsariov Yurievich 2025-03-25 14:15:35 +03:00
parent 8fb7c32e2b
commit 61113edade
27 changed files with 367 additions and 90 deletions

View File

@ -0,0 +1,4 @@
[gd_resource type="Theme" format=3 uid="uid://cdor0uw5aqxkq"]
[resource]
default_font_size = 72

View File

@ -67,10 +67,13 @@ func _process_schedule(delta):
_schedule_update_timer += delta _schedule_update_timer += delta
func _ready(): func _ready():
_remove_reservations()
_initialize()
func _initialize():
_connect_signals() _connect_signals()
_remove_time_slots() _remove_time_slots()
_fill_with_slots() _fill_with_slots()
await get_tree().create_timer(0.1, false).timeout await get_tree().create_timer(0.1, false).timeout
@ -203,10 +206,12 @@ func _input(event):
if _main.get_current_page() == Main.Pages.Board: if _main.get_current_page() == Main.Pages.Board:
var time = _get_time_by_position(event.position) var time = _get_time_by_position(event.position)
if _time_is_before_current_time(time): if _time_is_before_current_time(time) and _selected_date_is_current():
return return
var creation_page = _main.load_page(Main.Pages.ReservationCreation) var creation_page = _main.load_page(Main.Pages.ReservationCreation)
creation_page.clean()
creation_page.update()
creation_page.set_start_time(time) creation_page.set_start_time(time)
func _get_time_by_position(position): func _get_time_by_position(position):
@ -229,6 +234,9 @@ func _clicked_on_timeline(pos: Vector2):
pos.y < _timeline.size.y + timeline_position.y pos.y < _timeline.size.y + timeline_position.y
) )
func _selected_date_is_current():
return _main.get_selected_date() == _main.get_current_date()
func _time_is_before_current_time(time): func _time_is_before_current_time(time):
var current_time = Time.get_time_dict_from_system() var current_time = Time.get_time_dict_from_system()
var time_in_minutes = time.hours*60 + time.minutes var time_in_minutes = time.hours*60 + time.minutes
@ -245,7 +253,6 @@ func _on_room_button_pressed():
if _rooms_menu.visible: if _rooms_menu.visible:
_rooms_menu.hide() _rooms_menu.hide()
else: else:
_rooms_menu.position = _date.position
_rooms_menu.show() _rooms_menu.show()
func _on_room_selected(idx, text): func _on_room_selected(idx, text):
@ -259,6 +266,7 @@ func _on_room_selected(idx, text):
update() update()
func _on_date_button_pressed(): func _on_date_button_pressed():
_main.start_date_selection()
_main.load_page(Main.Pages.CalendarSetting) _main.load_page(Main.Pages.CalendarSetting)
func _on_reservations_updated(reservations): func _on_reservations_updated(reservations):
@ -267,5 +275,5 @@ func _on_reservations_updated(reservations):
func update(): func update():
_block_board_click_for(0.25) _block_board_click_for(0.25)
_ready() _initialize()
_update_schedule() _update_schedule()

View File

@ -8,8 +8,9 @@ func _process(delta):
_process_items_font_size() _process_items_font_size()
func _process_items_font_size(): func _process_items_font_size():
var font_size = _items.get_theme_default_font_size() var default_font_size = _items.get_theme_default_font_size()
var new_font_size = get_viewport_rect().size.y/35 var font_size = _items.get_theme_font_size("font_size")
var new_font_size = get_viewport_rect().size.y/30
if font_size != new_font_size: if font_size != new_font_size:
_items.add_theme_font_size_override("font_size", new_font_size) _items.add_theme_font_size_override("font_size", new_font_size)
@ -28,6 +29,9 @@ func clear():
func select(idx): func select(idx):
_items.select(idx) _items.select(idx)
func deselect_all():
_items.deselect_all()
func _on_item_clicked(index, at_position, mouse_button_index): func _on_item_clicked(index, at_position, mouse_button_index):
var text = _items.get_item_text(index) var text = _items.get_item_text(index)
item_clicked.emit(index, text) item_clicked.emit(index, text)

View File

@ -1,7 +1,10 @@
[gd_scene load_steps=3 format=3 uid="uid://bt3h3m10qx1jr"] [gd_scene load_steps=4 format=3 uid="uid://bt3h3m10qx1jr"]
[ext_resource type="Script" path="res://scenes/board/rooms_menu.gd" id="1_5p83j"] [ext_resource type="Script" path="res://scenes/board/rooms_menu.gd" id="1_5p83j"]
[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="1_yypwp"] [ext_resource type="Theme" uid="uid://cdor0uw5aqxkq" path="res://assets/themes/rooms_menu.tres" id="2_xsikm"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_36vy7"]
bg_color = Color(0.137255, 0.137255, 0.137255, 0.658824)
[node name="RoomsMenu" type="Control"] [node name="RoomsMenu" type="Control"]
layout_mode = 3 layout_mode = 3
@ -10,9 +13,10 @@ script = ExtResource("1_5p83j")
[node name="Items" type="ItemList" parent="."] [node name="Items" type="ItemList" parent="."]
layout_mode = 0 layout_mode = 0
offset_right = 500.0 offset_right = 750.0
offset_bottom = 280.0 offset_bottom = 420.0
theme = ExtResource("1_yypwp") theme = ExtResource("2_xsikm")
theme_override_styles/panel = SubResource("StyleBoxFlat_36vy7")
auto_height = true auto_height = true
item_count = 4 item_count = 4
item_0/text = "Маркетинг" item_0/text = "Маркетинг"

View File

@ -1 +1,52 @@
extends Control extends Control
@onready var _main: Main = get_tree().get_current_scene()
@onready var _edit := $Edit
@export var editable : bool:
set(value):
editable = value
set_editable(value)
var _date := ""
var _date_setting_page
func _process(delta):
_process_font_size()
func _process_font_size():
var font_size = _edit.get_theme_default_font_size()
var new_font_size = get_viewport_rect().size.y/35
if font_size != new_font_size:
_edit.add_theme_font_size_override("font_size", new_font_size)
func _ready():
initialize_signals()
func initialize_signals():
_edit.focus_entered.connect(_on_click)
func _on_click():
if _main.get_current_page() == Main.Pages.CalendarSetting:
return
_date_setting_page = _main.load_page(Main.Pages.CalendarSetting)
_date_setting_page.date_selected.connect(self._on_date_is_set)
func _on_date_is_set(date: Calendar.DateObj):
_date_setting_page.date_selected.disconnect(_on_date_is_set)
set_date("%02d.%02d.%04d" % [date.day, date.month, date.year])
func set_date(date: String):
_date = date
_edit.text = get_date()
func get_date():
return _date
func set_editable(value):
_edit.editable = value
func clean():
_date = ""
_edit.text = ""

View File

@ -3,18 +3,21 @@
[ext_resource type="Script" path="res://scenes/common/calendar/calendar_edit.gd" id="1_jxhnl"] [ext_resource type="Script" path="res://scenes/common/calendar/calendar_edit.gd" id="1_jxhnl"]
[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="2_e6eik"] [ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="2_e6eik"]
[node name="Calendar" type="Control"] [node name="Calendar" type="VBoxContainer"]
layout_mode = 3 anchors_preset = 10
anchors_preset = 15
anchor_right = 1.0 anchor_right = 1.0
anchor_bottom = 1.0 offset_bottom = 72.0
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_jxhnl") script = ExtResource("1_jxhnl")
[node name="Button" type="Button" parent="."] [node name="Button" type="Button" parent="."]
layout_mode = 0 visible = false
offset_right = 24.0 layout_mode = 2
offset_bottom = 31.0
theme = ExtResource("2_e6eik") theme = ExtResource("2_e6eik")
text = "Открыть календарь" text = "Открыть календарь"
[node name="Edit" type="LineEdit" parent="."]
layout_mode = 2
size_flags_horizontal = 3
theme = ExtResource("2_e6eik")
virtual_keyboard_enabled = false

View File

@ -72,6 +72,13 @@ func update_calendar() -> void:
var day_label = create_day_label(date_obj, today) var day_label = create_day_label(date_obj, today)
_days_grid.add_child(day_label) _days_grid.add_child(day_label)
_cancel_selection()
func _cancel_selection():
for day_label in _days_grid.get_children():
for selection in day_label.get_children():
selection.queue_free()
func create_day_label(date_obj: Calendar.DateObj, today: Calendar.DateObj) -> CalendarLabel: func create_day_label(date_obj: Calendar.DateObj, today: Calendar.DateObj) -> CalendarLabel:
var label = CalendarLabel.new(str(date_obj.day), true) var label = CalendarLabel.new(str(date_obj.day), true)
@ -118,7 +125,7 @@ func _on_next_month_pressed() -> void:
update_calendar() update_calendar()
func update(): func update():
pass _cancel_selection()
class CalendarLabel: class CalendarLabel:
extends Label extends Label

View File

@ -5,7 +5,8 @@ enum Type {
Line, Line,
Text, Text,
Calendar, Calendar,
Time Time,
ListBox
} }
@export var title : String: @export var title : String:
@ -28,6 +29,7 @@ enum Type {
@onready var _calendar = $Container/Value/Calendar @onready var _calendar = $Container/Value/Calendar
@onready var _time = $Container/Value/Time @onready var _time = $Container/Value/Time
@onready var _text = $Container/Value/Text @onready var _text = $Container/Value/Text
@onready var _list_box = $Container/Value/ListBox
var _type var _type
@ -62,12 +64,17 @@ func get_value():
Type.Text: Type.Text:
return _text.text return _text.text
Type.Calendar: Type.Calendar:
return "" return _calendar.get_date()
Type.Time: Type.Time:
return { return {
"hours": _time.get_hours(), "hours": _time.get_hours(),
"minutes": _time.get_minutes() "minutes": _time.get_minutes()
} }
Type.ListBox:
return {
"id": _list_box.get_id(),
"title": _list_box.get_title()
}
func set_value(value): func set_value(value):
match _type: match _type:
@ -76,9 +83,12 @@ func set_value(value):
Type.Text: Type.Text:
_text.text = value _text.text = value
Type.Calendar: Type.Calendar:
pass _calendar.set_date(value)
Type.Time: Type.Time:
_time.set_time(value.hours, value.minutes) _time.set_time(value.hours, value.minutes)
Type.ListBox:
_list_box.set_id(value.id)
_list_box.set_title(value.title)
func set_editable(value): func set_editable(value):
if _line == null: if _line == null:
@ -96,6 +106,7 @@ func set_type(type):
_text.visible = false _text.visible = false
_calendar.visible = false _calendar.visible = false
_time.visible = false _time.visible = false
_list_box.visible = false
_type = type _type = type
@ -108,6 +119,8 @@ func set_type(type):
_calendar.visible = true _calendar.visible = true
Type.Time: Type.Time:
_time.visible = true _time.visible = true
Type.ListBox:
_list_box.visible = true
func clean(): func clean():
match _type: match _type:
@ -116,6 +129,8 @@ func clean():
Type.Text: Type.Text:
_text.text = "" _text.text = ""
Type.Calendar: Type.Calendar:
pass _calendar.clean()
Type.Time: Type.Time:
_time.clean() _time.clean()
Type.ListBox:
_list_box.clean()

View File

@ -1,10 +1,11 @@
[gd_scene load_steps=6 format=3 uid="uid://d0fdiesiaajlq"] [gd_scene load_steps=7 format=3 uid="uid://d0fdiesiaajlq"]
[ext_resource type="Script" path="res://scenes/common/edit_field.gd" id="1_sdy7t"] [ext_resource type="Script" path="res://scenes/common/edit_field.gd" id="1_sdy7t"]
[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="2_iq8f3"] [ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="2_iq8f3"]
[ext_resource type="Theme" uid="uid://bbboqrxd230bp" path="res://assets/themes/edit_label_font.tres" id="3_4sp4y"] [ext_resource type="Theme" uid="uid://bbboqrxd230bp" path="res://assets/themes/edit_label_font.tres" id="3_4sp4y"]
[ext_resource type="PackedScene" uid="uid://drdv8adk1wi8f" path="res://scenes/common/calendar/calendar_edit.tscn" id="4_hlx5p"] [ext_resource type="PackedScene" uid="uid://drdv8adk1wi8f" path="res://scenes/common/calendar/calendar_edit.tscn" id="4_hlx5p"]
[ext_resource type="PackedScene" uid="uid://bhd0xvnvoqslr" path="res://scenes/common/time/time_edit.tscn" id="5_d0drs"] [ext_resource type="PackedScene" uid="uid://bhd0xvnvoqslr" path="res://scenes/common/time/time_edit.tscn" id="5_d0drs"]
[ext_resource type="PackedScene" uid="uid://dn6skkh5c7f4s" path="res://scenes/common/list_box/list_box_edit.tscn" id="6_ovelt"]
[node name="EditField" type="HBoxContainer"] [node name="EditField" type="HBoxContainer"]
anchors_preset = 10 anchors_preset = 10
@ -66,3 +67,8 @@ layout_mode = 2
visible = false visible = false
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
[node name="ListBox" parent="Container/Value" instance=ExtResource("6_ovelt")]
visible = false
layout_mode = 2
editable = true

View File

@ -0,0 +1,62 @@
extends Control
@onready var _main: Main = get_tree().get_current_scene()
@onready var _edit := $Edit
@export var editable : bool:
set(value):
editable = value
await ready
set_editable(value)
var _title := ""
var _id := ""
var _room_setting_page
func _process(delta):
_process_font_size()
func _process_font_size():
var font_size = _edit.get_theme_default_font_size()
var new_font_size = get_viewport_rect().size.y/35
if font_size != new_font_size:
_edit.add_theme_font_size_override("font_size", new_font_size)
func _ready():
initialize_signals()
func initialize_signals():
_edit.focus_entered.connect(_on_click)
func _on_click():
if _main.get_current_page() == Main.Pages.RoomSelection:
return
_room_setting_page = _main.load_page(Main.Pages.RoomSelection)
_room_setting_page.room_selected.connect(_on_room_is_set)
func _on_room_is_set(title: String, id: String):
_room_setting_page.room_selected.disconnect(_on_room_is_set)
set_title(title)
set_id(id)
func set_title(title: String):
_title = title
_edit.text = title
func get_title() -> String:
return _title
func set_id(id: String):
_id = id
func get_id() -> String:
return _id
func set_editable(value):
_edit.editable = value
func clean():
_title = ""
_id = ""
_edit.text = ""

View File

@ -0,0 +1,17 @@
[gd_scene load_steps=3 format=3 uid="uid://dn6skkh5c7f4s"]
[ext_resource type="Script" path="res://scenes/common/list_box/list_box_edit.gd" id="1_rb63m"]
[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="2_ubgs8"]
[node name="ListBoxEdit" type="VBoxContainer"]
anchors_preset = 10
anchor_right = 1.0
offset_bottom = 72.0
grow_horizontal = 2
script = ExtResource("1_rb63m")
[node name="Edit" type="LineEdit" parent="."]
layout_mode = 2
size_flags_horizontal = 3
theme = ExtResource("2_ubgs8")
virtual_keyboard_enabled = false

View File

@ -0,0 +1,9 @@
[gd_scene format=3 uid="uid://dveqs4kjvc2jv"]
[node name="ListBox" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2

View File

@ -14,7 +14,7 @@ script = ExtResource("1_2wxyg")
[node name="TimeEdit" type="LineEdit" parent="."] [node name="TimeEdit" type="LineEdit" parent="."]
visible = false visible = false
layout_mode = 2 layout_mode = 2
text = "15:04 " text = "10:34 "
placeholder_text = "hh:mm (a/p)m" placeholder_text = "hh:mm (a/p)m"
script = ExtResource("2_7d4ae") script = ExtResource("2_7d4ae")
current_time = true current_time = true
@ -24,8 +24,3 @@ layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
theme = ExtResource("3_bpvuo") theme = ExtResource("3_bpvuo")
virtual_keyboard_enabled = false virtual_keyboard_enabled = false
[connection signal="mouse_entered" from="TimeEdit/Clock" to="TimeEdit/Clock" method="_on_mouse_entered"]
[connection signal="mouse_exited" from="TimeEdit/Clock" to="TimeEdit/Clock" method="_on_mouse_exited"]
[connection signal="visibility_changed" from="TimeEdit/Clock" to="TimeEdit/Clock" method="_on_visibility_changed"]
[connection signal="draw" from="TimeEdit/ManualClock" to="TimeEdit/ManualClock" method="_on_draw"]

View File

@ -6,7 +6,8 @@ enum Pages {
ReservationCreation, ReservationCreation,
ReservationEdit, ReservationEdit,
TimeSetting, TimeSetting,
CalendarSetting CalendarSetting,
RoomSelection
} }
func get_current_page(): func get_current_page():
@ -38,3 +39,6 @@ func get_selected_room() -> RoomEntity:
func is_current_date_selected() -> bool: func is_current_date_selected() -> bool:
return true return true
func start_date_selection() -> void:
pass

View File

@ -32,7 +32,8 @@ enum Status {
Pages.ReservationCreation: $Left/Pages/ReservationCreation, Pages.ReservationCreation: $Left/Pages/ReservationCreation,
Pages.ReservationEdit: $Left/Pages/ReservationEdit, Pages.ReservationEdit: $Left/Pages/ReservationEdit,
Pages.TimeSetting: $Left/Pages/TimeSetting, Pages.TimeSetting: $Left/Pages/TimeSetting,
Pages.CalendarSetting: $Left/Pages/CalendarSetting Pages.CalendarSetting: $Left/Pages/CalendarSetting,
Pages.RoomSelection: $Left/Pages/RoomSelection
} }
@onready var _time_status_indent := $Left/TimeStatusContainer/Indent @onready var _time_status_indent := $Left/TimeStatusContainer/Indent
@onready var _time_label := $Left/TimeStatusContainer/TimeLabel @onready var _time_label := $Left/TimeStatusContainer/TimeLabel
@ -52,7 +53,7 @@ var _previous_page : Pages
var _status : Status var _status : Status
var _status_check_timer := 0.0 var _status_check_timer := 0.0
var _selected_date := _get_current_date() var _selected_date := get_current_date()
func _ready(): func _ready():
initialize_signals() initialize_signals()
@ -65,8 +66,6 @@ func initialize_signals():
_45_min_button.pressed.connect(_on_45_min_button_pressed) _45_min_button.pressed.connect(_on_45_min_button_pressed)
_1_hour_button.pressed.connect(_on_1_hour_button_pressed) _1_hour_button.pressed.connect(_on_1_hour_button_pressed)
_pages[Pages.CalendarSetting].date_selected.connect(_on_date_selected)
func _process(delta): func _process(delta):
_process_time_status_indent() _process_time_status_indent()
_process_status(delta) _process_status(delta)
@ -110,7 +109,7 @@ func _update_status(reservations=null):
if reservations == null: if reservations == null:
var room = get_selected_room() var room = get_selected_room()
reservations = await _reservation_repo.list_reservations({ reservations = await _reservation_repo.list_reservations({
"date": _get_current_date(), "date": get_current_date(),
"room_id": room.id if room else '' "room_id": room.id if room else ''
}) })
@ -230,6 +229,26 @@ func _create_default_reservation(minutes_of_reservation):
load_page(Main.Pages.Board, true) load_page(Main.Pages.Board, true)
func get_selected_date() -> String:
return _selected_date
func get_current_date() -> String:
var date = Time.get_date_dict_from_system()
return "%02d.%02d.%04d" % [date.day, date.month, date.year]
func is_current_date_selected() -> bool:
return get_selected_date() == get_current_date()
func get_selected_room() -> RoomEntity:
var room_repo = get_room_repo()
return room_repo.get_selected_room()
func hide_keyboard():
_keyboard.hide()
func start_date_selection():
_pages[Pages.CalendarSetting].date_selected.connect(_on_date_selected)
func _on_reservations_updated(reservations): func _on_reservations_updated(reservations):
_update_status() _update_status()
@ -248,23 +267,7 @@ func _on_45_min_button_pressed():
func _on_1_hour_button_pressed(): func _on_1_hour_button_pressed():
_create_default_reservation(60) _create_default_reservation(60)
func get_selected_date() -> String:
return _selected_date
func _get_current_date() -> String:
var date = Time.get_date_dict_from_system()
return "%02d.%02d.%04d" % [date.day, date.month, date.year]
func is_current_date_selected() -> bool:
return get_selected_date() == _get_current_date()
func get_selected_room() -> RoomEntity:
var room_repo = get_room_repo()
return room_repo.get_selected_room()
func hide_keyboard():
_keyboard.hide()
func _on_date_selected(date: Calendar.DateObj): func _on_date_selected(date: Calendar.DateObj):
_selected_date = "%02d.%02d.%04d" % [date.day, date.month, date.year] _selected_date = "%02d.%02d.%04d" % [date.day, date.month, date.year]
_pages[Pages.CalendarSetting].date_selected.disconnect(_on_date_selected)
_pages[Pages.Board].update_date() _pages[Pages.Board].update_date()

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=18 format=3 uid="uid://bkrvh8vjpgqot"] [gd_scene load_steps=19 format=3 uid="uid://bkrvh8vjpgqot"]
[ext_resource type="Script" path="res://scenes/main/main_tablet.gd" id="1_fr6s5"] [ext_resource type="Script" path="res://scenes/main/main_tablet.gd" id="1_fr6s5"]
[ext_resource type="PackedScene" uid="uid://c431r28ef5edp" path="res://scenes/board/board.tscn" id="2_n47h4"] [ext_resource type="PackedScene" uid="uid://c431r28ef5edp" path="res://scenes/board/board.tscn" id="2_n47h4"]
@ -8,6 +8,7 @@
[ext_resource type="Theme" uid="uid://byopik87nb8vv" path="res://assets/themes/status_font.tres" id="5_atujq"] [ext_resource type="Theme" uid="uid://byopik87nb8vv" path="res://assets/themes/status_font.tres" id="5_atujq"]
[ext_resource type="PackedScene" uid="uid://bc4tcq608v5rx" path="res://scenes/common/calendar/calendar_setting.tscn" id="6_c0c0t"] [ext_resource type="PackedScene" uid="uid://bc4tcq608v5rx" path="res://scenes/common/calendar/calendar_setting.tscn" id="6_c0c0t"]
[ext_resource type="Theme" uid="uid://yn1nbokvmv6n" path="res://assets/themes/small.tres" id="6_nde4h"] [ext_resource type="Theme" uid="uid://yn1nbokvmv6n" path="res://assets/themes/small.tres" id="6_nde4h"]
[ext_resource type="PackedScene" uid="uid://dik2e02vahb3g" path="res://scenes/reservation/room_selection.tscn" id="7_7j0ww"]
[ext_resource type="Theme" uid="uid://b8tbd62jtmgdx" path="res://assets/themes/instant_button_font.tres" id="8_bmn8p"] [ext_resource type="Theme" uid="uid://b8tbd62jtmgdx" path="res://assets/themes/instant_button_font.tres" id="8_bmn8p"]
[ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="9_wpf8g"] [ext_resource type="Theme" uid="uid://cmhwbyqu6nh38" path="res://assets/themes/big.tres" id="9_wpf8g"]
[ext_resource type="Script" path="res://src/infra/repos/backend/reservation_http.gd" id="10_v7sup"] [ext_resource type="Script" path="res://src/infra/repos/backend/reservation_http.gd" id="10_v7sup"]
@ -74,20 +75,24 @@ visible = false
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
[node name="RoomSelection" parent="Left/Pages" instance=ExtResource("7_7j0ww")]
visible = false
layout_mode = 2
[node name="TimeStatusContainer" type="VBoxContainer" parent="Left"] [node name="TimeStatusContainer" type="VBoxContainer" parent="Left"]
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 10 size_flags_horizontal = 10
size_flags_vertical = 0 size_flags_vertical = 0
[node name="Indent" type="BoxContainer" parent="Left/TimeStatusContainer"] [node name="Indent" type="BoxContainer" parent="Left/TimeStatusContainer"]
custom_minimum_size = Vector2(0, 0.666667) custom_minimum_size = Vector2(0, 195)
layout_mode = 2 layout_mode = 2
size_flags_vertical = 3 size_flags_vertical = 3
[node name="TimeLabel" type="Label" parent="Left/TimeStatusContainer"] [node name="TimeLabel" type="Label" parent="Left/TimeStatusContainer"]
layout_mode = 2 layout_mode = 2
theme = ExtResource("5_atujq") theme = ExtResource("5_atujq")
text = "12:42" text = "12:15"
horizontal_alignment = 1 horizontal_alignment = 1
[node name="StatusLabel" type="Label" parent="Left/TimeStatusContainer"] [node name="StatusLabel" type="Label" parent="Left/TimeStatusContainer"]
@ -152,7 +157,7 @@ grow_vertical = 0
[node name="CreateReservationButton" type="Button" parent="RightBottom"] [node name="CreateReservationButton" type="Button" parent="RightBottom"]
layout_mode = 2 layout_mode = 2
theme = ExtResource("9_wpf8g") theme = ExtResource("9_wpf8g")
theme_override_font_sizes/font_size = 0 theme_override_font_sizes/font_size = 16
text = " Забронировать " text = " Забронировать "
[node name="Repos" type="Node" parent="."] [node name="Repos" type="Node" parent="."]

View File

@ -74,7 +74,6 @@ layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_yafv8") theme_override_styles/panel = SubResource("StyleBoxFlat_yafv8")
[node name="DateField" parent="." instance=ExtResource("2_qfs8j")] [node name="DateField" parent="." instance=ExtResource("2_qfs8j")]
visible = false
layout_mode = 2 layout_mode = 2
title = "Дата" title = "Дата"
type = 2 type = 2
@ -104,7 +103,7 @@ editable = false
[node name="RoomField" parent="." instance=ExtResource("2_qfs8j")] [node name="RoomField" parent="." instance=ExtResource("2_qfs8j")]
layout_mode = 2 layout_mode = 2
title = "Комната" title = "Комната"
editable = false type = 4
[node name="Splitter4" type="Panel" parent="."] [node name="Splitter4" type="Panel" parent="."]
visible = false visible = false

View File

@ -68,7 +68,6 @@ layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_yafv8") theme_override_styles/panel = SubResource("StyleBoxFlat_yafv8")
[node name="DateField" parent="." instance=ExtResource("3_lh5s8")] [node name="DateField" parent="." instance=ExtResource("3_lh5s8")]
visible = false
layout_mode = 2 layout_mode = 2
title = "Дата" title = "Дата"
type = 2 type = 2
@ -85,7 +84,6 @@ title = "Конец"
type = 3 type = 3
[node name="Splitter3" type="Panel" parent="."] [node name="Splitter3" type="Panel" parent="."]
visible = false
custom_minimum_size = Vector2(0, 5) custom_minimum_size = Vector2(0, 5)
layout_mode = 2 layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_yafv8") theme_override_styles/panel = SubResource("StyleBoxFlat_yafv8")
@ -97,10 +95,9 @@ title = "Создатель"
editable = false editable = false
[node name="RoomField" parent="." instance=ExtResource("3_lh5s8")] [node name="RoomField" parent="." instance=ExtResource("3_lh5s8")]
visible = false
layout_mode = 2 layout_mode = 2
title = "Комната" title = "Комната"
editable = false type = 4
[node name="Splitter4" type="Panel" parent="."] [node name="Splitter4" type="Panel" parent="."]
visible = false visible = false

View File

@ -73,16 +73,28 @@ func _on_delete_button_pressed():
_delete_reservation() _delete_reservation()
func _load_info(): func _load_info():
var repo = _main.get_reservation_repo() var reservation_repo = _main.get_reservation_repo()
var reservation_id = repo.get_selected_reservation_id() var reservation_id = reservation_repo.get_selected_reservation_id()
var reservation = await repo.get_reservation(reservation_id) var 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) _title_field.set_value(reservation.title)
_start_time_field.set_value(reservation.start_time) _start_time_field.set_value(reservation.start_time)
_finish_time_field.set_value(reservation.finish_time) _finish_time_field.set_value(reservation.finish_time)
_room_field.set_value({"title": room_title, "id": reservation.room_id})
_date_field.set_value(reservation.date)
func _load_room(): func _load_room():
_room_field.set_value(_main.get_selected_room().title) 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 _get_current_room_id(): func _get_current_room_id():
var room_repo = _main.get_room_repo() var room_repo = _main.get_room_repo()
@ -95,16 +107,16 @@ func _create_reservation():
var dto = CreateReservationDTO.new() var dto = CreateReservationDTO.new()
dto.title = _title_field.get_value() dto.title = _title_field.get_value()
dto.date = _main.get_selected_date() dto.date = _date_field.get_value()
dto.start_time = _start_time_field.get_value() dto.start_time = _start_time_field.get_value()
dto.finish_time = _finish_time_field.get_value() dto.finish_time = _finish_time_field.get_value()
dto.creator = _creator_field.get_value() dto.creator = _creator_field.get_value()
dto.room_id = _get_current_room_id() dto.room_id = _room_field.get_value().id
dto.description = _description_field.get_value() dto.description = _description_field.get_value()
dto.color = randi_range(1, 3) dto.color = randi_range(1, 3)
var repo = _main.get_reservation_repo() var reservation_repo = _main.get_reservation_repo()
repo.create_reservation(dto) reservation_repo.create_reservation(dto)
dto.queue_free() dto.queue_free()
@ -121,14 +133,14 @@ func _update_reservation():
dto.start_time = _start_time_field.get_value() dto.start_time = _start_time_field.get_value()
dto.finish_time = _finish_time_field.get_value() dto.finish_time = _finish_time_field.get_value()
dto.creator = _creator_field.get_value() dto.creator = _creator_field.get_value()
dto.room_id = _get_current_room_id() dto.room_id = _room_field.get_value().id
dto.description = _description_field.get_value() dto.description = _description_field.get_value()
dto.color = randi_range(1, 3) dto.color = randi_range(1, 3)
var repo = _main.get_reservation_repo() var reservation_repo = _main.get_reservation_repo()
var reservation_id = repo.get_selected_reservation_id() var reservation_id = reservation_repo.get_selected_reservation_id()
repo.change_reservation(reservation_id, dto) reservation_repo.change_reservation(reservation_id, dto)
repo.set_selected_reservation_id(null) reservation_repo.set_selected_reservation_id(null)
dto.queue_free() dto.queue_free()
@ -181,7 +193,10 @@ func _time_is_correct():
var start_time_in_minutes = start_time.hours*60 + start_time.minutes 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 finish_time_in_minutes = finish_time.hours*60 + finish_time.minutes
var service = _main.get_reservation_service() var service = _main.get_reservation_service()
var is_busy = await service.is_time_busy(start_time_in_minutes, finish_time_in_minutes) 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: if is_busy:
print("The selected time slot is busy.") print("The selected time slot is busy.")
@ -198,10 +213,13 @@ func update():
if type == Types.Edit: if type == Types.Edit:
_load_info() _load_info()
else:
_load_room() _load_room()
_load_date()
func clean(): func clean():
_title_field.clean() _title_field.clean()
_start_time_field.clean() _start_time_field.clean()
_finish_time_field.clean() _finish_time_field.clean()
_date_field.clean()
_room_field.clean()

View File

@ -0,0 +1,39 @@
extends Control
signal room_selected(title: String, id: String)
@onready var _main: Main = get_tree().get_current_scene()
@onready var _rooms_menu := $RoomsMenu
var _rooms : Array[RoomEntity] = []
func _ready():
_connect_signals()
await get_tree().create_timer(0.1, false).timeout
_load_rooms()
func _load_rooms():
var room_repo = _main.get_room_repo()
if room_repo.get_selected_room():
return
_rooms_menu.clear()
var rooms = await room_repo.list_rooms()
for room in rooms:
_rooms.append(room)
_rooms_menu.add_item(room.title)
if len(rooms) < 0:
print('Not enough rooms')
func _connect_signals():
_rooms_menu.item_clicked.connect(_on_room_selected)
func _on_room_selected(idx, text):
room_selected.emit(_rooms[idx].title, _rooms[idx].id)
_main.go_to_previous_page(true)
func update():
_rooms_menu.deselect_all()

View File

@ -0,0 +1,15 @@
[gd_scene load_steps=3 format=3 uid="uid://dik2e02vahb3g"]
[ext_resource type="PackedScene" uid="uid://bt3h3m10qx1jr" path="res://scenes/board/rooms_menu.tscn" id="1_carpv"]
[ext_resource type="Script" path="res://scenes/reservation/room_selection.gd" id="1_wbxoa"]
[node name="RoomSelection" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_wbxoa")
[node name="RoomsMenu" parent="." instance=ExtResource("1_carpv")]

View File

@ -3,13 +3,14 @@ class_name ReservationService
@onready var _main: Main = get_tree().get_current_scene() @onready var _main: Main = get_tree().get_current_scene()
func is_time_busy(new_start_time_minutes, new_finish_time_minutes): func is_time_busy(new_start_time_minutes, new_finish_time_minutes, room_id=null, date=null):
var selected_room = _main.get_selected_room() var selected_room = _main.get_selected_room()
var selected_date = _main.get_selected_date()
var reservation_repo = _main.get_reservation_repo() var reservation_repo = _main.get_reservation_repo()
var reservations = await reservation_repo.list_reservations({ var reservations = await reservation_repo.list_reservations({
"date": _main.get_selected_date(), "date": date if date != null else selected_date,
"room_id": selected_room.id "room_id": room_id if room_id != null else selected_room.id
}) })
var selected_reservation_id = reservation_repo.get_selected_reservation_id() var selected_reservation_id = reservation_repo.get_selected_reservation_id()

View File

@ -20,7 +20,7 @@ func change_reservation(reservation_id, dto: UpdateReservationDTO):
func get_reservation(reservation_id): func get_reservation(reservation_id):
pass pass
func list_reservations(filters: Dictionary = {}) -> Array[ReservationEntity]: func list_reservations(filters: Dictionary = {}) -> Array:
return [] return []
func set_selected_reservation_id(value): func set_selected_reservation_id(value):

View File

@ -1,7 +1,8 @@
@tool
class_name EventHandlerWS class_name EventHandlerWS
extends EventHandler extends EventHandler
const BACKEND_URL = "http://192.168.0.147:5000/socket.io" const BACKEND_URL = "http://89.223.87.146:5004/socket.io"
var _room_id: String = "" var _room_id: String = ""
var _jwt_token: String = "" var _jwt_token: String = ""
var _client: SocketIOClient var _client: SocketIOClient

View File

@ -2,7 +2,7 @@
extends AbstractReservationRepo extends AbstractReservationRepo
class_name ReservationRepoHTTP class_name ReservationRepoHTTP
const BASE_URL = "http://192.168.1.178:5000" const BASE_URL = "http://89.223.87.146:5004"
const RESERVATION_ENDPOINT = "/reservation/" const RESERVATION_ENDPOINT = "/reservation/"
const HEALTH_ENDPOINT = "/health/" const HEALTH_ENDPOINT = "/health/"
@ -48,7 +48,7 @@ func get_reservation(reservation_id: String) -> ReservationEntity:
var result = await _http_client.request(RESERVATION_ENDPOINT + "%s" % reservation_id, HTTPClient.METHOD_GET) var result = await _http_client.request(RESERVATION_ENDPOINT + "%s" % reservation_id, HTTPClient.METHOD_GET)
return _parse_reservation_entity(result) if result is Dictionary else null return _parse_reservation_entity(result) if result is Dictionary else null
func list_reservations(filters: Dictionary = {}) -> Array[ReservationEntity]: func list_reservations(filters: Dictionary = {}) -> Array:
var query = "?" var query = "?"
for key in filters: for key in filters:
query += "%s=%s&" % [key, filters[key]] query += "%s=%s&" % [key, filters[key]]

View File

@ -1,7 +1,8 @@
@tool
extends AbstractRoomRepo extends AbstractRoomRepo
class_name RoomRepoHTTP class_name RoomRepoHTTP
const BASE_URL = "http://192.168.1.178:5000" const BASE_URL = "http://localhost:5004"
signal rooms_loaded(rooms: Array[RoomEntity]) signal rooms_loaded(rooms: Array[RoomEntity])
signal request_failed(error_message: String) signal request_failed(error_message: String)
@ -23,6 +24,15 @@ func list_rooms() -> Array[RoomEntity]:
emit_signal("request_failed", "Failed to load rooms") emit_signal("request_failed", "Failed to load rooms")
return [] return []
func get_room(id: String) -> RoomEntity:
var rooms = await list_rooms()
for room in rooms:
if room.id == id:
return room
return null
func _parse_room_list(data: Array) -> Array[RoomEntity]: func _parse_room_list(data: Array) -> Array[RoomEntity]:
var rooms: Array[RoomEntity] = [] var rooms: Array[RoomEntity] = []
for item in data: for item in data:

View File

@ -41,7 +41,7 @@ func change_reservation(reservation_id, dto: UpdateReservationDTO):
func get_reservation(reservation_id): func get_reservation(reservation_id):
return _reservations[reservation_id] return _reservations[reservation_id]
func list_reservations(filters: Dictionary = {}) -> Array[ReservationEntity]: func list_reservations(filters: Dictionary = {}) -> Array:
var reservations = [] var reservations = []
for key in _reservations: for key in _reservations: